ZGlmZiAtLWdpdCBhLy5jbGFuZy1mb3JtYXQgYi8uY2xhbmctZm9ybWF0Cm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjVmMTk2YzMKLS0tIC9kZXYvbnVsbAorKysgYi8uY2xhbmctZm9ybWF0CkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uL2J1aWxkL3Nvb25nL3NjcmlwdHMvc3lzdGVtLWNsYW5nLWZvcm1hdC0yClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvQW5kcm9pZC5icCBiL0FuZHJvaWQuYnAKaW5kZXggMDc3YmUyMS4uMDhkZjI2MSAxMDA2NDQKLS0tIGEvQW5kcm9pZC5icAorKysgYi9BbmRyb2lkLmJwCkBAIC04Nyw4ICs4Nyw4IEBACiAgICAgICAgICJhaWRsX3RvX3J1c3QuY3BwIiwKICAgICAgICAgImFpZGxfdHlwZW5hbWVzLmNwcCIsCiAgICAgICAgICJhaWRsLmNwcCIsCi0gICAgICAgICJhc3RfY3BwLmNwcCIsCiAgICAgICAgICJhc3RfamF2YS5jcHAiLAorICAgICAgICAiY2hlY2tfdmFsaWQuY3BwIiwKICAgICAgICAgImNvZGVfd3JpdGVyLmNwcCIsCiAgICAgICAgICJjb21tZW50cy5jcHAiLAogICAgICAgICAiZGlhZ25vc3RpY3MuY3BwIiwKQEAgLTEwMCwxMSArMTAwLDEyIEBACiAgICAgICAgICJnZW5lcmF0ZV9ydXN0LmNwcCIsCiAgICAgICAgICJpbXBvcnRfcmVzb2x2ZXIuY3BwIiwKICAgICAgICAgImlvX2RlbGVnYXRlLmNwcCIsCi0gICAgICAgICJsaW5lX3JlYWRlci5jcHAiLAogICAgICAgICAibG9jYXRpb24uY3BwIiwKICAgICAgICAgImxvZ2dpbmcuY3BwIiwKICAgICAgICAgIm9wdGlvbnMuY3BwIiwKICAgICAgICAgInBhcnNlci5jcHAiLAorICAgICAgICAicGVybWlzc2lvbi5jcHAiLAorICAgICAgICAicHJlcHJvY2Vzcy5jcHAiLAogICAgIF0sCiAgICAgeWFjYzogewogICAgICAgICBnZW5fbG9jYXRpb25faGg6IHRydWUsCkBAIC0xNTEsOSArMTUyLDEzIEBACiAgICAgICAgICItZyIsCiAgICAgXSwKIAorICAgIHRpZHlfdGltZW91dF9zcmNzOiBbCisgICAgICAgICJhaWRsX3VuaXR0ZXN0LmNwcCIsCisgICAgICAgICJvcHRpb25zX3VuaXR0ZXN0LmNwcCIsCisgICAgXSwKKwogICAgIHNyY3M6IFsKICAgICAgICAgImFpZGxfdW5pdHRlc3QuY3BwIiwKLSAgICAgICAgImFzdF9jcHBfdW5pdHRlc3QuY3BwIiwKICAgICAgICAgImFzdF9qYXZhX3VuaXR0ZXN0LmNwcCIsCiAgICAgICAgICJjb2RlX3dyaXRlcl91bml0dGVzdC5jcHAiLAogICAgICAgICAiZGlhZ25vc3RpY3NfdW5pdHRlc3QuY3BwIiwKQEAgLTE3Myw2ICsxNzgsMTQgQEAKICAgICAgICAgImxpYmxvZyIsCiAgICAgXSwKIAorICAgIHRhcmdldDogeworICAgICAgICBob3N0OiB7CisgICAgICAgICAgICBzYW5pdGl6ZTogeworICAgICAgICAgICAgICAgIGFkZHJlc3M6IHRydWUsCisgICAgICAgICAgICB9LAorICAgICAgICB9LAorICAgIH0sCisKICAgICByZXF1aXJlZDogWyJhaWRsLWdvbGRlbi10ZXN0LWJ1aWxkLWhvb2siXSwKIH0KIApAQCAtMTg2LDEwICsxOTksNyBAQAogCiAgICAgZnV6el9jb25maWc6IHsKICAgICAgICAgY2M6IFsKLSAgICAgICAgICAgICJkZXZpbm1vb3JlQGdvb2dsZS5jb20iLAotICAgICAgICAgICAgInNtb3JlbGFuZEBnb29nbGUuY29tIiwKLSAgICAgICAgICAgICJqaXlvbmdAZ29vZ2xlLmNvbSIsCi0gICAgICAgICAgICAiamVvbmdpa0Bnb29nbGUuY29tIiwKKyAgICAgICAgICAgICJhaWRsLWJ1Z3NAZ29vZ2xlLmNvbSIsCiAgICAgICAgIF0sCiAgICAgfSwKIApAQCAtMjIwLDExICsyMzAsMTcgQEAKICAgICB0ZXN0X2NvbmZpZzogInRlc3RzL2FpZGxfaW50ZWdyYXRpb25fdGVzdC54bWwiLAogICAgIHRhcmdldF9yZXF1aXJlZDogWwogICAgICAgICAiYWlkbF90ZXN0X2NsaWVudCIsCisgICAgICAgICJhaWRsX3Rlc3RfY2xpZW50X25kayIsCiAgICAgICAgICJhaWRsX3Rlc3Rfc2VydmljZSIsCiAgICAgICAgICJhaWRsX3Rlc3RfamF2YV9jbGllbnQiLAogICAgICAgICAiYWlkbF90ZXN0X2phdmFfc2VydmljZSIsCiAgICAgICAgICJhaWRsX3Rlc3RfcnVzdF9jbGllbnQiLAogICAgICAgICAiYWlkbF90ZXN0X3J1c3Rfc2VydmljZSIsCisgICAgICAgICJhaWRsX3Rlc3RfcnVzdF9zZXJ2aWNlX2FzeW5jIiwKKyAgICAgICAgImFpZGxfdGVzdF9qYXZhX2NsaWVudF9zZGsxIiwKKyAgICAgICAgImFpZGxfdGVzdF9qYXZhX3NlcnZpY2Vfc2RrMSIsCisgICAgICAgICJhaWRsX3Rlc3RfamF2YV9jbGllbnRfc2RrMjkiLAorICAgICAgICAiYWlkbF90ZXN0X2phdmFfc2VydmljZV9zZGsyOSIsCiAgICAgXSwKICAgICB0ZXN0X3N1aXRlczogWyJnZW5lcmFsLXRlc3RzIl0sCiAgICAgdGVzdF9vcHRpb25zOiB7CkBAIC0yNzIsMjQgKzI4OCwzMCBAQAogZmlsZWdyb3VwIHsKICAgICBuYW1lOiAibGliYWlkbC1pbnRlZ3JhdGlvbi10ZXN0LWZpbGVzIiwKICAgICBzcmNzOiBbCisgICAgICAgICJ0ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvQXJyYXlPZkludGVyZmFjZXMuYWlkbCIsCiAgICAgICAgICJ0ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvQmFja2VuZFR5cGUuYWlkbCIsCiAgICAgICAgICJ0ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvQnl0ZUVudW0uYWlkbCIsCiAgICAgICAgICJ0ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvQ29uc3RhbnRFeHByZXNzaW9uRW51bS5haWRsIiwKICAgICAgICAgInRlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9EZXByZWNhdGVkRW51bS5haWRsIiwKICAgICAgICAgInRlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9EZXByZWNhdGVkUGFyY2VsYWJsZS5haWRsIiwKICAgICAgICAgInRlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9HZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGUuYWlkbCIsCisgICAgICAgICJ0ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvRml4ZWRTaXplLmFpZGwiLAogICAgICAgICAidGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0lEZXByZWNhdGVkLmFpZGwiLAogICAgICAgICAidGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0lOYW1lZENhbGxiYWNrLmFpZGwiLAogICAgICAgICAidGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0lOZXdOYW1lLmFpZGwiLAogICAgICAgICAidGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0lPbGROYW1lLmFpZGwiLAogICAgICAgICAidGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0lUZXN0U2VydmljZS5haWRsIiwKICAgICAgICAgInRlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9JbnRFbnVtLmFpZGwiLAorICAgICAgICAidGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0xpc3RPZkludGVyZmFjZXMuYWlkbCIsCiAgICAgICAgICJ0ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvTG9uZ0VudW0uYWlkbCIsCiAgICAgICAgICJ0ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmcuYWlkbCIsCiAgICAgICAgICJ0ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvUGFyY2VsYWJsZUZvclRvU3RyaW5nLmFpZGwiLAorICAgICAgICAidGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL1JlY3Vyc2l2ZUxpc3QuYWlkbCIsCiAgICAgICAgICJ0ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvU3RydWN0dXJlZFBhcmNlbGFibGUuYWlkbCIsCiAgICAgICAgICJ0ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb24uYWlkbCIsCiAgICAgICAgICJ0ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb25XaXRoRmQuYWlkbCIsCisgICAgICAgICJ0ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uLyouYWlkbCIsCisgICAgICAgICJ0ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkLyouYWlkbCIsCiAgICAgICAgICJ0ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zLyouYWlkbCIsCiAgICAgXSwKICAgICBwYXRoOiAidGVzdHMiLApAQCAtMjk4LDkgKzMyMCwxOSBAQAogZmlsZWdyb3VwIHsKICAgICBuYW1lOiAibGliYWlkbC1pbnRlZ3JhdGlvbi1jcHAtamF2YS10ZXN0LWZpbGVzIiwKICAgICBzcmNzOiBbCisgICAgICAgICJ0ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvQmFkUGFyY2VsYWJsZS5haWRsIiwKICAgICAgICAgInRlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9JQ3BwSmF2YVRlc3RzLmFpZGwiLAogICAgICAgICAidGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL1NpbXBsZVBhcmNlbGFibGUuYWlkbCIsCi0gICAgICAgICJ0ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uLyouYWlkbCIsCisgICAgXSwKKyAgICBwYXRoOiAidGVzdHMiLAorfQorCitmaWxlZ3JvdXAgeworICAgIG5hbWU6ICJsaWJhaWRsLWludGVncmF0aW9uLXBlcm1pc3Npb24tdGVzdC1maWxlcyIsCisgICAgc3JjczogWworICAgICAgICAidGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vSVByb3RlY3RlZC5haWRsIiwKKyAgICAgICAgInRlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9wZXJtaXNzaW9uL0lQcm90ZWN0ZWRJbnRlcmZhY2UuYWlkbCIsCisgICAgICAgICJ0ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9wbGF0Zm9ybS8qLmFpZGwiLAogICAgIF0sCiAgICAgcGF0aDogInRlc3RzIiwKIH0KQEAgLTMxNyw2ICszNDksOSBAQAogICAgICAgICAiMiIsCiAgICAgXSwKICAgICBiYWNrZW5kOiB7CisgICAgICAgIGphdmE6IHsKKyAgICAgICAgICAgIGdlbl9ycGM6IHRydWUsCisgICAgICAgIH0sCiAgICAgICAgIHJ1c3Q6IHsKICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCiAgICAgICAgIH0sCkBAIC0zMzAsMTEgKzM2NSwxNCBAQAogICAgICAgICBnZW5lcmF0ZV90cmFjZXM6IHRydWUsCiAgICAgICAgIGV4cG9ydF9haWRsX2hlYWRlcnM6IHRydWUsCiAgICAgICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJ0ZXN0cyJdLAotICAgICAgICBpbmNsdWRlX2RpcnM6IFsiZnJhbWV3b3Jrcy9uYXRpdmUvYWlkbC9iaW5kZXIiXSwKKyAgICAgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvYWlkbC9iaW5kZXIiLAorICAgICAgICBdLAogICAgIH0sCiAgICAgc3JjczogWwogICAgICAgICAiOmxpYmFpZGwtaW50ZWdyYXRpb24tdGVzdC1maWxlcyIsCiAgICAgICAgICI6bGliYWlkbC1pbnRlZ3JhdGlvbi1jcHAtamF2YS10ZXN0LWZpbGVzIiwKKyAgICAgICAgInRlc3RzL2JhZF9wYXJjZWxhYmxlLmNwcCIsCiAgICAgICAgICJ0ZXN0cy9zaW1wbGVfcGFyY2VsYWJsZS5jcHAiLAogICAgIF0sCiB9CkBAIC0zNDksNiArMzg3LDcgQEAKICAgICAgICAgLy8gc2VydmljZSB1c2VzIHRoZSBvbGQgdmVyc2lvbgogICAgICAgICAiYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtY3BwIiwKICAgICAgICAgImFpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtY3BwIiwKKyAgICAgICAgImFpZGwtdGVzdC1maXhlZHNpemVhcnJheS1jcHAiLAogICAgIF0sCiAgICAgc3JjczogWyJ0ZXN0cy9haWRsX3Rlc3Rfc2VydmljZS5jcHAiXSwKIH0KQEAgLTM2MiwxMCArNDAxLDE2IEBACiAgICAgICAgICJsaWJnbW9jayIsCiAgICAgICAgIC8vICBjbGllbnQgdXNlcyB0aGUgbGF0ZXN0IHZlcnNpb24KICAgICAgICAgImFpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYyLWNwcCIsCi0gICAgICAgICJhaWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLWNwcCIKKyAgICAgICAgImFpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtY3BwIiwKKyAgICAgICAgImFpZGwtdGVzdC1maXhlZHNpemVhcnJheS1jcHAiLAorICAgIF0sCisgICAgdGlkeV90aW1lb3V0X3NyY3M6IFsKKyAgICAgICAgInRlc3RzL2FpZGxfdGVzdF9jbGllbnRfcGFyY2VsYWJsZXMuY3BwIiwKKyAgICAgICAgInRlc3RzL2FpZGxfdGVzdF9jbGllbnRfcHJpbWl0aXZlcy5jcHAiLAogICAgIF0sCiAgICAgc3JjczogWwogICAgICAgICAidGVzdHMvYWlkbF90ZXN0X2NsaWVudC5jcHAiLAorICAgICAgICAidGVzdHMvYWlkbF90ZXN0X2NsaWVudF9idWlsdGluX3RyYW5zYWN0aW9ucy5jcHAiLAogICAgICAgICAidGVzdHMvYWlkbF90ZXN0X2NsaWVudF9maWxlX2Rlc2NyaXB0b3JzLmNwcCIsCiAgICAgICAgICJ0ZXN0cy9haWRsX3Rlc3RfY2xpZW50X3BhcmNlbGFibGVzLmNwcCIsCiAgICAgICAgICJ0ZXN0cy9haWRsX3Rlc3RfY2xpZW50X251bGxhYmxlcy5jcHAiLApAQCAtMzczLDkgKzQxOCwxMSBAQAogICAgICAgICAidGVzdHMvYWlkbF90ZXN0X2NsaWVudF91dGY4X3N0cmluZ3MuY3BwIiwKICAgICAgICAgInRlc3RzL2FpZGxfdGVzdF9jbGllbnRfc2VydmljZV9leGNlcHRpb25zLmNwcCIsCiAgICAgICAgICJ0ZXN0cy9haWRsX3Rlc3RfY2xpZW50X2RlZmF1bHRpbXBsLmNwcCIsCisgICAgICAgICJ0ZXN0cy9haWRsX3Rlc3RfY2xpZW50X2RlbGVnYXRlLmNwcCIsCiAgICAgICAgICJ0ZXN0cy9haWRsX3Rlc3RfY2xpZW50X3ZlcnNpb25lZF9pbnRlcmZhY2UuY3BwIiwKICAgICAgICAgInRlc3RzL2FpZGxfdGVzdF9jbGllbnRfcmVuYW1lZF9pbnRlcmZhY2UuY3BwIiwKICAgICAgICAgInRlc3RzL2FpZGxfdGVzdF9jbGllbnRfbG9nZ2FibGVfaW50ZXJmYWNlLmNwcCIsCisgICAgICAgICJ0ZXN0cy9haWRsX3Rlc3RfY2xpZW50X25lc3RlZC5jcHAiLAogICAgIF0sCiB9CiAKQEAgLTM4NiwxOSArNDMzLDQ3IEBACiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGliZ21vY2siLAogICAgICAgICAvLyAgY2xpZW50IHVzZXMgdGhlIGxhdGVzdCB2ZXJzaW9uCi0gICAgICAgICJhaWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS1WMi1uZGtfcGxhdGZvcm0iLAotICAgICAgICAiYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0iLAotICAgICAgICAiYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0iCisgICAgICAgICJhaWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS1WMi1uZGsiLAorICAgICAgICAiYWlkbC10ZXN0LWludGVyZmFjZS1uZGsiLAorICAgICAgICAiYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGsiLAorICAgICAgICAiYWlkbC10ZXN0LWZpeGVkc2l6ZWFycmF5LW5kayIsCiAgICAgXSwKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliYmluZGVyX25kayIsCiAgICAgXSwKICAgICBzcmNzOiBbCisgICAgICAgICJ0ZXN0cy9haWRsX3Rlc3RfY2xpZW50X25ka19kZWxlZ2F0ZS5jcHAiLAogICAgICAgICAidGVzdHMvYWlkbF90ZXN0X2NsaWVudF9uZGtfbG9nZ2FibGVfaW50ZXJmYWNlLmNwcCIsCisgICAgICAgICJ0ZXN0cy9haWRsX3Rlc3RfY2xpZW50X25ka19uZXN0ZWQuY3BwIiwKKyAgICAgICAgInRlc3RzL2FpZGxfdGVzdF9jbGllbnRfbmRrX251bGxhYmxlcy5jcHAiLAorICAgICAgICAidGVzdHMvYWlkbF90ZXN0X2NsaWVudF9uZGtfcGFyY2VsYWJsZXMuY3BwIiwKKyAgICAgICAgInRlc3RzL2FpZGxfdGVzdF9jbGllbnRfbmRrX3ByaW1pdGl2ZXNfdGVzdC5jcHAiLAorICAgICAgICAidGVzdHMvYWlkbF90ZXN0X2NsaWVudF9uZGtfc3RyaW5nc190ZXN0LmNwcCIsCiAgICAgICAgICJ0ZXN0cy9haWRsX3Rlc3RfY2xpZW50X25ka192ZXJzaW9uZWRfaW50ZXJmYWNlLmNwcCIsCiAgICAgXSwKIH0KIAorYWlkbF9pbnRlcmZhY2UgeworICAgIG5hbWU6ICJhaWRsLXRlc3QtZml4ZWRzaXplYXJyYXkiLAorICAgIHNyY3M6IFsidGVzdHMvYW5kcm9pZC9haWRsL2ZpeGVkc2l6ZWFycmF5L0ZpeGVkU2l6ZUFycmF5RXhhbXBsZS5haWRsIl0sCisgICAgbG9jYWxfaW5jbHVkZV9kaXI6ICJ0ZXN0cyIsCisgICAgdW5zdGFibGU6IHRydWUsCisgICAgYmFja2VuZDogeworICAgICAgICBjcHA6IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgICAgIH0sCisgICAgICAgIGphdmE6IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgICAgIH0sCisgICAgICAgIG5kazogeworICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKKyAgICAgICAgfSwKKyAgICAgICAgcnVzdDogeworICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKKyAgICAgICAgfSwKKyAgICB9Cit9CisKIGphdmFfZGVmYXVsdHMgewogICAgIG5hbWU6ICJhaWRsX3Rlc3RfamF2YV9kZWZhdWx0cyIsCiAgICAgcGxhdGZvcm1fYXBpczogdHJ1ZSwKQEAgLTQxNSw2ICs0OTAsNyBAQAogICAgICAgICAiYWlkbF90ZXN0X25vbnZpbnRmX3BhcmNlbGFibGUtVjEtamF2YSIsCiAgICAgICAgICJhaWRsX3Rlc3RfdW5zdGFibGVfcGFyY2VsYWJsZS1qYXZhIiwKICAgICAgICAgImFpZGxfdGVzdF92aW50Zl9wYXJjZWxhYmxlLVYxLWphdmEiLAorICAgICAgICAiYWlkbC10ZXN0LWZpeGVkc2l6ZWFycmF5LWphdmEiLAogICAgICAgICAvLyBUT0RPOiByZW1vdmUgb25jZSBBbmRyb2lkIG1pZ3JhdGVzIHRvIEpVbml0IDQuMTIsCiAgICAgICAgIC8vIHdoaWNoIHByb3ZpZGVzIGFzc2VydFRocm93cwogICAgICAgICAidGVzdG5nIiwKQEAgLTQyNSw3ICs1MDEsOSBAQAogICAgICAgICAidGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL2ltbXV0YWJsZS8qLmFpZGwiLAogICAgICAgICAidGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL21hcC8qLmFpZGwiLAogICAgICAgICAidGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi8qLmFpZGwiLAorICAgICAgICAidGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC8qLmFpZGwiLAogICAgICAgICAidGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy8qLmFpZGwiLAorICAgICAgICAidGVzdHMvamF2YS9zcmMvYW5kcm9pZC9haWRsL3Rlc3RzL0JhZFBhcmNlbGFibGUuamF2YSIsCiAgICAgICAgICJ0ZXN0cy9qYXZhL3NyYy9hbmRyb2lkL2FpZGwvdGVzdHMvU2ltcGxlUGFyY2VsYWJsZS5qYXZhIiwKICAgICAgICAgInRlc3RzL2phdmEvc3JjL2FuZHJvaWQvYWlkbC90ZXN0cy9nZW5lcmljL1BhaXIuamF2YSIsCiAgICAgXSwKQEAgLTQ0NCw3ICs1MjIsNyBAQAogICAgIGRlZmF1bHRzOiBbImFpZGxfdGVzdF9qYXZhX2RlZmF1bHRzIl0sCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgLy8gY2xpZW50IHVzZXMgdGhlIG5ldyB2ZXJzaW9uCi0gICAgICAgICJhaWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS1WMi1qYXZhIiwKKyAgICAgICAgImFpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYzLWphdmEiLAogICAgIF0sCiAgICAgLy8gdGVzdHMgYXJlIGluY2x1ZGVkIGluIGRlZmF1bHRzCiAgICAgc3JjczogWwpAQCAtNDUyLDcgKzUzMCwxMCBAQAogICAgICAgICAidGVzdHMvamF2YS9zcmMvYW5kcm9pZC9haWRsL3Rlc3RzL1Rlc3RTZXJ2aWNlQ2xpZW50LmphdmEiLAogICAgICAgICAidGVzdHMvamF2YS9zcmMvYW5kcm9pZC9haWRsL3Rlc3RzL0phdmFPbmx5SW1tdXRhYmxlQW5ub3RhdGlvblRlc3RzLmphdmEiLAogICAgICAgICAidGVzdHMvamF2YS9zcmMvYW5kcm9pZC9haWRsL3Rlc3RzL0FpZGxKYXZhVGVzdHMuamF2YSIsCisgICAgICAgICJ0ZXN0cy9qYXZhL3NyYy9hbmRyb2lkL2FpZGwvdGVzdHMvQnVpbHRJblRlc3RzLmphdmEiLAorICAgICAgICAidGVzdHMvamF2YS9zcmMvYW5kcm9pZC9haWRsL3Rlc3RzL0RlbGVnYXRvclRlc3RzLmphdmEiLAogICAgICAgICAidGVzdHMvamF2YS9zcmMvYW5kcm9pZC9haWRsL3Rlc3RzL0dlbmVyaWNUZXN0cy5qYXZhIiwKKyAgICAgICAgInRlc3RzL2phdmEvc3JjL2FuZHJvaWQvYWlkbC90ZXN0cy9OZXN0ZWRUeXBlc1Rlc3RzLmphdmEiLAogICAgICAgICAidGVzdHMvamF2YS9zcmMvYW5kcm9pZC9haWRsL3Rlc3RzL1Rlc3RWZXJzaW9uZWRJbnRlcmZhY2UuamF2YSIsCiAgICAgICAgICJ0ZXN0cy9qYXZhL3NyYy9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb25UZXN0cy5qYXZhIiwKICAgICAgICAgInRlc3RzL2phdmEvc3JjL2FuZHJvaWQvYWlkbC90ZXN0cy9FeHRlbnNpb25UZXN0cy5qYXZhIiwKQEAgLTQ3Myw2ICs1NTQsNzUgQEAKICAgICBdLAogfQogCitmaWxlZ3JvdXAgeworICAgIG5hbWU6ICJhaWRsLWZvci1zZGt2ZXJzaW9uLXRlc3RzIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJ0ZXN0cy9qYXZhL3NyYy9hbmRyb2lkL2FpZGwvc2RrdmVyc2lvbi9JVGVzdFNlcnZpY2UuYWlkbCIsCisgICAgXSwKKyAgICBwYXRoOiAidGVzdHMvamF2YS9zcmMiLAorfQorCitqYXZhX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAiYWlkbF90ZXN0X2phdmFfc2RrdmVyc2lvbl9kZWZhdWx0cyIsCisgICAgcGxhdGZvcm1fYXBpczogdHJ1ZSwKKyAgICAvLyBUdXJuIG9mZiBKYXZhIG9wdGltaXphdGlvbiB0b29scyB0byBzcGVlZCB1cCBvdXIgdGVzdCBpdGVyYXRpb25zLgorICAgIG9wdGltaXplOiB7CisgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgIH0sCisgICAgZGV4X3ByZW9wdDogeworICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICB9LAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJhbmRyb2lkeC50ZXN0LmNvcmUiLAorICAgICAgICAiYW5kcm9pZHgudGVzdC5ydW5uZXIiLAorICAgIF0sCisgICAgc3JjczogWworICAgICAgICAiOmFpZGwtZm9yLXNka3ZlcnNpb24tdGVzdHMiLAorICAgIF0sCisgICAgYWlkbDogeworICAgICAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9haWRsL2JpbmRlciIsCisgICAgICAgIF0sCisgICAgfSwKKyAgICB0ZXN0X3N1aXRlczogWyJnZW5lcmFsLXRlc3RzIl0sCit9CisKK2phdmFfdGVzdCB7CisgICAgbmFtZTogImFpZGxfdGVzdF9qYXZhX2NsaWVudF9zZGsyOSIsCisgICAgZGVmYXVsdHM6IFsiYWlkbF90ZXN0X2phdmFfc2RrdmVyc2lvbl9kZWZhdWx0cyJdLAorICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICBzcmNzOiBbCisgICAgICAgICJ0ZXN0cy9qYXZhL3NyYy9hbmRyb2lkL2FpZGwvc2RrdmVyc2lvbi90ZXN0cy8qLmphdmEiLAorICAgIF0sCit9CisKK2phdmFfdGVzdCB7CisgICAgbmFtZTogImFpZGxfdGVzdF9qYXZhX3NlcnZpY2Vfc2RrMjkiLAorICAgIGRlZmF1bHRzOiBbImFpZGxfdGVzdF9qYXZhX3Nka3ZlcnNpb25fZGVmYXVsdHMiXSwKKyAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgc3JjczogWworICAgICAgICAidGVzdHMvamF2YS9zcmMvYW5kcm9pZC9haWRsL3Nka3ZlcnNpb24vc2VydmljZS8qLmphdmEiLAorICAgIF0sCit9CisKK2phdmFfdGVzdCB7CisgICAgbmFtZTogImFpZGxfdGVzdF9qYXZhX2NsaWVudF9zZGsxIiwKKyAgICBkZWZhdWx0czogWyJhaWRsX3Rlc3RfamF2YV9zZGt2ZXJzaW9uX2RlZmF1bHRzIl0sCisgICAgbWluX3Nka192ZXJzaW9uOiAiMSIsCisgICAgc3JjczogWworICAgICAgICAidGVzdHMvamF2YS9zcmMvYW5kcm9pZC9haWRsL3Nka3ZlcnNpb24vdGVzdHMvKi5qYXZhIiwKKyAgICBdLAorfQorCitqYXZhX3Rlc3QgeworICAgIG5hbWU6ICJhaWRsX3Rlc3RfamF2YV9zZXJ2aWNlX3NkazEiLAorICAgIGRlZmF1bHRzOiBbImFpZGxfdGVzdF9qYXZhX3Nka3ZlcnNpb25fZGVmYXVsdHMiXSwKKyAgICBtaW5fc2RrX3ZlcnNpb246ICIxIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJ0ZXN0cy9qYXZhL3NyYy9hbmRyb2lkL2FpZGwvc2RrdmVyc2lvbi9zZXJ2aWNlLyouamF2YSIsCisgICAgXSwKK30KKwogLy8KIC8vICJHb2xkZW4iIHRlc3Qgb2YgY29tcGlsZXIgb3V0cHV0CiAvLwpAQCAtNDg2LDE3ICs2MzYsMjUgQEAKICAgICBuYW1lOiAiYWlkbC1nb2xkZW4tdGVzdC1idWlsZC1ob29rLWdlbiIsCiAgICAgdG9vbHM6IFsiYWlkbC1nb2xkZW4tdGVzdCJdLAogICAgIGNtZDogIiQobG9jYXRpb24gYWlkbC1nb2xkZW4tdGVzdCkgY2hlY2sgJiYgIiArCi0gICAgICAgICAiZWNobyAnaW50IG1haW4oKXtyZXR1cm4gMDt9JyA+ICQoZ2VuRGlyKS9UT0RPX2JfMzc1NzU4ODMuY3BwIiwKKyAgICAgICAgImVjaG8gJ2ludCBtYWluKCl7cmV0dXJuIDA7fScgPiAkKGdlbkRpcikvVE9ET19iXzM3NTc1ODgzLmNwcCIsCiAgICAgc3JjczogWwogICAgICAgICAvLyB3YXJuaW5nOiBrZWVwIHRoaXMgbGlzdCB1cCB0byBkYXRlIHdpdGggdGVzdHMvZ29sZGVuX3Rlc3Quc2gKICAgICAgICAgIjphaWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UiLAogICAgICAgICAiOmFpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UiLAotICAgICAgICAiOmFpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZSIsCisgICAgICAgICI6YWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtY3BwLXNvdXJjZSIsCisgICAgICAgICI6YWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtamF2YS1zb3VyY2UiLAorICAgICAgICAiOmFpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYxLW5kay1zb3VyY2UiLAorICAgICAgICAiOmFpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYxLXJ1c3Qtc291cmNlIiwKKyAgICAgICAgIjphaWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UiLAogICAgICAgICAiOmFpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UiLAogICAgICAgICAiOmFpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtY3BwLXNvdXJjZSIsCiAgICAgICAgICI6YWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1qYXZhLXNvdXJjZSIsCi0gICAgICAgICI6YWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlIiwKICAgICAgICAgIjphaWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5kay1zb3VyY2UiLAorICAgICAgICAiOmFpZGwtdGVzdC1pbnRlcmZhY2UtcGVybWlzc2lvbi1qYXZhLXNvdXJjZSIsCisgICAgICAgICI6YWlkbC10ZXN0LWZpeGVkc2l6ZWFycmF5LWNwcC1zb3VyY2UiLAorICAgICAgICAiOmFpZGwtdGVzdC1maXhlZHNpemVhcnJheS1qYXZhLXNvdXJjZSIsCisgICAgICAgICI6YWlkbC10ZXN0LWZpeGVkc2l6ZWFycmF5LW5kay1zb3VyY2UiLAorICAgICAgICAiOmFpZGwtdGVzdC1maXhlZHNpemVhcnJheS1ydXN0LXNvdXJjZSIsCiAgICAgICAgICJ0ZXN0cy9nb2xkZW5fb3V0cHV0LyoqLyoiLAogICAgIF0sCiAgICAgb3V0OiBbIlRPRE9fYl8zNzU3NTg4My5jcHAiXSwKQEAgLTUyNiwyNCArNjg0LDE3IEBACiAgICAgZ2VuX3RyYWNlOiB0cnVlLAogICAgIGJhY2tlbmQ6IHsKICAgICAgICAgY3BwOiB7Ci0gICAgICAgICAgICBzcmNzX2F2YWlsYWJsZTogdHJ1ZSwKICAgICAgICAgICAgIGdlbl9sb2c6IHRydWUsCiAgICAgICAgIH0sCiAgICAgICAgIG5kazogewotICAgICAgICAgICAgc3Jjc19hdmFpbGFibGU6IHRydWUsCiAgICAgICAgICAgICBnZW5fbG9nOiB0cnVlLAogICAgICAgICB9LAogICAgICAgICBqYXZhOiB7Ci0gICAgICAgICAgICBzcmNzX2F2YWlsYWJsZTogdHJ1ZSwKICAgICAgICAgICAgIHBsYXRmb3JtX2FwaXM6IHRydWUsCiAgICAgICAgIH0sCiAgICAgfSwKIH0KIAotLy8KLS8vIFJ1c3QgdGVzdHMKLS8vCi0KIGFpZGxfaW50ZXJmYWNlIHsKICAgICBuYW1lOiAiYWlkbC10ZXN0LWludGVyZmFjZSIsCiAgICAgdW5zdGFibGU6IHRydWUsCkBAIC01NTIsMjMgKzcwMyw0OSBAQAogICAgIGxvY2FsX2luY2x1ZGVfZGlyOiAidGVzdHMiLAogICAgIGJhY2tlbmQ6IHsKICAgICAgICAgY3BwOiB7Ci0gICAgICAgICAgICBzcmNzX2F2YWlsYWJsZTogdHJ1ZSwKICAgICAgICAgfSwKICAgICAgICAgamF2YTogewogICAgICAgICAgICAgcGxhdGZvcm1fYXBpczogdHJ1ZSwKLSAgICAgICAgICAgIHNyY3NfYXZhaWxhYmxlOiB0cnVlLAorICAgICAgICAgICAgZ2VuX3JwYzogdHJ1ZSwKICAgICAgICAgfSwKICAgICAgICAgcnVzdDogewogICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKLSAgICAgICAgICAgIHNyY3NfYXZhaWxhYmxlOiB0cnVlLAogICAgICAgICB9LAogICAgICAgICBuZGs6IHsKICAgICAgICAgICAgIGFwcHNfZW5hYmxlZDogZmFsc2UsCi0gICAgICAgICAgICBzcmNzX2F2YWlsYWJsZTogdHJ1ZSwKICAgICAgICAgfSwKICAgICB9LAogfQogCithaWRsX2ludGVyZmFjZSB7CisgICAgbmFtZTogImFpZGwtdGVzdC1pbnRlcmZhY2UtcGVybWlzc2lvbiIsCisgICAgdW5zdGFibGU6IHRydWUsCisgICAgZmxhZ3M6IFsiLVdlcnJvciJdLAorICAgIHNyY3M6IFsiOmxpYmFpZGwtaW50ZWdyYXRpb24tcGVybWlzc2lvbi10ZXN0LWZpbGVzIl0sCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2Jhc2UvY29yZS9qYXZhIiwKKyAgICBdLAorICAgIGxvY2FsX2luY2x1ZGVfZGlyOiAidGVzdHMiLAorICAgIGJhY2tlbmQ6IHsKKyAgICAgICAgY3BwOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICAgICAgamF2YTogeworICAgICAgICAgICAgcGxhdGZvcm1fYXBpczogdHJ1ZSwKKyAgICAgICAgfSwKKyAgICAgICAgcnVzdDogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgICAgIG5kazogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKK30KKworLy8KKy8vIFJ1c3QgdGVzdHMKKy8vCisKIHJ1c3RfdGVzdCB7CiAgICAgbmFtZTogImFpZGxfdGVzdF9ydXN0X2NsaWVudCIsCiAgICAgc3JjczogWwpAQCAtNTc3LDcgKzc1NCwxNSBAQAogICAgIHJ1c3RsaWJzOiBbCiAgICAgICAgICJhaWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3QiLAogICAgICAgICAiYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjItcnVzdCIsCisgICAgICAgICJhaWRsX3Rlc3Rfbm9udmludGZfcGFyY2VsYWJsZS1WMS1ydXN0IiwKKyAgICAgICAgImFpZGxfdGVzdF91bnN0YWJsZV9wYXJjZWxhYmxlLXJ1c3QiLAorICAgICAgICAiYWlkbF90ZXN0X3ZpbnRmX3BhcmNlbGFibGUtVjEtcnVzdCIsCisgICAgICAgICJhaWRsLXRlc3QtZml4ZWRzaXplYXJyYXktcnVzdCIsCiAgICAgICAgICJsaWJsaWJjIiwKKyAgICAgICAgLy8gV2UgbmVlZCB0byBpbXBvcnQgYmluZGVyX3JzIGRpcmVjdGx5CisgICAgICAgIC8vIGZvciBhIGZldyBpbnRlcm5hbCB0eXBlcyBsaWtlIFBhcmNlbAorICAgICAgICAvLyBhbmQgdHJhaXRzIGxpa2UgUGFyY2VsYWJsZQorICAgICAgICAibGliYmluZGVyX3JzIiwKICAgICBdLAogICAgIHByZWZlcl9ybGliOiB0cnVlLAogICAgIGNvbXBpbGVfbXVsdGlsaWI6ICJib3RoIiwKQEAgLTYwMSw2ICs3ODYsNyBAQAogICAgIHJ1c3RsaWJzOiBbCiAgICAgICAgICJhaWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3QiLAogICAgICAgICAiYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtcnVzdCIsCisgICAgICAgICJhaWRsLXRlc3QtZml4ZWRzaXplYXJyYXktcnVzdCIsCiAgICAgICAgICJsaWJsaWJjIiwKICAgICBdLAogICAgIHByZWZlcl9ybGliOiB0cnVlLApAQCAtNjE1LDMgKzgwMSwzMCBAQAogICAgIH0sCiAgICAgdGVzdF9zdWl0ZXM6IFsiZ2VuZXJhbC10ZXN0cyJdLAogfQorCitydXN0X3Rlc3QgeworICAgIG5hbWU6ICJhaWRsX3Rlc3RfcnVzdF9zZXJ2aWNlX2FzeW5jIiwKKyAgICB0ZXN0X2hhcm5lc3M6IGZhbHNlLAorICAgIHNyY3M6IFsKKyAgICAgICAgInRlc3RzL3J1c3QvdGVzdF9zZXJ2aWNlX2FzeW5jLnJzIiwKKyAgICBdLAorICAgIHJ1c3RsaWJzOiBbCisgICAgICAgICJhaWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3QiLAorICAgICAgICAiYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtcnVzdCIsCisgICAgICAgICJsaWJsaWJjIiwKKyAgICAgICAgImxpYmJpbmRlcl90b2tpb19ycyIsCisgICAgICAgICJsaWJ0b2tpbyIsCisgICAgXSwKKyAgICBwcm9jX21hY3JvczogWyJsaWJhc3luY190cmFpdCJdLAorICAgIHByZWZlcl9ybGliOiB0cnVlLAorICAgIGNvbXBpbGVfbXVsdGlsaWI6ICJib3RoIiwKKyAgICBtdWx0aWxpYjogeworICAgICAgICBsaWIzMjogeworICAgICAgICAgICAgc3VmZml4OiAiMzIiLAorICAgICAgICB9LAorICAgICAgICBsaWI2NDogeworICAgICAgICAgICAgc3VmZml4OiAiNjQiLAorICAgICAgICB9LAorICAgIH0sCisgICAgdGVzdF9zdWl0ZXM6IFsiZ2VuZXJhbC10ZXN0cyJdLAorfQpkaWZmIC0tZ2l0IGEvT1dORVJTIGIvT1dORVJTCmluZGV4IGZjNDU1NTAuLmExZmNmNWYgMTAwNjQ0Ci0tLSBhL09XTkVSUworKysgYi9PV05FUlMKQEAgLTEsNiArMSw2IEBACiBlbHNrQGdvb2dsZS5jb20KIGppeW9uZ0Bnb29nbGUuY29tCitqb295dW5nQGdvb2dsZS5jb20KIG1hbGNoZXZAZ29vZ2xlLmNvbQotc2FkbWFjQGdvb2dsZS5jb20KIHNtb3JlbGFuZEBnb29nbGUuY29tCiB2bWFya29AZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvUFJFVVBMT0FELmNmZyBiL1BSRVVQTE9BRC5jZmcKaW5kZXggMTI1NDVlMS4uMDExNDczMSAxMDA2NDQKLS0tIGEvUFJFVVBMT0FELmNmZworKysgYi9QUkVVUExPQUQuY2ZnCkBAIC01LDMgKzUsNyBAQAogY2xhbmdfZm9ybWF0ID0gdHJ1ZQogZ29mbXQgPSB0cnVlCiBhaWRsX2Zvcm1hdCA9IHRydWUKK3J1c3RmbXQgPSB0cnVlCisKK1tCdWlsdGluIEhvb2tzIE9wdGlvbnNdCitydXN0Zm10ID0gLS1jb25maWctcGF0aD1ydXN0Zm10LnRvbWwKZGlmZiAtLWdpdCBhL1RFU1RfTUFQUElORyBiL1RFU1RfTUFQUElORwppbmRleCA2YjI5NzQ1Li43OWY0OWUyIDEwMDY0NAotLS0gYS9URVNUX01BUFBJTkcKKysrIGIvVEVTVF9NQVBQSU5HCkBAIC03LDEwICs3LDE1IEBACiAgICAgICAibmFtZSI6ICJhaWRsX2ludGVncmF0aW9uX3Rlc3QiCiAgICAgfSwKICAgICB7Ci0gICAgICAibmFtZSI6ICJDdHNOZGtCaW5kZXJUZXN0Q2FzZXMiCisgICAgICAibmFtZSI6ICJhaWRsX2xhenlfdGVzdCIKICAgICB9LAogICAgIHsKLSAgICAgICJuYW1lIjogImFpZGxfbGF6eV90ZXN0IgorICAgICAgIm5hbWUiOiAiQ3RzTmRrQmluZGVyVGVzdENhc2VzIgorICAgIH0KKyAgXSwKKyAgImltcG9ydHMiOiBbCisgICAgeworICAgICAgInBhdGgiOiAiZnJhbWV3b3Jrcy9uYXRpdmUvbGlicy9iaW5kZXIiCiAgICAgfQogICBdCiB9CmRpZmYgLS1naXQgYS9haWRsLWZvcm1hdC5zaCBiL2FpZGwtZm9ybWF0LnNoCmluZGV4IDRmMmExMDQuLmRiZjNlMmEgMTAwNzU1Ci0tLSBhL2FpZGwtZm9ybWF0LnNoCisrKyBiL2FpZGwtZm9ybWF0LnNoCkBAIC0xMDYsNyArMTA2LDcgQEAKICAgICAgICMgImEgPSAxLCBiID0gMiIgd291bGQgbWF0Y2ggb25seSBvbmNlIGFuZCB3aWxsIGJlY29tZSAiYSA9IDEsIGI9MiIuCiAgICAgICBnYXdrIC1pIGlucGxhY2UgXAogICAgICAgICAnL0BbXkBdK1woLio9LipcKS8geyAjIG1hdGNoZXMgYSBsaW5lIGhhdmluZyBAYW5ubyhwYXJhbSA9IHZhbCkgXAotICAgICAgICAgICAgICBwcmludChnZW5zdWIoLyhbXkAsPV0rKSA9IChbXkAsPV0rKS8sICJcXDE9XFwyIiwgImciLCAkMCkpOyBcCisgICAgICAgICAgICAgIHByaW50KGdlbnN1YigvKFteQCw9XSspID0gKFteQCw9XSt8IlteIl0qIikvLCAiXFwxPVxcMiIsICJnIiwgJDApKTsgXAogICAgICAgICAgICAgICBkb25lPTE7XAogICAgICAgICB9IFwKICAgICAgICAge2lmICghZG9uZSkge3ByaW50KCQwKTt9IGRvbmU9MDt9JyAiJDEiCmRpZmYgLS1naXQgYS9haWRsLmNwcCBiL2FpZGwuY3BwCmluZGV4IDc3YzVmMzEuLjY5MzhiNTMgMTAwNjQ0Ci0tLSBhL2FpZGwuY3BwCisrKyBiL2FpZGwuY3BwCkBAIC00MCw2ICs0MCw3IEBACiAjaW5jbHVkZSAiYWlkbF9kdW1wYXBpLmgiCiAjaW5jbHVkZSAiYWlkbF9sYW5ndWFnZS5oIgogI2luY2x1ZGUgImFpZGxfdHlwZW5hbWVzLmgiCisjaW5jbHVkZSAiY2hlY2tfdmFsaWQuaCIKICNpbmNsdWRlICJnZW5lcmF0ZV9haWRsX21hcHBpbmdzLmgiCiAjaW5jbHVkZSAiZ2VuZXJhdGVfY3BwLmgiCiAjaW5jbHVkZSAiZ2VuZXJhdGVfamF2YS5oIgpAQCAtNTAsNiArNTEsNyBAQAogI2luY2x1ZGUgIm9wdGlvbnMuaCIKICNpbmNsdWRlICJvcy5oIgogI2luY2x1ZGUgInBhcnNlci5oIgorI2luY2x1ZGUgInByZXByb2Nlc3MuaCIKIAogI2lmbmRlZiBPX0JJTkFSWQogIyAgZGVmaW5lIE9fQklOQVJZICAwCkBAIC0yNTAsNyArMjUyLDcgQEAKICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotYm9vbCBjaGVja19hbmRfYXNzaWduX21ldGhvZF9pZHMoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFpZGxNZXRob2Q+PiYgaXRlbXMpIHsKK2Jvb2wgQ2hlY2tBbmRBc3NpZ25NZXRob2RJRHMoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFpZGxNZXRob2Q+PiYgaXRlbXMpIHsKICAgLy8gQ2hlY2sgd2hldGhlciB0aGVyZSBhcmUgYW55IG1ldGhvZHMgd2l0aCBtYW51YWxseSBhc3NpZ25lZCBpZCdzIGFuZCBhbnkKICAgLy8gdGhhdCBhcmUgbm90LiBFaXRoZXIgYWxsIG1ldGhvZCBpZCdzIG11c3QgYmUgbWFudWFsbHkgYXNzaWduZWQgb3IgYWxsIG9mCiAgIC8vIHRoZW0gbXVzdCBub3QuIEFsc28sIGNoZWNrIGZvciB1cGxpY2F0ZXMgb2YgdXNlciBzZXQgSUQncyBhbmQgdGhhdCB0aGUKQEAgLTMwMiw1OCArMzA0LDEzIEBACiAgIHJldHVybiB0cnVlOwogfQogCi0vLyBUT0RPOiBSZW1vdmUgdGhpcyBpbiBmYXZvciBvZiB1c2luZyB0aGUgWUFDQyBwYXJzZXIgYi8yNTQ3OTM3OAotYm9vbCBQYXJzZVByZXByb2Nlc3NlZExpbmUoY29uc3Qgc3RyaW5nJiBsaW5lLCBzdHJpbmcqIGRlY2wsIHN0ZDo6c3RyaW5nKiBwYWNrYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKiBjbGFzc19uYW1lKSB7Ci0gIC8vIGVyYXNlIGFsbCB0cmFpbGluZyB3aGl0ZXNwYWNlIGFuZCBzZW1pY29sb25zCi0gIGNvbnN0IHNpemVfdCBlbmQgPSBsaW5lLmZpbmRfbGFzdF9ub3Rfb2YoIiA7XHQiKTsKLSAgaWYgKGVuZCA9PSBzdHJpbmc6Om5wb3MpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKGxpbmUucmZpbmQoJzsnLCBlbmQpICE9IHN0cmluZzo6bnBvcykgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGRlY2wtPmNsZWFyKCk7Ci0gIHN0cmluZyB0eXBlOwotICB2ZWN0b3I8c3RyaW5nPiBwaWVjZXMgPSBTcGxpdChsaW5lLnN1YnN0cigwLCBlbmQgKyAxKSwgIiBcdCIpOwotICBmb3IgKGNvbnN0IHN0cmluZyYgcGllY2UgOiBwaWVjZXMpIHsKLSAgICBpZiAocGllY2UuZW1wdHkoKSkgewotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGlmIChkZWNsLT5lbXB0eSgpKSB7Ci0gICAgICAqZGVjbCA9IHN0ZDo6bW92ZShwaWVjZSk7Ci0gICAgfSBlbHNlIGlmICh0eXBlLmVtcHR5KCkpIHsKLSAgICAgIHR5cGUgPSBzdGQ6Om1vdmUocGllY2UpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgLy8gTm90ZSB0aGF0IHRoaXMgbG9naWMgaXMgYWJzb2x1dGVseSB3cm9uZy4gIEdpdmVuIGEgcGFyY2VsYWJsZQotICAvLyBvcmcuc29tZS5Gb28uQmFyLCB0aGUgY2xhc3MgbmFtZSBpcyBGb28uQmFyLCBidXQgdGhpcyBjb2RlIHdpbGwgY2xhaW0gdGhhdAotICAvLyB0aGUgY2xhc3MgaXMganVzdCBCYXIuICBIb3dldmVyLCB0aGlzIHdhcyB0aGUgd2F5IGl0IHdhcyBkb25lIGluIHRoZSBwYXN0LgotICAvLwotICAvLyBTZWUgYi8xNzQxNTY5MgotICBzaXplX3QgZG90X3BvcyA9IHR5cGUucmZpbmQoJy4nKTsKLSAgaWYgKGRvdF9wb3MgIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgKmNsYXNzX25hbWUgPSB0eXBlLnN1YnN0cihkb3RfcG9zICsgMSk7Ci0gICAgKnBhY2thZ2UgPSB0eXBlLnN1YnN0cigwLCBkb3RfcG9zKTsKLSAgfSBlbHNlIHsKLSAgICAqY2xhc3NfbmFtZSA9IHR5cGU7Ci0gICAgcGFja2FnZS0+Y2xlYXIoKTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCiBib29sIFZhbGlkYXRlQW5ub3RhdGlvbkNvbnRleHQoY29uc3QgQWlkbERvY3VtZW50JiBkb2MpIHsKICAgc3RydWN0IEFubm90YXRpb25WYWxpZGF0b3IgOiBBaWRsVmlzaXRvciB7CiAgICAgYm9vbCBzdWNjZXNzID0gdHJ1ZTsKIAogICAgIHZvaWQgQ2hlY2soY29uc3QgQWlkbEFubm90YXRhYmxlJiBhbm5vdGF0YWJsZSwgQWlkbEFubm90YXRpb246OlRhcmdldENvbnRleHQgY29udGV4dCkgewogICAgICAgZm9yIChjb25zdCBhdXRvJiBhbm5vdCA6IGFubm90YXRhYmxlLkdldEFubm90YXRpb25zKCkpIHsKLSAgICAgICAgaWYgKCFhbm5vdC5DaGVja0NvbnRleHQoY29udGV4dCkpIHsKKyAgICAgICAgaWYgKCFhbm5vdC0+Q2hlY2tDb250ZXh0KGNvbnRleHQpKSB7CiAgICAgICAgICAgc3VjY2VzcyA9IGZhbHNlOwogICAgICAgICB9CiAgICAgICB9CkBAIC0zOTgsNjkgKzM1NSwzOCBAQAogICByZXR1cm4gdmFsaWRhdG9yLnN1Y2Nlc3M7CiB9CiAKK2Jvb2wgVmFsaWRhdGVDcHBIZWFkZXIoY29uc3QgQWlkbERvY3VtZW50JiBkb2MpIHsKKyAgc3RydWN0IENwcEhlYWRlclZpc2l0b3IgOiBBaWRsVmlzaXRvciB7CisgICAgYm9vbCBzdWNjZXNzID0gdHJ1ZTsKKyAgICB2b2lkIFZpc2l0KGNvbnN0IEFpZGxQYXJjZWxhYmxlJiBwKSBvdmVycmlkZSB7CisgICAgICBpZiAocC5HZXRDcHBIZWFkZXIoKS5lbXB0eSgpKSB7CisgICAgICAgIEFJRExfRVJST1IocCkgPDwgIlVuc3RydWN0dXJlZCBwYXJjZWxhYmxlIFwiIiA8PCBwLkdldE5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgIDw8ICJcIiBtdXN0IGhhdmUgQysrIGhlYWRlciBkZWZpbmVkLiI7CisgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgdm9pZCBWaXNpdChjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgbSkgb3ZlcnJpZGUgeworICAgICAgYXV0byB0eXBlID0gbS5HZXREZWZpbmVkVHlwZSgpOworICAgICAgaWYgKHR5cGUpIHsKKyAgICAgICAgYXV0byB1bnN0cnVjdHVyZWQgPSB0eXBlLT5Bc1Vuc3RydWN0dXJlZFBhcmNlbGFibGUoKTsKKyAgICAgICAgaWYgKHVuc3RydWN0dXJlZCAmJiB1bnN0cnVjdHVyZWQtPkdldENwcEhlYWRlcigpLmVtcHR5KCkpIHsKKyAgICAgICAgICBBSURMX0VSUk9SKG0pIDw8ICJVbnN0cnVjdHVyZWQgcGFyY2VsYWJsZSBcIiIgPDwgbS5HZXRVbnJlc29sdmVkTmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXCIgbXVzdCBoYXZlIEMrKyBoZWFkZXIgZGVmaW5lZC4iOworICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfTsKKworICBDcHBIZWFkZXJWaXNpdG9yIHZhbGlkYXRvcjsKKyAgVmlzaXRUb3BEb3duKHZhbGlkYXRvciwgZG9jKTsKKyAgcmV0dXJuIHZhbGlkYXRvci5zdWNjZXNzOworfQorCiB9ICAvLyBuYW1lc3BhY2UKIAogbmFtZXNwYWNlIGludGVybmFscyB7CiAKLWJvb2wgcGFyc2VfcHJlcHJvY2Vzc2VkX2ZpbGUoY29uc3QgSW9EZWxlZ2F0ZSYgaW9fZGVsZWdhdGUsIGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFpZGxUeXBlbmFtZXMqIHR5cGVuYW1lcykgewotICBib29sIHN1Y2Nlc3MgPSB0cnVlOwotICB1bmlxdWVfcHRyPExpbmVSZWFkZXI+IGxpbmVfcmVhZGVyID0gaW9fZGVsZWdhdGUuR2V0TGluZVJlYWRlcihmaWxlbmFtZSk7Ci0gIGlmICghbGluZV9yZWFkZXIpIHsKLSAgICBBSURMX0VSUk9SKGZpbGVuYW1lKSA8PCAiY2Fubm90IG9wZW4gcHJlcHJvY2Vzc2VkIGZpbGUiOwotICAgIHN1Y2Nlc3MgPSBmYWxzZTsKLSAgICByZXR1cm4gc3VjY2VzczsKLSAgfQotCi0gIHN0cmluZyBsaW5lOwotICBpbnQgbGluZW5vID0gMTsKLSAgZm9yICggOyBsaW5lX3JlYWRlci0+UmVhZExpbmUoJmxpbmUpOyArK2xpbmVubykgewotICAgIGlmIChsaW5lLmVtcHR5KCkgfHwgbGluZS5jb21wYXJlKDAsIDIsICIvLyIpID09IDApIHsKLSAgICAgIC8vIHNraXAgY29tbWVudHMgYW5kIGVtcHR5IGxpbmVzCi0gICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICBzdHJpbmcgZGVjbDsKLSAgICBzdGQ6OnN0cmluZyBwYWNrYWdlOwotICAgIHN0cmluZyBjbGFzc19uYW1lOwotICAgIGlmICghUGFyc2VQcmVwcm9jZXNzZWRMaW5lKGxpbmUsICZkZWNsLCAmcGFja2FnZSwgJmNsYXNzX25hbWUpKSB7Ci0gICAgICBzdWNjZXNzID0gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBBaWRsTG9jYXRpb246OlBvaW50IHBvaW50ID0gey5saW5lID0gbGluZW5vLCAuY29sdW1uID0gMCAvKmNvbHVtbiovfTsKLSAgICBBaWRsTG9jYXRpb24gbG9jYXRpb24gPSBBaWRsTG9jYXRpb24oZmlsZW5hbWUsIHBvaW50LCBwb2ludCwgQWlkbExvY2F0aW9uOjpTb3VyY2U6OkVYVEVSTkFMKTsKLQotICAgIGlmIChkZWNsID09ICJwYXJjZWxhYmxlIikgewotICAgICAgLy8gUGFyY2VsRmlsZURlc2NyaXB0b3IgaXMgdHJlYXRlZCBhcyBhIGJ1aWx0LWluIHR5cGUsIGJ1dCBpdCdzIGFsc28gaW4gdGhlIGZyYW1ld29yay5haWRsLgotICAgICAgLy8gU28gYWlkbCBzaG91bGQgaWdub3JlIGJ1aWx0LWluIHR5cGVzIGluIGZyYW1ld29yay5haWRsIHRvIHByZXZlbnQgZHVwbGljYXRpb24uCi0gICAgICAvLyAoYi8xMzA4OTk0OTEpCi0gICAgICBpZiAoQWlkbFR5cGVuYW1lczo6SXNCdWlsdGluVHlwZW5hbWUoY2xhc3NfbmFtZSkpIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBBaWRsUGFyY2VsYWJsZSogZG9jID0gbmV3IEFpZGxQYXJjZWxhYmxlKGxvY2F0aW9uLCBjbGFzc19uYW1lLCBwYWNrYWdlLCBDb21tZW50c3t9KTsKLSAgICAgIHR5cGVuYW1lcy0+QWRkUHJlcHJvY2Vzc2VkVHlwZSh1bmlxdWVfcHRyPEFpZGxQYXJjZWxhYmxlPihkb2MpKTsKLSAgICB9IGVsc2UgaWYgKGRlY2wgPT0gInN0cnVjdHVyZWRfcGFyY2VsYWJsZSIpIHsKLSAgICAgIEFpZGxTdHJ1Y3R1cmVkUGFyY2VsYWJsZSogZG9jID0KLSAgICAgICAgICBuZXcgQWlkbFN0cnVjdHVyZWRQYXJjZWxhYmxlKGxvY2F0aW9uLCBjbGFzc19uYW1lLCBwYWNrYWdlLCBDb21tZW50c3t9LCBudWxscHRyLCBudWxscHRyKTsKLSAgICAgIHR5cGVuYW1lcy0+QWRkUHJlcHJvY2Vzc2VkVHlwZSh1bmlxdWVfcHRyPEFpZGxTdHJ1Y3R1cmVkUGFyY2VsYWJsZT4oZG9jKSk7Ci0gICAgfSBlbHNlIGlmIChkZWNsID09ICJpbnRlcmZhY2UiKSB7Ci0gICAgICBBaWRsSW50ZXJmYWNlKiBkb2MgPQotICAgICAgICAgIG5ldyBBaWRsSW50ZXJmYWNlKGxvY2F0aW9uLCBjbGFzc19uYW1lLCBDb21tZW50c3t9LCBmYWxzZSwgcGFja2FnZSwgbnVsbHB0cik7Ci0gICAgICB0eXBlbmFtZXMtPkFkZFByZXByb2Nlc3NlZFR5cGUodW5pcXVlX3B0cjxBaWRsSW50ZXJmYWNlPihkb2MpKTsKLSAgICB9IGVsc2UgewotICAgICAgc3VjY2VzcyA9IGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIGlmICghc3VjY2VzcykgewotICAgIEFJRExfRVJST1IoZmlsZW5hbWUpIDw8ICIgb24gbGluZSAiIDw8IGxpbmVubyA8PCAiIG1hbGZvcm1lZCBwcmVwcm9jZXNzZWQgZmlsZSBsaW5lOiAnIiA8PCBsaW5lCi0gICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiciOwotICB9Ci0KLSAgcmV0dXJuIHN1Y2Nlc3M7Ci19Ci0KIEFpZGxFcnJvciBsb2FkX2FuZF92YWxpZGF0ZV9haWRsKGNvbnN0IHN0ZDo6c3RyaW5nJiBpbnB1dF9maWxlX25hbWUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJb0RlbGVnYXRlJiBpb19kZWxlZ2F0ZSwgQWlkbFR5cGVuYW1lcyogdHlwZW5hbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPHN0cmluZz4qIGltcG9ydGVkX2ZpbGVzKSB7CkBAIC00NzEsMTIgKzM5NywxMiBAQAogICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiAgIC8vIFBhcnNlIHRoZSBtYWluIGlucHV0IGZpbGUKLSAgc3RkOjp1bmlxdWVfcHRyPFBhcnNlcj4gbWFpbl9wYXJzZXIgPSBQYXJzZXI6OlBhcnNlKGlucHV0X2ZpbGVfbmFtZSwgaW9fZGVsZWdhdGUsICp0eXBlbmFtZXMpOwotICBpZiAobWFpbl9wYXJzZXIgPT0gbnVsbHB0cikgeworICBjb25zdCBBaWRsRG9jdW1lbnQqIGRvY3VtZW50ID0gUGFyc2VyOjpQYXJzZShpbnB1dF9maWxlX25hbWUsIGlvX2RlbGVnYXRlLCAqdHlwZW5hbWVzKTsKKyAgaWYgKGRvY3VtZW50ID09IG51bGxwdHIpIHsKICAgICByZXR1cm4gQWlkbEVycm9yOjpQQVJTRV9FUlJPUjsKICAgfQogICBpbnQgbnVtX3RvcF9sZXZlbF9kZWNscyA9IDA7Ci0gIGZvciAoY29uc3QgYXV0byYgdHlwZSA6IG1haW5fcGFyc2VyLT5QYXJzZWREb2N1bWVudCgpLkRlZmluZWRUeXBlcygpKSB7CisgIGZvciAoY29uc3QgYXV0byYgdHlwZSA6IGRvY3VtZW50LT5EZWZpbmVkVHlwZXMoKSkgewogICAgIGlmICh0eXBlLT5Bc1Vuc3RydWN0dXJlZFBhcmNlbGFibGUoKSA9PSBudWxscHRyKSB7CiAgICAgICBudW1fdG9wX2xldmVsX2RlY2xzKys7CiAgICAgICBpZiAobnVtX3RvcF9sZXZlbF9kZWNscyA+IDEpIHsKQEAgLTQ4Nyw0NSArNDEzLDM0IEBACiAgIH0KIAogICAvLyBJbXBvcnQgdGhlIHByZXByb2Nlc3NlZCBmaWxlCi0gIGZvciAoY29uc3Qgc3RyaW5nJiBzIDogb3B0aW9ucy5QcmVwcm9jZXNzZWRGaWxlcygpKSB7Ci0gICAgaWYgKCFwYXJzZV9wcmVwcm9jZXNzZWRfZmlsZShpb19kZWxlZ2F0ZSwgcywgdHlwZW5hbWVzKSkgewotICAgICAgZXJyID0gQWlkbEVycm9yOjpCQURfUFJFX1BST0NFU1NFRF9GSUxFOworICBmb3IgKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUgOiBvcHRpb25zLlByZXByb2Nlc3NlZEZpbGVzKCkpIHsKKyAgICBhdXRvIHByZXByb2Nlc3NlZCA9IFBhcnNlcjo6UGFyc2UoZmlsZW5hbWUsIGlvX2RlbGVnYXRlLCAqdHlwZW5hbWVzLCAvKmlzX3ByZXByb2Nlc3NlZD0qL3RydWUpOworICAgIGlmICghcHJlcHJvY2Vzc2VkKSB7CisgICAgICByZXR1cm4gQWlkbEVycm9yOjpCQURfUFJFX1BST0NFU1NFRF9GSUxFOwogICAgIH0KICAgfQotICBpZiAoZXJyICE9IEFpZGxFcnJvcjo6T0spIHsKLSAgICByZXR1cm4gZXJyOwotICB9CiAKICAgLy8gRmluZCBmaWxlcyB0byBpbXBvcnQgYW5kIHBhcnNlIHRoZW0KICAgdmVjdG9yPHN0cmluZz4gaW1wb3J0X3BhdGhzOwotICBJbXBvcnRSZXNvbHZlciBpbXBvcnRfcmVzb2x2ZXJ7aW9fZGVsZWdhdGUsIGlucHV0X2ZpbGVfbmFtZSwgb3B0aW9ucy5JbXBvcnREaXJzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLklucHV0RmlsZXMoKX07Ci0gIGZvciAoY29uc3QgYXV0byYgaW1wb3J0IDogbWFpbl9wYXJzZXItPlBhcnNlZERvY3VtZW50KCkuSW1wb3J0cygpKSB7Ci0gICAgaWYgKEFpZGxUeXBlbmFtZXM6OklzQnVpbHRpblR5cGVuYW1lKGltcG9ydC0+R2V0TmVlZGVkQ2xhc3MoKSkpIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBpZiAodHlwZW5hbWVzLT5Jc0lnbm9yYWJsZUltcG9ydChpbXBvcnQtPkdldE5lZWRlZENsYXNzKCkpKSB7CisgIEltcG9ydFJlc29sdmVyIGltcG9ydF9yZXNvbHZlcntpb19kZWxlZ2F0ZSwgaW5wdXRfZmlsZV9uYW1lLCBvcHRpb25zLkltcG9ydERpcnMoKX07CisgIGZvciAoY29uc3QgYXV0byYgaW1wb3J0IDogZG9jdW1lbnQtPkltcG9ydHMoKSkgeworICAgIGlmICh0eXBlbmFtZXMtPklzSWdub3JhYmxlSW1wb3J0KGltcG9ydCkpIHsKICAgICAgIC8vIFRoZXJlIGFyZSBwbGFjZXMgaW4gdGhlIEFuZHJvaWQgdHJlZSB3aGVyZSBhbiBpbXBvcnQgZG9lc24ndCByZXNvbHZlLAogICAgICAgLy8gYnV0IHdlJ2xsIHBpY2sgdGhlIHR5cGUgdXAgdGhyb3VnaCB0aGUgcHJlcHJvY2Vzc2VkIHR5cGVzLgogICAgICAgLy8gVGhpcyBzZWVtcyBsaWtlIGFuIGVycm9yLCBidXQgbGVnYWN5IHN1cHBvcnQgZGVtYW5kcyB3ZSBzdXBwb3J0IGl0Li4uCiAgICAgICBjb250aW51ZTsKICAgICB9Ci0gICAgc3RyaW5nIGltcG9ydF9wYXRoID0gaW1wb3J0X3Jlc29sdmVyLkZpbmRJbXBvcnRGaWxlKGltcG9ydC0+R2V0TmVlZGVkQ2xhc3MoKSk7CisgICAgc3RyaW5nIGltcG9ydF9wYXRoID0gaW1wb3J0X3Jlc29sdmVyLkZpbmRJbXBvcnRGaWxlKGltcG9ydCk7CiAgICAgaWYgKGltcG9ydF9wYXRoLmVtcHR5KCkpIHsKLSAgICAgIGlmICh0eXBlbmFtZXMtPlJlc29sdmVUeXBlbmFtZShpbXBvcnQtPkdldE5lZWRlZENsYXNzKCkpLmlzX3Jlc29sdmVkKSB7Ci0gICAgICAgIC8vIFRoaXMgY291bGQgaGFwcGVuIHdoZW4gdGhlIHR5cGUgaXMgZnJvbSB0aGUgcHJlcHJvY2Vzc2VkIGFpZGwgZmlsZS4KLSAgICAgICAgLy8gSW4gdGhhdCBjYXNlLCB1c2UgdGhlIHR5cGUgZnJvbSBwcmVwcm9jZXNzZWQgYWlkbCBmaWxlCi0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgQUlETF9FUlJPUihpbnB1dF9maWxlX25hbWUpIDw8ICJDb3VsZG4ndCBmaW5kIGltcG9ydCBmb3IgY2xhc3MgIiA8PCBpbXBvcnQtPkdldE5lZWRlZENsYXNzKCk7CisgICAgICBBSURMX0VSUk9SKGlucHV0X2ZpbGVfbmFtZSkgPDwgIkNvdWxkbid0IGZpbmQgaW1wb3J0IGZvciBjbGFzcyAiIDw8IGltcG9ydDsKICAgICAgIGVyciA9IEFpZGxFcnJvcjo6QkFEX0lNUE9SVDsKICAgICAgIGNvbnRpbnVlOwogICAgIH0KIAogICAgIGltcG9ydF9wYXRocy5lbXBsYWNlX2JhY2soaW1wb3J0X3BhdGgpOwogCi0gICAgc3RkOjp1bmlxdWVfcHRyPFBhcnNlcj4gaW1wb3J0X3BhcnNlciA9IFBhcnNlcjo6UGFyc2UoaW1wb3J0X3BhdGgsIGlvX2RlbGVnYXRlLCAqdHlwZW5hbWVzKTsKLSAgICBpZiAoaW1wb3J0X3BhcnNlciA9PSBudWxscHRyKSB7CisgICAgYXV0byBpbXBvcnRlZF9kb2MgPSBQYXJzZXI6OlBhcnNlKGltcG9ydF9wYXRoLCBpb19kZWxlZ2F0ZSwgKnR5cGVuYW1lcyk7CisgICAgaWYgKGltcG9ydGVkX2RvYyA9PSBudWxscHRyKSB7CiAgICAgICBBSURMX0VSUk9SKGltcG9ydF9wYXRoKSA8PCAiZXJyb3Igd2hpbGUgaW1wb3J0aW5nICIgPDwgaW1wb3J0X3BhdGggPDwgIiBmb3IgIiA8PCBpbXBvcnQ7CiAgICAgICBlcnIgPSBBaWRsRXJyb3I6OkJBRF9JTVBPUlQ7CiAgICAgICBjb250aW51ZTsKQEAgLTUzNSw1MiArNDUwLDMyIEBACiAgICAgcmV0dXJuIGVycjsKICAgfQogCi0gIGZvciAoY29uc3QgYXV0byYgaW1wb3J0ZWRfZmlsZSA6IG9wdGlvbnMuSW1wb3J0RmlsZXMoKSkgewotICAgIGltcG9ydF9wYXRocy5lbXBsYWNlX2JhY2soaW1wb3J0ZWRfZmlsZSk7Ci0KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8UGFyc2VyPiBpbXBvcnRfcGFyc2VyID0gUGFyc2VyOjpQYXJzZShpbXBvcnRlZF9maWxlLCBpb19kZWxlZ2F0ZSwgKnR5cGVuYW1lcyk7Ci0gICAgaWYgKGltcG9ydF9wYXJzZXIgPT0gbnVsbHB0cikgewotICAgICAgQUlETF9FUlJPUihpbXBvcnRlZF9maWxlKSA8PCAiZXJyb3Igd2hpbGUgaW1wb3J0aW5nICIgPDwgaW1wb3J0ZWRfZmlsZTsKLSAgICAgIGVyciA9IEFpZGxFcnJvcjo6QkFEX0lNUE9SVDsKLSAgICAgIGNvbnRpbnVlOworICBUeXBlUmVzb2x2ZXIgcmVzb2x2ZXIgPSBbJl0oY29uc3QgQWlkbERlZmluZWRUeXBlKiBzY29wZSwgQWlkbFR5cGVTcGVjaWZpZXIqIHR5cGUpIHsKKyAgICAvLyByZXNvbHZlIHdpdGggYWxyZWFkeSBsb2FkZWQgdHlwZXMKKyAgICBpZiAodHlwZS0+UmVzb2x2ZSgqdHlwZW5hbWVzLCBzY29wZSkpIHsKKyAgICAgIHJldHVybiB0cnVlOwogICAgIH0KLSAgfQotICBpZiAoZXJyICE9IEFpZGxFcnJvcjo6T0spIHsKLSAgICByZXR1cm4gZXJyOwotICB9Ci0KLSAgVHlwZVJlc29sdmVyIHJlc29sdmVyID0gWyZdKGNvbnN0IEFpZGxEb2N1bWVudCogZG9jLCBBaWRsVHlwZVNwZWNpZmllciogdHlwZSkgewotICAgIGlmICh0eXBlLT5SZXNvbHZlKCp0eXBlbmFtZXMpKSByZXR1cm4gdHJ1ZTsKLQotICAgIGNvbnN0IHN0cmluZyB1bnJlc29sdmVkX25hbWUgPSB0eXBlLT5HZXRVbnJlc29sdmVkTmFtZSgpOwotICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RyaW5nPiBjYW5vbmljYWxfbmFtZSA9IGRvYy0+UmVzb2x2ZU5hbWUodW5yZXNvbHZlZF9uYW1lKTsKLSAgICBpZiAoIWNhbm9uaWNhbF9uYW1lKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGNvbnN0IHN0cmluZyBpbXBvcnRfcGF0aCA9IGltcG9ydF9yZXNvbHZlci5GaW5kSW1wb3J0RmlsZSgqY2Fub25pY2FsX25hbWUpOworICAgIGNvbnN0IHN0cmluZyBpbXBvcnRfcGF0aCA9IGltcG9ydF9yZXNvbHZlci5GaW5kSW1wb3J0RmlsZShzY29wZS0+UmVzb2x2ZU5hbWUodHlwZS0+R2V0TmFtZSgpKSk7CiAgICAgaWYgKGltcG9ydF9wYXRoLmVtcHR5KCkpIHsKICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaW1wb3J0X3BhdGhzLnB1c2hfYmFjayhpbXBvcnRfcGF0aCk7Ci0KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8UGFyc2VyPiBpbXBvcnRfcGFyc2VyID0gUGFyc2VyOjpQYXJzZShpbXBvcnRfcGF0aCwgaW9fZGVsZWdhdGUsICp0eXBlbmFtZXMpOwotICAgIGlmIChpbXBvcnRfcGFyc2VyID09IG51bGxwdHIpIHsKKyAgICBhdXRvIGltcG9ydGVkX2RvYyA9IFBhcnNlcjo6UGFyc2UoaW1wb3J0X3BhdGgsIGlvX2RlbGVnYXRlLCAqdHlwZW5hbWVzKTsKKyAgICBpZiAoaW1wb3J0ZWRfZG9jID09IG51bGxwdHIpIHsKICAgICAgIEFJRExfRVJST1IoaW1wb3J0X3BhdGgpIDw8ICJlcnJvciB3aGlsZSBpbXBvcnRpbmcgIiA8PCBpbXBvcnRfcGF0aCA8PCAiIGZvciAiIDw8IGltcG9ydF9wYXRoOwogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICBpZiAoIXR5cGUtPlJlc29sdmUoKnR5cGVuYW1lcykpIHsKKworICAgIC8vIG5vdywgdHJ5IHRvIHJlc29sdmUgaXQgYWdhaW4KKyAgICBpZiAoIXR5cGUtPlJlc29sdmUoKnR5cGVuYW1lcywgc2NvcGUpKSB7CiAgICAgICBBSURMX0VSUk9SKHR5cGUpIDw8ICJDYW4ndCByZXNvbHZlICIgPDwgdHlwZS0+R2V0TmFtZSgpOwogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICByZXR1cm4gdHJ1ZTsKICAgfTsKLSAgY29uc3QgYm9vbCBpc19jaGVja19hcGkgPSBvcHRpb25zLkdldFRhc2soKSA9PSBPcHRpb25zOjpUYXNrOjpDSEVDS19BUEk7Ci0gIGNvbnN0IGJvb2wgaXNfZHVtcF9hcGkgPSBvcHRpb25zLkdldFRhc2soKSA9PSBPcHRpb25zOjpUYXNrOjpEVU1QX0FQSTsKIAotICAvLyBSZXNvbHZlIHRoZSB1bnJlc29sdmVkIHR5cGUgcmVmZXJlbmNlcyBmb3VuZCBmcm9tIHRoZSBpbnB1dCBmaWxlCi0gIGlmICghaXNfY2hlY2tfYXBpICYmICFtYWluX3BhcnNlci0+UmVzb2x2ZShyZXNvbHZlcikpIHsKLSAgICAvLyBSZXNvbHV0aW9uIGlzIG5vdCBuZWVkIGZvciBjaGVjayBhcGkgYmVjYXVzZSBhbGwgdHlwZXNwZWNzIGFyZQotICAgIC8vIHVzaW5nIGZ1bGx5IHF1YWxpZmllZCBuYW1lcy4KKyAgLy8gUmVzb2x2ZSB0aGUgdW5yZXNvbHZlZCByZWZlcmVuY2VzCisgIGlmICghUmVzb2x2ZVJlZmVyZW5jZXMoKmRvY3VtZW50LCByZXNvbHZlcikpIHsKICAgICByZXR1cm4gQWlkbEVycm9yOjpCQURfVFlQRTsKICAgfQogCkBAIC01OTIsMTYgKzQ4NywxMCBAQAogICAvLyBWYWxpZGF0aW9uIHBoYXNlCiAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLSAgLy8gRm9yIGxlZ2FjeSByZWFzb25zLCBieSBkZWZhdWx0LCBjb21waWxpbmcgYW4gdW5zdHJ1Y3R1cmVkIHBhcmNlbGFibGUgKHdoaWNoIGNvbnRhaW5zIG5vIG91dHB1dCkKLSAgLy8gaXMgYWxsb3dlZC4gVGhpcyBtdXN0IG5vdCBiZSByZXR1cm5lZCBhcyBhbiBlcnJvciB1bnRpbCB0aGUgdmVyeSBlbmQgb2YgdGhpcyBwcm9jZWR1cmUgc2luY2UKLSAgLy8gdGhpcyBtYXkgYmUgY29uc2lkZXJlZCBhIHN1Y2Nlc3MsIGFuZCB3ZSBzaG91bGQgZmlyc3QgY2hlY2sgdGhhdCB0aGVyZSBhcmUgbm90IG90aGVyLCBtb3JlCi0gIC8vIHNlcmlvdXMgZmFpbHVyZXMuCi0gIGJvb2wgY29udGFpbnNfdW5zdHJ1Y3R1cmVkX3BhcmNlbGFibGUgPSBmYWxzZTsKLQotICBjb25zdCBhdXRvJiB0eXBlcyA9IG1haW5fcGFyc2VyLT5QYXJzZWREb2N1bWVudCgpLkRlZmluZWRUeXBlcygpOworICBjb25zdCBhdXRvJiB0eXBlcyA9IGRvY3VtZW50LT5EZWZpbmVkVHlwZXMoKTsKICAgY29uc3QgaW50IG51bV9kZWZpbmVkX3R5cGVzID0gdHlwZXMuc2l6ZSgpOwogICBmb3IgKGNvbnN0IGF1dG8mIGRlZmluZWRfdHlwZSA6IHR5cGVzKSB7Ci0gICAgQUlETF9GQVRBTF9JRihkZWZpbmVkX3R5cGUgPT0gbnVsbHB0ciwgbWFpbl9wYXJzZXItPkZpbGVOYW1lKCkpOworICAgIEFJRExfRkFUQUxfSUYoZGVmaW5lZF90eXBlID09IG51bGxwdHIsIGRvY3VtZW50KTsKIAogICAgIC8vIEVuc3VyZSB0eXBlIGlzIGV4YWN0bHkgb25lIG9mIHRoZSBmb2xsb3dpbmc6CiAgICAgQWlkbEludGVyZmFjZSogaW50ZXJmYWNlID0gZGVmaW5lZF90eXBlLT5Bc0ludGVyZmFjZSgpOwpAQCAtNjIxLDE3ICs1MTAsMTIgQEAKICAgICB7CiAgICAgICBib29sIHZhbGlkX3R5cGUgPSB0cnVlOwogCi0gICAgICBpZiAoIWlzX2NoZWNrX2FwaSkgewotICAgICAgICAvLyBJZGVhbGx5LCB3ZSBjb3VsZCBkbyB0aGlzIGZvciBjaGVjayBhcGksIGJ1dCB3ZSBjYW4ndCByZXNvbHZlIGltcG9ydHMKLSAgICAgICAgaWYgKCFkZWZpbmVkX3R5cGUtPkNoZWNrVmFsaWQoKnR5cGVuYW1lcykpIHsKLSAgICAgICAgICB2YWxpZF90eXBlID0gZmFsc2U7Ci0gICAgICAgIH0KKyAgICAgIGlmICghZGVmaW5lZF90eXBlLT5DaGVja1ZhbGlkKCp0eXBlbmFtZXMpKSB7CisgICAgICAgIHZhbGlkX3R5cGUgPSBmYWxzZTsKICAgICAgIH0KIAotICAgICAgaWYgKCFpc19kdW1wX2FwaSAmJiAhaXNfY2hlY2tfYXBpKSB7Ci0gICAgICAgIGlmICghZGVmaW5lZF90eXBlLT5MYW5ndWFnZVNwZWNpZmljQ2hlY2tWYWxpZCgqdHlwZW5hbWVzLCBvcHRpb25zLlRhcmdldExhbmd1YWdlKCkpKSB7Ci0gICAgICAgICAgdmFsaWRfdHlwZSA9IGZhbHNlOwotICAgICAgICB9CisgICAgICBpZiAoIWRlZmluZWRfdHlwZS0+TGFuZ3VhZ2VTcGVjaWZpY0NoZWNrVmFsaWQob3B0aW9ucy5UYXJnZXRMYW5ndWFnZSgpKSkgeworICAgICAgICB2YWxpZF90eXBlID0gZmFsc2U7CiAgICAgICB9CiAKICAgICAgIGlmICghdmFsaWRfdHlwZSkgewpAQCAtNjQwLDIxICs1MjQsMjEgQEAKICAgICB9CiAKICAgICBpZiAodW5zdHJ1Y3R1cmVkX3BhcmNlbGFibGUgIT0gbnVsbHB0cikgewotICAgICAgYm9vbCBpc1N0YWJsZSA9IHVuc3RydWN0dXJlZF9wYXJjZWxhYmxlLT5Jc1N0YWJsZUFwaVBhcmNlbGFibGUob3B0aW9ucy5UYXJnZXRMYW5ndWFnZSgpKTsKKyAgICAgIGF1dG8gbGFuZyA9IG9wdGlvbnMuVGFyZ2V0TGFuZ3VhZ2UoKTsKKyAgICAgIGJvb2wgaXNTdGFibGUgPSB1bnN0cnVjdHVyZWRfcGFyY2VsYWJsZS0+SXNTdGFibGVBcGlQYXJjZWxhYmxlKGxhbmcpOwogICAgICAgaWYgKG9wdGlvbnMuSXNTdHJ1Y3R1cmVkKCkgJiYgIWlzU3RhYmxlKSB7CiAgICAgICAgIEFJRExfRVJST1IodW5zdHJ1Y3R1cmVkX3BhcmNlbGFibGUpCi0gICAgICAgICAgICA8PCAiQ2Fubm90IGRlY2xhcmVkIHBhcmNlbGFibGUgaW4gYSAtLXN0cnVjdHVyZWQgaW50ZXJmYWNlLiBQYXJjZWxhYmxlIG11c3QgYmUgZGVmaW5lZCAiCi0gICAgICAgICAgICAgICAiaW4gQUlETCBkaXJlY3RseS4iOworICAgICAgICAgICAgPDwgIkNhbm5vdCBkZWNsYXJlIHVuc3RydWN0dXJlZCBwYXJjZWxhYmxlIGluIGEgLS1zdHJ1Y3R1cmVkIGludGVyZmFjZS4gUGFyY2VsYWJsZSAiCisgICAgICAgICAgICAgICAibXVzdCBiZSBkZWZpbmVkIGluIEFJREwgZGlyZWN0bHkuIjsKICAgICAgICAgcmV0dXJuIEFpZGxFcnJvcjo6Tk9UX1NUUlVDVFVSRUQ7CiAgICAgICB9Ci0gICAgICBpZiAob3B0aW9ucy5GYWlsT25QYXJjZWxhYmxlKCkpIHsKKyAgICAgIGlmIChvcHRpb25zLkZhaWxPblBhcmNlbGFibGUoKSB8fCBsYW5nID09IE9wdGlvbnM6Okxhbmd1YWdlOjpOREsgfHwKKyAgICAgICAgICBsYW5nID09IE9wdGlvbnM6Okxhbmd1YWdlOjpSVVNUKSB7CiAgICAgICAgIEFJRExfRVJST1IodW5zdHJ1Y3R1cmVkX3BhcmNlbGFibGUpCiAgICAgICAgICAgICA8PCAiUmVmdXNpbmcgdG8gZ2VuZXJhdGUgY29kZSB3aXRoIHVuc3RydWN0dXJlZCBwYXJjZWxhYmxlcy4gRGVjbGFyZWQgcGFyY2VsYWJsZXMgIgogICAgICAgICAgICAgICAgInNob3VsZCBiZSBpbiB0aGVpciBvd24gZmlsZSBhbmQvb3IgY2Fubm90IGJlIHVzZWQgd2l0aCAtLXN0cnVjdHVyZWQgaW50ZXJmYWNlcy4iOwotICAgICAgICAvLyBDb250aW51ZSBwYXJzaW5nIGZvciBtb3JlIGVycm9ycworICAgICAgICByZXR1cm4gQWlkbEVycm9yOjpGT1VORF9QQVJDRUxBQkxFOwogICAgICAgfQotCi0gICAgICBjb250YWluc191bnN0cnVjdHVyZWRfcGFyY2VsYWJsZSA9IHRydWU7CiAgICAgfQogCiAgICAgaWYgKGRlZmluZWRfdHlwZS0+SXNWaW50ZlN0YWJpbGl0eSgpKSB7CkBAIC02NzIsNTggKzU1Niw3OCBAQAogICAgICAgaWYgKCFzdWNjZXNzKSByZXR1cm4gQWlkbEVycm9yOjpOT1RfU1RSVUNUVVJFRDsKICAgICB9CiAKKyAgICAvLyBWZXJpZnkgdGhlIHZhci9jb25zdCBkZWNsYXJhdGlvbnMuCisgICAgLy8gY29uc3QgZXhwcmVzc2lvbnMgc2hvdWxkIGJlIG5vbi1lbXB0eSB3aGVuIGV2YWx1YXRlZCB3aXRoIHRoZSB2YXIvY29uc3QgdHlwZS4KKyAgICBmb3IgKGNvbnN0IGF1dG8mIGNvbnN0YW50IDogZGVmaW5lZF90eXBlLT5HZXRDb25zdGFudERlY2xhcmF0aW9ucygpKSB7CisgICAgICBpZiAoY29uc3RhbnQtPlZhbHVlU3RyaW5nKEFpZGxDb25zdGFudFZhbHVlRGVjb3JhdG9yKS5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBBaWRsRXJyb3I6OkJBRF9UWVBFOworICAgICAgfQorICAgIH0KKyAgICBmb3IgKGNvbnN0IGF1dG8mIHZhciA6IGRlZmluZWRfdHlwZS0+R2V0RmllbGRzKCkpIHsKKyAgICAgIGlmICh2YXItPkdldERlZmF1bHRWYWx1ZSgpICYmIHZhci0+VmFsdWVTdHJpbmcoQWlkbENvbnN0YW50VmFsdWVEZWNvcmF0b3IpLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIEFpZGxFcnJvcjo6QkFEX1RZUEU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gQWRkIG1ldGEgbWV0aG9kcyBhbmQgYXNzaWduIG1ldGhvZCBJRHMgdG8gZWFjaCBpbnRlcmZhY2UKKyAgdHlwZW5hbWVzLT5JdGVyYXRlVHlwZXMoWyZdKGNvbnN0IEFpZGxEZWZpbmVkVHlwZSYgdHlwZSkgeworICAgIGF1dG8gaW50ZXJmYWNlID0gY29uc3RfY2FzdDxBaWRsSW50ZXJmYWNlKj4odHlwZS5Bc0ludGVyZmFjZSgpKTsKICAgICBpZiAoaW50ZXJmYWNlICE9IG51bGxwdHIpIHsKICAgICAgIC8vIGFkZCB0aGUgbWV0YS1tZXRob2QgJ2ludCBnZXRJbnRlcmZhY2VWZXJzaW9uKCknIGlmIHZlcnNpb24gaXMgc3BlY2lmaWVkLgogICAgICAgaWYgKG9wdGlvbnMuVmVyc2lvbigpID4gMCkgewotICAgICAgICBBaWRsVHlwZVNwZWNpZmllciogcmV0ID0KLSAgICAgICAgICAgIG5ldyBBaWRsVHlwZVNwZWNpZmllcihBSURMX0xPQ0FUSU9OX0hFUkUsICJpbnQiLCBmYWxzZSwgbnVsbHB0ciwgQ29tbWVudHN7fSk7Ci0gICAgICAgIHJldC0+UmVzb2x2ZSgqdHlwZW5hbWVzKTsKKyAgICAgICAgYXV0byByZXQgPSB0eXBlbmFtZXMtPk1ha2VSZXNvbHZlZFR5cGUoQUlETF9MT0NBVElPTl9IRVJFLCAiaW50IiwgZmFsc2UpOwogICAgICAgICB2ZWN0b3I8dW5pcXVlX3B0cjxBaWRsQXJndW1lbnQ+PiogYXJncyA9IG5ldyB2ZWN0b3I8dW5pcXVlX3B0cjxBaWRsQXJndW1lbnQ+PigpOwotICAgICAgICBhdXRvIG1ldGhvZCA9IHN0ZDo6bWFrZV91bmlxdWU8QWlkbE1ldGhvZD4oCi0gICAgICAgICAgICBBSURMX0xPQ0FUSU9OX0hFUkUsIGZhbHNlLCByZXQsICJnZXRJbnRlcmZhY2VWZXJzaW9uIiwgYXJncywgQ29tbWVudHN7fSwKLSAgICAgICAgICAgIGtHZXRJbnRlcmZhY2VWZXJzaW9uSWQsIGZhbHNlIC8qIGlzX3VzZXJfZGVmaW5lZCAqLyk7CisgICAgICAgIGF1dG8gbWV0aG9kID0gc3RkOjptYWtlX3VuaXF1ZTxBaWRsTWV0aG9kPihBSURMX0xPQ0FUSU9OX0hFUkUsIGZhbHNlLCByZXQucmVsZWFzZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdldEludGVyZmFjZVZlcnNpb24iLCBhcmdzLCBDb21tZW50c3t9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0dldEludGVyZmFjZVZlcnNpb25JZCk7CiAgICAgICAgIGludGVyZmFjZS0+QWRkTWV0aG9kKHN0ZDo6bW92ZShtZXRob2QpKTsKICAgICAgIH0KICAgICAgIC8vIGFkZCB0aGUgbWV0YS1tZXRob2QgJ3N0cmluZyBnZXRJbnRlcmZhY2VIYXNoKCknIGlmIGhhc2ggaXMgc3BlY2lmaWVkLgogICAgICAgaWYgKCFvcHRpb25zLkhhc2goKS5lbXB0eSgpKSB7Ci0gICAgICAgIEFpZGxUeXBlU3BlY2lmaWVyKiByZXQgPQotICAgICAgICAgICAgbmV3IEFpZGxUeXBlU3BlY2lmaWVyKEFJRExfTE9DQVRJT05fSEVSRSwgIlN0cmluZyIsIGZhbHNlLCBudWxscHRyLCBDb21tZW50c3t9KTsKLSAgICAgICAgcmV0LT5SZXNvbHZlKCp0eXBlbmFtZXMpOworICAgICAgICBhdXRvIHJldCA9IHR5cGVuYW1lcy0+TWFrZVJlc29sdmVkVHlwZShBSURMX0xPQ0FUSU9OX0hFUkUsICJTdHJpbmciLCBmYWxzZSk7CiAgICAgICAgIHZlY3Rvcjx1bmlxdWVfcHRyPEFpZGxBcmd1bWVudD4+KiBhcmdzID0gbmV3IHZlY3Rvcjx1bmlxdWVfcHRyPEFpZGxBcmd1bWVudD4+KCk7Ci0gICAgICAgIGF1dG8gbWV0aG9kID0gc3RkOjptYWtlX3VuaXF1ZTxBaWRsTWV0aG9kPigKLSAgICAgICAgICAgIEFJRExfTE9DQVRJT05fSEVSRSwgZmFsc2UsIHJldCwga0dldEludGVyZmFjZUhhc2gsIGFyZ3MsIENvbW1lbnRze30sCi0gICAgICAgICAgICBrR2V0SW50ZXJmYWNlSGFzaElkLCBmYWxzZSAvKiBpc191c2VyX2RlZmluZWQgKi8pOworICAgICAgICBhdXRvIG1ldGhvZCA9CisgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPEFpZGxNZXRob2Q+KEFJRExfTE9DQVRJT05fSEVSRSwgZmFsc2UsIHJldC5yZWxlYXNlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtHZXRJbnRlcmZhY2VIYXNoLCBhcmdzLCBDb21tZW50c3t9LCBrR2V0SW50ZXJmYWNlSGFzaElkKTsKICAgICAgICAgaW50ZXJmYWNlLT5BZGRNZXRob2Qoc3RkOjptb3ZlKG1ldGhvZCkpOwogICAgICAgfQotICAgICAgaWYgKCFjaGVja19hbmRfYXNzaWduX21ldGhvZF9pZHMoaW50ZXJmYWNlLT5HZXRNZXRob2RzKCkpKSB7Ci0gICAgICAgIHJldHVybiBBaWRsRXJyb3I6OkJBRF9NRVRIT0RfSUQ7CisgICAgICBpZiAoIUNoZWNrQW5kQXNzaWduTWV0aG9kSURzKGludGVyZmFjZS0+R2V0TWV0aG9kcygpKSkgeworICAgICAgICBlcnIgPSBBaWRsRXJyb3I6OkJBRF9NRVRIT0RfSUQ7CiAgICAgICB9CiAgICAgfQotICAgIC8vIFZlcmlmeSB0aGUgdmFyL2NvbnN0IGRlY2xhcmF0aW9ucy4KLSAgICAvLyBjb25zdCBleHByZXNzaW9ucyBzaG91bGQgYmUgbm9uLWVtcHR5IHdoZW4gZXZhbHVhdGVkIHdpdGggdGhlIHZhci9jb25zdCB0eXBlLgotICAgIGlmICghaXNfY2hlY2tfYXBpKSB7Ci0gICAgICBmb3IgKGNvbnN0IGF1dG8mIGNvbnN0YW50IDogZGVmaW5lZF90eXBlLT5HZXRDb25zdGFudERlY2xhcmF0aW9ucygpKSB7Ci0gICAgICAgIGlmIChjb25zdGFudC0+VmFsdWVTdHJpbmcoQWlkbENvbnN0YW50VmFsdWVEZWNvcmF0b3IpLmVtcHR5KCkpIHsKLSAgICAgICAgICByZXR1cm4gQWlkbEVycm9yOjpCQURfVFlQRTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZm9yIChjb25zdCBhdXRvJiB2YXIgOiBkZWZpbmVkX3R5cGUtPkdldEZpZWxkcygpKSB7Ci0gICAgICAgIGlmICh2YXItPkdldERlZmF1bHRWYWx1ZSgpICYmIHZhci0+VmFsdWVTdHJpbmcoQWlkbENvbnN0YW50VmFsdWVEZWNvcmF0b3IpLmVtcHR5KCkpIHsKLSAgICAgICAgICByZXR1cm4gQWlkbEVycm9yOjpCQURfVFlQRTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KKyAgfSk7CisgIGlmIChlcnIgIT0gQWlkbEVycm9yOjpPSykgeworICAgIHJldHVybiBlcnI7CiAgIH0KIAotICBpZiAoIVZhbGlkYXRlQW5ub3RhdGlvbkNvbnRleHQobWFpbl9wYXJzZXItPlBhcnNlZERvY3VtZW50KCkpKSB7CisgIGZvciAoY29uc3QgYXV0byYgZG9jIDogdHlwZW5hbWVzLT5BbGxEb2N1bWVudHMoKSkgeworICAgIFZpc2l0VG9wRG93bihbXShjb25zdCBBaWRsTm9kZSYgbikgeyBuLk1hcmtWaXNpdGVkKCk7IH0sICpkb2MpOworICB9CisKKyAgaWYgKCFDaGVja1ZhbGlkKCpkb2N1bWVudCwgb3B0aW9ucykpIHsKICAgICByZXR1cm4gQWlkbEVycm9yOjpCQURfVFlQRTsKICAgfQogCi0gIGlmICghaXNfY2hlY2tfYXBpICYmICFEaWFnbm9zZShtYWluX3BhcnNlci0+UGFyc2VkRG9jdW1lbnQoKSwgb3B0aW9ucy5HZXREaWFnbm9zdGljTWFwcGluZygpKSkgeworICBpZiAoIVZhbGlkYXRlQW5ub3RhdGlvbkNvbnRleHQoKmRvY3VtZW50KSkgeworICAgIHJldHVybiBBaWRsRXJyb3I6OkJBRF9UWVBFOworICB9CisKKyAgaWYgKChvcHRpb25zLlRhcmdldExhbmd1YWdlKCkgPT0gT3B0aW9uczo6TGFuZ3VhZ2U6OkNQUCB8fAorICAgICAgIG9wdGlvbnMuVGFyZ2V0TGFuZ3VhZ2UoKSA9PSBPcHRpb25zOjpMYW5ndWFnZTo6TkRLKSAmJgorICAgICAgIVZhbGlkYXRlQ3BwSGVhZGVyKCpkb2N1bWVudCkpIHsKKyAgICByZXR1cm4gQWlkbEVycm9yOjpCQURfVFlQRTsKKyAgfQorCisgIGlmICghRGlhZ25vc2UoKmRvY3VtZW50LCBvcHRpb25zLkdldERpYWdub3N0aWNNYXBwaW5nKCkpKSB7CiAgICAgcmV0dXJuIEFpZGxFcnJvcjo6QkFEX1RZUEU7CiAgIH0KIAogICB0eXBlbmFtZXMtPkl0ZXJhdGVUeXBlcyhbJl0oY29uc3QgQWlkbERlZmluZWRUeXBlJiB0eXBlKSB7CisgICAgaWYgKCF0eXBlLkxhbmd1YWdlU3BlY2lmaWNDaGVja1ZhbGlkKG9wdGlvbnMuVGFyZ2V0TGFuZ3VhZ2UoKSkpIHsKKyAgICAgIGVyciA9IEFpZGxFcnJvcjo6QkFEX1RZUEU7CisgICAgfQorCiAgICAgaWYgKG9wdGlvbnMuSXNTdHJ1Y3R1cmVkKCkgJiYgdHlwZS5Bc1Vuc3RydWN0dXJlZFBhcmNlbGFibGUoKSAhPSBudWxscHRyICYmCiAgICAgICAgICF0eXBlLkFzVW5zdHJ1Y3R1cmVkUGFyY2VsYWJsZSgpLT5Jc1N0YWJsZUFwaVBhcmNlbGFibGUob3B0aW9ucy5UYXJnZXRMYW5ndWFnZSgpKSkgewogICAgICAgZXJyID0gQWlkbEVycm9yOjpOT1RfU1RSVUNUVVJFRDsKQEAgLTc3NywxNyArNjgxLDEyIEBACiAgICAgKmltcG9ydGVkX2ZpbGVzID0gaW1wb3J0X3BhdGhzOwogICB9CiAKLSAgaWYgKGNvbnRhaW5zX3Vuc3RydWN0dXJlZF9wYXJjZWxhYmxlKSB7Ci0gICAgLy8gQ29uc2lkZXJlZCBhIHN1Y2Nlc3MgZm9yIHRoZSBsZWdhY3kgY2FzZSwgc28gdGhpcyBtdXN0IGJlIHJldHVybmVkIGxhc3QuCi0gICAgcmV0dXJuIEFpZGxFcnJvcjo6Rk9VTkRfUEFSQ0VMQUJMRTsKLSAgfQotCiAgIHJldHVybiBBaWRsRXJyb3I6Ok9LOwogfQogCiB9IC8vIG5hbWVzcGFjZSBpbnRlcm5hbHMKIAotaW50IGNvbXBpbGVfYWlkbChjb25zdCBPcHRpb25zJiBvcHRpb25zLCBjb25zdCBJb0RlbGVnYXRlJiBpb19kZWxlZ2F0ZSkgeworYm9vbCBjb21waWxlX2FpZGwoY29uc3QgT3B0aW9ucyYgb3B0aW9ucywgY29uc3QgSW9EZWxlZ2F0ZSYgaW9fZGVsZWdhdGUpIHsKICAgY29uc3QgT3B0aW9uczo6TGFuZ3VhZ2UgbGFuZyA9IG9wdGlvbnMuVGFyZ2V0TGFuZ3VhZ2UoKTsKICAgZm9yIChjb25zdCBzdHJpbmcmIGlucHV0X2ZpbGUgOiBvcHRpb25zLklucHV0RmlsZXMoKSkgewogICAgIEFpZGxUeXBlbmFtZXMgdHlwZW5hbWVzOwpAQCAtNzk2LDkgKzY5NSw4IEBACiAKICAgICBBaWRsRXJyb3IgYWlkbF9lcnIgPSBpbnRlcm5hbHM6OmxvYWRfYW5kX3ZhbGlkYXRlX2FpZGwoaW5wdXRfZmlsZSwgb3B0aW9ucywgaW9fZGVsZWdhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0eXBlbmFtZXMsICZpbXBvcnRlZF9maWxlcyk7Ci0gICAgYm9vbCBhbGxvd0Vycm9yID0gYWlkbF9lcnIgPT0gQWlkbEVycm9yOjpGT1VORF9QQVJDRUxBQkxFICYmICFvcHRpb25zLkZhaWxPblBhcmNlbGFibGUoKTsKLSAgICBpZiAoYWlkbF9lcnIgIT0gQWlkbEVycm9yOjpPSyAmJiAhYWxsb3dFcnJvcikgewotICAgICAgcmV0dXJuIDE7CisgICAgaWYgKGFpZGxfZXJyICE9IEFpZGxFcnJvcjo6T0spIHsKKyAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICBmb3IgKGNvbnN0IGF1dG8mIGRlZmluZWRfdHlwZSA6IHR5cGVuYW1lcy5NYWluRG9jdW1lbnQoKS5EZWZpbmVkVHlwZXMoKSkgewpAQCAtODA5LDEzICs3MDcsMTMgQEAKICAgICAgIGlmIChvdXRwdXRfZmlsZV9uYW1lLmVtcHR5KCkgJiYgIW9wdGlvbnMuT3V0cHV0RGlyKCkuZW1wdHkoKSkgewogICAgICAgICBvdXRwdXRfZmlsZV9uYW1lID0gR2V0T3V0cHV0RmlsZVBhdGgob3B0aW9ucywgKmRlZmluZWRfdHlwZSk7CiAgICAgICAgIGlmIChvdXRwdXRfZmlsZV9uYW1lLmVtcHR5KCkpIHsKLSAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgIH0KIAogICAgICAgaWYgKCF3cml0ZV9kZXBfZmlsZShvcHRpb25zLCAqZGVmaW5lZF90eXBlLCBpbXBvcnRlZF9maWxlcywgaW9fZGVsZWdhdGUsIGlucHV0X2ZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9maWxlX25hbWUpKSB7Ci0gICAgICAgIHJldHVybiAxOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICB9CiAKICAgICAgIGJvb2wgc3VjY2VzcyA9IGZhbHNlOwpAQCAtODMwLDIxICs3MjgsMjEgQEAKICAgICAgICAgICAvLyBMZWdhY3kgYmVoYXZpb3IuIEZvciBwYXJjZWxhYmxlIGRlY2xhcmF0aW9ucyBpbiBKYXZhLCBkb24ndCBnZW5lcmF0ZSBvdXRwdXQgZmlsZS4KICAgICAgICAgICBzdWNjZXNzID0gdHJ1ZTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBzdWNjZXNzID0gamF2YTo6Z2VuZXJhdGVfamF2YShvdXRwdXRfZmlsZV9uYW1lLCBkZWZpbmVkX3R5cGUuZ2V0KCksIHR5cGVuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb19kZWxlZ2F0ZSwgb3B0aW9ucyk7CisgICAgICAgICAgamF2YTo6R2VuZXJhdGVKYXZhKG91dHB1dF9maWxlX25hbWUsIG9wdGlvbnMsIHR5cGVuYW1lcywgKmRlZmluZWRfdHlwZSwgaW9fZGVsZWdhdGUpOworICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOwogICAgICAgICB9CiAgICAgICB9IGVsc2UgaWYgKGxhbmcgPT0gT3B0aW9uczo6TGFuZ3VhZ2U6OlJVU1QpIHsKLSAgICAgICAgc3VjY2VzcyA9IHJ1c3Q6OkdlbmVyYXRlUnVzdChvdXRwdXRfZmlsZV9uYW1lLCBkZWZpbmVkX3R5cGUuZ2V0KCksIHR5cGVuYW1lcywgaW9fZGVsZWdhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyk7CisgICAgICAgIHJ1c3Q6OkdlbmVyYXRlUnVzdChvdXRwdXRfZmlsZV9uYW1lLCBvcHRpb25zLCB0eXBlbmFtZXMsICpkZWZpbmVkX3R5cGUsIGlvX2RlbGVnYXRlKTsKKyAgICAgICAgc3VjY2VzcyA9IHRydWU7CiAgICAgICB9IGVsc2UgewogICAgICAgICBBSURMX0ZBVEFMKGlucHV0X2ZpbGUpIDw8ICJTaG91bGQgbm90IHJlYWNoIGhlcmUuIjsKICAgICAgIH0KICAgICAgIGlmICghc3VjY2VzcykgewotICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgfQogICAgIH0KICAgfQotICByZXR1cm4gMDsKKyAgcmV0dXJuIHRydWU7CiB9CiAKIGJvb2wgZHVtcF9tYXBwaW5ncyhjb25zdCBPcHRpb25zJiBvcHRpb25zLCBjb25zdCBJb0RlbGVnYXRlJiBpb19kZWxlZ2F0ZSkgewpAQCAtODU5LDcgKzc1Nyw3IEBACiAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGZvciAoY29uc3QgYXV0byYgZGVmaW5lZF90eXBlIDogdHlwZW5hbWVzLk1haW5Eb2N1bWVudCgpLkRlZmluZWRUeXBlcygpKSB7Ci0gICAgICBhdXRvIG1hcHBpbmdzID0gbWFwcGluZ3M6OmdlbmVyYXRlX21hcHBpbmdzKGRlZmluZWRfdHlwZS5nZXQoKSwgdHlwZW5hbWVzKTsKKyAgICAgIGF1dG8gbWFwcGluZ3MgPSBtYXBwaW5nczo6Z2VuZXJhdGVfbWFwcGluZ3MoZGVmaW5lZF90eXBlLmdldCgpKTsKICAgICAgIGFsbF9tYXBwaW5ncy5pbnNlcnQobWFwcGluZ3MuYmVnaW4oKSwgbWFwcGluZ3MuZW5kKCkpOwogICAgIH0KICAgfQpAQCAtODcyLDU4ICs3NzAsNTYgQEAKICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgcHJlcHJvY2Vzc19haWRsKGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsIGNvbnN0IElvRGVsZWdhdGUmIGlvX2RlbGVnYXRlKSB7Ci0gIHVuaXF1ZV9wdHI8Q29kZVdyaXRlcj4gd3JpdGVyID0gaW9fZGVsZWdhdGUuR2V0Q29kZVdyaXRlcihvcHRpb25zLk91dHB1dEZpbGUoKSk7CitpbnQgYWlkbF9lbnRyeShjb25zdCBPcHRpb25zJiBvcHRpb25zLCBjb25zdCBJb0RlbGVnYXRlJiBpb19kZWxlZ2F0ZSkgeworICBBaWRsRXJyb3JMb2c6OmNsZWFyRXJyb3IoKTsKKyAgQWlkbE5vZGU6OkNsZWFyVW52aXNpdGVkTm9kZXMoKTsKIAotICBmb3IgKGNvbnN0IGF1dG8mIGZpbGUgOiBvcHRpb25zLklucHV0RmlsZXMoKSkgewotICAgIEFpZGxUeXBlbmFtZXMgdHlwZW5hbWVzOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxQYXJzZXI+IHAgPSBQYXJzZXI6OlBhcnNlKGZpbGUsIGlvX2RlbGVnYXRlLCB0eXBlbmFtZXMpOwotICAgIGlmIChwID09IG51bGxwdHIpIHJldHVybiBmYWxzZTsKKyAgYm9vbCBzdWNjZXNzID0gZmFsc2U7CisgIGlmIChvcHRpb25zLk9rKCkpIHsKKyAgICBzd2l0Y2ggKG9wdGlvbnMuR2V0VGFzaygpKSB7CisgICAgICBjYXNlIE9wdGlvbnM6OlRhc2s6OkhFTFA6CisgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgT3B0aW9uczo6VGFzazo6Q09NUElMRToKKyAgICAgICAgc3VjY2VzcyA9IGFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBPcHRpb25zOjpUYXNrOjpQUkVQUk9DRVNTOgorICAgICAgICBzdWNjZXNzID0gYW5kcm9pZDo6YWlkbDo6UHJlcHJvY2VzcyhvcHRpb25zLCBpb19kZWxlZ2F0ZSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBPcHRpb25zOjpUYXNrOjpEVU1QX0FQSToKKyAgICAgICAgc3VjY2VzcyA9IGFuZHJvaWQ6OmFpZGw6OmR1bXBfYXBpKG9wdGlvbnMsIGlvX2RlbGVnYXRlKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE9wdGlvbnM6OlRhc2s6OkNIRUNLX0FQSToKKyAgICAgICAgc3VjY2VzcyA9IGFuZHJvaWQ6OmFpZGw6OmNoZWNrX2FwaShvcHRpb25zLCBpb19kZWxlZ2F0ZSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBPcHRpb25zOjpUYXNrOjpEVU1QX01BUFBJTkdTOgorICAgICAgICBzdWNjZXNzID0gYW5kcm9pZDo6YWlkbDo6ZHVtcF9tYXBwaW5ncyhvcHRpb25zLCBpb19kZWxlZ2F0ZSk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgQUlETF9GQVRBTChBSURMX0xPQ0FUSU9OX0hFUkUpCisgICAgICAgICAgICA8PCAiVW5yZWNvZ25pemVkIHRhc2s6ICIgPDwgc3RhdGljX2Nhc3Q8c2l6ZV90PihvcHRpb25zLkdldFRhc2soKSk7CisgICAgfQorICB9IGVsc2UgeworICAgIEFJRExfRVJST1Iob3B0aW9ucy5HZXRFcnJvck1lc3NhZ2UoKSkgPDwgb3B0aW9ucy5HZXRVc2FnZSgpOworICB9CiAKLSAgICBmb3IgKGNvbnN0IGF1dG8mIGRlZmluZWRfdHlwZSA6IHAtPlBhcnNlZERvY3VtZW50KCkuRGVmaW5lZFR5cGVzKCkpIHsKLSAgICAgIGlmICghd3JpdGVyLT5Xcml0ZSgiJXMgJXM7XG4iLCBkZWZpbmVkX3R5cGUtPkdldFByZXByb2Nlc3NEZWNsYXJhdGlvbk5hbWUoKS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZWRfdHlwZS0+R2V0Q2Fub25pY2FsTmFtZSgpLmNfc3RyKCkpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgY29uc3QgYm9vbCByZXBvcnRlZEVycm9yID0gQWlkbEVycm9yTG9nOjpoYWRFcnJvcigpOworICBBSURMX0ZBVEFMX0lGKHN1Y2Nlc3MgPT0gcmVwb3J0ZWRFcnJvciwgQUlETF9MT0NBVElPTl9IRVJFKQorICAgICAgPDwgIkNvbXBpbGVyIHJldHVybmVkIHN1Y2Nlc3MgIiA8PCBzdWNjZXNzIDw8ICIgYnV0IGRpZCIgPDwgKHJlcG9ydGVkRXJyb3IgPyAiIiA6ICIgbm90IikKKyAgICAgIDw8ICIgZW1pdCBlcnJvciBsb2dzIjsKKworICBpZiAoc3VjY2VzcykgeworICAgIGF1dG8gbG9jYXRpb25zID0gQWlkbE5vZGU6OkdldExvY2F0aW9uc09mVW52aXNpdGVkTm9kZXMoKTsKKyAgICBpZiAoIWxvY2F0aW9ucy5lbXB0eSgpKSB7CisgICAgICBmb3IgKGNvbnN0IGF1dG8mIGxvY2F0aW9uIDogbG9jYXRpb25zKSB7CisgICAgICAgIEFJRExfRVJST1IobG9jYXRpb24pIDw8ICJBaWRsTm9kZSBhdCBsb2NhdGlvbiB3YXMgbm90IHZpc2l0ZWQhIjsKICAgICAgIH0KKyAgICAgIEFJRExfRkFUQUwoQUlETF9MT0NBVElPTl9IRVJFKQorICAgICAgICAgIDw8ICJUaGUgQUlETCBBU1Qgd2FzIG5vdCBwcm9jZXNzZWQgZnVsbHkuIFBsZWFzZSByZXBvcnQgYW4gaXNzdWUuIjsKICAgICB9CiAgIH0KIAotICByZXR1cm4gd3JpdGVyLT5DbG9zZSgpOwotfQotCi1pbnQgYWlkbF9lbnRyeShjb25zdCBPcHRpb25zJiBvcHRpb25zLCBjb25zdCBJb0RlbGVnYXRlJiBpb19kZWxlZ2F0ZSkgewotICBBaWRsRXJyb3JMb2c6OmNsZWFyRXJyb3IoKTsKLQotICBpbnQgcmV0ID0gMTsKLSAgc3dpdGNoIChvcHRpb25zLkdldFRhc2soKSkgewotICAgIGNhc2UgT3B0aW9uczo6VGFzazo6Q09NUElMRToKLSAgICAgIHJldCA9IGFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9wdGlvbnM6OlRhc2s6OlBSRVBST0NFU1M6Ci0gICAgICByZXQgPSBhbmRyb2lkOjphaWRsOjpwcmVwcm9jZXNzX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGUpID8gMCA6IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9wdGlvbnM6OlRhc2s6OkRVTVBfQVBJOgotICAgICAgcmV0ID0gYW5kcm9pZDo6YWlkbDo6ZHVtcF9hcGkob3B0aW9ucywgaW9fZGVsZWdhdGUpID8gMCA6IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9wdGlvbnM6OlRhc2s6OkNIRUNLX0FQSToKLSAgICAgIHJldCA9IGFuZHJvaWQ6OmFpZGw6OmNoZWNrX2FwaShvcHRpb25zLCBpb19kZWxlZ2F0ZSkgPyAwIDogMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT3B0aW9uczo6VGFzazo6RFVNUF9NQVBQSU5HUzoKLSAgICAgIHJldCA9IGFuZHJvaWQ6OmFpZGw6OmR1bXBfbWFwcGluZ3Mob3B0aW9ucywgaW9fZGVsZWdhdGUpID8gMCA6IDE7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgQUlETF9GQVRBTChBSURMX0xPQ0FUSU9OX0hFUkUpCi0gICAgICAgICAgPDwgIlVucmVjb2duaXplZCB0YXNrOiAiIDw8IHN0YXRpY19jYXN0PHNpemVfdD4ob3B0aW9ucy5HZXRUYXNrKCkpOwotICB9Ci0KLSAgLy8gY29tcGlsZXIgaW52YXJpYW50cwotICBjb25zdCBib29sIHNob3VsZFJlcG9ydEVycm9yID0gcmV0ICE9IDA7Ci0gIGNvbnN0IGJvb2wgcmVwb3J0ZWRFcnJvciA9IEFpZGxFcnJvckxvZzo6aGFkRXJyb3IoKTsKLSAgQUlETF9GQVRBTF9JRihzaG91bGRSZXBvcnRFcnJvciAhPSByZXBvcnRlZEVycm9yLCBBSURMX0xPQ0FUSU9OX0hFUkUpCi0gICAgICA8PCAiQ29tcGlsZXIgcmV0dXJuZWQgZXJyb3IgIiA8PCByZXQgPDwgIiBidXQgZGlkIiA8PCAocmVwb3J0ZWRFcnJvciA/ICIiIDogIiBub3QiKQotICAgICAgPDwgIiBlbWl0IGVycm9yIGxvZ3MiOwotCi0gIHJldHVybiByZXQ7CisgIHJldHVybiBzdWNjZXNzID8gMCA6IDE7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS9haWRsLmggYi9haWRsLmgKaW5kZXggMWZmOGQ0Ni4uMmQxNWMwNiAxMDA2NDQKLS0tIGEvYWlkbC5oCisrKyBiL2FpZGwuaApAQCAtNDUsOCArNDUsNyBAQAogICBPSyA9IDAsCiB9OwogCi1pbnQgY29tcGlsZV9haWRsKGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsIGNvbnN0IElvRGVsZWdhdGUmIGlvX2RlbGVnYXRlKTsKLWJvb2wgcHJlcHJvY2Vzc19haWRsKGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsIGNvbnN0IElvRGVsZWdhdGUmIGlvX2RlbGVnYXRlKTsKK2Jvb2wgY29tcGlsZV9haWRsKGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsIGNvbnN0IElvRGVsZWdhdGUmIGlvX2RlbGVnYXRlKTsKIGJvb2wgZHVtcF9tYXBwaW5ncyhjb25zdCBPcHRpb25zJiBvcHRpb25zLCBjb25zdCBJb0RlbGVnYXRlJiBpb19kZWxlZ2F0ZSk7CiAKIC8vIG1haW4gZW50cnkgcG9pbnQgdG8gQUlETApAQCAtODIsOSArODEsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW9EZWxlZ2F0ZSYgaW9fZGVsZWdhdGUsIEFpZGxUeXBlbmFtZXMqIHR5cGVuYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxzdHJpbmc+KiBpbXBvcnRlZF9maWxlcyk7CiAKLWJvb2wgcGFyc2VfcHJlcHJvY2Vzc2VkX2ZpbGUoY29uc3QgSW9EZWxlZ2F0ZSYgaW9fZGVsZWdhdGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWlkbFR5cGVuYW1lcyogdHlwZW5hbWVzKTsKLQogfSAvLyBuYW1lc3BhY2UgaW50ZXJuYWxzCiAKIH0gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS9haWRsX2FwaS9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS8xLy5oYXNoIGIvYWlkbF9hcGkvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UvMS8uaGFzaAppbmRleCAzNGQ4ZWM2Li5kZmRiMjQ5IDEwMDY0NAotLS0gYS9haWRsX2FwaS9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS8xLy5oYXNoCisrKyBiL2FpZGxfYXBpL2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLzEvLmhhc2gKQEAgLTEgKzEsMiBAQAorZjIxMWY3ODIzYzgyNzkyMjQ0MzRmNWI5YTBiMDk1YzFmNWViZmMxNQogOWU3YmUxODU5ODIwYzU5ZDlkNTVkZDEzM2U3MWEzNjg3YjVkMmU1YgpkaWZmIC0tZ2l0IGEvYWlkbF9hcGkvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UvY3VycmVudC9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0Zvby5haWRsIGIvYWlkbF9hcGkvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UvY3VycmVudC9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0Zvby5haWRsCmluZGV4IDdlNWU0ZGYuLjY4MzY0ZDggMTAwNjQ0Ci0tLSBhL2FpZGxfYXBpL2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlL2N1cnJlbnQvYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9Gb28uYWlkbAorKysgYi9haWRsX2FwaS9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS9jdXJyZW50L2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvRm9vLmFpZGwKQEAgLTE5LDUgKzE5LDUgQEAKIHBhY2thZ2UgYW5kcm9pZC5haWRsLnZlcnNpb25lZC50ZXN0czsKIEBKYXZhU3VwcHJlc3NMaW50KHZhbHVlPXsiTmV3QXBpIn0pCiBwYXJjZWxhYmxlIEZvbyB7Ci0gIGludCBpbnREZWZhdWx0NDIgPSA0MjsKKyAgICBpbnQgaW50RGVmYXVsdDQyID0gNDI7CiB9CmRpZmYgLS1naXQgYS9haWRsX2FwaS9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS9jdXJyZW50L2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvSUZvb0ludGVyZmFjZS5haWRsIGIvYWlkbF9hcGkvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UvY3VycmVudC9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0lGb29JbnRlcmZhY2UuYWlkbAppbmRleCAwMWRmMzEwLi42MDJjODkyIDEwMDY0NAotLS0gYS9haWRsX2FwaS9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS9jdXJyZW50L2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvSUZvb0ludGVyZmFjZS5haWRsCisrKyBiL2FpZGxfYXBpL2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlL2N1cnJlbnQvYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9JRm9vSW50ZXJmYWNlLmFpZGwKQEAgLTE3LDEwICsxNywxNSBAQAogLy8gbGF0ZXIgd2hlbiBhIG1vZHVsZSB1c2luZyB0aGUgaW50ZXJmYWNlIGlzIHVwZGF0ZWQsIGUuZy4sIE1haW5saW5lIG1vZHVsZXMuCiAKIHBhY2thZ2UgYW5kcm9pZC5haWRsLnZlcnNpb25lZC50ZXN0czsKK0BKYXZhRGVsZWdhdG9yCiBpbnRlcmZhY2UgSUZvb0ludGVyZmFjZSB7Ci0gIHZvaWQgb3JpZ2luYWxBcGkoKTsKLSAgQHV0ZjhJbkNwcCBTdHJpbmcgYWNjZXB0VW5pb25BbmRSZXR1cm5TdHJpbmcoaW4gYW5kcm9pZC5haWRsLnZlcnNpb25lZC50ZXN0cy5CYXpVbmlvbiB1KTsKLSAgQFN1cHByZXNzV2FybmluZ3ModmFsdWU9eyJpbm91dC1wYXJhbWV0ZXIifSkgaW50IGlnbm9yZVBhcmNlbGFibGVzQW5kUmVwZWF0SW50KGluIGFuZHJvaWQuYWlkbC52ZXJzaW9uZWQudGVzdHMuRm9vIGluRm9vLCBpbm91dCBhbmRyb2lkLmFpZGwudmVyc2lvbmVkLnRlc3RzLkZvbyBpbm91dEZvbywgb3V0IGFuZHJvaWQuYWlkbC52ZXJzaW9uZWQudGVzdHMuRm9vIG91dEZvbywgaW50IHZhbHVlKTsKLSAgaW50IHJldHVybnNMZW5ndGhPZkZvb0FycmF5KGluIGFuZHJvaWQuYWlkbC52ZXJzaW9uZWQudGVzdHMuRm9vW10gZm9vcyk7Ci0gIHZvaWQgbmV3QXBpKCk7CisgICAgdm9pZCBvcmlnaW5hbEFwaSgpOworICAgIEB1dGY4SW5DcHAgU3RyaW5nIGFjY2VwdFVuaW9uQW5kUmV0dXJuU3RyaW5nKAorICAgICAgICAgICAgaW4gYW5kcm9pZC5haWRsLnZlcnNpb25lZC50ZXN0cy5CYXpVbmlvbiB1KTsKKyAgICBAU3VwcHJlc3NXYXJuaW5ncyh2YWx1ZT17Imlub3V0LXBhcmFtZXRlciJ9KQorICAgIGludCBpZ25vcmVQYXJjZWxhYmxlc0FuZFJlcGVhdEludChpbiBhbmRyb2lkLmFpZGwudmVyc2lvbmVkLnRlc3RzLkZvbyBpbkZvbywKKyAgICAgICAgICAgIGlub3V0IGFuZHJvaWQuYWlkbC52ZXJzaW9uZWQudGVzdHMuRm9vIGlub3V0Rm9vLAorICAgICAgICAgICAgb3V0IGFuZHJvaWQuYWlkbC52ZXJzaW9uZWQudGVzdHMuRm9vIG91dEZvbywgaW50IHZhbHVlKTsKKyAgICBpbnQgcmV0dXJuc0xlbmd0aE9mRm9vQXJyYXkoaW4gYW5kcm9pZC5haWRsLnZlcnNpb25lZC50ZXN0cy5Gb29bXSBmb29zKTsKKyAgICB2b2lkIG5ld0FwaSgpOwogfQpkaWZmIC0tZ2l0IGEvYWlkbF9jaGVja2FwaS5jcHAgYi9haWRsX2NoZWNrYXBpLmNwcAppbmRleCA4ZTE4Mzc0Li5jMWQzYzY2IDEwMDY0NAotLS0gYS9haWRsX2NoZWNrYXBpLmNwcAorKysgYi9haWRsX2NoZWNrYXBpLmNwcApAQCAtNDEsMTggKzQxLDEwIEBACiB1c2luZyBzdGQ6OnN0cmluZzsKIHVzaW5nIHN0ZDo6dmVjdG9yOwogCi1zdHJ1Y3QgRHVtcEZvckVxdWFsaXR5VmlzaXRvciA6IER1bXBWaXNpdG9yIHsKLSAgRHVtcEZvckVxdWFsaXR5VmlzaXRvcihDb2RlV3JpdGVyJiBvdXQpIDogRHVtcFZpc2l0b3Iob3V0KSB7fQotCi0gIHZvaWQgRHVtcENvbnN0YW50VmFsdWUoY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImLCBjb25zdCBBaWRsQ29uc3RhbnRWYWx1ZSYgYykgewotICAgIG91dCA8PCBjLkxpdGVyYWwoKTsKLSAgfQotfTsKLQogc3RhdGljIHN0ZDo6c3RyaW5nIER1bXAoY29uc3QgQWlkbERlZmluZWRUeXBlJiB0eXBlKSB7CiAgIHN0cmluZyBjb2RlOwogICBDb2RlV3JpdGVyUHRyIG91dCA9IENvZGVXcml0ZXI6OkZvclN0cmluZygmY29kZSk7Ci0gIER1bXBGb3JFcXVhbGl0eVZpc2l0b3IgdmlzaXRvcigqb3V0KTsKKyAgRHVtcFZpc2l0b3IgdmlzaXRvcigqb3V0KTsKICAgdHlwZS5EaXNwYXRjaFZpc2l0KHZpc2l0b3IpOwogICBvdXQtPkNsb3NlKCk7CiAgIHJldHVybiBjb2RlOwpAQCAtODcsNiArNzksNyBAQAogICAgICAgLy8gQEphdmFEZXJpdmUgZG9lc24ndCBhZmZlY3QgcmVhZC93cml0ZQogICAgICAgQWlkbEFubm90YXRpb246OlR5cGU6OkpBVkFfREVSSVZFLAogICAgICAgQWlkbEFubm90YXRpb246OlR5cGU6OkpBVkFfREVGQVVMVCwKKyAgICAgIEFpZGxBbm5vdGF0aW9uOjpUeXBlOjpKQVZBX0RFTEVHQVRPUiwKICAgICAgIEFpZGxBbm5vdGF0aW9uOjpUeXBlOjpKQVZBX09OTFlfSU1NVVRBQkxFLAogICAgICAgQWlkbEFubm90YXRpb246OlR5cGU6OkpBVkFfU1VQUFJFU1NfTElOVCwKICAgICAgIC8vIEBCYWNraW5nIGZvciBhIGVudW0gdHlwZSBpcyBjaGVja2VkIGJ5IHRoZSBlbnVtIGNoZWNrZXIKQEAgLTk2LDExICs4OSwxMSBAQAogICAgICAgQWlkbEFubm90YXRpb246OlR5cGU6OlNVUFBSRVNTX1dBUk5JTkdTLAogICB9OwogICB2ZWN0b3I8c3RyaW5nPiBhbm5vdGF0aW9uczsKLSAgZm9yIChjb25zdCBBaWRsQW5ub3RhdGlvbiYgYW5ub3RhdGlvbiA6IG5vZGUuR2V0QW5ub3RhdGlvbnMoKSkgewotICAgIGlmIChrSWdub3JlQW5ub3RhdGlvbnMuZmluZChhbm5vdGF0aW9uLkdldFR5cGUoKSkgIT0ga0lnbm9yZUFubm90YXRpb25zLmVuZCgpKSB7CisgIGZvciAoY29uc3QgYXV0byYgYW5ub3RhdGlvbiA6IG5vZGUuR2V0QW5ub3RhdGlvbnMoKSkgeworICAgIGlmIChrSWdub3JlQW5ub3RhdGlvbnMuZmluZChhbm5vdGF0aW9uLT5HZXRUeXBlKCkpICE9IGtJZ25vcmVBbm5vdGF0aW9ucy5lbmQoKSkgewogICAgICAgY29udGludWU7CiAgICAgfQotICAgIGF1dG8gYW5ub3RhdGlvbl9zdHJpbmcgPSBhbm5vdGF0aW9uLlRvU3RyaW5nKCk7CisgICAgYXV0byBhbm5vdGF0aW9uX3N0cmluZyA9IGFubm90YXRpb24tPlRvU3RyaW5nKCk7CiAgICAgLy8gYWRkaW5nIEBEZXByZWNhdGVkICh3aXRoIG9wdGlvbmFsIGFyZ3MpIGlzIG9rYXkKICAgICBpZiAoU3RhcnRzV2l0aChhbm5vdGF0aW9uX3N0cmluZywgIkBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj1cIkBEZXByZWNhdGVkIikpIHsKICAgICAgIGNvbnRpbnVlOwpAQCAtMTU2LDggKzE0OSw4IEBACiAgICAgY29uc3QgYXV0byBuZXdfYyA9IGZvdW5kLT5zZWNvbmQ7CiAgICAgY29tcGF0aWJsZSAmPSBhcmVfY29tcGF0aWJsZV90eXBlcyhvbGRfYy0+R2V0VHlwZSgpLCBuZXdfYy0+R2V0VHlwZSgpKTsKIAotICAgIGNvbnN0IHN0cmluZyBvbGRfdmFsdWUgPSBvbGRfYy0+R2V0VmFsdWUoKS5MaXRlcmFsKCk7Ci0gICAgY29uc3Qgc3RyaW5nIG5ld192YWx1ZSA9IG5ld19jLT5HZXRWYWx1ZSgpLkxpdGVyYWwoKTsKKyAgICBjb25zdCBzdHJpbmcgb2xkX3ZhbHVlID0gb2xkX2MtPlZhbHVlU3RyaW5nKEFpZGxDb25zdGFudFZhbHVlRGVjb3JhdG9yKTsKKyAgICBjb25zdCBzdHJpbmcgbmV3X3ZhbHVlID0gbmV3X2MtPlZhbHVlU3RyaW5nKEFpZGxDb25zdGFudFZhbHVlRGVjb3JhdG9yKTsKICAgICBpZiAob2xkX3ZhbHVlICE9IG5ld192YWx1ZSkgewogICAgICAgQUlETF9FUlJPUihuZXdlcikgPDwgIkNoYW5nZWQgY29uc3RhbnQgdmFsdWU6ICIgPDwgb2xkZXIuR2V0Q2Fub25pY2FsTmFtZSgpIDw8ICIuIgogICAgICAgICAgICAgICAgICAgICAgICAgPDwgb2xkX2MtPkdldE5hbWUoKSA8PCAiIGZyb20gIiA8PCBvbGRfdmFsdWUgPDwgIiB0byAiIDw8IG5ld192YWx1ZSA8PCAiLiI7CkBAIC0yMjksMjEgKzIyMiwxNCBAQAogc3RhdGljIGJvb2wgSGFzWmVyb0VudW1lcmF0b3IoY29uc3QgQWlkbEVudW1EZWNsYXJhdGlvbiYgZW51bV9kZWNsKSB7CiAgIHJldHVybiBzdGQ6OmFueV9vZihlbnVtX2RlY2wuR2V0RW51bWVyYXRvcnMoKS5iZWdpbigpLCBlbnVtX2RlY2wuR2V0RW51bWVyYXRvcnMoKS5lbmQoKSwKICAgICAgICAgICAgICAgICAgICAgIFsmXShjb25zdCB1bmlxdWVfcHRyPEFpZGxFbnVtZXJhdG9yPiYgZW51bWVyYXRvcikgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW51bWVyYXRvci0+R2V0VmFsdWUoKS0+TGl0ZXJhbCgpID09ICIwIjsKKyAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudW1lcmF0b3ItPkdldFZhbHVlKCktPlZhbHVlU3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1fZGVjbC5HZXRCYWNraW5nVHlwZSgpLCBBaWRsQ29uc3RhbnRWYWx1ZURlY29yYXRvcikgPT0gIjAiOwogICAgICAgICAgICAgICAgICAgICAgfSk7CiB9CiAKLXN0YXRpYyBib29sIEV2YWx1YXRlc1RvWmVybyhjb25zdCBBaWRsRW51bURlY2xhcmF0aW9uJiBlbnVtX2RlY2wsIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgewotICBpZiAodmFsdWUgPT0gIiIpIHJldHVybiB0cnVlOwotICAvLyBCZWNhdXNlIC0tY2hlY2tfYXBpIHJ1bnMgd2l0aCAidmFsaWQiIEFJREwgZGVmaW5pdGlvbnMsIHdlIGNhbiBzYWZlbHkgYXNzdW1lIHRoYXQKLSAgLy8gdGhlIHZhbHVlIGlzIGZvcm1hdHRlZCBhcyA8c2NvcGU+LjxlbnVtZXJhdG9yPi4KLSAgYXV0byBlbnVtZXJhdG9yX25hbWUgPSB2YWx1ZS5zdWJzdHIodmFsdWUuZmluZF9sYXN0X29mKCcuJykgKyAxKTsKLSAgZm9yIChjb25zdCBhdXRvJiBlbnVtZXJhdG9yIDogZW51bV9kZWNsLkdldEVudW1lcmF0b3JzKCkpIHsKLSAgICBpZiAoZW51bWVyYXRvci0+R2V0TmFtZSgpID09IGVudW1lcmF0b3JfbmFtZSkgewotICAgICAgcmV0dXJuIGVudW1lcmF0b3ItPkdldFZhbHVlKCktPkxpdGVyYWwoKSA9PSAiMCI7Ci0gICAgfQotICB9Ci0gIEFJRExfRkFUQUwoZW51bV9kZWNsKSA8PCAiQ2FuJ3QgZmluZCAiIDw8IGVudW1lcmF0b3JfbmFtZSA8PCAiIGluICIgPDwgZW51bV9kZWNsLkdldE5hbWUoKTsKK3N0YXRpYyBib29sIEV2YWx1YXRlc1RvWmVybyhjb25zdCBBaWRsRW51bURlY2xhcmF0aW9uJiBlbnVtX2RlY2wsIGNvbnN0IEFpZGxDb25zdGFudFZhbHVlKiB2YWx1ZSkgeworICBpZiAodmFsdWUgPT0gbnVsbHB0cikgcmV0dXJuIHRydWU7CisgIHJldHVybiB2YWx1ZS0+VmFsdWVTdHJpbmcoZW51bV9kZWNsLkdldEJhY2tpbmdUeXBlKCksIEFpZGxDb25zdGFudFZhbHVlRGVjb3JhdG9yKSA9PSAiMCI7CiB9CiAKIHN0YXRpYyBib29sIGFyZV9jb21wYXRpYmxlX3BhcmNlbGFibGVzKGNvbnN0IEFpZGxEZWZpbmVkVHlwZSYgb2xkZXIsIGNvbnN0IEFpZGxUeXBlbmFtZXMmLApAQCAtMjc5LDE1ICsyNjUsMTQgQEAKICAgICBjb25zdCBhdXRvJiBuZXdfZmllbGQgPSBuZXdfZmllbGRzLmF0KGkpOwogICAgIGNvbXBhdGlibGUgJj0gYXJlX2NvbXBhdGlibGVfdHlwZXMob2xkX2ZpZWxkLT5HZXRUeXBlKCksIG5ld19maWVsZC0+R2V0VHlwZSgpKTsKIAotICAgIHN0cmluZyBvbGRfdmFsdWUgPSBvbGRfZmllbGQtPkdldERlZmF1bHRWYWx1ZSgpID8gb2xkX2ZpZWxkLT5HZXREZWZhdWx0VmFsdWUoKS0+TGl0ZXJhbCgpIDogIiI7Ci0gICAgc3RyaW5nIG5ld192YWx1ZSA9IG5ld19maWVsZC0+R2V0RGVmYXVsdFZhbHVlKCkgPyBuZXdfZmllbGQtPkdldERlZmF1bHRWYWx1ZSgpLT5MaXRlcmFsKCkgOiAiIjsKLQorICAgIGNvbnN0IHN0cmluZyBvbGRfdmFsdWUgPSBvbGRfZmllbGQtPlZhbHVlU3RyaW5nKEFpZGxDb25zdGFudFZhbHVlRGVjb3JhdG9yKTsKKyAgICBjb25zdCBzdHJpbmcgbmV3X3ZhbHVlID0gbmV3X2ZpZWxkLT5WYWx1ZVN0cmluZyhBaWRsQ29uc3RhbnRWYWx1ZURlY29yYXRvcik7CiAgICAgaWYgKG9sZF92YWx1ZSA9PSBuZXdfdmFsdWUpIHsKICAgICAgIGNvbnRpbnVlOwogICAgIH0KICAgICAvLyBGb3IgZW51bSB0eXBlIGZpZWxkcywgd2UgYWNjZXB0IHNldHRpbmcgZXhwbGljaXQgZGVmYXVsdCB2YWx1ZSB3aGljaCBpcyAiemVybyIKICAgICBhdXRvIGVudW1fZGVjbCA9IG5ld190eXBlcy5HZXRFbnVtRGVjbGFyYXRpb24obmV3X2ZpZWxkLT5HZXRUeXBlKCkpOwotICAgIGlmIChvbGRfdmFsdWUgPT0gIiIgJiYgZW51bV9kZWNsICYmIEV2YWx1YXRlc1RvWmVybygqZW51bV9kZWNsLCBuZXdfdmFsdWUpKSB7CisgICAgaWYgKG9sZF92YWx1ZSA9PSAiIiAmJiBlbnVtX2RlY2wgJiYgRXZhbHVhdGVzVG9aZXJvKCplbnVtX2RlY2wsIG5ld19maWVsZC0+R2V0RGVmYXVsdFZhbHVlKCkpKSB7CiAgICAgICBjb250aW51ZTsKICAgICB9CiAKQEAgLTM5Miw4ICszNzcsMTAgQEAKICAgICAgIGNvbXBhdGlibGUgPSBmYWxzZTsKICAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICBjb25zdCBzdHJpbmcgb2xkX3ZhbHVlID0gb2xkX2VudW1fbWFwW25hbWVdLT5MaXRlcmFsKCk7Ci0gICAgY29uc3Qgc3RyaW5nIG5ld192YWx1ZSA9IG5ld19lbnVtX21hcFtuYW1lXS0+TGl0ZXJhbCgpOworICAgIGNvbnN0IHN0cmluZyBvbGRfdmFsdWUgPQorICAgICAgICBvbGRfZW51bV9tYXBbbmFtZV0tPlZhbHVlU3RyaW5nKG9sZGVyLkdldEJhY2tpbmdUeXBlKCksIEFpZGxDb25zdGFudFZhbHVlRGVjb3JhdG9yKTsKKyAgICBjb25zdCBzdHJpbmcgbmV3X3ZhbHVlID0KKyAgICAgICAgbmV3X2VudW1fbWFwW25hbWVdLT5WYWx1ZVN0cmluZyhuZXdlci5HZXRCYWNraW5nVHlwZSgpLCBBaWRsQ29uc3RhbnRWYWx1ZURlY29yYXRvcik7CiAgICAgaWYgKG9sZF92YWx1ZSAhPSBuZXdfdmFsdWUpIHsKICAgICAgIEFJRExfRVJST1IobmV3ZXIpIDw8ICJDaGFuZ2VkIGVudW1lcmF0b3IgdmFsdWU6ICIgPDwgb2xkZXIuR2V0Q2Fub25pY2FsTmFtZSgpIDw8ICI6OiIgPDwgbmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBmcm9tICIgPDwgb2xkX3ZhbHVlIDw8ICIgdG8gIiA8PCBuZXdfdmFsdWUgPDwgIi4iOwpAQCAtNDAzLDggKzM5MCw4IEBACiAgIHJldHVybiBjb21wYXRpYmxlOwogfQogCi1zdGF0aWMgUmVzdWx0PEFpZGxUeXBlbmFtZXM+IGxvYWRfZnJvbV9kaXIoY29uc3QgT3B0aW9ucyYgb3B0aW9ucywgY29uc3QgSW9EZWxlZ2F0ZSYgaW9fZGVsZWdhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRpcikgeworc3RhdGljIFJlc3VsdDxBaWRsVHlwZW5hbWVzPiBMb2FkQXBpRHVtcChjb25zdCBPcHRpb25zJiBvcHRpb25zLCBjb25zdCBJb0RlbGVnYXRlJiBpb19kZWxlZ2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRpcikgewogICBSZXN1bHQ8c3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+PiBkaXJfZmlsZXMgPSBpb19kZWxlZ2F0ZS5MaXN0RmlsZXMoZGlyKTsKICAgaWYgKCFkaXJfZmlsZXMub2soKSkgewogICAgIEFJRExfRVJST1IoZGlyKSA8PCBkaXJfZmlsZXMuZXJyb3IoKTsKQEAgLTQxNCw3ICs0MDEsOSBAQAogICBBaWRsVHlwZW5hbWVzIHR5cGVuYW1lczsKICAgZm9yIChjb25zdCBhdXRvJiBmaWxlIDogKmRpcl9maWxlcykgewogICAgIGlmICghYW5kcm9pZDo6YmFzZTo6RW5kc1dpdGgoZmlsZSwgIi5haWRsIikpIGNvbnRpbnVlOwotICAgIGlmIChpbnRlcm5hbHM6OmxvYWRfYW5kX3ZhbGlkYXRlX2FpZGwoZmlsZSwgb3B0aW9ucywgaW9fZGVsZWdhdGUsICZ0eXBlbmFtZXMsCisgICAgLy8gY3VycmVudCAiZGlyIiBpcyBhZGRlZCB0byAiaW1wb3J0cyIgc28gdGhhdCByZWZlcmVuY2VkLmFpZGwgZmlsZXMgaW4gdGhlIGN1cnJlbnQKKyAgICAvLyBtb2R1bGUgYXJlIGF2YWlsYWJsZSB3aGVuIHJlc29sdmluZyByZWZlcmVuY2VzLgorICAgIGlmIChpbnRlcm5hbHM6OmxvYWRfYW5kX3ZhbGlkYXRlX2FpZGwoZmlsZSwgb3B0aW9ucy5QbHVzSW1wb3J0RGlyKGRpciksIGlvX2RlbGVnYXRlLCAmdHlwZW5hbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciAvKiBpbXBvcnRlZF9maWxlcyAqLykgIT0gQWlkbEVycm9yOjpPSykgewogICAgICAgQUlETF9FUlJPUihmaWxlKSA8PCAiRmFpbGVkIHRvIHJlYWQuIjsKICAgICAgIHJldHVybiBFcnJvcigpOwpAQCAtNDI5LDE5ICs0MTgsMzEgQEAKICAgQUlETF9GQVRBTF9JRihvcHRpb25zLklucHV0RmlsZXMoKS5zaXplKCkgIT0gMiwgQUlETF9MT0NBVElPTl9IRVJFKQogICAgICAgPDwgIi0tY2hlY2thcGkgcmVxdWlyZXMgdHdvIGlucHV0cyAiCiAgICAgICA8PCAiYnV0IGdvdCAiIDw8IG9wdGlvbnMuSW5wdXRGaWxlcygpLnNpemUoKTsKLSAgYXV0byBvbGRfdG5zID0gbG9hZF9mcm9tX2RpcihvcHRpb25zLCBpb19kZWxlZ2F0ZSwgb3B0aW9ucy5JbnB1dEZpbGVzKCkuYXQoMCkpOworICBhdXRvIG9sZF90bnMgPSBMb2FkQXBpRHVtcChvcHRpb25zLCBpb19kZWxlZ2F0ZSwgb3B0aW9ucy5JbnB1dEZpbGVzKCkuYXQoMCkpOwogICBpZiAoIW9sZF90bnMub2soKSkgewogICAgIHJldHVybiBmYWxzZTsKICAgfQotICBhdXRvIG5ld190bnMgPSBsb2FkX2Zyb21fZGlyKG9wdGlvbnMsIGlvX2RlbGVnYXRlLCBvcHRpb25zLklucHV0RmlsZXMoKS5hdCgxKSk7CisgIGF1dG8gbmV3X3RucyA9IExvYWRBcGlEdW1wKG9wdGlvbnMsIGlvX2RlbGVnYXRlLCBvcHRpb25zLklucHV0RmlsZXMoKS5hdCgxKSk7CiAgIGlmICghbmV3X3Rucy5vaygpKSB7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKICAgY29uc3QgT3B0aW9uczo6Q2hlY2tBcGlMZXZlbCBsZXZlbCA9IG9wdGlvbnMuR2V0Q2hlY2tBcGlMZXZlbCgpOwogCi0gIHN0ZDo6dmVjdG9yPEFpZGxEZWZpbmVkVHlwZSo+IG9sZF90eXBlcyA9IG9sZF90bnMtPkFsbERlZmluZWRUeXBlcygpOwotICBzdGQ6OnZlY3RvcjxBaWRsRGVmaW5lZFR5cGUqPiBuZXdfdHlwZXMgPSBuZXdfdG5zLT5BbGxEZWZpbmVkVHlwZXMoKTsKKyAgLy8gV2UgZG9uJ3QgY2hlY2sgaW1wb3RlZCB0eXBlcy4KKyAgYXV0byBnZXRfdHlwZXNfaW4gPSBbXShjb25zdCBBaWRsVHlwZW5hbWVzJiB0bnMsIGNvbnN0IHN0ZDo6c3RyaW5nJiBsb2NhdGlvbikgeworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IEFpZGxEZWZpbmVkVHlwZSo+IHR5cGVzOworICAgIGZvciAoY29uc3QgYXV0byYgdHlwZSA6IHRucy5BbGxEZWZpbmVkVHlwZXMoKSkgeworICAgICAgaWYgKFN0YXJ0c1dpdGgodHlwZS0+R2V0TG9jYXRpb24oKS5HZXRGaWxlKCksIGxvY2F0aW9uKSkgeworICAgICAgICB0eXBlcy5wdXNoX2JhY2sodHlwZSk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiB0eXBlczsKKyAgfTsKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgQWlkbERlZmluZWRUeXBlKj4gb2xkX3R5cGVzID0KKyAgICAgIGdldF90eXBlc19pbigqb2xkX3Rucywgb3B0aW9ucy5JbnB1dEZpbGVzKCkuYXQoMCkpOworICBzdGQ6OnZlY3Rvcjxjb25zdCBBaWRsRGVmaW5lZFR5cGUqPiBuZXdfdHlwZXMgPQorICAgICAgZ2V0X3R5cGVzX2luKCpuZXdfdG5zLCBvcHRpb25zLklucHV0RmlsZXMoKS5hdCgxKSk7CiAKICAgYm9vbCBjb21wYXRpYmxlID0gdHJ1ZTsKIApAQCAtNDYwLDcgKzQ2MSw3IEBACiAgICAgfQogICB9CiAKLSAgbWFwPHN0cmluZywgQWlkbERlZmluZWRUeXBlKj4gbmV3X21hcDsKKyAgbWFwPHN0cmluZywgY29uc3QgQWlkbERlZmluZWRUeXBlKj4gbmV3X21hcDsKICAgZm9yIChjb25zdCBhdXRvIHQgOiBuZXdfdHlwZXMpIHsKICAgICBuZXdfbWFwLmVtcGxhY2UodC0+R2V0Q2Fub25pY2FsTmFtZSgpLCB0KTsKICAgfQpkaWZmIC0tZ2l0IGEvYWlkbF9jb25zdF9leHByZXNzaW9ucy5jcHAgYi9haWRsX2NvbnN0X2V4cHJlc3Npb25zLmNwcAppbmRleCBiOWI2MmVhLi5hZmFiM2EyIDEwMDY0NAotLS0gYS9haWRsX2NvbnN0X2V4cHJlc3Npb25zLmNwcAorKysgYi9haWRsX2NvbnN0X2V4cHJlc3Npb25zLmNwcApAQCAtODksMTQgKzg5LDE0IEBACiAgICAgICBtT3ZlcmZsb3dlZCA9IHRydWU7CiAgICAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgcmV0dXJuIG1WYWx1ZSAvIG87CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFQ+KG1WYWx1ZSAvIG8pOwogICB9CiAgIFQgb3BlcmF0b3IlKFQgbykgewogICAgIGlmIChvID09IDAgfHwgKGlzTWluKCkgJiYgbyA9PSAtMSkpIHsKICAgICAgIG1PdmVyZmxvd2VkID0gdHJ1ZTsKICAgICAgIHJldHVybiAwOwogICAgIH0KLSAgICByZXR1cm4gbVZhbHVlICUgbzsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VD4obVZhbHVlICUgbyk7CiAgIH0KICAgVCBvcGVyYXRvcnwoVCBvKSB7IHJldHVybiBtVmFsdWUgfCBvOyB9CiAgIFQgb3BlcmF0b3JeKFQgbykgeyByZXR1cm4gbVZhbHVlIF4gbzsgfQpAQCAtMTEyLDE0ICsxMTIsMTQgQEAKICAgICAgIG1PdmVyZmxvd2VkID0gdHJ1ZTsKICAgICAgIHJldHVybiAwOwogICAgIH0KLSAgICByZXR1cm4gbVZhbHVlID4+IG87CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFQ+KG1WYWx1ZSA+PiBvKTsKICAgfQogICBUIG9wZXJhdG9yPDwoVCBvKSB7CiAgICAgaWYgKG8gPCAwIHx8IG1WYWx1ZSA8IDAgfHwgbyA+IENMWihtVmFsdWUpIHx8IG8gPj0gc3RhdGljX2Nhc3Q8VD4oc2l6ZW9mKFQpICogOCkpIHsKICAgICAgIG1PdmVyZmxvd2VkID0gdHJ1ZTsKICAgICAgIHJldHVybiAwOwogICAgIH0KLSAgICByZXR1cm4gbVZhbHVlIDw8IG87CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFQ+KG1WYWx1ZSA8PCBvKTsKICAgfQogICBUIG9wZXJhdG9yfHwoVCBvKSB7IHJldHVybiBtVmFsdWUgfHwgbzsgfQogICBUIG9wZXJhdG9yJiYoVCBvKSB7IHJldHVybiBtVmFsdWUgJiYgbzsgfQpAQCAtMjQyLDYgKzI0Miw1NSBAQAogICByZXR1cm4gZmFsc2U7CiB9CiAKK3N0YXRpYyBib29sIGlzVmFsaWRMaXRlcmFsQ2hhcihjaGFyIGMpIHsKKyAgcmV0dXJuICEoYyA8PSAweDFmIHx8ICAvLyBjb250cm9sIGNoYXJhY3RlcnMgYXJlIDwgMHgyMAorICAgICAgICAgICBjID49IDB4N2YgfHwgIC8vIERFTCBpcyAweDdmCisgICAgICAgICAgIGMgPT0gJ1xcJyk7ICAgLy8gRGlzYWxsb3cgYmFja3NsYXNoZXMgZm9yIGZ1dHVyZSBwcm9vZmluZy4KK30KKworc3RhdGljIHN0ZDo6c3RyaW5nIFByaW50Q2hhckxpdGVyYWwoY2hhciBjKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvczsKKyAgc3dpdGNoIChjKSB7CisgICAgY2FzZSAnXDAnOgorICAgICAgb3MgPDwgIlxcMCI7CisgICAgICBicmVhazsKKyAgICBjYXNlICdcJyc6CisgICAgICBvcyA8PCAiXFwnIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ1xcJzoKKyAgICAgIG9zIDw8ICJcXFxcIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ1xhJzoKKyAgICAgIG9zIDw8ICJcXGEiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnXGInOgorICAgICAgb3MgPDwgIlxcYiI7CisgICAgICBicmVhazsKKyAgICBjYXNlICdcZic6CisgICAgICBvcyA8PCAiXFxmIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ1xuJzoKKyAgICAgIG9zIDw8ICJcXG4iOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnXHInOgorICAgICAgb3MgPDwgIlxcciI7CisgICAgICBicmVhazsKKyAgICBjYXNlICdcdCc6CisgICAgICBvcyA8PCAiXFx0IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ1x2JzoKKyAgICAgIG9zIDw8ICJcXHYiOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGlmIChzdGQ6OmlzcHJpbnQoc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oYykpKSB7CisgICAgICAgIG9zIDw8IGM7CisgICAgICB9IGVsc2UgeworICAgICAgICBvcyA8PCAiXFx4IiA8PCBzdGQ6OmhleCA8PCBzdGQ6OnVwcGVyY2FzZSA8PCBzdGF0aWNfY2FzdDxpbnQ+KGMpOworICAgICAgfQorICB9CisgIHJldHVybiBvcy5zdHIoKTsKK30KKwogYm9vbCBQYXJzZUZsb2F0aW5nKHN0ZDo6c3RyaW5nX3ZpZXcgc3YsIGRvdWJsZSogcGFyc2VkKSB7CiAgIC8vIGZsb2F0IGxpdGVyYWwgc2hvdWxkIGJlIHBhcnNlZCBzdWNjZXNzZnVsbHkuCiAgIGFuZHJvaWQ6OmJhc2U6OkNvbnN1bWVTdWZmaXgoJnN2LCAiZiIpOwpAQCAtMjczLDYgKzMyMiwxMSBAQAogCiBib29sIEFpZGxCaW5hcnlDb25zdEV4cHJlc3Npb246OkFyZUNvbXBhdGlibGVUeXBlcyhUeXBlIHQxLCBUeXBlIHQyKSB7CiAgIHN3aXRjaCAodDEpIHsKKyAgICBjYXNlIFR5cGU6OkFSUkFZOgorICAgICAgaWYgKHQyID09IFR5cGU6OkFSUkFZKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgICAgYnJlYWs7CiAgICAgY2FzZSBUeXBlOjpTVFJJTkc6CiAgICAgICBpZiAodDIgPT0gVHlwZTo6U1RSSU5HKSB7CiAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtMzUzLDYgKzQwNywxOSBAQAogCiBBaWRsQ29uc3RhbnRWYWx1ZSogQWlkbENvbnN0YW50VmFsdWU6OkNoYXJhY3Rlcihjb25zdCBBaWRsTG9jYXRpb24mIGxvY2F0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIHN0YXRpYyBjb25zdCBjaGFyKiBrWmVyb1N0cmluZyA9ICInXFwwJyI7CisKKyAgLy8gV2Ugc2hvdWxkIGhhdmUgYmV0dGVyIHN1cHBvcnRzIGZvciBlc2NhcGVzIGluIHRoZSBmdXR1cmUsIGJ1dCBmb3Igbm93CisgIC8vIGFsbG93IG9ubHkgd2hhdCBpcyBuZWVkZWQgZm9yIGRlZmF1bHRzLgorICBpZiAodmFsdWUgIT0ga1plcm9TdHJpbmcpIHsKKyAgICBBSURMX0ZBVEFMX0lGKHZhbHVlLnNpemUoKSAhPSAzIHx8IHZhbHVlWzBdICE9ICdcJycgfHwgdmFsdWVbMl0gIT0gJ1wnJywgbG9jYXRpb24pIDw8IHZhbHVlOworCisgICAgaWYgKCFpc1ZhbGlkTGl0ZXJhbENoYXIodmFsdWVbMV0pKSB7CisgICAgICBBSURMX0VSUk9SKGxvY2F0aW9uKSA8PCAiSW52YWxpZCBjaGFyYWN0ZXIgbGl0ZXJhbCAiIDw8IFByaW50Q2hhckxpdGVyYWwodmFsdWVbMV0pOworICAgICAgcmV0dXJuIG5ldyBBaWRsQ29uc3RhbnRWYWx1ZShsb2NhdGlvbiwgVHlwZTo6RVJST1IsIHZhbHVlKTsKKyAgICB9CisgIH0KKwogICByZXR1cm4gbmV3IEFpZGxDb25zdGFudFZhbHVlKGxvY2F0aW9uLCBUeXBlOjpDSEFSQUNURVIsIHZhbHVlKTsKIH0KIApAQCAtMzcxLDggKzQzOCwxNSBAQAogICAgIHJldHVybiBmYWxzZTsKICAgfQogCi0gIGNvbnN0IGJvb2wgaXNMb25nID0gRW5kc1dpdGgodmFsdWUsICdsJykgfHwgRW5kc1dpdGgodmFsdWUsICdMJyk7Ci0gIGNvbnN0IHN0ZDo6c3RyaW5nIHZhbHVlX3N1YnN0ciA9IGlzTG9uZyA/IHZhbHVlLnN1YnN0cigwLCB2YWx1ZS5zaXplKCkgLSAxKSA6IHZhbHVlOworICBzdGQ6OnN0cmluZ192aWV3IHZhbHVlX3ZpZXcgPSB2YWx1ZTsKKyAgY29uc3QgYm9vbCBpc19ieXRlID0gQ29uc3VtZVN1ZmZpeCgmdmFsdWVfdmlldywgInU4Iik7CisgIGNvbnN0IGJvb2wgaXNfbG9uZyA9IENvbnN1bWVTdWZmaXgoJnZhbHVlX3ZpZXcsICJsIikgfHwgQ29uc3VtZVN1ZmZpeCgmdmFsdWVfdmlldywgIkwiKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgdmFsdWVfc3Vic3RyID0gc3RkOjpzdHJpbmcodmFsdWVfdmlldyk7CisKKyAgKnBhcnNlZF92YWx1ZSA9IDA7CisgICpwYXJzZWRfdHlwZSA9IFR5cGU6OkVSUk9SOworCisgIGlmIChpc19ieXRlICYmIGlzX2xvbmcpIHJldHVybiBmYWxzZTsKIAogICBpZiAoSXNIZXgodmFsdWUpKSB7CiAgICAgLy8gQUlETCBjb25zaWRlcnMgJ2NvbnN0IGludCBmb28gPSAweGZmZmZmZmZmJyBhcyAtMSwgYnV0IGlmIHdlIHdhbnQgdG8KQEAgLTM4NiwyOCArNDYwLDM4IEBACiAgICAgLy8gTm90ZSwgZm9yIGhpc3RvcmljYWwgY29uc2lzdGVuY3ksIHdlIG5lZWQgdG8gY29uc2lkZXIgc21hbGwgaGV4IHZhbHVlcwogICAgIC8vIGFzIGFuIGludGVncmFsIHR5cGUuIFJlY29nbml6aW5nIHRoZW0gYXMgSU5UOCBjb3VsZCBicmVhayBzb21lIGZpbGVzLAogICAgIC8vIGV2ZW4gdGhvdWdoIGl0IHdvdWxkIHNpbXBsaWZ5IHRoaXMgY29kZS4KLSAgICBpZiAodWludDMyX3QgcmF3VmFsdWUzMjsKLSAgICAgICAgIWlzTG9uZyAmJiBhbmRyb2lkOjpiYXNlOjpQYXJzZVVpbnQ8dWludDMyX3Q+KHZhbHVlX3N1YnN0ciwgJnJhd1ZhbHVlMzIpKSB7Ci0gICAgICAqcGFyc2VkX3ZhbHVlID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmF3VmFsdWUzMik7CisgICAgaWYgKGlzX2J5dGUpIHsKKyAgICAgIHVpbnQ4X3QgcmF3X3ZhbHVlODsKKyAgICAgIGlmICghYW5kcm9pZDo6YmFzZTo6UGFyc2VVaW50PHVpbnQ4X3Q+KHZhbHVlX3N1YnN0ciwgJnJhd192YWx1ZTgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgICpwYXJzZWRfdmFsdWUgPSBzdGF0aWNfY2FzdDxpbnQ4X3Q+KHJhd192YWx1ZTgpOworICAgICAgKnBhcnNlZF90eXBlID0gVHlwZTo6SU5UODsKKyAgICB9IGVsc2UgaWYgKHVpbnQzMl90IHJhd192YWx1ZTMyOworICAgICAgICAgICAgICAgIWlzX2xvbmcgJiYgYW5kcm9pZDo6YmFzZTo6UGFyc2VVaW50PHVpbnQzMl90Pih2YWx1ZV9zdWJzdHIsICZyYXdfdmFsdWUzMikpIHsKKyAgICAgICpwYXJzZWRfdmFsdWUgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihyYXdfdmFsdWUzMik7CiAgICAgICAqcGFyc2VkX3R5cGUgPSBUeXBlOjpJTlQzMjsKLSAgICB9IGVsc2UgaWYgKHVpbnQ2NF90IHJhd1ZhbHVlNjQ7IGFuZHJvaWQ6OmJhc2U6OlBhcnNlVWludDx1aW50NjRfdD4odmFsdWVfc3Vic3RyLCAmcmF3VmFsdWU2NCkpIHsKLSAgICAgICpwYXJzZWRfdmFsdWUgPSBzdGF0aWNfY2FzdDxpbnQ2NF90PihyYXdWYWx1ZTY0KTsKKyAgICB9IGVsc2UgaWYgKHVpbnQ2NF90IHJhd192YWx1ZTY0OworICAgICAgICAgICAgICAgYW5kcm9pZDo6YmFzZTo6UGFyc2VVaW50PHVpbnQ2NF90Pih2YWx1ZV9zdWJzdHIsICZyYXdfdmFsdWU2NCkpIHsKKyAgICAgICpwYXJzZWRfdmFsdWUgPSBzdGF0aWNfY2FzdDxpbnQ2NF90PihyYXdfdmFsdWU2NCk7CiAgICAgICAqcGFyc2VkX3R5cGUgPSBUeXBlOjpJTlQ2NDsKICAgICB9IGVsc2UgewotICAgICAgKnBhcnNlZF92YWx1ZSA9IDA7Ci0gICAgICAqcGFyc2VkX3R5cGUgPSBUeXBlOjpFUlJPUjsKICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgcmV0dXJuIHRydWU7CiAgIH0KIAogICBpZiAoIWFuZHJvaWQ6OmJhc2U6OlBhcnNlSW50PGludDY0X3Q+KHZhbHVlX3N1YnN0ciwgcGFyc2VkX3ZhbHVlKSkgewotICAgICpwYXJzZWRfdmFsdWUgPSAwOwotICAgICpwYXJzZWRfdHlwZSA9IFR5cGU6OkVSUk9SOwogICAgIHJldHVybiBmYWxzZTsKICAgfQogCi0gIGlmIChpc0xvbmcpIHsKKyAgaWYgKGlzX2J5dGUpIHsKKyAgICBpZiAoKnBhcnNlZF92YWx1ZSA+IFVJTlQ4X01BWCB8fCAqcGFyc2VkX3ZhbHVlIDwgMCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAqcGFyc2VkX3ZhbHVlID0gc3RhdGljX2Nhc3Q8aW50OF90PigqcGFyc2VkX3ZhbHVlKTsKKyAgICAqcGFyc2VkX3R5cGUgPSBUeXBlOjpJTlQ4OworICB9IGVsc2UgaWYgKGlzX2xvbmcpIHsKICAgICAqcGFyc2VkX3R5cGUgPSBUeXBlOjpJTlQ2NDsKICAgfSBlbHNlIHsKICAgICAvLyBndWVzcyBsaXRlcmFsIHR5cGUuCkBAIC00MzgsMTQgKzUyMiwyNyBAQAogQWlkbENvbnN0YW50VmFsdWUqIEFpZGxDb25zdGFudFZhbHVlOjpBcnJheSgKICAgICBjb25zdCBBaWRsTG9jYXRpb24mIGxvY2F0aW9uLCBzdGQ6OnVuaXF1ZV9wdHI8dmVjdG9yPHVuaXF1ZV9wdHI8QWlkbENvbnN0YW50VmFsdWU+Pj4gdmFsdWVzKSB7CiAgIEFJRExfRkFUQUxfSUYodmFsdWVzID09IG51bGxwdHIsIGxvY2F0aW9uKTsKKyAgLy8gUmVjb25zdHJ1Y3QgbGl0ZXJhbCB2YWx1ZQogICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc3RyX3ZhbHVlczsKICAgZm9yIChjb25zdCBhdXRvJiB2IDogKnZhbHVlcykgewogICAgIHN0cl92YWx1ZXMucHVzaF9iYWNrKHYtPnZhbHVlXyk7CiAgIH0KLSAgcmV0dXJuIG5ldyBBaWRsQ29uc3RhbnRWYWx1ZShsb2NhdGlvbiwgVHlwZTo6QVJSQVksIHN0ZDo6bW92ZSh2YWx1ZXMpLCBKb2luKHN0cl92YWx1ZXMsICIsICIpKTsKKyAgcmV0dXJuIG5ldyBBaWRsQ29uc3RhbnRWYWx1ZShsb2NhdGlvbiwgVHlwZTo6QVJSQVksIHN0ZDo6bW92ZSh2YWx1ZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ7IiArIEpvaW4oc3RyX3ZhbHVlcywgIiwgIikgKyAifSIpOwogfQogCiBBaWRsQ29uc3RhbnRWYWx1ZSogQWlkbENvbnN0YW50VmFsdWU6OlN0cmluZyhjb25zdCBBaWRsTG9jYXRpb24mIGxvY2F0aW9uLCBjb25zdCBzdHJpbmcmIHZhbHVlKSB7CisgIEFJRExfRkFUQUxfSUYodmFsdWUuc2l6ZSgpID09IDAsICJJZiB0aGlzIGlzIHVucXVvdGVkLCB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgaW5kZXggbG9nIik7CisgIEFJRExfRkFUQUxfSUYodmFsdWVbMF0gIT0gJ1wiJywgIklmIHRoaXMgaXMgdW5xdW90ZWQsIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBpbmRleCBsb2ciKTsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aCgpOyArK2kpIHsKKyAgICBpZiAoIWlzVmFsaWRMaXRlcmFsQ2hhcih2YWx1ZVtpXSkpIHsKKyAgICAgIEFJRExfRVJST1IobG9jYXRpb24pIDw8ICJGb3VuZCBpbnZhbGlkIGNoYXJhY3RlciAnIiA8PCB2YWx1ZVtpXSA8PCAiJyBhdCBpbmRleCAiIDw8IGkgLSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGluIHN0cmluZyBjb25zdGFudCAnIiA8PCB2YWx1ZSA8PCAiJyI7CisgICAgICByZXR1cm4gbmV3IEFpZGxDb25zdGFudFZhbHVlKGxvY2F0aW9uLCBUeXBlOjpFUlJPUiwgdmFsdWUpOworICAgIH0KKyAgfQorCiAgIHJldHVybiBuZXcgQWlkbENvbnN0YW50VmFsdWUobG9jYXRpb24sIFR5cGU6OlNUUklORywgdmFsdWUpOwogfQogCkBAIC00NzAsNyArNTY3LDcgQEAKICAgfQogCiAgIGNvbnN0IEFpZGxEZWZpbmVkVHlwZSogZGVmaW5lZF90eXBlID0gdHlwZS5HZXREZWZpbmVkVHlwZSgpOwotICBpZiAoZGVmaW5lZF90eXBlICYmICF0eXBlLklzQXJyYXkoKSkgeworICBpZiAoZGVmaW5lZF90eXBlICYmIGZpbmFsX3R5cGVfICE9IFR5cGU6OkFSUkFZKSB7CiAgICAgY29uc3QgQWlkbEVudW1EZWNsYXJhdGlvbiogZW51bV90eXBlID0gZGVmaW5lZF90eXBlLT5Bc0VudW1EZWNsYXJhdGlvbigpOwogICAgIGlmICghZW51bV90eXBlKSB7CiAgICAgICBBSURMX0VSUk9SKHRoaXMpIDw8ICJJbnZhbGlkIHR5cGUgKCIgPDwgZGVmaW5lZF90eXBlLT5HZXRDYW5vbmljYWxOYW1lKCkKQEAgLTQ4NSw3ICs1ODIsNyBAQAogICAgIHJldHVybiBkZWNvcmF0b3IodHlwZSwgdmFsdWVfKTsKICAgfQogCi0gIGNvbnN0IHN0cmluZyYgdHlwZV9zdHJpbmcgPSB0eXBlLkdldE5hbWUoKTsKKyAgY29uc3Qgc3RyaW5nJiB0eXBlX3N0cmluZyA9IHR5cGUuU2lnbmF0dXJlKCk7CiAgIGludCBlcnIgPSAwOwogCiAgIHN3aXRjaCAoZmluYWxfdHlwZV8pIHsKQEAgLTUzNCw4ICs2MzEsMTAgQEAKICAgICAgIGJvb2wgc3VjY2VzcyA9IHRydWU7CiAKICAgICAgIGZvciAoY29uc3QgYXV0byYgdmFsdWUgOiB2YWx1ZXNfKSB7Ci0gICAgICAgIGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiBhcnJheV9iYXNlID0gdHlwZS5BcnJheUJhc2UoKTsKLSAgICAgICAgY29uc3Qgc3RyaW5nIHZhbHVlX3N0cmluZyA9IHZhbHVlLT5WYWx1ZVN0cmluZyhhcnJheV9iYXNlLCBkZWNvcmF0b3IpOworICAgICAgICBzdHJpbmcgdmFsdWVfc3RyaW5nOworICAgICAgICB0eXBlLlZpZXdBc0FycmF5QmFzZShbJl0oY29uc3QgYXV0byYgYmFzZV90eXBlKSB7CisgICAgICAgICAgdmFsdWVfc3RyaW5nID0gdmFsdWUtPlZhbHVlU3RyaW5nKGJhc2VfdHlwZSwgZGVjb3JhdG9yKTsKKyAgICAgICAgfSk7CiAgICAgICAgIGlmICh2YWx1ZV9zdHJpbmcuZW1wdHkoKSkgewogICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsKICAgICAgICAgICBicmVhazsKQEAgLTU0Niw4ICs2NDUsMTcgQEAKICAgICAgICAgZXJyID0gLTE7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQotCi0gICAgICByZXR1cm4gZGVjb3JhdG9yKHR5cGUsICJ7IiArIEpvaW4odmFsdWVfc3RyaW5ncywgIiwgIikgKyAifSIpOworICAgICAgaWYgKHR5cGUuSXNGaXhlZFNpemVBcnJheSgpKSB7CisgICAgICAgIGF1dG8gc2l6ZSA9CisgICAgICAgICAgICBzdGQ6OmdldDxGaXhlZFNpemVBcnJheT4odHlwZS5HZXRBcnJheSgpKS5kaW1lbnNpb25zLmZyb250KCktPkV2YWx1YXRlZFZhbHVlPGludDMyX3Q+KCk7CisgICAgICAgIGlmICh2YWx1ZXNfLnNpemUoKSAhPSBzdGF0aWNfY2FzdDxzaXplX3Q+KHNpemUpKSB7CisgICAgICAgICAgQUlETF9FUlJPUih0aGlzKSA8PCAiRXhwZWN0ZWQgYW4gYXJyYXkgb2YgIiA8PCBzaXplIDw8ICIgZWxlbWVudHMsIGJ1dCBmb3VuZCBvbmUgd2l0aCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCB2YWx1ZXNfLnNpemUoKSA8PCAiIGVsZW1lbnRzIjsKKyAgICAgICAgICBlcnIgPSAtMTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIGRlY29yYXRvcih0eXBlLCB2YWx1ZV9zdHJpbmdzKTsKICAgICB9CiAgICAgY2FzZSBUeXBlOjpGTE9BVElORzogewogICAgICAgaWYgKHR5cGVfc3RyaW5nID09ICJkb3VibGUiKSB7CkBAIC01NzcsNyArNjg1LDggQEAKICAgfQogCiAgIEFJRExfRkFUQUxfSUYoZXJyID09IDAsIHRoaXMpOwotICBBSURMX0VSUk9SKHRoaXMpIDw8ICJJbnZhbGlkIHR5cGUgc3BlY2lmaWVyIGZvciAiIDw8IFRvU3RyaW5nKGZpbmFsX3R5cGVfKSA8PCAiOiAiIDw8IHR5cGVfc3RyaW5nOworICBBSURMX0VSUk9SKHRoaXMpIDw8ICJJbnZhbGlkIHR5cGUgc3BlY2lmaWVyIGZvciAiIDw8IFRvU3RyaW5nKGZpbmFsX3R5cGVfKSA8PCAiOiAiIDw8IHR5cGVfc3RyaW5nCisgICAgICAgICAgICAgICAgICAgPDwgIiAoIiA8PCB2YWx1ZV8gPDwgIikiOwogICByZXR1cm4gIiI7CiB9CiAKQEAgLTYxMyw2ICs3MjIsMTQgQEAKICAgcmV0dXJuIHRydWU7CiB9CiAKK2Jvb2wgQWlkbENvbnN0YW50VmFsdWU6OkV2YWx1YXRlKCkgY29uc3QgeworICBpZiAoQ2hlY2tWYWxpZCgpKSB7CisgICAgcmV0dXJuIGV2YWx1YXRlKCk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKIGJvb2wgQWlkbENvbnN0YW50VmFsdWU6OmV2YWx1YXRlKCkgY29uc3QgewogICBpZiAoaXNfZXZhbHVhdGVkXykgewogICAgIHJldHVybiBpc192YWxpZF87CkBAIC03MjQsNyArODQxLDggQEAKICAgaWYgKHBvcyA9PSBzdHJpbmc6Om5wb3MpIHsKICAgICBmaWVsZF9uYW1lXyA9IHZhbHVlOwogICB9IGVsc2UgewotICAgIHJlZl90eXBlXyA9IHN0ZDo6bWFrZV91bmlxdWU8QWlkbFR5cGVTcGVjaWZpZXI+KGxvY2F0aW9uLCB2YWx1ZS5zdWJzdHIoMCwgcG9zKSwgZmFsc2UsIG51bGxwdHIsCisgICAgcmVmX3R5cGVfID0gc3RkOjptYWtlX3VuaXF1ZTxBaWRsVHlwZVNwZWNpZmllcj4obG9jYXRpb24sIHZhbHVlLnN1YnN0cigwLCBwb3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qYXJyYXk9Ki9zdGQ6Om51bGxvcHQsIC8qdHlwZV9wYXJhbXM9Ki9udWxscHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1lbnRze30pOwogICAgIGZpZWxkX25hbWVfID0gdmFsdWUuc3Vic3RyKHBvcyArIDEpOwogICB9CmRpZmYgLS1naXQgYS9haWRsX2R1bXBhcGkuY3BwIGIvYWlkbF9kdW1wYXBpLmNwcAppbmRleCBjMTIxZjlmLi4xNDUxZDQxIDEwMDY0NAotLS0gYS9haWRsX2R1bXBhcGkuY3BwCisrKyBiL2FpZGxfZHVtcGFwaS5jcHAKQEAgLTMyLDYgKzMyLDkgQEAKIG5hbWVzcGFjZSBhaWRsIHsKIAogdm9pZCBEdW1wVmlzaXRvcjo6RHVtcFR5cGUoY29uc3QgQWlkbERlZmluZWRUeXBlJiBkdCwgY29uc3Qgc3RyaW5nJiB0eXBlKSB7CisgIGlmICghZHQuSXNVc2VyRGVmaW5lZCgpKSB7CisgICAgcmV0dXJuOworICB9CiAgIER1bXBDb21tZW50cyhkdCk7CiAgIER1bXBBbm5vdGF0aW9ucyhkdCk7CiAgIG91dCA8PCB0eXBlIDw8ICIgIiA8PCBkdC5HZXROYW1lKCk7CkBAIC00Nyw3ICs1MCw2IEBACiAKIHZvaWQgRHVtcFZpc2l0b3I6OkR1bXBNZW1iZXJzKGNvbnN0IEFpZGxEZWZpbmVkVHlwZSYgZHQpIHsKICAgZm9yIChjb25zdCBhdXRvJiBtZXRob2QgOiBkdC5HZXRNZXRob2RzKCkpIHsKLSAgICBpZiAoIW1ldGhvZC0+SXNVc2VyRGVmaW5lZCgpKSBjb250aW51ZTsKICAgICBtZXRob2QtPkRpc3BhdGNoVmlzaXQoKnRoaXMpOwogICB9CiAgIGZvciAoY29uc3QgYXV0byYgZmllbGQgOiBkdC5HZXRGaWVsZHMoKSkgewpAQCAtNTYsNiArNTgsOSBAQAogICBmb3IgKGNvbnN0IGF1dG8mIGNvbnN0ZGVjbCA6IGR0LkdldENvbnN0YW50RGVjbGFyYXRpb25zKCkpIHsKICAgICBjb25zdGRlY2wtPkRpc3BhdGNoVmlzaXQoKnRoaXMpOwogICB9CisgIGZvciAoY29uc3QgYXV0byYgbmVzdGVkIDogZHQuR2V0TmVzdGVkVHlwZXMoKSkgeworICAgIG5lc3RlZC0+RGlzcGF0Y2hWaXNpdCgqdGhpcyk7CisgIH0KIH0KIAogLy8gRHVtcHMgY29tbWVudCBvbmx5IGlmIGl0cyBoYXMgbWVhbmluZ2Z1bCB0YWdzLgpAQCAtOTIsMjEgKzk3LDI5IEBACiB2b2lkIER1bXBWaXNpdG9yOjpWaXNpdChjb25zdCBBaWRsSW50ZXJmYWNlJiB0KSB7CiAgIER1bXBUeXBlKHQsICJpbnRlcmZhY2UiKTsKIH0KKwogdm9pZCBEdW1wVmlzaXRvcjo6VmlzaXQoY29uc3QgQWlkbFBhcmNlbGFibGUmIHQpIHsKICAgRHVtcFR5cGUodCwgInBhcmNlbGFibGUiKTsKIH0KKwogdm9pZCBEdW1wVmlzaXRvcjo6VmlzaXQoY29uc3QgQWlkbFN0cnVjdHVyZWRQYXJjZWxhYmxlJiB0KSB7CiAgIER1bXBUeXBlKHQsICJwYXJjZWxhYmxlIik7CiB9CisKIHZvaWQgRHVtcFZpc2l0b3I6OlZpc2l0KGNvbnN0IEFpZGxVbmlvbkRlY2wmIHQpIHsKICAgRHVtcFR5cGUodCwgInVuaW9uIik7CiB9CisKIHZvaWQgRHVtcFZpc2l0b3I6OlZpc2l0KGNvbnN0IEFpZGxFbnVtRGVjbGFyYXRpb24mIHQpIHsKKyAgaWYgKCF0LklzVXNlckRlZmluZWQoKSkgeworICAgIHJldHVybjsKKyAgfQogICBEdW1wQ29tbWVudHModCk7CiAgIER1bXBBbm5vdGF0aW9ucyh0KTsKICAgb3V0IDw8ICJlbnVtICIgPDwgdC5HZXROYW1lKCkgPDwgIiB7XG4iOwogICBvdXQuSW5kZW50KCk7CiAgIGZvciAoY29uc3QgYXV0byYgZSA6IHQuR2V0RW51bWVyYXRvcnMoKSkgeworICAgIER1bXBDb21tZW50cygqZSk7CiAgICAgb3V0IDw8IGUtPkdldE5hbWUoKSA8PCAiID0gIjsKICAgICBEdW1wQ29uc3RhbnRWYWx1ZSh0LkdldEJhY2tpbmdUeXBlKCksICplLT5HZXRWYWx1ZSgpKTsKICAgICBvdXQgPDwgIixcbiI7CkBAIC0xMTYsMTAgKzEyOSwxNyBAQAogfQogCiB2b2lkIER1bXBWaXNpdG9yOjpWaXNpdChjb25zdCBBaWRsTWV0aG9kJiBtKSB7CisgIGlmICghbS5Jc1VzZXJEZWZpbmVkKCkpIHsKKyAgICByZXR1cm47CisgIH0KICAgRHVtcENvbW1lbnRzKG0pOwogICBvdXQgPDwgbS5Ub1N0cmluZygpIDw8ICI7XG4iOwogfQorCiB2b2lkIER1bXBWaXNpdG9yOjpWaXNpdChjb25zdCBBaWRsVmFyaWFibGVEZWNsYXJhdGlvbiYgdikgeworICBpZiAoIXYuSXNVc2VyRGVmaW5lZCgpKSB7CisgICAgcmV0dXJuOworICB9CiAgIER1bXBDb21tZW50cyh2KTsKICAgVmlzaXQodi5HZXRUeXBlKCkpOwogICBpZiAodi5Jc0RlZmF1bHRVc2VyU3BlY2lmaWVkKCkpIHsKQEAgLTEzMCw3ICsxNTAsMTEgQEAKICAgICBvdXQgPDwgIiAiIDw8IHYuR2V0TmFtZSgpIDw8ICI7XG4iOwogICB9CiB9CisKIHZvaWQgRHVtcFZpc2l0b3I6OlZpc2l0KGNvbnN0IEFpZGxDb25zdGFudERlY2xhcmF0aW9uJiBjKSB7CisgIGlmICghYy5Jc1VzZXJEZWZpbmVkKCkpIHsKKyAgICByZXR1cm47CisgIH0KICAgRHVtcENvbW1lbnRzKGMpOwogICBvdXQgPDwgImNvbnN0ICI7CiAgIFZpc2l0KGMuR2V0VHlwZSgpKTsKQEAgLTEzOSwxMyArMTYzLDYgQEAKICAgb3V0IDw8ICI7XG4iOwogfQogCi12b2lkIER1bXBWaXNpdG9yOjpWaXNpdChjb25zdCBBaWRsRW51bWVyYXRvciYgZSkgewotICBvdXQgPDwgZS5HZXROYW1lKCkgPDwgIiA9ICI7Ci0KLSAgZS5HZXRWYWx1ZSgpLT5EaXNwYXRjaFZpc2l0KCp0aGlzKTsKLSAgb3V0IDw8ICIsXG4iOwotfQotCiB2b2lkIER1bXBWaXNpdG9yOjpWaXNpdChjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdCkgewogICBvdXQgPDwgdC5Ub1N0cmluZygpOwogfQpkaWZmIC0tZ2l0IGEvYWlkbF9kdW1wYXBpLmggYi9haWRsX2R1bXBhcGkuaAppbmRleCA2ZDAwMGRkLi5kZjgyNzhhIDEwMDY0NAotLS0gYS9haWRsX2R1bXBhcGkuaAorKysgYi9haWRsX2R1bXBhcGkuaApAQCAtMjgsNyArMjgsNyBAQAogICB2b2lkIER1bXBNZW1iZXJzKGNvbnN0IEFpZGxEZWZpbmVkVHlwZSYgZHQpOwogICB2b2lkIER1bXBDb21tZW50cyhjb25zdCBBaWRsQ29tbWVudGFibGUmIGMpOwogICB2b2lkIER1bXBBbm5vdGF0aW9ucyhjb25zdCBBaWRsQW5ub3RhdGFibGUmIGEpOwotICB2aXJ0dWFsIHZvaWQgRHVtcENvbnN0YW50VmFsdWUoY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHR5cGUsIGNvbnN0IEFpZGxDb25zdGFudFZhbHVlJiBjKTsKKyAgdm9pZCBEdW1wQ29uc3RhbnRWYWx1ZShjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSwgY29uc3QgQWlkbENvbnN0YW50VmFsdWUmIGMpOwogCiAgIHZvaWQgVmlzaXQoY29uc3QgQWlkbEludGVyZmFjZSYgdCkgb3ZlcnJpZGU7CiAgIHZvaWQgVmlzaXQoY29uc3QgQWlkbFBhcmNlbGFibGUmIHQpIG92ZXJyaWRlOwpAQCAtMzgsNyArMzgsNiBAQAogICB2b2lkIFZpc2l0KGNvbnN0IEFpZGxNZXRob2QmIG0pIG92ZXJyaWRlOwogICB2b2lkIFZpc2l0KGNvbnN0IEFpZGxWYXJpYWJsZURlY2xhcmF0aW9uJiB2KSBvdmVycmlkZTsKICAgdm9pZCBWaXNpdChjb25zdCBBaWRsQ29uc3RhbnREZWNsYXJhdGlvbiYgYykgb3ZlcnJpZGU7Ci0gIHZvaWQgVmlzaXQoY29uc3QgQWlkbEVudW1lcmF0b3ImIGUpIG92ZXJyaWRlOwogICB2b2lkIFZpc2l0KGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiB0KSBvdmVycmlkZTsKIH07CiAKZGlmZiAtLWdpdCBhL2FpZGxfbGFuZ3VhZ2UuY3BwIGIvYWlkbF9sYW5ndWFnZS5jcHAKaW5kZXggNzMzZDVlMi4uNmUxOWQ2ZSAxMDA2NDQKLS0tIGEvYWlkbF9sYW5ndWFnZS5jcHAKKysrIGIvYWlkbF9sYW5ndWFnZS5jcHAKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgorCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgogI2luY2x1ZGUgPGlvc3RyZWFtPgogI2luY2x1ZGUgPHNldD4KQEAgLTMwLDEzICszMSwxNCBAQAogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3BhcnNlZG91YmxlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3BhcnNlaW50Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Jlc3VsdC5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdzLmg+CiAKKyNpbmNsdWRlICJhaWRsLmgiCiAjaW5jbHVkZSAiYWlkbF9sYW5ndWFnZV95LmgiCiAjaW5jbHVkZSAiY29tbWVudHMuaCIKICNpbmNsdWRlICJsb2dnaW5nLmgiCi0KLSNpbmNsdWRlICJhaWRsLmgiCisjaW5jbHVkZSAicGVybWlzc2lvbi5oIgogCiAjaWZkZWYgX1dJTjMyCiBpbnQgaXNhdHR5KGludCAgZmQpCkBAIC00Niw3ICs0OCw5IEBACiAjZW5kaWYKIAogdXNpbmcgYW5kcm9pZDo6YWlkbDo6SW9EZWxlZ2F0ZTsKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OkVycm9yOwogdXNpbmcgYW5kcm9pZDo6YmFzZTo6Sm9pbjsKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlJlc3VsdDsKIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OlNwbGl0OwogdXNpbmcgc3RkOjpjZXJyOwogdXNpbmcgc3RkOjpwYWlyOwpAQCAtNzEsNiArNzUsMjQgQEAKIH0KIH0gIC8vIG5hbWVzcGFjZQogCitBaWRsTm9kZTo6fkFpZGxOb2RlKCkgeworICBpZiAoIXZpc2l0ZWRfKSB7CisgICAgdW52aXNpdGVkX2xvY2F0aW9uc18ucHVzaF9iYWNrKGxvY2F0aW9uXyk7CisgIH0KK30KKwordm9pZCBBaWRsTm9kZTo6Q2xlYXJVbnZpc2l0ZWROb2RlcygpIHsKKyAgdW52aXNpdGVkX2xvY2F0aW9uc18uY2xlYXIoKTsKK30KKworY29uc3Qgc3RkOjp2ZWN0b3I8QWlkbExvY2F0aW9uPiYgQWlkbE5vZGU6OkdldExvY2F0aW9uc09mVW52aXNpdGVkTm9kZXMoKSB7CisgIHJldHVybiB1bnZpc2l0ZWRfbG9jYXRpb25zXzsKK30KKwordm9pZCBBaWRsTm9kZTo6TWFya1Zpc2l0ZWQoKSBjb25zdCB7CisgIHZpc2l0ZWRfID0gdHJ1ZTsKK30KKwogQWlkbE5vZGU6OkFpZGxOb2RlKGNvbnN0IEFpZGxMb2NhdGlvbiYgbG9jYXRpb24sIGNvbnN0IENvbW1lbnRzJiBjb21tZW50cykKICAgICA6IGxvY2F0aW9uXyhsb2NhdGlvbiksIGNvbW1lbnRzXyhjb21tZW50cykge30KIApAQCAtODcsMTggKzEwOSwyNSBAQAogICByZXR1cm4gc3Muc3RyKCk7CiB9CiAKLXN0YXRpYyBjb25zdCBBaWRsVHlwZVNwZWNpZmllciBrU3RyaW5nVHlwZXtBSURMX0xPQ0FUSU9OX0hFUkUsICJTdHJpbmciLCBmYWxzZSwgbnVsbHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tZW50c3t9fTsKLXN0YXRpYyBjb25zdCBBaWRsVHlwZVNwZWNpZmllciBrU3RyaW5nQXJyYXlUeXBle0FJRExfTE9DQVRJT05fSEVSRSwgIlN0cmluZyIsIHRydWUsIG51bGxwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tZW50c3t9fTsKLXN0YXRpYyBjb25zdCBBaWRsVHlwZVNwZWNpZmllciBrSW50VHlwZXtBSURMX0xPQ0FUSU9OX0hFUkUsICJpbnQiLCBmYWxzZSwgbnVsbHB0ciwgQ29tbWVudHN7fX07Ci1zdGF0aWMgY29uc3QgQWlkbFR5cGVTcGVjaWZpZXIga0xvbmdUeXBle0FJRExfTE9DQVRJT05fSEVSRSwgImxvbmciLCBmYWxzZSwgbnVsbHB0ciwgQ29tbWVudHN7fX07Ci1zdGF0aWMgY29uc3QgQWlkbFR5cGVTcGVjaWZpZXIga0Jvb2xlYW5UeXBle0FJRExfTE9DQVRJT05fSEVSRSwgImJvb2xlYW4iLCBmYWxzZSwgbnVsbHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWVudHN7fX07CitzdGQ6OnZlY3RvcjxBaWRsTG9jYXRpb24+IEFpZGxOb2RlOjp1bnZpc2l0ZWRfbG9jYXRpb25zXzsKKworc3RhdGljIGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyIGtTdHJpbmdUeXBle0FJRExfTE9DQVRJT05fSEVSRSwgIlN0cmluZyIsIC8qYXJyYXk9Ki9zdGQ6Om51bGxvcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgQ29tbWVudHN7fX07CitzdGF0aWMgY29uc3QgQWlkbFR5cGVTcGVjaWZpZXIga1N0cmluZ0FycmF5VHlwZXtBSURMX0xPQ0FUSU9OX0hFUkUsICJTdHJpbmciLCBEeW5hbWljQXJyYXl7fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIENvbW1lbnRze319Oworc3RhdGljIGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyIGtJbnRUeXBle0FJRExfTE9DQVRJT05fSEVSRSwgImludCIsIC8qYXJyYXk9Ki9zdGQ6Om51bGxvcHQsIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWVudHN7fX07CitzdGF0aWMgY29uc3QgQWlkbFR5cGVTcGVjaWZpZXIga0xvbmdUeXBle0FJRExfTE9DQVRJT05fSEVSRSwgImxvbmciLCAvKmFycmF5PSovc3RkOjpudWxsb3B0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCBDb21tZW50c3t9fTsKK3N0YXRpYyBjb25zdCBBaWRsVHlwZVNwZWNpZmllciBrQm9vbGVhblR5cGV7QUlETF9MT0NBVElPTl9IRVJFLCAiYm9vbGVhbiIsIC8qYXJyYXk9Ki9zdGQ6Om51bGxvcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIENvbW1lbnRze319OwogCiBjb25zdCBzdGQ6OnZlY3RvcjxBaWRsQW5ub3RhdGlvbjo6U2NoZW1hPiYgQWlkbEFubm90YXRpb246OkFsbFNjaGVtYXMoKSB7CiAgIHN0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxTY2hlbWE+IGtTY2hlbWFzewotICAgICAge0FpZGxBbm5vdGF0aW9uOjpUeXBlOjpOVUxMQUJMRSwgIm51bGxhYmxlIiwgQ09OVEVYVF9UWVBFX1NQRUNJRklFUiwge319LAorICAgICAge0FpZGxBbm5vdGF0aW9uOjpUeXBlOjpOVUxMQUJMRSwKKyAgICAgICAibnVsbGFibGUiLAorICAgICAgIENPTlRFWFRfVFlQRV9TUEVDSUZJRVIsCisgICAgICAge3siaGVhcCIsIGtCb29sZWFuVHlwZX19fSwKICAgICAgIHtBaWRsQW5ub3RhdGlvbjo6VHlwZTo6VVRGOF9JTl9DUFAsICJ1dGY4SW5DcHAiLCBDT05URVhUX1RZUEVfU1BFQ0lGSUVSLCB7fX0sCiAgICAgICB7QWlkbEFubm90YXRpb246OlR5cGU6OlNFTlNJVElWRV9EQVRBLCAiU2Vuc2l0aXZlRGF0YSIsIENPTlRFWFRfVFlQRV9JTlRFUkZBQ0UsIHt9fSwKICAgICAgIHtBaWRsQW5ub3RhdGlvbjo6VHlwZTo6VklOVEZfU1RBQklMSVRZLCAiVmludGZTdGFiaWxpdHkiLCBDT05URVhUX1RZUEUsIHt9fSwKQEAgLTExNCw3ICsxNDMsNiBAQAogICAgICAgICJKYXZhT25seVN0YWJsZVBhcmNlbGFibGUiLAogICAgICAgIENPTlRFWFRfVFlQRV9VTlNUUlVDVFVSRURfUEFSQ0VMQUJMRSwKICAgICAgICB7fX0sCi0gICAgICB7QWlkbEFubm90YXRpb246OlR5cGU6OkhJREUsICJIaWRlIiwgQ09OVEVYVF9UWVBFIHwgQ09OVEVYVF9NRU1CRVIsIHt9fSwKICAgICAgIHtBaWRsQW5ub3RhdGlvbjo6VHlwZTo6QkFDS0lORywKICAgICAgICAiQmFja2luZyIsCiAgICAgICAgQ09OVEVYVF9UWVBFX0VOVU0sCkBAIC0xMjYsOSArMTU0LDEwIEBACiAgICAgICAgLyogcmVwZWF0YWJsZT0gKi8gdHJ1ZX0sCiAgICAgICB7QWlkbEFubm90YXRpb246OlR5cGU6OkpBVkFfREVSSVZFLAogICAgICAgICJKYXZhRGVyaXZlIiwKLSAgICAgICBDT05URVhUX1RZUEVfU1RSVUNUVVJFRF9QQVJDRUxBQkxFIHwgQ09OVEVYVF9UWVBFX1VOSU9OLAorICAgICAgIENPTlRFWFRfVFlQRV9TVFJVQ1RVUkVEX1BBUkNFTEFCTEUgfCBDT05URVhUX1RZUEVfVU5JT04gfCBDT05URVhUX1RZUEVfRU5VTSwKICAgICAgICB7eyJ0b1N0cmluZyIsIGtCb29sZWFuVHlwZX0sIHsiZXF1YWxzIiwga0Jvb2xlYW5UeXBlfX19LAogICAgICAge0FpZGxBbm5vdGF0aW9uOjpUeXBlOjpKQVZBX0RFRkFVTFQsICJKYXZhRGVmYXVsdCIsIENPTlRFWFRfVFlQRV9JTlRFUkZBQ0UsIHt9fSwKKyAgICAgIHtBaWRsQW5ub3RhdGlvbjo6VHlwZTo6SkFWQV9ERUxFR0FUT1IsICJKYXZhRGVsZWdhdG9yIiwgQ09OVEVYVF9UWVBFX0lOVEVSRkFDRSwge319LAogICAgICAge0FpZGxBbm5vdGF0aW9uOjpUeXBlOjpKQVZBX09OTFlfSU1NVVRBQkxFLAogICAgICAgICJKYXZhT25seUltbXV0YWJsZSIsCiAgICAgICAgQ09OVEVYVF9UWVBFX1NUUlVDVFVSRURfUEFSQ0VMQUJMRSB8IENPTlRFWFRfVFlQRV9VTklPTiB8CkBAIC0xMzgsNyArMTY3LDEwIEBACiAgICAgICAgIkphdmFTdXBwcmVzc0xpbnQiLAogICAgICAgIENPTlRFWFRfQUxMLAogICAgICAgIHt7InZhbHVlIiwga1N0cmluZ0FycmF5VHlwZSwgLyogcmVxdWlyZWQ9ICovIHRydWV9fX0sCi0gICAgICB7QWlkbEFubm90YXRpb246OlR5cGU6OkZJWEVEX1NJWkUsICJGaXhlZFNpemUiLCBDT05URVhUX1RZUEVfU1RSVUNUVVJFRF9QQVJDRUxBQkxFLCB7fX0sCisgICAgICB7QWlkbEFubm90YXRpb246OlR5cGU6OkZJWEVEX1NJWkUsCisgICAgICAgIkZpeGVkU2l6ZSIsCisgICAgICAgQ09OVEVYVF9UWVBFX1NUUlVDVFVSRURfUEFSQ0VMQUJMRSB8IENPTlRFWFRfVFlQRV9VTklPTiwKKyAgICAgICB7fX0sCiAgICAgICB7QWlkbEFubm90YXRpb246OlR5cGU6OkRFU0NSSVBUT1IsCiAgICAgICAgIkRlc2NyaXB0b3IiLAogICAgICAgIENPTlRFWFRfVFlQRV9JTlRFUkZBQ0UsCkBAIC0xNTcsNiArMTg5LDIyIEBACiAgICAgICAgIlN1cHByZXNzV2FybmluZ3MiLAogICAgICAgIENPTlRFWFRfVFlQRSB8IENPTlRFWFRfTUVNQkVSLAogICAgICAgIHt7InZhbHVlIiwga1N0cmluZ0FycmF5VHlwZSwgLyogcmVxdWlyZWQ9ICovIHRydWV9fX0sCisgICAgICB7QWlkbEFubm90YXRpb246OlR5cGU6OlBFUk1JU1NJT05fRU5GT1JDRSwKKyAgICAgICAiRW5mb3JjZVBlcm1pc3Npb24iLAorICAgICAgIENPTlRFWFRfVFlQRV9JTlRFUkZBQ0UgfCBDT05URVhUX01FVEhPRCwKKyAgICAgICB7eyJ2YWx1ZSIsIGtTdHJpbmdUeXBlfSwgeyJhbnlPZiIsIGtTdHJpbmdBcnJheVR5cGV9LCB7ImFsbE9mIiwga1N0cmluZ0FycmF5VHlwZX19fSwKKyAgICAgIHtBaWRsQW5ub3RhdGlvbjo6VHlwZTo6UEVSTUlTU0lPTl9NQU5VQUwsCisgICAgICAgIlBlcm1pc3Npb25NYW51YWxseUVuZm9yY2VkIiwKKyAgICAgICBDT05URVhUX1RZUEVfSU5URVJGQUNFIHwgQ09OVEVYVF9NRVRIT0QsCisgICAgICAge319LAorICAgICAge0FpZGxBbm5vdGF0aW9uOjpUeXBlOjpQRVJNSVNTSU9OX05PTkUsCisgICAgICAgIlJlcXVpcmVzTm9QZXJtaXNzaW9uIiwKKyAgICAgICBDT05URVhUX1RZUEVfSU5URVJGQUNFIHwgQ09OVEVYVF9NRVRIT0QsCisgICAgICAge319LAorICAgICAge0FpZGxBbm5vdGF0aW9uOjpUeXBlOjpQUk9QQUdBVEVfQUxMT1dfQkxPQ0tJTkcsCisgICAgICAgIlByb3BhZ2F0ZUFsbG93QmxvY2tpbmciLAorICAgICAgIENPTlRFWFRfTUVUSE9ELAorICAgICAgIHt9fSwKICAgfTsKICAgcmV0dXJuIGtTY2hlbWFzOwogfQpAQCAtMTY5LDkgKzIxNyw5IEBACiAgIF9fYnVpbHRpbl91bnJlYWNoYWJsZSgpOwogfQogCi1BaWRsQW5ub3RhdGlvbiogQWlkbEFubm90YXRpb246OlBhcnNlKAorc3RkOjp1bmlxdWVfcHRyPEFpZGxBbm5vdGF0aW9uPiBBaWRsQW5ub3RhdGlvbjo6UGFyc2UoCiAgICAgY29uc3QgQWlkbExvY2F0aW9uJiBsb2NhdGlvbiwgY29uc3Qgc3RyaW5nJiBuYW1lLAotICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnNoYXJlZF9wdHI8QWlkbENvbnN0YW50VmFsdWU+PiogcGFyYW1ldGVyX2xpc3QsCisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c2hhcmVkX3B0cjxBaWRsQ29uc3RhbnRWYWx1ZT4+IHBhcmFtZXRlcl9saXN0LAogICAgIGNvbnN0IENvbW1lbnRzJiBjb21tZW50cykgewogICBjb25zdCBTY2hlbWEqIHNjaGVtYSA9IG51bGxwdHI7CiAgIGZvciAoY29uc3QgU2NoZW1hJiBhX3NjaGVtYSA6IEFsbFNjaGVtYXMoKSkgewpAQCAtMTg5LDE5ICsyMzcsMTYgQEAKICAgICB9CiAgICAgc3RyZWFtIDw8ICIuIjsKICAgICBBSURMX0VSUk9SKGxvY2F0aW9uKSA8PCBzdHJlYW0uc3RyKCk7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLSAgaWYgKHBhcmFtZXRlcl9saXN0ID09IG51bGxwdHIpIHsKLSAgICByZXR1cm4gbmV3IEFpZGxBbm5vdGF0aW9uKGxvY2F0aW9uLCAqc2NoZW1hLCB7fSwgY29tbWVudHMpOworICAgIHJldHVybiB7fTsKICAgfQogCi0gIHJldHVybiBuZXcgQWlkbEFubm90YXRpb24obG9jYXRpb24sICpzY2hlbWEsIHN0ZDo6bW92ZSgqcGFyYW1ldGVyX2xpc3QpLCBjb21tZW50cyk7CisgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8QWlkbEFubm90YXRpb24+KAorICAgICAgbmV3IEFpZGxBbm5vdGF0aW9uKGxvY2F0aW9uLCAqc2NoZW1hLCBzdGQ6Om1vdmUocGFyYW1ldGVyX2xpc3QpLCBjb21tZW50cykpOwogfQogCi1BaWRsQW5ub3RhdGlvbjo6QWlkbEFubm90YXRpb24oCi0gICAgY29uc3QgQWlkbExvY2F0aW9uJiBsb2NhdGlvbiwgY29uc3QgU2NoZW1hJiBzY2hlbWEsCi0gICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c2hhcmVkX3B0cjxBaWRsQ29uc3RhbnRWYWx1ZT4+JiYgcGFyYW1ldGVycywKLSAgICBjb25zdCBDb21tZW50cyYgY29tbWVudHMpCitBaWRsQW5ub3RhdGlvbjo6QWlkbEFubm90YXRpb24oY29uc3QgQWlkbExvY2F0aW9uJiBsb2NhdGlvbiwgY29uc3QgU2NoZW1hJiBzY2hlbWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c2hhcmVkX3B0cjxBaWRsQ29uc3RhbnRWYWx1ZT4+IHBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29tbWVudHMmIGNvbW1lbnRzKQogICAgIDogQWlkbE5vZGUobG9jYXRpb24sIGNvbW1lbnRzKSwgc2NoZW1hXyhzY2hlbWEpLCBwYXJhbWV0ZXJzXyhzdGQ6Om1vdmUocGFyYW1ldGVycykpIHt9CiAKIHN0cnVjdCBDb25zdFJlZmVyZW5jZUZpbmRlciA6IEFpZGxWaXNpdG9yIHsKQEAgLTI2Niw3ICszMTEsMzQgQEAKICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsKICAgICB9CiAgIH0KLSAgcmV0dXJuIHN1Y2Nlc3M7CisgIGlmICghc3VjY2VzcykgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBGb3IgQEVuZm9yY2UgYW5ub3RhdGlvbnMsIHZhbGlkYXRlcyB0aGUgZXhwcmVzc2lvbi4KKyAgaWYgKHNjaGVtYV8udHlwZSA9PSBBaWRsQW5ub3RhdGlvbjo6VHlwZTo6UEVSTUlTU0lPTl9FTkZPUkNFKSB7CisgICAgYXV0byBleHByID0gRW5mb3JjZUV4cHJlc3Npb24oKTsKKyAgICBpZiAoIWV4cHIub2soKSkgeworICAgICAgQUlETF9FUlJPUih0aGlzKSA8PCAiVW5hYmxlIHRvIHBhcnNlIEBFbmZvcmNlUGVybWlzc2lvbiBhbm5vdGF0aW9uOiAiIDw8IGV4cHIuZXJyb3IoKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK1Jlc3VsdDx1bmlxdWVfcHRyPGFuZHJvaWQ6OmFpZGw6OnBlcm06OkV4cHJlc3Npb24+PiBBaWRsQW5ub3RhdGlvbjo6RW5mb3JjZUV4cHJlc3Npb24oKSBjb25zdCB7CisgIGF1dG8gc2luZ2xlID0gUGFyYW1WYWx1ZTxzdGQ6OnN0cmluZz4oInZhbHVlIik7CisgIGF1dG8gYW55T2YgPSBQYXJhbVZhbHVlPHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPj4oImFueU9mIik7CisgIGF1dG8gYWxsT2YgPSBQYXJhbVZhbHVlPHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPj4oImFsbE9mIik7CisgIGlmIChzaW5nbGUuaGFzX3ZhbHVlKCkpIHsKKyAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxhbmRyb2lkOjphaWRsOjpwZXJtOjpFeHByZXNzaW9uPihzaW5nbGUudmFsdWUoKSk7CisgIH0gZWxzZSBpZiAoYW55T2YuaGFzX3ZhbHVlKCkpIHsKKyAgICBhdXRvIHYgPSBhbmRyb2lkOjphaWRsOjpwZXJtOjpBbnlPZnthbnlPZi52YWx1ZSgpfTsKKyAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxhbmRyb2lkOjphaWRsOjpwZXJtOjpFeHByZXNzaW9uPih2KTsKKyAgfSBlbHNlIGlmIChhbGxPZi5oYXNfdmFsdWUoKSkgeworICAgIGF1dG8gdiA9IGFuZHJvaWQ6OmFpZGw6OnBlcm06OkFsbE9me2FsbE9mLnZhbHVlKCl9OworICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPGFuZHJvaWQ6OmFpZGw6OnBlcm06OkV4cHJlc3Npb24+KHYpOworICB9CisgIHJldHVybiBFcnJvcigpIDw8ICJObyBwYXJhbWV0ZXIgZm9yIEBFbmZvcmNlUGVybWlzc2lvbiI7CiB9CiAKIC8vIENoZWNrcyBpZiB0aGUgYW5ub3RhdGlvbiBpcyBhcHBsaWNhYmxlIHRvIHRoZSBjdXJyZW50IGNvbnRleHQuCkBAIC0zMzAsMTggKzQwMiwzMSBAQAogICB9CiB9CiAKLXN0YXRpYyBjb25zdCBBaWRsQW5ub3RhdGlvbiogR2V0QW5ub3RhdGlvbihjb25zdCB2ZWN0b3I8QWlkbEFubm90YXRpb24+JiBhbm5vdGF0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBaWRsQW5ub3RhdGlvbjo6VHlwZSB0eXBlKSB7CitzdGF0aWMgY29uc3QgQWlkbEFubm90YXRpb24qIEdldEFubm90YXRpb24oCisgICAgY29uc3QgdmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxBaWRsQW5ub3RhdGlvbj4+JiBhbm5vdGF0aW9ucywgQWlkbEFubm90YXRpb246OlR5cGUgdHlwZSkgewogICBmb3IgKGNvbnN0IGF1dG8mIGEgOiBhbm5vdGF0aW9ucykgewotICAgIGlmIChhLkdldFR5cGUoKSA9PSB0eXBlKSB7Ci0gICAgICBBSURMX0ZBVEFMX0lGKGEuUmVwZWF0YWJsZSgpLCBhKQorICAgIGlmIChhLT5HZXRUeXBlKCkgPT0gdHlwZSkgeworICAgICAgQUlETF9GQVRBTF9JRihhLT5SZXBlYXRhYmxlKCksIGEpCiAgICAgICAgICAgPDwgIlRyeWluZyB0byBnZXQgYSBzaW5nbGUgYW5ub3RhdGlvbiB3aGVuIGl0IGlzIHJlcGVhdGFibGUuIjsKLSAgICAgIHJldHVybiAmYTsKKyAgICAgIHJldHVybiBhLmdldCgpOwogICAgIH0KICAgfQogICByZXR1cm4gbnVsbHB0cjsKIH0KIAorc3RhdGljIGNvbnN0IEFpZGxBbm5vdGF0aW9uKiBHZXRTY29wZWRBbm5vdGF0aW9uKGNvbnN0IEFpZGxEZWZpbmVkVHlwZSYgZGVmaW5lZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFpZGxBbm5vdGF0aW9uOjpUeXBlIHR5cGUpIHsKKyAgY29uc3QgQWlkbEFubm90YXRpb24qIGFubm90YXRpb24gPSBHZXRBbm5vdGF0aW9uKGRlZmluZWRfdHlwZS5HZXRBbm5vdGF0aW9ucygpLCB0eXBlKTsKKyAgaWYgKGFubm90YXRpb24pIHsKKyAgICByZXR1cm4gYW5ub3RhdGlvbjsKKyAgfQorICBjb25zdCBBaWRsRGVmaW5lZFR5cGUqIGVuY2xvc2luZ190eXBlID0gZGVmaW5lZF90eXBlLkdldFBhcmVudFR5cGUoKTsKKyAgaWYgKGVuY2xvc2luZ190eXBlKSB7CisgICAgcmV0dXJuIEdldFNjb3BlZEFubm90YXRpb24oKmVuY2xvc2luZ190eXBlLCB0eXBlKTsKKyAgfQorICByZXR1cm4gbnVsbHB0cjsKK30KKwogQWlkbEFubm90YXRhYmxlOjpBaWRsQW5ub3RhdGFibGUoY29uc3QgQWlkbExvY2F0aW9uJiBsb2NhdGlvbiwgY29uc3QgQ29tbWVudHMmIGNvbW1lbnRzKQogICAgIDogQWlkbENvbW1lbnRhYmxlKGxvY2F0aW9uLCBjb21tZW50cykge30KIApAQCAtMzQ5LDYgKzQzNCwxNCBAQAogICByZXR1cm4gR2V0QW5ub3RhdGlvbihhbm5vdGF0aW9uc18sIEFpZGxBbm5vdGF0aW9uOjpUeXBlOjpOVUxMQUJMRSk7CiB9CiAKK2Jvb2wgQWlkbEFubm90YXRhYmxlOjpJc0hlYXBOdWxsYWJsZSgpIGNvbnN0IHsKKyAgYXV0byBhbm5vdCA9IEdldEFubm90YXRpb24oYW5ub3RhdGlvbnNfLCBBaWRsQW5ub3RhdGlvbjo6VHlwZTo6TlVMTEFCTEUpOworICBpZiAoYW5ub3QpIHsKKyAgICByZXR1cm4gYW5ub3QtPlBhcmFtVmFsdWU8Ym9vbD4oImhlYXAiKS52YWx1ZV9vcihmYWxzZSk7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCiBib29sIEFpZGxBbm5vdGF0YWJsZTo6SXNVdGY4SW5DcHAoKSBjb25zdCB7CiAgIHJldHVybiBHZXRBbm5vdGF0aW9uKGFubm90YXRpb25zXywgQWlkbEFubm90YXRpb246OlR5cGU6OlVURjhfSU5fQ1BQKTsKIH0KQEAgLTM1OCw3ICs0NTEsOSBAQAogfQogCiBib29sIEFpZGxBbm5vdGF0YWJsZTo6SXNWaW50ZlN0YWJpbGl0eSgpIGNvbnN0IHsKLSAgcmV0dXJuIEdldEFubm90YXRpb24oYW5ub3RhdGlvbnNfLCBBaWRsQW5ub3RhdGlvbjo6VHlwZTo6VklOVEZfU1RBQklMSVRZKTsKKyAgYXV0byBkZWZpbmVkX3R5cGUgPSBBaWRsQ2FzdDxBaWRsRGVmaW5lZFR5cGU+KCp0aGlzKTsKKyAgQUlETF9GQVRBTF9JRighZGVmaW5lZF90eXBlLCAqdGhpcykgPDwgIkBWaW50ZlN0YWJpbGl0eSBpcyBub3QgYXR0YWNoZWQgdG8gYSB0eXBlIjsKKyAgcmV0dXJuIEdldFNjb3BlZEFubm90YXRpb24oKmRlZmluZWRfdHlwZSwgQWlkbEFubm90YXRpb246OlR5cGU6OlZJTlRGX1NUQUJJTElUWSk7CiB9CiAKIGJvb2wgQWlkbEFubm90YXRhYmxlOjpJc0phdmFPbmx5SW1tdXRhYmxlKCkgY29uc3QgewpAQCAtMzkxLDE1ICs0ODYsMzcgQEAKICAgcmV0dXJuIHt9OwogfQogCisvLyBQYXJzZXMgdGhlIEBFbmZvcmNlIGFubm90YXRpb24gZXhwcmVzc2lvbi4KK3N0ZDo6dW5pcXVlX3B0cjxhbmRyb2lkOjphaWRsOjpwZXJtOjpFeHByZXNzaW9uPiBBaWRsQW5ub3RhdGFibGU6OkVuZm9yY2VFeHByZXNzaW9uKCkgY29uc3QgeworICBhdXRvIGFubm90ID0gR2V0QW5ub3RhdGlvbihhbm5vdGF0aW9uc18sIEFpZGxBbm5vdGF0aW9uOjpUeXBlOjpQRVJNSVNTSU9OX0VORk9SQ0UpOworICBpZiAoYW5ub3QpIHsKKyAgICBhdXRvIHBlcm1fZXhwciA9IGFubm90LT5FbmZvcmNlRXhwcmVzc2lvbigpOworICAgIGlmICghcGVybV9leHByLm9rKCkpIHsKKyAgICAgIC8vIFRoaXMgc2hvdWxkIGhhdmUgYmVlbiBjYXVnaHQgZHVyaW5nIHZhbGlkYXRpb24uCisgICAgICBBSURMX0ZBVEFMKHRoaXMpIDw8ICJVbmFibGUgdG8gcGFyc2UgQEVuZm9yY2VQZXJtaXNzaW9uIGFubm90YXRpb246ICIgPDwgcGVybV9leHByLmVycm9yKCk7CisgICAgfQorICAgIHJldHVybiBzdGQ6Om1vdmUocGVybV9leHByLnZhbHVlKCkpOworICB9CisgIHJldHVybiB7fTsKK30KKworYm9vbCBBaWRsQW5ub3RhdGFibGU6OklzUGVybWlzc2lvbk1hbnVhbCgpIGNvbnN0IHsKKyAgcmV0dXJuIEdldEFubm90YXRpb24oYW5ub3RhdGlvbnNfLCBBaWRsQW5ub3RhdGlvbjo6VHlwZTo6UEVSTUlTU0lPTl9NQU5VQUwpOworfQorCitib29sIEFpZGxBbm5vdGF0YWJsZTo6SXNQZXJtaXNzaW9uTm9uZSgpIGNvbnN0IHsKKyAgcmV0dXJuIEdldEFubm90YXRpb24oYW5ub3RhdGlvbnNfLCBBaWRsQW5ub3RhdGlvbjo6VHlwZTo6UEVSTUlTU0lPTl9OT05FKTsKK30KKworYm9vbCBBaWRsQW5ub3RhdGFibGU6OklzUHJvcGFnYXRlQWxsb3dCbG9ja2luZygpIGNvbnN0IHsKKyAgcmV0dXJuIEdldEFubm90YXRpb24oYW5ub3RhdGlvbnNfLCBBaWRsQW5ub3RhdGlvbjo6VHlwZTo6UFJPUEFHQVRFX0FMTE9XX0JMT0NLSU5HKTsKK30KKwogYm9vbCBBaWRsQW5ub3RhdGFibGU6OklzU3RhYmxlQXBpUGFyY2VsYWJsZShPcHRpb25zOjpMYW5ndWFnZSBsYW5nKSBjb25zdCB7CiAgIHJldHVybiBsYW5nID09IE9wdGlvbnM6Okxhbmd1YWdlOjpKQVZBICYmCiAgICAgICAgICBHZXRBbm5vdGF0aW9uKGFubm90YXRpb25zXywgQWlkbEFubm90YXRpb246OlR5cGU6OkpBVkFfU1RBQkxFX1BBUkNFTEFCTEUpOwogfQogCi1ib29sIEFpZGxBbm5vdGF0YWJsZTo6SXNIaWRlKCkgY29uc3QgewotICByZXR1cm4gR2V0QW5ub3RhdGlvbihhbm5vdGF0aW9uc18sIEFpZGxBbm5vdGF0aW9uOjpUeXBlOjpISURFKTsKLX0KLQogYm9vbCBBaWRsQW5ub3RhdGFibGU6OkphdmFEZXJpdmUoY29uc3Qgc3RkOjpzdHJpbmcmIG1ldGhvZCkgY29uc3QgewogICBhdXRvIGFubm90YXRpb24gPSBHZXRBbm5vdGF0aW9uKGFubm90YXRpb25zXywgQWlkbEFubm90YXRpb246OlR5cGU6OkpBVkFfREVSSVZFKTsKICAgaWYgKGFubm90YXRpb24gIT0gbnVsbHB0cikgewpAQCAtNDEyLDYgKzUyOSwxMCBAQAogICByZXR1cm4gR2V0QW5ub3RhdGlvbihhbm5vdGF0aW9uc18sIEFpZGxBbm5vdGF0aW9uOjpUeXBlOjpKQVZBX0RFRkFVTFQpOwogfQogCitib29sIEFpZGxBbm5vdGF0YWJsZTo6SXNKYXZhRGVsZWdhdG9yKCkgY29uc3QgeworICByZXR1cm4gR2V0QW5ub3RhdGlvbihhbm5vdGF0aW9uc18sIEFpZGxBbm5vdGF0aW9uOjpUeXBlOjpKQVZBX0RFTEVHQVRPUik7Cit9CisKIHN0ZDo6c3RyaW5nIEFpZGxBbm5vdGF0YWJsZTo6R2V0RGVzY3JpcHRvcigpIGNvbnN0IHsKICAgYXV0byBhbm5vdGF0aW9uID0gR2V0QW5ub3RhdGlvbihhbm5vdGF0aW9uc18sIEFpZGxBbm5vdGF0aW9uOjpUeXBlOjpERVNDUklQVE9SKTsKICAgaWYgKGFubm90YXRpb24gIT0gbnVsbHB0cikgewpAQCAtNDIyLDE2ICs1NDMsMTcgQEAKIAogYm9vbCBBaWRsQW5ub3RhdGFibGU6OkNoZWNrVmFsaWQoY29uc3QgQWlkbFR5cGVuYW1lcyYpIGNvbnN0IHsKICAgZm9yIChjb25zdCBhdXRvJiBhbm5vdGF0aW9uIDogR2V0QW5ub3RhdGlvbnMoKSkgewotICAgIGlmICghYW5ub3RhdGlvbi5DaGVja1ZhbGlkKCkpIHsKKyAgICBpZiAoIWFubm90YXRpb24tPkNoZWNrVmFsaWQoKSkgewogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgfQogCiAgIHN0ZDo6bWFwPEFpZGxBbm5vdGF0aW9uOjpUeXBlLCBBaWRsTG9jYXRpb24+IGRlY2xhcmVkOwogICBmb3IgKGNvbnN0IGF1dG8mIGFubm90YXRpb24gOiBHZXRBbm5vdGF0aW9ucygpKSB7Ci0gICAgY29uc3QgYXV0byYgW2l0ZXIsIGluc2VydGVkXSA9IGRlY2xhcmVkLmVtcGxhY2UoYW5ub3RhdGlvbi5HZXRUeXBlKCksIGFubm90YXRpb24uR2V0TG9jYXRpb24oKSk7Ci0gICAgaWYgKCFpbnNlcnRlZCAmJiAhYW5ub3RhdGlvbi5SZXBlYXRhYmxlKCkpIHsKLSAgICAgIEFJRExfRVJST1IodGhpcykgPDwgIiciIDw8IGFubm90YXRpb24uR2V0TmFtZSgpCisgICAgY29uc3QgYXV0byYgW2l0ZXIsIGluc2VydGVkXSA9CisgICAgICAgIGRlY2xhcmVkLmVtcGxhY2UoYW5ub3RhdGlvbi0+R2V0VHlwZSgpLCBhbm5vdGF0aW9uLT5HZXRMb2NhdGlvbigpKTsKKyAgICBpZiAoIWluc2VydGVkICYmICFhbm5vdGF0aW9uLT5SZXBlYXRhYmxlKCkpIHsKKyAgICAgIEFJRExfRVJST1IodGhpcykgPDwgIiciIDw8IGFubm90YXRpb24tPkdldE5hbWUoKQogICAgICAgICAgICAgICAgICAgICAgICA8PCAiJyBpcyByZXBlYXRlZCwgYnV0IG5vdCBhbGxvd2VkLiBQcmV2aW91cyBsb2NhdGlvbjogIiA8PCBpdGVyLT5zZWNvbmQ7CiAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQpAQCAtNDQzLDMyICs1NjUsNzEgQEAKIHN0cmluZyBBaWRsQW5ub3RhdGFibGU6OlRvU3RyaW5nKCkgY29uc3QgewogICB2ZWN0b3I8c3RyaW5nPiByZXQ7CiAgIGZvciAoY29uc3QgYXV0byYgYSA6IGFubm90YXRpb25zXykgewotICAgIHJldC5lbXBsYWNlX2JhY2soYS5Ub1N0cmluZygpKTsKKyAgICByZXQuZW1wbGFjZV9iYWNrKGEtPlRvU3RyaW5nKCkpOwogICB9CiAgIHN0ZDo6c29ydChyZXQuYmVnaW4oKSwgcmV0LmVuZCgpKTsKICAgcmV0dXJuIEpvaW4ocmV0LCAiICIpOwogfQogCiBBaWRsVHlwZVNwZWNpZmllcjo6QWlkbFR5cGVTcGVjaWZpZXIoY29uc3QgQWlkbExvY2F0aW9uJiBsb2NhdGlvbiwgY29uc3Qgc3RyaW5nJiB1bnJlc29sdmVkX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19hcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9wdGlvbmFsPEFycmF5VHlwZT4gYXJyYXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPHVuaXF1ZV9wdHI8QWlkbFR5cGVTcGVjaWZpZXI+PiogdHlwZV9wYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29tbWVudHMmIGNvbW1lbnRzKQogICAgIDogQWlkbEFubm90YXRhYmxlKGxvY2F0aW9uLCBjb21tZW50cyksCiAgICAgICBBaWRsUGFyYW1ldGVyaXphYmxlPHVuaXF1ZV9wdHI8QWlkbFR5cGVTcGVjaWZpZXI+Pih0eXBlX3BhcmFtcyksCiAgICAgICB1bnJlc29sdmVkX25hbWVfKHVucmVzb2x2ZWRfbmFtZSksCi0gICAgICBpc19hcnJheV8oaXNfYXJyYXkpLAorICAgICAgYXJyYXlfKHN0ZDo6bW92ZShhcnJheSkpLAogICAgICAgc3BsaXRfbmFtZV8oU3BsaXQodW5yZXNvbHZlZF9uYW1lLCAiLiIpKSB7fQogCi1jb25zdCBBaWRsVHlwZVNwZWNpZmllciYgQWlkbFR5cGVTcGVjaWZpZXI6OkFycmF5QmFzZSgpIGNvbnN0IHsKLSAgQUlETF9GQVRBTF9JRighaXNfYXJyYXlfLCB0aGlzKTsKK3ZvaWQgQWlkbFR5cGVTcGVjaWZpZXI6OlZpZXdBc0FycmF5QmFzZShzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImKT4gZnVuYykgY29uc3QgeworICBBSURMX0ZBVEFMX0lGKCFhcnJheV8uaGFzX3ZhbHVlKCksIHRoaXMpOwogICAvLyBEZWNsYXJpbmcgYXJyYXkgb2YgZ2VuZXJpYyB0eXBlIGNhbm5vdCBoYXBwZW4sIGl0IGlzIGdyYW1tYXIgZXJyb3IuCiAgIEFJRExfRkFUQUxfSUYoSXNHZW5lcmljKCksIHRoaXMpOwogCi0gIGlmICghYXJyYXlfYmFzZV8pIHsKLSAgICBhcnJheV9iYXNlXy5yZXNldChuZXcgQWlkbFR5cGVTcGVjaWZpZXIoKnRoaXMpKTsKLSAgICBhcnJheV9iYXNlXy0+aXNfYXJyYXlfID0gZmFsc2U7CisgIGJvb2wgaXNfbXV0YXRlZCA9IG11dGF0ZWRfOworICBtdXRhdGVkXyA9IHRydWU7CisgIC8vIG11dGF0ZSB0aGUgYXJyYXkgdHlwZSB0byBpdHMgYmFzZSBieSByZW1vdmluZyBhIHNpbmdsZSBkaW1lbnNpb24KKyAgLy8gZS5nLikgVFtdID0+IFQsIFRbTl1bTV0gPT4gVFtNXSAobm90ZSB0aGF0LCBNIGlzIHJlbW92ZWQpCisgIGlmIChJc0ZpeGVkU2l6ZUFycmF5KCkgJiYgc3RkOjpnZXQ8Rml4ZWRTaXplQXJyYXk+KCphcnJheV8pLmRpbWVuc2lvbnMuc2l6ZSgpID4gMSkgeworICAgIGF1dG8mIGRpbWVuc2lvbnMgPSBzdGQ6OmdldDxGaXhlZFNpemVBcnJheT4oKmFycmF5XykuZGltZW5zaW9uczsKKyAgICBhdXRvIGRpbSA9IHN0ZDo6bW92ZShkaW1lbnNpb25zLmZyb250KCkpOworICAgIGRpbWVuc2lvbnMuZXJhc2UoZGltZW5zaW9ucy5iZWdpbigpKTsKKyAgICBmdW5jKCp0aGlzKTsKKyAgICBkaW1lbnNpb25zLmluc2VydChkaW1lbnNpb25zLmJlZ2luKCksIHN0ZDo6bW92ZShkaW0pKTsKKyAgfSBlbHNlIHsKKyAgICBBcnJheVR5cGUgYXJyYXlfdHlwZSA9IHN0ZDo6bW92ZShhcnJheV8udmFsdWUoKSk7CisgICAgYXJyYXlfID0gc3RkOjpudWxsb3B0OworICAgIGZ1bmMoKnRoaXMpOworICAgIGFycmF5XyA9IHN0ZDo6bW92ZShhcnJheV90eXBlKTsKICAgfQotICByZXR1cm4gKmFycmF5X2Jhc2VfOworICBtdXRhdGVkXyA9IGlzX211dGF0ZWQ7Cit9CisKK2Jvb2wgQWlkbFR5cGVTcGVjaWZpZXI6Ok1ha2VBcnJheShBcnJheVR5cGUgYXJyYXlfdHlwZSkgeworICAvLyBUIGJlY29tZXMgVFtdIG9yIFRbTl0KKyAgaWYgKCFJc0FycmF5KCkpIHsKKyAgICBhcnJheV8gPSBzdGQ6Om1vdmUoYXJyYXlfdHlwZSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgLy8gVFtOXSBiZWNvbWVzIFRbTl1bTV0KKyAgaWYgKGF1dG8gZml4ZWRfc2l6ZV9hcnJheSA9IHN0ZDo6Z2V0X2lmPEZpeGVkU2l6ZUFycmF5PigmYXJyYXlfdHlwZSk7CisgICAgICBmaXhlZF9zaXplX2FycmF5ICE9IG51bGxwdHIgJiYgSXNGaXhlZFNpemVBcnJheSgpKSB7CisgICAgLy8gY29uY2F0IGRpbWVuc2lvbnMKKyAgICBmb3IgKGF1dG8mIGRpbSA6IGZpeGVkX3NpemVfYXJyYXktPmRpbWVuc2lvbnMpIHsKKyAgICAgIHN0ZDo6Z2V0PEZpeGVkU2l6ZUFycmF5PigqYXJyYXlfKS5kaW1lbnNpb25zLnB1c2hfYmFjayhzdGQ6Om1vdmUoZGltKSk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworc3RkOjp2ZWN0b3I8aW50MzJfdD4gQWlkbFR5cGVTcGVjaWZpZXI6OkdldEZpeGVkU2l6ZUFycmF5RGltZW5zaW9ucygpIGNvbnN0IHsKKyAgQUlETF9GQVRBTF9JRighSXNGaXhlZFNpemVBcnJheSgpLCAibm90IGEgZml4ZWQtc2l6ZSBhcnJheSIpOworICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBkaW1lbnNpb25zOworICBmb3IgKGNvbnN0IGF1dG8mIGRpbSA6IHN0ZDo6Z2V0PEZpeGVkU2l6ZUFycmF5PihHZXRBcnJheSgpKS5kaW1lbnNpb25zKSB7CisgICAgZGltZW5zaW9ucy5wdXNoX2JhY2soZGltLT5FdmFsdWF0ZWRWYWx1ZTxpbnQzMl90PigpKTsKKyAgfQorICByZXR1cm4gZGltZW5zaW9uczsKIH0KIAogc3RyaW5nIEFpZGxUeXBlU3BlY2lmaWVyOjpTaWduYXR1cmUoKSBjb25zdCB7CkBAIC00ODEsNyArNjQyLDEzIEBACiAgICAgcmV0ICs9ICI8IiArIEpvaW4oYXJnX25hbWVzLCAiLCIpICsgIj4iOwogICB9CiAgIGlmIChJc0FycmF5KCkpIHsKLSAgICByZXQgKz0gIltdIjsKKyAgICBpZiAoSXNGaXhlZFNpemVBcnJheSgpKSB7CisgICAgICBmb3IgKGNvbnN0IGF1dG8mIGRpbSA6IEdldEZpeGVkU2l6ZUFycmF5RGltZW5zaW9ucygpKSB7CisgICAgICAgIHJldCArPSAiWyIgKyBzdGQ6OnRvX3N0cmluZyhkaW0pICsgIl0iOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICByZXQgKz0gIltdIjsKKyAgICB9CiAgIH0KICAgcmV0dXJuIHJldDsKIH0KQEAgLTQ5NSw5ICs2NjIsMTUgQEAKICAgcmV0dXJuIHJldDsKIH0KIAotYm9vbCBBaWRsVHlwZVNwZWNpZmllcjo6UmVzb2x2ZShjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMpIHsKKy8vIFdoZW4gYHNjb3BlYCBpcyBzcGVjaWZpZWQsIG5hbWUgaXMgcmVzb2x2ZWQgZmlyc3QgYmFzZWQgb24gaXQuCisvLyBgc2NvcGVgIGNhbiBiZSBudWxsIGZvciBidWlsdC1pbiB0eXBlcyBhbmQgZnVsbHktcXVhbGlmaWVkIHR5cGVzLgorYm9vbCBBaWRsVHlwZVNwZWNpZmllcjo6UmVzb2x2ZShjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsIGNvbnN0IEFpZGxTY29wZSogc2NvcGUpIHsKICAgQUlETF9GQVRBTF9JRihJc1Jlc29sdmVkKCksIHRoaXMpOwotICBBaWRsVHlwZW5hbWVzOjpSZXNvbHZlZFR5cGVuYW1lIHJlc3VsdCA9IHR5cGVuYW1lcy5SZXNvbHZlVHlwZW5hbWUodW5yZXNvbHZlZF9uYW1lXyk7CisgIHN0ZDo6c3RyaW5nIG5hbWUgPSB1bnJlc29sdmVkX25hbWVfOworICBpZiAoc2NvcGUpIHsKKyAgICBuYW1lID0gc2NvcGUtPlJlc29sdmVOYW1lKG5hbWUpOworICB9CisgIEFpZGxUeXBlbmFtZXM6OlJlc29sdmVkVHlwZW5hbWUgcmVzdWx0ID0gdHlwZW5hbWVzLlJlc29sdmVUeXBlbmFtZShuYW1lKTsKICAgaWYgKHJlc3VsdC5pc19yZXNvbHZlZCkgewogICAgIGZ1bGx5X3F1YWxpZmllZF9uYW1lXyA9IHJlc3VsdC5jYW5vbmljYWxfbmFtZTsKICAgICBzcGxpdF9uYW1lXyA9IFNwbGl0KGZ1bGx5X3F1YWxpZmllZF9uYW1lXywgIi4iKTsKQEAgLTU0NiwyNyArNzE5LDE5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiciOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICB9CisgICAgICBzdGF0aWMgY29uc3QgY2hhcioga0xpc3RVc2FnZSA9CisgICAgICAgICAgIkxpc3Q8VD4gc3VwcG9ydHMgaW50ZXJmYWNlL3BhcmNlbGFibGUvdW5pb24sIFN0cmluZywgSUJpbmRlciwgYW5kIFBhcmNlbEZpbGVEZXNjcmlwdG9yLiI7CiAgICAgICBjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgY29udGFpbmVkX3R5cGUgPSAqR2V0VHlwZVBhcmFtZXRlcnMoKVswXTsKICAgICAgIGlmIChjb250YWluZWRfdHlwZS5Jc0FycmF5KCkpIHsKLSAgICAgICAgQUlETF9FUlJPUih0aGlzKQotICAgICAgICAgICAgPDwgIkxpc3Qgb2YgYXJyYXlzIGlzIG5vdCBzdXBwb3J0ZWQuIExpc3Q8VD4gc3VwcG9ydHMgcGFyY2VsYWJsZS91bmlvbiwgU3RyaW5nLCAiCi0gICAgICAgICAgICAgICAiSUJpbmRlciwgYW5kIFBhcmNlbEZpbGVEZXNjcmlwdG9yLiI7CisgICAgICAgIEFJRExfRVJST1IodGhpcykgPDwgIkxpc3Qgb2YgYXJyYXlzIGlzIG5vdCBzdXBwb3J0ZWQuICIgPDwga0xpc3RVc2FnZTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgfQogICAgICAgY29uc3Qgc3RyaW5nJiBjb250YWluZWRfdHlwZV9uYW1lID0gY29udGFpbmVkX3R5cGUuR2V0TmFtZSgpOwogICAgICAgaWYgKEFpZGxUeXBlbmFtZXM6OklzQnVpbHRpblR5cGVuYW1lKGNvbnRhaW5lZF90eXBlX25hbWUpKSB7CiAgICAgICAgIGlmIChjb250YWluZWRfdHlwZV9uYW1lICE9ICJTdHJpbmciICYmIGNvbnRhaW5lZF90eXBlX25hbWUgIT0gIklCaW5kZXIiICYmCiAgICAgICAgICAgICBjb250YWluZWRfdHlwZV9uYW1lICE9ICJQYXJjZWxGaWxlRGVzY3JpcHRvciIpIHsKLSAgICAgICAgICBBSURMX0VSUk9SKHRoaXMpIDw8ICJMaXN0PCIgPDwgY29udGFpbmVkX3R5cGVfbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIj4gaXMgbm90IHN1cHBvcnRlZC4gTGlzdDxUPiBzdXBwb3J0cyBwYXJjZWxhYmxlL3VuaW9uLCBTdHJpbmcsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJQmluZGVyLCBhbmQgUGFyY2VsRmlsZURlc2NyaXB0b3IuIjsKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7ICAvLyBEZWZpbmVkIHR5cGVzCi0gICAgICAgIGlmICh0eXBlbmFtZXMuR2V0SW50ZXJmYWNlKGNvbnRhaW5lZF90eXBlKSkgewotICAgICAgICAgIEFJRExfRVJST1IodGhpcykgPDwgIkxpc3Q8IiA8PCBjb250YWluZWRfdHlwZV9uYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiPiBpcyBub3Qgc3VwcG9ydGVkLiBMaXN0PFQ+IHN1cHBvcnRzIHBhcmNlbGFibGUvdW5pb24sIFN0cmluZywgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklCaW5kZXIsIGFuZCBQYXJjZWxGaWxlRGVzY3JpcHRvci4iOworICAgICAgICAgIEFJRExfRVJST1IodGhpcykgPDwgIkxpc3Q8IiA8PCBjb250YWluZWRfdHlwZV9uYW1lIDw8ICI+IGlzIG5vdCBzdXBwb3J0ZWQuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGtMaXN0VXNhZ2U7CiAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICB9CkBAIC02MTMsMTMgKzc3OCw5IEBACiAgIH0KIAogICBpZiAoSXNBcnJheSgpKSB7Ci0gICAgY29uc3QgYXV0byBkZWZpbmVkX3R5cGUgPSB0eXBlbmFtZXMuVHJ5R2V0RGVmaW5lZFR5cGUoR2V0TmFtZSgpKTsKLSAgICBpZiAoZGVmaW5lZF90eXBlICE9IG51bGxwdHIgJiYgZGVmaW5lZF90eXBlLT5Bc0ludGVyZmFjZSgpICE9IG51bGxwdHIpIHsKLSAgICAgIEFJRExfRVJST1IodGhpcykgPDwgIkJpbmRlciB0eXBlIGNhbm5vdCBiZSBhbiBhcnJheSI7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmIChHZXROYW1lKCkgPT0gIlBhcmNlbGFibGVIb2xkZXIiKSB7Ci0gICAgICBBSURMX0VSUk9SKHRoaXMpIDw8ICJBcnJheXMgb2YgUGFyY2VsYWJsZUhvbGRlciBhcmUgbm90IHN1cHBvcnRlZC4iOworICAgIGlmIChHZXROYW1lKCkgPT0gIlBhcmNlbGFibGVIb2xkZXIiIHx8IEdldE5hbWUoKSA9PSAiTGlzdCIgfHwgR2V0TmFtZSgpID09ICJNYXAiIHx8CisgICAgICAgIEdldE5hbWUoKSA9PSAiQ2hhclNlcXVlbmNlIikgeworICAgICAgQUlETF9FUlJPUih0aGlzKSA8PCAiQXJyYXlzIG9mICIgPDwgR2V0TmFtZSgpIDw8ICIgYXJlIG5vdCBzdXBwb3J0ZWQuIjsKICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgIH0KQEAgLTYzOCwyMiArNzk5LDYxIEBACiAgICAgICBBSURMX0VSUk9SKHRoaXMpIDw8ICJQYXJjZWxhYmxlSG9sZGVyIGNhbm5vdCBiZSBudWxsYWJsZS4iOwogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KKyAgICBpZiAoSXNIZWFwTnVsbGFibGUoKSkgeworICAgICAgaWYgKCFkZWZpbmVkX3R5cGUgfHwgSXNBcnJheSgpIHx8ICFkZWZpbmVkX3R5cGUtPkFzUGFyY2VsYWJsZSgpKSB7CisgICAgICAgIEFJRExfRVJST1IodGhpcykgPDwgIkBudWxsYWJsZShoZWFwPXRydWUpIGlzIGF2YWlsYWJsZSB0byBwYXJjZWxhYmxlcy4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKElzRml4ZWRTaXplQXJyYXkoKSkgeworICAgIGZvciAoY29uc3QgYXV0byYgZGltIDogc3RkOjpnZXQ8Rml4ZWRTaXplQXJyYXk+KEdldEFycmF5KCkpLmRpbWVuc2lvbnMpIHsKKyAgICAgIGlmICghZGltLT5FdmFsdWF0ZSgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGlmIChkaW0tPkdldFR5cGUoKSA+IEFpZGxDb25zdGFudFZhbHVlOjpUeXBlOjpJTlQzMikgeworICAgICAgICBBSURMX0VSUk9SKHRoaXMpIDw8ICJBcnJheSBzaXplIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXI6ICIgPDwgZGltLT5MaXRlcmFsKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGF1dG8gdmFsdWUgPSBkaW0tPkV2YWx1YXRlZFZhbHVlPGludDMyX3Q+KCk7CisgICAgICBpZiAodmFsdWUgPCAwKSB7CisgICAgICAgIEFJRExfRVJST1IodGhpcykgPDwgIkFycmF5IHNpemUgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlcjogIiA8PCB2YWx1ZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KICAgfQogICByZXR1cm4gdHJ1ZTsKIH0KIAotc3RkOjpzdHJpbmcgQWlkbENvbnN0YW50VmFsdWVEZWNvcmF0b3IoY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcmF3X3ZhbHVlKSB7Ci0gIGlmICh0eXBlLklzQXJyYXkoKSkgewotICAgIHJldHVybiByYXdfdmFsdWU7Cit2b2lkIEFpZGxUeXBlU3BlY2lmaWVyOjpUcmF2ZXJzZUNoaWxkcmVuKHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBBaWRsTm9kZSYpPiB0cmF2ZXJzZSkgY29uc3QgeworICBBaWRsQW5ub3RhdGFibGU6OlRyYXZlcnNlQ2hpbGRyZW4odHJhdmVyc2UpOworICBpZiAoSXNHZW5lcmljKCkpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHRwIDogR2V0VHlwZVBhcmFtZXRlcnMoKSkgeworICAgICAgdHJhdmVyc2UoKnRwKTsKKyAgICB9CiAgIH0KKyAgaWYgKElzRml4ZWRTaXplQXJyYXkoKSkgeworICAgIGZvciAoY29uc3QgYXV0byYgZGltIDogc3RkOjpnZXQ8Rml4ZWRTaXplQXJyYXk+KEdldEFycmF5KCkpLmRpbWVuc2lvbnMpIHsKKyAgICAgIHRyYXZlcnNlKCpkaW0pOworICAgIH0KKyAgfQorfQogCitzdGQ6OnN0cmluZyBBaWRsQ29uc3RhbnRWYWx1ZURlY29yYXRvcigKKyAgICBjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSwKKyAgICBjb25zdCBzdGQ6OnZhcmlhbnQ8c3RkOjpzdHJpbmcsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPj4mIHJhd192YWx1ZSkgeworICBpZiAodHlwZS5Jc0FycmF5KCkpIHsKKyAgICBjb25zdCBhdXRvJiB2YWx1ZXMgPSBzdGQ6OmdldDxzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4+KHJhd192YWx1ZSk7CisgICAgcmV0dXJuICJ7IiArIEpvaW4odmFsdWVzLCAiLCAiKSArICJ9IjsKKyAgfQorICBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUgPSBzdGQ6OmdldDxzdGQ6OnN0cmluZz4ocmF3X3ZhbHVlKTsKICAgaWYgKGF1dG8gZGVmaW5lZF90eXBlID0gdHlwZS5HZXREZWZpbmVkVHlwZSgpOyBkZWZpbmVkX3R5cGUpIHsKICAgICBhdXRvIGVudW1fdHlwZSA9IGRlZmluZWRfdHlwZS0+QXNFbnVtRGVjbGFyYXRpb24oKTsKLSAgICBBSURMX0ZBVEFMX0lGKCFlbnVtX3R5cGUsIHR5cGUpIDw8ICJJbnZhbGlkIHR5cGUgZm9yIFwiIiA8PCByYXdfdmFsdWUgPDwgIlwiIjsKLSAgICByZXR1cm4gdHlwZS5HZXROYW1lKCkgKyAiLiIgKyByYXdfdmFsdWUuc3Vic3RyKHJhd192YWx1ZS5maW5kX2xhc3Rfb2YoJy4nKSArIDEpOworICAgIEFJRExfRkFUQUxfSUYoIWVudW1fdHlwZSwgdHlwZSkgPDwgIkludmFsaWQgdHlwZSBmb3IgXCIiIDw8IHZhbHVlIDw8ICJcIiI7CisgICAgcmV0dXJuIHR5cGUuR2V0TmFtZSgpICsgIi4iICsgdmFsdWUuc3Vic3RyKHZhbHVlLmZpbmRfbGFzdF9vZignLicpICsgMSk7CiAgIH0KLSAgcmV0dXJuIHJhd192YWx1ZTsKKyAgcmV0dXJuIHZhbHVlOwogfQogCiBBaWRsVmFyaWFibGVEZWNsYXJhdGlvbjo6QWlkbFZhcmlhYmxlRGVjbGFyYXRpb24oY29uc3QgQWlkbExvY2F0aW9uJiBsb2NhdGlvbiwKQEAgLTczMCw4ICs5MzAsOCBAQAogdm9pZCBBaWRsVmFyaWFibGVEZWNsYXJhdGlvbjo6VHJhdmVyc2VDaGlsZHJlbigKICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgQWlkbE5vZGUmKT4gdHJhdmVyc2UpIGNvbnN0IHsKICAgdHJhdmVyc2UoR2V0VHlwZSgpKTsKLSAgaWYgKElzRGVmYXVsdFVzZXJTcGVjaWZpZWQoKSkgewotICAgIHRyYXZlcnNlKCpHZXREZWZhdWx0VmFsdWUoKSk7CisgIGlmIChhdXRvIGRlZmF1bHRfdmFsdWUgPSBHZXREZWZhdWx0VmFsdWUoKTsgZGVmYXVsdF92YWx1ZSkgeworICAgIHRyYXZlcnNlKCpkZWZhdWx0X3ZhbHVlKTsKICAgfQogfQogCkBAIC04MjksNyArMTAyOSw3IEBACiB9CiAKIEFpZGxNZW1iZXI6OkFpZGxNZW1iZXIoY29uc3QgQWlkbExvY2F0aW9uJiBsb2NhdGlvbiwgY29uc3QgQ29tbWVudHMmIGNvbW1lbnRzKQotICAgIDogQWlkbENvbW1lbnRhYmxlKGxvY2F0aW9uLCBjb21tZW50cykge30KKyAgICA6IEFpZGxBbm5vdGF0YWJsZShsb2NhdGlvbiwgY29tbWVudHMpIHt9CiAKIEFpZGxDb25zdGFudERlY2xhcmF0aW9uOjpBaWRsQ29uc3RhbnREZWNsYXJhdGlvbihjb25zdCBBaWRsTG9jYXRpb24mIGxvY2F0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFpZGxUeXBlU3BlY2lmaWVyKiB0eXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKQEAgLTg2MywyMCArMTA2MywxOSBAQAogQWlkbE1ldGhvZDo6QWlkbE1ldGhvZChjb25zdCBBaWRsTG9jYXRpb24mIGxvY2F0aW9uLCBib29sIG9uZXdheSwgQWlkbFR5cGVTcGVjaWZpZXIqIHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QWlkbEFyZ3VtZW50Pj4qIGFyZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbW1lbnRzJiBjb21tZW50cykKLSAgICA6IEFpZGxNZXRob2QobG9jYXRpb24sIG9uZXdheSwgdHlwZSwgbmFtZSwgYXJncywgY29tbWVudHMsIDAsIHRydWUpIHsKKyAgICA6IEFpZGxNZXRob2QobG9jYXRpb24sIG9uZXdheSwgdHlwZSwgbmFtZSwgYXJncywgY29tbWVudHMsIDApIHsKICAgaGFzX2lkXyA9IGZhbHNlOwogfQogCiBBaWRsTWV0aG9kOjpBaWRsTWV0aG9kKGNvbnN0IEFpZGxMb2NhdGlvbiYgbG9jYXRpb24sIGJvb2wgb25ld2F5LCBBaWRsVHlwZVNwZWNpZmllciogdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxBaWRsQXJndW1lbnQ+PiogYXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29tbWVudHMmIGNvbW1lbnRzLCBpbnQgaWQsIGJvb2wgaXNfdXNlcl9kZWZpbmVkKQorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb21tZW50cyYgY29tbWVudHMsIGludCBpZCkKICAgICA6IEFpZGxNZW1iZXIobG9jYXRpb24sIGNvbW1lbnRzKSwKICAgICAgIG9uZXdheV8ob25ld2F5KSwKICAgICAgIHR5cGVfKHR5cGUpLAogICAgICAgbmFtZV8obmFtZSksCiAgICAgICBhcmd1bWVudHNfKHN0ZDo6bW92ZSgqYXJncykpLAotICAgICAgaWRfKGlkKSwKLSAgICAgIGlzX3VzZXJfZGVmaW5lZF8oaXNfdXNlcl9kZWZpbmVkKSB7CisgICAgICBpZF8oaWQpIHsKICAgaGFzX2lkXyA9IHRydWU7CiAgIGRlbGV0ZSBhcmdzOwogICBmb3IgKGNvbnN0IHVuaXF1ZV9wdHI8QWlkbEFyZ3VtZW50PiYgYSA6IGFyZ3VtZW50c18pIHsKQEAgLTkwNiwyNCArMTEwNSw5MSBAQAogICByZXR1cm4gcmV0OwogfQogCitib29sIEFpZGxNZXRob2Q6OkNoZWNrVmFsaWQoY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzKSBjb25zdCB7CisgIGlmICghR2V0VHlwZSgpLkNoZWNrVmFsaWQodHlwZW5hbWVzKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIFRPRE8oYi8xNTY4NzI1ODIpOiBTdXBwb3J0IGl0IHdoZW4gUGFyY2VsYWJsZUhvbGRlciBzdXBwb3J0cyBldmVyeSBiYWNrZW5kLgorICBpZiAoR2V0VHlwZSgpLkdldE5hbWUoKSA9PSAiUGFyY2VsYWJsZUhvbGRlciIpIHsKKyAgICBBSURMX0VSUk9SKHRoaXMpIDw8ICJQYXJjZWxhYmxlSG9sZGVyIGNhbm5vdCBiZSBhIHJldHVybiB0eXBlIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKElzT25ld2F5KCkgJiYgR2V0VHlwZSgpLkdldE5hbWUoKSAhPSAidm9pZCIpIHsKKyAgICBBSURMX0VSUk9SKHRoaXMpIDw8ICJvbmV3YXkgbWV0aG9kICciIDw8IEdldE5hbWUoKSA8PCAiJyBjYW5ub3QgcmV0dXJuIGEgdmFsdWUiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHNldDxzdHJpbmc+IGFyZ3VtZW50X25hbWVzOworICBmb3IgKGNvbnN0IGF1dG8mIGFyZyA6IEdldEFyZ3VtZW50cygpKSB7CisgICAgYXV0byBpdCA9IGFyZ3VtZW50X25hbWVzLmZpbmQoYXJnLT5HZXROYW1lKCkpOworICAgIGlmIChpdCAhPSBhcmd1bWVudF9uYW1lcy5lbmQoKSkgeworICAgICAgQUlETF9FUlJPUih0aGlzKSA8PCAibWV0aG9kICciIDw8IEdldE5hbWUoKSA8PCAiJyBoYXMgZHVwbGljYXRlIGFyZ3VtZW50IG5hbWUgJyIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgYXJnLT5HZXROYW1lKCkgPDwgIiciOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBhcmd1bWVudF9uYW1lcy5pbnNlcnQoYXJnLT5HZXROYW1lKCkpOworCisgICAgaWYgKCFhcmctPkNoZWNrVmFsaWQodHlwZW5hbWVzKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChJc09uZXdheSgpICYmIGFyZy0+SXNPdXQoKSkgeworICAgICAgQUlETF9FUlJPUih0aGlzKSA8PCAib25ld2F5IG1ldGhvZCAnIiA8PCB0aGlzLT5HZXROYW1lKCkgPDwgIicgY2Fubm90IGhhdmUgb3V0IHBhcmFtZXRlcnMiOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIGNoZWNrIHRoYXQgdGhlIG5hbWUgZG9lc24ndCBtYXRjaCBhIGtleXdvcmQKKyAgICBpZiAoSXNKYXZhS2V5d29yZChhcmctPkdldE5hbWUoKS5jX3N0cigpKSkgeworICAgICAgQUlETF9FUlJPUihhcmcpIDw8ICJBcmd1bWVudCBuYW1lIGlzIGEgSmF2YSBvciBhaWRsIGtleXdvcmQiOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIFJlc2VydmUgYSBuYW1lc3BhY2UgZm9yIGludGVybmFsIHVzZQorICAgIGlmIChhbmRyb2lkOjpiYXNlOjpTdGFydHNXaXRoKGFyZy0+R2V0TmFtZSgpLCAiX2FpZGwiKSkgeworICAgICAgQUlETF9FUlJPUihhcmcpIDw8ICJBcmd1bWVudCBuYW1lIGNhbm5vdCBiZWdpbiB3aXRoICdfYWlkbCciOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChhcmctPkdldFR5cGUoKS5HZXROYW1lKCkgPT0gInZvaWQiKSB7CisgICAgICBBSURMX0VSUk9SKGFyZy0+R2V0VHlwZSgpKSA8PCAiJ3ZvaWQnIGlzIGFuIGludmFsaWQgdHlwZSBmb3IgdGhlIHBhcmFtZXRlciAnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgYXJnLT5HZXROYW1lKCkgPDwgIiciOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwogQWlkbERlZmluZWRUeXBlOjpBaWRsRGVmaW5lZFR5cGUoY29uc3QgQWlkbExvY2F0aW9uJiBsb2NhdGlvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb21tZW50cyYgY29tbWVudHMsIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYWNrYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFpZGxNZW1iZXI+PiogbWVtYmVycykKLSAgICA6IEFpZGxBbm5vdGF0YWJsZShsb2NhdGlvbiwgY29tbWVudHMpLAotICAgICAgbmFtZV8obmFtZSksCi0gICAgICBwYWNrYWdlXyhwYWNrYWdlKSwKLSAgICAgIHNwbGl0X3BhY2thZ2VfKHBhY2thZ2UuZW1wdHkoKSA/IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBhbmRyb2lkOjpiYXNlOjpTcGxpdChwYWNrYWdlLCAiLiIpKSB7CisgICAgOiBBaWRsTWVtYmVyKGxvY2F0aW9uLCBjb21tZW50cyksIEFpZGxTY29wZSh0aGlzKSwgbmFtZV8obmFtZSksIHBhY2thZ2VfKHBhY2thZ2UpIHsKKyAgLy8gYWRqdXN0IG5hbWUvcGFja2FnZSB3aGVuIG5hbWUgaXMgZnVsbHkgcXVhbGlmaWVkIChmb3IgcHJlcHJvY2Vzc2VkIGZpbGVzKQorICBpZiAocGFja2FnZV8uZW1wdHkoKSAmJiBuYW1lXy5maW5kKCcuJykgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAvLyBOb3RlIHRoYXQgdGhpcyBsb2dpYyBpcyBhYnNvbHV0ZWx5IHdyb25nLiAgR2l2ZW4gYSBwYXJjZWxhYmxlCisgICAgLy8gb3JnLnNvbWUuRm9vLkJhciwgdGhlIGNsYXNzIG5hbWUgaXMgRm9vLkJhciwgYnV0IHRoaXMgY29kZSB3aWxsIGNsYWltIHRoYXQKKyAgICAvLyB0aGUgY2xhc3MgaXMganVzdCBCYXIuICBIb3dldmVyLCB0aGlzIHdhcyB0aGUgd2F5IGl0IHdhcyBkb25lIGluIHRoZSBwYXN0LgorICAgIC8vCisgICAgLy8gU2VlIGIvMTc0MTU2OTIKKyAgICBhdXRvIHBvcyA9IG5hbWUucmZpbmQoJy4nKTsKKyAgICAvLyBuYW1lIGlzIHRoZSBsYXN0IHBhcnQuCisgICAgbmFtZV8gPSBuYW1lLnN1YnN0cihwb3MgKyAxKTsKKyAgICAvLyBwYWNrYWdlIGlzIHRoZSBpbml0aWFsIHBhcnRzIChleGNlcHQgdGhlIGxhc3QpLgorICAgIHBhY2thZ2VfID0gbmFtZS5zdWJzdHIoMCwgcG9zKTsKKyAgfQogICBpZiAobWVtYmVycykgewogICAgIGZvciAoYXV0byYgbSA6ICptZW1iZXJzKSB7Ci0gICAgICBpZiAoYXV0byBjb25zdGFudCA9IG0tPkFzQ29uc3RhbnREZWNsYXJhdGlvbigpOyBjb25zdGFudCkgeworICAgICAgaWYgKGF1dG8gY29uc3RhbnQgPSBBaWRsQ2FzdDxBaWRsQ29uc3RhbnREZWNsYXJhdGlvbj4oKm0pOyBjb25zdGFudCkgewogICAgICAgICBjb25zdGFudHNfLmVtcGxhY2VfYmFjayhjb25zdGFudCk7Ci0gICAgICB9IGVsc2UgaWYgKGF1dG8gdmFyaWFibGUgPSBtLT5Bc1ZhcmlhYmxlRGVjbGFyYXRpb24oKTsgdmFyaWFibGUpIHsKKyAgICAgIH0gZWxzZSBpZiAoYXV0byB2YXJpYWJsZSA9IEFpZGxDYXN0PEFpZGxWYXJpYWJsZURlY2xhcmF0aW9uPigqbSk7IHZhcmlhYmxlKSB7CiAgICAgICAgIHZhcmlhYmxlc18uZW1wbGFjZV9iYWNrKHZhcmlhYmxlKTsKLSAgICAgIH0gZWxzZSBpZiAoYXV0byBtZXRob2QgPSBtLT5Bc01ldGhvZCgpOyBtZXRob2QpIHsKKyAgICAgIH0gZWxzZSBpZiAoYXV0byBtZXRob2QgPSBBaWRsQ2FzdDxBaWRsTWV0aG9kPigqbSk7IG1ldGhvZCkgewogICAgICAgICBtZXRob2RzXy5lbXBsYWNlX2JhY2sobWV0aG9kKTsKKyAgICAgIH0gZWxzZSBpZiAoYXV0byB0eXBlID0gQWlkbENhc3Q8QWlkbERlZmluZWRUeXBlPigqbSk7IHR5cGUpIHsKKyAgICAgICAgdHlwZS0+U2V0RW5jbG9zaW5nU2NvcGUodGhpcyk7CisgICAgICAgIHR5cGVzXy5lbXBsYWNlX2JhY2sodHlwZSk7CiAgICAgICB9IGVsc2UgewotICAgICAgICBBSURMX0ZBVEFMKCptKTsKKyAgICAgICAgQUlETF9GQVRBTCgqbSkgPDwgIlVua25vd24gbWVtYmVyIHR5cGUuIjsKICAgICAgIH0KICAgICAgIG1lbWJlcnNfLnB1c2hfYmFjayhtLnJlbGVhc2UoKSk7CiAgICAgfQpAQCAtOTQyLDYgKzEyMDgsOSBAQAogfQogCiBzdGQ6OnN0cmluZyBBaWRsRGVmaW5lZFR5cGU6OkdldENhbm9uaWNhbE5hbWUoKSBjb25zdCB7CisgIGlmIChhdXRvIHBhcmVudCA9IEdldFBhcmVudFR5cGUoKTsgcGFyZW50KSB7CisgICAgcmV0dXJuIHBhcmVudC0+R2V0Q2Fub25pY2FsTmFtZSgpICsgIi4iICsgR2V0TmFtZSgpOworICB9CiAgIGlmIChwYWNrYWdlXy5lbXB0eSgpKSB7CiAgICAgcmV0dXJuIEdldE5hbWUoKTsKICAgfQpAQCAtOTUxLDYgKzEyMjAsNDQgQEAKIGJvb2wgQWlkbERlZmluZWRUeXBlOjpDaGVja1ZhbGlkV2l0aE1lbWJlcnMoY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzKSBjb25zdCB7CiAgIGJvb2wgc3VjY2VzcyA9IHRydWU7CiAKKyAgZm9yIChjb25zdCBhdXRvJiB0IDogR2V0TmVzdGVkVHlwZXMoKSkgeworICAgIHN1Y2Nlc3MgPSBzdWNjZXNzICYmIHQtPkNoZWNrVmFsaWQodHlwZW5hbWVzKTsKKyAgfQorCisgIGlmIChhdXRvIHBhcmFtZXRlcml6YWJsZSA9IEFzUGFyYW1ldGVyaXphYmxlKCk7CisgICAgICBwYXJhbWV0ZXJpemFibGUgJiYgcGFyYW1ldGVyaXphYmxlLT5Jc0dlbmVyaWMoKSAmJiAhR2V0TmVzdGVkVHlwZXMoKS5lbXB0eSgpKSB7CisgICAgQUlETF9FUlJPUih0aGlzKSA8PCAiR2VuZXJpYyB0eXBlcyBjYW4ndCBoYXZlIG5lc3RlZCB0eXBlcy4iOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBuZXN0ZWRfdHlwZV9uYW1lczsKKyAgZm9yIChjb25zdCBhdXRvJiB0IDogR2V0TmVzdGVkVHlwZXMoKSkgeworICAgIGJvb2wgZHVwbGljYXRlZCA9ICFuZXN0ZWRfdHlwZV9uYW1lcy5lbXBsYWNlKHQtPkdldE5hbWUoKSkuc2Vjb25kOworICAgIGlmIChkdXBsaWNhdGVkKSB7CisgICAgICBBSURMX0VSUk9SKHQpIDw8ICJSZWRlZmluaXRpb24gb2YgJyIgPDwgdC0+R2V0TmFtZSgpIDw8ICInLiI7CisgICAgICBzdWNjZXNzID0gZmFsc2U7CisgICAgfQorICAgIC8vIG5lc3RlZCB0eXBlIGNhbid0IGhhdmUgYSBwYXJlbnQgbmFtZQorICAgIGlmICh0LT5HZXROYW1lKCkgPT0gR2V0TmFtZSgpKSB7CisgICAgICBBSURMX0VSUk9SKHQpIDw8ICJOZXN0ZWQgdHlwZSAnIiA8PCBHZXROYW1lKCkgPDwgIicgaGFzIHRoZSBzYW1lIG5hbWUgYXMgaXRzIHBhcmVudC4iOworICAgICAgc3VjY2VzcyA9IGZhbHNlOworICAgIH0KKyAgICAvLyBIYXZpbmcgdW5zdHJ1Y3R1cmVkIHBhcmNlbGFibGVzIGFzIG5lc3RlZCB0eXBlcyBkb2Vzbid0IG1ha2Ugc2Vuc2UgYmVjYXVzZSB0aGV5IGFyZSBkZWZpbmVkCisgICAgLy8gc29tZXdoZXJlIGVsc2UgaW4gbmF0aXZlIGxhbmd1YWdlcyAoZS5nLiBDKyssIEphdmEuLi4pLgorICAgIGlmIChBaWRsQ2FzdDxBaWRsUGFyY2VsYWJsZT4oKnQpKSB7CisgICAgICBBSURMX0VSUk9SKHQpIDw8ICInIiA8PCB0LT5HZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgPDwgIicgaXMgbmVzdGVkLiBVbnN0cnVjdHVyZWQgcGFyY2VsYWJsZXMgc2hvdWxkIGJlIGF0IHRoZSByb290IHNjb3BlLiI7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgaWYgKCFUb3BvbG9naWNhbFZpc2l0KEdldE5lc3RlZFR5cGVzKCksIFtdKGF1dG8mKSB7fSkpIHsKKyAgICBBSURMX0VSUk9SKHRoaXMpIDw8IEdldE5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgPDwgIiBoYXMgbmVzdGVkIHR5cGVzIHdpdGggY3ljbGljIHJlZmVyZW5jZXMuIEMrKyBhbmQgTkRLIGJhY2tlbmRzIGRvbid0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJzdXBwb3J0IGN5Y2xpYyByZWZlcmVuY2VzLiI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKICAgZm9yIChjb25zdCBhdXRvJiB2IDogR2V0RmllbGRzKCkpIHsKICAgICBjb25zdCBib29sIGZpZWxkX3ZhbGlkID0gdi0+Q2hlY2tWYWxpZCh0eXBlbmFtZXMpOwogICAgIHN1Y2Nlc3MgPSBzdWNjZXNzICYmIGZpZWxkX3ZhbGlkOwpAQCAtMTAwNCw2ICsxMzExLDc5IEBACiAgIHJldHVybiBzdWNjZXNzOwogfQogCitjb25zdCBBaWRsRGVmaW5lZFR5cGUqIEFpZGxEZWZpbmVkVHlwZTo6R2V0UGFyZW50VHlwZSgpIGNvbnN0IHsKKyAgQUlETF9GQVRBTF9JRihHZXRFbmNsb3NpbmdTY29wZSgpID09IG51bGxwdHIsIHRoaXMpIDw8ICJTY29wZSBpcyBub3Qgc2V0LiI7CisgIHJldHVybiBBaWRsQ2FzdDxBaWRsRGVmaW5lZFR5cGU+KEdldEVuY2xvc2luZ1Njb3BlKCktPkdldE5vZGUoKSk7Cit9CisKK2NvbnN0IEFpZGxEZWZpbmVkVHlwZSogQWlkbERlZmluZWRUeXBlOjpHZXRSb290VHlwZSgpIGNvbnN0IHsKKyAgY29uc3QgQWlkbERlZmluZWRUeXBlKiByb290ID0gdGhpczsKKyAgZm9yIChhdXRvIHBhcmVudCA9IHJvb3QtPkdldFBhcmVudFR5cGUoKTsgcGFyZW50OyBwYXJlbnQgPSBwYXJlbnQtPkdldFBhcmVudFR5cGUoKSkgeworICAgIHJvb3QgPSBwYXJlbnQ7CisgIH0KKyAgcmV0dXJuIHJvb3Q7Cit9CisKKy8vIFJlc29sdmUgYG5hbWVgIGluIHRoZSBjdXJyZW50IHNjb3BlLiBJZiBub3QgZm91bmQsIGRlbGVnYXRlIHRvIHRoZSBwYXJlbnQKK3N0ZDo6c3RyaW5nIEFpZGxEZWZpbmVkVHlwZTo6UmVzb2x2ZU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIGNvbnN0IHsKKyAgLy8gRm9yIGV4YW1wbGUsIGluIHRoZSBmb2xsb3dpbmcsIHQxJ3MgdHlwZSBCYXogbWVhbnMgeC5Gb28uQmFyLkJhegorICAvLyB3aGlsZSB0MidzIHR5cGUgaXMgeS5CYXouCisgIC8vIHBhY2thZ2UgeDsKKyAgLy8gaW1wb3J0IHkuQmF6OworICAvLyBwYXJjZWxhYmxlIEZvbyB7CisgIC8vICAgcGFyY2VsYWJsZSBCYXIgeworICAvLyAgICAgZW51bSBCYXogeyAuLi4gfQorICAvLyAgICAgQmF6IHQxOyAvLyAtPiBzaG91bGQgYmUgeC5Gb28uQmFyLkJhegorICAvLyAgIH0KKyAgLy8gICBCYXogdDI7IC8vIC0+IHNob3VsZCBiZSB5LkJhegorICAvLyAgIEJhci5CYXogdDM7IC8vIC0+IHNob3VsZCBiZSB4LkZvby5CYXIuQmF6CisgIC8vIH0KKyAgQUlETF9GQVRBTF9JRighR2V0RW5jbG9zaW5nU2NvcGUoKSwgdGhpcykKKyAgICAgIDw8ICJUeXBlIHNob3VsZCBoYXZlIGFuIGVuY2xvc2luZyBzY29wZS4oZS5nLiBBaWRsRG9jdW1lbnQpIjsKKyAgaWYgKEFpZGxUeXBlbmFtZXM6OklzQnVpbHRpblR5cGVuYW1lKG5hbWUpKSB7CisgICAgcmV0dXJuIG5hbWU7CisgIH0KKworICBjb25zdCBhdXRvIGZpcnN0X2RvdCA9IG5hbWUuZmluZF9maXJzdF9vZignLicpOworICAvLyBGb3IgIk91dGVyLklubmVyIiwgd2UgbG9vayB1cCAiT3V0ZXIiIGluIHRoZSBpbXBvcnQgbGlzdC4KKyAgY29uc3Qgc3RkOjpzdHJpbmcgY2xhc3NfbmFtZSA9CisgICAgICAoZmlyc3RfZG90ID09IHN0ZDo6c3RyaW5nOjpucG9zKSA/IG5hbWUgOiBuYW1lLnN1YnN0cigwLCBmaXJzdF9kb3QpOworICAvLyBLZWVwICIuSW5uZXIiLCB0byBtYWtlIGEgZnVsbHktcXVhbGlmaWVkIG5hbWUKKyAgY29uc3Qgc3RkOjpzdHJpbmcgbmVzdGVkX3R5cGUgPSAoZmlyc3RfZG90ID09IHN0ZDo6c3RyaW5nOjpucG9zKSA/ICIiIDogbmFtZS5zdWJzdHIoZmlyc3RfZG90KTsKKworICAvLyBjaGVjayBpZiBpdCBpcyBhIG5lc3RlZCB0eXBlCisgIGZvciAoY29uc3QgYXV0byYgdHlwZSA6IEdldE5lc3RlZFR5cGVzKCkpIHsKKyAgICBpZiAodHlwZS0+R2V0TmFtZSgpID09IGNsYXNzX25hbWUpIHsKKyAgICAgIHJldHVybiB0eXBlLT5HZXRDYW5vbmljYWxOYW1lKCkgKyBuZXN0ZWRfdHlwZTsKKyAgICB9CisgIH0KKworICByZXR1cm4gR2V0RW5jbG9zaW5nU2NvcGUoKS0+UmVzb2x2ZU5hbWUobmFtZSk7Cit9CisKK3RlbXBsYXRlIDw+Citjb25zdCBBaWRsRGVmaW5lZFR5cGUqIEFpZGxDYXN0PEFpZGxEZWZpbmVkVHlwZT4oY29uc3QgQWlkbE5vZGUmIG5vZGUpIHsKKyAgc3RydWN0IFZpc2l0b3IgOiBBaWRsVmlzaXRvciB7CisgICAgY29uc3QgQWlkbERlZmluZWRUeXBlKiBkZWZpbmVkX3R5cGUgPSBudWxscHRyOworICAgIHZvaWQgVmlzaXQoY29uc3QgQWlkbEludGVyZmFjZSYgdCkgb3ZlcnJpZGUgeyBkZWZpbmVkX3R5cGUgPSAmdDsgfQorICAgIHZvaWQgVmlzaXQoY29uc3QgQWlkbEVudW1EZWNsYXJhdGlvbiYgdCkgb3ZlcnJpZGUgeyBkZWZpbmVkX3R5cGUgPSAmdDsgfQorICAgIHZvaWQgVmlzaXQoY29uc3QgQWlkbFN0cnVjdHVyZWRQYXJjZWxhYmxlJiB0KSBvdmVycmlkZSB7IGRlZmluZWRfdHlwZSA9ICZ0OyB9CisgICAgdm9pZCBWaXNpdChjb25zdCBBaWRsVW5pb25EZWNsJiB0KSBvdmVycmlkZSB7IGRlZmluZWRfdHlwZSA9ICZ0OyB9CisgICAgdm9pZCBWaXNpdChjb25zdCBBaWRsUGFyY2VsYWJsZSYgdCkgb3ZlcnJpZGUgeyBkZWZpbmVkX3R5cGUgPSAmdDsgfQorICB9IHY7CisgIG5vZGUuRGlzcGF0Y2hWaXNpdCh2KTsKKyAgcmV0dXJuIHYuZGVmaW5lZF90eXBlOworfQorCitjb25zdCBBaWRsRG9jdW1lbnQmIEFpZGxEZWZpbmVkVHlwZTo6R2V0RG9jdW1lbnQoKSBjb25zdCB7CisgIGNvbnN0IEFpZGxEZWZpbmVkVHlwZSogcm9vdCA9IEdldFJvb3RUeXBlKCk7CisgIGF1dG8gc2NvcGUgPSByb290LT5HZXRFbmNsb3NpbmdTY29wZSgpOworICBBSURMX0ZBVEFMX0lGKCFzY29wZSwgdGhpcykgPDwgIm5vIHNjb3BlIGRlZmluZWQuIjsKKyAgYXV0byBkb2MgPSBBaWRsQ2FzdDxBaWRsRG9jdW1lbnQ+KHNjb3BlLT5HZXROb2RlKCkpOworICBBSURMX0ZBVEFMX0lGKCFkb2MsIHRoaXMpIDw8ICJyb290IHNjb3BlIGlzIG5vdCBhIGRvY3VtZW50LiI7CisgIHJldHVybiAqZG9jOworfQorCiBBaWRsUGFyY2VsYWJsZTo6QWlkbFBhcmNlbGFibGUoY29uc3QgQWlkbExvY2F0aW9uJiBsb2NhdGlvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBhY2thZ2UsIGNvbnN0IENvbW1lbnRzJiBjb21tZW50cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY3BwX2hlYWRlciwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiB0eXBlX3BhcmFtcywKQEAgLTEwMTYsMTMgKzEzOTYsNiBAQAogICAgIGNwcF9oZWFkZXJfID0gY3BwX2hlYWRlcl8uc3Vic3RyKDEsIGNwcF9oZWFkZXJfLmxlbmd0aCgpIC0gMik7CiAgIH0KIH0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotQWlkbFBhcmFtZXRlcml6YWJsZTxUPjo6QWlkbFBhcmFtZXRlcml6YWJsZShjb25zdCBBaWRsUGFyYW1ldGVyaXphYmxlJiBvdGhlcikgewotICAvLyBDb3B5aW5nIGlzIG5vdCBzdXBwb3J0ZWQgaWYgaXQgaGFzIHR5cGUgcGFyYW1ldGVycy4KLSAgLy8gSXQgZG9lc24ndCBtYWtlIGEgcHJvYmxlbSBiZWNhdXNlIG9ubHkgQXJyYXlCYXNlKCkgbWFrZXMgYSBjb3B5LAotICAvLyBhbmQgaXQgY2FuIGJlIGNhbGxlZCBvbmx5IGlmIGEgdHlwZSBpcyBub3QgZ2VuZXJpYy4KLSAgQUlETF9GQVRBTF9JRihvdGhlci5Jc0dlbmVyaWMoKSwgQUlETF9MT0NBVElPTl9IRVJFKTsKLX0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiBib29sIEFpZGxQYXJhbWV0ZXJpemFibGU8VD46OkNoZWNrVmFsaWQoKSBjb25zdCB7CkBAIC0xMDUwLDcgKzE0MjMsMTggQEAKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KIAotICByZXR1cm4gdHJ1ZTsKKyAgYm9vbCBzdWNjZXNzID0gdHJ1ZTsKKyAgaWYgKElzRml4ZWRTaXplKCkpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHYgOiBHZXRGaWVsZHMoKSkgeworICAgICAgaWYgKCF0eXBlbmFtZXMuQ2FuQmVGaXhlZFNpemUodi0+R2V0VHlwZSgpKSkgeworICAgICAgICBBSURMX0VSUk9SKHYpIDw8ICJUaGUgQEZpeGVkU2l6ZSBwYXJjZWxhYmxlICciIDw8IHRoaXMtPkdldE5hbWUoKSA8PCAiJyBoYXMgYSAiCisgICAgICAgICAgICAgICAgICAgICAgPDwgIm5vbi1maXhlZCBzaXplIGZpZWxkIG5hbWVkICIgPDwgdi0+R2V0TmFtZSgpIDw8ICIuIjsKKyAgICAgICAgc3VjY2VzcyA9IGZhbHNlOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBzdWNjZXNzOwogfQogCiBBaWRsU3RydWN0dXJlZFBhcmNlbGFibGU6OkFpZGxTdHJ1Y3R1cmVkUGFyY2VsYWJsZSgKQEAgLTEwNjYsMTYgKzE0NTAsNiBAQAogCiAgIGJvb2wgc3VjY2VzcyA9IHRydWU7CiAKLSAgaWYgKElzRml4ZWRTaXplKCkpIHsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIHYgOiBHZXRGaWVsZHMoKSkgewotICAgICAgaWYgKCF0eXBlbmFtZXMuQ2FuQmVGaXhlZFNpemUodi0+R2V0VHlwZSgpKSkgewotICAgICAgICBBSURMX0VSUk9SKHYpIDw8ICJUaGUgQEZpeGVkU2l6ZSBwYXJjZWxhYmxlICciIDw8IHRoaXMtPkdldE5hbWUoKSA8PCAiJyBoYXMgYSAiCi0gICAgICAgICAgICAgICAgICAgICAgPDwgIm5vbi1maXhlZCBzaXplIGZpZWxkIG5hbWVkICIgPDwgdi0+R2V0TmFtZSgpIDw8ICIuIjsKLSAgICAgICAgc3VjY2VzcyA9IGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgfQotCiAgIGlmIChJc0phdmFPbmx5SW1tdXRhYmxlKCkpIHsKICAgICAvLyBJbW11dGFibGUgcGFyY2VsYWJsZXMgcHJvdmlkZSBnZXR0ZXJzCiAgICAgaWYgKCFDaGVja1ZhbGlkRm9yR2V0dGVyTmFtZXMoKSkgewpAQCAtMTA4Nyw3MyArMTQ2MSwxMiBAQAogfQogCiAvLyBUT0RPOiB3ZSBzaG91bGQgdHJlYXQgZXZlcnkgYmFja2VuZCBhbGwgdGhlIHNhbWUgaW4gZnV0dXJlLgotYm9vbCBBaWRsVHlwZVNwZWNpZmllcjo6TGFuZ3VhZ2VTcGVjaWZpY0NoZWNrVmFsaWQoY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uczo6TGFuZ3VhZ2UgbGFuZykgY29uc3QgewotICBpZiAoSXNHZW5lcmljKCkpIHsKLSAgICBjb25zdCBhdXRvJiB0eXBlcyA9IEdldFR5cGVQYXJhbWV0ZXJzKCk7Ci0gICAgZm9yIChjb25zdCBhdXRvJiBhcmcgOiB0eXBlcykgewotICAgICAgaWYgKCFhcmctPkxhbmd1YWdlU3BlY2lmaWNDaGVja1ZhbGlkKHR5cGVuYW1lcywgbGFuZykpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGlmICgobGFuZyA9PSBPcHRpb25zOjpMYW5ndWFnZTo6TkRLIHx8IGxhbmcgPT0gT3B0aW9uczo6TGFuZ3VhZ2U6OlJVU1QpICYmIElzQXJyYXkoKSAmJgotICAgICAgR2V0TmFtZSgpID09ICJJQmluZGVyIikgewotICAgIEFJRExfRVJST1IodGhpcykgPDwgIlRoZSAiIDw8IHRvX3N0cmluZyhsYW5nKSA8PCAiIGJhY2tlbmQgZG9lcyBub3Qgc3VwcG9ydCBhcnJheSBvZiBJQmluZGVyIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKGxhbmcgPT0gT3B0aW9uczo6TGFuZ3VhZ2U6OlJVU1QgJiYgR2V0TmFtZSgpID09ICJQYXJjZWxhYmxlSG9sZGVyIikgewotICAgIC8vIFRPRE8oYi8xNDY2MTE4NTUpOiBSZW1vdmUgaXQgd2hlbiBSdXN0IGJhY2tlbmQgc3VwcG9ydHMgUGFyY2VsYWJsZUhvbGRlcgotICAgIEFJRExfRVJST1IodGhpcykgPDwgIlRoZSBSdXN0IGJhY2tlbmQgZG9lcyBub3Qgc3VwcG9ydCBQYXJjZWxhYmxlSG9sZGVyIHlldC4iOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoKGxhbmcgPT0gT3B0aW9uczo6TGFuZ3VhZ2U6Ok5ESyB8fCBsYW5nID09IE9wdGlvbnM6Okxhbmd1YWdlOjpSVVNUKSAmJiBJc0FycmF5KCkgJiYKLSAgICAgIElzTnVsbGFibGUoKSkgewotICAgIGlmIChHZXROYW1lKCkgPT0gIlBhcmNlbEZpbGVEZXNjcmlwdG9yIikgewotICAgICAgQUlETF9FUlJPUih0aGlzKSA8PCAiVGhlICIgPDwgdG9fc3RyaW5nKGxhbmcpCi0gICAgICAgICAgICAgICAgICAgICAgIDw8ICIgYmFja2VuZCBkb2VzIG5vdCBzdXBwb3J0IG51bGxhYmxlIGFycmF5IG9mIFBhcmNlbEZpbGVEZXNjcmlwdG9yIjsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBjb25zdCBhdXRvIGRlZmluZWRfdHlwZSA9IHR5cGVuYW1lcy5UcnlHZXREZWZpbmVkVHlwZShHZXROYW1lKCkpOwotICAgIGlmIChkZWZpbmVkX3R5cGUgIT0gbnVsbHB0ciAmJiBkZWZpbmVkX3R5cGUtPkFzUGFyY2VsYWJsZSgpICE9IG51bGxwdHIpIHsKLSAgICAgIEFJRExfRVJST1IodGhpcykgPDwgIlRoZSAiIDw8IHRvX3N0cmluZyhsYW5nKQotICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGJhY2tlbmQgZG9lcyBub3Qgc3VwcG9ydCBudWxsYWJsZSBhcnJheSBvZiBwYXJjZWxhYmxlIjsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KK2Jvb2wgQWlkbFR5cGVTcGVjaWZpZXI6Okxhbmd1YWdlU3BlY2lmaWNDaGVja1ZhbGlkKE9wdGlvbnM6Okxhbmd1YWdlIGxhbmcpIGNvbnN0IHsKICAgaWYgKHRoaXMtPkdldE5hbWUoKSA9PSAiRmlsZURlc2NyaXB0b3IiICYmCiAgICAgICAobGFuZyA9PSBPcHRpb25zOjpMYW5ndWFnZTo6TkRLIHx8IGxhbmcgPT0gT3B0aW9uczo6TGFuZ3VhZ2U6OlJVU1QpKSB7CiAgICAgQUlETF9FUlJPUih0aGlzKSA8PCAiRmlsZURlc2NyaXB0b3IgaXNuJ3Qgc3VwcG9ydGVkIGJ5IHRoZSAiIDw8IHRvX3N0cmluZyhsYW5nKSA8PCAiIGJhY2tlbmQuIjsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KLSAgaWYgKHRoaXMtPklzR2VuZXJpYygpKSB7Ci0gICAgaWYgKHRoaXMtPkdldE5hbWUoKSA9PSAiTGlzdCIpIHsKLSAgICAgIGlmIChsYW5nID09IE9wdGlvbnM6Okxhbmd1YWdlOjpOREspIHsKLSAgICAgICAgY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIGNvbnRhaW5lZF90eXBlID0gKkdldFR5cGVQYXJhbWV0ZXJzKClbMF07Ci0gICAgICAgIGNvbnN0IHN0cmluZyYgY29udGFpbmVkX3R5cGVfbmFtZSA9IGNvbnRhaW5lZF90eXBlLkdldE5hbWUoKTsKLSAgICAgICAgaWYgKHR5cGVuYW1lcy5HZXRJbnRlcmZhY2UoY29udGFpbmVkX3R5cGUpKSB7Ci0gICAgICAgICAgQUlETF9FUlJPUih0aGlzKSA8PCAiTGlzdDwiIDw8IGNvbnRhaW5lZF90eXBlX25hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICI+IGlzIG5vdCBzdXBwb3J0ZWQuIExpc3QgaW4gTkRLIGRvZXNuJ3Qgc3VwcG9ydCBpbnRlcmZhY2UuIjsKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbnRhaW5lZF90eXBlX25hbWUgPT0gIklCaW5kZXIiKSB7Ci0gICAgICAgICAgQUlETF9FUlJPUih0aGlzKSA8PCAiTGlzdDwiIDw8IGNvbnRhaW5lZF90eXBlX25hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICI+IGlzIG5vdCBzdXBwb3J0ZWQuIExpc3QgaW4gTkRLIGRvZXNuJ3Qgc3VwcG9ydCBJQmluZGVyLiI7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaWYgKHRoaXMtPklzQXJyYXkoKSkgewotICAgIGlmICh0aGlzLT5HZXROYW1lKCkgPT0gIkxpc3QiIHx8IHRoaXMtPkdldE5hbWUoKSA9PSAiTWFwIiB8fAotICAgICAgICB0aGlzLT5HZXROYW1lKCkgPT0gIkNoYXJTZXF1ZW5jZSIpIHsKLSAgICAgIEFJRExfRVJST1IodGhpcykgPDwgdGhpcy0+R2V0TmFtZSgpIDw8ICJbXSBpcyBub3Qgc3VwcG9ydGVkLiI7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9CiAKICAgaWYgKGxhbmcgIT0gT3B0aW9uczo6TGFuZ3VhZ2U6OkpBVkEpIHsKICAgICBpZiAodGhpcy0+R2V0TmFtZSgpID09ICJMaXN0IiAmJiAhdGhpcy0+SXNHZW5lcmljKCkpIHsKQEAgLTExNzAsMzMgKzE0ODMsMTcgQEAKIH0KIAogLy8gVE9ETzogd2Ugc2hvdWxkIHRyZWF0IGV2ZXJ5IGJhY2tlbmQgYWxsIHRoZSBzYW1lIGluIGZ1dHVyZS4KLWJvb2wgQWlkbFBhcmNlbGFibGU6Okxhbmd1YWdlU3BlY2lmaWNDaGVja1ZhbGlkKGNvbnN0IEFpZGxUeXBlbmFtZXMmIC8qdHlwZW5hbWVzKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25zOjpMYW5ndWFnZSBsYW5nKSBjb25zdCB7Ci0gIGlmIChsYW5nID09IE9wdGlvbnM6Okxhbmd1YWdlOjpDUFAgfHwgbGFuZyA9PSBPcHRpb25zOjpMYW5ndWFnZTo6TkRLKSB7Ci0gICAgY29uc3QgQWlkbFBhcmNlbGFibGUqIHVuc3RydWN0dXJlZF9wYXJjZWxhYmxlID0gdGhpcy0+QXNVbnN0cnVjdHVyZWRQYXJjZWxhYmxlKCk7Ci0gICAgaWYgKHVuc3RydWN0dXJlZF9wYXJjZWxhYmxlICE9IG51bGxwdHIpIHsKLSAgICAgIGlmICh1bnN0cnVjdHVyZWRfcGFyY2VsYWJsZS0+R2V0Q3BwSGVhZGVyKCkuZW1wdHkoKSkgewotICAgICAgICBBSURMX0VSUk9SKHVuc3RydWN0dXJlZF9wYXJjZWxhYmxlKQotICAgICAgICAgICAgPDwgIlVuc3RydWN0dXJlZCBwYXJjZWxhYmxlIG11c3QgaGF2ZSBDKysgaGVhZGVyIGRlZmluZWQuIjsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQorYm9vbCBBaWRsRGVmaW5lZFR5cGU6Okxhbmd1YWdlU3BlY2lmaWNDaGVja1ZhbGlkKE9wdGlvbnM6Okxhbmd1YWdlIGxhbmcpIGNvbnN0IHsKKyAgc3RydWN0IFZpc2l0b3IgOiBBaWRsVmlzaXRvciB7CisgICAgVmlzaXRvcihPcHRpb25zOjpMYW5ndWFnZSBsYW5nKSA6IGxhbmcobGFuZykge30KKyAgICB2b2lkIFZpc2l0KGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiB0eXBlKSBvdmVycmlkZSB7CisgICAgICBzdWNjZXNzID0gc3VjY2VzcyAmJiB0eXBlLkxhbmd1YWdlU3BlY2lmaWNDaGVja1ZhbGlkKGxhbmcpOwogICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gVE9ETzogd2Ugc2hvdWxkIHRyZWF0IGV2ZXJ5IGJhY2tlbmQgYWxsIHRoZSBzYW1lIGluIGZ1dHVyZS4KLWJvb2wgQWlkbFN0cnVjdHVyZWRQYXJjZWxhYmxlOjpMYW5ndWFnZVNwZWNpZmljQ2hlY2tWYWxpZChjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uczo6TGFuZ3VhZ2UgbGFuZykgY29uc3QgewotICBpZiAoIUFpZGxQYXJjZWxhYmxlOjpMYW5ndWFnZVNwZWNpZmljQ2hlY2tWYWxpZCh0eXBlbmFtZXMsIGxhbmcpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGZvciAoY29uc3QgYXV0byYgdiA6IHRoaXMtPkdldEZpZWxkcygpKSB7Ci0gICAgaWYgKCF2LT5HZXRUeXBlKCkuTGFuZ3VhZ2VTcGVjaWZpY0NoZWNrVmFsaWQodHlwZW5hbWVzLCBsYW5nKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKKyAgICBPcHRpb25zOjpMYW5ndWFnZSBsYW5nOworICAgIGJvb2wgc3VjY2VzcyA9IHRydWU7CisgIH0gdihsYW5nKTsKKyAgVmlzaXRUb3BEb3duKHYsICp0aGlzKTsKKyAgcmV0dXJuIHYuc3VjY2VzczsKIH0KIAogQWlkbEVudW1lcmF0b3I6OkFpZGxFbnVtZXJhdG9yKGNvbnN0IEFpZGxMb2NhdGlvbiYgbG9jYXRpb24sIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLApAQCAtMTI2MSwxNiArMTU1OCwyMCBAQAogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBhdXRvIHR5cGUgPSBhbm5vdC0+UGFyYW1WYWx1ZTxzdGQ6OnN0cmluZz4oInR5cGUiKS52YWx1ZSgpOwotICAgIGJhY2tpbmdfdHlwZV8gPQotICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPEFpZGxUeXBlU3BlY2lmaWVyPihhbm5vdC0+R2V0TG9jYXRpb24oKSwgdHlwZSwgZmFsc2UsIG51bGxwdHIsIENvbW1lbnRze30pOworICAgIGJhY2tpbmdfdHlwZV8gPSB0eXBlbmFtZXMuTWFrZVJlc29sdmVkVHlwZShhbm5vdC0+R2V0TG9jYXRpb24oKSwgdHlwZSwgZmFsc2UpOwogICB9IGVsc2UgewogICAgIC8vIERlZmF1bHQgdG8gYnl0ZSB0eXBlIGZvciBlbnVtcy4KLSAgICBiYWNraW5nX3R5cGVfID0KLSAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxBaWRsVHlwZVNwZWNpZmllcj4oQUlETF9MT0NBVElPTl9IRVJFLCAiYnl0ZSIsIGZhbHNlLCBudWxscHRyLCBDb21tZW50c3t9KTsKKyAgICBiYWNraW5nX3R5cGVfID0gdHlwZW5hbWVzLk1ha2VSZXNvbHZlZFR5cGUoR2V0TG9jYXRpb24oKSwgImJ5dGUiLCBmYWxzZSk7CiAgIH0KLSAgLy8gQXV0b2ZpbGwoKSBpcyBjYWxsZWQgYWZ0ZXIgdHlwZSByZXNvbHV0aW9uLCB3ZSByZXNvbHZlIHRoZSBiYWNraW5nIHR5cGUgbWFudWFsbHkuCi0gIGlmICghYmFja2luZ190eXBlXy0+UmVzb2x2ZSh0eXBlbmFtZXMpKSB7Ci0gICAgQUlETF9FUlJPUih0aGlzKSA8PCAiSW52YWxpZCBiYWNraW5nIHR5cGU6ICIgPDwgYmFja2luZ190eXBlXy0+R2V0TmFtZSgpOworCisgIC8vIHdlIG9ubHkgc3VwcG9ydC90ZXN0IGEgZmV3IGJhY2tpbmcgdHlwZXMsIHNvIG1ha2Ugc3VyZSB0aGlzIGlzIGEgc3VwcG9ydGVkCisgIC8vIG9uZSAob3RoZXJ3aXNlIGJvb2xlYW4gbWlnaHQgd29yaywgd2hpY2ggaXNuJ3Qgc3VwcG9ydGVkL3Rlc3RlZCBpbiBhbGwKKyAgLy8gYmFja2VuZHMpCisgIHN0YXRpYyBzdGQ6OnNldDxzdHJpbmc+IGtCYWNraW5nVHlwZXMgPSB7ImJ5dGUiLCAiaW50IiwgImxvbmcifTsKKyAgaWYgKGtCYWNraW5nVHlwZXMuZmluZChiYWNraW5nX3R5cGVfLT5HZXROYW1lKCkpID09IGtCYWNraW5nVHlwZXMuZW5kKCkpIHsKKyAgICBBSURMX0VSUk9SKHRoaXMpIDw8ICJJbnZhbGlkIGJhY2tpbmcgdHlwZTogIiA8PCBiYWNraW5nX3R5cGVfLT5HZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIuIEJhY2tpbmcgdHlwZSBtdXN0IGJlIG9uZSBvZjogIiA8PCBKb2luKGtCYWNraW5nVHlwZXMsICIsICIpOworICAgIHJldHVybiBmYWxzZTsKICAgfQogICByZXR1cm4gdHJ1ZTsKIH0KQEAgLTEzNTQsMzYgKzE2NTUsNiBAQAogICByZXR1cm4gc3VjY2VzczsKIH0KIAotLy8gVE9ETzogd2Ugc2hvdWxkIHRyZWF0IGV2ZXJ5IGJhY2tlbmQgYWxsIHRoZSBzYW1lIGluIGZ1dHVyZS4KLWJvb2wgQWlkbFVuaW9uRGVjbDo6TGFuZ3VhZ2VTcGVjaWZpY0NoZWNrVmFsaWQoY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25zOjpMYW5ndWFnZSBsYW5nKSBjb25zdCB7Ci0gIGlmICghQWlkbFBhcmNlbGFibGU6Okxhbmd1YWdlU3BlY2lmaWNDaGVja1ZhbGlkKHR5cGVuYW1lcywgbGFuZykpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgZm9yIChjb25zdCBhdXRvJiB2IDogdGhpcy0+R2V0RmllbGRzKCkpIHsKLSAgICBpZiAoIXYtPkdldFR5cGUoKS5MYW5ndWFnZVNwZWNpZmljQ2hlY2tWYWxpZCh0eXBlbmFtZXMsIGxhbmcpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vLyBUT0RPOiB3ZSBzaG91bGQgdHJlYXQgZXZlcnkgYmFja2VuZCBhbGwgdGhlIHNhbWUgaW4gZnV0dXJlLgotYm9vbCBBaWRsSW50ZXJmYWNlOjpMYW5ndWFnZVNwZWNpZmljQ2hlY2tWYWxpZChjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbnM6Okxhbmd1YWdlIGxhbmcpIGNvbnN0IHsKLSAgZm9yIChjb25zdCBhdXRvJiBtIDogdGhpcy0+R2V0TWV0aG9kcygpKSB7Ci0gICAgaWYgKCFtLT5HZXRUeXBlKCkuTGFuZ3VhZ2VTcGVjaWZpY0NoZWNrVmFsaWQodHlwZW5hbWVzLCBsYW5nKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBmb3IgKGNvbnN0IGF1dG8mIGFyZyA6IG0tPkdldEFyZ3VtZW50cygpKSB7Ci0gICAgICBpZiAoIWFyZy0+R2V0VHlwZSgpLkxhbmd1YWdlU3BlY2lmaWNDaGVja1ZhbGlkKHR5cGVuYW1lcywgbGFuZykpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQogQWlkbEludGVyZmFjZTo6QWlkbEludGVyZmFjZShjb25zdCBBaWRsTG9jYXRpb24mIGxvY2F0aW9uLCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29tbWVudHMmIGNvbW1lbnRzLCBib29sIG9uZXdheSwgY29uc3Qgc3RkOjpzdHJpbmcmIHBhY2thZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxBaWRsTWVtYmVyPj4qIG1lbWJlcnMpCkBAIC0xNDAwLDUyICsxNjcxLDEwIEBACiAgIC8vIEhhcyB0byBiZSBhIHBvaW50ZXIgZHVlIHRvIGRlbGV0aW5nIGNvcHkgY29uc3RydWN0b3IuIE5vIGlkZWEgd2h5LgogICBtYXA8c3RyaW5nLCBjb25zdCBBaWRsTWV0aG9kKj4gbWV0aG9kX25hbWVzOwogICBmb3IgKGNvbnN0IGF1dG8mIG0gOiBHZXRNZXRob2RzKCkpIHsKLSAgICBpZiAoIW0tPkdldFR5cGUoKS5DaGVja1ZhbGlkKHR5cGVuYW1lcykpIHsKKyAgICBpZiAoIW0tPkNoZWNrVmFsaWQodHlwZW5hbWVzKSkgewogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIC8vIFRPRE8oYi8xNTY4NzI1ODIpOiBTdXBwb3J0IGl0IHdoZW4gUGFyY2VsYWJsZUhvbGRlciBzdXBwb3J0cyBldmVyeSBiYWNrZW5kLgotICAgIGlmIChtLT5HZXRUeXBlKCkuR2V0TmFtZSgpID09ICJQYXJjZWxhYmxlSG9sZGVyIikgewotICAgICAgQUlETF9FUlJPUihtKSA8PCAiUGFyY2VsYWJsZUhvbGRlciBjYW5ub3QgYmUgYSByZXR1cm4gdHlwZSI7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmIChtLT5Jc09uZXdheSgpICYmIG0tPkdldFR5cGUoKS5HZXROYW1lKCkgIT0gInZvaWQiKSB7Ci0gICAgICBBSURMX0VSUk9SKG0pIDw8ICJvbmV3YXkgbWV0aG9kICciIDw8IG0tPkdldE5hbWUoKSA8PCAiJyBjYW5ub3QgcmV0dXJuIGEgdmFsdWUiOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHNldDxzdHJpbmc+IGFyZ3VtZW50X25hbWVzOwotICAgIGZvciAoY29uc3QgYXV0byYgYXJnIDogbS0+R2V0QXJndW1lbnRzKCkpIHsKLSAgICAgIGF1dG8gaXQgPSBhcmd1bWVudF9uYW1lcy5maW5kKGFyZy0+R2V0TmFtZSgpKTsKLSAgICAgIGlmIChpdCAhPSBhcmd1bWVudF9uYW1lcy5lbmQoKSkgewotICAgICAgICBBSURMX0VSUk9SKG0pIDw8ICJtZXRob2QgJyIgPDwgbS0+R2V0TmFtZSgpIDw8ICInIGhhcyBkdXBsaWNhdGUgYXJndW1lbnQgbmFtZSAnIgotICAgICAgICAgICAgICAgICAgICAgIDw8IGFyZy0+R2V0TmFtZSgpIDw8ICInIjsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgYXJndW1lbnRfbmFtZXMuaW5zZXJ0KGFyZy0+R2V0TmFtZSgpKTsKLQotICAgICAgaWYgKCFhcmctPkNoZWNrVmFsaWQodHlwZW5hbWVzKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChtLT5Jc09uZXdheSgpICYmIGFyZy0+SXNPdXQoKSkgewotICAgICAgICBBSURMX0VSUk9SKG0pIDw8ICJvbmV3YXkgbWV0aG9kICciIDw8IG0tPkdldE5hbWUoKSA8PCAiJyBjYW5ub3QgaGF2ZSBvdXQgcGFyYW1ldGVycyI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLQotICAgICAgLy8gY2hlY2sgdGhhdCB0aGUgbmFtZSBkb2Vzbid0IG1hdGNoIGEga2V5d29yZAotICAgICAgaWYgKElzSmF2YUtleXdvcmQoYXJnLT5HZXROYW1lKCkuY19zdHIoKSkpIHsKLSAgICAgICAgQUlETF9FUlJPUihhcmcpIDw8ICJBcmd1bWVudCBuYW1lIGlzIGEgSmF2YSBvciBhaWRsIGtleXdvcmQiOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0KLSAgICAgIC8vIFJlc2VydmUgYSBuYW1lc3BhY2UgZm9yIGludGVybmFsIHVzZQotICAgICAgaWYgKGFuZHJvaWQ6OmJhc2U6OlN0YXJ0c1dpdGgoYXJnLT5HZXROYW1lKCksICJfYWlkbCIpKSB7Ci0gICAgICAgIEFJRExfRVJST1IoYXJnKSA8PCAiQXJndW1lbnQgbmFtZSBjYW5ub3QgYmVnaW4gd2l0aCAnX2FpZGwnIjsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLQogICAgIGF1dG8gaXQgPSBtZXRob2RfbmFtZXMuZmluZChtLT5HZXROYW1lKCkpOwogICAgIC8vIHByZXZlbnQgZHVwbGljYXRlIG1ldGhvZHMKICAgICBpZiAoaXQgPT0gbWV0aG9kX25hbWVzLmVuZCgpKSB7CkBAIC0xNDYzLDYgKzE2OTIsMTAgQEAKICAgICAgIEFJRExfRVJST1IobSkgPDwgIiBtZXRob2QgIiA8PCBtLT5TaWduYXR1cmUoKSA8PCAiIGlzIHJlc2VydmVkIGZvciBpbnRlcm5hbCB1c2UuIjsKICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CisKKyAgICBpZiAoIUNoZWNrVmFsaWRQZXJtaXNzaW9uQW5ub3RhdGlvbnMoKm0uZ2V0KCkpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQogICB9CiAKICAgYm9vbCBzdWNjZXNzID0gdHJ1ZTsKQEAgLTE0NzgsNiArMTcxMSwzMSBAQAogICByZXR1cm4gc3VjY2VzczsKIH0KIAorYm9vbCBBaWRsSW50ZXJmYWNlOjpDaGVja1ZhbGlkUGVybWlzc2lvbkFubm90YXRpb25zKGNvbnN0IEFpZGxNZXRob2QmIG0pIGNvbnN0IHsKKyAgaWYgKElzUGVybWlzc2lvbk5vbmUoKSB8fCBJc1Blcm1pc3Npb25NYW51YWwoKSkgeworICAgIGlmIChtLkdldFR5cGUoKS5Jc1Blcm1pc3Npb25Ob25lKCkgfHwgbS5HZXRUeXBlKCkuSXNQZXJtaXNzaW9uTWFudWFsKCkgfHwKKyAgICAgICAgbS5HZXRUeXBlKCkuRW5mb3JjZUV4cHJlc3Npb24oKSkgeworICAgICAgc3RkOjpzdHJpbmcgaW50ZXJmYWNlX2Fubm90YXRpb24gPSBJc1Blcm1pc3Npb25Ob25lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gInJlcXVpcmluZyBubyBwZXJtaXNzaW9uIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAibWFudWFsbHkgaW1wbGVtZW50aW5nIHBlcm1pc3Npb24gY2hlY2tzIjsKKyAgICAgIEFJRExfRVJST1IobSkgPDwgIlRoZSBpbnRlcmZhY2UgIiA8PCBHZXROYW1lKCkgPDwgIiBpcyBhbm5vdGF0ZWQgYXMgIiA8PCBpbnRlcmZhY2VfYW5ub3RhdGlvbgorICAgICAgICAgICAgICAgICAgICA8PCAiIGJ1dCB0aGUgbWV0aG9kICIgPDwgbS5HZXROYW1lKCkgPDwgIiBpcyBhbHNvIGFubm90YXRlZC5cbiIKKyAgICAgICAgICAgICAgICAgICAgPDwgIkNvbnNpZGVyIGRpc3RyaWJ1dGluZyB0aGUgYW5ub3RhdGlvbiB0byBlYWNoIG1ldGhvZC4iOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfSBlbHNlIGlmIChFbmZvcmNlRXhwcmVzc2lvbigpKSB7CisgICAgaWYgKG0uR2V0VHlwZSgpLklzUGVybWlzc2lvbk5vbmUoKSB8fCBtLkdldFR5cGUoKS5Jc1Blcm1pc3Npb25NYW51YWwoKSkgeworICAgICAgQUlETF9FUlJPUihtKSA8PCAiVGhlIGludGVyZmFjZSAiIDw8IEdldE5hbWUoKQorICAgICAgICAgICAgICAgICAgICA8PCAiIGVuZm9yY2VzIHBlcm1pc3Npb25zIHVzaW5nIGFubm90YXRpb25zIgorICAgICAgICAgICAgICAgICAgICAgICAiIGJ1dCB0aGUgbWV0aG9kICIKKyAgICAgICAgICAgICAgICAgICAgPDwgbS5HZXROYW1lKCkgPDwgIiBpcyBhbHNvIGFubm90YXRlZC5cbiIKKyAgICAgICAgICAgICAgICAgICAgPDwgIkNvbnNpZGVyIGRpc3RyaWJ1dGluZyB0aGUgYW5ub3RhdGlvbiB0byBlYWNoIG1ldGhvZC4iOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwogc3RkOjpzdHJpbmcgQWlkbEludGVyZmFjZTo6R2V0RGVzY3JpcHRvcigpIGNvbnN0IHsKICAgc3RkOjpzdHJpbmcgYW5ub3RhdGVkRGVzY3JpcHRvciA9IEFpZGxBbm5vdGF0YWJsZTo6R2V0RGVzY3JpcHRvcigpOwogICBpZiAoYW5ub3RhdGVkRGVzY3JpcHRvciAhPSAiIikgewpAQCAtMTQ4NiwzNSArMTc0NCw0OSBAQAogICByZXR1cm4gR2V0Q2Fub25pY2FsTmFtZSgpOwogfQogCi1BaWRsSW1wb3J0OjpBaWRsSW1wb3J0KGNvbnN0IEFpZGxMb2NhdGlvbiYgbG9jYXRpb24sIGNvbnN0IHN0ZDo6c3RyaW5nJiBuZWVkZWRfY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbW1lbnRzJiBjb21tZW50cykKLSAgICA6IEFpZGxOb2RlKGxvY2F0aW9uLCBjb21tZW50cyksIG5lZWRlZF9jbGFzc18obmVlZGVkX2NsYXNzKSB7fQorQWlkbERvY3VtZW50OjpBaWRsRG9jdW1lbnQoY29uc3QgQWlkbExvY2F0aW9uJiBsb2NhdGlvbiwgY29uc3QgQ29tbWVudHMmIGNvbW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RyaW5nPiBpbXBvcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFpZGxEZWZpbmVkVHlwZT4+IGRlZmluZWRfdHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3ByZXByb2Nlc3NlZCkKKyAgICA6IEFpZGxDb21tZW50YWJsZShsb2NhdGlvbiwgY29tbWVudHMpLAorICAgICAgQWlkbFNjb3BlKHRoaXMpLAorICAgICAgaW1wb3J0c18oc3RkOjptb3ZlKGltcG9ydHMpKSwKKyAgICAgIGRlZmluZWRfdHlwZXNfKHN0ZDo6bW92ZShkZWZpbmVkX3R5cGVzKSksCisgICAgICBpc19wcmVwcm9jZXNzZWRfKGlzX3ByZXByb2Nlc3NlZCkgeworICBmb3IgKGNvbnN0IGF1dG8mIHQgOiBkZWZpbmVkX3R5cGVzXykgeworICAgIHQtPlNldEVuY2xvc2luZ1Njb3BlKHRoaXMpOworICB9Cit9CiAKLS8vIFJlc29sdmVzIHVucmVzb2x2ZWQgdHlwZSBuYW1lIHRvIGZ1bGx5IHF1YWxpZmllZCB0eXBlbmFtZSB0byBpbXBvcnQKLS8vIGNhc2UgIzE6IFNpbXBsZU5hbWUgLS0+IGltcG9ydCBwLlNpbXBsZU5hbWUKLS8vIGNhc2UgIzI6IE91dGVyLklubmVyIC0tPiBpbXBvcnQgcC5PdXRlcgotLy8gY2FzZSAjMzogcC5TaW1wbGVOYW1lIC0tPiAoYXMgaXMpCi1zdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiBBaWRsRG9jdW1lbnQ6OlJlc29sdmVOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB1bnJlc29sdmVkX25hbWUpIGNvbnN0IHsKLSAgc3RkOjpzdHJpbmcgY2Fub25pY2FsX25hbWU7Ci0gIGNvbnN0IGF1dG8gZmlyc3RfZG90ID0gdW5yZXNvbHZlZF9uYW1lLmZpbmRfZmlyc3Rfb2YoJy4nKTsKKy8vIFJlc29sdmVzIHR5cGUgbmFtZSBpbiB0aGUgY3VycmVudCBkb2N1bWVudC4KKy8vIC0gYnVpbHQtaW4gdHlwZXMKKy8vIC0gaW1wb3J0ZWQgdHlwZXMKKy8vIC0gdG9wLWxldmVsIHR5cGUKK3N0ZDo6c3RyaW5nIEFpZGxEb2N1bWVudDo6UmVzb2x2ZU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIGNvbnN0IHsKKyAgaWYgKEFpZGxUeXBlbmFtZXM6OklzQnVpbHRpblR5cGVuYW1lKG5hbWUpKSB7CisgICAgcmV0dXJuIG5hbWU7CisgIH0KKworICBjb25zdCBhdXRvIGZpcnN0X2RvdCA9IG5hbWUuZmluZF9maXJzdF9vZignLicpOworICAvLyBGb3IgIk91dGVyLklubmVyIiwgd2UgbG9vayB1cCAiT3V0ZXIiIGluIHRoZSBpbXBvcnQgbGlzdC4KICAgY29uc3Qgc3RkOjpzdHJpbmcgY2xhc3NfbmFtZSA9Ci0gICAgICAoZmlyc3RfZG90ID09IHN0ZDo6c3RyaW5nOjpucG9zKSA/IHVucmVzb2x2ZWRfbmFtZSA6IHVucmVzb2x2ZWRfbmFtZS5zdWJzdHIoMCwgZmlyc3RfZG90KTsKKyAgICAgIChmaXJzdF9kb3QgPT0gc3RkOjpzdHJpbmc6Om5wb3MpID8gbmFtZSA6IG5hbWUuc3Vic3RyKDAsIGZpcnN0X2RvdCk7CisgIC8vIEtlZXAgIi5Jbm5lciIsIHRvIG1ha2UgYSBmdWxseS1xdWFsaWZpZWQgbmFtZQorICBjb25zdCBzdGQ6OnN0cmluZyBuZXN0ZWRfdHlwZSA9IChmaXJzdF9kb3QgPT0gc3RkOjpzdHJpbmc6Om5wb3MpID8gIiIgOiBuYW1lLnN1YnN0cihmaXJzdF9kb3QpOworCiAgIGZvciAoY29uc3QgYXV0byYgaW1wb3J0IDogSW1wb3J0cygpKSB7Ci0gICAgY29uc3QgYXV0byYgZnFfbmFtZSA9IGltcG9ydC0+R2V0TmVlZGVkQ2xhc3MoKTsKLSAgICBjb25zdCBhdXRvIGxhc3RfZG90ID0gZnFfbmFtZS5maW5kX2xhc3Rfb2YoJy4nKTsKLSAgICBjb25zdCBzdGQ6OnN0cmluZyBpbXBvcnRlZF90eXBlX25hbWUgPQotICAgICAgICAobGFzdF9kb3QgPT0gc3RkOjpzdHJpbmc6Om5wb3MpID8gZnFfbmFtZSA6IGZxX25hbWUuc3Vic3RyKGxhc3RfZG90ICsgMSk7Ci0gICAgaWYgKGltcG9ydGVkX3R5cGVfbmFtZSA9PSBjbGFzc19uYW1lKSB7Ci0gICAgICBpZiAoY2Fub25pY2FsX25hbWUgIT0gIiIgJiYgY2Fub25pY2FsX25hbWUgIT0gZnFfbmFtZSkgewotICAgICAgICBBSURMX0VSUk9SKGltcG9ydCkgPDwgIkFtYmlndW91cyB0eXBlOiAiIDw8IGNhbm9uaWNhbF9uYW1lIDw8ICIgdnMuICIgPDwgZnFfbmFtZTsKLSAgICAgICAgcmV0dXJuIHt9OwotICAgICAgfQotICAgICAgY2Fub25pY2FsX25hbWUgPSBmcV9uYW1lOworICAgIGlmIChTaW1wbGVOYW1lKGltcG9ydCkgPT0gY2xhc3NfbmFtZSkgeworICAgICAgcmV0dXJuIGltcG9ydCArIG5lc3RlZF90eXBlOwogICAgIH0KICAgfQotICAvLyBpZiBub3QgZm91bmQsIHVzZSB1bnJlc29sdmVkX25hbWUgYXMgaXQgaXMKLSAgaWYgKGNhbm9uaWNhbF9uYW1lID09ICIiKSB7Ci0gICAgcmV0dXJuIHVucmVzb2x2ZWRfbmFtZTsKKworICAvLyBjaGVjayBpZiBpdCBpcyBhIHRvcC1sZXZlbCB0eXBlLgorICBmb3IgKGNvbnN0IGF1dG8mIHR5cGUgOiBEZWZpbmVkVHlwZXMoKSkgeworICAgIGlmICh0eXBlLT5HZXROYW1lKCkgPT0gY2xhc3NfbmFtZSkgeworICAgICAgcmV0dXJuIHR5cGUtPkdldENhbm9uaWNhbE5hbWUoKSArIG5lc3RlZF90eXBlOworICAgIH0KICAgfQotICByZXR1cm4gY2Fub25pY2FsX25hbWU7CisKKyAgLy8gbmFtZSBpdHNlbGYgbWlnaHQgYmUgZnVsbHktcXVhbGlmaWVkIG5hbWUuCisgIHJldHVybiBuYW1lOwogfQpkaWZmIC0tZ2l0IGEvYWlkbF9sYW5ndWFnZS5oIGIvYWlkbF9sYW5ndWFnZS5oCmluZGV4IDY5Y2YzOGYuLjE1Y2U0YmIgMTAwNjQ0Ci0tLSBhL2FpZGxfbGFuZ3VhZ2UuaAorKysgYi9haWRsX2xhbmd1YWdlLmgKQEAgLTIwLDggKzIwLDEwIEBACiAjaW5jbHVkZSA8cmVnZXg+CiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisjaW5jbHVkZSA8dmFyaWFudD4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcmVzdWx0Lmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3MuaD4KIAogI2luY2x1ZGUgImFpZGxfdHlwZW5hbWVzLmgiCkBAIC0zMiwxMSArMzQsMTMgQEAKICNpbmNsdWRlICJsb2NhdGlvbi5oIgogI2luY2x1ZGUgImxvZ2dpbmcuaCIKICNpbmNsdWRlICJvcHRpb25zLmgiCisjaW5jbHVkZSAicGVybWlzc2lvbi5oIgogCiB1c2luZyBhbmRyb2lkOjphaWRsOjpBaWRsVHlwZW5hbWVzOwogdXNpbmcgYW5kcm9pZDo6YWlkbDo6Q29kZVdyaXRlcjsKIHVzaW5nIGFuZHJvaWQ6OmFpZGw6OkNvbW1lbnRzOwogdXNpbmcgYW5kcm9pZDo6YWlkbDo6T3B0aW9uczsKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlJlc3VsdDsKIHVzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKIHVzaW5nIHN0ZDo6c3RyaW5nOwogdXNpbmcgc3RkOjp1bmlxdWVfcHRyOwpAQCAtNzgsOCArODIsNiBAQAogYm9vbCBQYXJzZUZsb2F0aW5nKHN0ZDo6c3RyaW5nX3ZpZXcgc3YsIGZsb2F0KiBwYXJzZWQpOwogCiBjbGFzcyBBaWRsRG9jdW1lbnQ7Ci1jbGFzcyBBaWRsUGFja2FnZTsKLWNsYXNzIEFpZGxJbXBvcnQ7CiBjbGFzcyBBaWRsSW50ZXJmYWNlOwogY2xhc3MgQWlkbFBhcmNlbGFibGU7CiBjbGFzcyBBaWRsU3RydWN0dXJlZFBhcmNlbGFibGU7CkBAIC0xMTcsOCArMTE5LDIzIEBACiAgIHZpcnR1YWwgdm9pZCBWaXNpdChjb25zdCBBaWRsVW5hcnlDb25zdEV4cHJlc3Npb24mKSB7fQogICB2aXJ0dWFsIHZvaWQgVmlzaXQoY29uc3QgQWlkbEJpbmFyeUNvbnN0RXhwcmVzc2lvbiYpIHt9CiAgIHZpcnR1YWwgdm9pZCBWaXNpdChjb25zdCBBaWRsQW5ub3RhdGlvbiYpIHt9Ci0gIHZpcnR1YWwgdm9pZCBWaXNpdChjb25zdCBBaWRsSW1wb3J0Jikge30KLSAgdmlydHVhbCB2b2lkIFZpc2l0KGNvbnN0IEFpZGxQYWNrYWdlJikge30KK307CisKK2NsYXNzIEFpZGxTY29wZSB7CisgcHVibGljOgorICBBaWRsU2NvcGUoY29uc3QgQWlkbE5vZGUqIHNlbGYpIDogc2VsZl8oc2VsZikge30KKyAgdmlydHVhbCB+QWlkbFNjb3BlKCkgPSBkZWZhdWx0OworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIFJlc29sdmVOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSBjb25zdCA9IDA7CisgIHZvaWQgU2V0RW5jbG9zaW5nU2NvcGUoY29uc3QgQWlkbFNjb3BlKiBlbmNsb3NpbmcpIHsKKyAgICBBSURMX0ZBVEFMX0lGKGVuY2xvc2luZ18sIEFJRExfTE9DQVRJT05fSEVSRSkgPDwgIlNldEVuY2xvc2luZ1Njb3BlIGNhbiBiZSBzZXQgb25seSBvbmNlLiI7CisgICAgZW5jbG9zaW5nXyA9IGVuY2xvc2luZzsKKyAgfQorICBjb25zdCBBaWRsU2NvcGUqIEdldEVuY2xvc2luZ1Njb3BlKCkgY29uc3QgeyByZXR1cm4gZW5jbG9zaW5nXzsgfQorICBjb25zdCBBaWRsTm9kZSYgR2V0Tm9kZSgpIGNvbnN0IHsgcmV0dXJuICpzZWxmXzsgfQorCisgcHJpdmF0ZToKKyAgY29uc3QgQWlkbE5vZGUqIHNlbGZfOworICBjb25zdCBBaWRsU2NvcGUqIGVuY2xvc2luZ18gPSBudWxscHRyOwogfTsKIAogLy8gQW55dGhpbmcgdGhhdCBpcyBsb2NhdGFibGUgaW4gYSAuYWlkbCBmaWxlLgpAQCAtMTI2LDkgKzE0MywxMCBAQAogIHB1YmxpYzoKICAgQWlkbE5vZGUoY29uc3QgQWlkbExvY2F0aW9uJiBsb2NhdGlvbiwgY29uc3QgQ29tbWVudHMmIGNvbW1lbnRzID0ge30pOwogCi0gIEFpZGxOb2RlKGNvbnN0IEFpZGxOb2RlJikgPSBkZWZhdWx0OwotICB2aXJ0dWFsIH5BaWRsTm9kZSgpID0gZGVmYXVsdDsKKyAgdmlydHVhbCB+QWlkbE5vZGUoKTsKIAorICBBaWRsTm9kZShBaWRsTm9kZSYpID0gZGVsZXRlOworICBBaWRsTm9kZSYgb3BlcmF0b3I9KEFpZGxOb2RlJikgPSBkZWxldGU7CiAgIEFpZGxOb2RlKEFpZGxOb2RlJiYpID0gZGVsZXRlOwogICBBaWRsTm9kZSYgb3BlcmF0b3I9KEFpZGxOb2RlJiYpID0gZGVsZXRlOwogCkBAIC0xNDQsMTEgKzE2MiwyMCBAQAogICBjb25zdCBDb21tZW50cyYgR2V0Q29tbWVudHMoKSBjb25zdCB7IHJldHVybiBjb21tZW50c187IH0KICAgdm9pZCBTZXRDb21tZW50cyhjb25zdCBDb21tZW50cyYgY29tbWVudHMpIHsgY29tbWVudHNfID0gY29tbWVudHM7IH0KIAorICBzdGF0aWMgdm9pZCBDbGVhclVudmlzaXRlZE5vZGVzKCk7CisgIHN0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxBaWRsTG9jYXRpb24+JiBHZXRMb2NhdGlvbnNPZlVudmlzaXRlZE5vZGVzKCk7CisgIHZvaWQgTWFya1Zpc2l0ZWQoKSBjb25zdDsKKyAgYm9vbCBJc1VzZXJEZWZpbmVkKCkgY29uc3QgeyByZXR1cm4gIUdldExvY2F0aW9uKCkuSXNJbnRlcm5hbCgpOyB9CisKICBwcml2YXRlOgogICBzdGQ6OnN0cmluZyBQcmludExpbmUoKSBjb25zdDsKICAgc3RkOjpzdHJpbmcgUHJpbnRMb2NhdGlvbigpIGNvbnN0OwogICBjb25zdCBBaWRsTG9jYXRpb24gbG9jYXRpb25fOwogICBDb21tZW50cyBjb21tZW50c187CisKKyAgLy8gbWFrZSBzdXJlIHdlIGFyZSBhYmxlIHRvIGFib3J0IGlmIHR5cGVzIGFyZSBub3QgdmlzaXRlZAorICBtdXRhYmxlIGJvb2wgdmlzaXRlZF8gPSBmYWxzZTsKKyAgc3RhdGljIHN0ZDo6dmVjdG9yPEFpZGxMb2NhdGlvbj4gdW52aXNpdGVkX2xvY2F0aW9uc187CiB9OwogCiAvLyB1bmlxdWVfcHRyPEFpZGxUeXBlU3BlY2lmaWVyPiBmb3IgdHlwZSBhcnVnbWVudCwKQEAgLTE3MCw5ICsxOTcsNiBAQAogCiAgIHZpcnR1YWwgY29uc3QgQWlkbE5vZGUmIEFzQWlkbE5vZGUoKSBjb25zdCA9IDA7CiAKLSBwcm90ZWN0ZWQ6Ci0gIEFpZGxQYXJhbWV0ZXJpemFibGUoY29uc3QgQWlkbFBhcmFtZXRlcml6YWJsZSYpOwotCiAgcHJpdmF0ZToKICAgdW5pcXVlX3B0cjxzdGQ6OnZlY3RvcjxUPj4gdHlwZV9wYXJhbXNfOwogICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxULCB1bmlxdWVfcHRyPEFpZGxUeXBlU3BlY2lmaWVyPj46OnZhbHVlIHx8CkBAIC0xOTMsMTQgKzIxNywxNCBAQAogCiAvLyBUcmFuc2Zvcm1zIGEgdmFsdWUgc3RyaW5nIGludG8gYSBsYW5ndWFnZSBzcGVjaWZpYyBmb3JtLiBSYXcgdmFsdWUgYXMgcHJvZHVjZWQgYnkKIC8vIEFpZGxDb25zdGFudFZhbHVlLgotdXNpbmcgQ29uc3RhbnRWYWx1ZURlY29yYXRvciA9Ci0gICAgc3RkOjpmdW5jdGlvbjxzdGQ6OnN0cmluZyhjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHJhd192YWx1ZSk+OwordXNpbmcgQ29uc3RhbnRWYWx1ZURlY29yYXRvciA9IHN0ZDo6ZnVuY3Rpb248c3RkOjpzdHJpbmcoCisgICAgY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHR5cGUsCisgICAgY29uc3Qgc3RkOjp2YXJpYW50PHN0ZDo6c3RyaW5nLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4+JiByYXdfdmFsdWUpPjsKIAogY2xhc3MgQWlkbEFubm90YXRpb24gOiBwdWJsaWMgQWlkbE5vZGUgewogIHB1YmxpYzoKICAgZW51bSBjbGFzcyBUeXBlIHsKICAgICBCQUNLSU5HID0gMSwKLSAgICBISURFLAogICAgIEpBVkFfU1RBQkxFX1BBUkNFTEFCTEUsCiAgICAgVU5TVVBQT1JURURfQVBQX1VTQUdFLAogICAgIFZJTlRGX1NUQUJJTElUWSwKQEAgLTIxMCwxMiArMjM0LDE3IEBACiAgICAgSkFWQV9QQVNTVEhST1VHSCwKICAgICBKQVZBX0RFUklWRSwKICAgICBKQVZBX0RFRkFVTFQsCisgICAgSkFWQV9ERUxFR0FUT1IsCiAgICAgSkFWQV9PTkxZX0lNTVVUQUJMRSwKICAgICBKQVZBX1NVUFBSRVNTX0xJTlQsCiAgICAgRklYRURfU0laRSwKICAgICBERVNDUklQVE9SLAogICAgIFJVU1RfREVSSVZFLAogICAgIFNVUFBSRVNTX1dBUk5JTkdTLAorICAgIFBFUk1JU1NJT05fRU5GT1JDRSwKKyAgICBQRVJNSVNTSU9OX05PTkUsCisgICAgUEVSTUlTU0lPTl9NQU5VQUwsCisgICAgUFJPUEFHQVRFX0FMTE9XX0JMT0NLSU5HLAogICB9OwogCiAgIHVzaW5nIFRhcmdldENvbnRleHQgPSB1aW50MTZfdDsKQEAgLTIzNywxMiArMjY2LDExIEBACiAKICAgc3RhdGljIHN0ZDo6c3RyaW5nIFR5cGVUb1N0cmluZyhUeXBlIHR5cGUpOwogCi0gIHN0YXRpYyBBaWRsQW5ub3RhdGlvbiogUGFyc2UoCisgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QWlkbEFubm90YXRpb24+IFBhcnNlKAogICAgICAgY29uc3QgQWlkbExvY2F0aW9uJiBsb2NhdGlvbiwgY29uc3Qgc3RyaW5nJiBuYW1lLAotICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c2hhcmVkX3B0cjxBaWRsQ29uc3RhbnRWYWx1ZT4+KiBwYXJhbWV0ZXJfbGlzdCwKKyAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnNoYXJlZF9wdHI8QWlkbENvbnN0YW50VmFsdWU+PiBwYXJhbWV0ZXJfbGlzdCwKICAgICAgIGNvbnN0IENvbW1lbnRzJiBjb21tZW50cyk7CiAKLSAgQWlkbEFubm90YXRpb24oY29uc3QgQWlkbEFubm90YXRpb24mKSA9IGRlZmF1bHQ7CiAgIEFpZGxBbm5vdGF0aW9uKEFpZGxBbm5vdGF0aW9uJiYpID0gZGVmYXVsdDsKICAgdmlydHVhbCB+QWlkbEFubm90YXRpb24oKSA9IGRlZmF1bHQ7CiAgIGJvb2wgQ2hlY2tWYWxpZCgpIGNvbnN0OwpAQCAtMjY0LDYgKzI5Miw4IEBACiAgIHZvaWQgVHJhdmVyc2VDaGlsZHJlbihzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgQWlkbE5vZGUmKT4gdHJhdmVyc2UpIGNvbnN0IG92ZXJyaWRlOwogICB2b2lkIERpc3BhdGNoVmlzaXQoQWlkbFZpc2l0b3ImIHYpIGNvbnN0IG92ZXJyaWRlIHsgdi5WaXNpdCgqdGhpcyk7IH0KIAorICBSZXN1bHQ8dW5pcXVlX3B0cjxhbmRyb2lkOjphaWRsOjpwZXJtOjpFeHByZXNzaW9uPj4gRW5mb3JjZUV4cHJlc3Npb24oKSBjb25zdDsKKwogIHByaXZhdGU6CiAgIHN0cnVjdCBQYXJhbVR5cGUgewogICAgIHN0ZDo6c3RyaW5nIG5hbWU7CkBAIC0yOTEsNyArMzIxLDcgQEAKICAgc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPFNjaGVtYT4mIEFsbFNjaGVtYXMoKTsKIAogICBBaWRsQW5ub3RhdGlvbihjb25zdCBBaWRsTG9jYXRpb24mIGxvY2F0aW9uLCBjb25zdCBTY2hlbWEmIHNjaGVtYSwKLSAgICAgICAgICAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c2hhcmVkX3B0cjxBaWRsQ29uc3RhbnRWYWx1ZT4+JiYgcGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c2hhcmVkX3B0cjxBaWRsQ29uc3RhbnRWYWx1ZT4+IHBhcmFtZXRlcnMsCiAgICAgICAgICAgICAgICAgIGNvbnN0IENvbW1lbnRzJiBjb21tZW50cyk7CiAKICAgY29uc3QgU2NoZW1hJiBzY2hlbWFfOwpAQCAtMzA5LDYwICszMzksNzcgQEAKICBwdWJsaWM6CiAgIEFpZGxBbm5vdGF0YWJsZShjb25zdCBBaWRsTG9jYXRpb24mIGxvY2F0aW9uLCBjb25zdCBDb21tZW50cyYgY29tbWVudHMpOwogCi0gIEFpZGxBbm5vdGF0YWJsZShjb25zdCBBaWRsQW5ub3RhdGFibGUmKSA9IGRlZmF1bHQ7Ci0gIEFpZGxBbm5vdGF0YWJsZShBaWRsQW5ub3RhdGFibGUmJikgPSBkZWZhdWx0OwogICB2aXJ0dWFsIH5BaWRsQW5ub3RhdGFibGUoKSA9IGRlZmF1bHQ7CiAKLSAgdm9pZCBBbm5vdGF0ZSh2ZWN0b3I8QWlkbEFubm90YXRpb24+JiYgYW5ub3RhdGlvbnMpIHsKKyAgdm9pZCBBbm5vdGF0ZSh2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFpZGxBbm5vdGF0aW9uPj4mJiBhbm5vdGF0aW9ucykgewogICAgIGZvciAoYXV0byYgYW5ub3RhdGlvbiA6IGFubm90YXRpb25zKSB7CiAgICAgICBhbm5vdGF0aW9uc18uZW1wbGFjZV9iYWNrKHN0ZDo6bW92ZShhbm5vdGF0aW9uKSk7CiAgICAgfQogICB9CiAgIGJvb2wgSXNOdWxsYWJsZSgpIGNvbnN0OworICBib29sIElzSGVhcE51bGxhYmxlKCkgY29uc3Q7CiAgIGJvb2wgSXNVdGY4SW5DcHAoKSBjb25zdDsKICAgYm9vbCBJc1NlbnNpdGl2ZURhdGEoKSBjb25zdDsKICAgYm9vbCBJc1ZpbnRmU3RhYmlsaXR5KCkgY29uc3Q7CiAgIGJvb2wgSXNKYXZhT25seUltbXV0YWJsZSgpIGNvbnN0OwogICBib29sIElzRml4ZWRTaXplKCkgY29uc3Q7CiAgIGJvb2wgSXNTdGFibGVBcGlQYXJjZWxhYmxlKE9wdGlvbnM6Okxhbmd1YWdlIGxhbmcpIGNvbnN0OwotICBib29sIElzSGlkZSgpIGNvbnN0OwogICBib29sIEphdmFEZXJpdmUoY29uc3Qgc3RkOjpzdHJpbmcmIG1ldGhvZCkgY29uc3Q7CiAgIGJvb2wgSXNKYXZhRGVmYXVsdCgpIGNvbnN0OworICBib29sIElzSmF2YURlbGVnYXRvcigpIGNvbnN0OwogICBzdGQ6OnN0cmluZyBHZXREZXNjcmlwdG9yKCkgY29uc3Q7CiAKICAgY29uc3QgQWlkbEFubm90YXRpb24qIFVuc3VwcG9ydGVkQXBwVXNhZ2UoKSBjb25zdDsKICAgY29uc3QgQWlkbEFubm90YXRpb24qIFJ1c3REZXJpdmUoKSBjb25zdDsKICAgY29uc3QgQWlkbEFubm90YXRpb24qIEJhY2tpbmdUeXBlKCkgY29uc3Q7CiAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBTdXBwcmVzc1dhcm5pbmdzKCkgY29uc3Q7CisgIHN0ZDo6dW5pcXVlX3B0cjxhbmRyb2lkOjphaWRsOjpwZXJtOjpFeHByZXNzaW9uPiBFbmZvcmNlRXhwcmVzc2lvbigpIGNvbnN0OworICBib29sIElzUGVybWlzc2lvbk1hbnVhbCgpIGNvbnN0OworICBib29sIElzUGVybWlzc2lvbk5vbmUoKSBjb25zdDsKKyAgYm9vbCBJc1Byb3BhZ2F0ZUFsbG93QmxvY2tpbmcoKSBjb25zdDsKIAogICAvLyBUb1N0cmluZyBpcyBmb3IgZHVtcGluZyBBSURMLgogICAvLyBSZXR1cm5zIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbm5vdGF0aW9ucy4KICAgLy8gZS5nKSAiQEphdmFEZXJpdmUodG9TdHJpbmc9dHJ1ZSkgQFJ1c3REZXJpdmUoQ2xvbmU9dHJ1ZSwgQ29weT10cnVlKSIKICAgc3RkOjpzdHJpbmcgVG9TdHJpbmcoKSBjb25zdDsKIAotICBjb25zdCB2ZWN0b3I8QWlkbEFubm90YXRpb24+JiBHZXRBbm5vdGF0aW9ucygpIGNvbnN0IHsgcmV0dXJuIGFubm90YXRpb25zXzsgfQorICBjb25zdCB2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFpZGxBbm5vdGF0aW9uPj4mIEdldEFubm90YXRpb25zKCkgY29uc3QgeyByZXR1cm4gYW5ub3RhdGlvbnNfOyB9CiAgIGJvb2wgQ2hlY2tWYWxpZChjb25zdCBBaWRsVHlwZW5hbWVzJikgY29uc3Q7CiAgIHZvaWQgVHJhdmVyc2VDaGlsZHJlbihzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgQWlkbE5vZGUmKT4gdHJhdmVyc2UpIGNvbnN0IG92ZXJyaWRlIHsKICAgICBmb3IgKGNvbnN0IGF1dG8mIGFubm90IDogR2V0QW5ub3RhdGlvbnMoKSkgewotICAgICAgdHJhdmVyc2UoYW5ub3QpOworICAgICAgdHJhdmVyc2UoKmFubm90KTsKICAgICB9CiAgIH0KIAogIHByaXZhdGU6Ci0gIHZlY3RvcjxBaWRsQW5ub3RhdGlvbj4gYW5ub3RhdGlvbnNfOworICB2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFpZGxBbm5vdGF0aW9uPj4gYW5ub3RhdGlvbnNfOwogfTsKIAorLy8gUmVwcmVzZW50cyBgW11gCitzdHJ1Y3QgRHluYW1pY0FycmF5IHt9OworLy8gUmVwcmVzZW50cyBgW05dW01dLi5gCitzdHJ1Y3QgRml4ZWRTaXplQXJyYXkgeworICBGaXhlZFNpemVBcnJheShzdGQ6OnVuaXF1ZV9wdHI8QWlkbENvbnN0YW50VmFsdWU+IGRpbSkgeyBkaW1lbnNpb25zLnB1c2hfYmFjayhzdGQ6Om1vdmUoZGltKSk7IH0KKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFpZGxDb25zdGFudFZhbHVlPj4gZGltZW5zaW9uczsKK307CisvLyBSZXByZXNlbnRzIGBbXWAgb3IgYFtOXWAgcGFydCBvZiB0eXBlIHNwZWNpZmllcgordXNpbmcgQXJyYXlUeXBlID0gc3RkOjp2YXJpYW50PER5bmFtaWNBcnJheSwgRml4ZWRTaXplQXJyYXk+OworCiAvLyBBaWRsVHlwZVNwZWNpZmllciByZXByZXNlbnRzIGEgcmVmZXJlbmNlIHRvIGVpdGhlciBhIGJ1aWx0LWluIHR5cGUsCiAvLyBhIGRlZmluZWQgdHlwZSwgb3IgYSB2YXJpYW50IChlLmcuLCBhcnJheSBvZiBnZW5lcmljKSBvZiBhIHR5cGUuCiBjbGFzcyBBaWRsVHlwZVNwZWNpZmllciBmaW5hbCA6IHB1YmxpYyBBaWRsQW5ub3RhdGFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBBaWRsUGFyYW1ldGVyaXphYmxlPHVuaXF1ZV9wdHI8QWlkbFR5cGVTcGVjaWZpZXI+PiB7CiAgcHVibGljOgotICBBaWRsVHlwZVNwZWNpZmllcihjb25zdCBBaWRsTG9jYXRpb24mIGxvY2F0aW9uLCBjb25zdCBzdHJpbmcmIHVucmVzb2x2ZWRfbmFtZSwgYm9vbCBpc19hcnJheSwKKyAgQWlkbFR5cGVTcGVjaWZpZXIoY29uc3QgQWlkbExvY2F0aW9uJiBsb2NhdGlvbiwgY29uc3Qgc3RyaW5nJiB1bnJlc29sdmVkX25hbWUsCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3B0aW9uYWw8QXJyYXlUeXBlPiBhcnJheSwKICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPHVuaXF1ZV9wdHI8QWlkbFR5cGVTcGVjaWZpZXI+PiogdHlwZV9wYXJhbXMsIGNvbnN0IENvbW1lbnRzJiBjb21tZW50cyk7CiAgIHZpcnR1YWwgfkFpZGxUeXBlU3BlY2lmaWVyKCkgPSBkZWZhdWx0OwogCi0gIC8vIENvcHkgb2YgdGhpcyB0eXBlIHdoaWNoIGlzIG5vdCBhbiBhcnJheS4KLSAgY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIEFycmF5QmFzZSgpIGNvbnN0OworICAvLyBWaWV3IG9mIHRoaXMgdHlwZSB3aGljaCBoYXMgb25lLWxlc3MgZGltZW5zaW9uKHMpLgorICAvLyBlLmcuKSBUW10gPT4gVCwgVFtOXVtNXSA9PiBUW01dCisgIHZvaWQgVmlld0FzQXJyYXlCYXNlKHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBBaWRsVHlwZVNwZWNpZmllciYpPiBmdW5jKSBjb25zdDsKKyAgLy8gVmlld0FzQXJyYXlCYXNlIHBhc3NlcyAibXV0YXRlZCIgdHlwZSB0byBpdHMgY2FsbGJhY2suCisgIGJvb2wgSXNNdXRhdGVkKCkgY29uc3QgeyByZXR1cm4gbXV0YXRlZF87IH0KIAogICAvLyBSZXR1cm5zIHRoZSBmdWxsLXF1YWxpZmllZCBuYW1lIG9mIHRoZSBiYXNlIHR5cGUuCiAgIC8vIGludCAtPiBpbnQKQEAgLTM5NSw0OCArNDQyLDU0IEBACiAKICAgYm9vbCBJc1Jlc29sdmVkKCkgY29uc3QgeyByZXR1cm4gZnVsbHlfcXVhbGlmaWVkX25hbWVfICE9ICIiOyB9CiAKLSAgYm9vbCBJc0FycmF5KCkgY29uc3QgeyByZXR1cm4gaXNfYXJyYXlfOyB9Ci0KLSAgX19hdHRyaWJ1dGVfXygod2Fybl91bnVzZWRfcmVzdWx0KSkgYm9vbCBTZXRBcnJheSgpIHsKLSAgICBpZiAoaXNfYXJyYXlfKSByZXR1cm4gZmFsc2U7Ci0gICAgaXNfYXJyYXlfID0gdHJ1ZTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgYm9vbCBJc0FycmF5KCkgY29uc3QgeyByZXR1cm4gYXJyYXlfLmhhc192YWx1ZSgpOyB9CisgIGJvb2wgSXNEeW5hbWljQXJyYXkoKSBjb25zdCB7CisgICAgcmV0dXJuIGFycmF5Xy5oYXNfdmFsdWUoKSAmJiBzdGQ6OmdldF9pZjxEeW5hbWljQXJyYXk+KCYqYXJyYXlfKSAhPSBudWxscHRyOwogICB9CisgIGJvb2wgSXNGaXhlZFNpemVBcnJheSgpIGNvbnN0IHsKKyAgICByZXR1cm4gYXJyYXlfLmhhc192YWx1ZSgpICYmIHN0ZDo6Z2V0X2lmPEZpeGVkU2l6ZUFycmF5PigmKmFycmF5XykgIT0gbnVsbHB0cjsKKyAgfQorICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBHZXRGaXhlZFNpemVBcnJheURpbWVuc2lvbnMoKSBjb25zdDsKKworICBjb25zdCBBcnJheVR5cGUmIEdldEFycmF5KCkgY29uc3QgeworICAgIEFJRExfRkFUQUxfSUYoIWFycmF5Xy5oYXNfdmFsdWUoKSwgdGhpcykgPDwgIkdldEFycmF5KCkgZm9yIG5vbi1hcnJheSB0eXBlIjsKKyAgICByZXR1cm4gYXJyYXlfLnZhbHVlKCk7CisgIH0KKworICAvLyBBY2NlcHQgdHJhbnNpdGlvbnMgZnJvbQorICAvLyAgICBUICAgIHRvIFRbXQorICAvLyBvciBUICAgIHRvIFRbTl0KKyAgLy8gb3IgVFtOXSB0byBUW05dW01dCisgIF9fYXR0cmlidXRlX18oKHdhcm5fdW51c2VkX3Jlc3VsdCkpIGJvb2wgTWFrZUFycmF5KEFycmF5VHlwZSBhcnJheV90eXBlKTsKIAogICAvLyBSZXNvbHZlIHRoZSBiYXNlIHR5cGUgbmFtZSB0byBhIGZ1bGx5LXF1YWxpZmllZCBuYW1lLiBSZXR1cm4gZmFsc2UgaWYgdGhlCiAgIC8vIHJlc29sdXRpb24gZmFpbHMuCi0gIGJvb2wgUmVzb2x2ZShjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMpOworICBib29sIFJlc29sdmUoY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLCBjb25zdCBBaWRsU2NvcGUqIHNjb3BlKTsKIAogICBib29sIENoZWNrVmFsaWQoY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzKSBjb25zdDsKLSAgYm9vbCBMYW5ndWFnZVNwZWNpZmljQ2hlY2tWYWxpZChjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsIE9wdGlvbnM6Okxhbmd1YWdlIGxhbmcpIGNvbnN0OworICBib29sIExhbmd1YWdlU3BlY2lmaWNDaGVja1ZhbGlkKE9wdGlvbnM6Okxhbmd1YWdlIGxhbmcpIGNvbnN0OwogICBjb25zdCBBaWRsTm9kZSYgQXNBaWRsTm9kZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuICp0aGlzOyB9CiAKICAgY29uc3QgQWlkbERlZmluZWRUeXBlKiBHZXREZWZpbmVkVHlwZSgpIGNvbnN0OwotICB2b2lkIFRyYXZlcnNlQ2hpbGRyZW4oc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IEFpZGxOb2RlJik+IHRyYXZlcnNlKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgQWlkbEFubm90YXRhYmxlOjpUcmF2ZXJzZUNoaWxkcmVuKHRyYXZlcnNlKTsKLSAgICBpZiAoSXNHZW5lcmljKCkpIHsKLSAgICAgIGZvciAoY29uc3QgYXV0byYgdHAgOiBHZXRUeXBlUGFyYW1ldGVycygpKSB7Ci0gICAgICAgIHRyYXZlcnNlKCp0cCk7Ci0gICAgICB9Ci0gICAgfQotICB9CisgIHZvaWQgVHJhdmVyc2VDaGlsZHJlbihzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgQWlkbE5vZGUmKT4gdHJhdmVyc2UpIGNvbnN0IG92ZXJyaWRlOwogICB2b2lkIERpc3BhdGNoVmlzaXQoQWlkbFZpc2l0b3ImIHYpIGNvbnN0IG92ZXJyaWRlIHsgdi5WaXNpdCgqdGhpcyk7IH0KIAogIHByaXZhdGU6Ci0gIEFpZGxUeXBlU3BlY2lmaWVyKGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJikgPSBkZWZhdWx0OwotCiAgIGNvbnN0IHN0cmluZyB1bnJlc29sdmVkX25hbWVfOwogICBzdHJpbmcgZnVsbHlfcXVhbGlmaWVkX25hbWVfOwotICBib29sIGlzX2FycmF5XzsKKyAgbXV0YWJsZSBzdGQ6Om9wdGlvbmFsPEFycmF5VHlwZT4gYXJyYXlfOworICBtdXRhYmxlIGJvb2wgbXV0YXRlZF8gPSBmYWxzZTsgIC8vIFZpZXdBc0FycmF5QmFzZSgpIHNldHMgdGhpcyBhcyB0cnVlIHRvIGRpc3Rpbmd1aXNoIG11dGF0ZWQgb25lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSB0aGUgb3JpZ2luYWwgdHlwZQogICB2ZWN0b3I8c3RyaW5nPiBzcGxpdF9uYW1lXzsKICAgY29uc3QgQWlkbERlZmluZWRUeXBlKiBkZWZpbmVkX3R5cGVfID0gbnVsbHB0cjsgIC8vIHNldCB3aGVuIFJlc29sdmUoKSBmb3IgZGVmaW5lZCB0eXBlcwotICBtdXRhYmxlIHNoYXJlZF9wdHI8QWlkbFR5cGVTcGVjaWZpZXI+IGFycmF5X2Jhc2VfOwogfTsKIAogLy8gUmV0dXJucyB0aGUgdW5pdmVyc2FsIHZhbHVlIHVuYWx0ZXJlZC4KLXN0ZDo6c3RyaW5nIEFpZGxDb25zdGFudFZhbHVlRGVjb3JhdG9yKGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiB0eXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgcmF3X3ZhbHVlKTsKK3N0ZDo6c3RyaW5nIEFpZGxDb25zdGFudFZhbHVlRGVjb3JhdG9yKAorICAgIGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiB0eXBlLAorICAgIGNvbnN0IHN0ZDo6dmFyaWFudDxzdGQ6OnN0cmluZywgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+PiYgcmF3X3ZhbHVlKTsKIAotY2xhc3MgQWlkbE1lbWJlciA6IHB1YmxpYyBBaWRsQ29tbWVudGFibGUgeworY2xhc3MgQWlkbE1lbWJlciA6IHB1YmxpYyBBaWRsQW5ub3RhdGFibGUgewogIHB1YmxpYzoKICAgQWlkbE1lbWJlcihjb25zdCBBaWRsTG9jYXRpb24mIGxvY2F0aW9uLCBjb25zdCBDb21tZW50cyYgY29tbWVudHMpOwogICB2aXJ0dWFsIH5BaWRsTWVtYmVyKCkgPSBkZWZhdWx0OwpAQCAtNDQ2LDIyICs0OTksNiBAQAogICBBaWRsTWVtYmVyKEFpZGxNZW1iZXImJikgPSBkZWxldGU7CiAgIEFpZGxNZW1iZXImIG9wZXJhdG9yPShjb25zdCBBaWRsTWVtYmVyJikgPSBkZWxldGU7CiAgIEFpZGxNZW1iZXImIG9wZXJhdG9yPShBaWRsTWVtYmVyJiYpID0gZGVsZXRlOwotCi0gIHZpcnR1YWwgY29uc3QgQWlkbE1ldGhvZCogQXNNZXRob2QoKSBjb25zdCB7IHJldHVybiBudWxscHRyOyB9Ci0gIHZpcnR1YWwgY29uc3QgQWlkbENvbnN0YW50RGVjbGFyYXRpb24qIEFzQ29uc3RhbnREZWNsYXJhdGlvbigpIGNvbnN0IHsgcmV0dXJuIG51bGxwdHI7IH0KLSAgdmlydHVhbCBjb25zdCBBaWRsVmFyaWFibGVEZWNsYXJhdGlvbiogQXNWYXJpYWJsZURlY2xhcmF0aW9uKCkgY29uc3QgeyByZXR1cm4gbnVsbHB0cjsgfQotCi0gIEFpZGxNZXRob2QqIEFzTWV0aG9kKCkgewotICAgIHJldHVybiBjb25zdF9jYXN0PEFpZGxNZXRob2QqPihjb25zdF9jYXN0PGNvbnN0IEFpZGxNZW1iZXIqPih0aGlzKS0+QXNNZXRob2QoKSk7Ci0gIH0KLSAgQWlkbENvbnN0YW50RGVjbGFyYXRpb24qIEFzQ29uc3RhbnREZWNsYXJhdGlvbigpIHsKLSAgICByZXR1cm4gY29uc3RfY2FzdDxBaWRsQ29uc3RhbnREZWNsYXJhdGlvbio+KAotICAgICAgICBjb25zdF9jYXN0PGNvbnN0IEFpZGxNZW1iZXIqPih0aGlzKS0+QXNDb25zdGFudERlY2xhcmF0aW9uKCkpOwotICB9Ci0gIEFpZGxWYXJpYWJsZURlY2xhcmF0aW9uKiBBc1ZhcmlhYmxlRGVjbGFyYXRpb24oKSB7Ci0gICAgcmV0dXJuIGNvbnN0X2Nhc3Q8QWlkbFZhcmlhYmxlRGVjbGFyYXRpb24qPigKLSAgICAgICAgY29uc3RfY2FzdDxjb25zdCBBaWRsTWVtYmVyKj4odGhpcyktPkFzVmFyaWFibGVEZWNsYXJhdGlvbigpKTsKLSAgfQogfTsKIAogLy8gVE9ETzogVGhpcyBjbGFzcyBpcyB1c2VkIGZvciBtZXRob2QgYXJndW1lbnRzIGFuZCBhbHNvIHBhcmNlbGFibGUgZmllbGRzLApAQCAtNDgxLDggKzUxOCw2IEBACiAgIEFpZGxWYXJpYWJsZURlY2xhcmF0aW9uJiBvcGVyYXRvcj0oY29uc3QgQWlkbFZhcmlhYmxlRGVjbGFyYXRpb24mKSA9IGRlbGV0ZTsKICAgQWlkbFZhcmlhYmxlRGVjbGFyYXRpb24mIG9wZXJhdG9yPShBaWRsVmFyaWFibGVEZWNsYXJhdGlvbiYmKSA9IGRlbGV0ZTsKIAotICBjb25zdCBBaWRsVmFyaWFibGVEZWNsYXJhdGlvbiogQXNWYXJpYWJsZURlY2xhcmF0aW9uKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gdGhpczsgfQotCiAgIHN0ZDo6c3RyaW5nIEdldE5hbWUoKSBjb25zdCB7IHJldHVybiBuYW1lXzsgfQogICBzdGQ6OnN0cmluZyBHZXRDYXBpdGFsaXplZE5hbWUoKSBjb25zdDsKICAgY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIEdldFR5cGUoKSBjb25zdCB7IHJldHVybiAqdHlwZV87IH0KQEAgLTU0OSw5ICs1ODQsNiBAQAogICAvLyBlLmcpICJpbiBAdXRmOEluQ3BwIFN0cmluZ1tdIG5hbWVzIgogICBzdGQ6OnN0cmluZyBUb1N0cmluZygpIGNvbnN0OwogCi0gIHZvaWQgVHJhdmVyc2VDaGlsZHJlbihzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgQWlkbE5vZGUmKT4gdHJhdmVyc2UpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICB0cmF2ZXJzZShHZXRUeXBlKCkpOwotICB9CiAgIHZvaWQgRGlzcGF0Y2hWaXNpdChBaWRsVmlzaXRvciYgdikgY29uc3Qgb3ZlcnJpZGUgeyB2LlZpc2l0KCp0aGlzKTsgfQogCiAgcHJpdmF0ZToKQEAgLTY0OCw2ICs2ODAsNyBAQAogICBUeXBlIEdldFR5cGUoKSBjb25zdCB7IHJldHVybiBmaW5hbF90eXBlXzsgfQogICBjb25zdCBzdGQ6OnN0cmluZyYgTGl0ZXJhbCgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXzsgfQogCisgIGJvb2wgRXZhbHVhdGUoKSBjb25zdDsKICAgdmlydHVhbCBib29sIENoZWNrVmFsaWQoKSBjb25zdDsKIAogICAvLyBSYXcgdmFsdWUgb2YgdHlwZSAoY3VycmVudGx5IHZhbGlkIGluIEMrKyBhbmQgSmF2YSkuIEVtcHR5IHN0cmluZyBvbiBlcnJvci4KQEAgLTcwMyw4ICs3MzYsMTAgQEAKICAgY29uc3Qgc3RkOjpzdHJpbmcmIEdldEZpZWxkTmFtZSgpIGNvbnN0IHsgcmV0dXJuIGZpZWxkX25hbWVfOyB9CiAKICAgYm9vbCBDaGVja1ZhbGlkKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIHZvaWQgVHJhdmVyc2VDaGlsZHJlbihzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgQWlkbE5vZGUmKT4pIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAvLyByZXNvbHZlZF8gaXMgbm90IG15IGNoaWxkLgorICB2b2lkIFRyYXZlcnNlQ2hpbGRyZW4oc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IEFpZGxOb2RlJik+IHRyYXZlcnNlKSBjb25zdCBvdmVycmlkZSB7CisgICAgaWYgKHJlZl90eXBlXykgeworICAgICAgdHJhdmVyc2UoKnJlZl90eXBlXyk7CisgICAgfQogICB9CiAgIHZvaWQgRGlzcGF0Y2hWaXNpdChBaWRsVmlzaXRvciYgdikgY29uc3Qgb3ZlcnJpZGUgeyB2LlZpc2l0KCp0aGlzKTsgfQogICBjb25zdCBBaWRsQ29uc3RhbnRWYWx1ZSogUmVzb2x2ZShjb25zdCBBaWRsRGVmaW5lZFR5cGUqIHNjb3BlKSBjb25zdDsKQEAgLTgwMSw4ICs4MzYsNiBAQAogICAgIHJldHVybiB2YWx1ZV8tPlZhbHVlU3RyaW5nKEdldFR5cGUoKSwgZGVjb3JhdG9yKTsKICAgfQogCi0gIGNvbnN0IEFpZGxDb25zdGFudERlY2xhcmF0aW9uKiBBc0NvbnN0YW50RGVjbGFyYXRpb24oKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0aGlzOyB9Ci0KICAgdm9pZCBUcmF2ZXJzZUNoaWxkcmVuKHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBBaWRsTm9kZSYpPiB0cmF2ZXJzZSkgY29uc3Qgb3ZlcnJpZGUgewogICAgIHRyYXZlcnNlKEdldFR5cGUoKSk7CiAgICAgdHJhdmVyc2UoR2V0VmFsdWUoKSk7CkBAIC04MjAsOCArODUzLDcgQEAKICAgQWlkbE1ldGhvZChjb25zdCBBaWRsTG9jYXRpb24mIGxvY2F0aW9uLCBib29sIG9uZXdheSwgQWlkbFR5cGVTcGVjaWZpZXIqIHR5cGUsIGNvbnN0IHN0cmluZyYgbmFtZSwKICAgICAgICAgICAgICB2ZWN0b3I8dW5pcXVlX3B0cjxBaWRsQXJndW1lbnQ+PiogYXJncywgY29uc3QgQ29tbWVudHMmIGNvbW1lbnRzKTsKICAgQWlkbE1ldGhvZChjb25zdCBBaWRsTG9jYXRpb24mIGxvY2F0aW9uLCBib29sIG9uZXdheSwgQWlkbFR5cGVTcGVjaWZpZXIqIHR5cGUsIGNvbnN0IHN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICB2ZWN0b3I8dW5pcXVlX3B0cjxBaWRsQXJndW1lbnQ+PiogYXJncywgY29uc3QgQ29tbWVudHMmIGNvbW1lbnRzLCBpbnQgaWQsCi0gICAgICAgICAgICAgYm9vbCBpc191c2VyX2RlZmluZWQgPSB0cnVlKTsKKyAgICAgICAgICAgICB2ZWN0b3I8dW5pcXVlX3B0cjxBaWRsQXJndW1lbnQ+PiogYXJncywgY29uc3QgQ29tbWVudHMmIGNvbW1lbnRzLCBpbnQgaWQpOwogICB2aXJ0dWFsIH5BaWRsTWV0aG9kKCkgPSBkZWZhdWx0OwogCiAgIC8vIG5vbi1jb3B5YWJsZSwgbm9uLW1vdmFibGUKQEAgLTgzMCw3ICs4NjIsNyBAQAogICBBaWRsTWV0aG9kJiBvcGVyYXRvcj0oY29uc3QgQWlkbE1ldGhvZCYpID0gZGVsZXRlOwogICBBaWRsTWV0aG9kJiBvcGVyYXRvcj0oQWlkbE1ldGhvZCYmKSA9IGRlbGV0ZTsKIAotICBjb25zdCBBaWRsTWV0aG9kKiBBc01ldGhvZCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRoaXM7IH0KKyAgYm9vbCBDaGVja1ZhbGlkKGNvbnN0IEFpZGxUeXBlbmFtZXMmKSBjb25zdDsKICAgY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIEdldFR5cGUoKSBjb25zdCB7IHJldHVybiAqdHlwZV87IH0KICAgQWlkbFR5cGVTcGVjaWZpZXIqIEdldE11dGFibGVUeXBlKCkgeyByZXR1cm4gdHlwZV8uZ2V0KCk7IH0KIApAQCAtODQzLDggKzg3NSw2IEBACiAgIGludCBHZXRJZCgpIGNvbnN0IHsgcmV0dXJuIGlkXzsgfQogICB2b2lkIFNldElkKHVuc2lnbmVkIGlkKSB7IGlkXyA9IGlkOyB9CiAKLSAgYm9vbCBJc1VzZXJEZWZpbmVkKCkgY29uc3QgeyByZXR1cm4gaXNfdXNlcl9kZWZpbmVkXzsgfQotCiAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxBaWRsQXJndW1lbnQ+PiYgR2V0QXJndW1lbnRzKCkgY29uc3QgewogICAgIHJldHVybiBhcmd1bWVudHNfOwogICB9CkBAIC04ODYsMTIgKzkxNiwxMSBAQAogICBzdGQ6OnZlY3Rvcjxjb25zdCBBaWRsQXJndW1lbnQqPiBvdXRfYXJndW1lbnRzXzsKICAgYm9vbCBoYXNfaWRfOwogICBpbnQgaWRfOwotICBib29sIGlzX3VzZXJfZGVmaW5lZF8gPSB0cnVlOwogfTsKIAogLy8gQWlkbERlZmluZWRUeXBlIHJlcHJlc2VudHMgZWl0aGVyIGFuIGludGVyZmFjZSwgcGFyY2VsYWJsZSwgb3IgZW51bSB0aGF0IGlzCiAvLyBkZWZpbmVkIGluIHRoZSBzb3VyY2UgZmlsZS4KLWNsYXNzIEFpZGxEZWZpbmVkVHlwZSA6IHB1YmxpYyBBaWRsQW5ub3RhdGFibGUgeworY2xhc3MgQWlkbERlZmluZWRUeXBlIDogcHVibGljIEFpZGxNZW1iZXIsIHB1YmxpYyBBaWRsU2NvcGUgewogIHB1YmxpYzoKICAgQWlkbERlZmluZWRUeXBlKGNvbnN0IEFpZGxMb2NhdGlvbiYgbG9jYXRpb24sIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBDb21tZW50cyYgY29tbWVudHMsCiAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGFja2FnZSwgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFpZGxNZW1iZXI+PiogbWVtYmVycyk7CkBAIC05MDUsMTEgKzkzNCwxNyBAQAogCiAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBHZXROYW1lKCkgY29uc3QgeyByZXR1cm4gbmFtZV87IH07CiAKKyAgc3RkOjpzdHJpbmcgUmVzb2x2ZU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIGNvbnN0IG92ZXJyaWRlOworCiAgIC8qIGRvdCBqb2luZWQgcGFja2FnZSwgZXhhbXBsZTogImFuZHJvaWQucGFja2FnZS5mb28iICovCiAgIHN0ZDo6c3RyaW5nIEdldFBhY2thZ2UoKSBjb25zdCB7IHJldHVybiBwYWNrYWdlXzsgfQogICAvKiBkb3Qgam9pbmVkIHBhY2thZ2UgYW5kIG5hbWUsIGV4YW1wbGU6ICJhbmRyb2lkLnBhY2thZ2UuZm9vLklCYXIiICovCiAgIHN0ZDo6c3RyaW5nIEdldENhbm9uaWNhbE5hbWUoKSBjb25zdDsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBHZXRTcGxpdFBhY2thZ2UoKSBjb25zdCB7IHJldHVybiBzcGxpdF9wYWNrYWdlXzsgfQorICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gR2V0U3BsaXRQYWNrYWdlKCkgY29uc3QgeworICAgIGlmIChwYWNrYWdlXy5lbXB0eSgpKSByZXR1cm4gc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KCk7CisgICAgcmV0dXJuIGFuZHJvaWQ6OmJhc2U6OlNwbGl0KHBhY2thZ2VfLCAiLiIpOworICB9CisgIGNvbnN0IEFpZGxEb2N1bWVudCYgR2V0RG9jdW1lbnQoKSBjb25zdDsKIAogICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIEdldFByZXByb2Nlc3NEZWNsYXJhdGlvbk5hbWUoKSBjb25zdCA9IDA7CiAKQEAgLTkyMCw4ICs5NTUsNyBAQAogICB2aXJ0dWFsIGNvbnN0IEFpZGxJbnRlcmZhY2UqIEFzSW50ZXJmYWNlKCkgY29uc3QgeyByZXR1cm4gbnVsbHB0cjsgfQogICB2aXJ0dWFsIGNvbnN0IEFpZGxQYXJhbWV0ZXJpemFibGU8c3RkOjpzdHJpbmc+KiBBc1BhcmFtZXRlcml6YWJsZSgpIGNvbnN0IHsgcmV0dXJuIG51bGxwdHI7IH0KICAgdmlydHVhbCBib29sIENoZWNrVmFsaWQoY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzKSBjb25zdDsKLSAgdmlydHVhbCBib29sIExhbmd1YWdlU3BlY2lmaWNDaGVja1ZhbGlkKGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbnM6Okxhbmd1YWdlIGxhbmcpIGNvbnN0ID0gMDsKKyAgYm9vbCBMYW5ndWFnZVNwZWNpZmljQ2hlY2tWYWxpZChPcHRpb25zOjpMYW5ndWFnZSBsYW5nKSBjb25zdDsKICAgQWlkbFN0cnVjdHVyZWRQYXJjZWxhYmxlKiBBc1N0cnVjdHVyZWRQYXJjZWxhYmxlKCkgewogICAgIHJldHVybiBjb25zdF9jYXN0PEFpZGxTdHJ1Y3R1cmVkUGFyY2VsYWJsZSo+KAogICAgICAgICBjb25zdF9jYXN0PGNvbnN0IEFpZGxEZWZpbmVkVHlwZSo+KHRoaXMpLT5Bc1N0cnVjdHVyZWRQYXJjZWxhYmxlKCkpOwpAQCAtOTU1LDcgKzk4OSw5IEBACiAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8QWlkbFBhcmNlbGFibGUqPigKICAgICAgICAgY29uc3RfY2FzdDxjb25zdCBBaWRsRGVmaW5lZFR5cGUqPih0aGlzKS0+QXNVbnN0cnVjdHVyZWRQYXJjZWxhYmxlKCkpOwogICB9Ci0KKyAgY29uc3QgQWlkbERlZmluZWRUeXBlKiBHZXRQYXJlbnRUeXBlKCkgY29uc3Q7CisgIGNvbnN0IEFpZGxEZWZpbmVkVHlwZSogR2V0Um9vdFR5cGUoKSBjb25zdDsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFpZGxEZWZpbmVkVHlwZT4+JiBHZXROZXN0ZWRUeXBlcygpIGNvbnN0IHsgcmV0dXJuIHR5cGVzXzsgfQogICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QWlkbFZhcmlhYmxlRGVjbGFyYXRpb24+PiYgR2V0RmllbGRzKCkgY29uc3QgewogICAgIHJldHVybiB2YXJpYWJsZXNfOwogICB9CkBAIC05NjMsNyArOTk5LDYgQEAKICAgICByZXR1cm4gY29uc3RhbnRzXzsKICAgfQogICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QWlkbE1ldGhvZD4+JiBHZXRNZXRob2RzKCkgY29uc3QgeyByZXR1cm4gbWV0aG9kc187IH0KLSAgdm9pZCBBZGRNZXRob2Qoc3RkOjp1bmlxdWVfcHRyPEFpZGxNZXRob2Q+IG1ldGhvZCkgeyBtZXRob2RzXy5wdXNoX2JhY2soc3RkOjptb3ZlKG1ldGhvZCkpOyB9CiAgIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IEFpZGxNZW1iZXIqPiYgR2V0TWVtYmVycygpIGNvbnN0IHsgcmV0dXJuIG1lbWJlcnNfOyB9CiAgIHZvaWQgVHJhdmVyc2VDaGlsZHJlbihzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgQWlkbE5vZGUmKT4gdHJhdmVyc2UpIGNvbnN0IG92ZXJyaWRlIHsKICAgICBBaWRsQW5ub3RhdGFibGU6OlRyYXZlcnNlQ2hpbGRyZW4odHJhdmVyc2UpOwpAQCAtOTcyLDYgKzEwMDcsMTcgQEAKICAgICB9CiAgIH0KIAorICAvLyBNb2RpZmllcnMKKyAgdm9pZCBBZGRNZXRob2Qoc3RkOjp1bmlxdWVfcHRyPEFpZGxNZXRob2Q+IG1ldGhvZCkgeworICAgIG1lbWJlcnNfLnB1c2hfYmFjayhtZXRob2QuZ2V0KCkpOworICAgIG1ldGhvZHNfLnB1c2hfYmFjayhzdGQ6Om1vdmUobWV0aG9kKSk7CisgIH0KKyAgdm9pZCBBZGRUeXBlKHN0ZDo6dW5pcXVlX3B0cjxBaWRsRGVmaW5lZFR5cGU+IHR5cGUpIHsKKyAgICB0eXBlLT5TZXRFbmNsb3NpbmdTY29wZSh0aGlzKTsKKyAgICBtZW1iZXJzXy5wdXNoX2JhY2sodHlwZS5nZXQoKSk7CisgICAgdHlwZXNfLnB1c2hfYmFjayhzdGQ6Om1vdmUodHlwZSkpOworICB9CisKICBwcm90ZWN0ZWQ6CiAgIC8vIHV0aWxpdHkgZm9yIHN1YmNsYXNzZXMgd2l0aCBnZXR0ZXIgbmFtZXMKICAgYm9vbCBDaGVja1ZhbGlkRm9yR2V0dGVyTmFtZXMoKSBjb25zdDsKQEAgLTk4MCwxMSArMTAyNiwxMSBAQAogICBib29sIENoZWNrVmFsaWRXaXRoTWVtYmVycyhjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMpIGNvbnN0OwogCiAgIHN0ZDo6c3RyaW5nIG5hbWVfOwotICBjb25zdCBzdGQ6OnN0cmluZyBwYWNrYWdlXzsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHNwbGl0X3BhY2thZ2VfOworICBzdGQ6OnN0cmluZyBwYWNrYWdlXzsKICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFpZGxWYXJpYWJsZURlY2xhcmF0aW9uPj4gdmFyaWFibGVzXzsKICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFpZGxDb25zdGFudERlY2xhcmF0aW9uPj4gY29uc3RhbnRzXzsKICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFpZGxNZXRob2Q+PiBtZXRob2RzXzsKKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFpZGxEZWZpbmVkVHlwZT4+IHR5cGVzXzsKICAgc3RkOjp2ZWN0b3I8Y29uc3QgQWlkbE1lbWJlcio+IG1lbWJlcnNfOyAgLy8ga2VlcCBtZW1iZXJzIGluIG9yZGVyIG9mIGFwcGVhcmFuY2UuCiB9OwogCkBAIC0xMDA1LDggKzEwNTEsNiBAQAogICBzdGQ6OnN0cmluZyBHZXRDcHBIZWFkZXIoKSBjb25zdCB7IHJldHVybiBjcHBfaGVhZGVyXzsgfQogCiAgIGJvb2wgQ2hlY2tWYWxpZChjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMpIGNvbnN0IG92ZXJyaWRlOwotICBib29sIExhbmd1YWdlU3BlY2lmaWNDaGVja1ZhbGlkKGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25zOjpMYW5ndWFnZSBsYW5nKSBjb25zdCBvdmVycmlkZTsKICAgY29uc3QgQWlkbFBhcmNlbGFibGUqIEFzUGFyY2VsYWJsZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRoaXM7IH0KICAgY29uc3QgQWlkbFBhcmFtZXRlcml6YWJsZTxzdGQ6OnN0cmluZz4qIEFzUGFyYW1ldGVyaXphYmxlKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gdGhpczsgfQogICBjb25zdCBBaWRsTm9kZSYgQXNBaWRsTm9kZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuICp0aGlzOyB9CkBAIC0xMDM2LDkgKzEwODAsNiBAQAogICBzdGQ6OnN0cmluZyBHZXRQcmVwcm9jZXNzRGVjbGFyYXRpb25OYW1lKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gInN0cnVjdHVyZWRfcGFyY2VsYWJsZSI7IH0KIAogICBib29sIENoZWNrVmFsaWQoY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzKSBjb25zdCBvdmVycmlkZTsKLSAgYm9vbCBMYW5ndWFnZVNwZWNpZmljQ2hlY2tWYWxpZChjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uczo6TGFuZ3VhZ2UgbGFuZykgY29uc3Qgb3ZlcnJpZGU7Ci0KICAgdm9pZCBEaXNwYXRjaFZpc2l0KEFpZGxWaXNpdG9yJiB2KSBjb25zdCBvdmVycmlkZSB7IHYuVmlzaXQoKnRoaXMpOyB9CiB9OwogCkBAIC0xMDk0LDE2ICsxMTM1LDE1IEBACiAgICAgcmV0dXJuIGVudW1lcmF0b3JzXzsKICAgfQogICBib29sIENoZWNrVmFsaWQoY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzKSBjb25zdCBvdmVycmlkZTsKLSAgYm9vbCBMYW5ndWFnZVNwZWNpZmljQ2hlY2tWYWxpZChjb25zdCBBaWRsVHlwZW5hbWVzJiAvKnR5cGVuYW1lcyovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbnM6Okxhbmd1YWdlKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KICAgc3RkOjpzdHJpbmcgR2V0UHJlcHJvY2Vzc0RlY2xhcmF0aW9uTmFtZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuICJlbnVtIjsgfQogCiAgIGNvbnN0IEFpZGxFbnVtRGVjbGFyYXRpb24qIEFzRW51bURlY2xhcmF0aW9uKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gdGhpczsgfQogCiAgIHZvaWQgVHJhdmVyc2VDaGlsZHJlbihzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgQWlkbE5vZGUmKT4gdHJhdmVyc2UpIGNvbnN0IG92ZXJyaWRlIHsKICAgICBBaWRsRGVmaW5lZFR5cGU6OlRyYXZlcnNlQ2hpbGRyZW4odHJhdmVyc2UpOworICAgIGlmIChiYWNraW5nX3R5cGVfKSB7CisgICAgICB0cmF2ZXJzZSgqYmFja2luZ190eXBlXyk7CisgICAgfQogICAgIGZvciAoY29uc3QgYXV0byYgYyA6IEdldEVudW1lcmF0b3JzKCkpIHsKICAgICAgIHRyYXZlcnNlKCpjKTsKICAgICB9CkBAIC0xMTMzLDggKzExNzMsNiBAQAogCiAgIGNvbnN0IEFpZGxOb2RlJiBBc0FpZGxOb2RlKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gKnRoaXM7IH0KICAgYm9vbCBDaGVja1ZhbGlkKGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcykgY29uc3Qgb3ZlcnJpZGU7Ci0gIGJvb2wgTGFuZ3VhZ2VTcGVjaWZpY0NoZWNrVmFsaWQoY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbnM6Okxhbmd1YWdlIGxhbmcpIGNvbnN0IG92ZXJyaWRlOwogICBzdGQ6OnN0cmluZyBHZXRQcmVwcm9jZXNzRGVjbGFyYXRpb25OYW1lKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gInVuaW9uIjsgfQogCiAgIGNvbnN0IEFpZGxVbmlvbkRlY2wqIEFzVW5pb25EZWNsYXJhdGlvbigpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRoaXM7IH0KQEAgLTExNDQsNyArMTE4Miw3IEBACiBjbGFzcyBBaWRsSW50ZXJmYWNlIGZpbmFsIDogcHVibGljIEFpZGxEZWZpbmVkVHlwZSB7CiAgcHVibGljOgogICBBaWRsSW50ZXJmYWNlKGNvbnN0IEFpZGxMb2NhdGlvbiYgbG9jYXRpb24sIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBDb21tZW50cyYgY29tbWVudHMsCi0gICAgICAgICAgICAgICAgYm9vbCBvbmV3YXlfLCBjb25zdCBzdGQ6OnN0cmluZyYgcGFja2FnZSwKKyAgICAgICAgICAgICAgICBib29sIG9uZXdheSwgY29uc3Qgc3RkOjpzdHJpbmcmIHBhY2thZ2UsCiAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFpZGxNZW1iZXI+PiogbWVtYmVycyk7CiAgIHZpcnR1YWwgfkFpZGxJbnRlcmZhY2UoKSA9IGRlZmF1bHQ7CiAKQEAgLTExNTgsNTEgKzExOTYsMjEgQEAKICAgc3RkOjpzdHJpbmcgR2V0UHJlcHJvY2Vzc0RlY2xhcmF0aW9uTmFtZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuICJpbnRlcmZhY2UiOyB9CiAKICAgYm9vbCBDaGVja1ZhbGlkKGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcykgY29uc3Qgb3ZlcnJpZGU7Ci0gIGJvb2wgTGFuZ3VhZ2VTcGVjaWZpY0NoZWNrVmFsaWQoY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbnM6Okxhbmd1YWdlIGxhbmcpIGNvbnN0IG92ZXJyaWRlOwotCisgIGJvb2wgQ2hlY2tWYWxpZFBlcm1pc3Npb25Bbm5vdGF0aW9ucyhjb25zdCBBaWRsTWV0aG9kJiBtKSBjb25zdDsKICAgc3RkOjpzdHJpbmcgR2V0RGVzY3JpcHRvcigpIGNvbnN0OwogICB2b2lkIERpc3BhdGNoVmlzaXQoQWlkbFZpc2l0b3ImIHYpIGNvbnN0IG92ZXJyaWRlIHsgdi5WaXNpdCgqdGhpcyk7IH0KIH07CiAKLWNsYXNzIEFpZGxQYWNrYWdlIDogcHVibGljIEFpZGxOb2RlIHsKLSBwdWJsaWM6Ci0gIEFpZGxQYWNrYWdlKGNvbnN0IEFpZGxMb2NhdGlvbiYgbG9jYXRpb24sIGNvbnN0IENvbW1lbnRzJiBjb21tZW50cykKLSAgICAgIDogQWlkbE5vZGUobG9jYXRpb24sIGNvbW1lbnRzKSB7fQotICB2aXJ0dWFsIH5BaWRsUGFja2FnZSgpID0gZGVmYXVsdDsKLSAgdm9pZCBUcmF2ZXJzZUNoaWxkcmVuKHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBBaWRsTm9kZSYpPikgY29uc3Qge30KLSAgdm9pZCBEaXNwYXRjaFZpc2l0KEFpZGxWaXNpdG9yJiB2KSBjb25zdCB7IHYuVmlzaXQoKnRoaXMpOyB9Ci19OwotCi1jbGFzcyBBaWRsSW1wb3J0IDogcHVibGljIEFpZGxOb2RlIHsKLSBwdWJsaWM6Ci0gIEFpZGxJbXBvcnQoY29uc3QgQWlkbExvY2F0aW9uJiBsb2NhdGlvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIG5lZWRlZF9jbGFzcywKLSAgICAgICAgICAgICBjb25zdCBDb21tZW50cyYgY29tbWVudHMpOwotICB2aXJ0dWFsIH5BaWRsSW1wb3J0KCkgPSBkZWZhdWx0OwotCi0gIC8vIG5vbi1jb3B5YWJsZSwgbm9uLW1vdmFibGUKLSAgQWlkbEltcG9ydChjb25zdCBBaWRsSW1wb3J0JikgPSBkZWxldGU7Ci0gIEFpZGxJbXBvcnQoQWlkbEltcG9ydCYmKSA9IGRlbGV0ZTsKLSAgQWlkbEltcG9ydCYgb3BlcmF0b3I9KGNvbnN0IEFpZGxJbXBvcnQmKSA9IGRlbGV0ZTsKLSAgQWlkbEltcG9ydCYgb3BlcmF0b3I9KEFpZGxJbXBvcnQmJikgPSBkZWxldGU7Ci0KLSAgY29uc3Qgc3RkOjpzdHJpbmcmIEdldE5lZWRlZENsYXNzKCkgY29uc3QgeyByZXR1cm4gbmVlZGVkX2NsYXNzXzsgfQotICB2b2lkIFRyYXZlcnNlQ2hpbGRyZW4oc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IEFpZGxOb2RlJik+KSBjb25zdCB7fQotICB2b2lkIERpc3BhdGNoVmlzaXQoQWlkbFZpc2l0b3ImIHYpIGNvbnN0IHsgdi5WaXNpdCgqdGhpcyk7IH0KLQotIHByaXZhdGU6Ci0gIHN0ZDo6c3RyaW5nIG5lZWRlZF9jbGFzc187Ci19OworaW5saW5lIHN0ZDo6c3RyaW5nIFNpbXBsZU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHF1YWxpZmllZF9uYW1lKSB7CisgIHJldHVybiBxdWFsaWZpZWRfbmFtZS5zdWJzdHIocXVhbGlmaWVkX25hbWUucmZpbmQoJy4nKSArIDEpOworfQogCiAvLyBBaWRsRG9jdW1lbnQgbW9kZWxzIGFuIEFJREwgZmlsZQotY2xhc3MgQWlkbERvY3VtZW50IDogcHVibGljIEFpZGxDb21tZW50YWJsZSB7CitjbGFzcyBBaWRsRG9jdW1lbnQgOiBwdWJsaWMgQWlkbENvbW1lbnRhYmxlLCBwdWJsaWMgQWlkbFNjb3BlIHsKICBwdWJsaWM6CiAgIEFpZGxEb2N1bWVudChjb25zdCBBaWRsTG9jYXRpb24mIGxvY2F0aW9uLCBjb25zdCBDb21tZW50cyYgY29tbWVudHMsCi0gICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QWlkbEltcG9ydD4+IGltcG9ydHMsCi0gICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QWlkbERlZmluZWRUeXBlPj4gZGVmaW5lZF90eXBlcykKLSAgICAgIDogQWlkbENvbW1lbnRhYmxlKGxvY2F0aW9uLCBjb21tZW50cyksCi0gICAgICAgIGltcG9ydHNfKHN0ZDo6bW92ZShpbXBvcnRzKSksCi0gICAgICAgIGRlZmluZWRfdHlwZXNfKHN0ZDo6bW92ZShkZWZpbmVkX3R5cGVzKSkge30KKyAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBpbXBvcnRzLAorICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFpZGxEZWZpbmVkVHlwZT4+IGRlZmluZWRfdHlwZXMsIGJvb2wgaXNfcHJlcHJvY2Vzc2VkKTsKICAgfkFpZGxEb2N1bWVudCgpID0gZGVmYXVsdDsKIAogICAvLyBub24tY29weWFibGUsIG5vbi1tb3ZhYmxlCkBAIC0xMjExLDE2ICsxMjE5LDE0IEBACiAgIEFpZGxEb2N1bWVudCYgb3BlcmF0b3I9KGNvbnN0IEFpZGxEb2N1bWVudCYpID0gZGVsZXRlOwogICBBaWRsRG9jdW1lbnQmIG9wZXJhdG9yPShBaWRsRG9jdW1lbnQmJikgPSBkZWxldGU7CiAKLSAgc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4gUmVzb2x2ZU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHVucmVzb2x2ZWRfdHlwZSkgY29uc3Q7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxBaWRsSW1wb3J0Pj4mIEltcG9ydHMoKSBjb25zdCB7IHJldHVybiBpbXBvcnRzXzsgfQorICBzdGQ6OnN0cmluZyBSZXNvbHZlTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgY29uc3Qgb3ZlcnJpZGU7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgSW1wb3J0cygpIGNvbnN0IHsgcmV0dXJuIGltcG9ydHNfOyB9CiAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxBaWRsRGVmaW5lZFR5cGU+PiYgRGVmaW5lZFR5cGVzKCkgY29uc3QgewogICAgIHJldHVybiBkZWZpbmVkX3R5cGVzXzsKICAgfQorICBib29sIElzUHJlcHJvY2Vzc2VkKCkgY29uc3QgeyByZXR1cm4gaXNfcHJlcHJvY2Vzc2VkXzsgfQogCiAgIHZvaWQgVHJhdmVyc2VDaGlsZHJlbihzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgQWlkbE5vZGUmKT4gdHJhdmVyc2UpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIGkgOiBJbXBvcnRzKCkpIHsKLSAgICAgIHRyYXZlcnNlKCppKTsKLSAgICB9CiAgICAgZm9yIChjb25zdCBhdXRvJiB0IDogRGVmaW5lZFR5cGVzKCkpIHsKICAgICAgIHRyYXZlcnNlKCp0KTsKICAgICB9CkBAIC0xMjI4LDggKzEyMzQsOSBAQAogICB2b2lkIERpc3BhdGNoVmlzaXQoQWlkbFZpc2l0b3ImIHYpIGNvbnN0IG92ZXJyaWRlIHsgdi5WaXNpdCgqdGhpcyk7IH0KIAogIHByaXZhdGU6Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxBaWRsSW1wb3J0Pj4gaW1wb3J0c187CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBpbXBvcnRzXzsKICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFpZGxEZWZpbmVkVHlwZT4+IGRlZmluZWRfdHlwZXNfOworICBib29sIGlzX3ByZXByb2Nlc3NlZF87CiB9OwogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KQEAgLTEyNDEsMTUgKzEyNDgsMTE0IEBACiAgIHJldHVybiBpdC0+c2Vjb25kLT5FdmFsdWF0ZWRWYWx1ZTxUPigpOwogfQogCi0vLyBVdGlsaXR5IHRvIG1ha2UgYSB2aXNpdG9yIHRvIHZpc2l0IEFTVCB0cmVlIGluIHRvcC1kb3duIG9yZGVyCisvLyBVdGlsaXRpZXMgdG8gbWFrZSBhIHZpc2l0b3IgdG8gdmlzaXQgQVNUIHRyZWUgaW4gdG9wLWRvd24gb3JkZXIKIC8vIEdpdmVuOiAgICAgICBmb28KIC8vICAgICAgICAgICAgICAvIFwKIC8vICAgICAgICAgICAgYmFyIGJhegogLy8gVmlzaXRUb3BEb3duKHYsIGZvbykgbWFrZXMgdiB2aXNpdCBmb28gLT4gYmFyIC0+IGJhei4KLWlubGluZSB2b2lkIFZpc2l0VG9wRG93bihBaWRsVmlzaXRvciYgdiwgY29uc3QgQWlkbE5vZGUmIG5vZGUpIHsKK2lubGluZSB2b2lkIFZpc2l0VG9wRG93bihzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgQWlkbE5vZGUmKT4gdiwgY29uc3QgQWlkbE5vZGUmIG5vZGUpIHsKICAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IEFpZGxOb2RlJik+IHRvcF9kb3duID0gWyZdKGNvbnN0IEFpZGxOb2RlJiBuKSB7Ci0gICAgbi5EaXNwYXRjaFZpc2l0KHYpOworICAgIHYobik7CiAgICAgbi5UcmF2ZXJzZUNoaWxkcmVuKHRvcF9kb3duKTsKICAgfTsKICAgdG9wX2Rvd24obm9kZSk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQoraW5saW5lIHZvaWQgVmlzaXRUb3BEb3duKEFpZGxWaXNpdG9yJiB2LCBjb25zdCBBaWRsTm9kZSYgbm9kZSkgeworICBWaXNpdFRvcERvd24oWyZdKGNvbnN0IEFpZGxOb2RlJiBuKSB7IG4uRGlzcGF0Y2hWaXNpdCh2KTsgfSwgbm9kZSk7Cit9CisKKy8vIFV0aWxpdHkgdG8gbWFrZSBhIHZpc2l0b3IgdG8gdmlzaXQgQVNUIHRyZWUgaW4gYm90dG9tLXVwIG9yZGVyCisvLyBHaXZlbjogICAgICAgZm9vCisvLyAgICAgICAgICAgICAgLyBcCisvLyAgICAgICAgICAgIGJhciBiYXoKKy8vIFZpc2l0Qm90dG9tVXAodiwgZm9vKSBtYWtlcyB2IHZpc2l0IGJhciAtPiBiYXogLT4gZm9vLgoraW5saW5lIHZvaWQgVmlzaXRCb3R0b21VcChBaWRsVmlzaXRvciYgdiwgY29uc3QgQWlkbE5vZGUmIG5vZGUpIHsKKyAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IEFpZGxOb2RlJik+IGJvdHRvbV91cCA9IFsmXShjb25zdCBBaWRsTm9kZSYgbikgeworICAgIG4uVHJhdmVyc2VDaGlsZHJlbihib3R0b21fdXApOworICAgIG4uRGlzcGF0Y2hWaXNpdCh2KTsKKyAgfTsKKyAgYm90dG9tX3VwKG5vZGUpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NvbnN0IFQqIEFpZGxDYXN0KGNvbnN0IEFpZGxOb2RlJiBub2RlKSB7CisgIHN0cnVjdCBDYXN0VmlzaXRvciA6IEFpZGxWaXNpdG9yIHsKKyAgICBjb25zdCBUKiBjYXN0ID0gbnVsbHB0cjsKKyAgICB2b2lkIFZpc2l0KGNvbnN0IFQmIHQpIG92ZXJyaWRlIHsgY2FzdCA9ICZ0OyB9CisgIH0gdmlzaXRvcjsKKyAgbm9kZS5EaXNwYXRjaFZpc2l0KHZpc2l0b3IpOworICByZXR1cm4gdmlzaXRvci5jYXN0OworfQorCit0ZW1wbGF0ZSA8PgorY29uc3QgQWlkbERlZmluZWRUeXBlKiBBaWRsQ2FzdDxBaWRsRGVmaW5lZFR5cGU+KGNvbnN0IEFpZGxOb2RlJiBub2RlKTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitUKiBBaWRsQ2FzdChBaWRsTm9kZSYgbm9kZSkgeworICByZXR1cm4gY29uc3RfY2FzdDxUKj4oQWlkbENhc3Q8VD4oY29uc3RfY2FzdDxjb25zdCBBaWRsTm9kZSY+KG5vZGUpKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBBaWRsTm9kZVR5cGU+Cit2ZWN0b3I8Y29uc3QgQWlkbE5vZGVUeXBlKj4gQ29sbGVjdChjb25zdCBBaWRsTm9kZSYgcm9vdCkgeworICB2ZWN0b3I8Y29uc3QgQWlkbE5vZGVUeXBlKj4gcmVzdWx0OworICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgQWlkbE5vZGUmKT4gdG9wX2Rvd24gPSBbJl0oY29uc3QgQWlkbE5vZGUmIG4pIHsKKyAgICBpZiAoYXV0byBjYXN0ID0gQWlkbENhc3Q8QWlkbE5vZGVUeXBlPihuKTsgY2FzdCkgeworICAgICAgcmVzdWx0LnB1c2hfYmFjayhjYXN0KTsKKyAgICB9CisgICAgbi5UcmF2ZXJzZUNoaWxkcmVuKHRvcF9kb3duKTsKKyAgfTsKKyAgdG9wX2Rvd24ocm9vdCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBWaXNpdEZuPgorYm9vbCBUb3BvbG9naWNhbFZpc2l0KGNvbnN0IHZlY3Rvcjx1bmlxdWVfcHRyPEFpZGxEZWZpbmVkVHlwZT4+JiBuZXN0ZWRfdHlwZXMsIFZpc2l0Rm4gdmlzaXQpIHsKKyAgLy8gMS4gTWFwcyBkZWVwbHkgbmVzdGVkIHR5cGVzIHRvIG9uZSBvZiBuZXN0ZWRfdHlwZXMKKyAgbWFwPGNvbnN0IEFpZGxEZWZpbmVkVHlwZSosIGNvbnN0IEFpZGxEZWZpbmVkVHlwZSo+IHJvb3RzOworICBmb3IgKGNvbnN0IGF1dG8mIG5lc3RlZCA6IG5lc3RlZF90eXBlcykgeworICAgIGZvciAoY29uc3QgYXV0byYgdCA6IENvbGxlY3Q8QWlkbERlZmluZWRUeXBlPigqbmVzdGVkKSkgeworICAgICAgcm9vdHNbdF0gPSBuZXN0ZWQuZ2V0KCk7CisgICAgfQorICB9CisgIC8vIDIuIENvbGxlY3Qgc2libGluZyB0eXBlcyByZWZlcmVuY2VkIHdpdGhpbiBlYWNoIG5lc3RlZCB0eXBlLgorICBtYXA8Y29uc3QgQWlkbERlZmluZWRUeXBlKiwgdmVjdG9yPGNvbnN0IEFpZGxEZWZpbmVkVHlwZSo+PiByZXF1aXJlZF90eXBlczsKKyAgZm9yIChjb25zdCBhdXRvJiBuZXN0ZWQgOiBuZXN0ZWRfdHlwZXMpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHQgOiBDb2xsZWN0PEFpZGxUeXBlU3BlY2lmaWVyPigqbmVzdGVkKSkgeworICAgICAgaWYgKGF1dG8gZGVmaW5lZF90eXBlID0gdC0+R2V0RGVmaW5lZFR5cGUoKTsgZGVmaW5lZF90eXBlKSB7CisgICAgICAgIGF1dG8gc2libGluZyA9IHJvb3RzW2RlZmluZWRfdHlwZV07CisgICAgICAgIGlmIChzaWJsaW5nICYmIHNpYmxpbmcgIT0gbmVzdGVkLmdldCgpKSB7CisgICAgICAgICAgcmVxdWlyZWRfdHlwZXNbbmVzdGVkLmdldCgpXS5wdXNoX2JhY2soc2libGluZyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH07CisgIC8vIDMuIFJ1biBERlMKKyAgZW51bSB7IE5PVF9TVEFSVEVEID0gMCwgU1RBUlRFRCA9IDEsIEZJTklTSEVEID0gMiB9OworICBtYXA8Y29uc3QgQWlkbERlZmluZWRUeXBlKiwgaW50PiB2aXNpdGVkOworICBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3QgQWlkbERlZmluZWRUeXBlJik+IGRmcyA9IFsmXShjb25zdCBBaWRsRGVmaW5lZFR5cGUmIHR5cGUpIHsKKyAgICBpZiAodmlzaXRlZFsmdHlwZV0gPT0gRklOSVNIRUQpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAodmlzaXRlZFsmdHlwZV0gPT0gU1RBUlRFRCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICB2aXNpdGVkWyZ0eXBlXSA9IFNUQVJURUQ7CisgICAgICAvLyBWaXNpdCBldmVyeSByZXF1aXJlZCBkZXAgZmlyc3QKKyAgICAgIGZvciAoY29uc3QgYXV0byYgZGVwX3R5cGUgOiByZXF1aXJlZF90eXBlc1smdHlwZV0pIHsKKyAgICAgICAgaWYgKCFkZnMoKmRlcF90eXBlKSkgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgdmlzaXRlZFsmdHlwZV0gPSBGSU5JU0hFRDsKKyAgICAgIHZpc2l0KHR5cGUpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9OworCisgIGZvciAoY29uc3QgYXV0byYgdHlwZSA6IG5lc3RlZF90eXBlcykgeworICAgIGlmICghZGZzKCp0eXBlKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvYWlkbF9sYW5ndWFnZV9sLmxsIGIvYWlkbF9sYW5ndWFnZV9sLmxsCmluZGV4IDJiNjNiODIuLjViMTEwMDggMTAwNjQ0Ci0tLSBhL2FpZGxfbGFuZ3VhZ2VfbC5sbAorKysgYi9haWRsX2xhbmd1YWdlX2wubGwKQEAgLTIyLDYgKzIyLDE0IEBACiAjaW5jbHVkZSAicGFyc2VyLmgiCiAjaW5jbHVkZSAiYWlkbF9sYW5ndWFnZV95LmgiCiAKKyNpZm5kZWYgWVlTVFlQRQorI2RlZmluZSBZWVNUWVBFIHl5OjpwYXJzZXI6OnNlbWFudGljX3R5cGUKKyNlbmRpZgorCisjaWZuZGVmIFlZTFRZUEUKKyNkZWZpbmUgWVlMVFlQRSB5eTo6cGFyc2VyOjpsb2NhdGlvbl90eXBlCisjZW5kaWYKKwogI2RlZmluZSBZWV9VU0VSX0FDVElPTiB5eWxsb2MtPmNvbHVtbnMoeXlsZW5nKTsKICV9CiAKQEAgLTM2LDggKzQ0LDggQEAKIAogaWRlbnRpZmllciAgW19hLXpBLVpdW19hLXpBLVowLTldKgogd2hpdGVzcGFjZSAgKFsgXHRccl0rKQotaW50dmFsdWUgICAgWzAtOV0rW2xMXT8KLWhleHZhbHVlICAgIDBbeHxYXVswLTlhLWZBLUZdK1tsTF0/CitpbnR2YWx1ZSAgICBbMC05XStbbExdPyh1OCk/CitoZXh2YWx1ZSAgICAwW3h8WF1bMC05YS1mQS1GXStbbExdPyh1OCk/CiBmbG9hdHZhbHVlICBbMC05XSpcLj9bMC05XSsoW2VFXVstK10/WzAtOV0rKT9mPwogCiAlJQpAQCAtNTgsNyArNjYsNyBAQAogPExPTkdfQ09NTUVOVD5cbisgICAgIHsgZXh0cmFfdGV4dCArPSB5eXRleHQ7IHl5bGxvYy0+bGluZXMoeXlsZW5nKTsgfQogPExPTkdfQ09NTUVOVD5bXipcbl0rIHsgZXh0cmFfdGV4dCArPSB5eXRleHQ7IH0KIAotXCJbXlwiXSpcIiAgICAgICAgICAgIHsgeXlsdmFsLT50b2tlbiA9IG5ldyBBaWRsVG9rZW4oeXl0ZXh0LCBjb21tZW50cyk7CitcIihbXlwiXXxcXC4pKlwiICAgICAgeyB5eWx2YWwtPnRva2VuID0gbmV3IEFpZGxUb2tlbih5eXRleHQsIGNvbW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB5eTo6cGFyc2VyOjp0b2tlbjo6Q19TVFI7IH0KIAogXC9cLy4qICAgICAgICAgICAgICAgIHsgZXh0cmFfdGV4dCArPSB5eXRleHQ7IGV4dHJhX3RleHQgKz0gIlxuIjsKQEAgLTE0Miw3ICsxNTAsNyBAQAoge2lkZW50aWZpZXJ9ICAgICAgICAgIHsgeXlsdmFsLT50b2tlbiA9IG5ldyBBaWRsVG9rZW4oeXl0ZXh0LCBjb21tZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geXk6OnBhcnNlcjo6dG9rZW46OklERU5USUZJRVI7CiAgICAgICAgICAgICAgICAgICAgICAgfQotJy4nICAgICAgICAgICAgICAgICAgIHsgeXlsdmFsLT50b2tlbiA9IG5ldyBBaWRsVG9rZW4oeXl0ZXh0LCBjb21tZW50cyk7CisnLicgICAgICAgICAgICAgICAgICAgeyB5eWx2YWwtPnRva2VuID0gbmV3IEFpZGxUb2tlbihzdGQ6OnN0cmluZyh5eXRleHQsIHl5bGVuZyksIGNvbW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB5eTo6cGFyc2VyOjp0b2tlbjo6Q0hBUlZBTFVFOyB9CiB7aW50dmFsdWV9ICAgICAgICAgICAgeyB5eWx2YWwtPnRva2VuID0gbmV3IEFpZGxUb2tlbih5eXRleHQsIGNvbW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB5eTo6cGFyc2VyOjp0b2tlbjo6SU5UVkFMVUU7IH0KZGlmZiAtLWdpdCBhL2FpZGxfbGFuZ3VhZ2VfeS55eSBiL2FpZGxfbGFuZ3VhZ2VfeS55eQppbmRleCAwNzliZGE2Li4xMWFiMjllIDEwMDY0NAotLS0gYS9haWRsX2xhbmd1YWdlX3kueXkKKysrIGIvYWlkbF9sYW5ndWFnZV95Lnl5CkBAIC03MSwxMCArNzEsMTEgQEAKICAgICBBaWRsVG9rZW4qIHRva2VuOwogICAgIGNoYXIgY2hhcmFjdGVyOwogICAgIHN0ZDo6c3RyaW5nICpzdHI7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFpZGxUb2tlbj4+ICp0b2tlbl9saXN0OwogICAgIEFpZGxBbm5vdGF0aW9uKiBhbm5vdGF0aW9uOwogICAgIEFpZGxBbm5vdGF0aW9uUGFyYW1ldGVyKiBwYXJhbTsKICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzaGFyZWRfcHRyPEFpZGxDb25zdGFudFZhbHVlPj4qIHBhcmFtX2xpc3Q7Ci0gICAgc3RkOjp2ZWN0b3I8QWlkbEFubm90YXRpb24+KiBhbm5vdGF0aW9uX2xpc3Q7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFpZGxBbm5vdGF0aW9uPj4qIGFubm90YXRpb25fbGlzdDsKICAgICBBaWRsVHlwZVNwZWNpZmllciogdHlwZTsKICAgICBBaWRsQXJndW1lbnQqIGFyZzsKICAgICBBaWRsQXJndW1lbnQ6OkRpcmVjdGlvbiBkaXJlY3Rpb247CkBAIC05MCw5ICs5MSw2IEBACiAgICAgQWlkbERlZmluZWRUeXBlKiBkZWNsYXJhdGlvbjsKICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QWlkbFR5cGVTcGVjaWZpZXI+PiogdHlwZV9hcmdzOwogICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogdHlwZV9wYXJhbXM7Ci0gICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFpZGxJbXBvcnQ+PiogaW1wb3J0czsKLSAgICBBaWRsSW1wb3J0KiBpbXBvcnQ7Ci0gICAgQWlkbFBhY2thZ2UqIHBhY2thZ2U7CiAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFpZGxEZWZpbmVkVHlwZT4+KiBkZWNsYXJhdGlvbnM7CiB9CiAKQEAgLTE3NSwyMyArMTczLDI1IEBACiAldHlwZTxjb25zdF9leHByPiBjb25zdF9leHByCiAldHlwZTxjb25zdGFudF92YWx1ZV9saXN0PiBjb25zdGFudF92YWx1ZV9saXN0CiAldHlwZTxjb25zdGFudF92YWx1ZV9saXN0PiBjb25zdGFudF92YWx1ZV9ub25fZW1wdHlfbGlzdAotJXR5cGU8aW1wb3J0cz4gaW1wb3J0cwotJXR5cGU8aW1wb3J0PiBpbXBvcnQKLSV0eXBlPHBhY2thZ2U+IHBhY2thZ2UKKyV0eXBlPHRva2VuX2xpc3Q+IGltcG9ydHMKICV0eXBlPGRlY2xhcmF0aW9ucz4gZGVjbHMKLSV0eXBlPHRva2VuPiBpZGVudGlmaWVyIGVycm9yIHF1YWxpZmllZF9uYW1lCisldHlwZTx0b2tlbj4gaW1wb3J0IGlkZW50aWZpZXIgZXJyb3IgcXVhbGlmaWVkX25hbWUgb3B0aW9uYWxfcGFja2FnZQogCiAlJQogCiBkb2N1bWVudAotIDogcGFja2FnZSBpbXBvcnRzIGRlY2xzIHsKKyA6IG9wdGlvbmFsX3BhY2thZ2UgaW1wb3J0cyBkZWNscyB7CiAgICAgQ29tbWVudHMgY29tbWVudHM7CiAgICAgaWYgKCQxKSB7CiAgICAgICBjb21tZW50cyA9ICQxLT5HZXRDb21tZW50cygpOwogICAgIH0gZWxzZSBpZiAoISQyLT5lbXB0eSgpKSB7CiAgICAgICBjb21tZW50cyA9ICQyLT5mcm9udCgpLT5HZXRDb21tZW50cygpOwogICAgIH0KLSAgICBwcy0+U2V0RG9jdW1lbnQoc3RkOjptYWtlX3VuaXF1ZTxBaWRsRG9jdW1lbnQ+KGxvYyhAMSksIGNvbW1lbnRzLCBzdGQ6Om1vdmUoKiQyKSwgc3RkOjptb3ZlKCokMykpKTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gaW1wb3J0czsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGltcG9ydCA6ICokMikgeworICAgICAgaW1wb3J0cy5wdXNoX2JhY2soaW1wb3J0LT5HZXRUZXh0KCkpOworICAgIH0KKyAgICBwcy0+TWFrZURvY3VtZW50KGxvYyhAMSksIGNvbW1lbnRzLCBzdGQ6Om1vdmUoaW1wb3J0cyksIHN0ZDo6bW92ZSgqJDMpKTsKICAgICBkZWxldGUgJDE7CiAgICAgZGVsZXRlICQyOwogICAgIGRlbGV0ZSAkMzsKQEAgLTIwOCwzNiArMjA4LDI5IEBACiAgfCBDUFBfSEVBREVSCiAgOwogCi1wYWNrYWdlCitvcHRpb25hbF9wYWNrYWdlCiAgOiB7CiAgICAgJCQgPSBudWxscHRyOwogIH0KICB8IFBBQ0tBR0UgcXVhbGlmaWVkX25hbWUgJzsnIHsKLSAgICAkJCA9IG5ldyBBaWRsUGFja2FnZShsb2MoQDEsIEAzKSwgJDEtPkdldENvbW1lbnRzKCkpOwogICAgIHBzLT5TZXRQYWNrYWdlKCQyLT5HZXRUZXh0KCkpOwotICAgIGRlbGV0ZSAkMTsKKyAgICAkJCA9ICQxOyAvLyBmb3IgY29tbWVudHMKICAgICBkZWxldGUgJDI7CiAgIH0KICA7CiAKIGltcG9ydHMKLSA6IHsgJCQgPSBuZXcgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFpZGxJbXBvcnQ+PigpOyB9CisgOiB7ICQkID0gbmV3IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxBaWRsVG9rZW4+PigpOyB9CiAgfCBpbXBvcnRzIGltcG9ydAogICB7CiAgICAgJCQgPSAkMTsKLSAgICBhdXRvIGl0ID0gc3RkOjpmaW5kX2lmKCQkLT5iZWdpbigpLCAkJC0+ZW5kKCksIFsmXShjb25zdCBhdXRvJiBpKSB7Ci0gICAgICByZXR1cm4gJDItPkdldE5lZWRlZENsYXNzKCkgPT0gaS0+R2V0TmVlZGVkQ2xhc3MoKTsKLSAgICB9KTsKLSAgICBpZiAoaXQgPT0gJCQtPmVuZCgpKSB7Ci0gICAgICAkJC0+ZW1wbGFjZV9iYWNrKCQyKTsKLSAgICB9IGVsc2UgewotICAgICAgZGVsZXRlICQyOwotICAgIH0KKyAgICAkJC0+ZW1wbGFjZV9iYWNrKCQyKTsKICAgfQogCiBpbXBvcnQKICA6IElNUE9SVCBxdWFsaWZpZWRfbmFtZSAnOycgewotICAgICQkID0gbmV3IEFpZGxJbXBvcnQobG9jKEAyKSwgJDItPkdldFRleHQoKSwgJDEtPkdldENvbW1lbnRzKCkpOworICAgIC8vIGNhcnJ5IHRoZSBjb21tZW50cyBiZWZvcmUgImltcG9ydCIgdG9rZW4KKyAgICAkJCA9IG5ldyBBaWRsVG9rZW4oJDItPkdldFRleHQoKSwgJDEtPkdldENvbW1lbnRzKCkpOwogICAgIGRlbGV0ZSAkMTsKICAgICBkZWxldGUgJDI7CiAgIH07CkBAIC0yNzQsNyArMjY3LDcgQEAKIAogICAgIGlmICgkMS0+c2l6ZSgpID4gMCAmJiAkJCAhPSBudWxscHRyKSB7CiAgICAgICAvLyBjb3B5IGNvbW1lbnRzIGZyb20gYW5ub3RhdGlvbiB0byBkZWNsCi0gICAgICAkJC0+U2V0Q29tbWVudHMoJDEtPmJlZ2luKCktPkdldENvbW1lbnRzKCkpOworICAgICAgJCQtPlNldENvbW1lbnRzKCQxLT5iZWdpbigpLT5nZXQoKS0+R2V0Q29tbWVudHMoKSk7CiAgICAgICAkJC0+QW5ub3RhdGUoc3RkOjptb3ZlKCokMSkpOwogICAgIH0KIApAQCAtMzA5LDE2ICszMDIsMTkgQEAKIAogcGFyY2VsYWJsZV9kZWNsCiAgOiBQQVJDRUxBQkxFIHF1YWxpZmllZF9uYW1lIG9wdGlvbmFsX3R5cGVfcGFyYW1zICc7JyB7CisgICAgLy8gTm8gY2hlY2sgZm9yIHR5cGUgbmFtZSBoZXJlLiBXZSBhbGxvdyBuZXN0ZWQgdHlwZXMgZm9yIHVuc3RydWN0dXJlZCBwYXJjZWxhYmxlcy4KICAgICAkJCA9IG5ldyBBaWRsUGFyY2VsYWJsZShsb2MoQDIpLCAkMi0+R2V0VGV4dCgpLCBwcy0+UGFja2FnZSgpLCAkMS0+R2V0Q29tbWVudHMoKSwgIiIsICQzKTsKICAgICBkZWxldGUgJDE7CiAgICAgZGVsZXRlICQyOwogIH0KICB8IFBBUkNFTEFCTEUgcXVhbGlmaWVkX25hbWUgb3B0aW9uYWxfdHlwZV9wYXJhbXMgJ3snIHBhcmNlbGFibGVfbWVtYmVycyAnfScgeworICAgIHBzLT5DaGVja1ZhbGlkVHlwZU5hbWUoKiQyLCBsb2MoQDIpKTsKICAgICAkJCA9IG5ldyBBaWRsU3RydWN0dXJlZFBhcmNlbGFibGUobG9jKEAyKSwgJDItPkdldFRleHQoKSwgcHMtPlBhY2thZ2UoKSwgJDEtPkdldENvbW1lbnRzKCksICQzLCAkNSk7CiAgICAgZGVsZXRlICQxOwogICAgIGRlbGV0ZSAkMjsKICB9CiAgfCBQQVJDRUxBQkxFIHF1YWxpZmllZF9uYW1lIENQUF9IRUFERVIgQ19TVFIgJzsnIHsKKyAgICAvLyBObyBjaGVjayBmb3IgdHlwZSBuYW1lIGhlcmUuIFdlIGFsbG93IG5lc3RlZCB0eXBlcyBmb3IgdW5zdHJ1Y3R1cmVkIHBhcmNlbGFibGVzLgogICAgICQkID0gbmV3IEFpZGxQYXJjZWxhYmxlKGxvYyhAMiksICQyLT5HZXRUZXh0KCksIHBzLT5QYWNrYWdlKCksICQxLT5HZXRDb21tZW50cygpLCAkNC0+R2V0VGV4dCgpKTsKICAgICBkZWxldGUgJDE7CiAgICAgZGVsZXRlICQyOwpAQCAtMzQzLDYgKzMzOSwxMCBAQAogICAgICQxLT5lbXBsYWNlX2JhY2soJDIpOwogICAgICQkID0gJDE7CiAgIH0KKyB8IHBhcmNlbGFibGVfbWVtYmVycyBkZWNsIHsKKyAgICBpZiAoJDIpICQxLT5lbXBsYWNlX2JhY2soJDIpOyAgLy8gZGVjbCBtYXkgYmUgbnVsbHB0ciBvbiBlcnJvcgorICAgICQkID0gJDE7CisgIH0KICB8IHBhcmNlbGFibGVfbWVtYmVycyBlcnJvciAnOycgewogICAgIHBzLT5BZGRFcnJvcigpOwogICAgICQkID0gJDE7CkBAIC0zNjEsMTMgKzM2MSwyMSBAQAogIDsKIAogaW50ZXJmYWNlX2RlY2wKLSA6IElOVEVSRkFDRSBpZGVudGlmaWVyICd7JyBpbnRlcmZhY2VfbWVtYmVycyAnfScgeworIDogSU5URVJGQUNFIHF1YWxpZmllZF9uYW1lICc7JyB7CisgICAgcHMtPkNoZWNrVmFsaWRUeXBlTmFtZSgqJDIsIGxvYyhAMikpOworICAgICQkID0gbmV3IEFpZGxJbnRlcmZhY2UobG9jKEAxKSwgJDItPkdldFRleHQoKSwgJDEtPkdldENvbW1lbnRzKCksIGZhbHNlLCBwcy0+UGFja2FnZSgpLCBudWxscHRyKTsKKyAgICBkZWxldGUgJDE7CisgICAgZGVsZXRlICQyOworICB9CisgfCBJTlRFUkZBQ0UgcXVhbGlmaWVkX25hbWUgJ3snIGludGVyZmFjZV9tZW1iZXJzICd9JyB7CisgICAgcHMtPkNoZWNrVmFsaWRUeXBlTmFtZSgqJDIsIGxvYyhAMikpOwogICAgICQkID0gbmV3IEFpZGxJbnRlcmZhY2UobG9jKEAxKSwgJDItPkdldFRleHQoKSwgJDEtPkdldENvbW1lbnRzKCksIGZhbHNlLCBwcy0+UGFja2FnZSgpLCAkNCk7CiAgICAgZGVsZXRlICQxOwogICAgIGRlbGV0ZSAkMjsKICAgfQotIHwgT05FV0FZIElOVEVSRkFDRSBpZGVudGlmaWVyICd7JyBpbnRlcmZhY2VfbWVtYmVycyAnfScgewotICAgICQkID0gbmV3IEFpZGxJbnRlcmZhY2UobG9jKEAyKSwgJDMtPkdldFRleHQoKSwgICQxLT5HZXRDb21tZW50cygpLCB0cnVlLCBwcy0+UGFja2FnZSgpLCAkNSk7CisgfCBPTkVXQVkgSU5URVJGQUNFIHF1YWxpZmllZF9uYW1lICd7JyBpbnRlcmZhY2VfbWVtYmVycyAnfScgeworICAgIHBzLT5DaGVja1ZhbGlkVHlwZU5hbWUoKiQzLCBsb2MoQDMpKTsKKyAgICAkJCA9IG5ldyBBaWRsSW50ZXJmYWNlKGxvYyhAMiksICQzLT5HZXRUZXh0KCksICQxLT5HZXRDb21tZW50cygpLCB0cnVlLCBwcy0+UGFja2FnZSgpLCAkNSk7CiAgICAgZGVsZXRlICQxOwogICAgIGRlbGV0ZSAkMjsKICAgICBkZWxldGUgJDM7CkBAIC0zODYsNiArMzk0LDExIEBACiAgIHsgJDEtPnB1c2hfYmFjayhzdGQ6OnVuaXF1ZV9wdHI8QWlkbE1lbWJlcj4oJDIpKTsgJCQgPSAkMTsgfQogIHwgaW50ZXJmYWNlX21lbWJlcnMgY29uc3RhbnRfZGVjbAogICB7ICQxLT5wdXNoX2JhY2soc3RkOjp1bmlxdWVfcHRyPEFpZGxNZW1iZXI+KCQyKSk7ICQkID0gJDE7IH0KKyB8IGludGVyZmFjZV9tZW1iZXJzIGRlY2wKKyAgeworICAgIGlmICgkMikgJDEtPmVtcGxhY2VfYmFjaygkMik7ICAvLyBkZWNsIG1heSBiZSBudWxscHRyIG9uIGVycm9yCisgICAgJCQgPSAkMTsKKyAgfQogIHwgaW50ZXJmYWNlX21lbWJlcnMgZXJyb3IgJzsnIHsKICAgICBwcy0+QWRkRXJyb3IoKTsKICAgICAkJCA9ICQxOwpAQCAtNTM4LDcgKzU1MSw3IEBACiBjb25zdGFudF9kZWNsCiAgOiBhbm5vdGF0aW9uX2xpc3QgQ09OU1QgdHlwZSBpZGVudGlmaWVyICc9JyBjb25zdF9leHByICc7JyB7CiAgICAgaWYgKCQxLT5zaXplKCkgPiAwKSB7Ci0gICAgICAkMy0+U2V0Q29tbWVudHMoJDEtPmJlZ2luKCktPkdldENvbW1lbnRzKCkpOworICAgICAgJDMtPlNldENvbW1lbnRzKCQxLT5iZWdpbigpLT5nZXQoKS0+R2V0Q29tbWVudHMoKSk7CiAgICAgfSBlbHNlIHsKICAgICAgICQzLT5TZXRDb21tZW50cygkMi0+R2V0Q29tbWVudHMoKSk7CiAgICAgfQpAQCAtNTc5LDcgKzU5Miw4IEBACiAgOwogCiBlbnVtX2RlY2wKLSA6IEVOVU0gaWRlbnRpZmllciBlbnVtX2RlY2xfYm9keSB7CisgOiBFTlVNIHF1YWxpZmllZF9uYW1lIGVudW1fZGVjbF9ib2R5IHsKKyAgICBwcy0+Q2hlY2tWYWxpZFR5cGVOYW1lKCokMiwgbG9jKEAyKSk7CiAgICAgJCQgPSBuZXcgQWlkbEVudW1EZWNsYXJhdGlvbihsb2MoQDIpLCAkMi0+R2V0VGV4dCgpLCAkMywgcHMtPlBhY2thZ2UoKSwgJDEtPkdldENvbW1lbnRzKCkpOwogICAgIGRlbGV0ZSAkMTsKICAgICBkZWxldGUgJDI7CkBAIC01ODksNiArNjAzLDcgQEAKIAogdW5pb25fZGVjbAogIDogVU5JT04gcXVhbGlmaWVkX25hbWUgb3B0aW9uYWxfdHlwZV9wYXJhbXMgJ3snIHBhcmNlbGFibGVfbWVtYmVycyAnfScgeworICAgIHBzLT5DaGVja1ZhbGlkVHlwZU5hbWUoKiQyLCBsb2MoQDIpKTsKICAgICAkJCA9IG5ldyBBaWRsVW5pb25EZWNsKGxvYyhAMiksICQyLT5HZXRUZXh0KCksIHBzLT5QYWNrYWdlKCksICQxLT5HZXRDb21tZW50cygpLCAkMywgJDUpOwogICAgIGRlbGV0ZSAkMTsKICAgICBkZWxldGUgJDI7CkBAIC02MDEsNyArNjE2LDcgQEAKICAgICBkZWxldGUgJDI7CiAgIH0KICB8IGFubm90YXRpb25fbGlzdCBPTkVXQVkgdHlwZSBpZGVudGlmaWVyICcoJyBhcmdfbGlzdCAnKScgJzsnIHsKLSAgICBjb25zdCBhdXRvJiBjb21tZW50cyA9ICgkMS0+c2l6ZSgpID4gMCkgPyAkMS0+YmVnaW4oKS0+R2V0Q29tbWVudHMoKSA6ICQyLT5HZXRDb21tZW50cygpOworICAgIGNvbnN0IGF1dG8mIGNvbW1lbnRzID0gKCQxLT5zaXplKCkgPiAwKSA/ICQxLT5iZWdpbigpLT5nZXQoKS0+R2V0Q29tbWVudHMoKSA6ICQyLT5HZXRDb21tZW50cygpOwogICAgICQkID0gbmV3IEFpZGxNZXRob2QobG9jKEA0KSwgdHJ1ZSwgJDMsICQ0LT5HZXRUZXh0KCksICQ2LCBjb21tZW50cyk7CiAgICAgJDMtPkFubm90YXRlKHN0ZDo6bW92ZSgqJDEpKTsKICAgICBkZWxldGUgJDE7CkBAIC02MTksNyArNjM0LDcgQEAKICAgICBkZWxldGUgJDc7CiAgIH0KICB8IGFubm90YXRpb25fbGlzdCBPTkVXQVkgdHlwZSBpZGVudGlmaWVyICcoJyBhcmdfbGlzdCAnKScgJz0nIElOVFZBTFVFICc7JyB7Ci0gICAgY29uc3QgYXV0byYgY29tbWVudHMgPSAoJDEtPnNpemUoKSA+IDApID8gJDEtPmJlZ2luKCktPkdldENvbW1lbnRzKCkgOiAkMi0+R2V0Q29tbWVudHMoKTsKKyAgICBjb25zdCBhdXRvJiBjb21tZW50cyA9ICgkMS0+c2l6ZSgpID4gMCkgPyAkMS0+YmVnaW4oKS0+Z2V0KCktPkdldENvbW1lbnRzKCkgOiAkMi0+R2V0Q29tbWVudHMoKTsKICAgICBpbnQzMl90IHNlcmlhbCA9IDA7CiAgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpQYXJzZUludCgkOS0+R2V0VGV4dCgpLCAmc2VyaWFsKSkgewogICAgICAgICBBSURMX0VSUk9SKGxvYyhAOSkpIDw8ICJDb3VsZCBub3QgcGFyc2UgaW50IHZhbHVlOiAiIDw8ICQ5LT5HZXRUZXh0KCk7CkBAIC02NjEsMTAgKzY3Niw5IEBACiAKIG5vbl9hcnJheV90eXBlCiAgOiBhbm5vdGF0aW9uX2xpc3QgcXVhbGlmaWVkX25hbWUgewotICAgICQkID0gbmV3IEFpZGxUeXBlU3BlY2lmaWVyKGxvYyhAMiksICQyLT5HZXRUZXh0KCksIGZhbHNlLCBudWxscHRyLCAkMi0+R2V0Q29tbWVudHMoKSk7Ci0gICAgcHMtPkRlZmVyUmVzb2x1dGlvbigkJCk7CisgICAgJCQgPSBuZXcgQWlkbFR5cGVTcGVjaWZpZXIobG9jKEAyKSwgJDItPkdldFRleHQoKSwgLyphcnJheT0qL3N0ZDo6bnVsbG9wdCwgbnVsbHB0ciwgJDItPkdldENvbW1lbnRzKCkpOwogICAgIGlmICghJDEtPmVtcHR5KCkpIHsKLSAgICAgICQkLT5TZXRDb21tZW50cygkMS0+YmVnaW4oKS0+R2V0Q29tbWVudHMoKSk7CisgICAgICAkJC0+U2V0Q29tbWVudHMoJDEtPmJlZ2luKCktPmdldCgpLT5HZXRDb21tZW50cygpKTsKICAgICAgICQkLT5Bbm5vdGF0ZShzdGQ6Om1vdmUoKiQxKSk7CiAgICAgfQogICAgIGRlbGV0ZSAkMTsKQEAgLTY5NSw4ICs3MDksMjAgQEAKICAgICAgIEFJRExfRVJST1IobG9jKEAyKSkgPDwgIkFubm90YXRpb25zIGZvciBhcnJheXMgYXJlIG5vdCBzdXBwb3J0ZWQuIjsKICAgICAgIHBzLT5BZGRFcnJvcigpOwogICAgIH0KLSAgICBpZiAoISQxLT5TZXRBcnJheSgpKSB7Ci0gICAgICBBSURMX0VSUk9SKGxvYyhAMSkpIDw8ICJDYW4gb25seSBoYXZlIG9uZSBkaW1lbnNpb25hbCBhcnJheXMuIjsKKyAgICBpZiAoISQxLT5NYWtlQXJyYXkoRHluYW1pY0FycmF5e30pKSB7CisgICAgICBBSURMX0VSUk9SKGxvYyhAMSkpIDw8ICJNdWx0aS1kaW1lbnNpb25hbCBhcnJheXMgbXVzdCBiZSBmaXhlZCBzaXplLiI7CisgICAgICBwcy0+QWRkRXJyb3IoKTsKKyAgICB9CisgICAgJCQgPSAkMTsKKyAgICBkZWxldGUgJDI7CisgIH0KKyB8IHR5cGUgYW5ub3RhdGlvbl9saXN0ICdbJyBjb25zdF9leHByICddJyB7CisgICAgaWYgKCEkMi0+ZW1wdHkoKSkgeworICAgICAgQUlETF9FUlJPUihsb2MoQDIpKSA8PCAiQW5ub3RhdGlvbnMgZm9yIGFycmF5cyBhcmUgbm90IHN1cHBvcnRlZC4iOworICAgICAgcHMtPkFkZEVycm9yKCk7CisgICAgfQorICAgIGlmICghJDEtPk1ha2VBcnJheShGaXhlZFNpemVBcnJheXtzdGQ6OnVuaXF1ZV9wdHI8QWlkbENvbnN0YW50VmFsdWU+KCQ0KX0pKSB7CisgICAgICBBSURMX0VSUk9SKGxvYyhAMSkpIDw8ICJNdWx0aS1kaW1lbnNpb25hbCBhcnJheXMgbXVzdCBiZSBmaXhlZCBzaXplLiI7CiAgICAgICBwcy0+QWRkRXJyb3IoKTsKICAgICB9CiAgICAgJCQgPSAkMTsKQEAgLTcyMCwxMiArNzQ2LDExIEBACiAKIGFubm90YXRpb25fbGlzdAogIDoKLSAgeyAkJCA9IG5ldyBzdGQ6OnZlY3RvcjxBaWRsQW5ub3RhdGlvbj4oKTsgfQorICB7ICQkID0gbmV3IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxBaWRsQW5ub3RhdGlvbj4+KCk7IH0KICB8IGFubm90YXRpb25fbGlzdCBhbm5vdGF0aW9uCiAgIHsKICAgICBpZiAoJDIgIT0gbnVsbHB0cikgewotICAgICAgJDEtPmVtcGxhY2VfYmFjayhzdGQ6Om1vdmUoKiQyKSk7Ci0gICAgICBkZWxldGUgJDI7CisgICAgICAkMS0+ZW1wbGFjZV9iYWNrKHN0ZDo6dW5pcXVlX3B0cjxBaWRsQW5ub3RhdGlvbj4oJDIpKTsKICAgICB9CiAgICAgJCQgPSAkMTsKICAgfTsKQEAgLTc2MiwxNCArNzg3LDI1IEBACiAKIGFubm90YXRpb24KICA6IEFOTk9UQVRJT04gewotICAgICQkID0gQWlkbEFubm90YXRpb246OlBhcnNlKGxvYyhAMSksICQxLT5HZXRUZXh0KCksIG51bGxwdHIsICQxLT5HZXRDb21tZW50cygpKTsKKyAgICAvLyByZWxlYXNlKCkgcmV0dXJucyBudWxscHRyIGlmIHVuaXF1ZV9wdHIgaXMgZW1wdHkuCisgICAgJCQgPSBBaWRsQW5ub3RhdGlvbjo6UGFyc2UobG9jKEAxKSwgJDEtPkdldFRleHQoKSwge30sICQxLT5HZXRDb21tZW50cygpKS5yZWxlYXNlKCk7CisgICAgaWYgKCEkJCkgeworICAgICAgcHMtPkFkZEVycm9yKCk7CisgICAgfQorICAgIGRlbGV0ZSAkMTsKKyAgfQorIHwgQU5OT1RBVElPTiAnKCcgY29uc3RfZXhwciAnKScgeworICAgIGF1dG8gdmFsdWUgPSBzdGQ6OnNoYXJlZF9wdHI8QWlkbENvbnN0YW50VmFsdWU+KCQzKTsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzaGFyZWRfcHRyPEFpZGxDb25zdGFudFZhbHVlPj4gcGFyYW1ldGVyX2xpc3Qge3sidmFsdWUiICwgdmFsdWV9fTsKKyAgICAkJCA9IEFpZGxBbm5vdGF0aW9uOjpQYXJzZShsb2MoQDEsIEA0KSwgJDEtPkdldFRleHQoKSwgc3RkOjptb3ZlKHBhcmFtZXRlcl9saXN0KSwgJDEtPkdldENvbW1lbnRzKCkpLnJlbGVhc2UoKTsKICAgICBpZiAoISQkKSB7CiAgICAgICBwcy0+QWRkRXJyb3IoKTsKICAgICB9CiAgICAgZGVsZXRlICQxOwogICB9CiAgfCBBTk5PVEFUSU9OICcoJyBwYXJhbWV0ZXJfbGlzdCAnKScgewotICAgICQkID0gQWlkbEFubm90YXRpb246OlBhcnNlKGxvYyhAMSwgQDQpLCAkMS0+R2V0VGV4dCgpLCAkMywgJDEtPkdldENvbW1lbnRzKCkpOworICAgIC8vIHJlbGVhc2UoKSByZXR1cm5zIG51bGxwdHIgaWYgdW5pcXVlX3B0ciBpcyBlbXB0eS4KKyAgICAkJCA9IEFpZGxBbm5vdGF0aW9uOjpQYXJzZShsb2MoQDEsIEA0KSwgJDEtPkdldFRleHQoKSwgc3RkOjptb3ZlKCokMyksICQxLT5HZXRDb21tZW50cygpKS5yZWxlYXNlKCk7CiAgICAgaWYgKCEkJCkgewogICAgICAgcHMtPkFkZEVycm9yKCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvYWlkbF90b19jcHAuY3BwIGIvYWlkbF90b19jcHAuY3BwCmluZGV4IDQwNTUyYzguLjk4N2FiYTUgMTAwNjQ0Ci0tLSBhL2FpZGxfdG9fY3BwLmNwcAorKysgYi9haWRsX3RvX2NwcC5jcHAKQEAgLTM1LDYgKzM1LDcgQEAKIG5hbWVzcGFjZSBjcHAgewogCiBuYW1lc3BhY2UgeworCiBzdGQ6OnN0cmluZyBSYXdQYXJjZWxNZXRob2QoY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHR5cGUsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlYWRNZXRob2QpIHsKICAgc3RhdGljIG1hcDxzdHJpbmcsIHN0cmluZz4ga0J1aWx0aW4gPSB7CkBAIC03MCw2ICs3MSwxMCBAQAogICBjb25zdCBib29sIGlzVmVjdG9yID0gdHlwZS5Jc0FycmF5KCkgfHwgdHlwZW5hbWVzLklzTGlzdCh0eXBlKTsKICAgY29uc3QgYm9vbCB1dGY4ID0gdHlwZS5Jc1V0ZjhJbkNwcCgpOwogCisgIGlmICh0eXBlLklzRml4ZWRTaXplQXJyYXkoKSkgeworICAgIHJldHVybiAiRml4ZWRBcnJheSI7CisgIH0KKwogICBpZiAoYXV0byBlbnVtX2RlY2wgPSB0eXBlbmFtZXMuR2V0RW51bURlY2xhcmF0aW9uKHR5cGUpOyBlbnVtX2RlY2wgIT0gbnVsbHB0cikgewogICAgIGlmIChpc1ZlY3RvcikgewogICAgICAgcmV0dXJuICJFbnVtVmVjdG9yIjsKQEAgLTE0Nyw2ICsxNTIsOSBAQAogCiAgIGlmIChyYXdfdHlwZS5Jc051bGxhYmxlKCkgJiYgIUFpZGxUeXBlbmFtZXM6OklzUHJpbWl0aXZlVHlwZW5hbWUodHlwZS5HZXROYW1lKCkpICYmCiAgICAgICB0eXBlLkdldE5hbWUoKSAhPSAiSUJpbmRlciIgJiYgdHlwZW5hbWVzLkdldEVudW1EZWNsYXJhdGlvbih0eXBlKSA9PSBudWxscHRyKSB7CisgICAgaWYgKHJhd190eXBlLklzSGVhcE51bGxhYmxlKCkpIHsKKyAgICAgIHJldHVybiAiOjpzdGQ6OnVuaXF1ZV9wdHI8IiArIHR5cGVfc3RyICsgIj4iOworICAgIH0KICAgICByZXR1cm4gIjo6c3RkOjpvcHRpb25hbDwiICsgdHlwZV9zdHIgKyAiPiI7CiAgIH0KICAgcmV0dXJuIHR5cGVfc3RyOwpAQCAtMTg2LDUyICsxOTQsNTAgQEAKICAgaWYgKGRlZmluZWRUeXBlICE9IG51bGxwdHIgJiYgZGVmaW5lZFR5cGUtPkFzSW50ZXJmYWNlKCkgIT0gbnVsbHB0cikgewogICAgIHJldHVybiAiOjphbmRyb2lkOjpzcDwiICsgR2V0UmF3Q3BwTmFtZSh0eXBlKSArICI+IjsKICAgfQotCi0gIHJldHVybiBXcmFwSWZOdWxsYWJsZShHZXRSYXdDcHBOYW1lKHR5cGUpLCByYXdfdHlwZSwgdHlwZW5hbWVzKTsKLX0KLX0gIC8vIG5hbWVzcGFjZQotc3RkOjpzdHJpbmcgQ29uc3RhbnRWYWx1ZURlY29yYXRvcihjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHJhd192YWx1ZSkgewotICBpZiAodHlwZS5Jc0FycmF5KCkpIHsKLSAgICByZXR1cm4gcmF3X3ZhbHVlOwotICB9Ci0KLSAgaWYgKHR5cGUuR2V0TmFtZSgpID09ICJsb25nIikgewotICAgIHJldHVybiByYXdfdmFsdWUgKyAiTCI7Ci0gIH0KLQotICBpZiAodHlwZS5HZXROYW1lKCkgPT0gIlN0cmluZyIgJiYgIXR5cGUuSXNVdGY4SW5DcHAoKSkgewotICAgIHJldHVybiAiOjphbmRyb2lkOjpTdHJpbmcxNigiICsgcmF3X3ZhbHVlICsgIikiOwotICB9Ci0KLSAgaWYgKGF1dG8gZGVmaW5lZF90eXBlID0gdHlwZS5HZXREZWZpbmVkVHlwZSgpOyBkZWZpbmVkX3R5cGUpIHsKLSAgICBhdXRvIGVudW1fdHlwZSA9IGRlZmluZWRfdHlwZS0+QXNFbnVtRGVjbGFyYXRpb24oKTsKLSAgICBBSURMX0ZBVEFMX0lGKCFlbnVtX3R5cGUsIHR5cGUpIDw8ICJJbnZhbGlkIHR5cGUgZm9yIFwiIiA8PCByYXdfdmFsdWUgPDwgIlwiIjsKLSAgICByZXR1cm4gR2V0UmF3Q3BwTmFtZSh0eXBlKSArICI6OiIgKyByYXdfdmFsdWUuc3Vic3RyKHJhd192YWx1ZS5maW5kX2xhc3Rfb2YoJy4nKSArIDEpOwotICB9Ci0KLSAgcmV0dXJuIHJhd192YWx1ZTsKLX07Ci0KLXN0ZDo6c3RyaW5nIEdldFRyYW5zYWN0aW9uSWRGb3IoY29uc3QgQWlkbEludGVyZmFjZSYgaWZhY2UsIGNvbnN0IEFpZGxNZXRob2QmIG1ldGhvZCkgewotICByZXR1cm4gQ2xhc3NOYW1lKGlmYWNlLCBDbGFzc05hbWVzOjpTRVJWRVIpICsgIjo6VFJBTlNBQ1RJT05fIiArIG1ldGhvZC5HZXROYW1lKCk7Ci19Ci0KLXN0ZDo6c3RyaW5nIENwcE5hbWVPZihjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzKSB7Ci0gIGlmICh0eXBlLklzQXJyYXkoKSB8fCB0eXBlbmFtZXMuSXNMaXN0KHR5cGUpKSB7Ci0gICAgc3RkOjpzdHJpbmcgY3BwX25hbWUgPSBHZXRDcHBOYW1lKHR5cGUsIHR5cGVuYW1lcyk7Ci0gICAgaWYgKHR5cGUuSXNOdWxsYWJsZSgpKSB7Ci0gICAgICByZXR1cm4gIjo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPCIgKyBjcHBfbmFtZSArICI+PiI7Ci0gICAgfQotICAgIHJldHVybiAiOjpzdGQ6OnZlY3RvcjwiICsgY3BwX25hbWUgKyAiPiI7Ci0gIH0gZWxzZSBpZiAodHlwZS5Jc0dlbmVyaWMoKSkgeworICBhdXRvIGNwcF9uYW1lID0gR2V0UmF3Q3BwTmFtZSh0eXBlKTsKKyAgaWYgKHR5cGUuSXNHZW5lcmljKCkpIHsKICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdHlwZV9wYXJhbXM7CiAgICAgZm9yIChjb25zdCBhdXRvJiBwYXJhbWV0ZXIgOiB0eXBlLkdldFR5cGVQYXJhbWV0ZXJzKCkpIHsKICAgICAgIHR5cGVfcGFyYW1zLnB1c2hfYmFjayhDcHBOYW1lT2YoKnBhcmFtZXRlciwgdHlwZW5hbWVzKSk7CiAgICAgfQotICAgIHJldHVybiBTdHJpbmdQcmludGYoIiVzPCVzPiIsIEdldENwcE5hbWUodHlwZSwgdHlwZW5hbWVzKS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6Sm9pbih0eXBlX3BhcmFtcywgIiwgIikuY19zdHIoKSk7CisgICAgY3BwX25hbWUgKz0gIjwiICsgYmFzZTo6Sm9pbih0eXBlX3BhcmFtcywgIiwgIikgKyAiPiI7CiAgIH0KLSAgcmV0dXJuIEdldENwcE5hbWUodHlwZSwgdHlwZW5hbWVzKTsKKyAgcmV0dXJuIFdyYXBJZk51bGxhYmxlKGNwcF9uYW1lLCByYXdfdHlwZSwgdHlwZW5hbWVzKTsKK30KK30gIC8vIG5hbWVzcGFjZQorc3RkOjpzdHJpbmcgQ29uc3RhbnRWYWx1ZURlY29yYXRvcigKKyAgICBjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSwKKyAgICBjb25zdCBzdGQ6OnZhcmlhbnQ8c3RkOjpzdHJpbmcsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPj4mIHJhd192YWx1ZSkgeworICByZXR1cm4gQ3BwQ29uc3RhbnRWYWx1ZURlY29yYXRvcih0eXBlLCByYXdfdmFsdWUsIC8qaXNfbmRrPSovZmFsc2UpOworfTsKKworc3RkOjpzdHJpbmcgR2V0VHJhbnNhY3Rpb25JZEZvcihjb25zdCBzdGQ6OnN0cmluZyYgY2xhenosIGNvbnN0IEFpZGxNZXRob2QmIG1ldGhvZCkgeworICByZXR1cm4gY2xhenogKyAiOjpUUkFOU0FDVElPTl8iICsgbWV0aG9kLkdldE5hbWUoKTsKK30KKworc3RkOjpzdHJpbmcgQ3BwTmFtZU9mKGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiB0eXBlLCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMpIHsKKyAgLy8gZ2V0IGJhc2UgdHlwZSdzIGNwcF9uYW1lIHdpdGggbnVsbGFibGUgcHJvY2Vzc2VkLgorICBzdGQ6OnN0cmluZyBjcHBfbmFtZSA9IEdldENwcE5hbWUodHlwZSwgdHlwZW5hbWVzKTsKKworICBpZiAodHlwZS5Jc0FycmF5KCkgfHwgdHlwZW5hbWVzLklzTGlzdCh0eXBlKSkgeworICAgIGlmICh0eXBlLklzRml4ZWRTaXplQXJyYXkoKSkgeworICAgICAgYXV0byBkaW1lbnNpb25zID0gdHlwZS5HZXRGaXhlZFNpemVBcnJheURpbWVuc2lvbnMoKTsKKyAgICAgIGZvciAoYXV0byBpdCA9IHJiZWdpbihkaW1lbnNpb25zKSwgZW5kID0gcmVuZChkaW1lbnNpb25zKTsgaXQgIT0gZW5kOyBpdCsrKSB7CisgICAgICAgIGNwcF9uYW1lID0gInN0ZDo6YXJyYXk8IiArIGNwcF9uYW1lICsgIiwgIiArIHN0ZDo6dG9fc3RyaW5nKCppdCkgKyAiPiI7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGNwcF9uYW1lID0gIjo6c3RkOjp2ZWN0b3I8IiArIGNwcF9uYW1lICsgIj4iOworICAgIH0KKworICAgIC8vIHdyYXAgbnVsbGFibGUgYWdhaW4gYmVjYXVzZSBAbnVsbGFibGUgYXBwbGllcyB0byBCT1RIIGFycmF5IHR5cGUob3V0ZXJtb3N0IHR5cGUpIEFORCBiYXNlCisgICAgLy8gdHlwZShpbm5lcm1vc3QgdHlwZSkKKyAgICBpZiAodHlwZS5Jc0hlYXBOdWxsYWJsZSgpKSB7CisgICAgICBjcHBfbmFtZSA9ICI6OnN0ZDo6dW5pcXVlX3B0cjwiICsgY3BwX25hbWUgKyAiPiI7CisgICAgfSBlbHNlIGlmICh0eXBlLklzTnVsbGFibGUoKSkgeworICAgICAgY3BwX25hbWUgPSAiOjpzdGQ6Om9wdGlvbmFsPCIgKyBjcHBfbmFtZSArICI+IjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGNwcF9uYW1lOwogfQogCiBib29sIElzTm9uQ29weWFibGVUeXBlKGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiB0eXBlLCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMpIHsKQEAgLTI3NCw0MCArMjgwLDM0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBDcHBOYW1lT2YoZW51bV9kZWNsLT5HZXRCYWNraW5nVHlwZSgpLCB0eXBlbmFtZXMpLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZV9uYW1lLmNfc3RyKCkpOwogICB9Ci0KLSAgaWYgKHR5cGVuYW1lcy5HZXRJbnRlcmZhY2UodHlwZSkgIT0gbnVsbHB0cikgewotICAgIHJldHVybiBHZXRSYXdDcHBOYW1lKHR5cGUpICsgIjo6YXNCaW5kZXIoIiArIHZhcmlhYmxlX25hbWUgKyAiKSI7Ci0gIH0KLQogICByZXR1cm4gdmFyaWFibGVfbmFtZTsKIH0KIAorLy8gQWRkIGluY2x1ZGVzIGZvciBhIHR5cGUgcmVmLiBOb3RlIHRoYXQgdGhpcyBpcyBub24tcmVjdXJzaXZlLgogdm9pZCBBZGRIZWFkZXJzKGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiB0eXBlLCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsCiAgICAgICAgICAgICAgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+KiBoZWFkZXJzKSB7Ci0gIEFJRExfRkFUQUxfSUYodHlwZW5hbWVzLklzTGlzdCh0eXBlKSAmJiB0eXBlLkdldFR5cGVQYXJhbWV0ZXJzKCkuc2l6ZSgpICE9IDEsIHR5cGUpOwotICBib29sIGlzVmVjdG9yID0gdHlwZS5Jc0FycmF5KCkgfHwgdHlwZW5hbWVzLklzTGlzdCh0eXBlKTsKLSAgYm9vbCBpc051bGxhYmxlID0gdHlwZS5Jc051bGxhYmxlKCk7Ci0gIGJvb2wgdXRmOCA9IHR5cGUuSXNVdGY4SW5DcHAoKTsKLQotICBpZiAoaXNWZWN0b3IpIHsKLSAgICBoZWFkZXJzLT5pbnNlcnQoInZlY3RvciIpOwotICB9Ci0gIGlmICh0eXBlLklzR2VuZXJpYygpKSB7Ci0gICAgZm9yIChjb25zdCBhdXRvJiBwYXJhbWV0ZXIgOiB0eXBlLkdldFR5cGVQYXJhbWV0ZXJzKCkpIHsKLSAgICAgIEFkZEhlYWRlcnMoKnBhcmFtZXRlciwgdHlwZW5hbWVzLCBoZWFkZXJzKTsKKyAgaWYgKHR5cGUuSXNBcnJheSgpKSB7CisgICAgaWYgKHR5cGUuSXNGaXhlZFNpemVBcnJheSgpKSB7CisgICAgICBoZWFkZXJzLT5pbnNlcnQoImFycmF5Iik7CisgICAgfSBlbHNlIHsKKyAgICAgIGhlYWRlcnMtPmluc2VydCgidmVjdG9yIik7CiAgICAgfQogICB9Ci0gIGlmIChpc051bGxhYmxlKSB7CisgIGlmICh0eXBlLklzTnVsbGFibGUoKSkgewogICAgIGlmICh0eXBlLkdldE5hbWUoKSAhPSAiSUJpbmRlciIpIHsKICAgICAgIGhlYWRlcnMtPmluc2VydCgib3B0aW9uYWwiKTsKICAgICB9CiAgIH0KICAgaWYgKHR5cGVuYW1lcy5Jc0xpc3QodHlwZSkpIHsKLSAgICAvLyBOb3RoaW5nIGVsc2UgdG8gZG8gZm9yIExpc3QuCisgICAgaGVhZGVycy0+aW5zZXJ0KCJ2ZWN0b3IiKTsKICAgICByZXR1cm47CiAgIH0KICAgaWYgKHR5cGUuR2V0TmFtZSgpID09ICJTdHJpbmciKSB7Ci0gICAgaGVhZGVycy0+aW5zZXJ0KHV0ZjggPyAic3RyaW5nIiA6ICJ1dGlscy9TdHJpbmcxNi5oIik7CisgICAgaWYgKHR5cGUuSXNVdGY4SW5DcHAoKSkgeworICAgICAgaGVhZGVycy0+aW5zZXJ0KCJzdHJpbmciKTsKKyAgICB9IGVsc2UgeworICAgICAgaGVhZGVycy0+aW5zZXJ0KCJ1dGlscy9TdHJpbmcxNi5oIik7CisgICAgfQogICAgIHJldHVybjsKICAgfQogICBpZiAodHlwZS5HZXROYW1lKCkgPT0gIklCaW5kZXIiKSB7CkBAIC0zMzcsMjYgKzMzNywyMSBAQAogICAgIHJldHVybjsKICAgfQogCi0gIGF1dG8gZGVmaW5lZFR5cGUgPSB0eXBlbmFtZXMuVHJ5R2V0RGVmaW5lZFR5cGUodHlwZS5HZXROYW1lKCkpOwotICBBSURMX0ZBVEFMX0lGKGRlZmluZWRUeXBlID09IG51bGxwdHIsIHR5cGUpIDw8ICJVbmV4cGVjdGVkIHR5cGU6ICIgPDwgdHlwZS5HZXROYW1lKCk7CisgIGF1dG8gZGVmaW5lZF90eXBlID0gdHlwZW5hbWVzLlRyeUdldERlZmluZWRUeXBlKHR5cGUuR2V0TmFtZSgpKTsKKyAgQUlETF9GQVRBTF9JRihkZWZpbmVkX3R5cGUgPT0gbnVsbHB0ciwgdHlwZSkgPDwgIlVuZXhwZWN0ZWQgdHlwZTogIiA8PCB0eXBlLkdldE5hbWUoKTsKIAotICBpZiAoZGVmaW5lZFR5cGUtPkFzSW50ZXJmYWNlKCkgIT0gbnVsbHB0ciB8fCBkZWZpbmVkVHlwZS0+QXNTdHJ1Y3R1cmVkUGFyY2VsYWJsZSgpICE9IG51bGxwdHIgfHwKLSAgICAgIGRlZmluZWRUeXBlLT5Bc0VudW1EZWNsYXJhdGlvbigpICE9IG51bGxwdHIgfHwgZGVmaW5lZFR5cGUtPkFzVW5pb25EZWNsYXJhdGlvbigpICE9IG51bGxwdHIpIHsKLSAgICBBZGRIZWFkZXJzKCpkZWZpbmVkVHlwZSwgaGVhZGVycyk7Ci0gIH0gZWxzZSBpZiAoZGVmaW5lZFR5cGUtPkFzUGFyY2VsYWJsZSgpICE9IG51bGxwdHIpIHsKLSAgICBjb25zdCBzdGQ6OnN0cmluZyBjcHBfaGVhZGVyID0gZGVmaW5lZFR5cGUtPkFzUGFyY2VsYWJsZSgpLT5HZXRDcHBIZWFkZXIoKTsKLSAgICBBSURMX0ZBVEFMX0lGKGNwcF9oZWFkZXIuZW1wdHkoKSwgZGVmaW5lZFR5cGUtPkFzUGFyY2VsYWJsZSgpKQotICAgICAgICA8PCAiUGFyY2VsYWJsZSAiIDw8IGRlZmluZWRUeXBlLT5Bc1BhcmNlbGFibGUoKS0+R2V0Q2Fub25pY2FsTmFtZSgpCi0gICAgICAgIDw8ICIgaGFzIG5vIEMrKyBoZWFkZXIgZGVmaW5lZC4iOwotICAgIGhlYWRlcnMtPmluc2VydChjcHBfaGVhZGVyKTsKLSAgfQorICBoZWFkZXJzLT5pbnNlcnQoQ3BwSGVhZGVyRm9yVHlwZSgqZGVmaW5lZF90eXBlKSk7CiB9CiAKLXZvaWQgQWRkSGVhZGVycyhjb25zdCBBaWRsRGVmaW5lZFR5cGUmIGRlZmluZWRUeXBlLCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4qIGhlYWRlcnMpIHsKLSAgdmVjdG9yPHN0cmluZz4gbmFtZSA9IGRlZmluZWRUeXBlLkdldFNwbGl0UGFja2FnZSgpOwotICBuYW1lLnB1c2hfYmFjayhkZWZpbmVkVHlwZS5HZXROYW1lKCkpOwotICBjb25zdCBzdGQ6OnN0cmluZyBjcHBfaGVhZGVyID0gSm9pbihuYW1lLCAnLycpICsgIi5oIjsKLSAgaGVhZGVycy0+aW5zZXJ0KGNwcF9oZWFkZXIpOworc3RkOjpzdHJpbmcgQ3BwSGVhZGVyRm9yVHlwZShjb25zdCBBaWRsRGVmaW5lZFR5cGUmIGRlZmluZWRfdHlwZSkgeworICAvLyBVbnN0cnVjdHVyZWQgcGFyY2VsYWJsZSBzaG91bGQgc2V0IGl0cyBjcHBfaGVhZGVyLiB1c2UgaXQuCisgIGlmIChhdXRvIHVuc3RydWN0dXJlZCA9IEFpZGxDYXN0PEFpZGxQYXJjZWxhYmxlPihkZWZpbmVkX3R5cGUpOyB1bnN0cnVjdHVyZWQpIHsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBjcHBfaGVhZGVyID0gdW5zdHJ1Y3R1cmVkLT5HZXRDcHBIZWFkZXIoKTsKKyAgICBBSURMX0ZBVEFMX0lGKGNwcF9oZWFkZXIuZW1wdHkoKSwgdW5zdHJ1Y3R1cmVkKQorICAgICAgICA8PCAiUGFyY2VsYWJsZSAiIDw8IHVuc3RydWN0dXJlZC0+R2V0Q2Fub25pY2FsTmFtZSgpIDw8ICIgaGFzIG5vIEMrKyBoZWFkZXIgZGVmaW5lZC4iOworICAgIHJldHVybiBjcHBfaGVhZGVyOworICB9CisgIHJldHVybiBIZWFkZXJGaWxlKGRlZmluZWRfdHlwZSwgQ2xhc3NOYW1lczo6UkFXLCAvKnVzZV9vc19zZXA9Ki9mYWxzZSk7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBjcHAKZGlmZiAtLWdpdCBhL2FpZGxfdG9fY3BwLmggYi9haWRsX3RvX2NwcC5oCmluZGV4IGY2OTc0ZjUuLjczYjc5YmIgMTAwNjQ0Ci0tLSBhL2FpZGxfdG9fY3BwLmgKKysrIGIvYWlkbF90b19jcHAuaApAQCAtMjMsNyArMjMsOSBAQAogCiAvLyBUaGlzIGhlYWRlciBwcm92aWRlcyBmdW5jdGlvbnMgdGhhdCB0cmFuc2xhdGUgQUlETCB0aGluZ3MgdG8gY3BwIHRoaW5ncy4KIAotc3RkOjpzdHJpbmcgQ29uc3RhbnRWYWx1ZURlY29yYXRvcihjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHJhd192YWx1ZSk7CitzdGQ6OnN0cmluZyBDb25zdGFudFZhbHVlRGVjb3JhdG9yKAorICAgIGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiB0eXBlLAorICAgIGNvbnN0IHN0ZDo6dmFyaWFudDxzdGQ6OnN0cmluZywgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+PiYgcmF3X3ZhbHVlKTsKIAogc3RydWN0IENvZGVHZW5lcmF0b3JDb250ZXh0IHsKICAgQ29kZVdyaXRlciYgd3JpdGVyOwpAQCAtMzQsNyArMzYsNyBAQAogICBjb25zdCBib29sIGlzUG9pbnRlcjsgICAgICAgICAgIC8vIHdoZXRoZXIgdGhlIHZhcmlhYmxlICduYW1lJyBpcyBhIHBvaW50ZXIgb3Igbm90CiB9OwogCi1zdGQ6OnN0cmluZyBHZXRUcmFuc2FjdGlvbklkRm9yKGNvbnN0IEFpZGxJbnRlcmZhY2UmIGlmYWNlLCBjb25zdCBBaWRsTWV0aG9kJiBtZXRob2QpOworc3RkOjpzdHJpbmcgR2V0VHJhbnNhY3Rpb25JZEZvcihjb25zdCBzdGQ6OnN0cmluZyYgY2xhenosIGNvbnN0IEFpZGxNZXRob2QmIG1ldGhvZCk7CiAKIHN0ZDo6c3RyaW5nIENwcE5hbWVPZihjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzKTsKIApAQCAtNjEsNyArNjMsNyBAQAogdm9pZCBBZGRIZWFkZXJzKGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiB0eXBlLCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsCiAgICAgICAgICAgICAgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+KiBoZWFkZXJzKTsKIAotdm9pZCBBZGRIZWFkZXJzKGNvbnN0IEFpZGxEZWZpbmVkVHlwZSYgcGFyY2VsYWJsZSwgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+KiBoZWFkZXJzKTsKK3N0ZDo6c3RyaW5nIENwcEhlYWRlckZvclR5cGUoY29uc3QgQWlkbERlZmluZWRUeXBlJiBkZWZpbmVkX3R5cGUpOwogfSAgLy8gbmFtZXNwYWNlIGNwcAogfSAgLy8gbmFtZXNwYWNlIGFpZGwKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9haWRsX3RvX2NwcF9jb21tb24uY3BwIGIvYWlkbF90b19jcHBfY29tbW9uLmNwcAppbmRleCBmMGJmMWRjLi42ODJiNmM4IDEwMDY0NAotLS0gYS9haWRsX3RvX2NwcF9jb21tb24uY3BwCisrKyBiL2FpZGxfdG9fY3BwX2NvbW1vbi5jcHAKQEAgLTE5LDE1ICsxOSwxNiBAQAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncy5oPgogCisjaW5jbHVkZSA8bGltaXRzPgogI2luY2x1ZGUgPHNldD4KICNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgogCi0jaW5jbHVkZSAiYXN0X2NwcC5oIgogI2luY2x1ZGUgImNvbW1lbnRzLmgiCiAjaW5jbHVkZSAibG9nZ2luZy5oIgogI2luY2x1ZGUgIm9zLmgiCiAKIHVzaW5nIDo6YW5kcm9pZDo6YmFzZTo6Sm9pbjsKK3VzaW5nIDo6YW5kcm9pZDo6YmFzZTo6U3BsaXQ7CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBhaWRsIHsKQEAgLTY2LDYgKzY3LDggQEAKICAgICAgIHJldHVybiAiSSIgKyBiYXNlX25hbWUgKyAiRGVmYXVsdCI7CiAgICAgY2FzZSBDbGFzc05hbWVzOjpCQVNFOgogICAgICAgcmV0dXJuIGJhc2VfbmFtZTsKKyAgICBjYXNlIENsYXNzTmFtZXM6OkRFTEVHQVRPUl9JTVBMOgorICAgICAgcmV0dXJuICJJIiArIGJhc2VfbmFtZSArICJEZWxlZ2F0b3IiOwogICAgIGNhc2UgQ2xhc3NOYW1lczo6UkFXOgogICAgICAgW1tmYWxsdGhyb3VnaF1dOwogICAgIGRlZmF1bHQ6CkBAIC03NSwxOSArNzgsMjEgQEAKIAogc3RkOjpzdHJpbmcgSGVhZGVyRmlsZShjb25zdCBBaWRsRGVmaW5lZFR5cGUmIGRlZmluZWRfdHlwZSwgQ2xhc3NOYW1lcyBjbGFzc190eXBlLAogICAgICAgICAgICAgICAgICAgICAgICBib29sIHVzZV9vc19zZXApIHsKLSAgc3RkOjpzdHJpbmcgZmlsZV9wYXRoID0gZGVmaW5lZF90eXBlLkdldFBhY2thZ2UoKTsKLSAgZm9yIChjaGFyJiBjIDogZmlsZV9wYXRoKSB7Ci0gICAgaWYgKGMgPT0gJy4nKSB7Ci0gICAgICBjID0gKHVzZV9vc19zZXApID8gT1NfUEFUSF9TRVBBUkFUT1IgOiAnLyc7Ci0gICAgfQorICAvLyBGb3IgYSBuZXN0ZWQgdHlwZSwgd2UgbmVlZCB0byBpbmNsdWRlIGl0cyB0b3AtbW9zdCBwYXJlbnQgdHlwZSdzIGhlYWRlci4KKyAgY29uc3QgQWlkbERlZmluZWRUeXBlKiB0b3BsZXZlbCA9ICZkZWZpbmVkX3R5cGU7CisgIGZvciAoYXV0byBwYXJlbnQgPSB0b3BsZXZlbC0+R2V0UGFyZW50VHlwZSgpOyBwYXJlbnQ7KSB7CisgICAgLy8gV2hlbiBpbmNsdWRpbmcgdGhlIHBhcmVudCdzIGhlYWRlciwgaXQgc2hvdWxkIGJlIGFsd2F5cyBSQVcKKyAgICBjbGFzc190eXBlID0gQ2xhc3NOYW1lczo6UkFXOworICAgIHRvcGxldmVsID0gcGFyZW50OworICAgIHBhcmVudCA9IHRvcGxldmVsLT5HZXRQYXJlbnRUeXBlKCk7CiAgIH0KLSAgaWYgKCFmaWxlX3BhdGguZW1wdHkoKSkgewotICAgIGZpbGVfcGF0aCArPSAodXNlX29zX3NlcCkgPyBPU19QQVRIX1NFUEFSQVRPUiA6ICcvJzsKLSAgfQotICBmaWxlX3BhdGggKz0gQ2xhc3NOYW1lKGRlZmluZWRfdHlwZSwgY2xhc3NfdHlwZSk7Ci0gIGZpbGVfcGF0aCArPSAiLmgiOworICBBSURMX0ZBVEFMX0lGKHRvcGxldmVsLT5HZXRQYXJlbnRUeXBlKCkgIT0gbnVsbHB0ciwgZGVmaW5lZF90eXBlKQorICAgICAgPDwgIkNhbid0IGZpbmQgYSB0b3AtbGV2ZWwgZGVjbCI7CiAKLSAgcmV0dXJuIGZpbGVfcGF0aDsKKyAgY2hhciBzZXBhcmF0b3IgPSAodXNlX29zX3NlcCkgPyBPU19QQVRIX1NFUEFSQVRPUiA6ICcvJzsKKyAgdmVjdG9yPHN0cmluZz4gcGF0aHMgPSB0b3BsZXZlbC0+R2V0U3BsaXRQYWNrYWdlKCk7CisgIHBhdGhzLnB1c2hfYmFjayhDbGFzc05hbWUoKnRvcGxldmVsLCBjbGFzc190eXBlKSk7CisgIHJldHVybiBKb2luKHBhdGhzLCBzZXBhcmF0b3IpICsgIi5oIjsKIH0KIAogdm9pZCBFbnRlck5hbWVzcGFjZShDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxEZWZpbmVkVHlwZSYgZGVmaW5lZF90eXBlKSB7CkBAIC0xOTYsMTggKzIwMSw2MCBAQAogICByZXR1cm4gY29kZTsKIH0KIAorLy8gUmV0dXJucyBQYXJlbnQxOjpQYXJlbnQyOjpTZWxmLiBOYW1lc3BhY2VzIGFyZSBub3QgaW5jbHVkZWQuCitzdHJpbmcgR2V0UXVhbGlmaWVkTmFtZShjb25zdCBBaWRsRGVmaW5lZFR5cGUmIHR5cGUsIENsYXNzTmFtZXMgY2xhc3NfbmFtZXMpIHsKKyAgc3RyaW5nIHFfbmFtZSA9IENsYXNzTmFtZSh0eXBlLCBjbGFzc19uYW1lcyk7CisgIGZvciAoYXV0byBwYXJlbnQgPSB0eXBlLkdldFBhcmVudFR5cGUoKTsgcGFyZW50OyBwYXJlbnQgPSBwYXJlbnQtPkdldFBhcmVudFR5cGUoKSkgeworICAgIHFfbmFtZSA9IHBhcmVudC0+R2V0TmFtZSgpICsgIjo6IiArIHFfbmFtZTsKKyAgfQorICByZXR1cm4gcV9uYW1lOworfQorCisvLyBHZW5lcmF0ZXMgZW51bSdzIGNsYXNzIGRlY2xhcmF0aW9uLiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgaW4gYSBwcm9wZXIgc2NvcGUuIEZvciBleGFtcGxlLCBpbiBpdHMKKy8vIG5hbWVzcGFjZSBvciBwYXJlbnQgdHlwZS4KK3ZvaWQgR2VuZXJhdGVFbnVtQ2xhc3NEZWNsKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbEVudW1EZWNsYXJhdGlvbiYgZW51bV9kZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGJhY2tpbmdfdHlwZSwgQ29uc3RhbnRWYWx1ZURlY29yYXRvciBkZWNvcmF0b3IpIHsKKyAgb3V0IDw8ICJlbnVtIGNsYXNzIjsKKyAgR2VuZXJhdGVEZXByZWNhdGVkKG91dCwgZW51bV9kZWNsKTsKKyAgb3V0IDw8ICIgIiA8PCBlbnVtX2RlY2wuR2V0TmFtZSgpIDw8ICIgOiAiIDw8IGJhY2tpbmdfdHlwZSA8PCAiIHtcbiI7CisgIG91dC5JbmRlbnQoKTsKKyAgZm9yIChjb25zdCBhdXRvJiBlbnVtZXJhdG9yIDogZW51bV9kZWNsLkdldEVudW1lcmF0b3JzKCkpIHsKKyAgICBvdXQgPDwgZW51bWVyYXRvci0+R2V0TmFtZSgpOworICAgIEdlbmVyYXRlRGVwcmVjYXRlZChvdXQsICplbnVtZXJhdG9yKTsKKyAgICBvdXQgPDwgIiA9ICIgPDwgZW51bWVyYXRvci0+VmFsdWVTdHJpbmcoZW51bV9kZWNsLkdldEJhY2tpbmdUeXBlKCksIGRlY29yYXRvcikgPDwgIixcbiI7CisgIH0KKyAgb3V0LkRlZGVudCgpOworICBvdXQgPDwgIn07XG4iOworfQorCitzdGF0aWMgYm9vbCBJc0VudW1EZXByZWNhdGVkKGNvbnN0IEFpZGxFbnVtRGVjbGFyYXRpb24mIGVudW1fZGVjbCkgeworICBpZiAoZW51bV9kZWNsLklzRGVwcmVjYXRlZCgpKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgZm9yIChjb25zdCBhdXRvJiBlIDogZW51bV9kZWNsLkdldEVudW1lcmF0b3JzKCkpIHsKKyAgICBpZiAoZS0+SXNEZXByZWNhdGVkKCkpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIGVudW1fdmFsdWVzIHRlbXBsYXRlIHZhbHVlIGlzIGRlZmluZWQgaW4gaXRzIG93biBuYW1lc3BhY2UgKGFuZHJvaWQ6OmludGVybmFsIG9yIG5kazo6aW50ZXJuYWwpLAorLy8gc28gdGhlIGVudW1fZGVjbCB0eXBlIHNob3VsZCBiZSBmdWxseSBxdWFsaWZpZWQuCiBzdGQ6OnN0cmluZyBHZW5lcmF0ZUVudW1WYWx1ZXMoY29uc3QgQWlkbEVudW1EZWNsYXJhdGlvbiYgZW51bV9kZWNsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgZW5jbG9zaW5nX25hbWVzcGFjZXNfb2ZfZW51bV9kZWNsKSB7CiAgIGNvbnN0IGF1dG8gZnFfbmFtZSA9CiAgICAgICBKb2luKEFwcGVuZChlbmNsb3NpbmdfbmFtZXNwYWNlc19vZl9lbnVtX2RlY2wsIGVudW1fZGVjbC5HZXRTcGxpdFBhY2thZ2UoKSksICI6OiIpICsKLSAgICAgICI6OiIgKyBlbnVtX2RlY2wuR2V0TmFtZSgpOworICAgICAgIjo6IiArIEdldFF1YWxpZmllZE5hbWUoZW51bV9kZWNsKTsKICAgY29uc3QgYXV0byBzaXplID0gZW51bV9kZWNsLkdldEVudW1lcmF0b3JzKCkuc2l6ZSgpOwogICBzdGQ6Om9zdHJpbmdzdHJlYW0gY29kZTsKICAgY29kZSA8PCAiI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2hcbiI7CiAgIGNvZGUgPDwgIiNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkIFwiLVdjKysxNy1leHRlbnNpb25zXCJcbiI7CisgIGlmIChJc0VudW1EZXByZWNhdGVkKGVudW1fZGVjbCkpIHsKKyAgICBjb2RlIDw8ICIjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCBcIi1XZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnNcIlxuIjsKKyAgfQogICBjb2RlIDw8ICJ0ZW1wbGF0ZSA8PlxuIjsKICAgY29kZSA8PCAiY29uc3RleHByIGlubGluZSBzdGQ6OmFycmF5PCIgPDwgZnFfbmFtZSA8PCAiLCAiIDw8IHNpemUgPDwgIj4iOwotICBHZW5lcmF0ZURlcHJlY2F0ZWQoY29kZSwgZW51bV9kZWNsKTsKICAgY29kZSA8PCAiIGVudW1fdmFsdWVzPCIgPDwgZnFfbmFtZSA8PCAiPiA9IHtcbiI7CiAgIGZvciAoY29uc3QgYXV0byYgZW51bWVyYXRvciA6IGVudW1fZGVjbC5HZXRFbnVtZXJhdG9ycygpKSB7CiAgICAgY29kZSA8PCAiICAiIDw8IGZxX25hbWUgPDwgIjo6IiA8PCBlbnVtZXJhdG9yLT5HZXROYW1lKCkgPDwgIixcbiI7CkBAIC0yMTcsNiArMjY0LDQyIEBACiAgIHJldHVybiBjb2RlLnN0cigpOwogfQogCisvLyB0b1N0cmluZyhlbnVtX3R5cGUpIGlzIGRlZmluZWQgaW4gdGhlIHNhbWUgbmFtZXNwYWNlIG9mIHRoZSB0eXBlLgorLy8gU28sIGlmIGVudW1fZGVjbCBpcyBuZXN0ZWQgaW4gcGFyZW50IHR5cGUocyksIGl0IHNob3VsZCBiZSBxdWFsaWZpZWQgd2l0aCBwYXJlbnQgdHlwZShzKS4KK3N0ZDo6c3RyaW5nIEdlbmVyYXRlRW51bVRvU3RyaW5nKGNvbnN0IEFpZGxFbnVtRGVjbGFyYXRpb24mIGVudW1fZGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBiYWNraW5nX3R5cGUpIHsKKyAgY29uc3QgYXV0byBxX25hbWUgPSBHZXRRdWFsaWZpZWROYW1lKGVudW1fZGVjbCk7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBjb2RlOworICBib29sIGlzX2VudW1fZGVwcmVjYXRlZCA9IElzRW51bURlcHJlY2F0ZWQoZW51bV9kZWNsKTsKKyAgaWYgKGlzX2VudW1fZGVwcmVjYXRlZCkgeworICAgIGNvZGUgPDwgIiNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoXG4iOworICAgIGNvZGUgPDwgIiNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkIFwiLVdkZXByZWNhdGVkLWRlY2xhcmF0aW9uc1wiXG4iOworICB9CisgIGNvZGUgPDwgIltbbm9kaXNjYXJkXV0gc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZygiICsgcV9uYW1lICsgIiB2YWwpIHtcbiI7CisgIGNvZGUgPDwgIiAgc3dpdGNoKHZhbCkge1xuIjsKKyAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IHVuaXF1ZV9jYXNlczsKKyAgZm9yIChjb25zdCBhdXRvJiBlbnVtZXJhdG9yIDogZW51bV9kZWNsLkdldEVudW1lcmF0b3JzKCkpIHsKKyAgICBzdGQ6OnN0cmluZyBjID0gZW51bWVyYXRvci0+VmFsdWVTdHJpbmcoZW51bV9kZWNsLkdldEJhY2tpbmdUeXBlKCksIEFpZGxDb25zdGFudFZhbHVlRGVjb3JhdG9yKTsKKyAgICAvLyBPbmx5IGFkZCBhIGNhc2UgaWYgaXRzIHZhbHVlIGhhcyBub3QgeWV0IGJlZW4gdXNlZCBpbiB0aGUgc3dpdGNoCisgICAgLy8gc3RhdGVtZW50LiBDKysgZG9lcyBub3QgYWxsb3cgbXVsdGlwbGUgY2FzZXMgd2l0aCB0aGUgc2FtZSB2YWx1ZSwgYnV0CisgICAgLy8gZW51bXMgZG9lcyBhbGxvdyB0aGlzLiBJbiB0aGlzIHNjZW5hcmlvLCB0aGUgZmlyc3QgZGVjbGFyZWQKKyAgICAvLyBlbnVtZXJhdG9yIHdpdGggdGhlIGdpdmVuIHZhbHVlIGlzIHByaW50ZWQuCisgICAgaWYgKHVuaXF1ZV9jYXNlcy5jb3VudChjKSA9PSAwKSB7CisgICAgICB1bmlxdWVfY2FzZXMuaW5zZXJ0KGMpOworICAgICAgY29kZSA8PCAiICBjYXNlICIgPDwgcV9uYW1lIDw8ICI6OiIgPDwgZW51bWVyYXRvci0+R2V0TmFtZSgpIDw8ICI6XG4iOworICAgICAgY29kZSA8PCAiICAgIHJldHVybiBcIiIgPDwgZW51bWVyYXRvci0+R2V0TmFtZSgpIDw8ICJcIjtcbiI7CisgICAgfQorICB9CisgIGNvZGUgPDwgIiAgZGVmYXVsdDpcbiI7CisgIGNvZGUgPDwgIiAgICByZXR1cm4gc3RkOjp0b19zdHJpbmcoc3RhdGljX2Nhc3Q8IiA8PCBiYWNraW5nX3R5cGUgPDwgIj4odmFsKSk7XG4iOworICBjb2RlIDw8ICIgIH1cbiI7CisgIGNvZGUgPDwgIn1cbiI7CisgIGlmIChpc19lbnVtX2RlcHJlY2F0ZWQpIHsKKyAgICBjb2RlIDw8ICIjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wXG4iOworICB9CisgIHJldHVybiBjb2RlLnN0cigpOworfQorCiBzdGQ6OnN0cmluZyBUZW1wbGF0ZURlY2woY29uc3QgQWlkbFBhcmNlbGFibGUmIGRlZmluZWRfdHlwZSkgewogICBzdGQ6OnN0cmluZyBkZWNsID0gIiI7CiAgIGlmIChkZWZpbmVkX3R5cGUuSXNHZW5lcmljKCkpIHsKQEAgLTIzMiw2ICszMTUsMzkgQEAKIAogdm9pZCBHZW5lcmF0ZVBhcmNlbGFibGVDb21wYXJpc29uT3BlcmF0b3JzKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbFBhcmNlbGFibGUmIHBhcmNlbGFibGUpIHsKICAgc3RkOjpzZXQ8c3RyaW5nPiBvcGVyYXRvcnN7IjwiLCAiPiIsICI9PSIsICI+PSIsICI8PSIsICIhPSJ9OworCisgIGlmIChwYXJjZWxhYmxlLkFzVW5pb25EZWNsYXJhdGlvbigpICYmIHBhcmNlbGFibGUuSXNGaXhlZFNpemUoKSkgeworICAgIGF1dG8gbmFtZSA9IHBhcmNlbGFibGUuR2V0TmFtZSgpOworICAgIGF1dG8gbWF4X3RhZyA9IHBhcmNlbGFibGUuR2V0RmllbGRzKCkuYmFjaygpLT5HZXROYW1lKCk7CisgICAgYXV0byBtaW5fdGFnID0gcGFyY2VsYWJsZS5HZXRGaWVsZHMoKS5mcm9udCgpLT5HZXROYW1lKCk7CisgICAgYXV0byB0bXBsID0gUiItLShzdGF0aWMgaW50IF9jbXAoY29uc3Qge25hbWV9JiBfbGhzLCBjb25zdCB7bmFtZX0mIF9yaHMpIHt7CisgIHJldHVybiBfY21wX3ZhbHVlKF9saHMuZ2V0VGFnKCksIF9yaHMuZ2V0VGFnKCkpIHx8IF9jbXBfdmFsdWVfYXQ8e21heF90YWd9PihfbGhzLCBfcmhzKTsKK319Cit0ZW1wbGF0ZSA8VGFnIF9UYWc+CitzdGF0aWMgaW50IF9jbXBfdmFsdWVfYXQoY29uc3Qge25hbWV9JiBfbGhzLCBjb25zdCB7bmFtZX0mIF9yaHMpIHt7CisgIGlmIGNvbnN0ZXhwciAoX1RhZyA9PSB7bWluX3RhZ30pIHt7CisgICAgcmV0dXJuIF9jbXBfdmFsdWUoX2xocy5nZXQ8X1RhZz4oKSwgX3Jocy5nZXQ8X1RhZz4oKSk7CisgIH19IGVsc2Uge3sKKyAgICByZXR1cm4gKF9saHMuZ2V0VGFnKCkgPT0gX1RhZykKKyAgICAgID8gX2NtcF92YWx1ZShfbGhzLmdldDxfVGFnPigpLCBfcmhzLmdldDxfVGFnPigpKQorICAgICAgOiBfY21wX3ZhbHVlX2F0PHN0YXRpY19jYXN0PFRhZz4oc3RhdGljX2Nhc3Q8c2l6ZV90PihfVGFnKS0xKT4oX2xocywgX3Jocyk7CisgIH19Cit9fQordGVtcGxhdGUgPHR5cGVuYW1lIF9UeXBlPgorc3RhdGljIGludCBfY21wX3ZhbHVlKGNvbnN0IF9UeXBlJiBfbGhzLCBjb25zdCBfVHlwZSYgX3Jocykge3sKKyAgcmV0dXJuIChfbGhzID09IF9yaHMpID8gMCA6IChfbGhzIDwgX3JocykgPyAtMSA6IDE7Cit9fQorKS0tIjsKKyAgICBvdXQgPDwgZm10Ojpmb3JtYXQodG1wbCwgZm10OjphcmcoIm5hbWUiLCBuYW1lKSwgZm10OjphcmcoIm1pbl90YWciLCBtaW5fdGFnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgZm10OjphcmcoIm1heF90YWciLCBtYXhfdGFnKSk7CisgICAgZm9yIChjb25zdCBhdXRvJiBvcCA6IG9wZXJhdG9ycykgeworICAgICAgb3V0IDw8ICJpbmxpbmUgYm9vbCBvcGVyYXRvciIgPDwgb3AgPDwgIihjb25zdCAiIDw8IG5hbWUgPDwgIiZfcmhzKSBjb25zdCB7XG4iOworICAgICAgb3V0IDw8ICIgIHJldHVybiBfY21wKCp0aGlzLCBfcmhzKSAiIDw8IG9wIDw8ICIgMDtcbiI7CisgICAgICBvdXQgPDwgIn1cbiI7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorCiAgIGJvb2wgaXNfZW1wdHkgPSBmYWxzZTsKIAogICBhdXRvIGNvbXBhcmFibGUgPSBbJl0oY29uc3Qgc3RyaW5nJiBwcmVmaXgpIHsKQEAgLTMwOSw5ICs0MjUsMTYgQEAKICAgb3V0IDw8ICJvcyA8PCBcIiIgKyBwYXJjZWxhYmxlLkdldE5hbWUoKSArICJ7XCI7XG4iOwogICBvdXQgPDwgInN3aXRjaCAoZ2V0VGFnKCkpIHtcbiI7CiAgIGZvciAoY29uc3QgYXV0byYgZiA6IHBhcmNlbGFibGUuR2V0RmllbGRzKCkpIHsKKyAgICBpZiAoZi0+SXNEZXByZWNhdGVkKCkpIHsKKyAgICAgIG91dCA8PCAiI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2hcbiI7CisgICAgICBvdXQgPDwgIiNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkIFwiLVdkZXByZWNhdGVkLWRlY2xhcmF0aW9uc1wiXG4iOworICAgIH0KICAgICBjb25zdCBzdHJpbmcgdGFnID0gZi0+R2V0TmFtZSgpOwogICAgIG91dCA8PCAiY2FzZSAiIDw8IHRhZyA8PCAiOiBvcyA8PCBcIiIgPDwgdGFnIDw8ICI6IFwiIDw8ICIKICAgICAgICAgPDwgIjo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGdldDwiICsgdGFnICsgIj4oKSk7IGJyZWFrO1xuIjsKKyAgICBpZiAoZi0+SXNEZXByZWNhdGVkKCkpIHsKKyAgICAgIG91dCA8PCAiI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcFxuIjsKKyAgICB9CiAgIH0KICAgb3V0IDw8ICJ9XG4iOwogICBvdXQgPDwgIm9zIDw8IFwifVwiO1xuIjsKQEAgLTMzMCw1NCArNDUzLDE0NCBAQAogICByZXR1cm4gIiI7CiB9CiAKLWNvbnN0IHZlY3RvcjxzdHJpbmc+IFVuaW9uV3JpdGVyOjpoZWFkZXJzewotICAgICJjYXNzZXJ0IiwgICAgICAvLyBfX2Fzc2VydCBmb3IgbG9nZ2luZwotICAgICJ0eXBlX3RyYWl0cyIsICAvLyBzdGQ6OmlzX3NhbWVfdgotICAgICJ1dGlsaXR5IiwgICAgICAvLyBzdGQ6Om1vZGUvZm9yd2FyZCBmb3IgdmFsdWUKLSAgICAidmFyaWFudCIsICAgICAgLy8gc3RkOjp2YXJpYW50IGZvciB2YWx1ZQotfTsKK3NpemVfdCBBbGlnbm1lbnRPZihjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzKSB7CisgIHN0YXRpYyBtYXA8c3RyaW5nLCBzaXplX3Q+IGFsaWdubWVudCA9IHsKKyAgICAgIHsiYm9vbGVhbiIsIDF9LCB7ImJ5dGUiLCAxfSwgeyJjaGFyIiwgMn0sIHsiZG91YmxlIiwgOH0sCisgICAgICB7ImZsb2F0IiwgNH0sICAgeyJpbnQiLCA0fSwgIHsibG9uZyIsIDh9LAorICB9OworCisgIHN0cmluZyBuYW1lID0gdHlwZS5HZXROYW1lKCk7CisgIGlmIChhdXRvIGVudW1fZGVjbCA9IHR5cGVuYW1lcy5HZXRFbnVtRGVjbGFyYXRpb24odHlwZSk7IGVudW1fZGVjbCkgeworICAgIG5hbWUgPSBlbnVtX2RlY2wtPkdldEJhY2tpbmdUeXBlKCkuR2V0TmFtZSgpOworICB9CisgIC8vIGRlZmF1bHQgdG8gMCBmb3IgcGFyY2VsYWJsZSB0eXBlcworICByZXR1cm4gYWxpZ25tZW50W25hbWVdOworfQorCitzdGQ6OnNldDxzdGQ6OnN0cmluZz4gVW5pb25Xcml0ZXI6OkdldEhlYWRlcnMoY29uc3QgQWlkbFVuaW9uRGVjbCYgZGVjbCkgeworICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gdW5pb25faGVhZGVycyA9IHsKKyAgICAgICJjYXNzZXJ0IiwgICAgICAvLyBfX2Fzc2VydCBmb3IgbG9nZ2luZworICAgICAgInR5cGVfdHJhaXRzIiwgIC8vIHN0ZDo6aXNfc2FtZV92CisgICAgICAidXRpbGl0eSIsICAgICAgLy8gc3RkOjptb2RlL2ZvcndhcmQgZm9yIHZhbHVlCisgICAgICAidmFyaWFudCIsICAgICAgLy8gdW5pb24ncyBpbXBsCisgIH07CisgIGlmIChkZWNsLklzRml4ZWRTaXplKCkpIHsKKyAgICB1bmlvbl9oZWFkZXJzLmluc2VydCgidHVwbGUiKTsgIC8vIGZpeGVkLXNpemVkIHVuaW9uJ3MgdHlwZWxpc3QKKyAgfQorICByZXR1cm4gdW5pb25faGVhZGVyczsKK30KKworLy8gZml4ZWQtc2l6ZWQgdW5pb24gY2xhc3MgbG9va3MgbGlrZToKKy8vIGNsYXNzIFVuaW9uIHsKKy8vIHB1YmxpYzoKKy8vICAgZW51bSBUYWcgOiB1aW50OF90IHsKKy8vICAgICBmaWVsZDEgPSAwLAorLy8gICAgIGZpZWxkMiwKKy8vICAgfTsKKy8vICAuLi4gbWV0aG9kcyAuLi4KKy8vIHByaXZhdGU6CisvLyAgIFRhZyBfdGFnOworLy8gICB1bmlvbiB7CisvLyAgICAgdHlwZTEgZmllbGQxOworLy8gICAgIHR5cGUyIGZpZWxkMjsKKy8vICAgfSBfdmFsdWU7CisvLyB9OwogCiB2b2lkIFVuaW9uV3JpdGVyOjpQcml2YXRlRmllbGRzKENvZGVXcml0ZXImIG91dCkgY29uc3QgewotICB2ZWN0b3I8c3RyaW5nPiBmaWVsZF90eXBlczsKLSAgZm9yIChjb25zdCBhdXRvJiBmIDogZGVjbC5HZXRGaWVsZHMoKSkgewotICAgIGZpZWxkX3R5cGVzLnB1c2hfYmFjayhuYW1lX29mKGYtPkdldFR5cGUoKSwgdHlwZW5hbWVzKSk7CisgIGlmIChkZWNsLklzRml4ZWRTaXplKCkpIHsKKyAgICBBSURMX0ZBVEFMX0lGKGRlY2wuR2V0RmllbGRzKCkuZW1wdHkoKSwgZGVjbCkgPDwgIlVuaW9uICciIDw8IGRlY2wuR2V0TmFtZSgpIDw8ICInIGlzIGVtcHR5LiI7CisgICAgY29uc3QgYXV0byYgZmlyc3RfZmllbGQgPSBkZWNsLkdldEZpZWxkcygpWzBdOworICAgIGNvbnN0IGF1dG8mIGRlZmF1bHRfbmFtZSA9IGZpcnN0X2ZpZWxkLT5HZXROYW1lKCk7CisgICAgY29uc3QgYXV0byYgZGVmYXVsdF92YWx1ZSA9IG5hbWVfb2YoZmlyc3RfZmllbGQtPkdldFR5cGUoKSwgdHlwZW5hbWVzKSArICIoIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X2ZpZWxkLT5WYWx1ZVN0cmluZyhkZWNvcmF0b3IpICsgIikiOworCisgICAgb3V0IDw8ICJUYWcgX3RhZyA9ICIgPDwgZGVmYXVsdF9uYW1lIDw8ICI7XG4iOworICAgIG91dCA8PCAidW5pb24gX3ZhbHVlX3Qge1xuIjsKKyAgICBvdXQuSW5kZW50KCk7CisgICAgb3V0IDw8ICJfdmFsdWVfdCgpIHt9XG4iOworICAgIG91dCA8PCAifl92YWx1ZV90KCkge31cbiI7CisgICAgZm9yIChjb25zdCBhdXRvJiBmIDogZGVjbC5HZXRGaWVsZHMoKSkgeworICAgICAgY29uc3QgYXV0byYgZm4gPSBmLT5HZXROYW1lKCk7CisgICAgICBvdXQgPDwgbmFtZV9vZihmLT5HZXRUeXBlKCksIHR5cGVuYW1lcykgPDwgIiAiIDw8IGZuOworICAgICAgaWYgKGRlY2wuSXNGaXhlZFNpemUoKSkgeworICAgICAgICBpbnQgYWxpZ25tZW50ID0gQWxpZ25tZW50T2YoZi0+R2V0VHlwZSgpLCB0eXBlbmFtZXMpOworICAgICAgICBpZiAoYWxpZ25tZW50ID4gMCkgeworICAgICAgICAgIG91dCA8PCAiIF9fYXR0cmlidXRlX18oKGFsaWduZWQgKCIgPDwgc3RkOjp0b19zdHJpbmcoYWxpZ25tZW50KSA8PCAiKSkpIjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGZuID09IGRlZmF1bHRfbmFtZSkgeworICAgICAgICBvdXQgPDwgIiA9ICIgPDwgZGVmYXVsdF92YWx1ZTsKKyAgICAgIH0KKyAgICAgIG91dCA8PCAiO1xuIjsKKyAgICB9CisgICAgb3V0LkRlZGVudCgpOworICAgIG91dCA8PCAifSBfdmFsdWU7XG4iOworICB9IGVsc2UgeworICAgIHZlY3RvcjxzdHJpbmc+IGZpZWxkX3R5cGVzOworICAgIGZvciAoY29uc3QgYXV0byYgZiA6IGRlY2wuR2V0RmllbGRzKCkpIHsKKyAgICAgIGZpZWxkX3R5cGVzLnB1c2hfYmFjayhuYW1lX29mKGYtPkdldFR5cGUoKSwgdHlwZW5hbWVzKSk7CisgICAgfQorICAgIG91dCA8PCAic3RkOjp2YXJpYW50PCIgKyBKb2luKGZpZWxkX3R5cGVzLCAiLCAiKSArICI+IF92YWx1ZTtcbiI7CiAgIH0KLSAgb3V0IDw8ICJzdGQ6OnZhcmlhbnQ8IiArIEpvaW4oZmllbGRfdHlwZXMsICIsICIpICsgIj4gX3ZhbHVlO1xuIjsKIH0KIAogdm9pZCBVbmlvbldyaXRlcjo6UHVibGljRmllbGRzKENvZGVXcml0ZXImIG91dCkgY29uc3QgewotICBBaWRsVHlwZVNwZWNpZmllciB0YWdfdHlwZShBSURMX0xPQ0FUSU9OX0hFUkUsICJpbnQiLCAvKiBpc19hcnJheT0gKi8gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHR5cGVfcGFyYW1zPSAqLyBudWxscHRyLCBDb21tZW50c3t9KTsKLSAgdGFnX3R5cGUuUmVzb2x2ZSh0eXBlbmFtZXMpOwotCi0gIG91dCA8PCAiZW51bSBUYWcgOiAiIDw8IG5hbWVfb2YodGFnX3R5cGUsIHR5cGVuYW1lcykgPDwgIiB7XG4iOwotICBib29sIGlzX2ZpcnN0ID0gdHJ1ZTsKKyAgb3V0IDw8ICIvLyBFeHBvc2UgdGFnIHN5bWJvbHMgZm9yIGxlZ2FjeSBjb2RlXG4iOwogICBmb3IgKGNvbnN0IGF1dG8mIGYgOiBkZWNsLkdldEZpZWxkcygpKSB7Ci0gICAgb3V0IDw8ICIgICIgPDwgZi0+R2V0TmFtZSgpOworICAgIG91dCA8PCAic3RhdGljIGNvbnN0IGlubGluZSBUYWciOwogICAgIEdlbmVyYXRlRGVwcmVjYXRlZChvdXQsICpmKTsKLSAgICBpZiAoaXNfZmlyc3QpIG91dCA8PCAiID0gMCI7Ci0gICAgb3V0IDw8ICIsICAvLyAiIDw8IGYtPlNpZ25hdHVyZSgpIDw8ICI7XG4iOwotICAgIGlzX2ZpcnN0ID0gZmFsc2U7CisgICAgb3V0IDw8ICIgIiA8PCBmLT5HZXROYW1lKCkgPDwgIiA9IFRhZzo6IiA8PCBmLT5HZXROYW1lKCkgPDwgIjtcbiI7CiAgIH0KLSAgb3V0IDw8ICJ9O1xuIjsKIAogICBjb25zdCBhdXRvJiBuYW1lID0gZGVjbC5HZXROYW1lKCk7CiAKLSAgQUlETF9GQVRBTF9JRihkZWNsLkdldEZpZWxkcygpLmVtcHR5KCksIGRlY2wpIDw8ICJVbmlvbiAnIiA8PCBuYW1lIDw8ICInIGlzIGVtcHR5LiI7Ci0gIGNvbnN0IGF1dG8mIGZpcnN0X2ZpZWxkID0gZGVjbC5HZXRGaWVsZHMoKVswXTsKLSAgY29uc3QgYXV0byYgZGVmYXVsdF9uYW1lID0gZmlyc3RfZmllbGQtPkdldE5hbWUoKTsKLSAgY29uc3QgYXV0byYgZGVmYXVsdF92YWx1ZSA9Ci0gICAgICBuYW1lX29mKGZpcnN0X2ZpZWxkLT5HZXRUeXBlKCksIHR5cGVuYW1lcykgKyAiKCIgKyBmaXJzdF9maWVsZC0+VmFsdWVTdHJpbmcoZGVjb3JhdG9yKSArICIpIjsKKyAgaWYgKGRlY2wuSXNGaXhlZFNpemUoKSkgeworICAgIHZlY3RvcjxzdHJpbmc+IGZpZWxkX3R5cGVzOworICAgIGZvciAoY29uc3QgYXV0byYgZiA6IGRlY2wuR2V0RmllbGRzKCkpIHsKKyAgICAgIGZpZWxkX3R5cGVzLnB1c2hfYmFjayhuYW1lX29mKGYtPkdldFR5cGUoKSwgdHlwZW5hbWVzKSk7CisgICAgfQorICAgIGF1dG8gdHlwZWxpc3QgPSBKb2luKGZpZWxkX3R5cGVzLCAiLCAiKTsKKyAgICBhdXRvIHRtcGwgPSBSIi0tKAordGVtcGxhdGUgPFRhZyBfVGFnPgordXNpbmcgX2F0ID0gdHlwZW5hbWUgc3RkOjp0dXBsZV9lbGVtZW50PHN0YXRpY19jYXN0PHNpemVfdD4oX1RhZyksIHN0ZDo6dHVwbGU8e3R5cGVsaXN0fT4+Ojp0eXBlOwordGVtcGxhdGUgPFRhZyBfVGFnLCB0eXBlbmFtZSBfVHlwZT4KK3N0YXRpYyB7bmFtZX0gbWFrZShfVHlwZSYmIF9hcmcpIHt7CisgIHtuYW1lfSBfaW5zdDsKKyAgX2luc3Quc2V0PF9UYWc+KHN0ZDo6Zm9yd2FyZDxfVHlwZT4oX2FyZykpOworICByZXR1cm4gX2luc3Q7Cit9fQorY29uc3RleHByIFRhZyBnZXRUYWcoKSBjb25zdCB7eworICByZXR1cm4gX3RhZzsKK319Cit0ZW1wbGF0ZSA8VGFnIF9UYWc+Citjb25zdCBfYXQ8X1RhZz4mIGdldCgpIGNvbnN0IHt7CisgIGlmIChfVGFnICE9IF90YWcpIHt7IF9fYXNzZXJ0MihfX0ZJTEVfXywgX19MSU5FX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18sICJiYWQgYWNjZXNzOiBhIHdyb25nIHRhZyIpOyB9fQorICByZXR1cm4gKihfYXQ8X1RhZz4qKSgmX3ZhbHVlKTsKK319Cit0ZW1wbGF0ZSA8VGFnIF9UYWc+CitfYXQ8X1RhZz4mIGdldCgpIHt7CisgIGlmIChfVGFnICE9IF90YWcpIHt7IF9fYXNzZXJ0MihfX0ZJTEVfXywgX19MSU5FX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18sICJiYWQgYWNjZXNzOiBhIHdyb25nIHRhZyIpOyB9fQorICByZXR1cm4gKihfYXQ8X1RhZz4qKSgmX3ZhbHVlKTsKK319Cit0ZW1wbGF0ZSA8VGFnIF9UYWcsIHR5cGVuYW1lIF9UeXBlPgordm9pZCBzZXQoX1R5cGUmJiBfYXJnKSB7eworICBfdGFnID0gX1RhZzsKKyAgZ2V0PF9UYWc+KCkgPSBzdGQ6OmZvcndhcmQ8X1R5cGU+KF9hcmcpOworfX0KKyktLSI7CisgICAgb3V0IDw8IGZtdDo6Zm9ybWF0KHRtcGwsIGZtdDo6YXJnKCJuYW1lIiwgbmFtZSksIGZtdDo6YXJnKCJ0eXBlbGlzdCIsIHR5cGVsaXN0KSk7CisgIH0gZWxzZSB7CisgICAgQUlETF9GQVRBTF9JRihkZWNsLkdldEZpZWxkcygpLmVtcHR5KCksIGRlY2wpIDw8ICJVbmlvbiAnIiA8PCBuYW1lIDw8ICInIGlzIGVtcHR5LiI7CisgICAgY29uc3QgYXV0byYgZmlyc3RfZmllbGQgPSBkZWNsLkdldEZpZWxkcygpWzBdOworICAgIGNvbnN0IGF1dG8mIGRlZmF1bHRfbmFtZSA9IGZpcnN0X2ZpZWxkLT5HZXROYW1lKCk7CisgICAgY29uc3QgYXV0byYgZGVmYXVsdF92YWx1ZSA9IG5hbWVfb2YoZmlyc3RfZmllbGQtPkdldFR5cGUoKSwgdHlwZW5hbWVzKSArICIoIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X2ZpZWxkLT5WYWx1ZVN0cmluZyhkZWNvcmF0b3IpICsgIikiOwogCi0gIGF1dG8gdG1wbCA9IFIiLS0oCisgICAgYXV0byB0bXBsID0gUiItLSgKIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBfbm90X3NlbGYgPSAhc3RkOjppc19zYW1lX3Y8c3RkOjpyZW1vdmVfY3ZfdDxzdGQ6OnJlbW92ZV9yZWZlcmVuY2VfdDxfVHA+Piwge25hbWV9PjsKIAote25hbWV9KCkgOiBfdmFsdWUoc3RkOjppbl9wbGFjZV9pbmRleDx7ZGVmYXVsdF9uYW1lfT4sIHtkZWZhdWx0X3ZhbHVlfSkge3sgfX0KLXtuYW1lfShjb25zdCB7bmFtZX0mKSA9IGRlZmF1bHQ7Ci17bmFtZX0oe25hbWV9JiYpID0gZGVmYXVsdDsKLXtuYW1lfSYgb3BlcmF0b3I9KGNvbnN0IHtuYW1lfSYpID0gZGVmYXVsdDsKLXtuYW1lfSYgb3BlcmF0b3I9KHtuYW1lfSYmKSA9IGRlZmF1bHQ7Cit7bmFtZX0oKSA6IF92YWx1ZShzdGQ6OmluX3BsYWNlX2luZGV4PHN0YXRpY19jYXN0PHNpemVfdD4oe2RlZmF1bHRfbmFtZX0pPiwge2RlZmF1bHRfdmFsdWV9KSB7eyB9fQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSA9IHN0ZDo6ZW5hYmxlX2lmX3Q8X25vdF9zZWxmPF9UcD4+PgogLy8gTk9MSU5UTkVYVExJTkUoZ29vZ2xlLWV4cGxpY2l0LWNvbnN0cnVjdG9yKQpAQCAtMzkwLDEyICs2MDMsMTIgQEAKIAogdGVtcGxhdGUgPFRhZyBfdGFnLCB0eXBlbmFtZS4uLiBfVHA+CiBzdGF0aWMge25hbWV9IG1ha2UoX1RwJiYuLi4gX2FyZ3MpIHt7Ci0gIHJldHVybiB7bmFtZX0oc3RkOjppbl9wbGFjZV9pbmRleDxfdGFnPiwgc3RkOjpmb3J3YXJkPF9UcD4oX2FyZ3MpLi4uKTsKKyAgcmV0dXJuIHtuYW1lfShzdGQ6OmluX3BsYWNlX2luZGV4PHN0YXRpY19jYXN0PHNpemVfdD4oX3RhZyk+LCBzdGQ6OmZvcndhcmQ8X1RwPihfYXJncykuLi4pOwogfX0KIAogdGVtcGxhdGUgPFRhZyBfdGFnLCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lLi4uIF9VcD4KIHN0YXRpYyB7bmFtZX0gbWFrZShzdGQ6OmluaXRpYWxpemVyX2xpc3Q8X1RwPiBfaWwsIF9VcCYmLi4uIF9hcmdzKSB7ewotICByZXR1cm4ge25hbWV9KHN0ZDo6aW5fcGxhY2VfaW5kZXg8X3RhZz4sIHN0ZDo6bW92ZShfaWwpLCBzdGQ6OmZvcndhcmQ8X1VwPihfYXJncykuLi4pOworICByZXR1cm4ge25hbWV9KHN0ZDo6aW5fcGxhY2VfaW5kZXg8c3RhdGljX2Nhc3Q8c2l6ZV90PihfdGFnKT4sIHN0ZDo6bW92ZShfaWwpLCBzdGQ6OmZvcndhcmQ8X1VwPihfYXJncykuLi4pOwogfX0KIAogVGFnIGdldFRhZygpIGNvbnN0IHt7CkBAIC00MDUsMjkgKzYxOCwzMCBAQAogdGVtcGxhdGUgPFRhZyBfdGFnPgogY29uc3QgYXV0byYgZ2V0KCkgY29uc3Qge3sKICAgaWYgKGdldFRhZygpICE9IF90YWcpIHt7IF9fYXNzZXJ0MihfX0ZJTEVfXywgX19MSU5FX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18sICJiYWQgYWNjZXNzOiBhIHdyb25nIHRhZyIpOyB9fQotICByZXR1cm4gc3RkOjpnZXQ8X3RhZz4oX3ZhbHVlKTsKKyAgcmV0dXJuIHN0ZDo6Z2V0PHN0YXRpY19jYXN0PHNpemVfdD4oX3RhZyk+KF92YWx1ZSk7CiB9fQogCiB0ZW1wbGF0ZSA8VGFnIF90YWc+CiBhdXRvJiBnZXQoKSB7ewogICBpZiAoZ2V0VGFnKCkgIT0gX3RhZykge3sgX19hc3NlcnQyKF9fRklMRV9fLCBfX0xJTkVfXywgX19QUkVUVFlfRlVOQ1RJT05fXywgImJhZCBhY2Nlc3M6IGEgd3JvbmcgdGFnIik7IH19Ci0gIHJldHVybiBzdGQ6OmdldDxfdGFnPihfdmFsdWUpOworICByZXR1cm4gc3RkOjpnZXQ8c3RhdGljX2Nhc3Q8c2l6ZV90PihfdGFnKT4oX3ZhbHVlKTsKIH19CiAKIHRlbXBsYXRlIDxUYWcgX3RhZywgdHlwZW5hbWUuLi4gX1RwPgogdm9pZCBzZXQoX1RwJiYuLi4gX2FyZ3MpIHt7Ci0gIF92YWx1ZS5lbXBsYWNlPF90YWc+KHN0ZDo6Zm9yd2FyZDxfVHA+KF9hcmdzKS4uLik7CisgIF92YWx1ZS5lbXBsYWNlPHN0YXRpY19jYXN0PHNpemVfdD4oX3RhZyk+KHN0ZDo6Zm9yd2FyZDxfVHA+KF9hcmdzKS4uLik7CiB9fQogCiApLS0iOwotICBvdXQgPDwgZm10Ojpmb3JtYXQodG1wbCwgZm10OjphcmcoIm5hbWUiLCBuYW1lKSwgZm10OjphcmcoImRlZmF1bHRfbmFtZSIsIGRlZmF1bHRfbmFtZSksCi0gICAgICAgICAgICAgICAgICAgICBmbXQ6OmFyZygiZGVmYXVsdF92YWx1ZSIsIGRlZmF1bHRfdmFsdWUpKTsKKyAgICBvdXQgPDwgZm10Ojpmb3JtYXQodG1wbCwgZm10OjphcmcoIm5hbWUiLCBuYW1lKSwgZm10OjphcmcoImRlZmF1bHRfbmFtZSIsIGRlZmF1bHRfbmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgIGZtdDo6YXJnKCJkZWZhdWx0X3ZhbHVlIiwgZGVmYXVsdF92YWx1ZSkpOworICB9CiB9CiAKIHZvaWQgVW5pb25Xcml0ZXI6OlJlYWRGcm9tUGFyY2VsKENvZGVXcml0ZXImIG91dCwgY29uc3QgUGFyY2VsV3JpdGVyQ29udGV4dCYgY3R4KSBjb25zdCB7Ci0gIEFpZGxUeXBlU3BlY2lmaWVyIHRhZ190eXBlKEFJRExfTE9DQVRJT05fSEVSRSwgImludCIsIC8qIGlzX2FycmF5PSAqLyBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHlwZV9wYXJhbXM9ICovIG51bGxwdHIsIENvbW1lbnRze30pOwotICB0YWdfdHlwZS5SZXNvbHZlKHR5cGVuYW1lcyk7CisgIC8vIEV2ZW4gdGhvdWdoIEBGaXhlZFNpemUgdW5pb24gbWF5IHVzZSBhIHNtYWxsZXIgdHlwZSB0aGFuIGludDMyX3QsIHdlIG5lZWQgdG8gcmVhZC93cml0ZSBpdAorICAvLyBhcyBpZiBpdCBpcyBpbnQzMl90IGZvciBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgYmNrZW5kcy4KKyAgYXV0byB0YWdfdHlwZSA9IHR5cGVuYW1lcy5NYWtlUmVzb2x2ZWRUeXBlKEFJRExfTE9DQVRJT05fSEVSRSwgImludCIsIC8qIGlzX2FycmF5PSAqLyBmYWxzZSk7CiAKICAgY29uc3Qgc3RyaW5nIHRhZyA9ICJfYWlkbF90YWciOwogICBjb25zdCBzdHJpbmcgdmFsdWUgPSAiX2FpZGxfdmFsdWUiOwpAQCAtNDQxLDkgKzY1NSwxMyBAQAogICB9OwogCiAgIG91dCA8PCBmbXQ6OmZvcm1hdCgie30ge307XG4iLCBjdHguc3RhdHVzX3R5cGUsIHN0YXR1cyk7Ci0gIHJlYWRfdmFyKHRhZywgdGFnX3R5cGUpOwotICBvdXQgPDwgZm10Ojpmb3JtYXQoInN3aXRjaCAoe30pIHt7XG4iLCB0YWcpOworICByZWFkX3Zhcih0YWcsICp0YWdfdHlwZSk7CisgIG91dCA8PCBmbXQ6OmZvcm1hdCgic3dpdGNoIChzdGF0aWNfY2FzdDxUYWc+KHt9KSkge3tcbiIsIHRhZyk7CiAgIGZvciAoY29uc3QgYXV0byYgdmFyaWFibGUgOiBkZWNsLkdldEZpZWxkcygpKSB7CisgICAgaWYgKHZhcmlhYmxlLT5Jc0RlcHJlY2F0ZWQoKSkgeworICAgICAgb3V0IDw8ICIjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaFxuIjsKKyAgICAgIG91dCA8PCAiI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgXCItV2RlcHJlY2F0ZWQtZGVjbGFyYXRpb25zXCJcbiI7CisgICAgfQogICAgIG91dCA8PCBmbXQ6OmZvcm1hdCgiY2FzZSB7fToge3tcbiIsIHZhcmlhYmxlLT5HZXROYW1lKCkpOwogICAgIG91dC5JbmRlbnQoKTsKICAgICBjb25zdCBhdXRvJiB0eXBlID0gdmFyaWFibGUtPkdldFR5cGUoKTsKQEAgLTQ2MywzNCArNjgxLDExNSBAQAogICAgIG91dCA8PCAifVxuIjsKICAgICBvdXQgPDwgZm10Ojpmb3JtYXQoInJldHVybiB7fTsgfX1cbiIsIGN0eC5zdGF0dXNfb2spOwogICAgIG91dC5EZWRlbnQoKTsKKyAgICBpZiAodmFyaWFibGUtPklzRGVwcmVjYXRlZCgpKSB7CisgICAgICBvdXQgPDwgIiNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3BcbiI7CisgICAgfQogICB9CiAgIG91dCA8PCAifVxuIjsKICAgb3V0IDw8IGZtdDo6Zm9ybWF0KCJyZXR1cm4ge307XG4iLCBjdHguc3RhdHVzX2JhZCk7CiB9CiAKIHZvaWQgVW5pb25Xcml0ZXI6OldyaXRlVG9QYXJjZWwoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBQYXJjZWxXcml0ZXJDb250ZXh0JiBjdHgpIGNvbnN0IHsKLSAgQWlkbFR5cGVTcGVjaWZpZXIgdGFnX3R5cGUoQUlETF9MT0NBVElPTl9IRVJFLCAiaW50IiwgLyogaXNfYXJyYXk9ICovIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0eXBlX3BhcmFtcz0gKi8gbnVsbHB0ciwgQ29tbWVudHN7fSk7Ci0gIHRhZ190eXBlLlJlc29sdmUodHlwZW5hbWVzKTsKKyAgLy8gRXZlbiB0aG91Z2ggQEZpeGVkU2l6ZSB1bmlvbiBtYXkgdXNlIGEgc21hbGxlciB0eXBlIHRoYW4gaW50MzJfdCwgd2UgbmVlZCB0byByZWFkL3dyaXRlIGl0CisgIC8vIGFzIGlmIGl0IGlzIGludDMyX3QgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBiY2tlbmRzLgorICBhdXRvIHRhZ190eXBlID0gdHlwZW5hbWVzLk1ha2VSZXNvbHZlZFR5cGUoQUlETF9MT0NBVElPTl9IRVJFLCAiaW50IiwgLyogaXNfYXJyYXk9ICovIGZhbHNlKTsKIAogICBjb25zdCBzdHJpbmcgdGFnID0gIl9haWRsX3RhZyI7CiAgIGNvbnN0IHN0cmluZyB2YWx1ZSA9ICJfYWlkbF92YWx1ZSI7CiAgIGNvbnN0IHN0cmluZyBzdGF0dXMgPSAiX2FpZGxfcmV0X3N0YXR1cyI7CiAKICAgb3V0IDw8IGZtdDo6Zm9ybWF0KCJ7fSB7fSA9ICIsIGN0eC5zdGF0dXNfdHlwZSwgc3RhdHVzKTsKLSAgY3R4LndyaXRlX2Z1bmMob3V0LCAiZ2V0VGFnKCkiLCB0YWdfdHlwZSk7CisgIGN0eC53cml0ZV9mdW5jKG91dCwgInN0YXRpY19jYXN0PGludDMyX3Q+KGdldFRhZygpKSIsICp0YWdfdHlwZSk7CiAgIG91dCA8PCAiO1xuIjsKICAgb3V0IDw8IGZtdDo6Zm9ybWF0KCJpZiAoe30gIT0ge30pIHJldHVybiB7fTtcbiIsIHN0YXR1cywgY3R4LnN0YXR1c19vaywgc3RhdHVzKTsKICAgb3V0IDw8ICJzd2l0Y2ggKGdldFRhZygpKSB7XG4iOwogICBmb3IgKGNvbnN0IGF1dG8mIHZhcmlhYmxlIDogZGVjbC5HZXRGaWVsZHMoKSkgeworICAgIGlmICh2YXJpYWJsZS0+SXNEZXByZWNhdGVkKCkpIHsKKyAgICAgIG91dCA8PCAiI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2hcbiI7CisgICAgICBvdXQgPDwgIiNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkIFwiLVdkZXByZWNhdGVkLWRlY2xhcmF0aW9uc1wiXG4iOworICAgIH0KICAgICBvdXQgPDwgZm10Ojpmb3JtYXQoImNhc2Uge306IHJldHVybiAiLCB2YXJpYWJsZS0+R2V0TmFtZSgpKTsKICAgICBjdHgud3JpdGVfZnVuYyhvdXQsICJnZXQ8IiArIHZhcmlhYmxlLT5HZXROYW1lKCkgKyAiPigpIiwgdmFyaWFibGUtPkdldFR5cGUoKSk7CiAgICAgb3V0IDw8ICI7XG4iOworICAgIGlmICh2YXJpYWJsZS0+SXNEZXByZWNhdGVkKCkpIHsKKyAgICAgIG91dCA8PCAiI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcFxuIjsKKyAgICB9CiAgIH0KICAgb3V0IDw8ICJ9XG4iOwogICBvdXQgPDwgIl9fYXNzZXJ0MihfX0ZJTEVfXywgX19MSU5FX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18sIFwiY2FuJ3QgcmVhY2ggaGVyZVwiKTtcbiI7CiB9CiAKK3N0ZDo6c3RyaW5nIENwcENvbnN0YW50VmFsdWVEZWNvcmF0b3IoCisgICAgY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHR5cGUsCisgICAgY29uc3Qgc3RkOjp2YXJpYW50PHN0ZDo6c3RyaW5nLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4+JiByYXdfdmFsdWUsIGJvb2wgaXNfbmRrKSB7CisgIGlmICh0eXBlLklzQXJyYXkoKSkgeworICAgIGF1dG8gdmFsdWVzID0gc3RkOjpnZXQ8c3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+PihyYXdfdmFsdWUpOworICAgIC8vIEhleGFkZWNpbWFsIGxpdGVyYWxzIGZvciBieXRlIGFycmF5cyBzaG91bGQgYmUgY2FzdGVkIHRvIHVpbnQ4X3QKKyAgICBpZiAodHlwZS5HZXROYW1lKCkgPT0gImJ5dGUiICYmCisgICAgICAgIHN0ZDo6YW55X29mKHZhbHVlcy5iZWdpbigpLCB2YWx1ZXMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgIFtdKGNvbnN0IGF1dG8mIHZhbHVlKSB7IHJldHVybiAhdmFsdWUuZW1wdHkoKSAmJiB2YWx1ZVswXSA9PSAnLSc7IH0pKSB7CisgICAgICBmb3IgKGF1dG8mIHZhbHVlIDogdmFsdWVzKSB7CisgICAgICAgIC8vIGNhc3Qgb25seSBpZiBuZWNlc3NhcnkKKyAgICAgICAgaWYgKHZhbHVlWzBdID09ICctJykgeworICAgICAgICAgIHZhbHVlID0gInVpbnQ4X3QoIiArIHZhbHVlICsgIikiOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIHZhbHVlID0gInsiICsgSm9pbih2YWx1ZXMsICIsICIpICsgIn0iOworCisgICAgaWYgKHR5cGUuSXNGaXhlZFNpemVBcnJheSgpKSB7CisgICAgICAvLyBGb3IgYXJyYXlzLCB1c2UgZG91YmxlIGJyYWNlcyBiZWNhdXNlIGFycmF5cyBjYW4gYmUgbmVzdGVkLgorICAgICAgLy8gIGUuZy4pIGFycmF5PGFycmF5PGludCwgMj4sIDM+IGludHMgPSB7eyB7ezEsMn19LCB7ezMsNH19LCB7ezUsNn19IH19OworICAgICAgLy8gVmVjdG9ycyBtaWdodCBuZWVkIGRvdWJsZSBicmFjZXMsIGJ1dCBzaW5jZSB3ZSBkb24ndCBoYXZlIG5lc3RlZCB2ZWN0b3JzICh5ZXQpCisgICAgICAvLyBzaW5nbGUgYnJhY2Ugd291bGQgd29yayBldmVuIGZvciBvcHRpb25hbCB2ZWN0b3JzLgorICAgICAgdmFsdWUgPSAieyIgKyB2YWx1ZSArICJ9IjsKKyAgICB9CisKKyAgICBpZiAoIXR5cGUuSXNNdXRhdGVkKCkgJiYgdHlwZS5Jc051bGxhYmxlKCkpIHsKKyAgICAgIC8vIEZvciBvdXRlcm1vc3Qgc3RkOjpvcHRpb25hbDw+LCB3ZSBuZWVkIGFuIGFkZGl0aW9uYWwgYnJhY2UgcGFpciB0byBpbml0aWFsaXplIGl0cyB2YWx1ZS4KKyAgICAgIHZhbHVlID0gInsiICsgdmFsdWUgKyAifSI7CisgICAgfQorICAgIHJldHVybiB2YWx1ZTsKKyAgfQorCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSA9IHN0ZDo6Z2V0PHN0ZDo6c3RyaW5nPihyYXdfdmFsdWUpOworICBpZiAoQWlkbFR5cGVuYW1lczo6SXNCdWlsdGluVHlwZW5hbWUodHlwZS5HZXROYW1lKCkpKSB7CisgICAgaWYgKHR5cGUuR2V0TmFtZSgpID09ICJib29sZWFuIikgeworICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0gZWxzZSBpZiAodHlwZS5HZXROYW1lKCkgPT0gImJ5dGUiKSB7CisgICAgICByZXR1cm4gdmFsdWU7CisgICAgfSBlbHNlIGlmICh0eXBlLkdldE5hbWUoKSA9PSAiY2hhciIpIHsKKyAgICAgIC8vIFRPRE86IGNvbnNpZGVyICdMJy1wcmVmaXggZm9yIHdpZGUgY2hhciBsaXRlcmFsCisgICAgICByZXR1cm4gdmFsdWU7CisgICAgfSBlbHNlIGlmICh0eXBlLkdldE5hbWUoKSA9PSAiZG91YmxlIikgeworICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0gZWxzZSBpZiAodHlwZS5HZXROYW1lKCkgPT0gImZsb2F0IikgeworICAgICAgcmV0dXJuIHZhbHVlOyAgLy8gdmFsdWUgaGFzICdmJyBzdWZmaXgKKyAgICB9IGVsc2UgaWYgKHR5cGUuR2V0TmFtZSgpID09ICJpbnQiKSB7CisgICAgICByZXR1cm4gdmFsdWU7CisgICAgfSBlbHNlIGlmICh0eXBlLkdldE5hbWUoKSA9PSAibG9uZyIpIHsKKyAgICAgIHJldHVybiB2YWx1ZSArICJMIjsKKyAgICB9IGVsc2UgaWYgKHR5cGUuR2V0TmFtZSgpID09ICJTdHJpbmciKSB7CisgICAgICBpZiAoaXNfbmRrIHx8IHR5cGUuSXNVdGY4SW5DcHAoKSkgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gIjo6YW5kcm9pZDo6U3RyaW5nMTYoIiArIHZhbHVlICsgIikiOworICAgICAgfQorICAgIH0KKyAgICBBSURMX0ZBVEFMKHR5cGUpIDw8ICJVbmtub3duIGJ1aWx0LWluIHR5cGU6ICIgPDwgdHlwZS5HZXROYW1lKCk7CisgIH0KKworICBhdXRvIGRlZmluZWRfdHlwZSA9IHR5cGUuR2V0RGVmaW5lZFR5cGUoKTsKKyAgQUlETF9GQVRBTF9JRighZGVmaW5lZF90eXBlLCB0eXBlKSA8PCAiSW52YWxpZCB0eXBlIGZvciBcIiIgPDwgdmFsdWUgPDwgIlwiIjsKKyAgYXV0byBlbnVtX3R5cGUgPSBkZWZpbmVkX3R5cGUtPkFzRW51bURlY2xhcmF0aW9uKCk7CisgIEFJRExfRkFUQUxfSUYoIWVudW1fdHlwZSwgdHlwZSkgPDwgIkludmFsaWQgdHlwZSBmb3IgXCIiIDw8IHZhbHVlIDw8ICJcIiI7CisKKyAgYXV0byBjcHBfdHlwZV9uYW1lID0gIjo6IiArIEpvaW4oU3BsaXQoZW51bV90eXBlLT5HZXRDYW5vbmljYWxOYW1lKCksICIuIiksICI6OiIpOworICBpZiAoaXNfbmRrKSB7CisgICAgY3BwX3R5cGVfbmFtZSA9ICI6OmFpZGwiICsgY3BwX3R5cGVfbmFtZTsKKyAgfQorICByZXR1cm4gY3BwX3R5cGVfbmFtZSArICI6OiIgKyB2YWx1ZS5zdWJzdHIodmFsdWUuZmluZF9sYXN0X29mKCcuJykgKyAxKTsKK30KIH0gIC8vIG5hbWVzcGFjZSBjcHAKIH0gIC8vIG5hbWVzcGFjZSBhaWRsCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYWlkbF90b19jcHBfY29tbW9uLmggYi9haWRsX3RvX2NwcF9jb21tb24uaAppbmRleCBmOWZlODBiLi5lNjczM2I2IDEwMDY0NAotLS0gYS9haWRsX3RvX2NwcF9jb21tb24uaAorKysgYi9haWRsX3RvX2NwcF9jb21tb24uaApAQCAtMzMsMTYgKzMzLDIzIEBACiAKIC8vIFRoZXNlIHJvdWdobHkgY29ycmVzcG9uZCB0byB0aGUgdmFyaW91cyBjbGFzcyBuYW1lcyBpbiB0aGUgQysrIGhpZXJhcmNoeToKIGVudW0gY2xhc3MgQ2xhc3NOYW1lcyB7Ci0gIEJBU0UsICAgICAgICAgIC8vIEZvbyAobm90IGEgcmVhbCBjbGFzcywgYnV0IHVzZWZ1bCBpbiBzb21lIGNpcmN1bXN0YW5jZXMpLgotICBDTElFTlQsICAgICAgICAvLyBCcEZvbwotICBTRVJWRVIsICAgICAgICAvLyBCbkZvbwotICBJTlRFUkZBQ0UsICAgICAvLyBJRm9vCi0gIERFRkFVTFRfSU1QTCwgIC8vIElGb29EZWZhdWx0Ci0gIFJBVywgICAgICAgICAgIC8vIChhcyBzaG93biBpbiB0aGUgZmlsZSkKKyAgQkFTRSwgICAgICAgICAgICAvLyBGb28gKG5vdCBhIHJlYWwgY2xhc3MsIGJ1dCB1c2VmdWwgaW4gc29tZSBjaXJjdW1zdGFuY2VzKS4KKyAgQ0xJRU5ULCAgICAgICAgICAvLyBCcEZvbworICBTRVJWRVIsICAgICAgICAgIC8vIEJuRm9vCisgIElOVEVSRkFDRSwgICAgICAgLy8gSUZvbworICBERUZBVUxUX0lNUEwsICAgIC8vIElGb29EZWZhdWx0CisgIFJBVywgICAgICAgICAgICAgLy8gKGFzIHNob3duIGluIHRoZSBmaWxlKQorICBERUxFR0FUT1JfSU1QTCwgIC8vIElGb29EZWxlZ2F0b3IKIH07CiAKIHN0cmluZyBDbGFzc05hbWUoY29uc3QgQWlkbERlZmluZWRUeXBlJiBkZWZpbmVkX3R5cGUsIENsYXNzTmFtZXMgdHlwZSk7CiAKKy8vIFJldHVybiB0aGUgYWxpZ25tZW50IG9mIGtub3duIHR5cGVzIGFuZCBlbnVtIGJhY2tpbmcgdHlwZXMuCisvLyBJZiB0aGUgYWxpZ25tZW50IGlzIHVua25vd24sIG9yIGl0IGlzIGEgRml6ZWRTaXplIHBhcmNlbGFibGUgd2l0aCBpdHMKKy8vIG93biBndWFyYW50ZWVkIGFsaWdubWVudChzbyBpdCBkb2VzIG5vdCBuZWVkIHRvIGJlIHNwZWNpZmllZCksIDAgd2lsbCBiZQorLy8gcmV0dXJuZWQuCitzaXplX3QgQWxpZ25tZW50T2YoY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHR5cGUsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcyk7CisKIC8vIEdlbmVyYXRlIHRoZSByZWxhdGl2ZSBwYXRoIHRvIGEgaGVhZGVyIGZpbGUuICBJZiB8dXNlX29zX3NlcHwgd2UnbGwgdXNlIHRoZQogLy8gb3BlcmF0aW5nIHN5c3RlbSBzcGVjaWZpYyBwYXRoIHNlcGFyYXRvciByYXRoZXIgdGhhbiBDKysncyBleHBlY3RlZCAnLycgd2hlbgogLy8gaW5jbHVkaW5nIGhlYWRlcnMuCkBAIC03Myw2ICs4MCwxMyBAQAogICByZXR1cm4gYXBwZW5kZWQ7CiB9CiAKKy8vIFJldHVybnMgUGFyZW50MTo6UGFyZW50Mjo6U2VsZi4gTmFtZXNwYWNlcyBhcmUgbm90IGluY2x1ZGVkLgorc3RkOjpzdHJpbmcgR2V0UXVhbGlmaWVkTmFtZShjb25zdCBBaWRsRGVmaW5lZFR5cGUmIHR5cGUsIENsYXNzTmFtZXMgbmFtZSA9IENsYXNzTmFtZXM6OlJBVyk7CisKK3ZvaWQgR2VuZXJhdGVFbnVtQ2xhc3NEZWNsKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbEVudW1EZWNsYXJhdGlvbiYgZW51bV9kZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGJhY2tpbmdfdHlwZSwgOjpDb25zdGFudFZhbHVlRGVjb3JhdG9yIGRlY29yYXRvcik7CitzdGQ6OnN0cmluZyBHZW5lcmF0ZUVudW1Ub1N0cmluZyhjb25zdCBBaWRsRW51bURlY2xhcmF0aW9uJiBlbnVtX2RlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYmFja2luZ190eXBlKTsKIHN0ZDo6c3RyaW5nIEdlbmVyYXRlRW51bVZhbHVlcyhjb25zdCBBaWRsRW51bURlY2xhcmF0aW9uJiBlbnVtX2RlY2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBlbmNsb3NpbmdfbmFtZXNwYWNlc19vZl9lbnVtX2RlY2wpOwogc3RkOjpzdHJpbmcgVGVtcGxhdGVEZWNsKGNvbnN0IEFpZGxQYXJjZWxhYmxlJiBkZWZpbmVkX3R5cGUpOwpAQCAtMTA2LDcgKzEyMCw4IEBACiAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lczsKICAgY29uc3Qgc3RkOjpmdW5jdGlvbjxzdGQ6OnN0cmluZyhjb25zdCBBaWRsVHlwZVNwZWNpZmllciYsIGNvbnN0IEFpZGxUeXBlbmFtZXMmKT4gbmFtZV9vZjsKICAgY29uc3QgOjpDb25zdGFudFZhbHVlRGVjb3JhdG9yJiBkZWNvcmF0b3I7Ci0gIHN0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gaGVhZGVyczsKKworICBzdGF0aWMgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IEdldEhlYWRlcnMoY29uc3QgQWlkbFVuaW9uRGVjbCYpOwogCiAgIHZvaWQgUHJpdmF0ZUZpZWxkcyhDb2RlV3JpdGVyJiBvdXQpIGNvbnN0OwogICB2b2lkIFB1YmxpY0ZpZWxkcyhDb2RlV3JpdGVyJiBvdXQpIGNvbnN0OwpAQCAtMTE0LDYgKzEyOSw5IEBACiAgIHZvaWQgV3JpdGVUb1BhcmNlbChDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IFBhcmNlbFdyaXRlckNvbnRleHQmKSBjb25zdDsKIH07CiAKK3N0ZDo6c3RyaW5nIENwcENvbnN0YW50VmFsdWVEZWNvcmF0b3IoCisgICAgY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHR5cGUsCisgICAgY29uc3Qgc3RkOjp2YXJpYW50PHN0ZDo6c3RyaW5nLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4+JiByYXdfdmFsdWUsIGJvb2wgaXNfbmRrKTsKIH0gIC8vIG5hbWVzcGFjZSBjcHAKIH0gIC8vIG5hbWVzcGFjZSBhaWRsCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYWlkbF90b19qYXZhLmNwcCBiL2FpZGxfdG9famF2YS5jcHAKaW5kZXggMDQ4ODhmZC4uYmM3MDVkZiAxMDA2NDQKLS0tIGEvYWlkbF90b19qYXZhLmNwcAorKysgYi9haWRsX3RvX2phdmEuY3BwCkBAIC0zOCwyMyArMzgsMjcgQEAKIHVzaW5nIHN0ZDo6c3RyaW5nOwogdXNpbmcgc3RkOjp2ZWN0b3I7CiAKLXN0ZDo6c3RyaW5nIENvbnN0YW50VmFsdWVEZWNvcmF0b3IoY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiByYXdfdmFsdWUpIHsKK3N0ZDo6c3RyaW5nIENvbnN0YW50VmFsdWVEZWNvcmF0b3IoCisgICAgY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHR5cGUsCisgICAgY29uc3Qgc3RkOjp2YXJpYW50PHN0ZDo6c3RyaW5nLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4+JiByYXdfdmFsdWUpIHsKICAgaWYgKHR5cGUuSXNBcnJheSgpKSB7Ci0gICAgcmV0dXJuIHJhd192YWx1ZTsKKyAgICBjb25zdCBhdXRvJiB2YWx1ZXMgPSBzdGQ6OmdldDxzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4+KHJhd192YWx1ZSk7CisgICAgcmV0dXJuICJ7IiArIEpvaW4odmFsdWVzLCAiLCAiKSArICJ9IjsKICAgfQorICBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUgPSBzdGQ6OmdldDxzdGQ6OnN0cmluZz4ocmF3X3ZhbHVlKTsKICAgaWYgKHR5cGUuR2V0TmFtZSgpID09ICJsb25nIikgewotICAgIHJldHVybiByYXdfdmFsdWUgKyAiTCI7CisgICAgcmV0dXJuIHZhbHVlICsgIkwiOwogICB9CiAgIGlmIChhdXRvIGRlZmluZWRfdHlwZSA9IHR5cGUuR2V0RGVmaW5lZFR5cGUoKTsgZGVmaW5lZF90eXBlKSB7CiAgICAgYXV0byBlbnVtX3R5cGUgPSBkZWZpbmVkX3R5cGUtPkFzRW51bURlY2xhcmF0aW9uKCk7Ci0gICAgQUlETF9GQVRBTF9JRighZW51bV90eXBlLCB0eXBlKSA8PCAiSW52YWxpZCB0eXBlIGZvciBcIiIgPDwgcmF3X3ZhbHVlIDw8ICJcIiI7Ci0gICAgcmV0dXJuIHR5cGUuR2V0TmFtZSgpICsgIi4iICsgcmF3X3ZhbHVlLnN1YnN0cihyYXdfdmFsdWUuZmluZF9sYXN0X29mKCcuJykgKyAxKTsKKyAgICBBSURMX0ZBVEFMX0lGKCFlbnVtX3R5cGUsIHR5cGUpIDw8ICJJbnZhbGlkIHR5cGUgZm9yIFwiIiA8PCB2YWx1ZSA8PCAiXCIiOworICAgIHJldHVybiB0eXBlLkdldE5hbWUoKSArICIuIiArIHZhbHVlLnN1YnN0cih2YWx1ZS5maW5kX2xhc3Rfb2YoJy4nKSArIDEpOwogICB9Ci0gIHJldHVybiByYXdfdmFsdWU7CisgIHJldHVybiB2YWx1ZTsKIH07CiAKLWNvbnN0IHN0cmluZyYgSmF2YU5hbWVPZihjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgYWlkbCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5zdGFudGlhYmxlID0gZmFsc2UsIGJvb2wgYm94aW5nID0gZmFsc2UpIHsKK2NvbnN0IHN0cmluZyYgSmF2YU5hbWVPZihjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgYWlkbCwgYm9vbCBpbnN0YW50aWFibGUgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJveGluZyA9IGZhbHNlKSB7CiAgIEFJRExfRkFUQUxfSUYoIWFpZGwuSXNSZXNvbHZlZCgpLCBhaWRsKSA8PCBhaWRsLlRvU3RyaW5nKCk7CiAKICAgaWYgKGluc3RhbnRpYWJsZSkgewpAQCAtMTAyLDggKzEwNiw5IEBACiAKICAgLy8gRW51bXMgaW4gSmF2YSBhcmUgcmVwcmVzZW50ZWQgYnkgdGhlaXIgYmFja2luZyB0eXBlIHdoZW4KICAgLy8gcmVmZXJlbmNlZCBpbiBwYXJjZWxhYmxlcywgbWV0aG9kcywgZXRjLgotICBpZiAoY29uc3QgQWlkbEVudW1EZWNsYXJhdGlvbiogZW51bV9kZWNsID0gdHlwZW5hbWVzLkdldEVudW1EZWNsYXJhdGlvbihhaWRsKTsKLSAgICAgIGVudW1fZGVjbCAhPSBudWxscHRyKSB7CisgIGNvbnN0IGF1dG8gZGVmaW5lZF90eXBlID0gYWlkbC5HZXREZWZpbmVkVHlwZSgpOworICBpZiAoZGVmaW5lZF90eXBlICYmIGRlZmluZWRfdHlwZS0+QXNFbnVtRGVjbGFyYXRpb24oKSkgeworICAgIGNvbnN0IGF1dG8gZW51bV9kZWNsID0gZGVmaW5lZF90eXBlLT5Bc0VudW1EZWNsYXJhdGlvbigpOwogICAgIGNvbnN0IHN0cmluZyYgYmFja2luZ190eXBlX25hbWUgPSBlbnVtX2RlY2wtPkdldEJhY2tpbmdUeXBlKCkuR2V0TmFtZSgpOwogICAgIEFJRExfRkFUQUxfSUYobS5maW5kKGJhY2tpbmdfdHlwZV9uYW1lKSA9PSBtLmVuZCgpLCBlbnVtX2RlY2wpOwogICAgIEFJRExfRkFUQUxfSUYoIUFpZGxUeXBlbmFtZXM6OklzQnVpbHRpblR5cGVuYW1lKGJhY2tpbmdfdHlwZV9uYW1lKSwgZW51bV9kZWNsKTsKQEAgLTEzMCw1OSArMTM1LDc5IEBACiB9CiAKIG5hbWVzcGFjZSB7Ci1zdHJpbmcgSmF2YVNpZ25hdHVyZU9mSW50ZXJuYWwoCi0gICAgY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIGFpZGwsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywgYm9vbCBpbnN0YW50aWFibGUsCi0gICAgYm9vbCBvbWl0X2FycmF5LCBib29sIGJveGluZyA9IGZhbHNlIC8qIGJveGluZyBjYW4gYmUgdHJ1ZSBvbmx5IGlmIGl0IGlzIGEgdHlwZSBwYXJhbWV0ZXIgKi8pIHsKLSAgc3RyaW5nIHJldCA9IEphdmFOYW1lT2YoYWlkbCwgdHlwZW5hbWVzLCBpbnN0YW50aWFibGUsIGJveGluZyAmJiAhYWlkbC5Jc0FycmF5KCkpOworc3RyaW5nIEphdmFTaWduYXR1cmVPZkludGVybmFsKGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiBhaWRsLCBib29sIGluc3RhbnRpYWJsZSwgYm9vbCBvbWl0X2FycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYm94aW5nKSB7CisgIHN0cmluZyByZXQgPSBKYXZhTmFtZU9mKGFpZGwsIGluc3RhbnRpYWJsZSwgYm94aW5nICYmICFhaWRsLklzQXJyYXkoKSk7CiAgIGlmIChhaWRsLklzR2VuZXJpYygpKSB7CiAgICAgdmVjdG9yPHN0cmluZz4gYXJnX25hbWVzOwogICAgIGZvciAoY29uc3QgYXV0byYgdGEgOiBhaWRsLkdldFR5cGVQYXJhbWV0ZXJzKCkpIHsKLSAgICAgIGFyZ19uYW1lcy5lbXBsYWNlX2JhY2soCi0gICAgICAgICAgSmF2YVNpZ25hdHVyZU9mSW50ZXJuYWwoKnRhLCB0eXBlbmFtZXMsIGZhbHNlLCBmYWxzZSwgdHJ1ZSAvKiBib3hpbmcgKi8pKTsKKyAgICAgIGFyZ19uYW1lcy5lbXBsYWNlX2JhY2soSmF2YVNpZ25hdHVyZU9mSW50ZXJuYWwoKnRhLCAvKmluc3RhbnRpYWJsZT0qL2ZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm9taXRfYXJyYXk9Ki9mYWxzZSwgLypib3hpbmc9Ki90cnVlKSk7CiAgICAgfQogICAgIHJldCArPSAiPCIgKyBKb2luKGFyZ19uYW1lcywgIiwiKSArICI+IjsKICAgfQogICBpZiAoYWlkbC5Jc0FycmF5KCkgJiYgIW9taXRfYXJyYXkpIHsKLSAgICByZXQgKz0gIltdIjsKKyAgICBpZiAoYWlkbC5Jc0ZpeGVkU2l6ZUFycmF5KCkpIHsKKyAgICAgIHJldCArPSBKb2luKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPihhaWRsLkdldEZpeGVkU2l6ZUFycmF5RGltZW5zaW9ucygpLnNpemUoKSwgIltdIiksICIiKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0ICs9ICJbXSI7CisgICAgfQogICB9CiAgIHJldHVybiByZXQ7CiB9CiAKLS8vIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGJhY2tpbmcgdHlwZSBmb3IgdGhlIHNwZWNpZmllZCB0eXBlLiBOb3RlOiB0aGlzCi0vLyByZXR1cm5zIHR5cGUgbmFtZXMgYXMgdXNlZCBpbiBBSURMLCBub3QgYSBKYXZhIHNpZ25hdHVyZS4KKy8vIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGJhY2tpbmcgdHlwZSBmb3IgdGhlIHNwZWNpZmllZCB0eXBlLgorLy8gTm90ZTogRG8gbm90IHVzZSB0aGUgcmVzdWx0IGluIHRoZSBnZW5lcmF0ZWQgY29kZSEgSXQncyBzdXBwb3NlZCB0byBiZSB1c2VkIGFzIGEga2V5LgorLy8gVGhpcyByZXR1cm5zIHR5cGUgbmFtZXMgYXMgdXNlZCBpbiBBSURMLCBub3QgYSBKYXZhIHNpZ25hdHVyZS4KIC8vIEZvciBlbnVtcywgdGhpcyBpcyB0aGUgZW51bSdzIGJhY2tpbmcgdHlwZS4KIC8vIEZvciBhbGwgb3RoZXIgdHlwZXMsIHRoaXMgaXMgdGhlIHR5cGUgaXRzZWxmLgotc3RyaW5nIEFpZGxCYWNraW5nVHlwZU5hbWUoY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHR5cGUsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcykgeworc3RyaW5nIEFpZGxCYWNraW5nVHlwZU5hbWUoY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHR5cGUpIHsKICAgc3RyaW5nIHR5cGVfbmFtZTsKLSAgaWYgKGNvbnN0IEFpZGxFbnVtRGVjbGFyYXRpb24qIGVudW1fZGVjbCA9IHR5cGVuYW1lcy5HZXRFbnVtRGVjbGFyYXRpb24odHlwZSk7Ci0gICAgICBlbnVtX2RlY2wgIT0gbnVsbHB0cikgeworICBjb25zdCBhdXRvIGRlZmluZWRfdHlwZSA9IHR5cGUuR2V0RGVmaW5lZFR5cGUoKTsKKyAgaWYgKGRlZmluZWRfdHlwZSAmJiBkZWZpbmVkX3R5cGUtPkFzRW51bURlY2xhcmF0aW9uKCkpIHsKKyAgICBjb25zdCBBaWRsRW51bURlY2xhcmF0aW9uKiBlbnVtX2RlY2wgPSBkZWZpbmVkX3R5cGUtPkFzRW51bURlY2xhcmF0aW9uKCk7CiAgICAgdHlwZV9uYW1lID0gZW51bV9kZWNsLT5HZXRCYWNraW5nVHlwZSgpLkdldE5hbWUoKTsKICAgfSBlbHNlIHsKICAgICB0eXBlX25hbWUgPSB0eXBlLkdldE5hbWUoKTsKICAgfQogICBpZiAodHlwZS5Jc0FycmF5KCkpIHsKLSAgICB0eXBlX25hbWUgKz0gIltdIjsKKyAgICBpZiAodHlwZS5Jc0ZpeGVkU2l6ZUFycmF5KCkpIHsKKyAgICAgIGZvciAoY29uc3QgYXV0byYgZGltIDogdHlwZS5HZXRGaXhlZFNpemVBcnJheURpbWVuc2lvbnMoKSkgeworICAgICAgICB0eXBlX25hbWUgKz0gIlsiICsgc3RkOjp0b19zdHJpbmcoZGltKSArICJdIjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgdHlwZV9uYW1lICs9ICJbXSI7CisgICAgfQogICB9CiAgIHJldHVybiB0eXBlX25hbWU7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZQogCi1zdHJpbmcgSmF2YVNpZ25hdHVyZU9mKGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiBhaWRsLCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMpIHsKLSAgcmV0dXJuIEphdmFTaWduYXR1cmVPZkludGVybmFsKGFpZGwsIHR5cGVuYW1lcywgZmFsc2UsIGZhbHNlKTsKK3N0cmluZyBKYXZhU2lnbmF0dXJlT2YoY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIGFpZGwpIHsKKyAgcmV0dXJuIEphdmFTaWduYXR1cmVPZkludGVybmFsKGFpZGwsIC8qaW5zdGFudGlhYmxlPSovZmFsc2UsIC8qb21pdF9hcnJheT0qL2ZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypib3hpbmc9Ki9mYWxzZSk7CiB9CiAKLXN0cmluZyBJbnN0YW50aWFibGVKYXZhU2lnbmF0dXJlT2YoY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIGFpZGwsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcykgewotICByZXR1cm4gSmF2YVNpZ25hdHVyZU9mSW50ZXJuYWwoYWlkbCwgdHlwZW5hbWVzLCB0cnVlLCB0cnVlKTsKKy8vIFVzZWQgZm9yICJuZXciIGV4cHJlc3Npb24uIElnbm9yZSBhcnJheXMgYmVjYXVzZSAibmV3IiBleHByZXNzaW9uIGhhbmRsZXMgaXQuCitzdHJpbmcgSW5zdGFudGlhYmxlSmF2YVNpZ25hdHVyZU9mKGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiBhaWRsKSB7CisgIHJldHVybiBKYXZhU2lnbmF0dXJlT2ZJbnRlcm5hbChhaWRsLCAvKmluc3RhbnRpYWJsZT0qL3RydWUsIC8qb21pdF9hcnJheT0qL3RydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmJveGluZz0qL2ZhbHNlKTsKIH0KIAotc3RyaW5nIERlZmF1bHRKYXZhVmFsdWVPZihjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgYWlkbCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzKSB7CitzdHJpbmcgSmF2YUJveGluZ1R5cGVPZihjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgYWlkbCkgeworICBBSURMX0ZBVEFMX0lGKCFBaWRsVHlwZW5hbWVzOjpJc1ByaW1pdGl2ZVR5cGVuYW1lKGFpZGwuR2V0TmFtZSgpKSwgYWlkbCk7CisgIHJldHVybiBKYXZhU2lnbmF0dXJlT2ZJbnRlcm5hbChhaWRsLCAvKmluc3RhbnRpYWJsZT0qL2ZhbHNlLCAvKm9taXRfYXJyYXk9Ki9mYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qYm94aW5nPSovdHJ1ZSk7Cit9CisKK3N0cmluZyBEZWZhdWx0SmF2YVZhbHVlT2YoY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIGFpZGwpIHsKICAgc3RhdGljIG1hcDxzdHJpbmcsIHN0cmluZz4gbSA9IHsKICAgICAgIHsiYm9vbGVhbiIsICJmYWxzZSJ9LCB7ImJ5dGUiLCAiMCJ9LCAgICAgeyJjaGFyIiwgUiIoJ1x1MDAwMCcpIn0sIHsiaW50IiwgIjAifSwKICAgICAgIHsibG9uZyIsICIwTCJ9LCAgICAgICB7ImZsb2F0IiwgIjAuMGYifSwgeyJkb3VibGUiLCAiMC4wZCJ9LAogICB9OwogCi0gIGNvbnN0IHN0cmluZyBuYW1lID0gQWlkbEJhY2tpbmdUeXBlTmFtZShhaWRsLCB0eXBlbmFtZXMpOworICBjb25zdCBzdHJpbmcgbmFtZSA9IEFpZGxCYWNraW5nVHlwZU5hbWUoYWlkbCk7CiAgIEFJRExfRkFUQUxfSUYobmFtZSA9PSAidm9pZCIsIGFpZGwpOwogCiAgIGlmICghYWlkbC5Jc0FycmF5KCkgJiYgbS5maW5kKG5hbWUpICE9IG0uZW5kKCkpIHsKQEAgLTE5MywxOSArMjE4LDk0IEBACiAgIH0KIH0KIAotc3RhdGljIHN0cmluZyBHZXRGbGFnRm9yKGNvbnN0IENvZGVHZW5lcmF0b3JDb250ZXh0JiBjKSB7Ci0gIGlmIChjLmlzX3JldHVybl92YWx1ZSkgewotICAgIHJldHVybiAiYW5kcm9pZC5vcy5QYXJjZWxhYmxlLlBBUkNFTEFCTEVfV1JJVEVfUkVUVVJOX1ZBTFVFIjsKK3R5cGVkZWYgdm9pZCAoKlBhcmNlbEhlbHBlckdlbmVyYXRvcikoQ29kZVdyaXRlciYsIGNvbnN0IE9wdGlvbnMmKTsKKworc3RhdGljIHZvaWQgR2VuZXJhdGVUeXBlZE9iamVjdEhlbHBlcihDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IE9wdGlvbnMmKSB7CisgIC8vIE5vdGUgdGhhdCB0aGUgbmFtZSBpcyBpbmNvbnNpc3RlbnQgaGVyZSBiZWNhdXNlIFBhcmNlbC5qYXZhIGRlZmluZXMgcmVhZFR5cGVkT2JqZWN0IGFzIGlmIGl0CisgIC8vICJjcmVhdGVzIiBhIG5ldyB2YWx1ZSBmcm9tIGEgcGFyY2VsLiAiaW4tcGxhY2UiIHJlYWQgZnVuY3Rpb24gaXMgbm90IG5lY2Vzc2FyeSBiZWNhdXNlCisgIC8vIHVzZXItZGVmaW5lZCBwYXJjZWxhYmxlIGRlZmluZXMgaXRzIHJlYWRGcm9tUGFyY2VsLgorICBvdXQgPDwgUiIoc3RhdGljIHByaXZhdGUgPFQ+IFQgcmVhZFR5cGVkT2JqZWN0KAorICAgIGFuZHJvaWQub3MuUGFyY2VsIHBhcmNlbCwKKyAgICBhbmRyb2lkLm9zLlBhcmNlbGFibGUuQ3JlYXRvcjxUPiBjKSB7CisgIGlmIChwYXJjZWwucmVhZEludCgpICE9IDApIHsKKyAgICAgIHJldHVybiBjLmNyZWF0ZUZyb21QYXJjZWwocGFyY2VsKTsKICAgfSBlbHNlIHsKLSAgICByZXR1cm4gIjAiOworICAgICAgcmV0dXJuIG51bGw7CisgIH0KK30KK3N0YXRpYyBwcml2YXRlIDxUIGV4dGVuZHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlPiB2b2lkIHdyaXRlVHlwZWRPYmplY3QoCisgICAgYW5kcm9pZC5vcy5QYXJjZWwgcGFyY2VsLCBUIHZhbHVlLCBpbnQgcGFyY2VsYWJsZUZsYWdzKSB7CisgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgcGFyY2VsLndyaXRlSW50KDEpOworICAgIHZhbHVlLndyaXRlVG9QYXJjZWwocGFyY2VsLCBwYXJjZWxhYmxlRmxhZ3MpOworICB9IGVsc2UgeworICAgIHBhcmNlbC53cml0ZUludCgwKTsKKyAgfQorfQorKSI7Cit9CisKK3ZvaWQgR2VuZXJhdGVQYXJjZWxIZWxwZXJzKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbERlZmluZWRUeXBlJiBkZWZpbmVkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIC8vIHJvb3QtbGV2ZWwgdHlwZSBjb250YWlucyBhbGwgbmVjZXNzYXJ5IGhlbHBlcnMKKyAgaWYgKGRlZmluZWRfdHlwZS5HZXRQYXJlbnRUeXBlKCkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgLy8gdmlzaXRzIG1ldGhvZCBwYXJhbWV0ZXJzIGFuZCBwYXJjZWxhYmxlIGZpZWxkcyB0byBjb2xsZWN0IHR5cGVzIHdoaWNoCisgIC8vIHJlcXVpcmVzIHJlYWQvd3JpdGUvY3JlYXRlIGhlbHBlcnMuCisgIHN0cnVjdCBWaXNpdG9yIDogQWlkbFZpc2l0b3IgeworICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnM7CisgICAgc2V0PFBhcmNlbEhlbHBlckdlbmVyYXRvcj4gaGVscGVyczsKKyAgICBWaXNpdG9yKGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIDogb3B0aW9ucyhvcHRpb25zKSB7fQorICAgIHZvaWQgVmlzaXQoY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHR5cGUpIG92ZXJyaWRlIHsKKyAgICAgIGF1dG8gbmFtZSA9IHR5cGUuR2V0TmFtZSgpOworICAgICAgaWYgKGF1dG8gZGVmaW5lZF90eXBlID0gdHlwZS5HZXREZWZpbmVkVHlwZSgpOyBkZWZpbmVkX3R5cGUpIHsKKyAgICAgICAgaWYgKGRlZmluZWRfdHlwZS0+QXNQYXJjZWxhYmxlKCkgIT0gbnVsbHB0ciAmJiAhdHlwZS5Jc0FycmF5KCkpIHsKKyAgICAgICAgICAvLyBUeXBlZE9iamVjdHMgYXJlIHN1cHBvcnRlZCBzaW5jZSAyMy4gU28gd2UgZG9uJ3QgbmVlZCBoZWxwZXJzLgorICAgICAgICAgIGlmIChvcHRpb25zLkdldE1pblNka1ZlcnNpb24oKSA8IDIzdSkgeworICAgICAgICAgICAgaGVscGVycy5pbnNlcnQoJkdlbmVyYXRlVHlwZWRPYmplY3RIZWxwZXIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVGhlcmUncyBwYXJjZWxhYmxlLWxpa2UgYnVpbHQtaW4gdHlwZXMgYXMgd2VsbC4KKyAgICAgICAgaWYgKG5hbWUgPT0gIlBhcmNlbEZpbGVEZXNjcmlwdG9yIiB8fCBuYW1lID09ICJDaGFyU2VxdWVuY2UiKSB7CisgICAgICAgICAgaWYgKCF0eXBlLklzQXJyYXkoKSkgeworICAgICAgICAgICAgLy8gVHlwZWRPYmplY3RzIGFyZSBzdXBwb3J0ZWQgc2luY2UgMjMuIFNvIHdlIGRvbid0IG5lZWQgaGVscGVycy4KKyAgICAgICAgICAgIGlmIChvcHRpb25zLkdldE1pblNka1ZlcnNpb24oKSA8IDIzdSkgeworICAgICAgICAgICAgICBoZWxwZXJzLmluc2VydCgmR2VuZXJhdGVUeXBlZE9iamVjdEhlbHBlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9IHZ7b3B0aW9uc307CisKKyAgVmlzaXRUb3BEb3duKHYsIGRlZmluZWRfdHlwZSk7CisgIGlmICghdi5oZWxwZXJzLmVtcHR5KCkpIHsKKyAgICAvLyBOZXN0ZWQgY2xhc3MgKF9QYXJjZWwpIGlzIHVzZWQgdG8gY29udGFpbiBzdGF0aWMgaGVscGVyIG1ldGhvZHMgYmVjYXVzZSBzb21lIHRhcmdldHMgYXJlCisgICAgLy8gc3RpbGwgdXNpbmcgSmF2YSA3IHdoaWNoIGRvZXNuJ3QgYWxsb3cgaW50ZXJmYWNlcyB0byBoYXZlIHN0YXRpYyBtZXRob2RzLgorICAgIC8vIEhlbHBlcnMgc2hvdWxkbid0IGJvdGhlciBBUEkgY2hlY2tzLCBidXQgaW4gY2FzZSB3aGVyZSBBSURMIHR5cGVzIGFyZSBub3QgbWFya2VkIGBAaGlkZWAKKyAgICAvLyBleHBsaWNpdGx5IG1hcmtzIHRoZSBoZWxwZXIgY2xhc3MgYXMgQGhpZGUuCisgICAgb3V0IDw8ICIvKiogQGhpZGUgKi9cbiI7CisgICAgb3V0IDw8ICJzdGF0aWMgY2xhc3MgX1BhcmNlbCB7XG4iOworICAgIG91dC5JbmRlbnQoKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGhlbHBlciA6IHYuaGVscGVycykgeworICAgICAgaGVscGVyKG91dCwgb3B0aW9ucyk7CisgICAgfQorICAgIG91dC5EZWRlbnQoKTsKKyAgICBvdXQgPDwgIn1cbiI7CiAgIH0KIH0KIAotYm9vbCBXcml0ZVRvUGFyY2VsRm9yKGNvbnN0IENvZGVHZW5lcmF0b3JDb250ZXh0JiBjKSB7Cit2b2lkIFdyaXRlVG9QYXJjZWxGb3IoY29uc3QgQ29kZUdlbmVyYXRvckNvbnRleHQmIGMpIHsKICAgc3RhdGljIG1hcDxzdHJpbmcsIGZ1bmN0aW9uPHZvaWQoY29uc3QgQ29kZUdlbmVyYXRvckNvbnRleHQmKT4+IG1ldGhvZF9tYXB7CiAgICAgICB7ImJvb2xlYW4iLAogICAgICAgIFtdKGNvbnN0IENvZGVHZW5lcmF0b3JDb250ZXh0JiBjKSB7Ci0gICAgICAgICBjLndyaXRlciA8PCBjLnBhcmNlbCA8PCAiLndyaXRlSW50KCgoIiA8PCBjLnZhciA8PCAiKT8oMSk6KDApKSk7XG4iOworICAgICAgICAgaWYgKGMubWluX3Nka192ZXJzaW9uID49IDI5dSkgeworICAgICAgICAgICBjLndyaXRlciA8PCBjLnBhcmNlbCA8PCAiLndyaXRlQm9vbGVhbigiIDw8IGMudmFyIDw8ICIpO1xuIjsKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgIGMud3JpdGVyIDw8IGMucGFyY2VsIDw8ICIud3JpdGVJbnQoKCgiIDw8IGMudmFyIDw8ICIpPygxKTooMCkpKTtcbiI7CisgICAgICAgICB9CiAgICAgICAgfX0sCiAgICAgICB7ImJvb2xlYW5bXSIsCiAgICAgICAgW10oY29uc3QgQ29kZUdlbmVyYXRvckNvbnRleHQmIGMpIHsKQEAgLTI3MCwxNSArMzcwLDE5IEBACiAgICAgICB7Ikxpc3QiLAogICAgICAgIFtdKGNvbnN0IENvZGVHZW5lcmF0b3JDb250ZXh0JiBjKSB7CiAgICAgICAgICBpZiAoYy50eXBlLklzR2VuZXJpYygpKSB7Ci0gICAgICAgICAgIGNvbnN0IHN0cmluZyYgY29udGFpbmVkX3R5cGUgPSBjLnR5cGUuR2V0VHlwZVBhcmFtZXRlcnMoKS5hdCgwKS0+R2V0TmFtZSgpOwotICAgICAgICAgICBpZiAoY29udGFpbmVkX3R5cGUgPT0gIlN0cmluZyIpIHsKKyAgICAgICAgICAgQUlETF9GQVRBTF9JRihjLnR5cGUuR2V0VHlwZVBhcmFtZXRlcnMoKS5zaXplKCkgIT0gMSwgYy50eXBlKTsKKyAgICAgICAgICAgY29uc3QgYXV0byYgZWxlbWVudF90eXBlID0gKmMudHlwZS5HZXRUeXBlUGFyYW1ldGVycygpLmF0KDApOworICAgICAgICAgICBjb25zdCBhdXRvJiBlbGVtZW50X3R5cGVfbmFtZSA9IGVsZW1lbnRfdHlwZS5HZXROYW1lKCk7CisgICAgICAgICAgIGlmIChlbGVtZW50X3R5cGVfbmFtZSA9PSAiU3RyaW5nIikgewogICAgICAgICAgICAgIGMud3JpdGVyIDw8IGMucGFyY2VsIDw8ICIud3JpdGVTdHJpbmdMaXN0KCIgPDwgYy52YXIgPDwgIik7XG4iOwotICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRhaW5lZF90eXBlID09ICJJQmluZGVyIikgeworICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnRfdHlwZV9uYW1lID09ICJJQmluZGVyIikgewogICAgICAgICAgICAgIGMud3JpdGVyIDw8IGMucGFyY2VsIDw8ICIud3JpdGVCaW5kZXJMaXN0KCIgPDwgYy52YXIgPDwgIik7XG4iOwotICAgICAgICAgICB9IGVsc2UgaWYgKGMudHlwZW5hbWVzLklzUGFyY2VsYWJsZShjb250YWluZWRfdHlwZSkpIHsKKyAgICAgICAgICAgfSBlbHNlIGlmIChjLnR5cGVuYW1lcy5Jc1BhcmNlbGFibGUoZWxlbWVudF90eXBlX25hbWUpKSB7CiAgICAgICAgICAgICAgYy53cml0ZXIgPDwgYy5wYXJjZWwgPDwgIi53cml0ZVR5cGVkTGlzdCgiIDw8IGMudmFyIDw8ICIpO1xuIjsKKyAgICAgICAgICAgfSBlbHNlIGlmIChjLnR5cGVuYW1lcy5HZXRJbnRlcmZhY2UoZWxlbWVudF90eXBlKSkgeworICAgICAgICAgICAgIGMud3JpdGVyIDw8IGMucGFyY2VsIDw8ICIud3JpdGVJbnRlcmZhY2VMaXN0KCIgPDwgYy52YXIgPDwgIik7XG4iOwogICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgIEFJRExfRkFUQUwoYy50eXBlKSA8PCAid3JpdGU6IE5PVCBJTVBMRU1FTlRFRCBmb3IgIiA8PCBjb250YWluZWRfdHlwZTsKKyAgICAgICAgICAgICBBSURMX0ZBVEFMKGMudHlwZSkgPDwgIndyaXRlOiBOT1QgSU1QTEVNRU5URUQgZm9yICIgPDwgZWxlbWVudF90eXBlX25hbWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGMud3JpdGVyIDw8IGMucGFyY2VsIDw8ICIud3JpdGVMaXN0KCIgPDwgYy52YXIgPDwgIik7XG4iOwpAQCAtMzA0LDkgKzQwOCw5IEBACiAgICAgICAgICAgICAgICAqYy50eXBlLkdldFR5cGVQYXJhbWV0ZXJzKClbMV0uZ2V0KCksCiAgICAgICAgICAgICAgICBjLnBhcmNlbCwKICAgICAgICAgICAgICAgICJ2IiwKLSAgICAgICAgICAgICAgIGMuaXNfcmV0dXJuX3ZhbHVlLAorICAgICAgICAgICAgICAgYy5taW5fc2RrX3ZlcnNpb24sCisgICAgICAgICAgICAgICBjLndyaXRlX3RvX3BhcmNlbF9mbGFnLAogICAgICAgICAgICAgICAgYy5pc19jbGFzc2xvYWRlcl9jcmVhdGVkLAotICAgICAgICAgICAgICAgYy5maWxlbmFtZSwKICAgICAgICAgICAgfTsKICAgICAgICAgICAgV3JpdGVUb1BhcmNlbEZvcih2YWx1ZV9jb250ZXh0KTsKICAgICAgICAgICAgYy53cml0ZXIuRGVkZW50KCk7CkBAIC0zMzYsMjMgKzQ0MCwxOCBAQAogICAgICAgIH19LAogICAgICAgeyJQYXJjZWxGaWxlRGVzY3JpcHRvciIsCiAgICAgICAgW10oY29uc3QgQ29kZUdlbmVyYXRvckNvbnRleHQmIGMpIHsKLSAgICAgICAgIC8vIFRoaXMgaXMgc2FtZSBhcyB3cml0ZVR5cGVkT2JqZWN0IHdoaWNoIHdhcyBpbnRyb2R1Y2VkIHdpdGggU0RLIDIzLgotICAgICAgICAgLy8gS2VlcGluZyBiZWxvdyBjb2RlIHNvIHRoYXQgdGhlIGdlbmVyYXRlZCBjb2RlIGlzIGJ1aWxkYWJsZSB3aXRoIG9sZGVyIFNESy4KLSAgICAgICAgIGMud3JpdGVyIDw8ICJpZiAoKCIgPDwgYy52YXIgPDwgIiE9bnVsbCkpIHtcbiI7Ci0gICAgICAgICBjLndyaXRlci5JbmRlbnQoKTsKLSAgICAgICAgIGMud3JpdGVyIDw8IGMucGFyY2VsIDw8ICIud3JpdGVJbnQoMSk7XG4iOwotICAgICAgICAgYy53cml0ZXIgPDwgYy52YXIgPDwgIi53cml0ZVRvUGFyY2VsKCIgPDwgYy5wYXJjZWwgPDwgIiwgIiA8PCBHZXRGbGFnRm9yKGMpIDw8ICIpO1xuIjsKLSAgICAgICAgIGMud3JpdGVyLkRlZGVudCgpOwotICAgICAgICAgYy53cml0ZXIgPDwgIn1cbiI7Ci0gICAgICAgICBjLndyaXRlciA8PCAiZWxzZSB7XG4iOwotICAgICAgICAgYy53cml0ZXIuSW5kZW50KCk7Ci0gICAgICAgICBjLndyaXRlciA8PCBjLnBhcmNlbCA8PCAiLndyaXRlSW50KDApO1xuIjsKLSAgICAgICAgIGMud3JpdGVyLkRlZGVudCgpOwotICAgICAgICAgYy53cml0ZXIgPDwgIn1cbiI7CisgICAgICAgICBpZiAoYy5taW5fc2RrX3ZlcnNpb24gPj0gMjN1KSB7CisgICAgICAgICAgIGMud3JpdGVyIDw8IGMucGFyY2VsIDw8ICIud3JpdGVUeXBlZE9iamVjdCgiIDw8IGMudmFyIDw8ICIsICIgPDwgYy53cml0ZV90b19wYXJjZWxfZmxhZworICAgICAgICAgICAgICAgICAgICA8PCAiKTtcbiI7CisgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICBjLndyaXRlciA8PCAiX1BhcmNlbC53cml0ZVR5cGVkT2JqZWN0KCIgPDwgYy5wYXJjZWwgPDwgIiwgIiA8PCBjLnZhciA8PCAiLCAiCisgICAgICAgICAgICAgICAgICAgIDw8IGMud3JpdGVfdG9fcGFyY2VsX2ZsYWcgPDwgIik7XG4iOworICAgICAgICAgfQogICAgICAgIH19LAogICAgICAgeyJQYXJjZWxGaWxlRGVzY3JpcHRvcltdIiwKICAgICAgICBbXShjb25zdCBDb2RlR2VuZXJhdG9yQ29udGV4dCYgYykgewotICAgICAgICAgYy53cml0ZXIgPDwgYy5wYXJjZWwgPDwgIi53cml0ZVR5cGVkQXJyYXkoIiA8PCBjLnZhciA8PCAiLCAiIDw8IEdldEZsYWdGb3IoYykgPDwgIik7XG4iOworICAgICAgICAgYy53cml0ZXIgPDwgYy5wYXJjZWwgPDwgIi53cml0ZVR5cGVkQXJyYXkoIiA8PCBjLnZhciA8PCAiLCAiIDw8IGMud3JpdGVfdG9fcGFyY2VsX2ZsYWcKKyAgICAgICAgICAgICAgICAgIDw8ICIpO1xuIjsKICAgICAgICB9fSwKICAgICAgIHsiQ2hhclNlcXVlbmNlIiwKICAgICAgICBbXShjb25zdCBDb2RlR2VuZXJhdG9yQ29udGV4dCYgYykgewpAQCAtMzYyLDcgKzQ2MSw3IEBACiAgICAgICAgICBjLndyaXRlci5JbmRlbnQoKTsKICAgICAgICAgIGMud3JpdGVyIDw8IGMucGFyY2VsIDw8ICIud3JpdGVJbnQoMSk7XG4iOwogICAgICAgICAgYy53cml0ZXIgPDwgImFuZHJvaWQudGV4dC5UZXh0VXRpbHMud3JpdGVUb1BhcmNlbCgiIDw8IGMudmFyIDw8ICIsICIgPDwgYy5wYXJjZWwgPDwgIiwgIgotICAgICAgICAgICAgICAgICAgPDwgR2V0RmxhZ0ZvcihjKSA8PCAiKTtcbiI7CisgICAgICAgICAgICAgICAgICA8PCBjLndyaXRlX3RvX3BhcmNlbF9mbGFnIDw8ICIpO1xuIjsKICAgICAgICAgIGMud3JpdGVyLkRlZGVudCgpOwogICAgICAgICAgYy53cml0ZXIgPDwgIn1cbiI7CiAgICAgICAgICBjLndyaXRlciA8PCAiZWxzZSB7XG4iOwpAQCAtMzc2LDQxICs0NzUsNDAgQEAKICAgICAgICAgIGMud3JpdGVyIDw8IGMucGFyY2VsIDw8ICIud3JpdGVUeXBlZE9iamVjdCgiIDw8IGMudmFyIDw8ICIsIDApO1xuIjsKICAgICAgICB9fSwKICAgfTsKLSAgY29uc3Qgc3RyaW5nIHR5cGVfbmFtZSA9IEFpZGxCYWNraW5nVHlwZU5hbWUoYy50eXBlLCBjLnR5cGVuYW1lcyk7CisgIGNvbnN0IHN0cmluZyB0eXBlX25hbWUgPSBBaWRsQmFja2luZ1R5cGVOYW1lKGMudHlwZSk7CiAgIGNvbnN0IGF1dG8gZm91bmQgPSBtZXRob2RfbWFwLmZpbmQodHlwZV9uYW1lKTsKICAgaWYgKGZvdW5kICE9IG1ldGhvZF9tYXAuZW5kKCkpIHsKICAgICBmb3VuZC0+c2Vjb25kKGMpOworICB9IGVsc2UgaWYgKGMudHlwZS5Jc0ZpeGVkU2l6ZUFycmF5KCkpIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gYXJncyA9IHtjLnZhciwgYy53cml0ZV90b19wYXJjZWxfZmxhZ307CisgICAgZm9yIChhdXRvIGRpbSA6IGMudHlwZS5HZXRGaXhlZFNpemVBcnJheURpbWVuc2lvbnMoKSkgeworICAgICAgYXJncy5wdXNoX2JhY2soc3RkOjp0b19zdHJpbmcoZGltKSk7CisgICAgfQorICAgIGMud3JpdGVyIDw8IGMucGFyY2VsIDw8ICIud3JpdGVGaXhlZEFycmF5KCIgPDwgSm9pbihhcmdzLCAiLCAiKSA8PCAiKTtcbiI7CiAgIH0gZWxzZSB7CiAgICAgY29uc3QgQWlkbERlZmluZWRUeXBlKiB0ID0gYy50eXBlbmFtZXMuVHJ5R2V0RGVmaW5lZFR5cGUoYy50eXBlLkdldE5hbWUoKSk7CiAgICAgQUlETF9GQVRBTF9JRih0ID09IG51bGxwdHIsIGMudHlwZSkgPDwgIlVua25vd24gdHlwZTogIiA8PCBjLnR5cGUuR2V0TmFtZSgpOwogICAgIGlmICh0LT5Bc0ludGVyZmFjZSgpICE9IG51bGxwdHIpIHsKLSAgICAgIGlmICghYy50eXBlLklzQXJyYXkoKSkgewotICAgICAgICAvLyBXaHkgZG9uJ3Qgd2UgdXNlIHdyaXRlU3Ryb25nSW50ZXJmYWNlIHdoaWNoIGRvZXMgdGhlIGV4YWN0IHNhbWUgdGhpbmc/Ci0gICAgICAgIC8vIEtlZXBpbmcgYmVsb3cgY29kZSBqdXN0IG5vdCB0byBicmVhayB1bml0IHRlc3RzLgotICAgICAgICBjLndyaXRlciA8PCBjLnBhcmNlbCA8PCAiLndyaXRlU3Ryb25nQmluZGVyKCgoKCIgPDwgYy52YXIgPDwgIiE9bnVsbCkpPyIKLSAgICAgICAgICAgICAgICAgPDwgIigiIDw8IGMudmFyIDw8ICIuYXNCaW5kZXIoKSk6KG51bGwpKSk7XG4iOworICAgICAgaWYgKGMudHlwZS5Jc0FycmF5KCkpIHsKKyAgICAgICAgYy53cml0ZXIgPDwgYy5wYXJjZWwgPDwgIi53cml0ZUludGVyZmFjZUFycmF5KCIgPDwgYy52YXIgPDwgIik7XG4iOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYy53cml0ZXIgPDwgYy5wYXJjZWwgPDwgIi53cml0ZVN0cm9uZ0ludGVyZmFjZSgiIDw8IGMudmFyIDw8ICIpO1xuIjsKICAgICAgIH0KICAgICB9IGVsc2UgaWYgKHQtPkFzUGFyY2VsYWJsZSgpICE9IG51bGxwdHIpIHsKICAgICAgIGlmIChjLnR5cGUuSXNBcnJheSgpKSB7Ci0gICAgICAgIGMud3JpdGVyIDw8IGMucGFyY2VsIDw8ICIud3JpdGVUeXBlZEFycmF5KCIgPDwgYy52YXIgPDwgIiwgIiA8PCBHZXRGbGFnRm9yKGMpIDw8ICIpO1xuIjsKKyAgICAgICAgYy53cml0ZXIgPDwgYy5wYXJjZWwgPDwgIi53cml0ZVR5cGVkQXJyYXkoIiA8PCBjLnZhciA8PCAiLCAiIDw8IGMud3JpdGVfdG9fcGFyY2VsX2ZsYWcKKyAgICAgICAgICAgICAgICAgPDwgIik7XG4iOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gVGhpcyBpcyBzYW1lIGFzIHdyaXRlVHlwZWRPYmplY3QuCi0gICAgICAgIC8vIEtlZXBpbmcgYmVsb3cgY29kZSBqdXN0IG5vdCB0byBicmVhayB0ZXN0cy4KLSAgICAgICAgYy53cml0ZXIgPDwgImlmICgoIiA8PCBjLnZhciA8PCAiIT1udWxsKSkge1xuIjsKLSAgICAgICAgYy53cml0ZXIuSW5kZW50KCk7Ci0gICAgICAgIGMud3JpdGVyIDw8IGMucGFyY2VsIDw8ICIud3JpdGVJbnQoMSk7XG4iOwotICAgICAgICBjLndyaXRlciA8PCBjLnZhciA8PCAiLndyaXRlVG9QYXJjZWwoIiA8PCBjLnBhcmNlbCA8PCAiLCAiIDw8IEdldEZsYWdGb3IoYykgPDwgIik7XG4iOwotICAgICAgICBjLndyaXRlci5EZWRlbnQoKTsKLSAgICAgICAgYy53cml0ZXIgPDwgIn1cbiI7Ci0gICAgICAgIGMud3JpdGVyIDw8ICJlbHNlIHtcbiI7Ci0gICAgICAgIGMud3JpdGVyLkluZGVudCgpOwotICAgICAgICBjLndyaXRlciA8PCBjLnBhcmNlbCA8PCAiLndyaXRlSW50KDApO1xuIjsKLSAgICAgICAgYy53cml0ZXIuRGVkZW50KCk7Ci0gICAgICAgIGMud3JpdGVyIDw8ICJ9XG4iOworICAgICAgICBpZiAoYy5taW5fc2RrX3ZlcnNpb24gPj0gMjN1KSB7CisgICAgICAgICAgYy53cml0ZXIgPDwgYy5wYXJjZWwgPDwgIi53cml0ZVR5cGVkT2JqZWN0KCIgPDwgYy52YXIgPDwgIiwgIiA8PCBjLndyaXRlX3RvX3BhcmNlbF9mbGFnCisgICAgICAgICAgICAgICAgICAgPDwgIik7XG4iOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGMud3JpdGVyIDw8ICJfUGFyY2VsLndyaXRlVHlwZWRPYmplY3QoIiA8PCBjLnBhcmNlbCA8PCAiLCAiIDw8IGMudmFyIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgICA8PCBjLndyaXRlX3RvX3BhcmNlbF9mbGFnIDw8ICIpO1xuIjsKKyAgICAgICAgfQogICAgICAgfQogICAgIH0KICAgfQotICByZXR1cm4gdHJ1ZTsKIH0KIAogLy8gRW5zdXJlcyB0aGF0IGEgdmFyaWFibGUgaXMgaW5pdGlhbGl6ZWQgdG8gcmVmZXIgdG8gdGhlIGNsYXNzbG9hZGVyCkBAIC00MjksNyArNTI3LDExIEBACiAgIHN0YXRpYyBtYXA8c3RyaW5nLCBmdW5jdGlvbjx2b2lkKGNvbnN0IENvZGVHZW5lcmF0b3JDb250ZXh0Jik+PiBtZXRob2RfbWFwewogICAgICAgeyJib29sZWFuIiwKICAgICAgICBbXShjb25zdCBDb2RlR2VuZXJhdG9yQ29udGV4dCYgYykgewotICAgICAgICAgYy53cml0ZXIgPDwgYy52YXIgPDwgIiA9ICgwIT0iIDw8IGMucGFyY2VsIDw8ICIucmVhZEludCgpKTtcbiI7CisgICAgICAgICBpZiAoYy5taW5fc2RrX3ZlcnNpb24gPj0gMjl1KSB7CisgICAgICAgICAgIGMud3JpdGVyIDw8IGMudmFyIDw8ICIgPSAiIDw8IGMucGFyY2VsIDw8ICIucmVhZEJvb2xlYW4oKTtcbiI7CisgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICBjLndyaXRlciA8PCBjLnZhciA8PCAiID0gKDAhPSIgPDwgYy5wYXJjZWwgPDwgIi5yZWFkSW50KCkpO1xuIjsKKyAgICAgICAgIH0KICAgICAgICB9fSwKICAgICAgIHsiYm9vbGVhbltdIiwKICAgICAgICBbXShjb25zdCBDb2RlR2VuZXJhdG9yQ29udGV4dCYgYykgewpAQCAtNDk0LDE3ICs1OTYsMjIgQEAKICAgICAgIHsiTGlzdCIsCiAgICAgICAgW10oY29uc3QgQ29kZUdlbmVyYXRvckNvbnRleHQmIGMpIHsKICAgICAgICAgIGlmIChjLnR5cGUuSXNHZW5lcmljKCkpIHsKLSAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBjb250YWluZWRfdHlwZSA9IGMudHlwZS5HZXRUeXBlUGFyYW1ldGVycygpLmF0KDApLT5HZXROYW1lKCk7Ci0gICAgICAgICAgIGlmIChjb250YWluZWRfdHlwZSA9PSAiU3RyaW5nIikgeworICAgICAgICAgICBBSURMX0ZBVEFMX0lGKGMudHlwZS5HZXRUeXBlUGFyYW1ldGVycygpLnNpemUoKSAhPSAxLCBjLnR5cGUpOworICAgICAgICAgICBjb25zdCBhdXRvJiBlbGVtZW50X3R5cGUgPSAqYy50eXBlLkdldFR5cGVQYXJhbWV0ZXJzKCkuYXQoMCk7CisgICAgICAgICAgIGNvbnN0IGF1dG8mIGVsZW1lbnRfdHlwZV9uYW1lID0gZWxlbWVudF90eXBlLkdldE5hbWUoKTsKKyAgICAgICAgICAgaWYgKGVsZW1lbnRfdHlwZV9uYW1lID09ICJTdHJpbmciKSB7CiAgICAgICAgICAgICAgYy53cml0ZXIgPDwgYy52YXIgPDwgIiA9ICIgPDwgYy5wYXJjZWwgPDwgIi5jcmVhdGVTdHJpbmdBcnJheUxpc3QoKTtcbiI7Ci0gICAgICAgICAgIH0gZWxzZSBpZiAoY29udGFpbmVkX3R5cGUgPT0gIklCaW5kZXIiKSB7CisgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudF90eXBlX25hbWUgPT0gIklCaW5kZXIiKSB7CiAgICAgICAgICAgICAgYy53cml0ZXIgPDwgYy52YXIgPDwgIiA9ICIgPDwgYy5wYXJjZWwgPDwgIi5jcmVhdGVCaW5kZXJBcnJheUxpc3QoKTtcbiI7Ci0gICAgICAgICAgIH0gZWxzZSBpZiAoYy50eXBlbmFtZXMuSXNQYXJjZWxhYmxlKGNvbnRhaW5lZF90eXBlKSkgeworICAgICAgICAgICB9IGVsc2UgaWYgKGMudHlwZW5hbWVzLklzUGFyY2VsYWJsZShlbGVtZW50X3R5cGVfbmFtZSkpIHsKICAgICAgICAgICAgICBjLndyaXRlciA8PCBjLnZhciA8PCAiID0gIiA8PCBjLnBhcmNlbCA8PCAiLmNyZWF0ZVR5cGVkQXJyYXlMaXN0KCIKLSAgICAgICAgICAgICAgICAgICAgICA8PCBKYXZhTmFtZU9mKCooYy50eXBlLkdldFR5cGVQYXJhbWV0ZXJzKCkuYXQoMCkpLCBjLnR5cGVuYW1lcykKLSAgICAgICAgICAgICAgICAgICAgICA8PCAiLkNSRUFUT1IpO1xuIjsKKyAgICAgICAgICAgICAgICAgICAgICA8PCBKYXZhTmFtZU9mKGVsZW1lbnRfdHlwZSkgPDwgIi5DUkVBVE9SKTtcbiI7CisgICAgICAgICAgIH0gZWxzZSBpZiAoYy50eXBlbmFtZXMuR2V0SW50ZXJmYWNlKGVsZW1lbnRfdHlwZSkpIHsKKyAgICAgICAgICAgICBhdXRvIGFzX2ludGVyZmFjZSA9IGVsZW1lbnRfdHlwZV9uYW1lICsgIi5TdHViOjphc0ludGVyZmFjZSI7CisgICAgICAgICAgICAgYy53cml0ZXIgPDwgYy52YXIgPDwgIiA9ICIgPDwgYy5wYXJjZWwgPDwgIi5jcmVhdGVJbnRlcmZhY2VBcnJheUxpc3QoIiA8PCBhc19pbnRlcmZhY2UKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiKTtcbiI7CiAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgQUlETF9GQVRBTChjLnR5cGUpIDw8ICJjcmVhdGU6IE5PVCBJTVBMRU1FTlRFRCBmb3IgIiA8PCBjb250YWluZWRfdHlwZTsKKyAgICAgICAgICAgICBBSURMX0ZBVEFMKGMudHlwZSkgPDwgImNyZWF0ZTogTk9UIElNUExFTUVOVEVEIGZvciAiIDw8IGVsZW1lbnRfdHlwZV9uYW1lOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zdCBzdHJpbmcgY2xhc3Nsb2FkZXIgPSBFbnN1cmVBbmRHZXRDbGFzc2xvYWRlcihjb25zdF9jYXN0PENvZGVHZW5lcmF0b3JDb250ZXh0Jj4oYykpOwpAQCAtNTE5LDIwICs2MjYsMjAgQEAKICAgICAgICAgICAgYy53cml0ZXIgPDwgImludCBOID0gIiA8PCBjLnBhcmNlbCA8PCAiLnJlYWRJbnQoKTtcbiI7CiAgICAgICAgICAgIGMud3JpdGVyIDw8IGMudmFyIDw8ICIgPSBOIDwgMCA/IG51bGwgOiBuZXcgamF2YS51dGlsLkhhc2hNYXA8PigpO1xuIjsKIAotICAgICAgICAgICBhdXRvIGNyZWF0b3IgPSBKYXZhTmFtZU9mKCooYy50eXBlLkdldFR5cGVQYXJhbWV0ZXJzKCkuYXQoMSkpLCBjLnR5cGVuYW1lcykgKyAiLkNSRUFUT1IiOworICAgICAgICAgICBhdXRvIGNyZWF0b3IgPSBKYXZhTmFtZU9mKCooYy50eXBlLkdldFR5cGVQYXJhbWV0ZXJzKCkuYXQoMSkpKSArICIuQ1JFQVRPUiI7CiAgICAgICAgICAgIGMud3JpdGVyIDw8ICJqYXZhLnV0aWwuc3RyZWFtLkludFN0cmVhbS5yYW5nZSgwLCBOKS5mb3JFYWNoKGkgLT4ge1xuIjsKICAgICAgICAgICAgYy53cml0ZXIuSW5kZW50KCk7CiAgICAgICAgICAgIGMud3JpdGVyIDw8ICJTdHJpbmcgayA9ICIgPDwgYy5wYXJjZWwgPDwgIi5yZWFkU3RyaW5nKCk7XG4iOwotICAgICAgICAgICBjLndyaXRlciA8PCBKYXZhU2lnbmF0dXJlT2YoKihjLnR5cGUuR2V0VHlwZVBhcmFtZXRlcnMoKS5hdCgxKSksIGMudHlwZW5hbWVzKSA8PCAiIHY7XG4iOworICAgICAgICAgICBjLndyaXRlciA8PCBKYXZhU2lnbmF0dXJlT2YoKihjLnR5cGUuR2V0VHlwZVBhcmFtZXRlcnMoKS5hdCgxKSkpIDw8ICIgdjtcbiI7CiAgICAgICAgICAgIENvZGVHZW5lcmF0b3JDb250ZXh0IHZhbHVlX2NvbnRleHR7CiAgICAgICAgICAgICAgICBjLndyaXRlciwKICAgICAgICAgICAgICAgIGMudHlwZW5hbWVzLAogICAgICAgICAgICAgICAgKmMudHlwZS5HZXRUeXBlUGFyYW1ldGVycygpWzFdLmdldCgpLAogICAgICAgICAgICAgICAgYy5wYXJjZWwsCiAgICAgICAgICAgICAgICAidiIsCi0gICAgICAgICAgICAgICBjLmlzX3JldHVybl92YWx1ZSwKKyAgICAgICAgICAgICAgIGMubWluX3Nka192ZXJzaW9uLAorICAgICAgICAgICAgICAgYy53cml0ZV90b19wYXJjZWxfZmxhZywKICAgICAgICAgICAgICAgIGMuaXNfY2xhc3Nsb2FkZXJfY3JlYXRlZCwKLSAgICAgICAgICAgICAgIGMuZmlsZW5hbWUsCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIENyZWF0ZUZyb21QYXJjZWxGb3IodmFsdWVfY29udGV4dCk7CiAgICAgICAgICAgIGMud3JpdGVyIDw8IGMudmFyIDw8ICIucHV0KGssIHYpO1xuIjsKQEAgLTU2NSwxOSArNjcyLDEzIEBACiAgICAgICAgfX0sCiAgICAgICB7IlBhcmNlbEZpbGVEZXNjcmlwdG9yIiwKICAgICAgICBbXShjb25zdCBDb2RlR2VuZXJhdG9yQ29udGV4dCYgYykgewotICAgICAgICAgLy8gVGhpcyBpcyBzYW1lIGFzIHJlYWRUeXBlZE9iamVjdCB3aGljaCB3YXMgaW50cm9kdWNlZCB3aXRoIFNESyAyMy4KLSAgICAgICAgIC8vIEtlZXBpbmcgYmVsb3cgY29kZSBzbyB0aGF0IHRoZSBnZW5lcmF0ZWQgY29kZSBpcyBidWlsZGFibGUgd2l0aCBvbGRlciBTREsuCi0gICAgICAgICBjLndyaXRlciA8PCAiaWYgKCgwIT0iIDw8IGMucGFyY2VsIDw8ICIucmVhZEludCgpKSkge1xuIjsKLSAgICAgICAgIGMud3JpdGVyLkluZGVudCgpOwotICAgICAgICAgYy53cml0ZXIgPDwgYy52YXIgPDwgIiA9ICIgPDwgImFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3IuQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKCIgPDwgYy5wYXJjZWwKLSAgICAgICAgICAgICAgICAgIDw8ICIpO1xuIjsKLSAgICAgICAgIGMud3JpdGVyLkRlZGVudCgpOwotICAgICAgICAgYy53cml0ZXIgPDwgIn1cbiI7Ci0gICAgICAgICBjLndyaXRlciA8PCAiZWxzZSB7XG4iOwotICAgICAgICAgYy53cml0ZXIuSW5kZW50KCk7Ci0gICAgICAgICBjLndyaXRlciA8PCBjLnZhciA8PCAiID0gbnVsbDtcbiI7Ci0gICAgICAgICBjLndyaXRlci5EZWRlbnQoKTsKLSAgICAgICAgIGMud3JpdGVyIDw8ICJ9XG4iOworICAgICAgICAgaWYgKGMubWluX3Nka192ZXJzaW9uID49IDIzdSkgeworICAgICAgICAgICBjLndyaXRlciA8PCBjLnZhciA8PCAiID0gIiA8PCBjLnBhcmNlbAorICAgICAgICAgICAgICAgICAgICA8PCAiLnJlYWRUeXBlZE9iamVjdChhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yLkNSRUFUT1IpO1xuIjsKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgIGMud3JpdGVyIDw8IGMudmFyIDw8ICIgPSBfUGFyY2VsLnJlYWRUeXBlZE9iamVjdCgiIDw8IGMucGFyY2VsCisgICAgICAgICAgICAgICAgICAgIDw8ICIsIGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3IuQ1JFQVRPUik7XG4iOworICAgICAgICAgfQogICAgICAgIH19LAogICAgICAgeyJQYXJjZWxGaWxlRGVzY3JpcHRvcltdIiwKICAgICAgICBbXShjb25zdCBDb2RlR2VuZXJhdG9yQ29udGV4dCYgYykgewpAQCAtNTg2LDE4ICs2ODcsMTMgQEAKICAgICAgICB9fSwKICAgICAgIHsiQ2hhclNlcXVlbmNlIiwKICAgICAgICBbXShjb25zdCBDb2RlR2VuZXJhdG9yQ29udGV4dCYgYykgewotICAgICAgICAgLy8gV2UgaGF2ZSB3cml0dGVuIDAgZm9yIG51bGwgQ2hhclNlcXVlbmNlLgotICAgICAgICAgYy53cml0ZXIgPDwgImlmICgwIT0iIDw8IGMucGFyY2VsIDw8ICIucmVhZEludCgpKSB7XG4iOwotICAgICAgICAgYy53cml0ZXIuSW5kZW50KCk7Ci0gICAgICAgICBjLndyaXRlciA8PCBjLnZhciA8PCAiID0gYW5kcm9pZC50ZXh0LlRleHRVdGlscy5DSEFSX1NFUVVFTkNFX0NSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbCgiCi0gICAgICAgICAgICAgICAgICA8PCBjLnBhcmNlbCA8PCAiKTtcbiI7Ci0gICAgICAgICBjLndyaXRlci5EZWRlbnQoKTsKLSAgICAgICAgIGMud3JpdGVyIDw8ICJ9XG4iOwotICAgICAgICAgYy53cml0ZXIgPDwgImVsc2Uge1xuIjsKLSAgICAgICAgIGMud3JpdGVyLkluZGVudCgpOwotICAgICAgICAgYy53cml0ZXIgPDwgYy52YXIgPDwgIiA9IG51bGw7XG4iOwotICAgICAgICAgYy53cml0ZXIuRGVkZW50KCk7Ci0gICAgICAgICBjLndyaXRlciA8PCAifVxuIjsKKyAgICAgICAgIGlmIChjLm1pbl9zZGtfdmVyc2lvbiA+PSAyM3UpIHsKKyAgICAgICAgICAgYy53cml0ZXIgPDwgYy52YXIgPDwgIiA9ICIgPDwgYy5wYXJjZWwKKyAgICAgICAgICAgICAgICAgICAgPDwgIi5yZWFkVHlwZWRPYmplY3QoYW5kcm9pZC50ZXh0LlRleHRVdGlscy5DSEFSX1NFUVVFTkNFX0NSRUFUT1IpO1xuIjsKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgIGMud3JpdGVyIDw8IGMudmFyIDw8ICIgPSBfUGFyY2VsLnJlYWRUeXBlZE9iamVjdCgiIDw8IGMucGFyY2VsCisgICAgICAgICAgICAgICAgICAgIDw8ICIsIGFuZHJvaWQudGV4dC5UZXh0VXRpbHMuQ0hBUl9TRVFVRU5DRV9DUkVBVE9SKTtcbiI7CisgICAgICAgICB9CiAgICAgICAgfX0sCiAgICAgICB7IlBhcmNlbGFibGVIb2xkZXIiLAogICAgICAgIFtdKGNvbnN0IENvZGVHZW5lcmF0b3JDb250ZXh0JiBjKSB7CkBAIC02MDgsMzUgKzcwNCw0NiBAQAogICAgICAgICAgYy53cml0ZXIgPDwgIn1cbiI7CiAgICAgICAgfX0sCiAgIH07Ci0gIGNvbnN0IGF1dG8gZm91bmQgPSBtZXRob2RfbWFwLmZpbmQoQWlkbEJhY2tpbmdUeXBlTmFtZShjLnR5cGUsIGMudHlwZW5hbWVzKSk7CisgIGNvbnN0IGF1dG8gZm91bmQgPSBtZXRob2RfbWFwLmZpbmQoQWlkbEJhY2tpbmdUeXBlTmFtZShjLnR5cGUpKTsKICAgaWYgKGZvdW5kICE9IG1ldGhvZF9tYXAuZW5kKCkpIHsKICAgICBmb3VuZC0+c2Vjb25kKGMpOworICB9IGVsc2UgaWYgKGMudHlwZS5Jc0ZpeGVkU2l6ZUFycmF5KCkpIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gYXJncyA9IHtKYXZhU2lnbmF0dXJlT2YoYy50eXBlKSArICIuY2xhc3MifTsKKyAgICBpZiAoYy50eXBlbmFtZXMuSXNQYXJjZWxhYmxlKGMudHlwZS5HZXROYW1lKCkpKSB7CisgICAgICBhcmdzLnB1c2hfYmFjayhKYXZhTmFtZU9mKGMudHlwZSkgKyAiLkNSRUFUT1IiKTsKKyAgICB9IGVsc2UgaWYgKGMudHlwZW5hbWVzLkdldEludGVyZmFjZShjLnR5cGUpKSB7CisgICAgICBhcmdzLnB1c2hfYmFjayhjLnR5cGUuR2V0TmFtZSgpICsgIi5TdHViOjphc0ludGVyZmFjZSIpOworICAgIH0KKyAgICBmb3IgKGF1dG8gZGltIDogYy50eXBlLkdldEZpeGVkU2l6ZUFycmF5RGltZW5zaW9ucygpKSB7CisgICAgICBhcmdzLnB1c2hfYmFjayhzdGQ6OnRvX3N0cmluZyhkaW0pKTsKKyAgICB9CisgICAgYy53cml0ZXIgPDwgYy52YXIgPDwgIiA9ICIgPDwgYy5wYXJjZWwgPDwgIi5jcmVhdGVGaXhlZEFycmF5KCIgPDwgSm9pbihhcmdzLCAiLCAiKSA8PCAiKTtcbiI7CiAgIH0gZWxzZSB7CiAgICAgY29uc3QgQWlkbERlZmluZWRUeXBlKiB0ID0gYy50eXBlbmFtZXMuVHJ5R2V0RGVmaW5lZFR5cGUoYy50eXBlLkdldE5hbWUoKSk7CiAgICAgQUlETF9GQVRBTF9JRih0ID09IG51bGxwdHIsIGMudHlwZSkgPDwgIlVua25vd24gdHlwZTogIiA8PCBjLnR5cGUuR2V0TmFtZSgpOwogICAgIGlmICh0LT5Bc0ludGVyZmFjZSgpICE9IG51bGxwdHIpIHsKLSAgICAgIGlmICghYy50eXBlLklzQXJyYXkoKSkgewotICAgICAgICBjLndyaXRlciA8PCBjLnZhciA8PCAiID0gIiA8PCBjLnR5cGUuR2V0TmFtZSgpIDw8ICIuU3R1Yi5hc0ludGVyZmFjZSgiIDw8IGMucGFyY2VsCisgICAgICBhdXRvIG5hbWUgPSBjLnR5cGUuR2V0TmFtZSgpOworICAgICAgaWYgKGMudHlwZS5Jc0FycmF5KCkpIHsKKyAgICAgICAgYXV0byBuZXdfYXJyYXkgPSBuYW1lICsgIltdOjpuZXciOworICAgICAgICBhdXRvIGFzX2ludGVyZmFjZSA9IG5hbWUgKyAiLlN0dWI6OmFzSW50ZXJmYWNlIjsKKyAgICAgICAgYy53cml0ZXIgPDwgYy52YXIgPDwgIiA9ICIgPDwgYy5wYXJjZWwgPDwgIi5jcmVhdGVJbnRlcmZhY2VBcnJheSgiIDw8IG5ld19hcnJheSA8PCAiLCAiCisgICAgICAgICAgICAgICAgIDw8IGFzX2ludGVyZmFjZSA8PCAiKTtcbiI7CisgICAgICB9IGVsc2UgeworICAgICAgICBjLndyaXRlciA8PCBjLnZhciA8PCAiID0gIiA8PCBuYW1lIDw8ICIuU3R1Yi5hc0ludGVyZmFjZSgiIDw8IGMucGFyY2VsCiAgICAgICAgICAgICAgICAgIDw8ICIucmVhZFN0cm9uZ0JpbmRlcigpKTtcbiI7CiAgICAgICB9CiAgICAgfSBlbHNlIGlmICh0LT5Bc1BhcmNlbGFibGUoKSAhPSBudWxscHRyKSB7CiAgICAgICBpZiAoYy50eXBlLklzQXJyYXkoKSkgewotICAgICAgICBjLndyaXRlciA8PCBjLnZhciA8PCAiID0gIiA8PCBjLnBhcmNlbCA8PCAiLmNyZWF0ZVR5cGVkQXJyYXkoIgotICAgICAgICAgICAgICAgICA8PCBKYXZhTmFtZU9mKGMudHlwZSwgYy50eXBlbmFtZXMpIDw8ICIuQ1JFQVRPUik7XG4iOworICAgICAgICBjLndyaXRlciA8PCBjLnZhciA8PCAiID0gIiA8PCBjLnBhcmNlbCA8PCAiLmNyZWF0ZVR5cGVkQXJyYXkoIiA8PCBKYXZhTmFtZU9mKGMudHlwZSkKKyAgICAgICAgICAgICAgICAgPDwgIi5DUkVBVE9SKTtcbiI7CiAgICAgICB9IGVsc2UgewotICAgICAgICAvLyBUaGlzIGlzIHNhbWUgYXMgcmVhZFR5cGVkT2JqZWN0LgotICAgICAgICAvLyBLZWVwaW5nIGJlbG93IGNvZGUganVzdCBub3QgdG8gYnJlYWsgdW5pdCB0ZXN0cy4KLSAgICAgICAgYy53cml0ZXIgPDwgImlmICgoMCE9IiA8PCBjLnBhcmNlbCA8PCAiLnJlYWRJbnQoKSkpIHtcbiI7Ci0gICAgICAgIGMud3JpdGVyLkluZGVudCgpOwotICAgICAgICBjLndyaXRlciA8PCBjLnZhciA8PCAiID0gIiA8PCBjLnR5cGUuR2V0TmFtZSgpIDw8ICIuQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKCIgPDwgYy5wYXJjZWwKLSAgICAgICAgICAgICAgICAgPDwgIik7XG4iOwotICAgICAgICBjLndyaXRlci5EZWRlbnQoKTsKLSAgICAgICAgYy53cml0ZXIgPDwgIn1cbiI7Ci0gICAgICAgIGMud3JpdGVyIDw8ICJlbHNlIHtcbiI7Ci0gICAgICAgIGMud3JpdGVyLkluZGVudCgpOwotICAgICAgICBjLndyaXRlciA8PCBjLnZhciA8PCAiID0gbnVsbDtcbiI7Ci0gICAgICAgIGMud3JpdGVyLkRlZGVudCgpOwotICAgICAgICBjLndyaXRlciA8PCAifVxuIjsKKyAgICAgICAgaWYgKGMubWluX3Nka192ZXJzaW9uID49IDIzdSkgeworICAgICAgICAgIGMud3JpdGVyIDw8IGMudmFyIDw8ICIgPSAiIDw8IGMucGFyY2VsIDw8ICIucmVhZFR5cGVkT2JqZWN0KCIgPDwgYy50eXBlLkdldE5hbWUoKQorICAgICAgICAgICAgICAgICAgIDw8ICIuQ1JFQVRPUik7XG4iOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGMud3JpdGVyIDw8IGMudmFyIDw8ICIgPSBfUGFyY2VsLnJlYWRUeXBlZE9iamVjdCgiIDw8IGMucGFyY2VsIDw8ICIsICIgPDwgYy50eXBlLkdldE5hbWUoKQorICAgICAgICAgICAgICAgICAgIDw8ICIuQ1JFQVRPUik7XG4iOworICAgICAgICB9CiAgICAgICB9CiAgICAgfQogICB9CkBAIC02ODAsMTcgKzc4NywyMiBAQAogICAgICAgeyJMaXN0IiwKICAgICAgICBbXShjb25zdCBDb2RlR2VuZXJhdG9yQ29udGV4dCYgYykgewogICAgICAgICAgaWYgKGMudHlwZS5Jc0dlbmVyaWMoKSkgewotICAgICAgICAgICBjb25zdCBzdHJpbmcmIGNvbnRhaW5lZF90eXBlID0gYy50eXBlLkdldFR5cGVQYXJhbWV0ZXJzKCkuYXQoMCktPkdldE5hbWUoKTsKLSAgICAgICAgICAgaWYgKGNvbnRhaW5lZF90eXBlID09ICJTdHJpbmciKSB7CisgICAgICAgICAgIEFJRExfRkFUQUxfSUYoYy50eXBlLkdldFR5cGVQYXJhbWV0ZXJzKCkuc2l6ZSgpICE9IDEsIGMudHlwZSk7CisgICAgICAgICAgIGNvbnN0IGF1dG8mIGVsZW1lbnRfdHlwZSA9ICpjLnR5cGUuR2V0VHlwZVBhcmFtZXRlcnMoKS5hdCgwKTsKKyAgICAgICAgICAgY29uc3QgYXV0byYgZWxlbWVudF90eXBlX25hbWUgPSBlbGVtZW50X3R5cGUuR2V0TmFtZSgpOworICAgICAgICAgICBpZiAoZWxlbWVudF90eXBlX25hbWUgPT0gIlN0cmluZyIpIHsKICAgICAgICAgICAgICBjLndyaXRlciA8PCBjLnBhcmNlbCA8PCAiLnJlYWRTdHJpbmdMaXN0KCIgPDwgYy52YXIgPDwgIik7XG4iOwotICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRhaW5lZF90eXBlID09ICJJQmluZGVyIikgeworICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnRfdHlwZV9uYW1lID09ICJJQmluZGVyIikgewogICAgICAgICAgICAgIGMud3JpdGVyIDw8IGMucGFyY2VsIDw8ICIucmVhZEJpbmRlckxpc3QoIiA8PCBjLnZhciA8PCAiKTtcbiI7Ci0gICAgICAgICAgIH0gZWxzZSBpZiAoYy50eXBlbmFtZXMuSXNQYXJjZWxhYmxlKGNvbnRhaW5lZF90eXBlKSkgeworICAgICAgICAgICB9IGVsc2UgaWYgKGMudHlwZW5hbWVzLklzUGFyY2VsYWJsZShlbGVtZW50X3R5cGVfbmFtZSkpIHsKICAgICAgICAgICAgICBjLndyaXRlciA8PCBjLnBhcmNlbCA8PCAiLnJlYWRUeXBlZExpc3QoIiA8PCBjLnZhciA8PCAiLCAiCi0gICAgICAgICAgICAgICAgICAgICAgPDwgSmF2YU5hbWVPZigqKGMudHlwZS5HZXRUeXBlUGFyYW1ldGVycygpLmF0KDApKSwgYy50eXBlbmFtZXMpCi0gICAgICAgICAgICAgICAgICAgICAgPDwgIi5DUkVBVE9SKTtcbiI7CisgICAgICAgICAgICAgICAgICAgICAgPDwgSmF2YU5hbWVPZigqKGMudHlwZS5HZXRUeXBlUGFyYW1ldGVycygpLmF0KDApKSkgPDwgIi5DUkVBVE9SKTtcbiI7CisgICAgICAgICAgIH0gZWxzZSBpZiAoYy50eXBlbmFtZXMuR2V0SW50ZXJmYWNlKGVsZW1lbnRfdHlwZSkpIHsKKyAgICAgICAgICAgICBhdXRvIGFzX2ludGVyZmFjZSA9IGVsZW1lbnRfdHlwZV9uYW1lICsgIi5TdHViOjphc0ludGVyZmFjZSI7CisgICAgICAgICAgICAgYy53cml0ZXIgPDwgYy5wYXJjZWwgPDwgIi5yZWFkSW50ZXJmYWNlTGlzdCgiIDw8IGMudmFyIDw8ICIsICIgPDwgYXNfaW50ZXJmYWNlCisgICAgICAgICAgICAgICAgICAgICAgPDwgIik7XG4iOwogICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgIEFJRExfRkFUQUwoYy50eXBlKSA8PCAicmVhZDogTk9UIElNUExFTUVOVEVEIGZvciAiIDw8IGNvbnRhaW5lZF90eXBlOworICAgICAgICAgICAgIEFJRExfRkFUQUwoYy50eXBlKSA8PCAicmVhZDogTk9UIElNUExFTUVOVEVEIGZvciAiIDw8IGVsZW1lbnRfdHlwZV9uYW1lOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zdCBzdHJpbmcgY2xhc3Nsb2FkZXIgPSBFbnN1cmVBbmRHZXRDbGFzc2xvYWRlcihjb25zdF9jYXN0PENvZGVHZW5lcmF0b3JDb250ZXh0Jj4oYykpOwpAQCAtNzA1LDI1ICs4MTcsMjIgQEAKICAgICAgICAgICAgICAgICAgICAgPDwgIi5yZWFkSW50KCkpLmZvckVhY2goaSAtPiB7XG4iOwogICAgICAgICAgICBjLndyaXRlci5JbmRlbnQoKTsKICAgICAgICAgICAgYy53cml0ZXIgPDwgIlN0cmluZyBrID0gIiA8PCBjLnBhcmNlbCA8PCAiLnJlYWRTdHJpbmcoKTtcbiI7Ci0gICAgICAgICAgIGMud3JpdGVyIDw8IEphdmFOYW1lT2YoKihjLnR5cGUuR2V0VHlwZVBhcmFtZXRlcnMoKS5hdCgxKSksIGMudHlwZW5hbWVzKSA8PCAiIHY7XG4iOworICAgICAgICAgICBjLndyaXRlciA8PCBKYXZhU2lnbmF0dXJlT2YoKihjLnR5cGUuR2V0VHlwZVBhcmFtZXRlcnMoKS5hdCgxKSkpIDw8ICIgdjtcbiI7CiAgICAgICAgICAgIENvZGVHZW5lcmF0b3JDb250ZXh0IHZhbHVlX2NvbnRleHR7CiAgICAgICAgICAgICAgICBjLndyaXRlciwKICAgICAgICAgICAgICAgIGMudHlwZW5hbWVzLAogICAgICAgICAgICAgICAgKmMudHlwZS5HZXRUeXBlUGFyYW1ldGVycygpWzFdLmdldCgpLAogICAgICAgICAgICAgICAgYy5wYXJjZWwsCiAgICAgICAgICAgICAgICAidiIsCi0gICAgICAgICAgICAgICBjLmlzX3JldHVybl92YWx1ZSwKKyAgICAgICAgICAgICAgIGMubWluX3Nka192ZXJzaW9uLAorICAgICAgICAgICAgICAgYy53cml0ZV90b19wYXJjZWxfZmxhZywKICAgICAgICAgICAgICAgIGMuaXNfY2xhc3Nsb2FkZXJfY3JlYXRlZCwKLSAgICAgICAgICAgICAgIGMuZmlsZW5hbWUsCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIENyZWF0ZUZyb21QYXJjZWxGb3IodmFsdWVfY29udGV4dCk7CiAgICAgICAgICAgIGMud3JpdGVyIDw8IGMudmFyIDw8ICIucHV0KGssIHYpO1xuIjsKIAogICAgICAgICAgICBjLndyaXRlci5EZWRlbnQoKTsKICAgICAgICAgICAgYy53cml0ZXIgPDwgIn0pO1xuIjsKLQotICAgICAgICAgICBjLndyaXRlci5EZWRlbnQoKTsKLSAgICAgICAgICAgYy53cml0ZXIgPDwgIn1cbiI7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zdCBzdHJpbmcgY2xhc3Nsb2FkZXIgPSBFbnN1cmVBbmRHZXRDbGFzc2xvYWRlcihjb25zdF9jYXN0PENvZGVHZW5lcmF0b3JDb250ZXh0Jj4oYykpOwogICAgICAgICAgICBjLndyaXRlciA8PCBjLnZhciA8PCAiID0gIiA8PCBjLnBhcmNlbCA8PCAiLnJlYWRIYXNoTWFwKCIgPDwgY2xhc3Nsb2FkZXIgPDwgIik7XG4iOwpAQCAtNzQxLDcgKzg1MCw5IEBACiAgICAgICAgW10oY29uc3QgQ29kZUdlbmVyYXRvckNvbnRleHQmIGMpIHsKICAgICAgICAgIGMud3JpdGVyIDw8ICJpZiAoKDAhPSIgPDwgYy5wYXJjZWwgPDwgIi5yZWFkSW50KCkpKSB7XG4iOwogICAgICAgICAgYy53cml0ZXIuSW5kZW50KCk7Ci0gICAgICAgICBjLndyaXRlciA8PCBjLnZhciA8PCAiID0gIiA8PCAiYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvci5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoIiA8PCBjLnBhcmNlbCA8PCAiKTtcbiI7CisgICAgICAgICBjLndyaXRlciA8PCBjLnZhciA8PCAiID0gIgorICAgICAgICAgICAgICAgICAgPDwgImFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3IuQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKCIgPDwgYy5wYXJjZWwKKyAgICAgICAgICAgICAgICAgIDw8ICIpO1xuIjsKICAgICAgICAgIGMud3JpdGVyLkRlZGVudCgpOwogICAgICAgICAgYy53cml0ZXIgPDwgIn1cbiI7CiAgICAgICAgfX0sCkBAIC03NTEsOSArODYyLDE3IEBACiAgICAgICAgICAgICAgICAgICA8PCAiLCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yLkNSRUFUT1IpO1xuIjsKICAgICAgICB9fSwKICAgfTsKLSAgY29uc3QgYXV0byYgZm91bmQgPSBtZXRob2RfbWFwLmZpbmQoQWlkbEJhY2tpbmdUeXBlTmFtZShjLnR5cGUsIGMudHlwZW5hbWVzKSk7CisgIGNvbnN0IGF1dG8mIGZvdW5kID0gbWV0aG9kX21hcC5maW5kKEFpZGxCYWNraW5nVHlwZU5hbWUoYy50eXBlKSk7CiAgIGlmIChmb3VuZCAhPSBtZXRob2RfbWFwLmVuZCgpKSB7CiAgICAgZm91bmQtPnNlY29uZChjKTsKKyAgfSBlbHNlIGlmIChjLnR5cGUuSXNGaXhlZFNpemVBcnJheSgpKSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGFyZ3MgPSB7Yy52YXJ9OworICAgIGlmIChjLnR5cGVuYW1lcy5Jc1BhcmNlbGFibGUoYy50eXBlLkdldE5hbWUoKSkpIHsKKyAgICAgIGFyZ3MucHVzaF9iYWNrKGMudHlwZS5HZXROYW1lKCkgKyAiLkNSRUFUT1IiKTsKKyAgICB9IGVsc2UgaWYgKGMudHlwZW5hbWVzLkdldEludGVyZmFjZShjLnR5cGUpKSB7CisgICAgICBhcmdzLnB1c2hfYmFjayhjLnR5cGUuR2V0TmFtZSgpICsgIi5TdHViOjphc0ludGVyZmFjZSIpOworICAgIH0KKyAgICBjLndyaXRlciA8PCBjLnBhcmNlbCA8PCAiLnJlYWRGaXhlZEFycmF5KCIgPDwgSm9pbihhcmdzLCAiLCAiKSA8PCAiKTtcbiI7CiAgIH0gZWxzZSB7CiAgICAgY29uc3QgQWlkbERlZmluZWRUeXBlKiB0ID0gYy50eXBlbmFtZXMuVHJ5R2V0RGVmaW5lZFR5cGUoYy50eXBlLkdldE5hbWUoKSk7CiAgICAgQUlETF9GQVRBTF9JRih0ID09IG51bGxwdHIsIGMudHlwZSkgPDwgIlVua25vd24gdHlwZTogIiA8PCBjLnR5cGUuR2V0TmFtZSgpOwpAQCAtNzY4LDE0ICs4ODcsMzMgQEAKICAgICAgICAgYy53cml0ZXIuRGVkZW50KCk7CiAgICAgICAgIGMud3JpdGVyIDw8ICJ9XG4iOwogICAgICAgfQorICAgIH0gZWxzZSBpZiAodC0+QXNJbnRlcmZhY2UoKSkgeworICAgICAgQUlETF9GQVRBTF9JRighYy50eXBlLklzQXJyYXkoKSwgYy50eXBlKSA8PCAicmVhZEZyb21QYXJjZWwoaW50ZXJmYWNlKSBkb2Vzbid0IG1ha2Ugc2Vuc2UuIjsKKyAgICAgIGF1dG8gYXNfaW50ZXJmYWNlID0gYy50eXBlLkdldE5hbWUoKSArICIuU3R1Yjo6YXNJbnRlcmZhY2UiOworICAgICAgYy53cml0ZXIgPDwgYy5wYXJjZWwgPDwgIi5yZWFkSW50ZXJmYWNlQXJyYXkoIiA8PCBjLnZhciA8PCAiLCAiIDw8IGFzX2ludGVyZmFjZSA8PCAiKTtcbiI7CiAgICAgfQogICB9CiAgIHJldHVybiB0cnVlOwogfQogCiB2b2lkIFRvU3RyaW5nRm9yKGNvbnN0IENvZGVHZW5lcmF0b3JDb250ZXh0JiBjKSB7CisgIC8vIFVzZSBkZXJpdmVkIHRvU3RyaW5nKCkgZm9yIGVudW0gdHlwZSBhbm5vdGF0ZWQgd2l0aCBASmF2YURlcml2ZSh0b1N0cmluZz10cnVlKQorICBpZiAoYXV0byB0ID0gYy50eXBlLkdldERlZmluZWRUeXBlKCk7CisgICAgICB0ICE9IG51bGxwdHIgJiYgdC0+QXNFbnVtRGVjbGFyYXRpb24oKSAmJiB0LT5KYXZhRGVyaXZlKCJ0b1N0cmluZyIpKSB7CisgICAgaWYgKGMudHlwZS5Jc0FycmF5KCkpIHsKKyAgICAgIGMud3JpdGVyIDw8IGMudHlwZS5HZXROYW1lKCkgPDwgIi4kLmFycmF5VG9TdHJpbmcoIiA8PCBjLnZhciA8PCAiKSI7CisgICAgfSBlbHNlIHsKKyAgICAgIGMud3JpdGVyIDw8IGMudHlwZS5HZXROYW1lKCkgPDwgIi4kLnRvU3RyaW5nKCIgPDwgYy52YXIgPDwgIikiOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKwogICBpZiAoYy50eXBlLklzQXJyYXkoKSkgewotICAgIGMud3JpdGVyIDw8ICJqYXZhLnV0aWwuQXJyYXlzLnRvU3RyaW5nKCIgPDwgYy52YXIgPDwgIikiOworICAgIGlmIChjLnR5cGUuSXNEeW5hbWljQXJyYXkoKSB8fCBjLnR5cGUuR2V0Rml4ZWRTaXplQXJyYXlEaW1lbnNpb25zKCkuc2l6ZSgpID09IDEpIHsKKyAgICAgIGMud3JpdGVyIDw8ICJqYXZhLnV0aWwuQXJyYXlzLnRvU3RyaW5nKCIgPDwgYy52YXIgPDwgIikiOworICAgIH0gZWxzZSB7CisgICAgICBjLndyaXRlciA8PCAiamF2YS51dGlsLkFycmF5cy5kZWVwVG9TdHJpbmcoIiA8PCBjLnZhciA8PCAiKSI7CisgICAgfQogICAgIHJldHVybjsKICAgfQogCmRpZmYgLS1naXQgYS9haWRsX3RvX2phdmEuaCBiL2FpZGxfdG9famF2YS5oCmluZGV4IDJlYmUyYzMuLjM0YzMyMzkgMTAwNjQ0Ci0tLSBhL2FpZGxfdG9famF2YS5oCisrKyBiL2FpZGxfdG9famF2YS5oCkBAIC0zOSwxOCArMzksMjQgQEAKIAogLy8gVGhpcyBoZWFkZXIgcHJvdmlkZXMgZnVuY3Rpb25zIHRoYXQgdHJhbnNsYXRlIEFJREwgdGhpbmdzIHRvIEphdmEgdGhpbmdzLgogCi1zdGQ6OnN0cmluZyBDb25zdGFudFZhbHVlRGVjb3JhdG9yKGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiB0eXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgcmF3X3ZhbHVlKTsKK3N0ZDo6c3RyaW5nIENvbnN0YW50VmFsdWVEZWNvcmF0b3IoCisgICAgY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHR5cGUsCisgICAgY29uc3Qgc3RkOjp2YXJpYW50PHN0ZDo6c3RyaW5nLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4+JiByYXdfdmFsdWUpOwogCiAvLyBSZXR1cm5zIHRoZSBKYXZhIHR5cGUgc2lnbmF0dXJlIG9mIHRoZSBBSURMIHR5cGUgc3BlYwogLy8gVGhpcyBpbmNsdWRlcyBnZW5lcmljIHR5cGUgcGFyYW1ldGVycyB3aXRoIGFycmF5IG1vZGlmaWVycy4KLXN0cmluZyBKYXZhU2lnbmF0dXJlT2YoY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIGFpZGwsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcyk7CitzdHJpbmcgSmF2YVNpZ25hdHVyZU9mKGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiBhaWRsKTsKKworLy8gUmV0dXJucyB0aGUgSmF2YSBib3hpbmcgdHlwZSBvZiB0aGUgQUlETCB0eXBlIHNwZWMuCisvLyBhaWRsIHR5cGUgc2hvdWxkIGJlIGEgcHJpbWl0aXZlIHR5cGUuCitzdHJpbmcgSmF2YUJveGluZ1R5cGVPZihjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgYWlkbCk7CiAKIC8vIFJldHVybnMgdGhlIGluc3RhbnRpYWJsZSBKdmEgdHlwZSBzaWduYXR1cmUgb2YgdGhlIEFJREwgdHlwZSBzcGVjCiAvLyBUaGlzIGluY2x1ZGVzIGdlbmVyaWMgdHlwZSBwYXJhbWV0ZXJzLCBidXQgZXhjbHVkZXMgYXJyYXkgbW9kaWZpZXJzLgotc3RyaW5nIEluc3RhbnRpYWJsZUphdmFTaWduYXR1cmVPZihjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgYWlkbCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzKTsKK3N0cmluZyBJbnN0YW50aWFibGVKYXZhU2lnbmF0dXJlT2YoY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIGFpZGwpOwogCiAvLyBSZXR1cm5zIHRoZSBkZWZhdWx0IEphdmEgdmFsdWUgb2YgdGhlIEFJREwgdHlwZSBzcGVjCi1zdHJpbmcgRGVmYXVsdEphdmFWYWx1ZU9mKGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiBhaWRsLCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMpOworc3RyaW5nIERlZmF1bHRKYXZhVmFsdWVPZihjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgYWlkbCk7CiAKIC8vIFRoaXMgY2FycmllcyBpbmZvcm1hdGlvbiB0aGF0IGlzIHJlcXVpcmVkIHRvIGdlbmVyYXRlIGNvZGUgZm9yCiAvLyBtYXJzaGFsbGluZyBhbmQgdW5tYXJzaGFsbGluZyBhIG1ldGhvZCBhcmd1bWVudCBvciBhIHBhcmNlbGFibGUgZmllbGQKQEAgLTYwLDEyICs2NiwxMiBAQAogICBjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZTsKICAgY29uc3Qgc3RyaW5nIHBhcmNlbDsKICAgY29uc3Qgc3RyaW5nIHZhcjsKLQotICAvLyBTZXQgdG8gdHJ1ZSB3aGVuIHRoZSBtYXJzaGFsbGVkIGRhdGEgd2lsbCBiZSByZXR1cm5lZCB0byB0aGUgY2xpZW50CisgIGNvbnN0IHVpbnQzMl90IG1pbl9zZGtfdmVyc2lvbjsKKyAgLy8gU2V0IFBBUkNFTEFCTEVfV1JJVEVfUkVUVVJOX1ZBTFVFIHdoZW4gdGhlIG1hcnNoYWxsZWQgZGF0YSB3aWxsIGJlIHJldHVybmVkIHRvIHRoZSBjbGllbnQuCiAgIC8vIFRoaXMgaXMgZ2l2ZW4gYXMgYSBoaW50IHRvIHRoZSBQYXJjZWxhYmxlIHRoYXQgaXMgYmVpbmcgbWFyc2hhbGxlZAogICAvLyBzbyB0aGF0IHRoZSBQYXJjZWxhYmxlIGNhbiByZWxlYXNlIGl0cyByZXNvdXJjZSBhZnRlciB0aGUgbWFyc2hhbGxpbmcKICAgLy8gaXMgZG9uZS4KLSAgY29uc3QgYm9vbCBpc19yZXR1cm5fdmFsdWU7CisgIGNvbnN0IHN0cmluZyB3cml0ZV90b19wYXJjZWxfZmxhZzsKIAogICAvLyBNb3N0IG9mIHRoZSB2YXJpYWJsZXMgY3JlYXRlZCBieSBBSURMIGNvbXBpbGVyIGFyZSB0eXBlZCwgaS5lLiwgdGhlIGNvZGUKICAgLy8ga25vd3MgZXhhY3RseSB3aGF0IHR5cGUgb2Ygb2JqZWN0IGlzIGluIHRoZSBwYXJjZWwgLS0gYmVjYXVzZSB0aGUgcGFyY2VsCkBAIC04MywxMyArODksMTAgQEAKICAgLy8gV2UgZW1pdCB0aGUgY29kZSBhdCBtb3N0IG9uY2UgcGVyIGFuIEFJREwgbWV0aG9kLCBvdGhlcndpc2Ugd2UgYXJlIHdhc3RpbmcKICAgLy8gdGltZSBkb2luZyB0aGUgc2FtZSB0aGluZyBtdWx0aXBsZSB0aW1lLgogICBib29sKiBjb25zdCBpc19jbGFzc2xvYWRlcl9jcmVhdGVkOwotCi0gIC8vIGZvciBlcnJvciBtZXNzYWdlIHByaW50aW5nCi0gIGNvbnN0IHN0cmluZyBmaWxlbmFtZTsKIH07CiAKIC8vIFdyaXRlcyBjb2RlIGZyYWdtZW50IHRoYXQgd3JpdGVzIGEgdmFyaWFibGUgdG8gdGhlIHBhcmNlbC4KLWJvb2wgV3JpdGVUb1BhcmNlbEZvcihjb25zdCBDb2RlR2VuZXJhdG9yQ29udGV4dCYgYyk7Cit2b2lkIFdyaXRlVG9QYXJjZWxGb3IoY29uc3QgQ29kZUdlbmVyYXRvckNvbnRleHQmIGMpOwogCiAvLyBXcml0ZXMgY29kZSBmcmFnbWVudCB0aGF0IHJlYWRzIGRhdGEgZnJvbSB0aGUgcGFyY2VsIGludG8gYSB2YXJpYWJsZS4gV2hlbgogLy8gdGhlIHZhcmlhYmxlIHR5cGUgaXMgYXJyYXkgb3IgTGlzdCwgdGhlIGFycmF5IG9yIExpc3QgaXMgY3JlYXRlZC4KQEAgLTEwMyw2ICsxMDYsMTAgQEAKIC8vIGluIGEgcGFyY2VsYWJsZQogdm9pZCBUb1N0cmluZ0Zvcihjb25zdCBDb2RlR2VuZXJhdG9yQ29udGV4dCYgYyk7CiAKKy8vIEdlbmVyYXRlcyBjcmVhdGUvcmVhZC93cml0ZSBoZWxwZXIgZnVuY3Rpb25zIHdoaWNoIGFyZSBtaXNzaW5nIGluIFBhcmNlbC4KK3ZvaWQgR2VuZXJhdGVQYXJjZWxIZWxwZXJzKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbERlZmluZWRUeXBlJiBkZWZpbmVkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKKwogfSAgLy8gbmFtZXNwYWNlIGphdmEKIH0gIC8vIG5hbWVzcGFjZSBhaWRsCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYWlkbF90b19uZGsuY3BwIGIvYWlkbF90b19uZGsuY3BwCmluZGV4IDlkMWI3OTQuLmFkY2Q0NTEgMTAwNjQ0Ci0tLSBhL2FpZGxfdG9fbmRrLmNwcAorKysgYi9haWRsX3RvX25kay5jcHAKQEAgLTI0LDExICsyNCwxNSBAQAogI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiAKIHVzaW5nIDo6YW5kcm9pZDo6YmFzZTo6Sm9pbjsKK3VzaW5nIDo6YW5kcm9pZDo6YmFzZTo6U3BsaXQ7CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBhaWRsIHsKIG5hbWVzcGFjZSBuZGsgewogCitzdGF0aWMgY29uc3QgQWlkbFR5cGVTcGVjaWZpZXIga0ludFR5cGV7QUlETF9MT0NBVElPTl9IRVJFLCAiaW50IiwgLyphcnJheT0qL3N0ZDo6bnVsbG9wdCwgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tZW50c3t9fTsKKwogc3RkOjpzdHJpbmcgTmRrSGVhZGVyRmlsZShjb25zdCBBaWRsRGVmaW5lZFR5cGUmIGRlZmluZWRfdHlwZSwgY3BwOjpDbGFzc05hbWVzIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlX29zX3NlcCkgewogICBjaGFyIHNlcGVyYXRvciA9ICh1c2Vfb3Nfc2VwKSA/IE9TX1BBVEhfU0VQQVJBVE9SIDogJy8nOwpAQCAtMzcsMzkyICs0MSwxNjIgQEAKIAogLy8gVGhpcyByZXByZXNlbnRzIGEgdHlwZSBpbiBBSURMIChlLmcuICdTdHJpbmcnIHdoaWNoIGNhbiBiZSByZWZlcmVuY2VkIGluIG11bHRpcGxlIHdheXMpCiBzdHJ1Y3QgVHlwZUluZm8gewotICBzdHJ1Y3QgQXNwZWN0IHsKLSAgICAvLyBuYW1lIG9mIHRoZSB0eXBlIGluIEMrKyBvdXRwdXQKLSAgICBzdGQ6OnN0cmluZyBjcHBfbmFtZTsKLSAgICAvLyB3aGV0aGVyIHRvIHByZWZlciAndmFsdWUgdHlwZScgb3ZlciAnY29uc3QmJwotICAgIGJvb2wgdmFsdWVfaXNfY2hlYXA7Ci0KLSAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgQ29kZUdlbmVyYXRvckNvbnRleHQmIGMpPiByZWFkX2Z1bmM7Ci0gICAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IENvZGVHZW5lcmF0b3JDb250ZXh0JiBjKT4gd3JpdGVfZnVuYzsKLSAgfTsKLQotICAvLyBlLmcuICdTdHJpbmcnCi0gIEFzcGVjdCByYXc7Ci0KLSAgLy8gZS5nLiAnU3RyaW5nW10nCi0gIHN0ZDo6c2hhcmVkX3B0cjxBc3BlY3Q+IGFycmF5OwotCi0gIC8vIG5vdGU6IE51bGxhYmxlIHR5cGVzIGRvIG5vdCBleGlzdCBpbiBKYXZhLiBGb3IgbW9zdCBKYXZhIHR5cGVzLCB0aGUgdHlwZSBpcyBzcGxpdCBpbnRvIGEKLSAgLy8gbnVsbGFibGUgYW5kIG5vbi1udWxsYWJsZSB2YXJpYW50LiBUaGlzIGlzIGJlY2F1c2UgQysrIHR5cGVzIGFyZSBtb3JlIHVzdWFsbHkgbm9uLW51bGxhYmxlLCBidXQKLSAgLy8gZXZlcnl0aGluZyBpbiBKYXZhIGlzIG5vbi1udWxsYWJsZS4gVGhpcyBkb2VzIG1lYW4gdGhhdCBzb21lIEphdmEgaW50ZXJmYWNlcyBtYXkgaGF2ZSB0byBoYXZlCi0gIC8vICdAbnVsbGFibGUnIGFkZGVkIHRvIHRoZW0gaW4gb3JkZXIgdG8gZnVuY3Rpb24gYXMgZXhwZWN0ZWQgdy8gdGhlIE5ESy4gSXQgYWxzbyBtZWFucyB0aGF0IHNvbWUKLSAgLy8gdHJhbnNhY3Rpb25zIHdpbGwgYmUgYWxsb3dlZCBpbiBKYXZhIHdoaWNoIGFyZSBub3QgYWxsb3dlZCBpbiBDKysuIEhvd2V2ZXIsIGluIEphdmEsIGlmIGEgbnVsbAotICAvLyBpcyBpZ25vcmVkLCBpdCB3aWxsIGp1c3QgcmVzdWx0IGluIGEgTnVsbFBvaW50ZXJFeGNlcHRpb24gYW5kIGJlIGRlbGl2ZXJlZCB0byB0aGUgb3RoZXIgc2lkZS4KLSAgLy8gQysrIGRvZXMgbm90IGhhdmUgdGhpcyBzYW1lIGNhcGFjaXR5IChpbiBBbmRyb2lkKSwgYW5kIHNvIGluc3RlYWQsIHdlIGRpc3Rpbmd1aXNoIG51bGxhYmlsaXR5Ci0gIC8vIGluIHRoZSB0eXBlIHN5c3RlbS4KLQotICAvLyBlLmcuICdAbnVsbGFibGUgU3RyaW5nJwotICBzdGQ6OnNoYXJlZF9wdHI8QXNwZWN0PiBudWxsYWJsZTsKLQotICAvLyBlLmcuICdAbnVsbGFibGUgU3RyaW5nW10nCi0gIHN0ZDo6c2hhcmVkX3B0cjxBc3BlY3Q+IG51bGxhYmxlX2FycmF5OworICAvLyBuYW1lIG9mIHRoZSB0eXBlIGluIEMrKyBvdXRwdXQKKyAgc3RkOjpzdHJpbmcgY3BwX25hbWU7CisgIC8vIHdoZXRoZXIgdG8gcHJlZmVyICd2YWx1ZSB0eXBlJyBvdmVyICdjb25zdCYnCisgIGJvb2wgdmFsdWVfaXNfY2hlYXAgPSBmYWxzZTsKIH07CiAKLXN0ZDo6c3RyaW5nIENvbnN0YW50VmFsdWVEZWNvcmF0b3IoY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiByYXdfdmFsdWUpIHsKLSAgaWYgKHR5cGUuSXNBcnJheSgpKSB7Ci0gICAgcmV0dXJuIHJhd192YWx1ZTsKLSAgfQotCi0gIGlmICh0eXBlLkdldE5hbWUoKSA9PSAibG9uZyIgJiYgIXR5cGUuSXNBcnJheSgpKSB7Ci0gICAgcmV0dXJuIHJhd192YWx1ZSArICJMIjsKLSAgfQotCi0gIGlmIChhdXRvIGRlZmluZWRfdHlwZSA9IHR5cGUuR2V0RGVmaW5lZFR5cGUoKTsgZGVmaW5lZF90eXBlKSB7Ci0gICAgYXV0byBlbnVtX3R5cGUgPSBkZWZpbmVkX3R5cGUtPkFzRW51bURlY2xhcmF0aW9uKCk7Ci0gICAgQUlETF9GQVRBTF9JRighZW51bV90eXBlLCB0eXBlKSA8PCAiSW52YWxpZCB0eXBlIGZvciBcIiIgPDwgcmF3X3ZhbHVlIDw8ICJcIiI7Ci0gICAgcmV0dXJuIE5ka0Z1bGxDbGFzc05hbWUoKmVudW1fdHlwZSwgY3BwOjpDbGFzc05hbWVzOjpSQVcpICsKLSAgICAgICAgICAgIjo6IiArIHJhd192YWx1ZS5zdWJzdHIocmF3X3ZhbHVlLmZpbmRfbGFzdF9vZignLicpICsgMSk7Ci0gIH0KLQotICByZXR1cm4gcmF3X3ZhbHVlOworc3RkOjpzdHJpbmcgQ29uc3RhbnRWYWx1ZURlY29yYXRvcigKKyAgICBjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSwKKyAgICBjb25zdCBzdGQ6OnZhcmlhbnQ8c3RkOjpzdHJpbmcsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPj4mIHJhd192YWx1ZSkgeworICByZXR1cm4gY3BwOjpDcHBDb25zdGFudFZhbHVlRGVjb3JhdG9yKHR5cGUsIHJhd192YWx1ZSwgLyppc19uZGs9Ki90cnVlKTsKIH07CiAKLXN0YXRpYyBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgQ29kZUdlbmVyYXRvckNvbnRleHQmIGMpPiBTdGFuZGFyZFJlYWQoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsKLSAgcmV0dXJuIFtuYW1lXShjb25zdCBDb2RlR2VuZXJhdG9yQ29udGV4dCYgYykgewotICAgIGMud3JpdGVyIDw8IG5hbWUgPDwgIigiIDw8IGMucGFyY2VsIDw8ICIsICIgPDwgYy52YXIgPDwgIikiOwotICB9OwotfQotc3RhdGljIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBDb2RlR2VuZXJhdG9yQ29udGV4dCYgYyk+IFN0YW5kYXJkV3JpdGUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsKLSAgcmV0dXJuIFtuYW1lXShjb25zdCBDb2RlR2VuZXJhdG9yQ29udGV4dCYgYykgewotICAgIGMud3JpdGVyIDw8IG5hbWUgPDwgIigiIDw8IGMucGFyY2VsIDw8ICIsICIgPDwgYy52YXIgPDwgIikiOwotICB9OwotfQotCi1UeXBlSW5mbyBQcmltaXRpdmVUeXBlKGNvbnN0IHN0ZDo6c3RyaW5nJiBjcHBfbmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHByZXR0eV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiYgY3BwX25hbWVfZm9yX2FycmF5X29wdCA9IHN0ZDo6bnVsbG9wdCkgewotICBzdGQ6OnN0cmluZyBjcHBfbmFtZV9mb3JfYXJyYXkgPSBjcHBfbmFtZV9mb3JfYXJyYXlfb3B0LnZhbHVlX29yKGNwcF9uYW1lKTsKLSAgcmV0dXJuIFR5cGVJbmZvewotICAgICAgLnJhdyA9Ci0gICAgICAgICAgVHlwZUluZm86OkFzcGVjdHsKLSAgICAgICAgICAgICAgLmNwcF9uYW1lID0gY3BwX25hbWUsCi0gICAgICAgICAgICAgIC52YWx1ZV9pc19jaGVhcCA9IHRydWUsCi0gICAgICAgICAgICAgIC5yZWFkX2Z1bmMgPSBTdGFuZGFyZFJlYWQoIkFQYXJjZWxfcmVhZCIgKyBwcmV0dHlfbmFtZSksCi0gICAgICAgICAgICAgIC53cml0ZV9mdW5jID0gU3RhbmRhcmRXcml0ZSgiQVBhcmNlbF93cml0ZSIgKyBwcmV0dHlfbmFtZSksCi0gICAgICAgICAgfSwKLSAgICAgIC5hcnJheSA9IHN0ZDo6c2hhcmVkX3B0cjxUeXBlSW5mbzo6QXNwZWN0PihuZXcgVHlwZUluZm86OkFzcGVjdHsKLSAgICAgICAgICAuY3BwX25hbWUgPSAic3RkOjp2ZWN0b3I8IiArIGNwcF9uYW1lX2Zvcl9hcnJheSArICI+IiwKLSAgICAgICAgICAudmFsdWVfaXNfY2hlYXAgPSBmYWxzZSwKLSAgICAgICAgICAucmVhZF9mdW5jID0gU3RhbmRhcmRSZWFkKCI6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yIiksCi0gICAgICAgICAgLndyaXRlX2Z1bmMgPSBTdGFuZGFyZFdyaXRlKCI6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvciIpLAotICAgICAgfSksCi0gICAgICAubnVsbGFibGUgPSBudWxscHRyLAotICAgICAgLm51bGxhYmxlX2FycmF5ID0gc3RkOjpzaGFyZWRfcHRyPFR5cGVJbmZvOjpBc3BlY3Q+KG5ldyBUeXBlSW5mbzo6QXNwZWN0ewotICAgICAgICAgIC5jcHBfbmFtZSA9ICJzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPCIgKyBjcHBfbmFtZV9mb3JfYXJyYXkgKyAiPj4iLAotICAgICAgICAgIC52YWx1ZV9pc19jaGVhcCA9IGZhbHNlLAotICAgICAgICAgIC5yZWFkX2Z1bmMgPSBTdGFuZGFyZFJlYWQoIjo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IiKSwKLSAgICAgICAgICAud3JpdGVfZnVuYyA9IFN0YW5kYXJkV3JpdGUoIjo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yIiksCi0gICAgICB9KSwKLSAgfTsKLX0KLQotVHlwZUluZm8gSW50ZXJmYWNlVHlwZUluZm8oY29uc3QgQWlkbEludGVyZmFjZSYgdHlwZSkgewotICBjb25zdCBzdGQ6OnN0cmluZyBjbGF6eiA9IE5ka0Z1bGxDbGFzc05hbWUodHlwZSwgY3BwOjpDbGFzc05hbWVzOjpJTlRFUkZBQ0UpOwotCi0gIHJldHVybiBUeXBlSW5mb3sKLSAgICAgIC5yYXcgPQotICAgICAgICAgIFR5cGVJbmZvOjpBc3BlY3R7Ci0gICAgICAgICAgICAgIC5jcHBfbmFtZSA9ICJzdGQ6OnNoYXJlZF9wdHI8IiArIGNsYXp6ICsgIj4iLAotICAgICAgICAgICAgICAudmFsdWVfaXNfY2hlYXAgPSBmYWxzZSwKLSAgICAgICAgICAgICAgLnJlYWRfZnVuYyA9IFN0YW5kYXJkUmVhZChjbGF6eiArICI6OnJlYWRGcm9tUGFyY2VsIiksCi0gICAgICAgICAgICAgIC53cml0ZV9mdW5jID0gU3RhbmRhcmRXcml0ZShjbGF6eiArICI6OndyaXRlVG9QYXJjZWwiKSwKLSAgICAgICAgICB9LAotICAgICAgLmFycmF5ID0gbnVsbHB0ciwKLSAgICAgIC5udWxsYWJsZSA9IHN0ZDo6c2hhcmVkX3B0cjxUeXBlSW5mbzo6QXNwZWN0PihuZXcgVHlwZUluZm86OkFzcGVjdHsKLSAgICAgICAgICAuY3BwX25hbWUgPSAic3RkOjpzaGFyZWRfcHRyPCIgKyBjbGF6eiArICI+IiwKLSAgICAgICAgICAudmFsdWVfaXNfY2hlYXAgPSBmYWxzZSwKLSAgICAgICAgICAucmVhZF9mdW5jID0gU3RhbmRhcmRSZWFkKGNsYXp6ICsgIjo6cmVhZEZyb21QYXJjZWwiKSwKLSAgICAgICAgICAud3JpdGVfZnVuYyA9IFN0YW5kYXJkV3JpdGUoY2xhenogKyAiOjp3cml0ZVRvUGFyY2VsIiksCi0gICAgICB9KSwKLSAgICAgIC5udWxsYWJsZV9hcnJheSA9IG51bGxwdHIsCi0gIH07Ci19Ci0KLVR5cGVJbmZvIFBhcmNlbGFibGVUeXBlSW5mbyhjb25zdCBBaWRsUGFyY2VsYWJsZSYgdHlwZSwgY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHR5cGVTcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzKSB7Ci0gIHN0ZDo6c3RyaW5nIGNsYXp6ID0gTmRrRnVsbENsYXNzTmFtZSh0eXBlLCBjcHA6OkNsYXNzTmFtZXM6OlJBVyk7Ci0gIHN0ZDo6c3RyaW5nIHRlbXBsYXRlX3BhcmFtcyA9ICIiOwotICBpZiAodHlwZVNwZWMuSXNHZW5lcmljKCkpIHsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdHlwZV9wYXJhbXM7Ci0gICAgZm9yIChjb25zdCBhdXRvJiBwYXJhbWV0ZXIgOiB0eXBlU3BlYy5HZXRUeXBlUGFyYW1ldGVycygpKSB7Ci0gICAgICB0eXBlX3BhcmFtcy5wdXNoX2JhY2soTmRrTmFtZU9mKHR5cGVzLCAqcGFyYW1ldGVyLCBTdG9yYWdlTW9kZTo6U1RBQ0spKTsKLSAgICB9Ci0gICAgY2xhenogKz0gYmFzZTo6U3RyaW5nUHJpbnRmKCI8JXM+IiwgYmFzZTo6Sm9pbih0eXBlX3BhcmFtcywgIiwgIikuY19zdHIoKSk7Ci0gIH0KLSAgcmV0dXJuIFR5cGVJbmZvewotICAgICAgLnJhdyA9Ci0gICAgICAgICAgVHlwZUluZm86OkFzcGVjdHsKLSAgICAgICAgICAgICAgLmNwcF9uYW1lID0gY2xhenosCi0gICAgICAgICAgICAgIC52YWx1ZV9pc19jaGVhcCA9IGZhbHNlLAotICAgICAgICAgICAgICAucmVhZF9mdW5jID0gU3RhbmRhcmRSZWFkKCI6Om5kazo6QVBhcmNlbF9yZWFkUGFyY2VsYWJsZSIpLAotICAgICAgICAgICAgICAud3JpdGVfZnVuYyA9IFN0YW5kYXJkV3JpdGUoIjo6bmRrOjpBUGFyY2VsX3dyaXRlUGFyY2VsYWJsZSIpLAotICAgICAgICAgIH0sCi0gICAgICAuYXJyYXkgPSBzdGQ6OnNoYXJlZF9wdHI8VHlwZUluZm86OkFzcGVjdD4obmV3IFR5cGVJbmZvOjpBc3BlY3R7Ci0gICAgICAgICAgLmNwcF9uYW1lID0gInN0ZDo6dmVjdG9yPCIgKyBjbGF6eiArICI+IiwKLSAgICAgICAgICAudmFsdWVfaXNfY2hlYXAgPSBmYWxzZSwKLSAgICAgICAgICAucmVhZF9mdW5jID0gU3RhbmRhcmRSZWFkKCI6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yIiksCi0gICAgICAgICAgLndyaXRlX2Z1bmMgPSBTdGFuZGFyZFdyaXRlKCI6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvciIpLAotICAgICAgfSksCi0gICAgICAubnVsbGFibGUgPSBzdGQ6OnNoYXJlZF9wdHI8VHlwZUluZm86OkFzcGVjdD4obmV3IFR5cGVJbmZvOjpBc3BlY3R7Ci0gICAgICAgICAgLmNwcF9uYW1lID0gInN0ZDo6b3B0aW9uYWw8IiArIGNsYXp6ICsgIj4iLAotICAgICAgICAgIC52YWx1ZV9pc19jaGVhcCA9IGZhbHNlLAotICAgICAgICAgIC5yZWFkX2Z1bmMgPSBTdGFuZGFyZFJlYWQoIjo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZVBhcmNlbGFibGUiKSwKLSAgICAgICAgICAud3JpdGVfZnVuYyA9IFN0YW5kYXJkV3JpdGUoIjo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVQYXJjZWxhYmxlIiksCi0gICAgICB9KSwKLSAgICAgIC5udWxsYWJsZV9hcnJheSA9IG51bGxwdHIsCi0gIH07Ci19Ci0KLVR5cGVJbmZvIEVudW1EZWNsYXJhdGlvblR5cGVJbmZvKGNvbnN0IEFpZGxFbnVtRGVjbGFyYXRpb24mIGVudW1fZGVjbCkgewotICBjb25zdCBzdGQ6OnN0cmluZyBjbGF6eiA9IE5ka0Z1bGxDbGFzc05hbWUoZW51bV9kZWNsLCBjcHA6OkNsYXNzTmFtZXM6OlJBVyk7Ci0KLSAgc3RhdGljIG1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IGtBUGFyY2VsVHlwZU5hbWVNYXAgPSB7Ci0gICAgICB7ImJ5dGUiLCAiQnl0ZSJ9LAotICAgICAgeyJpbnQiLCAiSW50MzIifSwKLSAgICAgIHsibG9uZyIsICJJbnQ2NCJ9LAotICB9OwotICBhdXRvIGFwYXJjZWxfbmFtZV9pdCA9IGtBUGFyY2VsVHlwZU5hbWVNYXAuZmluZChlbnVtX2RlY2wuR2V0QmFja2luZ1R5cGUoKS5HZXROYW1lKCkpOwotICBBSURMX0ZBVEFMX0lGKGFwYXJjZWxfbmFtZV9pdCA9PSBrQVBhcmNlbFR5cGVOYW1lTWFwLmVuZCgpLCBlbnVtX2RlY2wpOwotICBjb25zdCBzdGQ6OnN0cmluZyBhcGFyY2VsX25hbWUgPSBhcGFyY2VsX25hbWVfaXQtPnNlY29uZDsKLQotICBjb25zdCBzdGQ6OnN0cmluZyBiYWNraW5nX3R5cGVfbmFtZSA9Ci0gICAgICBOZGtOYW1lT2YoQWlkbFR5cGVuYW1lcygpLCBlbnVtX2RlY2wuR2V0QmFja2luZ1R5cGUoKSwgU3RvcmFnZU1vZGU6OlNUQUNLKTsKLQotICByZXR1cm4gVHlwZUluZm97Ci0gICAgICAucmF3ID0gVHlwZUluZm86OkFzcGVjdHsKLSAgICAgICAgICAuY3BwX25hbWUgPSBjbGF6eiwKLSAgICAgICAgICAudmFsdWVfaXNfY2hlYXAgPSB0cnVlLAotICAgICAgICAgIC5yZWFkX2Z1bmMgPQotICAgICAgICAgICAgICBbYXBhcmNlbF9uYW1lLCBiYWNraW5nX3R5cGVfbmFtZV0oY29uc3QgQ29kZUdlbmVyYXRvckNvbnRleHQmIGMpIHsKLSAgICAgICAgICAgICAgICBjLndyaXRlciA8PCAiQVBhcmNlbF9yZWFkIiA8PCBhcGFyY2VsX25hbWUgPDwgIigiIDw8IGMucGFyY2VsCi0gICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgcmVpbnRlcnByZXRfY2FzdDwiIDw8IGJhY2tpbmdfdHlwZV9uYW1lIDw8ICIqPigiIDw8IGMudmFyIDw8ICIpKSI7Ci0gICAgICAgICAgICAgIH0sCi0gICAgICAgICAgLndyaXRlX2Z1bmMgPQotICAgICAgICAgICAgICBbYXBhcmNlbF9uYW1lLCBiYWNraW5nX3R5cGVfbmFtZV0oY29uc3QgQ29kZUdlbmVyYXRvckNvbnRleHQmIGMpIHsKLSAgICAgICAgICAgICAgICBjLndyaXRlciA8PCAiQVBhcmNlbF93cml0ZSIgPDwgYXBhcmNlbF9uYW1lIDw8ICIoIiA8PCBjLnBhcmNlbCA8PCAiLCBzdGF0aWNfY2FzdDwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgPDwgYmFja2luZ190eXBlX25hbWUgPDwgIj4oIiA8PCBjLnZhciA8PCAiKSkiOwotICAgICAgICAgICAgICB9LAotICAgICAgfSwKLSAgICAgIC5hcnJheSA9IHN0ZDo6c2hhcmVkX3B0cjxUeXBlSW5mbzo6QXNwZWN0PihuZXcgVHlwZUluZm86OkFzcGVjdHsKLSAgICAgICAgICAuY3BwX25hbWUgPSAic3RkOjp2ZWN0b3I8IiArIGNsYXp6ICsgIj4iLAotICAgICAgICAgIC52YWx1ZV9pc19jaGVhcCA9IGZhbHNlLAotICAgICAgICAgIC5yZWFkX2Z1bmMgPQotICAgICAgICAgICAgICBbYXBhcmNlbF9uYW1lLCBiYWNraW5nX3R5cGVfbmFtZV0oY29uc3QgQ29kZUdlbmVyYXRvckNvbnRleHQmIGMpIHsKLSAgICAgICAgICAgICAgICBjLndyaXRlciA8PCAiQVBhcmNlbF9yZWFkIiA8PCBhcGFyY2VsX25hbWUgPDwgIkFycmF5KCIgPDwgYy5wYXJjZWwKLSAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBzdGF0aWNfY2FzdDx2b2lkKj4oIiA8PCBjLnZhcgotICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIpLCBuZGs6OkFQYXJjZWxfc3RkVmVjdG9yQWxsb2NhdG9yPCIgPDwgYmFja2luZ190eXBlX25hbWUgPDwgIj4pIjsKLSAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAud3JpdGVfZnVuYyA9Ci0gICAgICAgICAgICAgIFthcGFyY2VsX25hbWUsIGJhY2tpbmdfdHlwZV9uYW1lXShjb25zdCBDb2RlR2VuZXJhdG9yQ29udGV4dCYgYykgewotICAgICAgICAgICAgICAgIGMud3JpdGVyIDw8ICJBUGFyY2VsX3dyaXRlIiA8PCBhcGFyY2VsX25hbWUgPDwgIkFycmF5KCIgPDwgYy5wYXJjZWwKLSAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCByZWludGVycHJldF9jYXN0PGNvbnN0ICIgPDwgYmFja2luZ190eXBlX25hbWUgPDwgIio+KCIgPDwgYy52YXIKLSAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLmRhdGEoKSksICIgPDwgYy52YXIgPDwgIi5zaXplKCkpIjsKLSAgICAgICAgICAgICAgfSwKLSAgICAgIH0pLAotICAgICAgLm51bGxhYmxlID0gbnVsbHB0ciwKLSAgICAgIC5udWxsYWJsZV9hcnJheSA9IHN0ZDo6c2hhcmVkX3B0cjxUeXBlSW5mbzo6QXNwZWN0PihuZXcgVHlwZUluZm86OkFzcGVjdHsKLSAgICAgICAgICAuY3BwX25hbWUgPSAic3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjwiICsgY2xhenogKyAiPj4iLAotICAgICAgICAgIC52YWx1ZV9pc19jaGVhcCA9IGZhbHNlLAotICAgICAgICAgIC5yZWFkX2Z1bmMgPQotICAgICAgICAgICAgICBbYXBhcmNlbF9uYW1lLCBiYWNraW5nX3R5cGVfbmFtZV0oY29uc3QgQ29kZUdlbmVyYXRvckNvbnRleHQmIGMpIHsKLSAgICAgICAgICAgICAgICBjLndyaXRlciA8PCAiQVBhcmNlbF9yZWFkIiA8PCBhcGFyY2VsX25hbWUgPDwgIkFycmF5KCIgPDwgYy5wYXJjZWwKLSAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBzdGF0aWNfY2FzdDx2b2lkKj4oIiA8PCBjLnZhcgotICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIpLCBuZGs6OkFQYXJjZWxfbnVsbGFibGVTdGRWZWN0b3JBbGxvY2F0b3I8IiA8PCBiYWNraW5nX3R5cGVfbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICI+KSI7Ci0gICAgICAgICAgICAgIH0sCi0gICAgICAgICAgLndyaXRlX2Z1bmMgPQotICAgICAgICAgICAgICBbYXBhcmNlbF9uYW1lLCBiYWNraW5nX3R5cGVfbmFtZV0oY29uc3QgQ29kZUdlbmVyYXRvckNvbnRleHQmIGMpIHsKLSAgICAgICAgICAgICAgICAvLyBJZiB0aGUgdmFyIGV4aXN0cywgdXNlIHdyaXRlQXJyYXkgd2l0aCBkYXRhKCkgYW5kIHNpemUoKS4KLSAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIHVzZSBudWxscHRyIGFuZCAtMS4KLSAgICAgICAgICAgICAgICBjLndyaXRlciA8PCAiQVBhcmNlbF93cml0ZSIgPDwgYXBhcmNlbF9uYW1lIDw8ICJBcnJheSgiIDw8IGMucGFyY2VsIDw8ICIsICgiCi0gICAgICAgICAgICAgICAgICAgICAgICAgPDwgYy52YXIgPDwgIiA/IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgIiA8PCBiYWNraW5nX3R5cGVfbmFtZSA8PCAiKj4oIgotICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGMudmFyIDw8ICItPmRhdGEoKSkgOiBudWxscHRyKSIKLSAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCAoIiA8PCBjLnZhciA8PCAiID8gIiA8PCBjLnZhciA8PCAiLT5zaXplKCkgOiAtMSkpIjsKLSAgICAgICAgICAgICAgfSwKLSAgICAgIH0pLAotICB9OwotfQotCiAvLyBtYXAgZnJvbSBBSURMIGJ1aWx0LWluIHR5cGUgbmFtZSB0byB0aGUgY29ycmVzcG9uZGluZyBOZGsgdHlwZSBpbmZvCiBzdGF0aWMgbWFwPHN0ZDo6c3RyaW5nLCBUeXBlSW5mbz4ga05ka1R5cGVJbmZvTWFwID0gewotICAgIHsidm9pZCIsIFR5cGVJbmZve3sidm9pZCIsIHRydWUsIG51bGxwdHIsIG51bGxwdHJ9LCBudWxscHRyLCBudWxscHRyLCBudWxscHRyfX0sCi0gICAgeyJib29sZWFuIiwgUHJpbWl0aXZlVHlwZSgiYm9vbCIsICJCb29sIil9LAotICAgIHsiYnl0ZSIsIFByaW1pdGl2ZVR5cGUoImludDhfdCIsICJCeXRlIiwgInVpbnQ4X3QiKX0sCi0gICAgeyJjaGFyIiwgUHJpbWl0aXZlVHlwZSgiY2hhcjE2X3QiLCAiQ2hhciIpfSwKLSAgICB7ImludCIsIFByaW1pdGl2ZVR5cGUoImludDMyX3QiLCAiSW50MzIiKX0sCi0gICAgeyJsb25nIiwgUHJpbWl0aXZlVHlwZSgiaW50NjRfdCIsICJJbnQ2NCIpfSwKLSAgICB7ImZsb2F0IiwgUHJpbWl0aXZlVHlwZSgiZmxvYXQiLCAiRmxvYXQiKX0sCi0gICAgeyJkb3VibGUiLCBQcmltaXRpdmVUeXBlKCJkb3VibGUiLCAiRG91YmxlIil9LAotICAgIHsiU3RyaW5nIiwKLSAgICAgVHlwZUluZm97Ci0gICAgICAgICAucmF3ID0KLSAgICAgICAgICAgICBUeXBlSW5mbzo6QXNwZWN0ewotICAgICAgICAgICAgICAgICAuY3BwX25hbWUgPSAic3RkOjpzdHJpbmciLAotICAgICAgICAgICAgICAgICAudmFsdWVfaXNfY2hlYXAgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgLnJlYWRfZnVuYyA9IFN0YW5kYXJkUmVhZCgiOjpuZGs6OkFQYXJjZWxfcmVhZFN0cmluZyIpLAotICAgICAgICAgICAgICAgICAud3JpdGVfZnVuYyA9IFN0YW5kYXJkV3JpdGUoIjo6bmRrOjpBUGFyY2VsX3dyaXRlU3RyaW5nIiksCi0gICAgICAgICAgICAgfSwKLSAgICAgICAgIC5hcnJheSA9IHN0ZDo6c2hhcmVkX3B0cjxUeXBlSW5mbzo6QXNwZWN0PihuZXcgVHlwZUluZm86OkFzcGVjdHsKLSAgICAgICAgICAgICAuY3BwX25hbWUgPSAic3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IiwKLSAgICAgICAgICAgICAudmFsdWVfaXNfY2hlYXAgPSBmYWxzZSwKLSAgICAgICAgICAgICAucmVhZF9mdW5jID0gU3RhbmRhcmRSZWFkKCI6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yIiksCi0gICAgICAgICAgICAgLndyaXRlX2Z1bmMgPSBTdGFuZGFyZFdyaXRlKCI6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvciIpLAotICAgICAgICAgfSksCi0gICAgICAgICAubnVsbGFibGUgPSBzdGQ6OnNoYXJlZF9wdHI8VHlwZUluZm86OkFzcGVjdD4obmV3IFR5cGVJbmZvOjpBc3BlY3R7Ci0gICAgICAgICAgICAgLmNwcF9uYW1lID0gInN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+IiwKLSAgICAgICAgICAgICAudmFsdWVfaXNfY2hlYXAgPSBmYWxzZSwKLSAgICAgICAgICAgICAucmVhZF9mdW5jID0gU3RhbmRhcmRSZWFkKCI6Om5kazo6QVBhcmNlbF9yZWFkU3RyaW5nIiksCi0gICAgICAgICAgICAgLndyaXRlX2Z1bmMgPSBTdGFuZGFyZFdyaXRlKCI6Om5kazo6QVBhcmNlbF93cml0ZVN0cmluZyIpLAotICAgICAgICAgfSksCi0gICAgICAgICAubnVsbGFibGVfYXJyYXkgPSBzdGQ6OnNoYXJlZF9wdHI8VHlwZUluZm86OkFzcGVjdD4obmV3IFR5cGVJbmZvOjpBc3BlY3R7Ci0gICAgICAgICAgICAgLmNwcF9uYW1lID0gInN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4+PiIsCi0gICAgICAgICAgICAgLnZhbHVlX2lzX2NoZWFwID0gZmFsc2UsCi0gICAgICAgICAgICAgLnJlYWRfZnVuYyA9IFN0YW5kYXJkUmVhZCgiOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvciIpLAotICAgICAgICAgICAgIC53cml0ZV9mdW5jID0gU3RhbmRhcmRXcml0ZSgiOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IiKSwKLSAgICAgICAgIH0pLAotICAgICB9fSwKKyAgICB7InZvaWQiLCB7InZvaWQiLCB0cnVlfX0sCisgICAgeyJib29sZWFuIiwgeyJib29sIiwgdHJ1ZX19LAorICAgIHsiYnl0ZSIsIHsiaW50OF90IiwgdHJ1ZX19LAorICAgIHsiY2hhciIsIHsiY2hhcjE2X3QiLCB0cnVlfX0sCisgICAgeyJpbnQiLCB7ImludDMyX3QiLCB0cnVlfX0sCisgICAgeyJsb25nIiwgeyJpbnQ2NF90IiwgdHJ1ZX19LAorICAgIHsiZmxvYXQiLCB7ImZsb2F0IiwgdHJ1ZX19LAorICAgIHsiZG91YmxlIiwgeyJkb3VibGUiLCB0cnVlfX0sCisgICAgeyJTdHJpbmciLCB7InN0ZDo6c3RyaW5nIn19LAogICAgIC8vIFRPRE8oYi8xMzYwNDg2ODQpIHsiTWFwIiwgIiJ9LAotICAgIHsiSUJpbmRlciIsCi0gICAgIFR5cGVJbmZvewotICAgICAgICAgLnJhdyA9Ci0gICAgICAgICAgICAgVHlwZUluZm86OkFzcGVjdHsKLSAgICAgICAgICAgICAgICAgLmNwcF9uYW1lID0gIjo6bmRrOjpTcEFJQmluZGVyIiwKLSAgICAgICAgICAgICAgICAgLnZhbHVlX2lzX2NoZWFwID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgIC5yZWFkX2Z1bmMgPSBTdGFuZGFyZFJlYWQoIjo6bmRrOjpBUGFyY2VsX3JlYWRSZXF1aXJlZFN0cm9uZ0JpbmRlciIpLAotICAgICAgICAgICAgICAgICAud3JpdGVfZnVuYyA9IFN0YW5kYXJkUmVhZCgiOjpuZGs6OkFQYXJjZWxfd3JpdGVSZXF1aXJlZFN0cm9uZ0JpbmRlciIpLAotICAgICAgICAgICAgIH0sCi0gICAgICAgICAuYXJyYXkgPSBudWxscHRyLAotICAgICAgICAgLm51bGxhYmxlID0gc3RkOjpzaGFyZWRfcHRyPFR5cGVJbmZvOjpBc3BlY3Q+KG5ldyBUeXBlSW5mbzo6QXNwZWN0ewotICAgICAgICAgICAgIC5jcHBfbmFtZSA9ICI6Om5kazo6U3BBSUJpbmRlciIsCi0gICAgICAgICAgICAgLnZhbHVlX2lzX2NoZWFwID0gZmFsc2UsCi0gICAgICAgICAgICAgLnJlYWRfZnVuYyA9IFN0YW5kYXJkUmVhZCgiOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlU3Ryb25nQmluZGVyIiksCi0gICAgICAgICAgICAgLndyaXRlX2Z1bmMgPSBTdGFuZGFyZFJlYWQoIjo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVTdHJvbmdCaW5kZXIiKSwKLSAgICAgICAgIH0pLAotICAgICAgICAgLm51bGxhYmxlX2FycmF5ID0gbnVsbHB0ciwKLSAgICAgfX0sCi0gICAgeyJQYXJjZWxGaWxlRGVzY3JpcHRvciIsCi0gICAgIFR5cGVJbmZvewotICAgICAgICAgLnJhdyA9Ci0gICAgICAgICAgICAgVHlwZUluZm86OkFzcGVjdHsKLSAgICAgICAgICAgICAgICAgLmNwcF9uYW1lID0gIjo6bmRrOjpTY29wZWRGaWxlRGVzY3JpcHRvciIsCi0gICAgICAgICAgICAgICAgIC52YWx1ZV9pc19jaGVhcCA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAucmVhZF9mdW5jID0gU3RhbmRhcmRSZWFkKCI6Om5kazo6QVBhcmNlbF9yZWFkUmVxdWlyZWRQYXJjZWxGaWxlRGVzY3JpcHRvciIpLAotICAgICAgICAgICAgICAgICAud3JpdGVfZnVuYyA9IFN0YW5kYXJkUmVhZCgiOjpuZGs6OkFQYXJjZWxfd3JpdGVSZXF1aXJlZFBhcmNlbEZpbGVEZXNjcmlwdG9yIiksCi0gICAgICAgICAgICAgfSwKLSAgICAgICAgIC5hcnJheSA9IHN0ZDo6c2hhcmVkX3B0cjxUeXBlSW5mbzo6QXNwZWN0PihuZXcgVHlwZUluZm86OkFzcGVjdHsKLSAgICAgICAgICAgICAuY3BwX25hbWUgPSAic3RkOjp2ZWN0b3I8OjpuZGs6OlNjb3BlZEZpbGVEZXNjcmlwdG9yPiIsCi0gICAgICAgICAgICAgLnZhbHVlX2lzX2NoZWFwID0gZmFsc2UsCi0gICAgICAgICAgICAgLnJlYWRfZnVuYyA9IFN0YW5kYXJkUmVhZCgiOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvciIpLAotICAgICAgICAgICAgIC53cml0ZV9mdW5jID0gU3RhbmRhcmRXcml0ZSgiOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IiKSwKLSAgICAgICAgIH0pLAotICAgICAgICAgLm51bGxhYmxlID0gc3RkOjpzaGFyZWRfcHRyPFR5cGVJbmZvOjpBc3BlY3Q+KG5ldyBUeXBlSW5mbzo6QXNwZWN0ewotICAgICAgICAgICAgIC5jcHBfbmFtZSA9ICI6Om5kazo6U2NvcGVkRmlsZURlc2NyaXB0b3IiLAotICAgICAgICAgICAgIC52YWx1ZV9pc19jaGVhcCA9IGZhbHNlLAotICAgICAgICAgICAgIC5yZWFkX2Z1bmMgPSBTdGFuZGFyZFJlYWQoIjo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZVBhcmNlbEZpbGVEZXNjcmlwdG9yIiksCi0gICAgICAgICAgICAgLndyaXRlX2Z1bmMgPSBTdGFuZGFyZFJlYWQoIjo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVQYXJjZWxGaWxlRGVzY3JpcHRvciIpLAotICAgICAgICAgfSksCi0gICAgICAgICAubnVsbGFibGVfYXJyYXkgPSBudWxscHRyLAotICAgICB9fSwKLSAgICB7IlBhcmNlbGFibGVIb2xkZXIiLAotICAgICBUeXBlSW5mb3sKLSAgICAgICAgIC5yYXcgPQotICAgICAgICAgICAgIFR5cGVJbmZvOjpBc3BlY3R7Ci0gICAgICAgICAgICAgICAgIC5jcHBfbmFtZSA9ICI6Om5kazo6QVBhcmNlbGFibGVIb2xkZXIiLAotICAgICAgICAgICAgICAgICAudmFsdWVfaXNfY2hlYXAgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgLnJlYWRfZnVuYyA9IFN0YW5kYXJkUmVhZCgiOjpuZGs6OkFQYXJjZWxfcmVhZFBhcmNlbGFibGUiKSwKLSAgICAgICAgICAgICAgICAgLndyaXRlX2Z1bmMgPSBTdGFuZGFyZFdyaXRlKCI6Om5kazo6QVBhcmNlbF93cml0ZVBhcmNlbGFibGUiKSwKLSAgICAgICAgICAgICB9LAotICAgICAgICAgLmFycmF5ID0gbnVsbHB0ciwKLSAgICAgICAgIC5udWxsYWJsZSA9IG51bGxwdHIsCi0gICAgICAgICAubnVsbGFibGVfYXJyYXkgPSBudWxscHRyLAotICAgICB9fSwKKyAgICB7IklCaW5kZXIiLCB7Ijo6bmRrOjpTcEFJQmluZGVyIn19LAorICAgIHsiUGFyY2VsRmlsZURlc2NyaXB0b3IiLCB7Ijo6bmRrOjpTY29wZWRGaWxlRGVzY3JpcHRvciJ9fSwKKyAgICB7IlBhcmNlbGFibGVIb2xkZXIiLCB7Ijo6bmRrOjpBUGFyY2VsYWJsZUhvbGRlciJ9fSwKIH07CiAKLXN0YXRpYyBUeXBlSW5mbzo6QXNwZWN0IEdldFR5cGVBc3BlY3QoY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZXMsIGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiBhaWRsKSB7Ci0gIEFJRExfRkFUQUxfSUYoIWFpZGwuSXNSZXNvbHZlZCgpLCBhaWRsKSA8PCBhaWRsLlRvU3RyaW5nKCk7CitzdGF0aWMgVHlwZUluZm8gR2V0QmFzZVR5cGVJbmZvKGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLCBjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgYWlkbCkgewogICBhdXRvJiBhaWRsX25hbWUgPSBhaWRsLkdldE5hbWUoKTsKIAotICBUeXBlSW5mbyBpbmZvOwotCi0gIC8vIFRPRE8oYi8xMzYwNDg2ODQpOiBGb3Igbm93LCBMaXN0PFQ+IGlzIGNvbnZlcnRlZCB0byBUW10uKEJvdGggYXJlIHVzaW5nIHZlY3RvcjxUPikKLSAgaWYgKGFpZGxfbmFtZSA9PSAiTGlzdCIpIHsKLSAgICBBSURMX0ZBVEFMX0lGKCFhaWRsLklzR2VuZXJpYygpLCBhaWRsKSA8PCAiTGlzdCBtdXN0IGJlIGdlbmVyaWMgdHlwZS4iOwotICAgIEFJRExfRkFUQUxfSUYoYWlkbC5HZXRUeXBlUGFyYW1ldGVycygpLnNpemUoKSAhPSAxLCBhaWRsKQotICAgICAgICA8PCAiTGlzdCBjYW4gYWNjZXB0IG9ubHkgb25lIHR5cGUgcGFyYW1ldGVyLiI7Ci0gICAgY29uc3QgYXV0byYgdHlwZV9wYXJhbSA9IGFpZGwuR2V0VHlwZVBhcmFtZXRlcnMoKVswXTsKLSAgICAvLyBUT0RPKGIvMTM2MDQ4Njg0KSBBSURMIGRvZXNuJ3Qgc3VwcG9ydCBuZXN0ZWQgdHlwZSBwYXJhbWV0ZXIgeWV0LgotICAgIEFJRExfRkFUQUxfSUYodHlwZV9wYXJhbS0+SXNHZW5lcmljKCksIGFpZGwpIDw8ICJBSURMIGRvZXNuJ3Qgc3VwcG9ydCBuZXN0ZWQgdHlwZSBwYXJhbWV0ZXIiOwotCi0gICAgQWlkbFR5cGVTcGVjaWZpZXIgYXJyYXlfdHlwZSA9Ci0gICAgICAgIEFpZGxUeXBlU3BlY2lmaWVyKEFJRExfTE9DQVRJT05fSEVSRSwgdHlwZV9wYXJhbS0+R2V0VW5yZXNvbHZlZE5hbWUoKSwgdHJ1ZSAvKiBpc0FycmF5ICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyIC8qIHR5cGVfcGFyYW1zICovLCBhaWRsLkdldENvbW1lbnRzKCkpOwotICAgIGlmICghKGFycmF5X3R5cGUuUmVzb2x2ZSh0eXBlcykgJiYgYXJyYXlfdHlwZS5DaGVja1ZhbGlkKHR5cGVzKSkpIHsKLSAgICAgIEFJRExfRkFUQUwoYWlkbCkgPDwgIlRoZSB0eXBlIHBhcmFtZXRlciBpcyB3cm9uZy4iOwotICAgIH0KLSAgICByZXR1cm4gR2V0VHlwZUFzcGVjdCh0eXBlcywgYXJyYXlfdHlwZSk7Ci0gIH0KLQogICBpZiAoQWlkbFR5cGVuYW1lczo6SXNCdWlsdGluVHlwZW5hbWUoYWlkbF9uYW1lKSkgewogICAgIGF1dG8gaXQgPSBrTmRrVHlwZUluZm9NYXAuZmluZChhaWRsX25hbWUpOwogICAgIEFJRExfRkFUQUxfSUYoaXQgPT0ga05ka1R5cGVJbmZvTWFwLmVuZCgpLCBhaWRsX25hbWUpOwotICAgIGluZm8gPSBpdC0+c2Vjb25kOworICAgIHJldHVybiBpdC0+c2Vjb25kOworICB9CisgIGNvbnN0IEFpZGxEZWZpbmVkVHlwZSogdHlwZSA9IHR5cGVzLlRyeUdldERlZmluZWRUeXBlKGFpZGxfbmFtZSk7CisgIEFJRExfRkFUQUxfSUYodHlwZSA9PSBudWxscHRyLCBhaWRsX25hbWUpIDw8ICJVbnJlY29nbml6ZWQgdHlwZS4iOworCisgIGlmIChjb25zdCBBaWRsSW50ZXJmYWNlKiBpbnRmID0gdHlwZS0+QXNJbnRlcmZhY2UoKTsgaW50ZiAhPSBudWxscHRyKSB7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgY2xhenogPSBOZGtGdWxsQ2xhc3NOYW1lKCppbnRmLCBjcHA6OkNsYXNzTmFtZXM6OklOVEVSRkFDRSk7CisgICAgcmV0dXJuIFR5cGVJbmZveyJzdGQ6OnNoYXJlZF9wdHI8IiArIGNsYXp6ICsgIj4ifTsKKyAgfSBlbHNlIGlmIChjb25zdCBBaWRsUGFyY2VsYWJsZSogcGFyY2VsYWJsZSA9IHR5cGUtPkFzUGFyY2VsYWJsZSgpOyBwYXJjZWxhYmxlICE9IG51bGxwdHIpIHsKKyAgICBzdGQ6OnN0cmluZyBjbGF6eiA9IE5ka0Z1bGxDbGFzc05hbWUoKnBhcmNlbGFibGUsIGNwcDo6Q2xhc3NOYW1lczo6UkFXKTsKKyAgICBzdGQ6OnN0cmluZyB0ZW1wbGF0ZV9wYXJhbXMgPSAiIjsKKyAgICBpZiAoYWlkbC5Jc0dlbmVyaWMoKSkgeworICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHR5cGVfcGFyYW1zOworICAgICAgZm9yIChjb25zdCBhdXRvJiBwYXJhbWV0ZXIgOiBhaWRsLkdldFR5cGVQYXJhbWV0ZXJzKCkpIHsKKyAgICAgICAgdHlwZV9wYXJhbXMucHVzaF9iYWNrKE5ka05hbWVPZih0eXBlcywgKnBhcmFtZXRlciwgU3RvcmFnZU1vZGU6OlNUQUNLKSk7CisgICAgICB9CisgICAgICBjbGF6eiArPSBiYXNlOjpTdHJpbmdQcmludGYoIjwlcz4iLCBiYXNlOjpKb2luKHR5cGVfcGFyYW1zLCAiLCAiKS5jX3N0cigpKTsKKyAgICB9CisgICAgcmV0dXJuIFR5cGVJbmZve2NsYXp6fTsKKyAgfSBlbHNlIGlmIChjb25zdCBBaWRsRW51bURlY2xhcmF0aW9uKiBlbnVtX2RlY2wgPSB0eXBlLT5Bc0VudW1EZWNsYXJhdGlvbigpOworICAgICAgICAgICAgIGVudW1fZGVjbCAhPSBudWxscHRyKSB7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgY2xhenogPSBOZGtGdWxsQ2xhc3NOYW1lKCplbnVtX2RlY2wsIGNwcDo6Q2xhc3NOYW1lczo6UkFXKTsKKyAgICByZXR1cm4gVHlwZUluZm97Y2xhenosIHRydWV9OwogICB9IGVsc2UgewotICAgIGNvbnN0IEFpZGxEZWZpbmVkVHlwZSogdHlwZSA9IHR5cGVzLlRyeUdldERlZmluZWRUeXBlKGFpZGxfbmFtZSk7Ci0gICAgQUlETF9GQVRBTF9JRih0eXBlID09IG51bGxwdHIsIGFpZGxfbmFtZSkgPDwgIlVucmVjb2duaXplZCB0eXBlLiI7CisgICAgQUlETF9GQVRBTChhaWRsX25hbWUpIDw8ICJVbnJlY29nbml6ZWQgdHlwZSI7CisgIH0KK30KIAotICAgIGlmIChjb25zdCBBaWRsSW50ZXJmYWNlKiBpbnRmID0gdHlwZS0+QXNJbnRlcmZhY2UoKTsgaW50ZiAhPSBudWxscHRyKSB7Ci0gICAgICBpbmZvID0gSW50ZXJmYWNlVHlwZUluZm8oKmludGYpOwotICAgIH0gZWxzZSBpZiAoY29uc3QgQWlkbFBhcmNlbGFibGUqIHBhcmNlbGFibGUgPSB0eXBlLT5Bc1BhcmNlbGFibGUoKTsgcGFyY2VsYWJsZSAhPSBudWxscHRyKSB7Ci0gICAgICBpbmZvID0gUGFyY2VsYWJsZVR5cGVJbmZvKCpwYXJjZWxhYmxlLCBhaWRsLCB0eXBlcyk7Ci0gICAgfSBlbHNlIGlmIChjb25zdCBBaWRsRW51bURlY2xhcmF0aW9uKiBlbnVtX2RlY2wgPSB0eXBlLT5Bc0VudW1EZWNsYXJhdGlvbigpOwotICAgICAgICAgICAgICAgZW51bV9kZWNsICE9IG51bGxwdHIpIHsKLSAgICAgIGluZm8gPSBFbnVtRGVjbGFyYXRpb25UeXBlSW5mbygqZW51bV9kZWNsKTsKLSAgICB9IGVsc2UgewotICAgICAgQUlETF9GQVRBTChhaWRsX25hbWUpIDw8ICJVbnJlY29nbml6ZWQgdHlwZSI7CitzdGF0aWMgVHlwZUluZm8gV3JhcE51bGxhYmxlVHlwZShUeXBlSW5mbyBpbmZvLCBib29sIGlzX2hlYXApIHsKKyAgaWYgKGlzX2hlYXApIHsKKyAgICBpbmZvLmNwcF9uYW1lID0gInN0ZDo6dW5pcXVlX3B0cjwiICsgaW5mby5jcHBfbmFtZSArICI+IjsKKyAgfSBlbHNlIHsKKyAgICBpbmZvLmNwcF9uYW1lID0gInN0ZDo6b3B0aW9uYWw8IiArIGluZm8uY3BwX25hbWUgKyAiPiI7CisgIH0KKyAgaW5mby52YWx1ZV9pc19jaGVhcCA9IGZhbHNlOworICByZXR1cm4gaW5mbzsKK30KKworc3RhdGljIFR5cGVJbmZvIFdyYXBBcnJheVR5cGUoVHlwZUluZm8gaW5mbywgY29uc3QgQXJyYXlUeXBlKiBhcnJheSkgeworICBBSURMX0ZBVEFMX0lGKCFhcnJheSwgQUlETF9MT0NBVElPTl9IRVJFKSA8PCAibm90IGFuIGFycmF5IjsKKyAgLy8gV2hlbiAiYnl0ZSIoQUlETCkgaXMgdXNlZCBpbiBhbiBhcnJheSwgdXNlICJ1aW50OF90IiBiZWNhdXNlIGl0J3MgbW9yZSBDKysgaWRpb21hdGljLgorICBpZiAoaW5mby5jcHBfbmFtZSA9PSAiaW50OF90IikgeworICAgIGluZm8uY3BwX25hbWUgPSAidWludDhfdCI7CisgIH0KKyAgaWYgKHN0ZDo6Z2V0X2lmPER5bmFtaWNBcnJheT4oYXJyYXkpKSB7CisgICAgaW5mby5jcHBfbmFtZSA9ICJzdGQ6OnZlY3RvcjwiICsgaW5mby5jcHBfbmFtZSArICI+IjsKKyAgfSBlbHNlIHsKKyAgICBjb25zdCBhdXRvJiBkaW1lbnNpb25zID0gc3RkOjpnZXQ8Rml4ZWRTaXplQXJyYXk+KCphcnJheSkuZGltZW5zaW9uczsKKyAgICBmb3IgKGF1dG8gaXQgPSByYmVnaW4oZGltZW5zaW9ucyksIGVuZCA9IHJlbmQoZGltZW5zaW9ucyk7IGl0ICE9IGVuZDsgaXQrKykgeworICAgICAgaW5mby5jcHBfbmFtZSA9ICJzdGQ6OmFycmF5PCIgKyBpbmZvLmNwcF9uYW1lICsgIiwgIiArCisgICAgICAgICAgICAgICAgICAgICAgKCppdCktPlZhbHVlU3RyaW5nKGtJbnRUeXBlLCBDb25zdGFudFZhbHVlRGVjb3JhdG9yKSArICI+IjsKICAgICB9CiAgIH0KKyAgaW5mby52YWx1ZV9pc19jaGVhcCA9IGZhbHNlOworICByZXR1cm4gaW5mbzsKK30KIAotICBpZiAoYWlkbC5Jc0FycmF5KCkpIHsKLSAgICBpZiAoYWlkbC5Jc051bGxhYmxlKCkpIHsKLSAgICAgIEFJRExfRkFUQUxfSUYoaW5mby5udWxsYWJsZV9hcnJheSA9PSBudWxscHRyLCBhaWRsKQotICAgICAgICAgIDw8ICJVbnN1cHBvcnRlZCB0eXBlIGluIE5ESyBCYWNrZW5kOiAiIDw8IGFpZGwuVG9TdHJpbmcoKTsKLSAgICAgIHJldHVybiAqaW5mby5udWxsYWJsZV9hcnJheTsKK3N0YXRpYyBib29sIFNob3VsZFdyYXBOdWxsYWJsZShjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywgY29uc3Qgc3RkOjpzdHJpbmcmIGFpZGxfbmFtZSkgeworICBpZiAoQWlkbFR5cGVuYW1lczo6SXNQcmltaXRpdmVUeXBlbmFtZShhaWRsX25hbWUpIHx8IGFpZGxfbmFtZSA9PSAiUGFyY2VsYWJsZUhvbGRlciIgfHwKKyAgICAgIGFpZGxfbmFtZSA9PSAiSUJpbmRlciIgfHwgYWlkbF9uYW1lID09ICJQYXJjZWxGaWxlRGVzY3JpcHRvciIpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKGF1dG8gZGVmaW5lZF90eXBlID0gdHlwZXMuVHJ5R2V0RGVmaW5lZFR5cGUoYWlkbF9uYW1lKTsgZGVmaW5lZF90eXBlKSB7CisgICAgaWYgKGRlZmluZWRfdHlwZS0+QXNFbnVtRGVjbGFyYXRpb24oKSB8fCBkZWZpbmVkX3R5cGUtPkFzSW50ZXJmYWNlKCkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgQUlETF9GQVRBTF9JRihpbmZvLmFycmF5ID09IG51bGxwdHIsIGFpZGwpCi0gICAgICAgIDw8ICJVbnN1cHBvcnRlZCB0eXBlIGluIE5ESyBCYWNrZW5kOiAiIDw8IGFpZGwuVG9TdHJpbmcoKTsKLSAgICByZXR1cm4gKmluZm8uYXJyYXk7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBUeXBlSW5mbyBHZXRUeXBlSW5mbyhjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywgY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIGFpZGwpIHsKKyAgQUlETF9GQVRBTF9JRighYWlkbC5Jc1Jlc29sdmVkKCksIGFpZGwpIDw8IGFpZGwuVG9TdHJpbmcoKTsKKyAgLy8gS2VlcCBvcmlnaW5hbCBAbnVsbGFibGUgdG8gaGFuZGxlIHRoZSBjYXNlIG9mIExpc3Q8VD4uICJAbnVsbGFibGUiIGlzIGF0dGFjaGVkIHRvICJMaXN0IiBub3QKKyAgLy8gIlQiCisgIGJvb2wgaXNfbnVsbGFibGUgPSBhaWRsLklzTnVsbGFibGUoKTsKKyAgY29uc3QgQXJyYXlUeXBlKiBhcnJheSA9IG51bGxwdHI7CisgIGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyKiBlbGVtZW50X3R5cGUgPSAmYWlkbDsKKworICAvLyBMaXN0PFQ+IGlzIGNvbnZlcnRlZCB0byBUW10uCisgIGlmIChhaWRsLkdldE5hbWUoKSA9PSAiTGlzdCIpIHsKKyAgICBzdGF0aWMgY29uc3QgQXJyYXlUeXBlIGtEeW5hbWljQXJyYXl7RHluYW1pY0FycmF5e319OworCisgICAgQUlETF9GQVRBTF9JRighYWlkbC5Jc0dlbmVyaWMoKSwgYWlkbCkgPDwgIkxpc3QgbXVzdCBiZSBnZW5lcmljIHR5cGUuIjsKKyAgICBBSURMX0ZBVEFMX0lGKGFpZGwuR2V0VHlwZVBhcmFtZXRlcnMoKS5zaXplKCkgIT0gMSwgYWlkbCkKKyAgICAgICAgPDwgIkxpc3QgY2FuIGFjY2VwdCBvbmx5IG9uZSB0eXBlIHBhcmFtZXRlci4iOworICAgIGNvbnN0IGF1dG8mIHR5cGVfcGFyYW0gPSAqYWlkbC5HZXRUeXBlUGFyYW1ldGVycygpWzBdOworICAgIC8vIFRPRE8oYi8xMzYwNDg2ODQpIEFJREwgZG9lc24ndCBzdXBwb3J0IG5lc3RlZCB0eXBlIHBhcmFtZXRlciB5ZXQuCisgICAgQUlETF9GQVRBTF9JRih0eXBlX3BhcmFtLklzR2VuZXJpYygpLCBhaWRsKSA8PCAiQUlETCBkb2Vzbid0IHN1cHBvcnQgbmVzdGVkIHR5cGUgcGFyYW1ldGVyIjsKKyAgICAvLyBUcmVhdCAiTGlzdDxUPiIgYXMgYW4gYXJyYXkgb2YgVC4KKyAgICBhcnJheSA9ICZrRHluYW1pY0FycmF5OworICAgIGVsZW1lbnRfdHlwZSA9ICZ0eXBlX3BhcmFtOworICB9IGVsc2UgaWYgKGFpZGwuSXNBcnJheSgpKSB7CisgICAgYXJyYXkgPSAmYWlkbC5HZXRBcnJheSgpOwogICB9CiAKLSAgaWYgKGFpZGwuSXNOdWxsYWJsZSgpKSB7Ci0gICAgQUlETF9GQVRBTF9JRihpbmZvLm51bGxhYmxlID09IG51bGxwdHIsIGFpZGwpCi0gICAgICAgIDw8ICJVbnN1cHBvcnRlZCB0eXBlIGluIE5ESyBCYWNrZW5kOiAiIDw8IGFpZGwuVG9TdHJpbmcoKTsKLSAgICByZXR1cm4gKmluZm8ubnVsbGFibGU7Ci0gIH0KKyAgVHlwZUluZm8gaW5mbyA9IEdldEJhc2VUeXBlSW5mbyh0eXBlcywgKmVsZW1lbnRfdHlwZSk7CiAKLSAgcmV0dXJuIGluZm8ucmF3OworICBpZiAoaXNfbnVsbGFibGUgJiYgU2hvdWxkV3JhcE51bGxhYmxlKHR5cGVzLCBlbGVtZW50X3R5cGUtPkdldE5hbWUoKSkpIHsKKyAgICBpbmZvID0gV3JhcE51bGxhYmxlVHlwZShpbmZvLCBhaWRsLklzSGVhcE51bGxhYmxlKCkpOworICB9CisgIGlmIChhcnJheSkgeworICAgIGluZm8gPSBXcmFwQXJyYXlUeXBlKGluZm8sIGFycmF5KTsKKyAgICBpZiAoaXNfbnVsbGFibGUpIHsKKyAgICAgIEFJRExfRkFUQUxfSUYoYWlkbC5Jc0hlYXBOdWxsYWJsZSgpLCBhaWRsKSA8PCAiQXJyYXkvTGlzdCBjYW4ndCBiZSBAbnVsbGFibGUoaGVhcD10cnVlKSI7CisgICAgICBpbmZvID0gV3JhcE51bGxhYmxlVHlwZShpbmZvLCAvKmlzX2hlYXA9Ki9mYWxzZSk7CisgICAgfQorICB9CisgIHJldHVybiBpbmZvOwogfQogCiBzdGQ6OnN0cmluZyBOZGtGdWxsQ2xhc3NOYW1lKGNvbnN0IEFpZGxEZWZpbmVkVHlwZSYgdHlwZSwgY3BwOjpDbGFzc05hbWVzIG5hbWUpIHsKICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHBpZWNlcyA9IHsiOjphaWRsIn07Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwYWNrYWdlID0gdHlwZS5HZXRTcGxpdFBhY2thZ2UoKTsKLSAgcGllY2VzLmluc2VydChwaWVjZXMuZW5kKCksIHBhY2thZ2UuYmVnaW4oKSwgcGFja2FnZS5lbmQoKSk7Ci0gIHBpZWNlcy5wdXNoX2JhY2soY3BwOjpDbGFzc05hbWUodHlwZSwgbmFtZSkpOwotCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzcGxpdF9uYW1lID0gU3BsaXQodHlwZS5HZXRDYW5vbmljYWxOYW1lKCksICIuIik7CisgIHBpZWNlcy5pbnNlcnQocGllY2VzLmVuZCgpLCBzcGxpdF9uYW1lLmJlZ2luKCksIHNwbGl0X25hbWUuZW5kKCkpOworICAvLyBPdmVycmlkZSBuYW1lIHBhcnQgd2l0aCBjcHA6OkNsYXNzTmFtZSh0eXBlLCBuYW1lKQorICBwaWVjZXMuYmFjaygpID0gY3BwOjpDbGFzc05hbWUodHlwZSwgbmFtZSk7CiAgIHJldHVybiBKb2luKHBpZWNlcywgIjo6Iik7CiB9CiAKIHN0ZDo6c3RyaW5nIE5ka05hbWVPZihjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywgY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIGFpZGwsIFN0b3JhZ2VNb2RlIG1vZGUpIHsKLSAgVHlwZUluZm86OkFzcGVjdCBhc3BlY3QgPSBHZXRUeXBlQXNwZWN0KHR5cGVzLCBhaWRsKTsKKyAgVHlwZUluZm8gYXNwZWN0ID0gR2V0VHlwZUluZm8odHlwZXMsIGFpZGwpOwogCiAgIHN3aXRjaCAobW9kZSkgewogICAgIGNhc2UgU3RvcmFnZU1vZGU6OlNUQUNLOgpAQCAtNDQwLDM0ICsyMTQsMjAgQEAKICAgfQogfQogCi1zaXplX3QgTmRrQWxpZ25tZW50T2YoY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZXMsIGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiBhaWRsKSB7Ci0gIC8vIG1hcCBmcm9tIE5ESyB0eXBlIG5hbWUgdG8gdGhlIGNvcnJlc3BvbmRpbmcgYWxpZ25tZW50IHNpemUKLSAgc3RhdGljIG1hcDxzdHJpbmcsIGludD4gYWxpZ25tZW50ID0gewotICAgICAgeyJib29sIiwgMX0sICB7ImludDhfdCIsIDF9LCAgeyJjaGFyMTZfdCIsIDJ9LCB7ImRvdWJsZSIsIDh9LAotICAgICAgeyJmbG9hdCIsIDR9LCB7ImludDMyX3QiLCA0fSwgeyJpbnQ2NF90IiwgOH0sCi0gIH07Ci0KLSAgY29uc3Qgc3RyaW5nJiBuYW1lID0gTmRrTmFtZU9mKHR5cGVzLCBhaWRsLCBTdG9yYWdlTW9kZTo6U1RBQ0spOwotICBpZiAoYWxpZ25tZW50LmZpbmQobmFtZSkgIT0gYWxpZ25tZW50LmVuZCgpKSB7Ci0gICAgcmV0dXJuIGFsaWdubWVudFtuYW1lXTsKLSAgfSBlbHNlIHsKLSAgICBjb25zdCBhdXRvJiBkZWZpbmVkVHlwZSA9IHR5cGVzLlRyeUdldERlZmluZWRUeXBlKGFpZGwuR2V0TmFtZSgpKTsKLSAgICBBSURMX0ZBVEFMX0lGKGRlZmluZWRUeXBlID09IG51bGxwdHIsIGFpZGwpIDw8ICJGYWlsZWQgdG8gcmVzb2x2ZSB0eXBlLiI7Ci0gICAgaWYgKGNvbnN0IGF1dG8mIGVudW1UeXBlID0gZGVmaW5lZFR5cGUtPkFzRW51bURlY2xhcmF0aW9uKCk7IGVudW1UeXBlICE9IG51bGxwdHIpIHsKLSAgICAgIHJldHVybiBOZGtBbGlnbm1lbnRPZih0eXBlcywgZW51bVR5cGUtPkdldEJhY2tpbmdUeXBlKCkpOwotICAgIH0KLSAgfQotICByZXR1cm4gMDsKLX0KLQogdm9pZCBXcml0ZVRvUGFyY2VsRm9yKGNvbnN0IENvZGVHZW5lcmF0b3JDb250ZXh0JiBjKSB7Ci0gIFR5cGVJbmZvOjpBc3BlY3QgYXNwZWN0ID0gR2V0VHlwZUFzcGVjdChjLnR5cGVzLCBjLnR5cGUpOwotICBhc3BlY3Qud3JpdGVfZnVuYyhjKTsKKyAgaWYgKGMudHlwZS5Jc051bGxhYmxlKCkpIHsKKyAgICBjLndyaXRlciA8PCAiOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoIiA8PCBjLnBhcmNlbCA8PCAiLCAiIDw8IGMudmFyIDw8ICIpIjsKKyAgfSBlbHNlIHsKKyAgICBjLndyaXRlciA8PCAiOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKCIgPDwgYy5wYXJjZWwgPDwgIiwgIiA8PCBjLnZhciA8PCAiKSI7CisgIH0KIH0KIAogdm9pZCBSZWFkRnJvbVBhcmNlbEZvcihjb25zdCBDb2RlR2VuZXJhdG9yQ29udGV4dCYgYykgewotICBUeXBlSW5mbzo6QXNwZWN0IGFzcGVjdCA9IEdldFR5cGVBc3BlY3QoYy50eXBlcywgYy50eXBlKTsKLSAgYXNwZWN0LnJlYWRfZnVuYyhjKTsKKyAgaWYgKGMudHlwZS5Jc051bGxhYmxlKCkpIHsKKyAgICBjLndyaXRlciA8PCAiOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YSgiIDw8IGMucGFyY2VsIDw8ICIsICIgPDwgYy52YXIgPDwgIikiOworICB9IGVsc2UgeworICAgIGMud3JpdGVyIDw8ICI6Om5kazo6QVBhcmNlbF9yZWFkRGF0YSgiIDw8IGMucGFyY2VsIDw8ICIsICIgPDwgYy52YXIgPDwgIikiOworICB9CiB9CiAKIHN0ZDo6c3RyaW5nIE5ka0FyZ0xpc3QoCmRpZmYgLS1naXQgYS9haWRsX3RvX25kay5oIGIvYWlkbF90b19uZGsuaAppbmRleCAzNzBkMDdiLi43ZDgxNWM1IDEwMDY0NAotLS0gYS9haWRsX3RvX25kay5oCisrKyBiL2FpZGxfdG9fbmRrLmgKQEAgLTMxLDcgKzMxLDkgQEAKIHN0ZDo6c3RyaW5nIE5ka0hlYWRlckZpbGUoY29uc3QgQWlkbERlZmluZWRUeXBlJiBkZWZpbmVkX3R5cGUsIGNwcDo6Q2xhc3NOYW1lcyBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHVzZV9vc19zZXAgPSB0cnVlKTsKIAotc3RkOjpzdHJpbmcgQ29uc3RhbnRWYWx1ZURlY29yYXRvcihjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHJhd192YWx1ZSk7CitzdGQ6OnN0cmluZyBDb25zdGFudFZhbHVlRGVjb3JhdG9yKAorICAgIGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiB0eXBlLAorICAgIGNvbnN0IHN0ZDo6dmFyaWFudDxzdGQ6OnN0cmluZywgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+PiYgcmF3X3ZhbHVlKTsKIAogLy8gUmV0dXJucyA6OmFpZGw6OnNvbWVfcGFja2FnZTo6c29tZV9zdWJfcGFja2FnZTo6Zm9vOjpJRm9vL0JwRm9vL0JuRm9vCiBzdGQ6OnN0cmluZyBOZGtGdWxsQ2xhc3NOYW1lKGNvbnN0IEFpZGxEZWZpbmVkVHlwZSYgdHlwZSwgY3BwOjpDbGFzc05hbWVzIG5hbWUpOwpAQCAtNDAsMTIgKzQyLDYgQEAKIC8vIGFycmF5IG1vZGlmaWVycy4KIHN0ZDo6c3RyaW5nIE5ka05hbWVPZihjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywgY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIGFpZGwsIFN0b3JhZ2VNb2RlIG1vZGUpOwogCi0vLyBSZXR1cm4gdGhlIGFsaWdubWVudCBvZiBrbm93biB0eXBlcyBhbmQgZW51bSBiYWNraW5nIHR5cGVzLgotLy8gSWYgdGhlIGFsaWdubWVudCBpcyB1bmtub3duLCBvciBpdCBpcyBhIEZpemVkU2l6ZSBwYXJjZWxhYmxlIHdpdGggaXRzCi0vLyBvd24gZ3VhcmFudGVlZCBhbGlnbm1lbnQoc28gaXQgZG9lcyBub3QgbmVlZCB0byBiZSBzcGVjaWZpZWQpLCAwIHdpbGwgYmUKLS8vIHJldHVybmVkLgotc2l6ZV90IE5ka0FsaWdubWVudE9mKGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLCBjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgYWlkbCk7Ci0KIHN0cnVjdCBDb2RlR2VuZXJhdG9yQ29udGV4dCB7CiAgIENvZGVXcml0ZXImIHdyaXRlcjsKIApkaWZmIC0tZ2l0IGEvYWlkbF90b19ydXN0LmNwcCBiL2FpZGxfdG9fcnVzdC5jcHAKaW5kZXggNDEyMWZmNC4uMzIxMzI2NiAxMDA2NDQKLS0tIGEvYWlkbF90b19ydXN0LmNwcAorKysgYi9haWRsX3RvX3J1c3QuY3BwCkBAIC0zOSw0MCArMzksNTQgQEAKIG5hbWVzcGFjZSB7CiBzdGQ6OnN0cmluZyBHZXRSYXdSdXN0TmFtZShjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSk7CiAKLXN0ZDo6c3RyaW5nIENvbnN0YW50VmFsdWVEZWNvcmF0b3JJbnRlcm5hbChjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcmF3X3ZhbHVlLCBib29sIGJ5X3JlZikgeworc3RkOjpzdHJpbmcgQ29uc3RhbnRWYWx1ZURlY29yYXRvckludGVybmFsKAorICAgIGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiB0eXBlLAorICAgIGNvbnN0IHN0ZDo6dmFyaWFudDxzdGQ6OnN0cmluZywgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+PiYgcmF3X3ZhbHVlLCBib29sIGJ5X3JlZikgewogICBpZiAodHlwZS5Jc0FycmF5KCkpIHsKLSAgICAvLyBDb252ZXJ0IGB7IC4uLiB9YCB0byBgdmVjIXsgLi4uIH1gCi0gICAgcmV0dXJuICJ2ZWMhIiArIHJhd192YWx1ZTsKKyAgICBjb25zdCBhdXRvJiB2YWx1ZXMgPSBzdGQ6OmdldDxzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4+KHJhd192YWx1ZSk7CisgICAgc3RkOjpzdHJpbmcgdmFsdWUgPSAiWyIgKyBKb2luKHZhbHVlcywgIiwgIikgKyAiXSI7CisgICAgaWYgKHR5cGUuSXNEeW5hbWljQXJyYXkoKSkgeworICAgICAgdmFsdWUgPSAidmVjISIgKyB2YWx1ZTsKKyAgICB9CisgICAgaWYgKCF0eXBlLklzTXV0YXRlZCgpICYmIHR5cGUuSXNOdWxsYWJsZSgpKSB7CisgICAgICB2YWx1ZSA9ICJTb21lKCIgKyB2YWx1ZSArICIpIjsKKyAgICB9CisgICAgcmV0dXJuIHZhbHVlOwogICB9CiAKKyAgc3RkOjpzdHJpbmcgdmFsdWUgPSBzdGQ6OmdldDxzdGQ6OnN0cmluZz4ocmF3X3ZhbHVlKTsKKwogICBjb25zdCBhdXRvJiBhaWRsX25hbWUgPSB0eXBlLkdldE5hbWUoKTsKICAgaWYgKGFpZGxfbmFtZSA9PSAiY2hhciIpIHsKLSAgICByZXR1cm4gcmF3X3ZhbHVlICsgIiBhcyB1MTYiOworICAgIHJldHVybiB2YWx1ZSArICIgYXMgdTE2IjsKICAgfQogCiAgIGlmIChhaWRsX25hbWUgPT0gImZsb2F0IikgewotICAgIC8vIHJhd192YWx1ZSBhbHJlYWR5IGVuZHMgaW4gYGZgLCBzbyBqdXN0IGFkZCBgMzJgCi0gICAgcmV0dXJuIHJhd192YWx1ZSArICIzMiI7CisgICAgLy8gdmFsdWUgYWxyZWFkeSBlbmRzIGluIGBmYCwgc28ganVzdCBhZGQgYDMyYAorICAgIHJldHVybiB2YWx1ZSArICIzMiI7CiAgIH0KIAogICBpZiAoYWlkbF9uYW1lID09ICJkb3VibGUiKSB7Ci0gICAgcmV0dXJuIHJhd192YWx1ZSArICJmNjQiOworICAgIHJldHVybiB2YWx1ZSArICJmNjQiOworICB9CisKKyAgaWYgKGF1dG8gZGVmaW5lZF90eXBlID0gdHlwZS5HZXREZWZpbmVkVHlwZSgpOyBkZWZpbmVkX3R5cGUpIHsKKyAgICBhdXRvIGVudW1fdHlwZSA9IGRlZmluZWRfdHlwZS0+QXNFbnVtRGVjbGFyYXRpb24oKTsKKyAgICBBSURMX0ZBVEFMX0lGKCFlbnVtX3R5cGUsIHR5cGUpIDw8ICJJbnZhbGlkIHR5cGUgZm9yIFwiIiA8PCB2YWx1ZSA8PCAiXCIiOworICAgIHJldHVybiBHZXRSYXdSdXN0TmFtZSh0eXBlKSArICI6OiIgKyB2YWx1ZS5zdWJzdHIodmFsdWUuZmluZF9sYXN0X29mKCcuJykgKyAxKTsKICAgfQogCiAgIGlmIChhaWRsX25hbWUgPT0gIlN0cmluZyIgJiYgIWJ5X3JlZikgewogICAgIC8vIFRoZSBhY3R1YWwgdHlwZSBtaWdodCBiZSBTdHJpbmcgb3IgJnN0ciwKICAgICAvLyBhbmQgLmludG8oKSB0cmFuc3BhcmVudGx5IGNvbnZlcnRzIGludG8gZWl0aGVyIG9uZQotICAgIHJldHVybiByYXdfdmFsdWUgKyAiLmludG8oKSI7CisgICAgdmFsdWUgPSB2YWx1ZSArICIuaW50bygpIjsKICAgfQogCi0gIGlmIChhdXRvIGRlZmluZWRfdHlwZSA9IHR5cGUuR2V0RGVmaW5lZFR5cGUoKTsgZGVmaW5lZF90eXBlKSB7Ci0gICAgYXV0byBlbnVtX3R5cGUgPSBkZWZpbmVkX3R5cGUtPkFzRW51bURlY2xhcmF0aW9uKCk7Ci0gICAgQUlETF9GQVRBTF9JRighZW51bV90eXBlLCB0eXBlKSA8PCAiSW52YWxpZCB0eXBlIGZvciBcIiIgPDwgcmF3X3ZhbHVlIDw8ICJcIiI7Ci0gICAgcmV0dXJuIEdldFJhd1J1c3ROYW1lKHR5cGUpICsgIjo6IiArIHJhd192YWx1ZS5zdWJzdHIocmF3X3ZhbHVlLmZpbmRfbGFzdF9vZignLicpICsgMSk7CisgIGlmICh0eXBlLklzTnVsbGFibGUoKSkgeworICAgIHZhbHVlID0gIlNvbWUoIiArIHZhbHVlICsgIikiOwogICB9CiAKLSAgcmV0dXJuIHJhd192YWx1ZTsKKyAgcmV0dXJuIHZhbHVlOwogfQogCiBzdGQ6OnN0cmluZyBHZXRSYXdSdXN0TmFtZShjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSkgewpAQCAtMTAwLDkgKzExNCwxMCBAQAogICAgICAgeyJkb3VibGUiLCAiZjY0In0sCiAgICAgICB7IlN0cmluZyIsICJTdHJpbmcifSwKICAgICAgIHsiSUJpbmRlciIsICJiaW5kZXI6OlNwSUJpbmRlciJ9LAotICAgICAgeyJQYXJjZWxGaWxlRGVzY3JpcHRvciIsICJiaW5kZXI6OnBhcmNlbDo6UGFyY2VsRmlsZURlc2NyaXB0b3IifSwKKyAgICAgIHsiUGFyY2VsRmlsZURlc2NyaXB0b3IiLCAiYmluZGVyOjpQYXJjZWxGaWxlRGVzY3JpcHRvciJ9LAorICAgICAgeyJQYXJjZWxhYmxlSG9sZGVyIiwgImJpbmRlcjo6UGFyY2VsYWJsZUhvbGRlciJ9LAogICB9OwotCisgIGNvbnN0IGJvb2wgaXNfdmVjdG9yID0gdHlwZS5Jc0FycmF5KCkgfHwgdHlwZW5hbWVzLklzTGlzdCh0eXBlKTsKICAgLy8gSWYgdGhlIHR5cGUgaXMgYW4gYXJyYXkvTGlzdDxUPiwgZ2V0IHRoZSBpbm5lciBlbGVtZW50IHR5cGUKICAgQUlETF9GQVRBTF9JRih0eXBlbmFtZXMuSXNMaXN0KHR5cGUpICYmIHR5cGUuR2V0VHlwZVBhcmFtZXRlcnMoKS5zaXplKCkgIT0gMSwgdHlwZSk7CiAgIGNvbnN0IGF1dG8mIGVsZW1lbnRfdHlwZSA9IHR5cGUuSXNHZW5lcmljKCkgPyAoKnR5cGUuR2V0VHlwZVBhcmFtZXRlcnMoKS5hdCgwKSkgOiB0eXBlOwpAQCAtMTEzLDggKzEyOCw4IEBACiAgICAgICByZXR1cm4gInU4IjsKICAgICB9IGVsc2UgaWYgKGVsZW1lbnRfdHlwZV9uYW1lID09ICJTdHJpbmciICYmIG1vZGUgPT0gU3RvcmFnZU1vZGU6OlVOU0laRURfQVJHVU1FTlQpIHsKICAgICAgIHJldHVybiAic3RyIjsKLSAgICB9IGVsc2UgaWYgKGVsZW1lbnRfdHlwZV9uYW1lID09ICJQYXJjZWxGaWxlRGVzY3JpcHRvciIpIHsKLSAgICAgIGlmICh0eXBlLklzQXJyYXkoKSAmJiBtb2RlID09IFN0b3JhZ2VNb2RlOjpERUZBVUxUX1ZBTFVFKSB7CisgICAgfSBlbHNlIGlmIChlbGVtZW50X3R5cGVfbmFtZSA9PSAiUGFyY2VsRmlsZURlc2NyaXB0b3IiIHx8IGVsZW1lbnRfdHlwZV9uYW1lID09ICJJQmluZGVyIikgeworICAgICAgaWYgKGlzX3ZlY3RvciAmJiBtb2RlID09IFN0b3JhZ2VNb2RlOjpERUZBVUxUX1ZBTFVFKSB7CiAgICAgICAgIC8vIE91dC1hcmd1bWVudHMgb2YgUGFyY2VsRmlsZURlc2NyaXB0b3JzIGFycmF5cyBuZWVkIHRvCiAgICAgICAgIC8vIGJlIFZlYzxPcHRpb248UGFyY2VsRmlsZURlc2NyaXB0b3I+PiBzbyByZXNpemVfb3V0X3ZlYwogICAgICAgICAvLyBjYW4gaW5pdGlhbGl6ZSBhbGwgZWxlbWVudHMgdG8gTm9uZSAoaXQgcmVxdWlyZXMgRGVmYXVsdApAQCAtMTI2LDUwICsxNDEsMTA4IEBACiAgICAgfQogICAgIHJldHVybiBtW2VsZW1lbnRfdHlwZV9uYW1lXTsKICAgfQorICBhdXRvIG5hbWUgPSBHZXRSYXdSdXN0TmFtZShlbGVtZW50X3R5cGUpOwogICBpZiAoVHlwZUlzSW50ZXJmYWNlKGVsZW1lbnRfdHlwZSwgdHlwZW5hbWVzKSkgewotICAgIHJldHVybiAiYmluZGVyOjpTdHJvbmc8ZHluICIgKyBHZXRSYXdSdXN0TmFtZShlbGVtZW50X3R5cGUpICsgIj4iOworICAgIG5hbWUgPSAiYmluZGVyOjpTdHJvbmc8ZHluICIgKyBuYW1lICsgIj4iOworICAgIGlmIChpc192ZWN0b3IgJiYgbW9kZSA9PSBTdG9yYWdlTW9kZTo6REVGQVVMVF9WQUxVRSkgeworICAgICAgLy8gT3V0LWFyZ3VtZW50cyBvZiBpbnRlcmZhY2UgYXJyYXlzIG5lZWQgdG8gYmUgVmVjPE9wdGlvbjwuLi4+PiBzbyByZXNpemVfb3V0X3ZlYworICAgICAgLy8gY2FuIGluaXRpYWxpemUgYWxsIGVsZW1lbnRzIHRvIE5vbmUuCisgICAgICBuYW1lID0gIk9wdGlvbjwiICsgbmFtZSArICI+IjsKKyAgICB9CiAgIH0KLQotICByZXR1cm4gR2V0UmF3UnVzdE5hbWUoZWxlbWVudF90eXBlKTsKKyAgcmV0dXJuIG5hbWU7CiB9CiB9ICAvLyBuYW1lc3BhY2UKIAotc3RkOjpzdHJpbmcgQ29uc3RhbnRWYWx1ZURlY29yYXRvcihjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHJhd192YWx1ZSkgewotICBhdXRvIHJ1c3RfdmFsdWUgPSBDb25zdGFudFZhbHVlRGVjb3JhdG9ySW50ZXJuYWwodHlwZSwgcmF3X3ZhbHVlLCBmYWxzZSk7Ci0gIGlmICh0eXBlLklzTnVsbGFibGUoKSkgewotICAgIHJldHVybiAiU29tZSgiICsgcnVzdF92YWx1ZSArICIpIjsKLSAgfQotICByZXR1cm4gcnVzdF92YWx1ZTsKK3N0ZDo6c3RyaW5nIENvbnN0YW50VmFsdWVEZWNvcmF0b3IoCisgICAgY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHR5cGUsCisgICAgY29uc3Qgc3RkOjp2YXJpYW50PHN0ZDo6c3RyaW5nLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4+JiByYXdfdmFsdWUpIHsKKyAgcmV0dXJuIENvbnN0YW50VmFsdWVEZWNvcmF0b3JJbnRlcm5hbCh0eXBlLCByYXdfdmFsdWUsIGZhbHNlKTsKIH0KIAotc3RkOjpzdHJpbmcgQ29uc3RhbnRWYWx1ZURlY29yYXRvclJlZihjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHJhd192YWx1ZSkgewotICBhdXRvIHJ1c3RfdmFsdWUgPSBDb25zdGFudFZhbHVlRGVjb3JhdG9ySW50ZXJuYWwodHlwZSwgcmF3X3ZhbHVlLCB0cnVlKTsKLSAgaWYgKHR5cGUuSXNOdWxsYWJsZSgpKSB7Ci0gICAgcmV0dXJuICJTb21lKCIgKyBydXN0X3ZhbHVlICsgIikiOworc3RkOjpzdHJpbmcgQ29uc3RhbnRWYWx1ZURlY29yYXRvclJlZigKKyAgICBjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSwKKyAgICBjb25zdCBzdGQ6OnZhcmlhbnQ8c3RkOjpzdHJpbmcsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPj4mIHJhd192YWx1ZSkgeworICByZXR1cm4gQ29uc3RhbnRWYWx1ZURlY29yYXRvckludGVybmFsKHR5cGUsIHJhd192YWx1ZSwgdHJ1ZSk7Cit9CisKKy8vIFJldHVybnMgZGVmYXVsdCB2YWx1ZSBmb3IgYXJyYXkuCitzdGQ6OnN0cmluZyBBcnJheURlZmF1bHRWYWx1ZShjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSkgeworICBBSURMX0ZBVEFMX0lGKCF0eXBlLklzRml4ZWRTaXplQXJyYXkoKSwgdHlwZSkgPDwgIm5vdCBhIGZpeGVkLXNpemUgYXJyYXkiOworICBhdXRvIGRpbWVuc2lvbnMgPSB0eXBlLkdldEZpeGVkU2l6ZUFycmF5RGltZW5zaW9ucygpOworICBzdGQ6OnN0cmluZyB2YWx1ZSA9ICJEZWZhdWx0OjpkZWZhdWx0KCkiOworICBmb3IgKGF1dG8gaXQgPSByYmVnaW4oZGltZW5zaW9ucyksIGVuZCA9IHJlbmQoZGltZW5zaW9ucyk7IGl0ICE9IGVuZDsgaXQrKykgeworICAgIHZhbHVlID0gIlsiICsgSm9pbihzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4oKml0LCB2YWx1ZSksICIsICIpICsgIl0iOwogICB9Ci0gIHJldHVybiBydXN0X3ZhbHVlOworICByZXR1cm4gdmFsdWU7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZiBAbnVsbGFibGUgVFtdIHNob3VsZCBiZSBtYXBwZWQgT3B0aW9uPFZlYzxPcHRpb248VD4+Citib29sIFVzZXNPcHRpb25Jbk51bGxhYmxlVmVjdG9yKGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiB0eXBlLCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMpIHsKKyAgQUlETF9GQVRBTF9JRighdHlwZS5Jc0FycmF5KCkgJiYgIXR5cGVuYW1lcy5Jc0xpc3QodHlwZSksIHR5cGUpIDw8ICJub3QgYSB2ZWN0b3IiOworICBBSURMX0ZBVEFMX0lGKHR5cGVuYW1lcy5Jc0xpc3QodHlwZSkgJiYgdHlwZS5HZXRUeXBlUGFyYW1ldGVycygpLnNpemUoKSAhPSAxLCB0eXBlKQorICAgICAgPDwgIkxpc3Qgc2hvdWxkIGhhdmUgYSBzaW5nbGUgdHlwZSBhcmcuIjsKKworICBjb25zdCBhdXRvJiBlbGVtZW50X3R5cGUgPSB0eXBlLklzQXJyYXkoKSA/IHR5cGUgOiAqdHlwZS5HZXRUeXBlUGFyYW1ldGVycygpLmF0KDApOworICBpZiAodHlwZW5hbWVzLklzUHJpbWl0aXZlVHlwZW5hbWUoZWxlbWVudF90eXBlLkdldE5hbWUoKSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKHR5cGVuYW1lcy5HZXRFbnVtRGVjbGFyYXRpb24oZWxlbWVudF90eXBlKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc3RkOjpzdHJpbmcgUnVzdExpZmV0aW1lTmFtZShMaWZldGltZSBsaWZldGltZSkgeworICBzd2l0Y2ggKGxpZmV0aW1lKSB7CisgICAgY2FzZSBMaWZldGltZTo6Tk9ORToKKyAgICAgIHJldHVybiAiIjsKKyAgICBjYXNlIExpZmV0aW1lOjpBOgorICAgICAgcmV0dXJuICInYSAiOworICB9Cit9CisKK3N0ZDo6c3RyaW5nIFJ1c3RMaWZldGltZUdlbmVyaWMoTGlmZXRpbWUgbGlmZXRpbWUpIHsKKyAgc3dpdGNoIChsaWZldGltZSkgeworICAgIGNhc2UgTGlmZXRpbWU6Ok5PTkU6CisgICAgICByZXR1cm4gIiI7CisgICAgY2FzZSBMaWZldGltZTo6QToKKyAgICAgIHJldHVybiAiPCdhPiI7CisgIH0KIH0KIAogc3RkOjpzdHJpbmcgUnVzdE5hbWVPZihjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlTW9kZSBtb2RlKSB7CisgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VNb2RlIG1vZGUsIExpZmV0aW1lIGxpZmV0aW1lKSB7CiAgIHN0ZDo6c3RyaW5nIHJ1c3RfbmFtZTsKICAgaWYgKHR5cGUuSXNBcnJheSgpIHx8IHR5cGVuYW1lcy5Jc0xpc3QodHlwZSkpIHsKICAgICBTdG9yYWdlTW9kZSBlbGVtZW50X21vZGU7Ci0gICAgaWYgKG1vZGUgPT0gU3RvcmFnZU1vZGU6Ok9VVF9BUkdVTUVOVCB8fCBtb2RlID09IFN0b3JhZ2VNb2RlOjpERUZBVUxUX1ZBTFVFKSB7CisgICAgaWYgKHR5cGUuSXNGaXhlZFNpemVBcnJheSgpICYmIG1vZGUgPT0gU3RvcmFnZU1vZGU6OlBBUkNFTEFCTEVfRklFTEQpIHsKKyAgICAgIC8vIEVsZW1lbnRzIG9mIGZpeGVkLXNpemUgYXJyYXkgZmllbGQgbmVlZCB0byBoYXZlIERlZmF1bHQuCisgICAgICBlbGVtZW50X21vZGUgPSBTdG9yYWdlTW9kZTo6REVGQVVMVF9WQUxVRTsKKyAgICB9IGVsc2UgaWYgKG1vZGUgPT0gU3RvcmFnZU1vZGU6Ok9VVF9BUkdVTUVOVCB8fCBtb2RlID09IFN0b3JhZ2VNb2RlOjpERUZBVUxUX1ZBTFVFKSB7CiAgICAgICAvLyBFbGVtZW50cyBuZWVkIHRvIGhhdmUgRGVmYXVsdCBmb3IgcmVzaXplX291dF92ZWMoKQogICAgICAgZWxlbWVudF9tb2RlID0gU3RvcmFnZU1vZGU6OkRFRkFVTFRfVkFMVUU7CiAgICAgfSBlbHNlIHsKICAgICAgIGVsZW1lbnRfbW9kZSA9IFN0b3JhZ2VNb2RlOjpWQUxVRTsKICAgICB9CiAgICAgcnVzdF9uYW1lID0gR2V0UnVzdE5hbWUodHlwZSwgdHlwZW5hbWVzLCBlbGVtZW50X21vZGUpOwotICAgIGlmICh0eXBlLklzTnVsbGFibGUoKSAmJiBydXN0X25hbWUgPT0gIlN0cmluZyIpIHsKKyAgICBpZiAodHlwZS5Jc051bGxhYmxlKCkgJiYgVXNlc09wdGlvbkluTnVsbGFibGVWZWN0b3IodHlwZSwgdHlwZW5hbWVzKSkgewogICAgICAgLy8gVGhlIG1hcHBpbmcgZm9yIG51bGxhYmxlIHN0cmluZyBhcnJheXMgaXMKICAgICAgIC8vIG9wdGlvbmFsPHZlY3RvcjxvcHRpb25hbDxzdHJpbmc+Pj4gaW4gdGhlIE5ESywKICAgICAgIC8vIHNvIHdlIGRvIHRoZSBzYW1lCi0gICAgICBydXN0X25hbWUgPSAiT3B0aW9uPCIgKyBydXN0X25hbWUgKyAiPiI7CisgICAgICAvLyBIb3dldmVyLCB3ZSBkb24ndCBuZWVkIHRvIHdoZW4gR2V0UnVzdE5hbWUoKSBhbHJlYWR5IHdyYXBzIGl0IHdpdGggT3B0aW9uLgorICAgICAgaWYgKCFiYXNlOjpTdGFydHNXaXRoKHJ1c3RfbmFtZSwgIk9wdGlvbjwiKSkgeworICAgICAgICBydXN0X25hbWUgPSAiT3B0aW9uPCIgKyBydXN0X25hbWUgKyAiPiI7CisgICAgICB9CiAgICAgfQogICAgIGlmIChtb2RlID09IFN0b3JhZ2VNb2RlOjpVTlNJWkVEX0FSR1VNRU5UKSB7CiAgICAgICBydXN0X25hbWUgPSAiWyIgKyBydXN0X25hbWUgKyAiXSI7CisgICAgfSBlbHNlIGlmICh0eXBlLklzRml4ZWRTaXplQXJyYXkoKSkgeworICAgICAgYXV0byBkaW1lbnNpb25zID0gdHlwZS5HZXRGaXhlZFNpemVBcnJheURpbWVuc2lvbnMoKTsKKyAgICAgIC8vIFRbTl1bTV0gPT4gW1tUOyBNXTsgTl0KKyAgICAgIGZvciAoYXV0byBpdCA9IHJiZWdpbihkaW1lbnNpb25zKSwgZW5kID0gcmVuZChkaW1lbnNpb25zKTsgaXQgIT0gZW5kOyBpdCsrKSB7CisgICAgICAgIHJ1c3RfbmFtZSA9ICJbIiArIHJ1c3RfbmFtZSArICI7ICIgKyBzdGQ6OnRvX3N0cmluZygqaXQpICsgIl0iOworICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICBydXN0X25hbWUgPSAiVmVjPCIgKyBydXN0X25hbWUgKyAiPiI7CiAgICAgfQpAQCAtMTgwLDIwICsyNTMsMjQgQEAKICAgaWYgKG1vZGUgPT0gU3RvcmFnZU1vZGU6OklOX0FSR1VNRU5UIHx8IG1vZGUgPT0gU3RvcmFnZU1vZGU6OlVOU0laRURfQVJHVU1FTlQpIHsKICAgICAvLyBJZiB0aGlzIGlzIGEgbnVsbGFibGUgaW5wdXQgYXJndW1lbnQsIHB1dCB0aGUgcmVmZXJlbmNlIGluc2lkZSB0aGUgb3B0aW9uLAogICAgIC8vIGUuZy4sIGBPcHRpb248JnN0cj5gIGluc3RlYWQgb2YgYCZPcHRpb248c3RyPmAKLSAgICBydXN0X25hbWUgPSAiJiIgKyBydXN0X25hbWU7CisgICAgcnVzdF9uYW1lID0gIiYiICsgUnVzdExpZmV0aW1lTmFtZShsaWZldGltZSkgKyBydXN0X25hbWU7CiAgIH0KIAogICBpZiAodHlwZS5Jc051bGxhYmxlKCkgfHwKICAgICAgIC8vIFNvbWUgdHlwZXMgZG9uJ3QgaW1wbGVtZW50IERlZmF1bHQsIHNvIHdlIHdyYXAgdGhlbQogICAgICAgLy8gaW4gT3B0aW9uLCB3aGljaCBkZWZhdWx0cyB0byBOb25lCi0gICAgICAoIVR5cGVIYXNEZWZhdWx0KHR5cGUsIHR5cGVuYW1lcykgJiYKKyAgICAgIChUeXBlTmVlZHNPcHRpb24odHlwZSwgdHlwZW5hbWVzKSAmJgogICAgICAgIChtb2RlID09IFN0b3JhZ2VNb2RlOjpERUZBVUxUX1ZBTFVFIHx8IG1vZGUgPT0gU3RvcmFnZU1vZGU6Ok9VVF9BUkdVTUVOVCB8fAogICAgICAgICBtb2RlID09IFN0b3JhZ2VNb2RlOjpQQVJDRUxBQkxFX0ZJRUxEKSkpIHsKLSAgICBydXN0X25hbWUgPSAiT3B0aW9uPCIgKyBydXN0X25hbWUgKyAiPiI7CisgICAgaWYgKHR5cGUuSXNIZWFwTnVsbGFibGUoKSkgeworICAgICAgcnVzdF9uYW1lID0gIk9wdGlvbjxCb3g8IiArIHJ1c3RfbmFtZSArICI+PiI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJ1c3RfbmFtZSA9ICJPcHRpb248IiArIHJ1c3RfbmFtZSArICI+IjsKKyAgICB9CiAgIH0KIAogICBpZiAobW9kZSA9PSBTdG9yYWdlTW9kZTo6T1VUX0FSR1VNRU5UIHx8IG1vZGUgPT0gU3RvcmFnZU1vZGU6OklOT1VUX0FSR1VNRU5UKSB7Ci0gICAgcnVzdF9uYW1lID0gIiZtdXQgIiArIHJ1c3RfbmFtZTsKKyAgICBydXN0X25hbWUgPSAiJiIgKyBSdXN0TGlmZXRpbWVOYW1lKGxpZmV0aW1lKSArICJtdXQgIiArIHJ1c3RfbmFtZTsKICAgfQogCiAgIHJldHVybiBydXN0X25hbWU7CkBAIC0yMDksOSArMjg2LDkgQEAKIAogICBjb25zdCBib29sIGlzRW51bSA9IGRlZmluZWRUeXBlICYmIGRlZmluZWRUeXBlLT5Bc0VudW1EZWNsYXJhdGlvbigpICE9IG51bGxwdHI7CiAgIGNvbnN0IGJvb2wgaXNQcmltaXRpdmUgPSBBaWRsVHlwZW5hbWVzOjpJc1ByaW1pdGl2ZVR5cGVuYW1lKHR5cGVOYW1lKTsKLSAgaWYgKHR5cGVOYW1lID09ICJTdHJpbmciIHx8IGFyZy5HZXRUeXBlKCkuSXNBcnJheSgpIHx8IHR5cGVuYW1lcy5Jc0xpc3QoYXJnLkdldFR5cGUoKSkpIHsKKyAgaWYgKHR5cGVOYW1lID09ICJTdHJpbmciIHx8IGFyZy5HZXRUeXBlKCkuSXNEeW5hbWljQXJyYXkoKSB8fCB0eXBlbmFtZXMuSXNMaXN0KGFyZy5HZXRUeXBlKCkpKSB7CiAgICAgcmV0dXJuIFN0b3JhZ2VNb2RlOjpVTlNJWkVEX0FSR1VNRU5UOwotICB9IGVsc2UgaWYgKCEoaXNQcmltaXRpdmUgfHwgaXNFbnVtKSkgeworICB9IGVsc2UgaWYgKCEoaXNQcmltaXRpdmUgfHwgaXNFbnVtKSB8fCBhcmcuR2V0VHlwZSgpLklzRml4ZWRTaXplQXJyYXkoKSkgewogICAgIHJldHVybiBTdG9yYWdlTW9kZTo6SU5fQVJHVU1FTlQ7CiAgIH0gZWxzZSB7CiAgICAgcmV0dXJuIFN0b3JhZ2VNb2RlOjpWQUxVRTsKQEAgLTI3MSwzMCArMzQ4LDM1IEBACiAgIHJldHVybiBkZWZpbmVkVHlwZSAhPSBudWxscHRyICYmIGRlZmluZWRUeXBlLT5Bc0ludGVyZmFjZSgpICE9IG51bGxwdHI7CiB9CiAKLWJvb2wgVHlwZUhhc0RlZmF1bHQoY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHR5cGUsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcykgeworYm9vbCBUeXBlTmVlZHNPcHRpb24oY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHR5cGUsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcykgewogICBpZiAodHlwZS5Jc0FycmF5KCkgfHwgdHlwZW5hbWVzLklzTGlzdCh0eXBlKSkgewotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKICAgfQogCiAgIC8vIEFscmVhZHkgYW4gT3B0aW9uPFQ+CiAgIGlmICh0eXBlLklzTnVsbGFibGUoKSkgewotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKICAgfQogCiAgIGNvbnN0IHN0cmluZyYgYWlkbF9uYW1lID0gdHlwZS5HZXROYW1lKCk7CiAgIGlmIChhaWRsX25hbWUgPT0gIklCaW5kZXIiKSB7Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiB0cnVlOwogICB9CiAgIGlmIChhaWRsX25hbWUgPT0gIlBhcmNlbEZpbGVEZXNjcmlwdG9yIikgeworICAgIHJldHVybiB0cnVlOworICB9CisgIGlmIChhaWRsX25hbWUgPT0gIlBhcmNlbGFibGVIb2xkZXIiKSB7CisgICAgLy8gUGFyY2VsYWJsZUhvbGRlciBuZXZlciBuZWVkcyBhbiBPcHRpb24gYmVjYXVzZSB3ZSBhbHdheXMKKyAgICAvLyBjYWxsIGl0cyBuZXcoKSBjb25zdHJ1Y3RvciBkaXJlY3RseSBpbnN0ZWFkIG9mIGRlZmF1bHQoKQogICAgIHJldHVybiBmYWxzZTsKICAgfQogCiAgIC8vIFN0cm9uZzxkeW4gSUZvbz4gdmFsdWVzIGRvbid0IGltcGxlbWVudCBEZWZhdWx0CiAgIGlmIChUeXBlSXNJbnRlcmZhY2UodHlwZSwgdHlwZW5hbWVzKSkgewotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gdHJ1ZTsKICAgfQogCi0gIHJldHVybiB0cnVlOworICByZXR1cm4gZmFsc2U7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBydXN0CmRpZmYgLS1naXQgYS9haWRsX3RvX3J1c3QuaCBiL2FpZGxfdG9fcnVzdC5oCmluZGV4IDI5MmU0ZGYuLjhhNDlhNTYgMTAwNjQ0Ci0tLSBhL2FpZGxfdG9fcnVzdC5oCisrKyBiL2FpZGxfdG9fcnVzdC5oCkBAIC00Miw2ICs0MiwxMSBAQAogICBBU19ERVJFRiwKIH07CiAKK2VudW0gY2xhc3MgTGlmZXRpbWUgeworICBOT05FLAorICBBLAorfTsKKwogaW5saW5lIGJvb2wgSXNSZWZlcmVuY2UoUmVmZXJlbmNlTW9kZSByZWZfbW9kZSkgewogICBzd2l0Y2ggKHJlZl9tb2RlKSB7CiAgICAgY2FzZSBSZWZlcmVuY2VNb2RlOjpSRUY6CkBAIC01MywxNCArNTgsMjkgQEAKICAgfQogfQogCi1zdGQ6OnN0cmluZyBDb25zdGFudFZhbHVlRGVjb3JhdG9yKGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiB0eXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgcmF3X3ZhbHVlKTsKK3N0ZDo6c3RyaW5nIENvbnN0YW50VmFsdWVEZWNvcmF0b3IoCisgICAgY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHR5cGUsCisgICAgY29uc3Qgc3RkOjp2YXJpYW50PHN0ZDo6c3RyaW5nLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4+JiByYXdfdmFsdWUpOwogCi1zdGQ6OnN0cmluZyBDb25zdGFudFZhbHVlRGVjb3JhdG9yUmVmKGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiB0eXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgcmF3X3ZhbHVlKTsKK3N0ZDo6c3RyaW5nIENvbnN0YW50VmFsdWVEZWNvcmF0b3JSZWYoCisgICAgY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHR5cGUsCisgICAgY29uc3Qgc3RkOjp2YXJpYW50PHN0ZDo6c3RyaW5nLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4+JiByYXdfdmFsdWUpOworCitzdGQ6OnN0cmluZyBBcnJheURlZmF1bHRWYWx1ZShjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSk7CisKKy8vIFJldHVybnMgIidsaWZldGltZV9uYW1lICIgaW5jbHVkaW5nIHRoZSBpbml0aWFsIGFwb3N0cm9waGUgYW5kIHRoZSB0cmFpbGluZyBzcGFjZS4KKy8vIFJldHVybnMgZW1wdHkgc3RyaW5nIGZvciBOT05FLgorc3RkOjpzdHJpbmcgUnVzdExpZmV0aW1lTmFtZShMaWZldGltZSBsaWZldGltZSk7CisKKy8vIFJldHVybnMgIjwnbGlmZXRpbWVfbmFtZT4iIG9yIGVtcHR5IHN0cmluZyBmb3IgTk9ORS4KK3N0ZDo6c3RyaW5nIFJ1c3RMaWZldGltZUdlbmVyaWMoTGlmZXRpbWUgbGlmZXRpbWUpOwogCiAvLyBSZXR1cm5zIHRoZSBSdXN0IHR5cGUgc2lnbmF0dXJlIG9mIHRoZSBBSURMIHR5cGUgc3BlYwogLy8gVGhpcyBpbmNsdWRlcyBnZW5lcmljIHR5cGUgcGFyYW1ldGVycyB3aXRoIGFycmF5IG1vZGlmaWVycy4KKy8vCisvLyBUaGUgbGlmZXRpbWUgYXJndW1lbnQgaXMgdXNlZCB0byBhbm5vdGF0ZSBhbGwgcmVmZXJlbmNlcy4KIHN0ZDo6c3RyaW5nIFJ1c3ROYW1lT2YoY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIGFpZGwsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZU1vZGUgbW9kZSk7CisgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VNb2RlIG1vZGUsIExpZmV0aW1lIGxpZmV0aW1lKTsKIAogU3RvcmFnZU1vZGUgQXJndW1lbnRTdG9yYWdlTW9kZShjb25zdCBBaWRsQXJndW1lbnQmIGFyZywgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzKTsKIApAQCAtNzAsNyArOTAsNyBAQAogCiBib29sIFR5cGVJc0ludGVyZmFjZShjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzKTsKIAotYm9vbCBUeXBlSGFzRGVmYXVsdChjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzKTsKK2Jvb2wgVHlwZU5lZWRzT3B0aW9uKGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiB0eXBlLCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMpOwogCiB9ICAvLyBuYW1lc3BhY2UgcnVzdAogfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL2FpZGxfdHlwZW5hbWVzLmNwcCBiL2FpZGxfdHlwZW5hbWVzLmNwcAppbmRleCA4NDQwNDYzLi42N2RhNGU3IDEwMDY0NAotLS0gYS9haWRsX3R5cGVuYW1lcy5jcHAKKysrIGIvYWlkbF90eXBlbmFtZXMuY3BwCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSAiYWlkbF9sYW5ndWFnZS5oIgogI2luY2x1ZGUgImxvZ2dpbmcuaCIKIAorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3MuaD4KIAogI2luY2x1ZGUgPG1hcD4KQEAgLTEwMyw0MyArMTA0LDg3IEBACiB9CiAKIGJvb2wgQWlkbFR5cGVuYW1lczo6SXNJZ25vcmFibGVJbXBvcnQoY29uc3Qgc3RyaW5nJiBpbXBvcnQpIGNvbnN0IHsKKyAgaWYgKElzQnVpbHRpblR5cGVuYW1lKGltcG9ydCkpIHJldHVybiB0cnVlOworCiAgIHN0YXRpYyBzZXQ8c3RyaW5nPiBpZ25vcmVfaW1wb3J0ID0gewogICAgICAgImFuZHJvaWQub3MuSUludGVyZmFjZSIsICAgImFuZHJvaWQub3MuSUJpbmRlciIsICJhbmRyb2lkLm9zLlBhcmNlbGFibGUiLCAiYW5kcm9pZC5vcy5QYXJjZWwiLAogICAgICAgImFuZHJvaWQuY29udGVudC5Db250ZXh0IiwgImphdmEubGFuZy5TdHJpbmciLCAgICJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIn07CiAgIC8vIHRoZXNlIGtub3duIGJ1aWx0LWluIHR5cGVzIGRvbid0IG5lZWQgdG8gYmUgaW1wb3J0ZWQKLSAgY29uc3QgYm9vbCBpbl9pZ25vcmVfaW1wb3J0ID0gaWdub3JlX2ltcG9ydC5maW5kKGltcG9ydCkgIT0gaWdub3JlX2ltcG9ydC5lbmQoKTsKLSAgLy8gYW4gYWxyZWFkeSBkZWZpbmVkIHR5cGUgZG9lc24ndCBuZWVkIHRvIGJlIGltcG9ydGVkIGFnYWluIHVubGVzcyBpdCBpcyBmcm9tCi0gIC8vIHRoZSBwcmVwcm9jZXNzZWQgZmlsZQotICBhdXRvIHJldCA9IFRyeUdldERlZmluZWRUeXBlSW1wbChpbXBvcnQpOwotICBjb25zdCBib29sIGRlZmluZWRfdHlwZV9ub3RfZnJvbV9wcmVwcm9jZXNzZWQgPSByZXQudHlwZSAhPSBudWxscHRyICYmICFyZXQuZnJvbV9wcmVwcm9jZXNzZWQ7Ci0gIHJldHVybiBpbl9pZ25vcmVfaW1wb3J0IHx8IGRlZmluZWRfdHlwZV9ub3RfZnJvbV9wcmVwcm9jZXNzZWQ7CisgIGlmIChpZ25vcmVfaW1wb3J0LmZpbmQoaW1wb3J0KSAhPSBpZ25vcmVfaW1wb3J0LmVuZCgpKSByZXR1cm4gdHJ1ZTsKKworICBpZiAoVHJ5R2V0RGVmaW5lZFR5cGUoaW1wb3J0KSkgcmV0dXJuIHRydWU7CisKKyAgcmV0dXJuIGZhbHNlOwogfQogCisvLyBBZGQgYSBwYXJzZWQgZG9jdW1lbnQgYW5kIHBvcHVsYXRlIHR5cGUgbmFtZXMgaW4gaXQuCisvLyBOYW1lIGNvbmZsaWN0IGlzIGFuIGVycm9yIHVubGVzcyBvbmUgb2YgdGhlbSBpcyBmcm9tIHByZXByb2Nlc3NlZC4KKy8vIEZvciBsZWdhY3ksIHdlIHBvcHVsYXRlIHVucXVhbGlmaWVkIG5hbWVzIGZyb20gcHJlcHJvY2Vzc2VkIHVuc3RydWN0dXJlZCBwYXJjZWxhYmxlIHR5cGVzCisvLyBzbyB0aGF0IHRoZXkgY2FuIGJlIHJlZmVyZW5jZWQgdmlhIGEgc2ltcGxlIG5hbWUuCiBib29sIEFpZGxUeXBlbmFtZXM6OkFkZERvY3VtZW50KHN0ZDo6dW5pcXVlX3B0cjxBaWRsRG9jdW1lbnQ+IGRvYykgewotICBmb3IgKGNvbnN0IGF1dG8mIHR5cGUgOiBkb2MtPkRlZmluZWRUeXBlcygpKSB7Ci0gICAgaWYgKGRlZmluZWRfdHlwZXNfLmZpbmQodHlwZS0+R2V0Q2Fub25pY2FsTmFtZSgpKSAhPSBkZWZpbmVkX3R5cGVzXy5lbmQoKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoIUhhc1ZhbGlkTmFtZUNvbXBvbmVudHMoKnR5cGUpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0gIGRvY3VtZW50c18ucHVzaF9iYWNrKHN0ZDo6bW92ZShkb2MpKTsKLSAgZm9yIChjb25zdCBhdXRvJiB0eXBlIDogZG9jdW1lbnRzXy5iYWNrKCktPkRlZmluZWRUeXBlcygpKSB7Ci0gICAgZGVmaW5lZF90eXBlc18uZW1wbGFjZSh0eXBlLT5HZXRDYW5vbmljYWxOYW1lKCksIHR5cGUuZ2V0KCkpOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQorICBib29sIGlzX3ByZXByb2Nlc3NlZCA9IGRvYy0+SXNQcmVwcm9jZXNzZWQoKTsKKyAgc3RkOjp2ZWN0b3I8QWlkbERlZmluZWRUeXBlKj4gdHlwZXNfdG9fYWRkOworICAvLyBBZGQgdHlwZXMgaW4gdHdvIHN0ZXBzIHRvIGF2b2lkIGFkZGluZyBhIHR5cGUgd2hpbGUgdGhlIGRvYyBpcyByZWplY3RlZC4KKyAgLy8gMS4gZmlsdGVyIHR5cGVzIHRvIGFkZAorICAvLyAyLiBhZGQgdHlwZXMKIAotY29uc3QgQWlkbERvY3VtZW50KiBBaWRsVHlwZW5hbWVzOjpHZXREb2N1bWVudEZvcihjb25zdCBBaWRsRGVmaW5lZFR5cGUqIHR5cGUpIGNvbnN0IHsKLSAgZm9yIChjb25zdCBhdXRvJiBkb2MgOiBBbGxEb2N1bWVudHMoKSkgewotICAgIGZvciAoY29uc3QgYXV0byYgZGVmaW5lZF90eXBlIDogZG9jLT5EZWZpbmVkVHlwZXMoKSkgewotICAgICAgaWYgKGRlZmluZWRfdHlwZS5nZXQoKSA9PSB0eXBlKSB7Ci0gICAgICAgIHJldHVybiBkb2MuZ2V0KCk7CisgIHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QWlkbERlZmluZWRUeXBlPj4mKT4gY29sbGVjdF90eXBlc190b19hZGQ7CisgIGNvbGxlY3RfdHlwZXNfdG9fYWRkID0gWyZdKGF1dG8mIHR5cGVzKSB7CisgICAgZm9yIChjb25zdCBhdXRvJiB0eXBlIDogdHlwZXMpIHsKKyAgICAgIGlmIChJc0J1aWx0aW5UeXBlbmFtZSh0eXBlLT5HZXROYW1lKCkpKSB7CisgICAgICAgIC8vIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGlzIHRyZWF0ZWQgYXMgYSBidWlsdC1pbiB0eXBlLCBidXQgaXQncyBhbHNvIGluIHRoZSBmcmFtZXdvcmsuYWlkbC4KKyAgICAgICAgLy8gU28gYWlkbCBzaG91bGQgaWdub3JlIGJ1aWx0LWluIHR5cGVzIGluIGZyYW1ld29yay5haWRsIHRvIHByZXZlbnQgZHVwbGljYXRpb24uCisgICAgICAgIC8vIChiLzEzMDg5OTQ5MSkKKyAgICAgICAgaWYgKGlzX3ByZXByb2Nlc3NlZCkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIC8vIEhhc1ZhbGlkTmFtZUNvbXBvbmVudHMgaGFuZGxlcyBuYW1lIGNvbmZsaWN0cyB3aXRoIGJ1aWx0LWluIHR5cGVzCisgICAgICB9CisKKyAgICAgIGlmIChhdXRvIHByZXZfZGVmaW5pdGlvbiA9IGRlZmluZWRfdHlwZXNfLmZpbmQodHlwZS0+R2V0Q2Fub25pY2FsTmFtZSgpKTsKKyAgICAgICAgICBwcmV2X2RlZmluaXRpb24gIT0gZGVmaW5lZF90eXBlc18uZW5kKCkpIHsKKyAgICAgICAgLy8gU2tpcCBkdXBsaWNhdGUgdHlwZSBpbiBwcmVwcm9jZXNzZWQgZG9jdW1lbnQKKyAgICAgICAgaWYgKGlzX3ByZXByb2Nlc3NlZCkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIC8vIE92ZXJ3cml0ZSBkdXBsaWNhdGUgdHlwZSB3aGljaCBpcyBhbHJlYWR5IGFkZGVkIHZpYSBwcmVwcm9jZXNzZWQgd2l0aCBhIG5ldyBvbmUKKyAgICAgICAgaWYgKCFwcmV2X2RlZmluaXRpb24tPnNlY29uZC0+R2V0RG9jdW1lbnQoKS5Jc1ByZXByb2Nlc3NlZCgpKSB7CisgICAgICAgICAgQUlETF9FUlJPUih0eXBlKSA8PCAicmVkZWZpbml0aW9uOiAiIDw8IHR5cGUtPkdldENhbm9uaWNhbE5hbWUoKSA8PCAiIGlzIGRlZmluZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgcHJldl9kZWZpbml0aW9uLT5zZWNvbmQtPkdldExvY2F0aW9uKCk7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmICghSGFzVmFsaWROYW1lQ29tcG9uZW50cygqdHlwZSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICB0eXBlc190b19hZGQucHVzaF9iYWNrKHR5cGUuZ2V0KCkpOworCisgICAgICAvLyByZWN1cnNpdmVseSBjaGVjayBuZXN0ZWQgdHlwZXMKKyAgICAgIGlmICghY29sbGVjdF90eXBlc190b19hZGQodHlwZS0+R2V0TmVzdGVkVHlwZXMoKSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgfQogICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfTsKKworICBpZiAoIWNvbGxlY3RfdHlwZXNfdG9fYWRkKGRvYy0+RGVmaW5lZFR5cGVzKCkpKSB7CisgICAgcmV0dXJuIGZhbHNlOwogICB9Ci0gIHJldHVybiBudWxscHRyOworCisgIGZvciAoY29uc3QgYXV0byYgdHlwZSA6IHR5cGVzX3RvX2FkZCkgeworICAgIC8vIHBvcHVsYXRlIGdsb2JhbCAndHlwZScgbmFtZXNwYWNlIHdpdGggZnVsbHktcXVhbGlmaWVkIG5hbWVzCisgICAgZGVmaW5lZF90eXBlc18uZW1wbGFjZSh0eXBlLT5HZXRDYW5vbmljYWxOYW1lKCksIHR5cGUpOworICAgIC8vIHByZXByb2Nlc3NlZCB1bnN0cnVjdHVyZWQgcGFyY2VsYWJsZSB0eXBlcyBjYW4gYmUgcmVmZXJlbmNlZCB3aXRob3V0IHF1YWxpZmljYXRpb24KKyAgICBpZiAoaXNfcHJlcHJvY2Vzc2VkICYmIHR5cGUtPkFzVW5zdHJ1Y3R1cmVkUGFyY2VsYWJsZSgpKSB7CisgICAgICBkZWZpbmVkX3R5cGVzXy5lbXBsYWNlKHR5cGUtPkdldE5hbWUoKSwgdHlwZSk7CisgICAgfQorICB9CisKKyAgLy8gdHJhbnNmZXIgb3duZXJzaGlwIG9mIGRvY3VtZW50CisgIGRvY3VtZW50c18ucHVzaF9iYWNrKHN0ZDo6bW92ZShkb2MpKTsKKyAgcmV0dXJuIHRydWU7CiB9CiAKIGNvbnN0IEFpZGxEb2N1bWVudCYgQWlkbFR5cGVuYW1lczo6TWFpbkRvY3VtZW50KCkgY29uc3QgewpAQCAtMTQ3LDE4ICsxOTIsNiBAQAogICByZXR1cm4gKihkb2N1bWVudHNfWzBdKTsKIH0KIAotYm9vbCBBaWRsVHlwZW5hbWVzOjpBZGRQcmVwcm9jZXNzZWRUeXBlKHVuaXF1ZV9wdHI8QWlkbERlZmluZWRUeXBlPiB0eXBlKSB7Ci0gIGNvbnN0IHN0cmluZyBuYW1lID0gdHlwZS0+R2V0Q2Fub25pY2FsTmFtZSgpOwotICBpZiAocHJlcHJvY2Vzc2VkX3R5cGVzXy5maW5kKG5hbWUpICE9IHByZXByb2Nlc3NlZF90eXBlc18uZW5kKCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFIYXNWYWxpZE5hbWVDb21wb25lbnRzKCp0eXBlKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBwcmVwcm9jZXNzZWRfdHlwZXNfLmluc2VydChtYWtlX3BhaXIobmFtZSwgc3RkOjptb3ZlKHR5cGUpKSk7Ci0gIHJldHVybiB0cnVlOwotfQotCiBib29sIEFpZGxUeXBlbmFtZXM6OklzQnVpbHRpblR5cGVuYW1lKGNvbnN0IHN0cmluZyYgdHlwZV9uYW1lKSB7CiAgIHJldHVybiBrQnVpbHRpblR5cGVzLmZpbmQodHlwZV9uYW1lKSAhPSBrQnVpbHRpblR5cGVzLmVuZCgpIHx8CiAgICAgICBrSmF2YUxpa2VUeXBlVG9BaWRsVHlwZS5maW5kKHR5cGVfbmFtZSkgIT0ga0phdmFMaWtlVHlwZVRvQWlkbFR5cGUuZW5kKCk7CkBAIC0xNzksNDUgKzIxMiwyMyBAQAogfQogCiBjb25zdCBBaWRsRGVmaW5lZFR5cGUqIEFpZGxUeXBlbmFtZXM6OlRyeUdldERlZmluZWRUeXBlKGNvbnN0IHN0cmluZyYgdHlwZV9uYW1lKSBjb25zdCB7Ci0gIHJldHVybiBUcnlHZXREZWZpbmVkVHlwZUltcGwodHlwZV9uYW1lKS50eXBlOwotfQotCi1BaWRsVHlwZW5hbWVzOjpEZWZpbmVkSW1wbFJlc3VsdCBBaWRsVHlwZW5hbWVzOjpUcnlHZXREZWZpbmVkVHlwZUltcGwoCi0gICAgY29uc3Qgc3RyaW5nJiB0eXBlX25hbWUpIGNvbnN0IHsKLSAgLy8gRG8gdGhlIGV4YWN0IG1hdGNoIGZpcnN0LgogICBhdXRvIGZvdW5kX2RlZiA9IGRlZmluZWRfdHlwZXNfLmZpbmQodHlwZV9uYW1lKTsKICAgaWYgKGZvdW5kX2RlZiAhPSBkZWZpbmVkX3R5cGVzXy5lbmQoKSkgewotICAgIHJldHVybiBEZWZpbmVkSW1wbFJlc3VsdChmb3VuZF9kZWYtPnNlY29uZCwgZmFsc2UpOworICAgIHJldHVybiBmb3VuZF9kZWYtPnNlY29uZDsKICAgfQotCi0gIGF1dG8gZm91bmRfcHJlcCA9IHByZXByb2Nlc3NlZF90eXBlc18uZmluZCh0eXBlX25hbWUpOwotICBpZiAoZm91bmRfcHJlcCAhPSBwcmVwcm9jZXNzZWRfdHlwZXNfLmVuZCgpKSB7Ci0gICAgcmV0dXJuIERlZmluZWRJbXBsUmVzdWx0KGZvdW5kX3ByZXAtPnNlY29uZC5nZXQoKSwgdHJ1ZSk7Ci0gIH0KLQotICAvLyBUaGVuIG1hdGNoIHdpdGggdGhlIGNsYXNzIG5hbWUuIERlZmluZWQgdHlwZXMgaGFzIGhpZ2hlciBwcmlvcml0eSB0aGFuCi0gIC8vIHR5cGVzIGZyb20gdGhlIHByZXByb2Nlc3NlZCBmaWxlLgotICBmb3IgKGF1dG8gaXQgPSBkZWZpbmVkX3R5cGVzXy5iZWdpbigpOyBpdCAhPSBkZWZpbmVkX3R5cGVzXy5lbmQoKTsgaXQrKykgewotICAgIGlmIChpdC0+c2Vjb25kLT5HZXROYW1lKCkgPT0gdHlwZV9uYW1lKSB7Ci0gICAgICByZXR1cm4gRGVmaW5lZEltcGxSZXN1bHQoaXQtPnNlY29uZCwgZmFsc2UpOwotICAgIH0KLSAgfQotCi0gIGZvciAoYXV0byBpdCA9IHByZXByb2Nlc3NlZF90eXBlc18uYmVnaW4oKTsgaXQgIT0gcHJlcHJvY2Vzc2VkX3R5cGVzXy5lbmQoKTsgaXQrKykgewotICAgIGlmIChpdC0+c2Vjb25kLT5HZXROYW1lKCkgPT0gdHlwZV9uYW1lKSB7Ci0gICAgICByZXR1cm4gRGVmaW5lZEltcGxSZXN1bHQoaXQtPnNlY29uZC5nZXQoKSwgdHJ1ZSk7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIERlZmluZWRJbXBsUmVzdWx0KG51bGxwdHIsIGZhbHNlKTsKKyAgcmV0dXJuIG51bGxwdHI7CiB9CiAKLXN0ZDo6dmVjdG9yPEFpZGxEZWZpbmVkVHlwZSo+IEFpZGxUeXBlbmFtZXM6OkFsbERlZmluZWRUeXBlcygpIGNvbnN0IHsKLSAgc3RkOjp2ZWN0b3I8QWlkbERlZmluZWRUeXBlKj4gcmVzOwotICBmb3IgKGNvbnN0IGF1dG8mIGQgOiBBbGxEb2N1bWVudHMoKSkgewotICAgIGZvciAoY29uc3QgYXV0byYgdCA6IGQtPkRlZmluZWRUeXBlcygpKSB7Ci0gICAgICByZXMucHVzaF9iYWNrKHQuZ2V0KCkpOwotICAgIH0KK3N0ZDo6dmVjdG9yPGNvbnN0IEFpZGxEZWZpbmVkVHlwZSo+IEFpZGxUeXBlbmFtZXM6OkFsbERlZmluZWRUeXBlcygpIGNvbnN0IHsKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgQWlkbERlZmluZWRUeXBlKj4gcmVzOworICBmb3IgKGNvbnN0IGF1dG8mIGRvYyA6IEFsbERvY3VtZW50cygpKSB7CisgICAgVmlzaXRUb3BEb3duKAorICAgICAgICBbJl0oY29uc3QgQWlkbE5vZGUmIG5vZGUpIHsKKyAgICAgICAgICBpZiAoYXV0byBkZWZpbmVkX3R5cGUgPSBBaWRsQ2FzdDxBaWRsRGVmaW5lZFR5cGU+KG5vZGUpOyBkZWZpbmVkX3R5cGUpIHsKKyAgICAgICAgICAgIHJlcy5wdXNoX2JhY2soZGVmaW5lZF90eXBlKTsKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICpkb2MpOwogICB9CiAgIHJldHVybiByZXM7CiB9CkBAIC0yMzgsNiArMjQ5LDIwIEBACiAgIH0KIH0KIAorc3RkOjp1bmlxdWVfcHRyPEFpZGxUeXBlU3BlY2lmaWVyPiBBaWRsVHlwZW5hbWVzOjpNYWtlUmVzb2x2ZWRUeXBlKGNvbnN0IEFpZGxMb2NhdGlvbiYgbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfYXJyYXkpIGNvbnN0IHsKKyAgc3RkOjpvcHRpb25hbDxBcnJheVR5cGU+IGFycmF5OworICBpZiAoaXNfYXJyYXkpIHsKKyAgICBhcnJheSA9IER5bmFtaWNBcnJheXt9OworICB9CisgIHN0ZDo6dW5pcXVlX3B0cjxBaWRsVHlwZVNwZWNpZmllcj4gdHlwZSgKKyAgICAgIG5ldyBBaWRsVHlwZVNwZWNpZmllcihsb2NhdGlvbiwgbmFtZSwgc3RkOjptb3ZlKGFycmF5KSwgbnVsbHB0ciwge30pKTsKKyAgQUlETF9GQVRBTF9JRighdHlwZS0+UmVzb2x2ZSgqdGhpcywgbnVsbHB0ciksIHR5cGUpIDw8ICJDYW4ndCBtYWtlIHVua25vd24gdHlwZTogIiA8PCBuYW1lOworICB0eXBlLT5NYXJrVmlzaXRlZCgpOworICByZXR1cm4gdHlwZTsKK30KKwogLy8gT25seSBpbW11dGFibGUgUGFyY2VsYWJsZSwgcHJpbWl0aXZlIHR5cGUsIGFuZCBTdHJpbmcsIGFuZCBMaXN0LCBNYXAsIGFycmF5IG9mIHRoZSB0eXBlcyBjYW4gYmUKIC8vIGltbXV0YWJsZS4KIGJvb2wgQWlkbFR5cGVuYW1lczo6Q2FuQmVKYXZhT25seUltbXV0YWJsZShjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSkgY29uc3QgewpAQCAtMjY2LDEwICsyOTEsMTYgQEAKICAgcmV0dXJuIHQtPklzSmF2YU9ubHlJbW11dGFibGUoKTsKIH0KIAotLy8gT25seSBGaXhlZFNpemUgUGFyY2VsYWJsZSwgcHJpbWl0aXZlIHR5cGVzLCBhbmQgZW51bSB0eXBlcyBjYW4gYmUgRml4ZWRTaXplLgorLy8gRm9sbG93aW5ncyBjYW4gYmUgRml4ZWRTaXplOgorLy8gLSBARml4ZWRTaXplIHBhcmNlbGFibGVzCisvLyAtIHByaW1pdGl2ZSB0eXBlcyBhbmQgZW51bSB0eXBlcworLy8gLSBmaXhlZC1zaXplIGFycmF5cyBvZiBGaXhlZFNpemUgdHlwZXMKIGJvb2wgQWlkbFR5cGVuYW1lczo6Q2FuQmVGaXhlZFNpemUoY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHR5cGUpIGNvbnN0IHsKICAgY29uc3Qgc3RyaW5nJiBuYW1lID0gdHlwZS5HZXROYW1lKCk7Ci0gIGlmICh0eXBlLklzR2VuZXJpYygpIHx8IHR5cGUuSXNBcnJheSgpKSB7CisgIGlmICh0eXBlLklzR2VuZXJpYygpIHx8IHR5cGUuSXNOdWxsYWJsZSgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICh0eXBlLklzQXJyYXkoKSAmJiAhdHlwZS5Jc0ZpeGVkU2l6ZUFycmF5KCkpIHsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KICAgaWYgKElzUHJpbWl0aXZlVHlwZW5hbWUobmFtZSkpIHsKQEAgLTM2Myw5ICszOTQsNiBAQAogICBmb3IgKGNvbnN0IGF1dG8mIGt2IDogZGVmaW5lZF90eXBlc18pIHsKICAgICBib2R5KCprdi5zZWNvbmQpOwogICB9Ci0gIGZvciAoY29uc3QgYXV0byYga3YgOiBwcmVwcm9jZXNzZWRfdHlwZXNfKSB7Ci0gICAgYm9keSgqa3Yuc2Vjb25kKTsKLSAgfQogfQogCiBib29sIEFpZGxUeXBlbmFtZXM6OkF1dG9maWxsKCkgY29uc3QgewpkaWZmIC0tZ2l0IGEvYWlkbF90eXBlbmFtZXMuaCBiL2FpZGxfdHlwZW5hbWVzLmgKaW5kZXggZjg2ZjE1OC4uOWFlODUxZCAxMDA2NDQKLS0tIGEvYWlkbF90eXBlbmFtZXMuaAorKysgYi9haWRsX3R5cGVuYW1lcy5oCkBAIC0zNSw2ICszNSw3IEBACiBjbGFzcyBBaWRsRGVmaW5lZFR5cGU7CiBjbGFzcyBBaWRsRW51bURlY2xhcmF0aW9uOwogY2xhc3MgQWlkbEludGVyZmFjZTsKK2NsYXNzIEFpZGxMb2NhdGlvbjsKIGNsYXNzIEFpZGxQYXJjZWxhYmxlOwogY2xhc3MgQWlkbFR5cGVTcGVjaWZpZXI7CiBjbGFzcyBBaWRsRG9jdW1lbnQ7CkBAIC01OCwxNSArNTksMTMgQEAKICBwdWJsaWM6CiAgIEFpZGxUeXBlbmFtZXMoKSA9IGRlZmF1bHQ7CiAgIGJvb2wgQWRkRG9jdW1lbnQoc3RkOjp1bmlxdWVfcHRyPEFpZGxEb2N1bWVudD4gZG9jKTsKLSAgY29uc3QgQWlkbERvY3VtZW50KiBHZXREb2N1bWVudEZvcihjb25zdCBBaWRsRGVmaW5lZFR5cGUqIHR5cGUpIGNvbnN0OwogICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QWlkbERvY3VtZW50Pj4mIEFsbERvY3VtZW50cygpIGNvbnN0IHsgcmV0dXJuIGRvY3VtZW50c187IH0KICAgY29uc3QgQWlkbERvY3VtZW50JiBNYWluRG9jdW1lbnQoKSBjb25zdDsKLSAgYm9vbCBBZGRQcmVwcm9jZXNzZWRUeXBlKHVuaXF1ZV9wdHI8QWlkbERlZmluZWRUeXBlPiB0eXBlKTsKICAgc3RhdGljIGJvb2wgSXNCdWlsdGluVHlwZW5hbWUoY29uc3Qgc3RyaW5nJiB0eXBlX25hbWUpOwogICBzdGF0aWMgYm9vbCBJc1ByaW1pdGl2ZVR5cGVuYW1lKGNvbnN0IHN0cmluZyYgdHlwZV9uYW1lKTsKICAgYm9vbCBJc1BhcmNlbGFibGUoY29uc3Qgc3RyaW5nJiB0eXBlX25hbWUpIGNvbnN0OwogICBjb25zdCBBaWRsRGVmaW5lZFR5cGUqIFRyeUdldERlZmluZWRUeXBlKGNvbnN0IHN0cmluZyYgdHlwZV9uYW1lKSBjb25zdDsKLSAgc3RkOjp2ZWN0b3I8QWlkbERlZmluZWRUeXBlKj4gQWxsRGVmaW5lZFR5cGVzKCkgY29uc3Q7CisgIHN0ZDo6dmVjdG9yPGNvbnN0IEFpZGxEZWZpbmVkVHlwZSo+IEFsbERlZmluZWRUeXBlcygpIGNvbnN0OwogCiAgIHN0cnVjdCBSZXNvbHZlZFR5cGVuYW1lIHsKICAgICBzdGQ6OnN0cmluZyBjYW5vbmljYWxfbmFtZTsKQEAgLTc0LDYgKzczLDggQEAKICAgICBjb25zdCBBaWRsRGVmaW5lZFR5cGUqIGRlZmluZWRfdHlwZTsKICAgfTsKICAgUmVzb2x2ZWRUeXBlbmFtZSBSZXNvbHZlVHlwZW5hbWUoY29uc3Qgc3RyaW5nJiB0eXBlX25hbWUpIGNvbnN0OworICBzdGQ6OnVuaXF1ZV9wdHI8QWlkbFR5cGVTcGVjaWZpZXI+IE1ha2VSZXNvbHZlZFR5cGUoY29uc3QgQWlkbExvY2F0aW9uJiBsb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgbmFtZSwgYm9vbCBpc19hcnJheSkgY29uc3Q7CiAgIEFyZ3VtZW50QXNwZWN0IEdldEFyZ3VtZW50QXNwZWN0KGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiB0eXBlKSBjb25zdDsKICAgYm9vbCBDYW5CZUphdmFPbmx5SW1tdXRhYmxlKGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiB0eXBlKSBjb25zdDsKICAgYm9vbCBDYW5CZUZpeGVkU2l6ZShjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSkgY29uc3Q7CkBAIC04OSwyMSArOTAsMTMgQEAKICAgLy8gUmV0dXJucyB0aGUgQWlkbFBhcmNlbGFibGUgb2YgdGhlIGdpdmVuIHR5cGUsIG9yIG51bGxwdHIgaWYgdGhlIHR5cGUKICAgLy8gaXMgbm90IGFuIEFpZGxQYXJjZWxhYmxlOwogICBjb25zdCBBaWRsUGFyY2VsYWJsZSogR2V0UGFyY2VsYWJsZShjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSkgY29uc3Q7Ci0gIC8vIEl0ZXJhdGVzIG92ZXIgYWxsIGRlZmluZWQgYW5kIHRoZW4gcHJlcHJvY2Vzc2VkIHR5cGVzCisgIC8vIEl0ZXJhdGVzIG92ZXIgYWxsIGRlZmluZWQgdHlwZXMKICAgdm9pZCBJdGVyYXRlVHlwZXMoY29uc3Qgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IEFpZGxEZWZpbmVkVHlwZSYpPiYgYm9keSkgY29uc3Q7CiAgIC8vIEZpeGVzIEFTVCBhZnRlciB0eXBlL3JlZiByZXNvbHV0aW9uIGJlZm9yZSB2YWxpZGF0aW9uCiAgIGJvb2wgQXV0b2ZpbGwoKSBjb25zdDsKIAogIHByaXZhdGU6Ci0gIHN0cnVjdCBEZWZpbmVkSW1wbFJlc3VsdCB7Ci0gICAgRGVmaW5lZEltcGxSZXN1bHQoY29uc3QgQWlkbERlZmluZWRUeXBlKiB0eXBlLCBjb25zdCBib29sIGZyb21fcHJlcHJvY2Vzc2VkKQotICAgICAgICA6IHR5cGUodHlwZSksIGZyb21fcHJlcHJvY2Vzc2VkKGZyb21fcHJlcHJvY2Vzc2VkKSB7fQotICAgIGNvbnN0IEFpZGxEZWZpbmVkVHlwZSogdHlwZTsKLSAgICBjb25zdCBib29sIGZyb21fcHJlcHJvY2Vzc2VkOwotICB9OwotICBEZWZpbmVkSW1wbFJlc3VsdCBUcnlHZXREZWZpbmVkVHlwZUltcGwoY29uc3Qgc3RyaW5nJiB0eXBlX25hbWUpIGNvbnN0OwogICBtYXA8c3RyaW5nLCBBaWRsRGVmaW5lZFR5cGUqPiBkZWZpbmVkX3R5cGVzXzsKLSAgbWFwPHN0cmluZywgdW5pcXVlX3B0cjxBaWRsRGVmaW5lZFR5cGU+PiBwcmVwcm9jZXNzZWRfdHlwZXNfOwogICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QWlkbERvY3VtZW50Pj4gZG9jdW1lbnRzXzsKIH07CiAKZGlmZiAtLWdpdCBhL2FpZGxfdW5pdHRlc3QuY3BwIGIvYWlkbF91bml0dGVzdC5jcHAKaW5kZXggZWVmNjA3Zi4uZWUwZGU1NCAxMDA2NDQKLS0tIGEvYWlkbF91bml0dGVzdC5jcHAKKysrIGIvYWlkbF91bml0dGVzdC5jcHAKQEAgLTI1LDI2ICsyNSwzMSBAQAogI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxzZXQ+CiAjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZhcmlhbnQ+CiAjaW5jbHVkZSA8dmVjdG9yPgogCiAjaW5jbHVkZSAiYWlkbF9jaGVja2FwaS5oIgogI2luY2x1ZGUgImFpZGxfZHVtcGFwaS5oIgogI2luY2x1ZGUgImFpZGxfbGFuZ3VhZ2UuaCIKICNpbmNsdWRlICJhaWRsX3RvX2NwcC5oIgorI2luY2x1ZGUgImFpZGxfdG9fY3BwX2NvbW1vbi5oIgogI2luY2x1ZGUgImFpZGxfdG9famF2YS5oIgogI2luY2x1ZGUgImFpZGxfdG9fbmRrLmgiCisjaW5jbHVkZSAiYWlkbF90b19ydXN0LmgiCiAjaW5jbHVkZSAiY29tbWVudHMuaCIKICNpbmNsdWRlICJsb2dnaW5nLmgiCiAjaW5jbHVkZSAib3B0aW9ucy5oIgorI2luY2x1ZGUgInBhcnNlci5oIgorI2luY2x1ZGUgInByZXByb2Nlc3MuaCIKICNpbmNsdWRlICJ0ZXN0cy9mYWtlX2lvX2RlbGVnYXRlLmgiCiAKLXVzaW5nIGFuZHJvaWQ6OmFpZGw6OmludGVybmFsczo6cGFyc2VfcHJlcHJvY2Vzc2VkX2ZpbGU7CiB1c2luZyBhbmRyb2lkOjphaWRsOjp0ZXN0OjpGYWtlSW9EZWxlZ2F0ZTsKIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZjsKIHVzaW5nIHN0ZDo6bWFwOwogdXNpbmcgc3RkOjpzZXQ7CiB1c2luZyBzdGQ6OnN0cmluZzsKIHVzaW5nIHN0ZDo6dW5pcXVlX3B0cjsKK3VzaW5nIHN0ZDo6dmFyaWFudDsKIHVzaW5nIHN0ZDo6dmVjdG9yOwogdXNpbmcgdGVzdGluZzo6SGFzU3Vic3RyOwogdXNpbmcgdGVzdGluZzo6VGVzdFBhcmFtSW5mbzsKQEAgLTkxLDYgKzk2LDcgQEAKICAgICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKHBhdGgsIGNvbnRlbnRzKTsKICAgICB2ZWN0b3I8c3RyaW5nPiBhcmdzOwogICAgIGFyZ3MuZW1wbGFjZV9iYWNrKCJhaWRsIik7CisgICAgYXJncy5lbXBsYWNlX2JhY2soIi0tbWluX3Nka192ZXJzaW9uPWN1cnJlbnQiKTsKICAgICBhcmdzLmVtcGxhY2VfYmFjaygiLS1sYW5nPSIgKyB0b19zdHJpbmcobGFuZykpOwogICAgIGZvciAoY29uc3Qgc3RyaW5nJiBzIDogYWRkaXRpb25hbF9hcmd1bWVudHMpIHsKICAgICAgIGFyZ3MuZW1wbGFjZV9iYWNrKHMpOwpAQCAtMTA0LDcgKzExMCw3IEBACiAgICAgYXJncy5lbXBsYWNlX2JhY2socGF0aCk7CiAgICAgT3B0aW9ucyBvcHRpb25zID0gT3B0aW9uczo6RnJvbShhcmdzKTsKICAgICB2ZWN0b3I8c3RyaW5nPiBpbXBvcnRlZF9maWxlczsKLSAgICBJbXBvcnRSZXNvbHZlciBpbXBvcnRfcmVzb2x2ZXJ7aW9fZGVsZWdhdGVfLCBwYXRoLCBpbXBvcnRfcGF0aHNfLCB7fX07CisgICAgSW1wb3J0UmVzb2x2ZXIgaW1wb3J0X3Jlc29sdmVye2lvX2RlbGVnYXRlXywgcGF0aCwgaW1wb3J0X3BhdGhzX307CiAgICAgQWlkbEVycm9yIGFjdHVhbF9lcnJvciA9IDo6YW5kcm9pZDo6YWlkbDo6aW50ZXJuYWxzOjpsb2FkX2FuZF92YWxpZGF0ZV9haWRsKAogICAgICAgICBwYXRoLCBvcHRpb25zLCBpb19kZWxlZ2F0ZV8sICZ0eXBlbmFtZXNfLCAmaW1wb3J0ZWRfZmlsZXMpOwogCkBAIC0xODMsMjEgKzE4OSw2IEBACiAgIEVYUEVDVF9FUShleHBlY3RlZF9zdGRlcnIsIEdldENhcHR1cmVkU3RkZXJyKCkpIDw8IGZpbGVfY29udGVudHM7CiB9CiAKLVRFU1RfUChBaWRsVGVzdCwgUmVqZWN0c0FycmF5c09mQmluZGVycykgewotICBpbXBvcnRfcGF0aHNfLmVtcGxhY2UoIiIpOwotICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJiYXIvSUJhci5haWRsIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFja2FnZSBiYXI7IGludGVyZmFjZSBJQmFyIHt9Iik7Ci0gIGNvbnN0IHN0cmluZyBwYXRoID0gImZvby9JRm9vLmFpZGwiOwotICBjb25zdCBzdHJpbmcgY29udGVudHMgPQotICAgICAgInBhY2thZ2UgZm9vO1xuIgotICAgICAgImltcG9ydCBiYXIuSUJhcjtcbiIKLSAgICAgICJpbnRlcmZhY2UgSUZvbyB7IHZvaWQgZihpbiBJQmFyW10gaW5wdXQpOyB9IjsKLSAgY29uc3Qgc3RyaW5nIGV4cGVjdGVkX3N0ZGVyciA9ICJFUlJPUjogZm9vL0lGb28uYWlkbDozLjI3LTMyOiBCaW5kZXIgdHlwZSBjYW5ub3QgYmUgYW4gYXJyYXlcbiI7Ci0gIENhcHR1cmVTdGRlcnIoKTsKLSAgRVhQRUNUX0VRKG51bGxwdHIsIFBhcnNlKHBhdGgsIGNvbnRlbnRzLCB0eXBlbmFtZXNfLCBHZXRMYW5ndWFnZSgpKSk7Ci0gIEVYUEVDVF9FUShleHBlY3RlZF9zdGRlcnIsIEdldENhcHR1cmVkU3RkZXJyKCkpOwotfQotCiBURVNUX1AoQWlkbFRlc3QsIFN1cHBvcnRPbmx5T3V0UGFyYW1ldGVycykgewogICBjb25zdCBzdHJpbmcgaW50ZXJmYWNlX2xpc3QgPSAicGFja2FnZSBhOyBpbnRlcmZhY2UgSUJhciB7IHZvaWQgZihvdXQgTGlzdDxTdHJpbmc+IGJhcik7IH0iOwogICBFWFBFQ1RfTkUobnVsbHB0ciwgUGFyc2UoImEvSUJhci5haWRsIiwgaW50ZXJmYWNlX2xpc3QsIHR5cGVuYW1lc18sIEdldExhbmd1YWdlKCkpKTsKQEAgLTI1Nyw2ICsyNDgsNjMgQEAKICAgRVhQRUNUX0VRKGV4cGVjdGVkX3N0ZGVyciwgR2V0Q2FwdHVyZWRTdGRlcnIoKSk7CiB9CiAKK1RFU1RfUChBaWRsVGVzdCwgUmVqZWN0UmVjdXJzaXZlUGFyY2VsYWJsZSkgeworICBDYXB0dXJlU3RkZXJyKCk7CisgIEVYUEVDVF9FUShudWxscHRyLCBQYXJzZSgiRm9vLmFpZGwiLCAicGFyY2VsYWJsZSBGb28geyBGb28gZm9vOyB9IiwgdHlwZW5hbWVzXywgR2V0TGFuZ3VhZ2UoKSkpOworICBFWFBFQ1RfVEhBVChHZXRDYXB0dXJlZFN0ZGVycigpLCBIYXNTdWJzdHIoIkZvbyBpcyBhIHJlY3Vyc2l2ZSBwYXJjZWxhYmxlIikpOworfQorCitURVNUX1AoQWlkbFRlc3QsIFJlamVjdEluZGlyZWN0UmVjdXJzaXZlUGFyY2VsYWJsZSkgeworICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJCYXIuYWlkbCIsICJwYXJjZWxhYmxlIEJhciB7IEZvbyBmb287IH0iKTsKKyAgaW1wb3J0X3BhdGhzXy5lbXBsYWNlKCIiKTsKKyAgQ2FwdHVyZVN0ZGVycigpOworICBFWFBFQ1RfRVEobnVsbHB0ciwgUGFyc2UoIkZvby5haWRsIiwgInBhcmNlbGFibGUgRm9vIHsgQmFyIGJhcjsgfSIsIHR5cGVuYW1lc18sIEdldExhbmd1YWdlKCkpKTsKKyAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRlcnIoKSwgSGFzU3Vic3RyKCJGb28gaXMgYSByZWN1cnNpdmUgcGFyY2VsYWJsZSIpKTsKK30KKworVEVTVF9QKEFpZGxUZXN0LCBSZWplY3RSZWN1cnNpdmVUeXBlRXZlbklmTnVsbGFibGUpIHsKKyAgLy8gTm90ZTogaW4gbmF0aXZlIGJhY2tlbmRzIEBudWxsYWJsZSBpcyBtYXBwZWQgdG8gbm9uLWhlYXAgd3JhcHBlciBsaWtlIHN0ZDo6b3B0aW9uYWwvT3B0aW9uPFQ+CisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoIkJhci5haWRsIiwgInBhcmNlbGFibGUgQmFyIHsgQG51bGxhYmxlIEZvbyBmb287IH0iKTsKKyAgaW1wb3J0X3BhdGhzXy5lbXBsYWNlKCIiKTsKKyAgQ2FwdHVyZVN0ZGVycigpOworICBFWFBFQ1RfRVEobnVsbHB0ciwgUGFyc2UoIkZvby5haWRsIiwgInBhcmNlbGFibGUgRm9vIHsgQmFyIGJhcjsgfSIsIHR5cGVuYW1lc18sIEdldExhbmd1YWdlKCkpKTsKKyAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRlcnIoKSwgSGFzU3Vic3RyKCJGb28gaXMgYSByZWN1cnNpdmUgcGFyY2VsYWJsZSIpKTsKK30KKworVEVTVF9QKEFpZGxUZXN0LCBPa2F5SWZSZWN1cnNpb25JbnZvbHZlc0hlYXBUeXBlKSB7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgc3RkOjpzdHJpbmcgamF2YV9vbmx5X21hcF9maWVsZDsKKyAgaWYgKEdldExhbmd1YWdlKCkgPT0gT3B0aW9uczo6TGFuZ3VhZ2U6OkpBVkEpIHsKKyAgICBqYXZhX29ubHlfbWFwX2ZpZWxkID0gIiAgTWFwPFN0cmluZywgRm9vPiBtYXA7XG4iOworICB9CisgIEVYUEVDVF9ORShudWxscHRyLCBQYXJzZSgiRm9vLmFpZGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmNlbGFibGUgRm9vIHtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIExpc3Q8Rm9vPiBsaXN0O1xuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YV9vbmx5X21hcF9maWVsZCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgRm9vW10gYXJyO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIEBudWxsYWJsZShoZWFwPXRydWUpIEZvbyBoZWFwX251bGxhYmxlO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWVzXywgR2V0TGFuZ3VhZ2UoKSkpOworICBFWFBFQ1RfVEhBVChHZXRDYXB0dXJlZFN0ZGVycigpLCAiIik7Cit9CisKK1RFU1RfUChBaWRsVGVzdCwgSW50ZXJmYWNlQ2FuUmVmZXJlbmNlSXRzZWxmKSB7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgRVhQRUNUX05FKG51bGxwdHIsIFBhcnNlKCJJRm9vLmFpZGwiLCAiaW50ZXJmYWNlIElGb28geyB2b2lkIGZvbyhpbiBJRm9vIHNlbGYpOyB9IiwgdHlwZW5hbWVzXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldExhbmd1YWdlKCkpKTsKKyAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRlcnIoKSwgIiIpOworfQorCitURVNUX1AoQWlkbFRlc3QsIEhlYXBOdWxsYWJsZUNhbnRBcHBseVRvT3RoZXJUaGFuUGFyY2VsYWJsZXMpIHsKKyAgQ2FwdHVyZVN0ZGVycigpOworICBFWFBFQ1RfRVEobnVsbHB0ciwgUGFyc2UoIkZvby5haWRsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJjZWxhYmxlIEZvbyB7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBAbnVsbGFibGUoaGVhcD10cnVlKSBTdHJpbmcgcztcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lc18sIEdldExhbmd1YWdlKCkpKTsKKyAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRlcnIoKSwgSGFzU3Vic3RyKCJAbnVsbGFibGUoaGVhcD10cnVlKSBpcyBhdmFpbGFibGUgdG8gcGFyY2VsYWJsZXMiKSk7Cit9CisKIFRFU1RfUChBaWRsVGVzdCwgUmVqZWN0c0R1cGxpY2F0ZWRBcmd1bWVudE5hbWVzKSB7CiAgIGNvbnN0IHN0cmluZyBtZXRob2QgPSAicGFja2FnZSBhOyBpbnRlcmZhY2UgSUZvbyB7IHZvaWQgZihpbnQgYSwgaW50IGEpOyB9IjsKICAgY29uc3Qgc3RyaW5nIGV4cGVjdGVkX3N0ZGVyciA9CkBAIC0yNzQsMTYgKzMyMiw2IEBACiAgIEVYUEVDVF9FUShleHBlY3RlZF9zdGRlcnIsIEdldENhcHR1cmVkU3RkZXJyKCkpOwogfQogCi1URVNUX1AoQWlkbFRlc3QsIFJlamVjdHNSZXBlYXRlZEFubm90YXRpb25zKSB7Ci0gIGNvbnN0IHN0cmluZyBtZXRob2QgPSBSIihASGlkZSBASGlkZSBwYXJjZWxhYmxlIEZvbyB7fSkiOwotICBjb25zdCBzdHJpbmcgZXhwZWN0ZWRfc3RkZXJyID0KLSAgICAgICJFUlJPUjogRm9vLmFpZGw6MS4yMy0yNzogJ0hpZGUnIGlzIHJlcGVhdGVkLCBidXQgbm90IGFsbG93ZWQuIFByZXZpb3VzIGxvY2F0aW9uOiAiCi0gICAgICAiRm9vLmFpZGw6MS4xLTZcbiI7Ci0gIENhcHR1cmVTdGRlcnIoKTsKLSAgRVhQRUNUX0VRKG51bGxwdHIsIFBhcnNlKCJGb28uYWlkbCIsIG1ldGhvZCwgdHlwZW5hbWVzXywgR2V0TGFuZ3VhZ2UoKSkpOwotICBFWFBFQ1RfRVEoZXhwZWN0ZWRfc3RkZXJyLCBHZXRDYXB0dXJlZFN0ZGVycigpKTsKLX0KLQogVEVTVF9QKEFpZGxUZXN0LCBBY2NlcHRzRW1wdHlQYXJjZWxhYmxlKSB7CiAgIENhcHR1cmVTdGRlcnIoKTsKICAgRVhQRUNUX05FKG51bGxwdHIsIFBhcnNlKCJGb28uYWlkbCIsICJwYXJjZWxhYmxlIEZvbyB7fSIsIHR5cGVuYW1lc18sIEdldExhbmd1YWdlKCkpKTsKQEAgLTMxNiwyMCArMzU0LDExIEBACiAgIEVYUEVDVF9FUShBaWRsRXJyb3I6OkJBRF9UWVBFLCBlcnJvcik7CiB9CiAKLVRFU1RfUChBaWRsVGVzdCwgUmVqZWN0VW5zdXBwb3J0ZWRQYXJjZWxhYmxlQW5ub3RhdGlvbnMpIHsKLSAgQWlkbEVycm9yIGVycm9yOwotICBjb25zdCBzdHJpbmcgbWV0aG9kID0gInBhY2thZ2UgYTsgQG51bGxhYmxlIHBhcmNlbGFibGUgSUZvbyBjcHBfaGVhZGVyIFwiSUZvby5oXCI7IjsKLSAgQ2FwdHVyZVN0ZGVycigpOwotICBFWFBFQ1RfRVEobnVsbHB0ciwgUGFyc2UoImEvSUZvby5haWRsIiwgbWV0aG9kLCB0eXBlbmFtZXNfLCBHZXRMYW5ndWFnZSgpLCAmZXJyb3IpKTsKLSAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRlcnIoKSwgSGFzU3Vic3RyKCJAbnVsbGFibGUgaXMgbm90IGF2YWlsYWJsZS4iKSk7Ci0gIEVYUEVDVF9FUShBaWRsRXJyb3I6OkJBRF9UWVBFLCBlcnJvcik7Ci19Ci0KIFRFU1RfUChBaWRsVGVzdCwgUmVqZWN0VW5zdXBwb3J0ZWRQYXJjZWxhYmxlRGVmaW5lQW5ub3RhdGlvbnMpIHsKICAgQWlkbEVycm9yIGVycm9yOwotICBjb25zdCBzdHJpbmcgbWV0aG9kID0gInBhY2thZ2UgYTsgQG51bGxhYmxlIHBhcmNlbGFibGUgSUZvbyB7IFN0cmluZyBhOyBTdHJpbmcgYjsgfSI7CisgIGNvbnN0IHN0cmluZyBtZXRob2QgPSAicGFja2FnZSBhOyBAbnVsbGFibGUgcGFyY2VsYWJsZSBGb28geyBTdHJpbmcgYTsgU3RyaW5nIGI7IH0iOwogICBDYXB0dXJlU3RkZXJyKCk7Ci0gIEVYUEVDVF9FUShudWxscHRyLCBQYXJzZSgiYS9JRm9vLmFpZGwiLCBtZXRob2QsIHR5cGVuYW1lc18sIEdldExhbmd1YWdlKCksICZlcnJvcikpOworICBFWFBFQ1RfRVEobnVsbHB0ciwgUGFyc2UoImEvRm9vLmFpZGwiLCBtZXRob2QsIHR5cGVuYW1lc18sIEdldExhbmd1YWdlKCksICZlcnJvcikpOwogICBFWFBFQ1RfVEhBVChHZXRDYXB0dXJlZFN0ZGVycigpLCBIYXNTdWJzdHIoIkBudWxsYWJsZSBpcyBub3QgYXZhaWxhYmxlLiIpKTsKICAgRVhQRUNUX0VRKEFpZGxFcnJvcjo6QkFEX1RZUEUsIGVycm9yKTsKIH0KQEAgLTQyMyw2ICs0NTIsMjggQEAKICAgQVNTRVJUX1RSVUUoaW50ZXJmYWNlLT5Jc1ZpbnRmU3RhYmlsaXR5KCkpOwogfQogCitURVNUX1AoQWlkbFRlc3QsIFR5cGVzU2hvdWxkSGF2ZVZpbnRmU3RhYmlsaXR5V2hlbkNvbXBpbGluZ1dpdGhUaGVWaW50ZkZsYWcpIHsKKyAgQ2FwdHVyZVN0ZGVycigpOworICBzdHJpbmcgY29kZSA9CisgICAgICAiQFZpbnRmU3RhYmlsaXR5XG4iCisgICAgICAicGFyY2VsYWJsZSBGb28ge1xuIgorICAgICAgIiAgaW50ZXJmYWNlIElOZXN0ZWQge30iCisgICAgICAifSI7CisgIEVYUEVDVF9ORShudWxscHRyLCBQYXJzZSgiRm9vLmFpZGwiLCBjb2RlLCB0eXBlbmFtZXNfLCBHZXRMYW5ndWFnZSgpLCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeyItLXN0cnVjdHVyZWQiLCAiLS1zdGFiaWxpdHkiLCAidmludGYifSkpOworICBFWFBFQ1RfRVEoR2V0Q2FwdHVyZWRTdGRlcnIoKSwgIiIpOworICBhdXRvIG5lc3RlZCA9IHR5cGVuYW1lc18uVHJ5R2V0RGVmaW5lZFR5cGUoIkZvby5JTmVzdGVkIik7CisgIEFTU0VSVF9ORShudWxscHRyLCBuZXN0ZWQpOworICBBU1NFUlRfVFJVRShuZXN0ZWQtPklzVmludGZTdGFiaWxpdHkoKSk7Cit9CisKK1RFU1RfUChBaWRsVGVzdCwgVmludGZTdGFiaWxpdHlBcHBsaWVzVG9OZXN0ZWRUeXBlc0FzV2VsbCkgeworICBDYXB0dXJlU3RkZXJyKCk7CisgIEVYUEVDVF9FUShudWxscHRyLCBQYXJzZSgiRm9vLmFpZGwiLCAicGFyY2VsYWJsZSBGb28ge30iLCB0eXBlbmFtZXNfLCBHZXRMYW5ndWFnZSgpLCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeyItLXN0cnVjdHVyZWQiLCAiLS1zdGFiaWxpdHkiLCAidmludGYifSkpOworICBFWFBFQ1RfVEhBVChHZXRDYXB0dXJlZFN0ZGVycigpLCBIYXNTdWJzdHIoIkZvbyBkb2VzIG5vdCBoYXZlIFZJTlRGIGxldmVsIHN0YWJpbGl0eSIpKTsKK30KKwogVEVTVF9GKEFpZGxUZXN0LCBQYXJzZXNKYXZhT25seVN0YWJsZVBhcmNlbGFibGUpIHsKICAgT3B0aW9ucyBqYXZhX29wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIC1vIG91dCAtLXN0cnVjdHVyZWQgYS9Gb28uYWlkbCIpOwogICBPcHRpb25zIGNwcF9vcHRpb25zID0gT3B0aW9uczo6RnJvbSgiYWlkbCAtLWxhbmc9Y3BwIC1vIG91dCAtaCBvdXQvaW5jbHVkZSBhL0Zvby5haWRsIik7CkBAIC00MzMsMjUgKzQ4NCwyMyBAQAogICAgICAgImEvRm9vLmFpZGwiLAogICAgICAgU3RyaW5nUHJpbnRmKCJwYWNrYWdlIGE7IEBKYXZhT25seVN0YWJsZVBhcmNlbGFibGUgcGFyY2VsYWJsZSBGb28gY3BwX2hlYWRlciBcIkZvby5oXCIgOyIpKTsKIAotICBFWFBFQ1RfRVEoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwoamF2YV9vcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKLSAgRVhQRUNUX0VRKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKGNwcF9vcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKLSAgY29uc3Qgc3RyaW5nIGV4cGVjdGVkX3N0ZGVyciA9Ci0gICAgICAiRVJST1I6IGEvRm9vLmFpZGw6MS40OC01MjogQ2Fubm90IGRlY2xhcmVkIHBhcmNlbGFibGUgaW4gYSAtLXN0cnVjdHVyZWQgaW50ZXJmYWNlLiAiCi0gICAgICAiUGFyY2VsYWJsZSBtdXN0IGJlIGRlZmluZWQgaW4gQUlETCBkaXJlY3RseS5cbiI7Ci0gIENhcHR1cmVTdGRlcnIoKTsKLSAgRVhQRUNUX05FKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKGNwcF9zdHJ1Y3R1cmVkX29wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwotICBFWFBFQ1RfRVEoZXhwZWN0ZWRfc3RkZXJyLCBHZXRDYXB0dXJlZFN0ZGVycigpKTsKKyAgRVhQRUNUX1RSVUUoY29tcGlsZV9haWRsKGphdmFfb3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9UUlVFKGNvbXBpbGVfYWlkbChjcHBfb3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAKICAgQ2FwdHVyZVN0ZGVycigpOwotICBFWFBFQ1RfTkUoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwocnVzdF9vcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKLSAgRVhQRUNUX0VRKGV4cGVjdGVkX3N0ZGVyciwgR2V0Q2FwdHVyZWRTdGRlcnIoKSk7CisgIEVYUEVDVF9GQUxTRShjb21waWxlX2FpZGwoY3BwX3N0cnVjdHVyZWRfb3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9USEFUKEdldENhcHR1cmVkU3RkZXJyKCksIEhhc1N1YnN0cigiQ2Fubm90IGRlY2xhcmUgdW5zdHJ1Y3R1cmVkIikpOworCisgIENhcHR1cmVTdGRlcnIoKTsKKyAgRVhQRUNUX0ZBTFNFKGNvbXBpbGVfYWlkbChydXN0X29wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfVEhBVChHZXRDYXB0dXJlZFN0ZGVycigpLCBIYXNTdWJzdHIoIkNhbm5vdCBkZWNsYXJlIHVuc3RydWN0dXJlZCIpKTsKIH0KIAogVEVTVF9GKEFpZGxUZXN0LCBQYXJjZWxhYmxlU3VwcG9ydEphdmFEZXJpdmVUb1N0cmluZykgewogICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJhL0Zvby5haWRsIiwgUiIocGFja2FnZSBhOwogICAgIEBKYXZhRGVyaXZlKHRvU3RyaW5nPXRydWUpIHBhcmNlbGFibGUgRm9vIHsgaW50IGE7IGZsb2F0IGI7IH0pIik7CiAgIE9wdGlvbnMgamF2YV9vcHRpb25zID0gT3B0aW9uczo6RnJvbSgiYWlkbCAtLWxhbmc9amF2YSAtbyBvdXQgYS9Gb28uYWlkbCIpOwotICBFWFBFQ1RfRVEoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwoamF2YV9vcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX1RSVUUoY29tcGlsZV9haWRsKGphdmFfb3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAKICAgc3RyaW5nIGphdmFfb3V0OwogICBFWFBFQ1RfVFJVRShpb19kZWxlZ2F0ZV8uR2V0V3JpdHRlbkNvbnRlbnRzKCJvdXQvYS9Gb28uamF2YSIsICZqYXZhX291dCkpOwpAQCAtNDU5LDEwICs1MDgsMTAgQEAKIAogICAvLyBPdGhlciBiYWNrZW5kcyBzaG91bGRuJ3QgYmUgYm90aGVyZWQKICAgT3B0aW9ucyBjcHBfb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgLS1sYW5nPWNwcCAtbyBvdXQgLWggb3V0IGEvRm9vLmFpZGwiKTsKLSAgRVhQRUNUX0VRKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKGNwcF9vcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX1RSVUUoY29tcGlsZV9haWRsKGNwcF9vcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKIAogICBPcHRpb25zIG5ka19vcHRpb25zID0gT3B0aW9uczo6RnJvbSgiYWlkbCAtLWxhbmc9bmRrIC1vIG91dCAtaCBvdXQgYS9Gb28uYWlkbCIpOwotICBFWFBFQ1RfRVEoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwobmRrX29wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfVFJVRShjb21waWxlX2FpZGwobmRrX29wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogfQogCiBURVNUX0YoQWlkbFRlc3QsIFVuaW9uU3VwcG9ydEphdmFEZXJpdmVUb1N0cmluZykgewpAQCAtNDcwLDcgKzUxOSw3IEBACiAgICAgQEphdmFEZXJpdmUodG9TdHJpbmc9dHJ1ZSkgdW5pb24gRm9vIHsgaW50IGE7IGludFtdIGI7IH0pIik7CiAgIENhcHR1cmVTdGRlcnIoKTsKICAgT3B0aW9ucyBqYXZhX29wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIC0tbGFuZz1qYXZhIC1vIG91dCBhL0Zvby5haWRsIik7Ci0gIEVYUEVDVF9FUSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChqYXZhX29wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfVFJVRShjb21waWxlX2FpZGwoamF2YV9vcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKICAgRVhQRUNUX0VRKCIiLCBHZXRDYXB0dXJlZFN0ZGVycigpKTsKIAogICBjb25zdCBzdHJpbmcgZXhwZWN0ZWRfdG9fc3RyaW5nX21ldGhvZCA9IFIiLS0oCkBAIC00OTQsNyArNTQzLDcgQEAKICAgICBASmF2YURlcml2ZShlcXVhbHM9dHJ1ZSkgcGFyY2VsYWJsZSBGb28geyBpbnQgYTsgZmxvYXQgYjsgfSkiKTsKICAgQ2FwdHVyZVN0ZGVycigpOwogICBPcHRpb25zIGphdmFfb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgLS1sYW5nPWphdmEgLW8gb3V0IGEvRm9vLmFpZGwiKTsKLSAgRVhQRUNUX0VRKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKGphdmFfb3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9UUlVFKGNvbXBpbGVfYWlkbChqYXZhX29wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogICBFWFBFQ1RfRVEoIiIsIEdldENhcHR1cmVkU3RkZXJyKCkpOwogCiAgIGNvbnN0IHN0ZDo6c3RyaW5nIGV4cGVjdGVkID0gUiItLSgKQEAgLTUyNSw3ICs1NzQsNyBAQAogICAgIEBKYXZhRGVyaXZlKGVxdWFscz10cnVlKSB1bmlvbiBGb28geyBpbnQgYTsgaW50W10gYjsgfSkiKTsKICAgQ2FwdHVyZVN0ZGVycigpOwogICBPcHRpb25zIGphdmFfb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgLS1sYW5nPWphdmEgLW8gb3V0IGEvRm9vLmFpZGwiKTsKLSAgRVhQRUNUX0VRKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKGphdmFfb3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9UUlVFKGNvbXBpbGVfYWlkbChqYXZhX29wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogICBFWFBFQ1RfRVEoIiIsIEdldENhcHR1cmVkU3RkZXJyKCkpOwogCiAgIGNvbnN0IHN0ZDo6c3RyaW5nIGV4cGVjdGVkID0gUiItLSgKQEAgLTU1Nyw3ICs2MDYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhY2thZ2UgYTsgQEphdmFEZXJpdmUoYmxhaD10cnVlKSBwYXJjZWxhYmxlIEZvb3t9Iik7CiAgICAgT3B0aW9ucyBqYXZhX29wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIC0tbGFuZz1qYXZhIC1vIG91dCBhL0Zvby5haWRsIik7CiAgICAgQ2FwdHVyZVN0ZGVycigpOwotICAgIEVYUEVDVF9ORSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChqYXZhX29wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICAgIEVYUEVDVF9GQUxTRShjb21waWxlX2FpZGwoamF2YV9vcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKICAgICBjb25zdCBzdGQ6OnN0cmluZyBleHBlY3RlZF9zdGRlcnIgPQogICAgICAgICAiRVJST1I6IGEvRm9vLmFpZGw6MS4xMS0zNDogUGFyYW1ldGVyIGJsYWggbm90IHN1cHBvcnRlZCBmb3IgYW5ub3RhdGlvbiBKYXZhRGVyaXZlLiI7CiAgICAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRlcnIoKSwKQEAgLTU2OCwxNSArNjE3LDcgQEAKICAgICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJhL0lGb28uYWlkbCIsICJwYWNrYWdlIGE7IEBKYXZhRGVyaXZlIGludGVyZmFjZSBJRm9ve30iKTsKICAgICBPcHRpb25zIGphdmFfb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgLS1sYW5nPWphdmEgLW8gb3V0IGEvSUZvby5haWRsIik7CiAgICAgQ2FwdHVyZVN0ZGVycigpOwotICAgIEVYUEVDVF9ORSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChqYXZhX29wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwotICAgIEVYUEVDVF9USEFUKEdldENhcHR1cmVkU3RkZXJyKCksIEhhc1N1YnN0cigiQEphdmFEZXJpdmUgaXMgbm90IGF2YWlsYWJsZS4iKSk7Ci0gIH0KLQotICB7Ci0gICAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygiYS9JRm9vLmFpZGwiLCAicGFja2FnZSBhOyBASmF2YURlcml2ZSBlbnVtIElGb28geyBBPTEsIH0iKTsKLSAgICBPcHRpb25zIGphdmFfb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgLS1sYW5nPWphdmEgLW8gb3V0IGEvSUZvby5haWRsIik7Ci0gICAgQ2FwdHVyZVN0ZGVycigpOwotICAgIEVYUEVDVF9ORSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChqYXZhX29wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICAgIEVYUEVDVF9GQUxTRShjb21waWxlX2FpZGwoamF2YV9vcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKICAgICBFWFBFQ1RfVEhBVChHZXRDYXB0dXJlZFN0ZGVycigpLCBIYXNTdWJzdHIoIkBKYXZhRGVyaXZlIGlzIG5vdCBhdmFpbGFibGUuIikpOwogICB9CiB9CkBAIC01OTIsNiArNjMzLDE4IEBACiAgIEFTU0VSVF9FUSgiSUJhciIsIGludGVyZmFjZS0+R2V0RGVzY3JpcHRvcigpKTsKIH0KIAorVEVTVF9QKEFpZGxUZXN0LCBVbmtub3duQW5ub3RhdGlvbikgeworICBDYXB0dXJlU3RkZXJyKCk7CisgIEVYUEVDVF9FUShudWxscHRyLCBQYXJzZSgiYS9JRm9vLmFpZGwiLCAicGFja2FnZSBhOyBAVW5rbm93biBpbnRlcmZhY2UgSUZvbyB7IH0iLCB0eXBlbmFtZXNfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0TGFuZ3VhZ2UoKSkpOworICBFWFBFQ1RfVEhBVChHZXRDYXB0dXJlZFN0ZGVycigpLCBIYXNTdWJzdHIoIm5vdCBhIHJlY29nbml6ZWQgYW5ub3RhdGlvbiIpKTsKKworICBDYXB0dXJlU3RkZXJyKCk7CisgIEVYUEVDVF9FUShudWxscHRyLCBQYXJzZSgiYS9JRm9vLmFpZGwiLCAicGFja2FnZSBhOyBAVW5rbm93bihwYXJhbT10cnVlKSBpbnRlcmZhY2UgSUZvbyB7IH0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWVzXywgR2V0TGFuZ3VhZ2UoKSkpOworICBFWFBFQ1RfVEhBVChHZXRDYXB0dXJlZFN0ZGVycigpLCBIYXNTdWJzdHIoIm5vdCBhIHJlY29nbml6ZWQgYW5ub3RhdGlvbiIpKTsKK30KKwogVEVTVF9QKEFpZGxUZXN0LCBBY2NlcHRzT25ld2F5TWV0aG9kKSB7CiAgIGNvbnN0IHN0cmluZyBvbmV3YXlfbWV0aG9kID0gInBhY2thZ2UgYTsgaW50ZXJmYWNlIElGb28geyBvbmV3YXkgdm9pZCBmKGludCBhKTsgfSI7CiAgIEVYUEVDVF9ORShudWxscHRyLCBQYXJzZSgiYS9JRm9vLmFpZGwiLCBvbmV3YXlfbWV0aG9kLCB0eXBlbmFtZXNfLCBHZXRMYW5ndWFnZSgpKSk7CkBAIC02MTAsNyArNjYzLDggQEAKIAogVEVTVF9QKEFpZGxUZXN0LCBBbm5vdGF0aW9uc0luTXVsdGlwbGVQbGFjZXMpIHsKICAgY29uc3Qgc3RyaW5nIG9uZXdheV9tZXRob2QgPQotICAgICAgInBhY2thZ2UgYTsgaW50ZXJmYWNlIElGb28geyBAVW5zdXBwb3J0ZWRBcHBVc2FnZSBvbmV3YXkgQEhpZGUgdm9pZCBmKGludCBhKTsgfSI7CisgICAgICAicGFja2FnZSBhOyBpbnRlcmZhY2UgSUZvbyB7IEBVbnN1cHBvcnRlZEFwcFVzYWdlIG9uZXdheSBAUHJvcGFnYXRlQWxsb3dCbG9ja2luZyB2b2lkIGYoaW50ICIKKyAgICAgICJhKTsgfSI7CiAgIGNvbnN0IEFpZGxEZWZpbmVkVHlwZSogZGVmaW5lZCA9IFBhcnNlKCJhL0lGb28uYWlkbCIsIG9uZXdheV9tZXRob2QsIHR5cGVuYW1lc18sIEdldExhbmd1YWdlKCkpOwogICBBU1NFUlRfTkUobnVsbHB0ciwgZGVmaW5lZCk7CiAgIGNvbnN0IEFpZGxJbnRlcmZhY2UqIGlmYWNlID0gZGVmaW5lZC0+QXNJbnRlcmZhY2UoKTsKQEAgLTYyMyw3ICs2NzcsMjkgQEAKIAogICAvLyBUT0RPKGIvMTUxMTAyNDk0KTogdGhlc2UgYW5ub3RhdGlvbnMgc2hvdWxkIGJlIG9uIHRoZSBtZXRob2QKICAgQVNTRVJUX05FKG51bGxwdHIsIHJldF90eXBlLlVuc3VwcG9ydGVkQXBwVXNhZ2UoKSk7Ci0gIEFTU0VSVF9UUlVFKHJldF90eXBlLklzSGlkZSgpKTsKKyAgQVNTRVJUX1RSVUUocmV0X3R5cGUuSXNQcm9wYWdhdGVBbGxvd0Jsb2NraW5nKCkpOworfQorCitURVNUX1AoQWlkbFRlc3QsIEFubm90YXRpb25WYWx1ZUF0dHJpYnV0ZSkgeworICBjb25zdCBzdHJpbmcgY29udGVudCA9CisgICAgICAicGFja2FnZSBhOyBARGVzY3JpcHRvcihcImRlc2NyaXB0b3JfdmFsdWVcIikgaW50ZXJmYWNlIElGb28geyB2b2lkIGYoaW50IGEpOyB9IjsKKyAgY29uc3QgQWlkbERlZmluZWRUeXBlKiBkZWZpbmVkID0gUGFyc2UoImEvSUZvby5haWRsIiwgY29udGVudCwgdHlwZW5hbWVzXywgR2V0TGFuZ3VhZ2UoKSk7CisgIEFTU0VSVF9ORShudWxscHRyLCBkZWZpbmVkKTsKKyAgY29uc3QgQWlkbEludGVyZmFjZSogaWZhY2UgPSBkZWZpbmVkLT5Bc0ludGVyZmFjZSgpOworICBBU1NFUlRfTkUobnVsbHB0ciwgaWZhY2UpOworCisgIEFTU0VSVF9FUSgiZGVzY3JpcHRvcl92YWx1ZSIsIGlmYWNlLT5HZXREZXNjcmlwdG9yKCkpOworfQorCitURVNUX0YoQWlkbFRlc3QsIENoZWNrQXBpRm9yQW5ub3RhdGlvblZhbHVlQXR0cmlidXRlKSB7CisgIE9wdGlvbnMgb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgLS1jaGVja2FwaT1lcXVhbCBvbGQgbmV3Iik7CisKKyAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygib2xkL3AvSUZvby5haWRsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFja2FnZSBwOyBARGVzY3JpcHRvcih2YWx1ZT1cInYxXCIpIGludGVyZmFjZSBJRm9veyB2b2lkIGZvbygpO30iKTsKKyAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygibmV3L3AvSUZvby5haWRsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFja2FnZSBwOyBARGVzY3JpcHRvcihcInYxXCIpIGludGVyZmFjZSBJRm9veyB2b2lkIGZvbygpO30iKTsKKworICBFWFBFQ1RfVFJVRSg6OmFuZHJvaWQ6OmFpZGw6OmNoZWNrX2FwaShvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKIH0KIAogVEVTVF9QKEFpZGxUZXN0LCBXcml0ZXNDb21tZW50cykgewpAQCAtNjcyLDExICs3NDgsMjggQEAKICAgRVhQRUNUX0VRKChDb21tZW50c3t7Ii8vIGdldCBiYXJcbiJ9fSksIGludGVyZmFjZS0+R2V0TWV0aG9kcygpWzBdLT5HZXRDb21tZW50cygpKTsKIH0KIAorVEVTVF9GKEFpZGxUZXN0LCBSZWplY3RzSWZDcHBIZWFkZXJJc01pc3NpbmcpIHsKKyAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygiRm9vLmFpZGwiLCAicGFyY2VsYWJsZSBGb287Iik7CisgIE9wdGlvbnMgb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgLS1sYW5nIGNwcCAtaCBoIC1vIG8gRm9vLmFpZGwiKTsKKyAgQ2FwdHVyZVN0ZGVycigpOworICBFWFBFQ1RfRkFMU0UoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfVEhBVChHZXRDYXB0dXJlZFN0ZGVycigpLCBIYXNTdWJzdHIoIm11c3QgaGF2ZSBDKysgaGVhZGVyIGRlZmluZWQiKSk7Cit9CisKK1RFU1RfRihBaWRsVGVzdCwgUmVqZWN0c0lmVHlwZVJlZnNDcHBIZWFkZXJJc01pc3NpbmcpIHsKKyAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygiRm9vLmFpZGwiLCAicGFyY2VsYWJsZSBGb287Iik7CisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoIklCYXIuYWlkbCIsICJpbnRlcmZhY2UgSUJhciB7IHZvaWQgYmFyKGluIEZvbyBmb28pOyB9Iik7CisgIE9wdGlvbnMgb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgLUkgLiAtLWxhbmcgY3BwIC1oIGggLW8gbyBJQmFyLmFpZGwiKTsKKyAgQ2FwdHVyZVN0ZGVycigpOworICBFWFBFQ1RfRkFMU0UoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfVEhBVChHZXRDYXB0dXJlZFN0ZGVycigpLCBIYXNTdWJzdHIoIm11c3QgaGF2ZSBDKysgaGVhZGVyIGRlZmluZWQiKSk7Cit9CisKIFRFU1RfRihBaWRsVGVzdCwgUGFyc2VzUHJlcHJvY2Vzc2VkRmlsZSkgewogICBzdHJpbmcgc2ltcGxlX2NvbnRlbnQgPSAicGFyY2VsYWJsZSBhLkZvbztcbmludGVyZmFjZSBiLklCYXI7IjsKICAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygicGF0aCIsIHNpbXBsZV9jb250ZW50KTsKICAgRVhQRUNUX0ZBTFNFKHR5cGVuYW1lc18uUmVzb2x2ZVR5cGVuYW1lKCJhLkZvbyIpLmlzX3Jlc29sdmVkKTsKLSAgRVhQRUNUX1RSVUUocGFyc2VfcHJlcHJvY2Vzc2VkX2ZpbGUoaW9fZGVsZWdhdGVfLCAicGF0aCIsICZ0eXBlbmFtZXNfKSk7CisgIEVYUEVDVF9UUlVFKFBhcnNlcjo6UGFyc2UoInBhdGgiLCBpb19kZWxlZ2F0ZV8sIHR5cGVuYW1lc18sIC8qaXNfcHJlcHJvY2Vzc2VkPSovdHJ1ZSkpOwogICBFWFBFQ1RfVFJVRSh0eXBlbmFtZXNfLlJlc29sdmVUeXBlbmFtZSgiYS5Gb28iKS5pc19yZXNvbHZlZCk7CiAgIEVYUEVDVF9UUlVFKHR5cGVuYW1lc18uUmVzb2x2ZVR5cGVuYW1lKCJiLklCYXIiKS5pc19yZXNvbHZlZCk7CiB9CkBAIC02ODYsNyArNzc5LDcgQEAKICAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygicGF0aCIsIHNpbXBsZV9jb250ZW50KTsKIAogICBFWFBFQ1RfRkFMU0UodHlwZW5hbWVzXy5SZXNvbHZlVHlwZW5hbWUoImEuRm9vIikuaXNfcmVzb2x2ZWQpOwotICBFWFBFQ1RfVFJVRShwYXJzZV9wcmVwcm9jZXNzZWRfZmlsZShpb19kZWxlZ2F0ZV8sICJwYXRoIiwgJnR5cGVuYW1lc18pKTsKKyAgRVhQRUNUX1RSVUUoUGFyc2VyOjpQYXJzZSgicGF0aCIsIGlvX2RlbGVnYXRlXywgdHlwZW5hbWVzXywgLyppc19wcmVwcm9jZXNzZWQ9Ki90cnVlKSk7CiAgIEVYUEVDVF9UUlVFKHR5cGVuYW1lc18uUmVzb2x2ZVR5cGVuYW1lKCJhLkZvbyIpLmlzX3Jlc29sdmVkKTsKICAgRVhQRUNUX1RSVUUodHlwZW5hbWVzXy5SZXNvbHZlVHlwZW5hbWUoImIuSUJhciIpLmlzX3Jlc29sdmVkKTsKIH0KQEAgLTcwNSw4ICs3OTgsOCBAQAogICBFWFBFQ1RfVFJVRSh0eXBlbmFtZXNfLlJlc29sdmVUeXBlbmFtZSgib25lLklCYXIiKS5pc19yZXNvbHZlZCk7CiAgIEVYUEVDVF9UUlVFKHR5cGVuYW1lc18uUmVzb2x2ZVR5cGVuYW1lKCJhbm90aGVyLklCYXIiKS5pc19yZXNvbHZlZCk7CiAgIC8vIEJ1dCBpZiB3ZSByZXF1ZXN0IGp1c3QgIklCYXIiIHdlIHNob3VsZCBnZXQgb3VyIGltcG9ydGVkIG9uZS4KLSAgQWlkbFR5cGVTcGVjaWZpZXIgYW1iaWd1b3VzX3R5cGUoQUlETF9MT0NBVElPTl9IRVJFLCAiSUJhciIsIGZhbHNlLCBudWxscHRyLCB7fSk7Ci0gIGFtYmlndW91c190eXBlLlJlc29sdmUodHlwZW5hbWVzXyk7CisgIEFpZGxUeXBlU3BlY2lmaWVyIGFtYmlndW91c190eXBlKEFJRExfTE9DQVRJT05fSEVSRSwgIklCYXIiLCAvKmFycmF5PSovc3RkOjpudWxsb3B0LCBudWxscHRyLCB7fSk7CisgIGFtYmlndW91c190eXBlLlJlc29sdmUodHlwZW5hbWVzXywgcGFyc2VfcmVzdWx0KTsKICAgRVhQRUNUX0VRKCJvbmUuSUJhciIsIGFtYmlndW91c190eXBlLkdldE5hbWUoKSk7CiB9CiAKQEAgLTcyNyw4ICs4MjAsOCBAQAogICBFWFBFQ1RfVFJVRSh0eXBlbmFtZXNfLlJlc29sdmVUeXBlbmFtZSgib25lLklCYXIiKS5pc19yZXNvbHZlZCk7CiAgIEVYUEVDVF9UUlVFKHR5cGVuYW1lc18uUmVzb2x2ZVR5cGVuYW1lKCJhbm90aGVyLklCYXIiKS5pc19yZXNvbHZlZCk7CiAgIC8vIEJ1dCBpZiB3ZSByZXF1ZXN0IGp1c3QgIklCYXIiIHdlIHNob3VsZCBnZXQgb3VyIGltcG9ydGVkIG9uZS4KLSAgQWlkbFR5cGVTcGVjaWZpZXIgYW1iaWd1b3VzX3R5cGUoQUlETF9MT0NBVElPTl9IRVJFLCAiSUJhciIsIGZhbHNlLCBudWxscHRyLCB7fSk7Ci0gIGFtYmlndW91c190eXBlLlJlc29sdmUodHlwZW5hbWVzXyk7CisgIEFpZGxUeXBlU3BlY2lmaWVyIGFtYmlndW91c190eXBlKEFJRExfTE9DQVRJT05fSEVSRSwgIklCYXIiLCAvKmFycmF5PSovc3RkOjpudWxsb3B0LCBudWxscHRyLCB7fSk7CisgIGFtYmlndW91c190eXBlLlJlc29sdmUodHlwZW5hbWVzXywgcGFyc2VfcmVzdWx0KTsKICAgRVhQRUNUX0VRKCJvbmUuSUJhciIsIGFtYmlndW91c190eXBlLkdldE5hbWUoKSk7CiB9CiAKQEAgLTczOCwxOCArODMxLDE2NSBAQAogICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJvbmUvSUJhci5haWRsIiwgInBhY2thZ2Ugb25lOyBpbXBvcnQgcC5PdXRlcjsiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZXJmYWNlIElCYXIge30iKTsKIAotICB2ZWN0b3I8c3RyaW5nPiBhcmdzIHsKLSAgICAiYWlkbCIsCi0gICAgIi0tcHJlcHJvY2VzcyIsCi0gICAgInByZXByb2Nlc3NlZCIsCi0gICAgInAvT3V0ZXIuYWlkbCIsCi0gICAgIm9uZS9JQmFyLmFpZGwifTsKKyAgdmVjdG9yPHN0cmluZz4gYXJnc3siYWlkbCIsICItLXByZXByb2Nlc3MiLCAicHJlcHJvY2Vzc2VkIiwKKyAgICAgICAgICAgICAgICAgICAgICAiLUkuIiwgICJwL091dGVyLmFpZGwiLCAib25lL0lCYXIuYWlkbCJ9OwogICBPcHRpb25zIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKGFyZ3MpOwotICBFWFBFQ1RfVFJVRSg6OmFuZHJvaWQ6OmFpZGw6OnByZXByb2Nlc3NfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX1RSVUUoOjphbmRyb2lkOjphaWRsOjpQcmVwcm9jZXNzKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogCi0gIHN0cmluZyBvdXRwdXQ7Ci0gIEVYUEVDVF9UUlVFKGlvX2RlbGVnYXRlXy5HZXRXcml0dGVuQ29udGVudHMoInByZXByb2Nlc3NlZCIsICZvdXRwdXQpKTsKLSAgRVhQRUNUX0VRKCJwYXJjZWxhYmxlIHAuT3V0ZXIuSW5uZXI7XG5pbnRlcmZhY2Ugb25lLklCYXI7XG4iLCBvdXRwdXQpOworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IGV4cGVjdGVkID0ge3sicHJlcHJvY2Vzc2VkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmNlbGFibGUgcC5PdXRlci5Jbm5lcjtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVyZmFjZSBvbmUuSUJhciB7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9XG4ifX07CisgIEVYUEVDVF9USEFUKGlvX2RlbGVnYXRlXy5PdXRwdXRGaWxlcygpLCB0ZXN0aW5nOjpFcShleHBlY3RlZCkpOworfQorCitURVNUX0YoQWlkbFRlc3QsIFByZXByb2Nlc3NWYXJpb3VzVGhpbmdzKSB7CisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoImZvby9iYXIvSUZvby5haWRsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFja2FnZSBmb28uYmFyO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnRlcmZhY2UgSUZvbyB7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBpbnQgZm9vKCk7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBjb25zdCBpbnQgRk9PID0gZm9vLmJhci5CYXIuQkFSICsgMTsgLy8gc2hvdWxkIGJlIDQ0XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn1cbiIpOworICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJmb28vYmFyL0Jhci5haWRsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFja2FnZSBmb28uYmFyO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJjZWxhYmxlIEJhciB7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBjb25zdCBpbnQgQkFSID0gaW1wb3J0ZWQuRm9vLkZPTyArIDE7IC8vIHNob3VsZCBiZSA0M1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgaW1wb3J0ZWQuRm9vIGZvbztcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifVxuIik7CisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoImZvby9iYXIvR2VuLmFpZGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYWNrYWdlIGZvby5iYXI7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmNlbGFibGUgR2VuPFQ+IHtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifVxuIik7CisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoImZvby9iYXIvRW51bS5haWRsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFja2FnZSBmb28uYmFyO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIEVudW0ge1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgRk9PID0gMywgQkFSID0gRk9PICsgMywgLy8gc2hvdWxkIGJlIDMsIDZcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifVxuIik7CisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoInN1Yi9pbXBvcnRlZC9Gb28uYWlkbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhY2thZ2UgaW1wb3J0ZWQ7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmNlbGFibGUgRm9vIHtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIGNvbnN0IGludCBGT08gPSA0MjtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifVxuIik7CisKKyAgdmVjdG9yPHN0cmluZz4gYXJncyA9IHsKKyAgICAgICJhaWRsIiwKKyAgICAgICItLXByZXByb2Nlc3MiLAorICAgICAgInByZXByb2Nlc3NlZCIsCisgICAgICAiLUlzdWIiLAorICAgICAgIi1JLiIsCisgICAgICAiZm9vL2Jhci9JRm9vLmFpZGwiLAorICAgICAgImZvby9iYXIvQmFyLmFpZGwiLAorICAgICAgImZvby9iYXIvR2VuLmFpZGwiLAorICAgICAgImZvby9iYXIvRW51bS5haWRsIiwKKyAgfTsKKyAgQVNTRVJUX1RSVUUoUHJlcHJvY2VzcyhPcHRpb25zOjpGcm9tKGFyZ3MpLCBpb19kZWxlZ2F0ZV8pKTsKKyAgc3RkOjpzdHJpbmcgcHJlcHJvY2Vzc2VkID0KKyAgICAgICJpbnRlcmZhY2UgZm9vLmJhci5JRm9vIHtcbiIKKyAgICAgICIgIGNvbnN0IGludCBGT08gPSA0NDtcbiIKKyAgICAgICJ9XG4iCisgICAgICAicGFyY2VsYWJsZSBmb28uYmFyLkJhciB7XG4iCisgICAgICAiICBjb25zdCBpbnQgQkFSID0gNDM7XG4iCisgICAgICAifVxuIgorICAgICAgInBhcmNlbGFibGUgZm9vLmJhci5HZW48VD4ge1xuIgorICAgICAgIn1cbiIKKyAgICAgICJlbnVtIGZvby5iYXIuRW51bSB7XG4iCisgICAgICAiICBGT08gPSAzLFxuIgorICAgICAgIiAgQkFSID0gNixcbiIKKyAgICAgICJ9XG4iOworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IGV4cGVjdGVkID0ge3sicHJlcHJvY2Vzc2VkIiwgcHJlcHJvY2Vzc2VkfX07CisgIEVYUEVDVF9USEFUKGlvX2RlbGVnYXRlXy5PdXRwdXRGaWxlcygpLCB0ZXN0aW5nOjpFcShleHBlY3RlZCkpOworCisgIC8vIHVzZSBwcmVwcm9jZXNzZWQKKyAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygiYS9Gb28uYWlkbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhY2thZ2UgYTsgcGFyY2VsYWJsZSBGb28geyBjb25zdCBpbnQgeSA9IGZvby5iYXIuQmFyLkJBUjsgfSIpOworICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJwcmVwcm9jZXNzZWQiLCBwcmVwcm9jZXNzZWQpOworICBDYXB0dXJlU3RkZXJyKCk7CisgIGF1dG8gb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgLS1sYW5nIGphdmEgLW8gb3V0IGEvRm9vLmFpZGwgLXBwcmVwcm9jZXNzZWQiKTsKKyAgRVhQRUNUX1RSVUUoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfRVEoIiIsIEdldENhcHR1cmVkU3RkZXJyKCkpOworICBzdHJpbmcgY29kZTsKKyAgRVhQRUNUX1RSVUUoaW9fZGVsZWdhdGVfLkdldFdyaXR0ZW5Db250ZW50cygib3V0L2EvRm9vLmphdmEiLCAmY29kZSkpOworICBFWFBFQ1RfVEhBVChjb2RlLCB0ZXN0aW5nOjpIYXNTdWJzdHIoInB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHkgPSA0MzsiKSk7Cit9CisKK1RFU1RfRihBaWRsVGVzdCwgQWxsb3dNdWx0aXBsZVVuc3RydWN0dXJlZE5lc3RlZFBhcmNlbGFibGVzSW5BU2luZ2xlRG9jdW1lbnQpIHsKKyAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygicC9JRm9vLmFpZGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYWNrYWdlIHA7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImltcG9ydCB4Lk91dGVyO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnRlcmZhY2UgSUZvbyB7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgdm9pZCBmb28oaW4gT3V0ZXIuSW5uZXIxIGluMSwgaW4gT3V0ZXIuSW5uZXIyIGluMik7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn0iKTsKKyAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygiaW1wb3J0ZWQveC9PdXRlci5haWRsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFja2FnZSB4O1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJjZWxhYmxlIE91dGVyLklubmVyMTtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyY2VsYWJsZSBPdXRlci5Jbm5lcjI7XG4iKTsKKyAgYXV0byBvcHQgPSBPcHRpb25zOjpGcm9tKCJhaWRsIC1JaW1wb3J0ZWQgLS1sYW5nPWphdmEgcC9JRm9vLmFpZGwiKTsKKyAgQ2FwdHVyZVN0ZGVycigpOworICBFWFBFQ1RfVFJVRShjb21waWxlX2FpZGwob3B0LCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX0VRKCIiLCBHZXRDYXB0dXJlZFN0ZGVycigpKTsKK30KKworVEVTVF9GKEFpZGxUZXN0LAorICAgICAgIFN0dWJzU291cmNlSXNHZW5lcmF0ZWRGcm9tRHVwbGljYXRlRGVmaW5pdGlvbldpdGhGcmFtZXdvcmtBaWRsX0ZyYW1ld29ya0FpZGxMYXRlcikgeworICAvLyBNYWluIGRvYyhGb28uYWlkbCkgaXMgbG9hZGVkCisgIC8vIEFuZCB0aGVuIGZyYW1ld29yay5haWRsIGlzIGxvYWRlZCBhcyBwcmVwcm9jZXNzZWQuIChjb25mbGljdCkKKyAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygic2RrL2ZyYW1ld29yay5haWRsIiwgInBhcmNlbGFibGUgeC5Gb28uSW5uZXI7XG4iKTsKKyAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygieC9Gb28uYWlkbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhY2thZ2UgeDtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyY2VsYWJsZSBGb28uSW5uZXI7XG4iKTsKKyAgYXV0byBvcHQgPSBPcHRpb25zOjpGcm9tKCJhaWRsIC1wc2RrL2ZyYW1ld29yay5haWRsIC1JLiB4L0Zvby5haWRsIik7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgRVhQRUNUX1RSVUUoY29tcGlsZV9haWRsKG9wdCwgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9FUSgiIiwgR2V0Q2FwdHVyZWRTdGRlcnIoKSk7Cit9CisKK1RFU1RfRihBaWRsVGVzdCwKKyAgICAgICBTdHVic1NvdXJjZUlzR2VuZXJhdGVkRnJvbUR1cGxpY2F0ZURlZmluaXRpb25XaXRoRnJhbWV3b3JrQWlkbF9GcmFtZXdvcmtBaWRsRmlyc3QpIHsKKyAgLy8gTWFpbiBkb2MoSUJhci5haWRsKSBpcyBsb2FkZWQgZmlyc3QuCisgIC8vIEZyYW1ld29yay5haWRsIGlzIGxvYWRlZCBhcyBwcmVwcm9jZXNzZWQuCisgIC8vIEFuZCB0aGVuIGltcG9ydChGb28uYWlkbCkgaXMgbG9hZGVkLiAoY29uZmxpY3QpCisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoInNkay9mcmFtZXdvcmsuYWlkbCIsICJwYXJjZWxhYmxlIHguRm9vLklubmVyO1xuIik7CisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoIngvSUJhci5haWRsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFja2FnZSB4O1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbXBvcnQgeC5Gb287XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVyZmFjZSBJQmFyIHtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICB2b2lkIGJhcihpbiBGb28uSW5uZXIgaW5uZXIpO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9Iik7CisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoIngvRm9vLmFpZGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYWNrYWdlIHg7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmNlbGFibGUgRm9vLklubmVyO1xuIik7CisgIGF1dG8gb3B0ID0gT3B0aW9uczo6RnJvbSgiYWlkbCAtcHNkay9mcmFtZXdvcmsuYWlkbCAtSS4geC9JQmFyLmFpZGwiKTsKKyAgQ2FwdHVyZVN0ZGVycigpOworICBFWFBFQ1RfVFJVRShjb21waWxlX2FpZGwob3B0LCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX0VRKCIiLCBHZXRDYXB0dXJlZFN0ZGVycigpKTsKK30KKworVEVTVF9GKEFpZGxUZXN0LCBQcmVwcm9jZXNzZWRGaWxlQ2FudERlY2xhcmVQYWNrYWdlKSB7CisgIHN0cmluZyBzaW1wbGVfY29udGVudCA9ICJwYWNrYWdlIHh4eDsgcGFyY2VsYWJsZSBhLkZvbzsiOworICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJwYXRoIiwgc2ltcGxlX2NvbnRlbnQpOworICBDYXB0dXJlU3RkZXJyKCk7CisgIEVYUEVDVF9GQUxTRShQYXJzZXI6OlBhcnNlKCJwYXRoIiwgaW9fZGVsZWdhdGVfLCB0eXBlbmFtZXNfLCAvKmlzX3ByZXByb2Nlc3NlZD0qL3RydWUpKTsKKyAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRlcnIoKSwgSGFzU3Vic3RyKCJQcmVwcm9jZXNzZWQgZmlsZSBjYW4ndCBkZWNsYXJlIHBhY2thZ2UuIikpOworfQorCitURVNUX0YoQWlkbFRlc3QsIFJlamVjdFF1YWxpZmllZFR5cGVOYW1lVW5sZXNzUHJlcHJvY2Vzc2VkKSB7CisgIHN0cmluZyBzaW1wbGVfY29udGVudCA9ICJwYXJjZWxhYmxlIGEuRm9vIHt9IjsKKyAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygicGF0aCIsIHNpbXBsZV9jb250ZW50KTsKKyAgQ2FwdHVyZVN0ZGVycigpOworICBFWFBFQ1RfRkFMU0UoUGFyc2VyOjpQYXJzZSgicGF0aCIsIGlvX2RlbGVnYXRlXywgdHlwZW5hbWVzXywgLyppc19wcmVwcm9jZXNzZWQ9Ki9mYWxzZSkpOworICBFWFBFQ1RfVEhBVChHZXRDYXB0dXJlZFN0ZGVycigpLCBIYXNTdWJzdHIoIlR5cGUgbmFtZSBjYW4ndCBiZSBxdWFsaWZpZWQiKSk7Cit9CisKK1RFU1RfUChBaWRsVGVzdCwgUHJlcHJvY2Vzc2VkQ2FuRGVjbGFyZUphdmFTdHlsZUJ1aWx0aW5UeXBlcykgeworICBzdHJpbmcgY29udGVudHMgPSBSIigKKyAgICBpbnRlcmZhY2UgYW5kcm9pZC5vcy5JQmluZGVyOworICAgIGludGVyZmFjZSBhbmRyb2lkLm9zLklJbnRlcmZhY2U7CisgICAgcGFyY2VsYWJsZSBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOworICApIjsKKyAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygicGF0aCIsIGNvbnRlbnRzKTsKKyAgQ2FwdHVyZVN0ZGVycigpOworICBFWFBFQ1RfVFJVRShQYXJzZXI6OlBhcnNlKCJwYXRoIiwgaW9fZGVsZWdhdGVfLCB0eXBlbmFtZXNfLCAvKmlzX3ByZXByb2Nlc3NlZD0qL3RydWUpKTsKKyAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRlcnIoKSwgIiIpOwogfQogCiBURVNUX1AoQWlkbFRlc3QsIFN1cHBvcnREZXByZWNhdGVkKSB7CkBAIC03NjQsNyArMTAwNCw3IEBACiAKICAgICBhdXRvIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIC0tbGFuZz0iICsgdG9fc3RyaW5nKEdldExhbmd1YWdlKCkpICsgIiAiICsgZmlsZW5hbWUgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAtLW91dD1vdXQgLS1oZWFkZXJfb3V0PW91dCIpOwotICAgIEVYUEVDVF9FUSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgICBFWFBFQ1RfVFJVRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAgICAgZm9yIChjb25zdCBhdXRvJiBbbGFuZywgdGVzdF9jYXNlXSA6IGV4cGVjdGF0aW9ucykgewogICAgICAgaWYgKGxhbmcgIT0gR2V0TGFuZ3VhZ2UoKSkgY29udGludWU7CiAgICAgICBzdHJpbmcgb3V0cHV0OwpAQCAtODk2LDggKzExMzYsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgICB7T3B0aW9uczo6TGFuZ3VhZ2U6OkpBVkEsIHsib3V0L0Zvby5qYXZhIiwgIkBEZXByZWNhdGVkIn19LAogICAgICAgICAgICAgICAgICAgICAgIHtPcHRpb25zOjpMYW5ndWFnZTo6Q1BQLCB7Im91dC9Gb28uaCIsICJfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkIn19LAogICAgICAgICAgICAgICAgICAgICAgIHtPcHRpb25zOjpMYW5ndWFnZTo6TkRLLCB7Im91dC9haWRsL0Zvby5oIiwgIl9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQifX0sCi0gICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhiLzE3Nzg2MDQyMykgc3VwcG9ydCAiZGVwcmVjYXRlZCIgaW4gUnVzdCBlbnVtCi0gICAgICAgICAgICAgICAgICAgICAgLy8ge09wdGlvbnM6Okxhbmd1YWdlOjpSVVNULCB7Im91dC9Gb28ucnMiLCAiI1tkZXByZWNhdGVkIn19LAorICAgICAgICAgICAgICAgICAgICAgIHtPcHRpb25zOjpMYW5ndWFnZTo6UlVTVCwgeyJvdXQvRm9vLnJzIiwgIiNbZGVwcmVjYXRlZCJ9fSwKKyAgICAgICAgICAgICAgICAgIH0pOworCisgIENoZWNrRGVwcmVjYXRlZCgiRm9vLmFpZGwiLAorICAgICAgICAgICAgICAgICAgImVudW0gRm9vIHtcbiIKKyAgICAgICAgICAgICAgICAgICIgLyoqIEBkZXByZWNhdGVkICovXG4iCisgICAgICAgICAgICAgICAgICAiIEZPTyxcbiIKKyAgICAgICAgICAgICAgICAgICIgQkFSLFxuIgorICAgICAgICAgICAgICAgICAgIn0iLAorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIHtPcHRpb25zOjpMYW5ndWFnZTo6SkFWQSwgeyJvdXQvRm9vLmphdmEiLCAiQERlcHJlY2F0ZWQifX0sCisgICAgICAgICAgICAgICAgICAgICAge09wdGlvbnM6Okxhbmd1YWdlOjpDUFAsIHsib3V0L0Zvby5oIiwgIl9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQifX0sCisgICAgICAgICAgICAgICAgICAgICAge09wdGlvbnM6Okxhbmd1YWdlOjpOREssIHsib3V0L2FpZGwvRm9vLmgiLCAiX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCJ9fSwKKyAgICAgICAgICAgICAgICAgICAgICB7T3B0aW9uczo6TGFuZ3VhZ2U6OlJVU1QsIHsib3V0L0Zvby5ycyIsICIjW2RlcHJlY2F0ZWQifX0sCiAgICAgICAgICAgICAgICAgICB9KTsKIH0KIApAQCAtOTE0LDE3ICsxMTY2LDIzIEBACiB9CiAKIFRFU1RfUChBaWRsVGVzdCwgUGFyc2VDb21wb3VuZFBhcmNlbGFibGVGcm9tUHJlcHJvY2VzcykgewotICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJwcmVwcm9jZXNzZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJjZWxhYmxlIHAuT3V0ZXIuSW5uZXI7Iik7CisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoInByZXByb2Nlc3NlZCIsICJwYXJjZWxhYmxlIHAuT3V0ZXIuSW5uZXIgY3BwX2hlYWRlciBcImlubmVyLmhcIjsiKTsKICAgcHJlcHJvY2Vzc2VkX2ZpbGVzXy5wdXNoX2JhY2soInByZXByb2Nlc3NlZCIpOwogICBhdXRvIHBhcnNlX3Jlc3VsdCA9IFBhcnNlKCJwL0lGb28uYWlkbCIsICJwYWNrYWdlIHA7IGludGVyZmFjZSBJRm9vIHsgdm9pZCBmKGluIElubmVyIGMpOyB9IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZXNfLCBHZXRMYW5ndWFnZSgpKTsKLSAgLy8gVE9ETyh3aWxleSk6IFRoaXMgc2hvdWxkIGFjdHVhbGx5IHJldHVybiBudWxscHRyIGJlY2F1c2Ugd2UgcmVxdWlyZQotICAvLyAgICAgICAgICAgICAgdGhlIG91dGVyIGNsYXNzIG5hbWUuICBIb3dldmVyLCBmb3IgbGVnYWN5IHJlYXNvbnMsCi0gIC8vICAgICAgICAgICAgICB0aGlzIGJlaGF2aW9yIG11c3QgYmUgbWFpbnRhaW5lZC4gIGIvMTc0MTU2OTIKKyAgLy8gUmVxdWlyZSBsZWdhY3kgYmVoYXZpb3IgLSBpbm5lciBjbGFzcyBuYW1lIGNhbiBiZSB1c2VkIHdpdGhvdXQgb3V0ZXIgY2xhc3MgbmFtZS4KICAgRVhQRUNUX05FKG51bGxwdHIsIHBhcnNlX3Jlc3VsdCk7CiB9CiAKK1RFU1RfRihBaWRsVGVzdCwgQXBpTWFwcGluZ0FjY2VwdHNVbnN0cnVjdHVyZWRQYXJjZWxhYmxlcykgeworICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJwL0Zvby5haWRsIiwgInBhY2thZ2UgcDsgcGFyY2VsYWJsZSBGb287Iik7CisKKyAgT3B0aW9ucyBvcHRpb25zMSA9IE9wdGlvbnM6OkZyb20oImFpZGwgLS1hcGltYXBwaW5nIG1hcHBpbmcudHh0IHAvRm9vLmFpZGwiKTsKKyAgQ2FwdHVyZVN0ZGVycigpOworICBFWFBFQ1RfRVEoMCwgYWlkbF9lbnRyeShvcHRpb25zMSwgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9FUSgiIiwgR2V0Q2FwdHVyZWRTdGRlcnIoKSk7Cit9CisKIFRFU1RfRihBaWRsVGVzdCwgRmFpbE9uUGFyY2VsYWJsZSkgewogICBjb25zdCBzdHJpbmcgZXhwZWN0ZWRfZm9vX3N0ZGVyciA9CiAgICAgICAiRVJST1I6IHAvSUZvby5haWRsOjEuMjItMjc6IFJlZnVzaW5nIHRvIGdlbmVyYXRlIGNvZGUgd2l0aCB1bnN0cnVjdHVyZWQgcGFyY2VsYWJsZXMuICIKQEAgLTkzNSwxMyArMTE5MywxMyBAQAogICAvLyBCeSBkZWZhdWx0LCB3ZSBzaG91bGRuJ3QgZmFpbCBvbiBwYXJjZWxhYmxlLgogICBPcHRpb25zIG9wdGlvbnMxID0gT3B0aW9uczo6RnJvbSgiYWlkbCBwL0lGb28uYWlkbCIpOwogICBDYXB0dXJlU3RkZXJyKCk7Ci0gIEVYUEVDVF9FUSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zMSwgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9UUlVFKGNvbXBpbGVfYWlkbChvcHRpb25zMSwgaW9fZGVsZWdhdGVfKSk7CiAgIEVYUEVDVF9FUSgiIiwgR2V0Q2FwdHVyZWRTdGRlcnIoKSk7CiAKICAgLy8gLWIgY29uc2lkZXJzIHRoaXMgYW4gZXJyb3IKICAgT3B0aW9ucyBvcHRpb25zMiA9IE9wdGlvbnM6OkZyb20oImFpZGwgLWIgcC9JRm9vLmFpZGwiKTsKICAgQ2FwdHVyZVN0ZGVycigpOwotICBFWFBFQ1RfTkUoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwob3B0aW9uczIsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfRkFMU0UoY29tcGlsZV9haWRsKG9wdGlvbnMyLCBpb19kZWxlZ2F0ZV8pKTsKICAgRVhQRUNUX0VRKGV4cGVjdGVkX2Zvb19zdGRlcnIsIEdldENhcHR1cmVkU3RkZXJyKCkpOwogCiAgIGNvbnN0IHN0cmluZyBleHBlY3RlZF9iYXJfc3RkZXJyID0KQEAgLTk1MywxOSArMTIxMSwzMSBAQAogICAvLyBXaXRoICctYicgb3B0aW9uLCBhIHBhcmNlbGFibGUgYW5kIGFuIGludGVyZmFjZSBzaG91bGQgZmFpbC4KICAgT3B0aW9ucyBvcHRpb25zMyA9IE9wdGlvbnM6OkZyb20oImFpZGwgcC9JQmFyLmFpZGwiKTsKICAgQ2FwdHVyZVN0ZGVycigpOwotICBFWFBFQ1RfRVEoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwob3B0aW9uczMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfVFJVRShjb21waWxlX2FpZGwob3B0aW9uczMsIGlvX2RlbGVnYXRlXykpOwogICBFWFBFQ1RfRVEoIiIsIEdldENhcHR1cmVkU3RkZXJyKCkpOwogICBPcHRpb25zIG9wdGlvbnM0ID0gT3B0aW9uczo6RnJvbSgiYWlkbCAtYiBwL0lCYXIuYWlkbCIpOwogICBDYXB0dXJlU3RkZXJyKCk7Ci0gIEVYUEVDVF9ORSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zNCwgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9GQUxTRShjb21waWxlX2FpZGwob3B0aW9uczQsIGlvX2RlbGVnYXRlXykpOwogICBFWFBFQ1RfRVEoZXhwZWN0ZWRfYmFyX3N0ZGVyciwgR2V0Q2FwdHVyZWRTdGRlcnIoKSk7CiB9CiAKK1RFU1RfUChBaWRsVGVzdCwgSW1wb3J0aW5nSmF2YVN0eWxlQnVpbHRpblR5cGVzSXNBbGxvd2VkKSB7CisgIHN0cmluZyBjb250ZW50cyA9IFIiKAorICAgIGltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CisgICAgaW1wb3J0IGFuZHJvaWQub3MuSUludGVyZmFjZTsKKyAgICBpbnRlcmZhY2UgSUZvbyB7CisgICAgICB2b2lkIGZvbyhpbiBJQmluZGVyIGIpOworICAgIH0KKyAgKSI7CisgIEVYUEVDVF9ORShudWxscHRyLCBQYXJzZSgiSUZvby5haWRsIiwgY29udGVudHMsIHR5cGVuYW1lc18sIEdldExhbmd1YWdlKCkpKTsKK30KKwogVEVTVF9QKEFpZGxUZXN0LCBTdHJ1Y3R1cmVkRmFpbE9uVW5zdHJ1Y3R1cmVkUGFyY2VsYWJsZSkgewogICBjb25zdCBzdHJpbmcgZXhwZWN0ZWRfc3RkZXJyID0KLSAgICAgICJFUlJPUjogLi9vL1dob0tub3dzV2hhdC5haWRsOjEuMjItMzU6IG8uV2hvS25vd3NXaGF0IGlzIG5vdCBzdHJ1Y3R1cmVkLCBidXQgdGhpcyBpcyBhICIKKyAgICAgICJFUlJPUjogby9XaG9Lbm93c1doYXQuYWlkbDoxLjIyLTM1OiBvLldob0tub3dzV2hhdCBpcyBub3Qgc3RydWN0dXJlZCwgYnV0IHRoaXMgaXMgYSAiCiAgICAgICAic3RydWN0dXJlZCBpbnRlcmZhY2UuXG4iOwotICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJvL1dob0tub3dzV2hhdC5haWRsIiwgInBhY2thZ2UgbzsgcGFyY2VsYWJsZSBXaG9Lbm93c1doYXQ7Iik7CisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoIm8vV2hvS25vd3NXaGF0LmFpZGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYWNrYWdlIG87IHBhcmNlbGFibGUgV2hvS25vd3NXaGF0IGNwcF9oZWFkZXIgXCJ3aG9fa25vd3MuaFwiOyIpOwogICBpbXBvcnRfcGF0aHNfLmVtcGxhY2UoIiIpOwogICBBaWRsRXJyb3IgZXJyb3I7CiAgIENhcHR1cmVTdGRlcnIoKTsKQEAgLTk5NSwxMCArMTI2NSw1OCBAQAogICBFWFBFQ1RfRVEoQWlkbEVycm9yOjpCQURfVFlQRSwgZXJyb3IpOwogfQogCitURVNUX1AoQWlkbFRlc3QsIEludmFsaWRDb25zdFN0cmluZykgeworICBBaWRsRXJyb3IgZXJyb3I7CisgIGNvbnN0IHN0cmluZyBleHBlY3RlZF9zdGRlcnIgPQorICAgICAgIkVSUk9SOiBwL0lGb28uYWlkbDozLjQ3LTYwOiBGb3VuZCBpbnZhbGlkIGNoYXJhY3RlciAnXFwnIGF0IGluZGV4IDQgaW4gc3RyaW5nIGNvbnN0YW50ICIKKyAgICAgICInXCJ0ZXN0XFxcInRlc3RcIidcbiI7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgRVhQRUNUX0VRKG51bGxwdHIsIFBhcnNlKCJwL0lGb28uYWlkbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBSIihwYWNrYWdlIHA7CisgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlIElGb28geworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nIHNvbWVWYXIgPSAidGVzdFwidGVzdCI7CisgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWVzXywgR2V0TGFuZ3VhZ2UoKSwgJmVycm9yKSk7CisgIEVYUEVDVF9FUShleHBlY3RlZF9zdGRlcnIsIEdldENhcHR1cmVkU3RkZXJyKCkpOworICBFWFBFQ1RfRVEoQWlkbEVycm9yOjpCQURfVFlQRSwgZXJyb3IpOworfQorCitURVNUX0YoQWlkbFRlc3QsIEludmFsaWRDaGFyTGl0ZXJhbCkgeworICBhdXRvIGZpbGVuYW1lID0gIkZvby5haWRsIjsKKyAgY2hhciBjb2RlW10gPSAicGFyY2VsYWJsZSBGb28geyBjaGFyIGEgPSAnXDAnOyBjaGFyIGIgPSAnXHQnOyB9IjsKKyAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cyhmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmd7Y29kZSwgc2l6ZW9mKGNvZGUpIC0gMX0pOyAgLy8gLTEgdG8gZHJvcCBuaWwgYXQgdGhlIGVuZAorICBDYXB0dXJlU3RkZXJyKCk7CisgIEVYUEVDVF9UUlVFKFBhcnNlcjo6UGFyc2UoZmlsZW5hbWUsIGlvX2RlbGVnYXRlXywgdHlwZW5hbWVzXywgLyppc19wcmVwcm9jZXNzZWQ9Ki9mYWxzZSkpOworICBhdXRvIGVyciA9IEdldENhcHR1cmVkU3RkZXJyKCk7CisgIEVYUEVDVF9USEFUKGVyciwgSGFzU3Vic3RyKCJJbnZhbGlkIGNoYXJhY3RlciBsaXRlcmFsIFxcMCIpKTsKKyAgRVhQRUNUX1RIQVQoZXJyLCBIYXNTdWJzdHIoIkludmFsaWQgY2hhcmFjdGVyIGxpdGVyYWwgXFx0IikpOworfQorCitURVNUX1AoQWlkbFRlc3QsIFJlamVjdFVuc3RydWN0dXJlZFBhcmNlbGFibGVzSW5OREthbmRSdXN0KSB7CisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoIm8vRm9vLmFpZGwiLCAicGFja2FnZSBvOyBwYXJjZWxhYmxlIEZvbyBjcHBfaGVhZGVyIFwiY3BwL0Zvby5oXCI7Iik7CisgIGNvbnN0IGF1dG8gb3B0aW9ucyA9CisgICAgICBPcHRpb25zOjpGcm9tKCJhaWRsIC0tbGFuZz0iICsgdG9fc3RyaW5nKEdldExhbmd1YWdlKCkpICsgIiAtbyBvdXQgLWggb3V0IC1JLiBvL0Zvby5haWRsIik7CisgIGNvbnN0IGJvb2wgcmVqZWN0X3Vuc3RydWN0dXJlZF9wYXJjZWxhYmxlcyA9CisgICAgICBHZXRMYW5ndWFnZSgpID09IE9wdGlvbnM6Okxhbmd1YWdlOjpOREsgfHwgR2V0TGFuZ3VhZ2UoKSA9PSBPcHRpb25zOjpMYW5ndWFnZTo6UlVTVDsKKyAgY29uc3Qgc3RyaW5nIGV4cGVjdGVkX2VyciA9IHJlamVjdF91bnN0cnVjdHVyZWRfcGFyY2VsYWJsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICJSZWZ1c2luZyB0byBnZW5lcmF0ZSBjb2RlIHdpdGggdW5zdHJ1Y3R1cmVkIHBhcmNlbGFibGVzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIiI7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgRVhQRUNUX0VRKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pLCAhcmVqZWN0X3Vuc3RydWN0dXJlZF9wYXJjZWxhYmxlcyk7CisgIEVYUEVDVF9USEFUKEdldENhcHR1cmVkU3RkZXJyKCksIEhhc1N1YnN0cihleHBlY3RlZF9lcnIpKTsKK30KKworVEVTVF9GKEFpZGxUZXN0LCBDb3NudGFudFZhbHVlVHlwZSkgeworICB1bmlxdWVfcHRyPEFpZGxDb25zdGFudFZhbHVlPiBudW17QWlkbENvbnN0YW50VmFsdWU6OkludGVncmFsKEFJRExfTE9DQVRJT05fSEVSRSwgIjEiKX07CisgIEVYUEVDVF9FUShudW0tPkdldFR5cGUoKSwgQWlkbENvbnN0YW50VmFsdWU6OlR5cGU6OklOVDgpOworfQorCiBURVNUX1AoQWlkbFRlc3QsIEZhaWxPblRvb0JpZ0NvbnN0YW50KSB7CiAgIEFpZGxFcnJvciBlcnJvcjsKICAgY29uc3Qgc3RyaW5nIGV4cGVjdGVkX3N0ZGVyciA9Ci0gICAgICAiRVJST1I6IHAvSUZvby5haWRsOjMuNDgtNTI6IEludmFsaWQgdHlwZSBzcGVjaWZpZXIgZm9yIGFuIGludDMyIGxpdGVyYWw6IGJ5dGVcbiI7CisgICAgICAiRVJST1I6IHAvSUZvby5haWRsOjMuNDgtNTI6IEludmFsaWQgdHlwZSBzcGVjaWZpZXIgZm9yIGFuIGludDMyIGxpdGVyYWw6IGJ5dGUgKDI1NilcbiI7CiAgIENhcHR1cmVTdGRlcnIoKTsKICAgRVhQRUNUX0VRKG51bGxwdHIsIFBhcnNlKCJwL0lGb28uYWlkbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSIihwYWNrYWdlIHA7CkBAIC0xMDE1LDcgKzEzMzMsNyBAQAogICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJhL0Zvby5haWRsIiwgInBhY2thZ2UgYTsgcGFyY2VsYWJsZSBGb28geyBjb25zdCBpbnQgeSA9IHRydWU7IH0iKTsKICAgQ2FwdHVyZVN0ZGVycigpOwogICBhdXRvIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIC0tbGFuZyBqYXZhIC1vIG91dCBhL0Zvby5haWRsIik7Ci0gIEVYUEVDVF9FUSgwLCBhaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9UUlVFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKICAgRVhQRUNUX0VRKCIiLCBHZXRDYXB0dXJlZFN0ZGVycigpKTsKICAgc3RyaW5nIGNvZGU7CiAgIEVYUEVDVF9UUlVFKGlvX2RlbGVnYXRlXy5HZXRXcml0dGVuQ29udGVudHMoIm91dC9hL0Zvby5qYXZhIiwgJmNvZGUpKTsKQEAgLTEwNDUsMTEgKzEzNjMsMTEgQEAKIH0KIAogVEVTVF9GKEFpZGxUZXN0LCBBaWRsQ29uc3RhbnRDaGFyYWN0ZXJEZWZhdWx0KSB7Ci0gIEFpZGxUeXBlU3BlY2lmaWVyIGNoYXJfdHlwZShBSURMX0xPQ0FUSU9OX0hFUkUsICJjaGFyIiwgZmFsc2UsIG51bGxwdHIsIHt9KTsKLSAgYXV0byBkZWZhdWx0X3ZhbHVlID0gdW5pcXVlX3B0cjxBaWRsQ29uc3RhbnRWYWx1ZT4oQWlkbENvbnN0YW50VmFsdWU6OkRlZmF1bHQoY2hhcl90eXBlKSk7Ci0gIEVYUEVDVF9FUSgiJ1xcMCciLCBkZWZhdWx0X3ZhbHVlLT5WYWx1ZVN0cmluZyhjaGFyX3R5cGUsIGNwcDo6Q29uc3RhbnRWYWx1ZURlY29yYXRvcikpOwotICBFWFBFQ1RfRVEoIidcXDAnIiwgZGVmYXVsdF92YWx1ZS0+VmFsdWVTdHJpbmcoY2hhcl90eXBlLCBuZGs6OkNvbnN0YW50VmFsdWVEZWNvcmF0b3IpKTsKLSAgRVhQRUNUX0VRKCInXFwwJyIsIGRlZmF1bHRfdmFsdWUtPlZhbHVlU3RyaW5nKGNoYXJfdHlwZSwgamF2YTo6Q29uc3RhbnRWYWx1ZURlY29yYXRvcikpOworICBhdXRvIGNoYXJfdHlwZSA9IHR5cGVuYW1lc18uTWFrZVJlc29sdmVkVHlwZShBSURMX0xPQ0FUSU9OX0hFUkUsICJjaGFyIiwgZmFsc2UpOworICBhdXRvIGRlZmF1bHRfdmFsdWUgPSB1bmlxdWVfcHRyPEFpZGxDb25zdGFudFZhbHVlPihBaWRsQ29uc3RhbnRWYWx1ZTo6RGVmYXVsdCgqY2hhcl90eXBlKSk7CisgIEVYUEVDVF9FUSgiJ1xcMCciLCBkZWZhdWx0X3ZhbHVlLT5WYWx1ZVN0cmluZygqY2hhcl90eXBlLCBjcHA6OkNvbnN0YW50VmFsdWVEZWNvcmF0b3IpKTsKKyAgRVhQRUNUX0VRKCInXFwwJyIsIGRlZmF1bHRfdmFsdWUtPlZhbHVlU3RyaW5nKCpjaGFyX3R5cGUsIG5kazo6Q29uc3RhbnRWYWx1ZURlY29yYXRvcikpOworICBFWFBFQ1RfRVEoIidcXDAnIiwgZGVmYXVsdF92YWx1ZS0+VmFsdWVTdHJpbmcoKmNoYXJfdHlwZSwgamF2YTo6Q29uc3RhbnRWYWx1ZURlY29yYXRvcikpOwogfQogCiBURVNUX1AoQWlkbFRlc3QsIEZhaWxPbk1hbnlEZWZpbmVkVHlwZXMpIHsKQEAgLTEwNzQsOSArMTM5MiwxMiBAQAogVEVTVF9QKEFpZGxUZXN0LCBGYWlsT25Ob0RlZmluZWRUeXBlcykgewogICBBaWRsRXJyb3IgZXJyb3I7CiAgIGNvbnN0IHN0cmluZyBleHBlY3RlZF9zdGRlcnIgPSAiRVJST1I6IHAvSUZvby5haWRsOjEuMTEtMTE6IHN5bnRheCBlcnJvciwgdW5leHBlY3RlZCAkZW5kXG4iOworICBjb25zdCBzdHJpbmcgZXhwZWN0ZWRfc3RkZXJyX25ld2Jpc29uID0KKyAgICAgICJFUlJPUjogcC9JRm9vLmFpZGw6MS4xMS0xMTogc3ludGF4IGVycm9yLCB1bmV4cGVjdGVkIGVuZCBvZiBmaWxlXG4iOwogICBDYXB0dXJlU3RkZXJyKCk7CiAgIEVYUEVDVF9FUShudWxscHRyLCBQYXJzZSgicC9JRm9vLmFpZGwiLCBSIihwYWNrYWdlIHA7KSIsIHR5cGVuYW1lc18sIEdldExhbmd1YWdlKCksICZlcnJvcikpOwotICBFWFBFQ1RfRVEoZXhwZWN0ZWRfc3RkZXJyLCBHZXRDYXB0dXJlZFN0ZGVycigpKTsKKyAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRlcnIoKSwKKyAgICAgICAgICAgICAgdGVzdGluZzo6QW55T2YodGVzdGluZzo6RXEoZXhwZWN0ZWRfc3RkZXJyKSwgdGVzdGluZzo6RXEoZXhwZWN0ZWRfc3RkZXJyX25ld2Jpc29uKSkpOwogICBFWFBFQ1RfRVEoQWlkbEVycm9yOjpQQVJTRV9FUlJPUiwgZXJyb3IpOwogfQogCkBAIC0xMTcxLDEwICsxNDkyLDQ3IEBACiAgIEVYUEVDVF9FUSgiLTEiLCBjcHBfY29uc3RhbnRzWzBdLT5WYWx1ZVN0cmluZyhjcHA6OkNvbnN0YW50VmFsdWVEZWNvcmF0b3IpKTsKIH0KIAotVEVTVF9QKEFpZGxUZXN0LCBVbmRlcnN0YW5kc05lc3RlZFBhcmNlbGFibGVzKSB7Ci0gIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoCi0gICAgICAicC9PdXRlci5haWRsIiwKLSAgICAgICJwYWNrYWdlIHA7IHBhcmNlbGFibGUgT3V0ZXIuSW5uZXIgY3BwX2hlYWRlciBcImJhei9oZWFkZXJcIjsiKTsKK1RFU1RfRihBaWRsVGVzdCwgQnl0ZUFuZEJ5dGVBcnJheURpZmZlckluQ3BwKSB7CisgIGF1dG8gdHlwZSA9IFBhcnNlKCJwL0Zvby5haWRsIiwKKyAgICAgICAgICAgICAgICAgICAgUiIoCisgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZSBwOworICAgICAgICAgICAgICAgICAgICAgIHBhcmNlbGFibGUgRm9vIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGUgYSA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGIgPSB7LTEsIDF9OworICAgICAgICAgICAgICAgICAgICAgICAgQG51bGxhYmxlIGJ5dGVbXSBjID0gey0xLCAxfTsKKyAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICkiLAorICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZXNfLCBPcHRpb25zOjpMYW5ndWFnZTo6Q1BQKTsKKyAgQVNTRVJUX05FKG51bGxwdHIsIHR5cGUpOworICBhdXRvJiBmaWVsZHMgPSB0eXBlLT5HZXRGaWVsZHMoKTsKKyAgQVNTRVJUX0VRKDN1bCwgZmllbGRzLnNpemUoKSk7CisgIEVYUEVDVF9FUSgiLTEiLCBmaWVsZHNbMF0tPlZhbHVlU3RyaW5nKGNwcDo6Q29uc3RhbnRWYWx1ZURlY29yYXRvcikpOworICBFWFBFQ1RfRVEoInt1aW50OF90KC0xKSwgMX0iLCBmaWVsZHNbMV0tPlZhbHVlU3RyaW5nKGNwcDo6Q29uc3RhbnRWYWx1ZURlY29yYXRvcikpOworICBFWFBFQ1RfRVEoInt7dWludDhfdCgtMSksIDF9fSIsIGZpZWxkc1syXS0+VmFsdWVTdHJpbmcoY3BwOjpDb25zdGFudFZhbHVlRGVjb3JhdG9yKSk7Cit9CisKK1RFU1RfRihBaWRsVGVzdCwgQnl0ZUFuZEJ5dGVBcnJheURpZmZlckluTmRrKSB7CisgIGF1dG8gdHlwZSA9IFBhcnNlKCJwL0Zvby5haWRsIiwKKyAgICAgICAgICAgICAgICAgICAgUiIoCisgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZSBwOworICAgICAgICAgICAgICAgICAgICAgIHBhcmNlbGFibGUgRm9vIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGUgYSA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGIgPSB7LTEsIDF9OworICAgICAgICAgICAgICAgICAgICAgICAgQG51bGxhYmxlIGJ5dGVbXSBjID0gey0xLCAxfTsKKyAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICkiLAorICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZXNfLCBPcHRpb25zOjpMYW5ndWFnZTo6TkRLKTsKKyAgQVNTRVJUX05FKG51bGxwdHIsIHR5cGUpOworICBhdXRvJiBmaWVsZHMgPSB0eXBlLT5HZXRGaWVsZHMoKTsKKyAgQVNTRVJUX0VRKDN1bCwgZmllbGRzLnNpemUoKSk7CisgIEVYUEVDVF9FUSgiLTEiLCBmaWVsZHNbMF0tPlZhbHVlU3RyaW5nKG5kazo6Q29uc3RhbnRWYWx1ZURlY29yYXRvcikpOworICBFWFBFQ1RfRVEoInt1aW50OF90KC0xKSwgMX0iLCBmaWVsZHNbMV0tPlZhbHVlU3RyaW5nKG5kazo6Q29uc3RhbnRWYWx1ZURlY29yYXRvcikpOworICBFWFBFQ1RfRVEoInt7dWludDhfdCgtMSksIDF9fSIsIGZpZWxkc1syXS0+VmFsdWVTdHJpbmcobmRrOjpDb25zdGFudFZhbHVlRGVjb3JhdG9yKSk7Cit9CisKK1RFU1RfUChBaWRsVGVzdCwgVW5kZXJzdGFuZHNOZXN0ZWRVbnN0cnVjdHVyZWRQYXJjZWxhYmxlcykgeworICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJwL091dGVyLmFpZGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYWNrYWdlIHA7IHBhcmNlbGFibGUgT3V0ZXIuSW5uZXIgY3BwX2hlYWRlciBcImJhei9oZWFkZXJcIjsiKTsKICAgaW1wb3J0X3BhdGhzXy5lbXBsYWNlKCIiKTsKICAgY29uc3Qgc3RyaW5nIGlucHV0X3BhdGggPSAicC9JRm9vLmFpZGwiOwogICBjb25zdCBzdHJpbmcgaW5wdXQgPSAicGFja2FnZSBwOyBpbXBvcnQgcC5PdXRlcjsgaW50ZXJmYWNlIElGb28iCkBAIC0xMTg1LDEwICsxNTQzLDQ4MiBAQAogCiAgIEVYUEVDVF9UUlVFKHR5cGVuYW1lc18uUmVzb2x2ZVR5cGVuYW1lKCJwLk91dGVyLklubmVyIikuaXNfcmVzb2x2ZWQpOwogICAvLyBDKysgdXNlcyAiOjoiIGluc3RlYWQgb2YgIi4iIHRvIHJlZmVyIHRvIGEgaW5uZXIgY2xhc3MuCi0gIEFpZGxUeXBlU3BlY2lmaWVyIG5lc3RlZF90eXBlKEFJRExfTE9DQVRJT05fSEVSRSwgInAuT3V0ZXIuSW5uZXIiLCBmYWxzZSwgbnVsbHB0ciwge30pOworICBBaWRsVHlwZVNwZWNpZmllciBuZXN0ZWRfdHlwZShBSURMX0xPQ0FUSU9OX0hFUkUsICJwLk91dGVyLklubmVyIiwgLyphcnJheT0qL3N0ZDo6bnVsbG9wdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwge30pOwogICBFWFBFQ1RfRVEoIjo6cDo6T3V0ZXI6OklubmVyIiwgY3BwOjpDcHBOYW1lT2YobmVzdGVkX3R5cGUsIHR5cGVuYW1lc18pKTsKIH0KIAorVEVTVF9QKEFpZGxUZXN0LCBVbmRlcnN0YW5kc05lc3RlZFVuc3RydWN0dXJlZFBhcmNlbGFibGVzV2l0aG91dEltcG9ydHMpIHsKKyAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygicC9PdXRlci5haWRsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFja2FnZSBwOyBwYXJjZWxhYmxlIE91dGVyLklubmVyIGNwcF9oZWFkZXIgXCJiYXovaGVhZGVyXCI7Iik7CisgIGltcG9ydF9wYXRoc18uZW1wbGFjZSgiIik7CisgIGNvbnN0IHN0cmluZyBpbnB1dF9wYXRoID0gInAvSUZvby5haWRsIjsKKyAgY29uc3Qgc3RyaW5nIGlucHV0ID0gInBhY2thZ2UgcDsgaW50ZXJmYWNlIElGb28geyBwLk91dGVyLklubmVyIGdldCgpOyB9IjsKKworICBhdXRvIHBhcnNlX3Jlc3VsdCA9IFBhcnNlKGlucHV0X3BhdGgsIGlucHV0LCB0eXBlbmFtZXNfLCBHZXRMYW5ndWFnZSgpKTsKKyAgRVhQRUNUX05FKG51bGxwdHIsIHBhcnNlX3Jlc3VsdCk7CisKKyAgRVhQRUNUX1RSVUUodHlwZW5hbWVzXy5SZXNvbHZlVHlwZW5hbWUoInAuT3V0ZXIuSW5uZXIiKS5pc19yZXNvbHZlZCk7CisgIC8vIEMrKyB1c2VzICI6OiIgaW5zdGVhZCBvZiAiLiIgdG8gcmVmZXIgdG8gYSBpbm5lciBjbGFzcy4KKyAgQWlkbFR5cGVTcGVjaWZpZXIgbmVzdGVkX3R5cGUoQUlETF9MT0NBVElPTl9IRVJFLCAicC5PdXRlci5Jbm5lciIsIC8qYXJyYXk9Ki9zdGQ6Om51bGxvcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIHt9KTsKKyAgRVhQRUNUX0VRKCI6OnA6Ok91dGVyOjpJbm5lciIsIGNwcDo6Q3BwTmFtZU9mKG5lc3RlZF90eXBlLCB0eXBlbmFtZXNfKSk7Cit9CisKK1RFU1RfRihBaWRsVGVzdCwgVW5kZXJzdGFuZHNOZXN0ZWRUeXBlcykgeworICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJwL0lPdXRlci5haWRsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFja2FnZSBwO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnRlcmZhY2UgSU91dGVyIHtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBwYXJjZWxhYmxlIElubmVyIHt9XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn0iKTsKKyAgaW1wb3J0X3BhdGhzXy5lbXBsYWNlKCIiKTsKKyAgY29uc3Qgc3RyaW5nIGlucHV0X3BhdGggPSAicC9JRm9vLmFpZGwiOworICBjb25zdCBzdHJpbmcgaW5wdXQgPQorICAgICAgInBhY2thZ2UgcDtcbiIKKyAgICAgICJpbXBvcnQgcC5JT3V0ZXI7XG4iCisgICAgICAiaW50ZXJmYWNlIElGb28ge1xuIgorICAgICAgIiAgSU91dGVyLklubmVyIGdldCgpO1xuIgorICAgICAgIn0iOworICBDYXB0dXJlU3RkZXJyKCk7CisgIEVYUEVDVF9ORShudWxscHRyLCBQYXJzZShpbnB1dF9wYXRoLCBpbnB1dCwgdHlwZW5hbWVzXywgT3B0aW9uczo6TGFuZ3VhZ2U6OkNQUCkpOworICBFWFBFQ1RfRVEoR2V0Q2FwdHVyZWRTdGRlcnIoKSwgIiIpOworCisgIEVYUEVDVF9UUlVFKHR5cGVuYW1lc18uUmVzb2x2ZVR5cGVuYW1lKCJwLklPdXRlci5Jbm5lciIpLmlzX3Jlc29sdmVkKTsKKyAgLy8gQysrIHVzZXMgIjo6IiBpbnN0ZWFkIG9mICIuIiB0byByZWZlciB0byBhIGlubmVyIGNsYXNzLgorICBBaWRsVHlwZVNwZWNpZmllciBuZXN0ZWRfdHlwZShBSURMX0xPQ0FUSU9OX0hFUkUsICJwLklPdXRlci5Jbm5lciIsIC8qYXJyYXk9Ki9zdGQ6Om51bGxvcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIHt9KTsKKyAgRVhQRUNUX0VRKCI6OnA6OklPdXRlcjo6SW5uZXIiLCBjcHA6OkNwcE5hbWVPZihuZXN0ZWRfdHlwZSwgdHlwZW5hbWVzXykpOworfQorCitURVNUX0YoQWlkbFRlc3QsIERlZmluZWRUeXBlS25vd3NJdHNQYXJlbnRTY29wZSkgeworICBjb25zdCBzdHJpbmcgaW5wdXRfcGF0aCA9ICJwL0lGb28uYWlkbCI7CisgIGNvbnN0IHN0cmluZyBpbnB1dCA9CisgICAgICAicGFja2FnZSBwO1xuIgorICAgICAgImludGVyZmFjZSBJRm9vIHtcbiIKKyAgICAgICIgIHBhcmNlbGFibGUgSW5uZXIge1xuIgorICAgICAgIiAgICBlbnVtIEVudW0geyBBIH1cbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICJ9IjsKKyAgQ2FwdHVyZVN0ZGVycigpOworICBFWFBFQ1RfTkUobnVsbHB0ciwgUGFyc2UoaW5wdXRfcGF0aCwgaW5wdXQsIHR5cGVuYW1lc18sIE9wdGlvbnM6Okxhbmd1YWdlOjpDUFApKTsKKyAgRVhQRUNUX0VRKEdldENhcHR1cmVkU3RkZXJyKCksICIiKTsKKworICBhdXRvIGVudW1fdHlwZSA9IHR5cGVuYW1lc18uUmVzb2x2ZVR5cGVuYW1lKCJwLklGb28uSW5uZXIuRW51bSIpOworICBhdXRvIGlubmVyX3R5cGUgPSB0eXBlbmFtZXNfLlJlc29sdmVUeXBlbmFtZSgicC5JRm9vLklubmVyIik7CisgIGF1dG8gaWZvb190eXBlID0gdHlwZW5hbWVzXy5SZXNvbHZlVHlwZW5hbWUoInAuSUZvbyIpOworICBFWFBFQ1RfVFJVRShlbnVtX3R5cGUuaXNfcmVzb2x2ZWQpOworICBFWFBFQ1RfVFJVRShpbm5lcl90eXBlLmlzX3Jlc29sdmVkKTsKKyAgRVhQRUNUX1RSVUUoaWZvb190eXBlLmlzX3Jlc29sdmVkKTsKKyAgLy8gR2V0UGFyZW50VHlwZSgpCisgIEVYUEVDVF9FUShpbm5lcl90eXBlLmRlZmluZWRfdHlwZSwgZW51bV90eXBlLmRlZmluZWRfdHlwZS0+R2V0UGFyZW50VHlwZSgpKTsKKyAgRVhQRUNUX0VRKGlmb29fdHlwZS5kZWZpbmVkX3R5cGUsIGlubmVyX3R5cGUuZGVmaW5lZF90eXBlLT5HZXRQYXJlbnRUeXBlKCkpOworICBFWFBFQ1RfRVEobnVsbHB0ciwgaWZvb190eXBlLmRlZmluZWRfdHlwZS0+R2V0UGFyZW50VHlwZSgpKTsKKyAgLy8gR2V0Um9vdFR5cGUoKQorICBFWFBFQ1RfRVEoaWZvb190eXBlLmRlZmluZWRfdHlwZSwgZW51bV90eXBlLmRlZmluZWRfdHlwZS0+R2V0Um9vdFR5cGUoKSk7CisgIEVYUEVDVF9FUShpZm9vX3R5cGUuZGVmaW5lZF90eXBlLCBpbm5lcl90eXBlLmRlZmluZWRfdHlwZS0+R2V0Um9vdFR5cGUoKSk7CisgIEVYUEVDVF9FUShpZm9vX3R5cGUuZGVmaW5lZF90eXBlLCBpZm9vX3R5cGUuZGVmaW5lZF90eXBlLT5HZXRSb290VHlwZSgpKTsKKyAgLy8gR2V0RG9jdW1lbnQoKQorICBhdXRvIG1haW5fZG9jdW1lbnQgPSAmdHlwZW5hbWVzXy5NYWluRG9jdW1lbnQoKTsKKyAgRVhQRUNUX0VRKG1haW5fZG9jdW1lbnQsICZlbnVtX3R5cGUuZGVmaW5lZF90eXBlLT5HZXREb2N1bWVudCgpKTsKKyAgRVhQRUNUX0VRKG1haW5fZG9jdW1lbnQsICZpbm5lcl90eXBlLmRlZmluZWRfdHlwZS0+R2V0RG9jdW1lbnQoKSk7CisgIEVYUEVDVF9FUShtYWluX2RvY3VtZW50LCAmaWZvb190eXBlLmRlZmluZWRfdHlwZS0+R2V0RG9jdW1lbnQoKSk7Cit9CisKK1RFU1RfRihBaWRsVGVzdCwgVW5kZXJzdGFuZHNOZXN0ZWRUeXBlc1ZpYUZ1bGx5UXVhbGlmaWVkTmFtZSkgeworICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJwL0lPdXRlci5haWRsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFja2FnZSBwO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnRlcmZhY2UgSU91dGVyIHtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBwYXJjZWxhYmxlIElubmVyIHt9XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn0iKTsKKyAgaW1wb3J0X3BhdGhzXy5lbXBsYWNlKCIiKTsKKyAgY29uc3Qgc3RyaW5nIGlucHV0X3BhdGggPSAicC9JRm9vLmFpZGwiOworICBjb25zdCBzdHJpbmcgaW5wdXQgPQorICAgICAgInBhY2thZ2UgcDtcbiIKKyAgICAgICJpbnRlcmZhY2UgSUZvbyB7XG4iCisgICAgICAiICBwLklPdXRlci5Jbm5lciBnZXQoKTtcbiIKKyAgICAgICJ9IjsKKyAgQ2FwdHVyZVN0ZGVycigpOworICBFWFBFQ1RfTkUobnVsbHB0ciwgUGFyc2UoaW5wdXRfcGF0aCwgaW5wdXQsIHR5cGVuYW1lc18sIE9wdGlvbnM6Okxhbmd1YWdlOjpDUFApKTsKKyAgRVhQRUNUX0VRKEdldENhcHR1cmVkU3RkZXJyKCksICIiKTsKKworICBFWFBFQ1RfVFJVRSh0eXBlbmFtZXNfLlJlc29sdmVUeXBlbmFtZSgicC5JT3V0ZXIuSW5uZXIiKS5pc19yZXNvbHZlZCk7Cit9CisKK1RFU1RfRihBaWRsVGVzdCwgSW5jbHVkZVBhcmVudHNSYXdIZWFkZXJGb3JOZXN0ZWRJbnRlcmZhY2UpIHsKKyAgQ2FwdHVyZVN0ZGVycigpOworICBFWFBFQ1RfTkUobnVsbHB0ciwgUGFyc2UoInAvT3V0ZXIuYWlkbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFja2FnZSBwO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmNlbGFibGUgT3V0ZXIge1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgaW50ZXJmYWNlIElJbm5lciB7fVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIn0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWVzXywgT3B0aW9uczo6TGFuZ3VhZ2U6OkNQUCkpOworCisgIEVYUEVDVF9FUShHZXRDYXB0dXJlZFN0ZGVycigpLCAiIik7CisgIGF1dG8gcmVzb2x2ZWQgPSB0eXBlbmFtZXNfLlJlc29sdmVUeXBlbmFtZSgicC5PdXRlci5JSW5uZXIiKTsKKyAgQVNTRVJUX1RSVUUocmVzb2x2ZWQuZGVmaW5lZF90eXBlKTsKKyAgRVhQRUNUX0VRKGNwcDo6SGVhZGVyRmlsZSgqcmVzb2x2ZWQuZGVmaW5lZF90eXBlLCBjcHA6OkNsYXNzTmFtZXM6OkNMSUVOVCksICJwL091dGVyLmgiKTsKK30KKworVEVTVF9GKEFpZGxUZXN0LCBVbmRlcnN0YW5kc05lc3RlZFR5cGVzVmlhRnVsbHlRdWFsaWZpZWRJbXBvcnQpIHsKKyAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygicC9JT3V0ZXIuYWlkbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhY2thZ2UgcDtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZXJmYWNlIElPdXRlciB7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgcGFyY2VsYWJsZSBJbm5lciB7fVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9Iik7CisgIGltcG9ydF9wYXRoc18uZW1wbGFjZSgiIik7CisgIGNvbnN0IHN0cmluZyBpbnB1dF9wYXRoID0gInAvSUZvby5haWRsIjsKKyAgY29uc3Qgc3RyaW5nIGlucHV0ID0KKyAgICAgICJwYWNrYWdlIHA7XG4iCisgICAgICAiaW1wb3J0IHAuSU91dGVyLklubmVyOyIKKyAgICAgICJpbnRlcmZhY2UgSUZvbyB7XG4iCisgICAgICAiICBJbm5lciBnZXQoKTtcbiIKKyAgICAgICJ9IjsKKyAgQ2FwdHVyZVN0ZGVycigpOworICBFWFBFQ1RfTkUobnVsbHB0ciwgUGFyc2UoaW5wdXRfcGF0aCwgaW5wdXQsIHR5cGVuYW1lc18sIE9wdGlvbnM6Okxhbmd1YWdlOjpDUFApKTsKKyAgRVhQRUNUX0VRKEdldENhcHR1cmVkU3RkZXJyKCksICIiKTsKKworICBFWFBFQ1RfVFJVRSh0eXBlbmFtZXNfLlJlc29sdmVUeXBlbmFtZSgicC5JT3V0ZXIuSW5uZXIiKS5pc19yZXNvbHZlZCk7Cit9CisKK1RFU1RfRihBaWRsVGVzdCwgVW5kZXJzdGFuZHNOZXN0ZWRUeXBlc0luVGhlU2FtZVNjb3BlKSB7CisgIGNvbnN0IHN0cmluZyBpbnB1dF9wYXRoID0gInAvSUZvby5haWRsIjsKKyAgY29uc3Qgc3RyaW5nIGlucHV0ID0KKyAgICAgICJwYWNrYWdlIHA7XG4iCisgICAgICAiaW50ZXJmYWNlIElGb28ge1xuIgorICAgICAgIiAgcGFyY2VsYWJsZSBSZXN1bHQge31cbiIKKyAgICAgICIgIFJlc3VsdCBnZXQoKTtcbiIKKyAgICAgICJ9IjsKKyAgQ2FwdHVyZVN0ZGVycigpOworICBFWFBFQ1RfTkUobnVsbHB0ciwgUGFyc2UoaW5wdXRfcGF0aCwgaW5wdXQsIHR5cGVuYW1lc18sIE9wdGlvbnM6Okxhbmd1YWdlOjpDUFApKTsKKyAgRVhQRUNUX0VRKEdldENhcHR1cmVkU3RkZXJyKCksICIiKTsKKworICBFWFBFQ1RfVFJVRSh0eXBlbmFtZXNfLlJlc29sdmVUeXBlbmFtZSgicC5JRm9vLlJlc3VsdCIpLmlzX3Jlc29sdmVkKTsKK30KKworLy8gRmluZGluZyB0aGUgdHlwZSBvZiBuZXN0ZWQgbmFtZWQgbWVtYmVyLgorc3RydWN0IFR5cGVGaW5kZXIgOiBBaWRsVmlzaXRvciB7CisgIHN0cmluZyBuYW1lOworICBjb25zdCBBaWRsVHlwZVNwZWNpZmllciogdHlwZSA9IG51bGxwdHI7CisgIFR5cGVGaW5kZXIoc3RkOjpzdHJpbmcgbmFtZSkgOiBuYW1lKG5hbWUpIHt9CisgIHZvaWQgVmlzaXQoY29uc3QgQWlkbFZhcmlhYmxlRGVjbGFyYXRpb24mIHYpIG92ZXJyaWRlIHsKKyAgICBpZiAodi5HZXROYW1lKCkgPT0gbmFtZSkgeworICAgICAgdHlwZSA9ICZ2LkdldFR5cGUoKTsKKyAgICB9CisgIH0KKyAgdm9pZCBWaXNpdChjb25zdCBBaWRsTWV0aG9kJiBtKSBvdmVycmlkZSB7CisgICAgaWYgKG0uR2V0TmFtZSgpID09IG5hbWUpIHsKKyAgICAgIHR5cGUgPSAmbS5HZXRUeXBlKCk7CisgICAgfQorICB9CisgIHN0YXRpYyBzdHJpbmcgR2V0KGNvbnN0IEFpZGxEZWZpbmVkVHlwZSYgdHlwZSwgY29uc3Qgc3RyaW5nJiBuYW1lKSB7CisgICAgVHlwZUZpbmRlciB2KG5hbWUpOworICAgIFZpc2l0VG9wRG93bih2LCB0eXBlKTsKKyAgICByZXR1cm4gdi50eXBlID8gdi50eXBlLT5TaWduYXR1cmUoKSA6ICIobnVsbCkiOworICB9OworfTsKKworVEVTVF9GKEFpZGxUZXN0LCBVbmRlcnN0YW5kc05lc3RlZFR5cGVzVmlhUXVhbGlmaWVkSW5UaGVTYW1lU2NvcGUpIHsKKyAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygicS9JQmFyLmFpZGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYWNrYWdlIHE7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVyZmFjZSBJQmFyIHtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBwYXJjZWxhYmxlIEJheiB7fVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9Iik7CisgIGltcG9ydF9wYXRoc18uZW1wbGFjZSgiIik7CisgIGNvbnN0IHN0cmluZyBpbnB1dF9wYXRoID0gInAvSUZvby5haWRsIjsKKyAgY29uc3Qgc3RyaW5nIGlucHV0ID0KKyAgICAgICJwYWNrYWdlIHA7XG4iCisgICAgICAiaW1wb3J0IHEuSUJhcjtcbiIKKyAgICAgICJpbnRlcmZhY2UgSUZvbyB7XG4iCisgICAgICAiICBwYXJjZWxhYmxlIE5lc3RlZCB7XG4iCisgICAgICAiICAgIEJheiB0MTtcbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICIgIHBhcmNlbGFibGUgQmF6IHsgfVxuIgorICAgICAgIiAgSUJhci5CYXogdDIoKTtcbiIKKyAgICAgICIgIEJheiB0MygpO1xuIgorICAgICAgIn0iOworICBDYXB0dXJlU3RkZXJyKCk7CisgIGF1dG8gZm9vID0gUGFyc2UoaW5wdXRfcGF0aCwgaW5wdXQsIHR5cGVuYW1lc18sIE9wdGlvbnM6Okxhbmd1YWdlOjpDUFApOworICBFWFBFQ1RfRVEoR2V0Q2FwdHVyZWRTdGRlcnIoKSwgIiIpOworICBBU1NFUlRfTkUobnVsbHB0ciwgZm9vKTsKKworICBFWFBFQ1RfRVEoVHlwZUZpbmRlcjo6R2V0KCpmb28sICJ0MSIpLCAicC5JRm9vLkJheiIpOworICBFWFBFQ1RfRVEoVHlwZUZpbmRlcjo6R2V0KCpmb28sICJ0MiIpLCAicS5JQmFyLkJheiIpOworICBFWFBFQ1RfRVEoVHlwZUZpbmRlcjo6R2V0KCpmb28sICJ0MyIpLCAicC5JRm9vLkJheiIpOworfQorCitURVNUX0YoQWlkbFRlc3QsIE5lc3RlZFR5cGVSZXNvbHV0aW9uV2l0aE5vUGFja2FnZSkgeworICBjb25zdCBzdHJpbmcgaW5wdXRfcGF0aCA9ICJGb28uYWlkbCI7CisgIGNvbnN0IHN0cmluZyBpbnB1dCA9CisgICAgICAicGFyY2VsYWJsZSBGb28ge1xuIgorICAgICAgIiAgcGFyY2VsYWJsZSBCYXIge1xuIgorICAgICAgIiAgICBlbnVtIEJheiB7IEJBWiB9XG4iCisgICAgICAiICAgIEJheiBiYXogPSBCYXouQkFaO1xuIgorICAgICAgIiAgfVxuIgorICAgICAgIiAgQmFyIGJhcjtcbiIKKyAgICAgICJ9IjsKKyAgQ2FwdHVyZVN0ZGVycigpOworICBhdXRvIGZvbyA9IFBhcnNlKGlucHV0X3BhdGgsIGlucHV0LCB0eXBlbmFtZXNfLCBPcHRpb25zOjpMYW5ndWFnZTo6Q1BQKTsKKyAgRVhQRUNUX0VRKEdldENhcHR1cmVkU3RkZXJyKCksICIiKTsKKyAgQVNTRVJUX05FKG51bGxwdHIsIGZvbyk7CisKKyAgRVhQRUNUX0VRKFR5cGVGaW5kZXI6OkdldCgqZm9vLCAiYmFyIiksICJGb28uQmFyIik7CisgIEVYUEVDVF9FUShUeXBlRmluZGVyOjpHZXQoKmZvbywgImJheiIpLCAiRm9vLkJhci5CYXoiKTsKK30KKworVEVTVF9GKEFpZGxUZXN0LCBSZWplY3RzTmVzdGVkVHlwZXNXaXRoUGFyZW50c05hbWUpIHsKKyAgY29uc3Qgc3RyaW5nIGlucHV0X3BhdGggPSAicC9Gb28uYWlkbCI7CisgIGNvbnN0IHN0cmluZyBpbnB1dCA9CisgICAgICAicGFja2FnZSBwO1xuIgorICAgICAgInBhcmNlbGFibGUgRm9vIHtcbiIKKyAgICAgICIgIHBhcmNlbGFibGUgRm9vIHt9XG4iCisgICAgICAifSI7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgRVhQRUNUX0VRKG51bGxwdHIsIFBhcnNlKGlucHV0X3BhdGgsIGlucHV0LCB0eXBlbmFtZXNfLCBPcHRpb25zOjpMYW5ndWFnZTo6Q1BQKSk7CisgIEVYUEVDVF9USEFUKEdldENhcHR1cmVkU3RkZXJyKCksIEhhc1N1YnN0cigiTmVzdGVkIHR5cGUgJ0ZvbycgaGFzIHRoZSBzYW1lIG5hbWUgYXMgaXRzIHBhcmVudC4iKSk7Cit9CisKK1RFU1RfRihBaWRsVGVzdCwgUmVqZWN0VW5zdHJ1Y3R1cmVkUGFyY2VsYWJsZUFzTmVzdGVkVHlwZXMpIHsKKyAgY29uc3Qgc3RyaW5nIGlucHV0X3BhdGggPSAicC9JRm9vLmFpZGwiOworICBjb25zdCBzdHJpbmcgaW5wdXQgPQorICAgICAgInBhY2thZ2UgcDtcbiIKKyAgICAgICJpbnRlcmZhY2UgSUZvbyB7XG4iCisgICAgICAiICBwYXJjZWxhYmxlIEJhciBjcHBfaGVhZGVyIFwiQmFyLmhcIjtcbiIKKyAgICAgICJ9IjsKKyAgQ2FwdHVyZVN0ZGVycigpOworICBFWFBFQ1RfRVEobnVsbHB0ciwgUGFyc2UoaW5wdXRfcGF0aCwgaW5wdXQsIHR5cGVuYW1lc18sIE9wdGlvbnM6Okxhbmd1YWdlOjpDUFApKTsKKyAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRlcnIoKSwKKyAgICAgICAgICAgICAgSGFzU3Vic3RyKCJVbnN0cnVjdHVyZWQgcGFyY2VsYWJsZXMgc2hvdWxkIGJlIGF0IHRoZSByb290IHNjb3BlIikpOworfQorCitURVNUX0YoQWlkbFRlc3QsIFJlamVjdEdlbmVyaWNUeXBlV2l0aE5lc3RlZFR5cGVzKSB7CisgIGNvbnN0IHN0cmluZyBpbnB1dF9wYXRoID0gInAvRm9vLmFpZGwiOworICBjb25zdCBzdHJpbmcgaW5wdXQgPQorICAgICAgInBhY2thZ2UgcDtcbiIKKyAgICAgICJwYXJjZWxhYmxlIEZvbzxUPiB7XG4iCisgICAgICAiICBwYXJjZWxhYmxlIEJhciB7fVxuIgorICAgICAgIn0iOworICBDYXB0dXJlU3RkZXJyKCk7CisgIEVYUEVDVF9FUShudWxscHRyLCBQYXJzZShpbnB1dF9wYXRoLCBpbnB1dCwgdHlwZW5hbWVzXywgT3B0aW9uczo6TGFuZ3VhZ2U6OkNQUCkpOworICBFWFBFQ1RfVEhBVChHZXRDYXB0dXJlZFN0ZGVycigpLCBIYXNTdWJzdHIoIkdlbmVyaWMgdHlwZXMgY2FuJ3QgaGF2ZSBuZXN0ZWQgdHlwZXMuIikpOworfQorCitURVNUX0YoQWlkbFRlc3QsIEhhbmRsZVN5bnRheEVycm9yc0luTmVzdGVkRGVjbCkgeworICBjb25zdCBzdHJpbmcgaW5wdXRfcGF0aCA9ICJwL0lGb28uYWlkbCI7CisgIGNvbnN0IHN0cmluZyBpbnB1dCA9CisgICAgICAicGFja2FnZSBwO1xuIgorICAgICAgImludGVyZmFjZSBJRm9vIHtcbiIKKyAgICAgICIgIHBhcmNlbGFibGU7XG4iICAvLyBtaXNzaW5nIGlkZW50aWZpZXIKKyAgICAgICJ9IjsKKyAgQ2FwdHVyZVN0ZGVycigpOworICBFWFBFQ1RfRVEobnVsbHB0ciwgUGFyc2UoaW5wdXRfcGF0aCwgaW5wdXQsIHR5cGVuYW1lc18sIE9wdGlvbnM6Okxhbmd1YWdlOjpDUFApKTsKKyAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRlcnIoKSwgSGFzU3Vic3RyKCJleHBlY3RpbmcgaWRlbnRpZmllciIpKTsKK30KKworVEVTVF9GKEFpZGxUZXN0LCBSZWplY3RzTmVzdGVkVHlwZXNXaXRoRHVwbGljYXRlTmFtZXMpIHsKKyAgY29uc3Qgc3RyaW5nIGlucHV0X3BhdGggPSAicC9Gb28uYWlkbCI7CisgIGNvbnN0IHN0cmluZyBpbnB1dCA9CisgICAgICAicGFja2FnZSBwO1xuIgorICAgICAgImludGVyZmFjZSBGb28ge1xuIgorICAgICAgIiAgcGFyY2VsYWJsZSBCYXIge31cbiIKKyAgICAgICIgIHBhcmNlbGFibGUgQmFyIHt9XG4iCisgICAgICAifSI7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgRVhQRUNUX0VRKG51bGxwdHIsIFBhcnNlKGlucHV0X3BhdGgsIGlucHV0LCB0eXBlbmFtZXNfLCBPcHRpb25zOjpMYW5ndWFnZTo6Q1BQKSk7CisgIEVYUEVDVF9USEFUKEdldENhcHR1cmVkU3RkZXJyKCksIEhhc1N1YnN0cigiUmVkZWZpbml0aW9uIG9mICdCYXInIikpOworfQorCitURVNUX0YoQWlkbFRlc3QsIFR5cGVSZXNvbHV0aW9uV2l0aE11bHRpcGxlTGV2ZWxzT2ZOZXN0aW5nKSB7CisgIHN0cnVjdCBGYWlsdXJlIHsKKyAgICBzdHJpbmcgZXJyOworICB9OworICBzdHJ1Y3QgVGVzdENhc2UgeworICAgIHN0cmluZyB0eXBlOworICAgIHZhcmlhbnQ8c3RyaW5nLCBGYWlsdXJlPiBleHBlY3RlZDsgIC8vIHN1Y2Nlc3M8MD4gb3IgZmFpbHVyZTwxPgorICB9OworICB2ZWN0b3I8VGVzdENhc2U+IGNhc2VzID0geworICAgICAgeyJmb28uQSIsICJmb28uQSJ9LAorICAgICAgeyJmb28uQS5CIiwgImZvby5BLkIifSwKKyAgICAgIHsiQG51bGxhYmxlKGhlYXA9dHJ1ZSkgQSIsICJmb28uQS5CLkEifSwKKyAgICAgIC8vIEluIHRoZSBzY29wZSBvZiBmb28uQS5CLkEsIEIgaXMgcmVzb2x2ZWQgdG8gQS5CLkEuQiBmaXJzdC4KKyAgICAgIHsiQi5BIiwgRmFpbHVyZXsiRmFpbGVkIHRvIHJlc29sdmUgJ0IuQScifX0sCisgICAgICB7IkIiLCAiZm9vLkEuQi5BLkIifSwKKyAgICAgIHsiQS5CIiwgImZvby5BLkIuQS5CIn0sCisgIH07CisgIGNvbnN0IHN0cmluZyBpbnB1dF9wYXRoID0gImZvby9BLmFpZGwiOworICBmb3IgKGF1dG8mIFt0eXBlLCBleHBlY3RlZF0gOiBjYXNlcykgeworICAgIEFpZGxUeXBlbmFtZXMgdHlwZW5hbWVzOworICAgIC8vIGNsYW5nLWZvcm1hdCBvZmYKKyAgICBjb25zdCBzdHJpbmcgaW5wdXQgPQorICAgICAgICAicGFja2FnZSBmb287XG4iCisgICAgICAgICJwYXJjZWxhYmxlIEEge1xuIgorICAgICAgICAiICBwYXJjZWxhYmxlIEIge1xuIgorICAgICAgICAiICAgIHBhcmNlbGFibGUgQSB7XG4iCisgICAgICAgICIgICAgICBwYXJjZWxhYmxlIEIge1xuIgorICAgICAgICAiICAgICAgfVxuIgorICAgICAgICAiICAgICAgIiArIHR5cGUgKyAiIG07XG4iCisgICAgICAgICIgICAgfVxuIgorICAgICAgICAiICB9XG4iCisgICAgICAgICJ9IjsKKyAgICAvLyBjbGFuZy1mb3JtYXQgb24KKyAgICBDYXB0dXJlU3RkZXJyKCk7CisgICAgYXV0byBmb28gPSBQYXJzZShpbnB1dF9wYXRoLCBpbnB1dCwgdHlwZW5hbWVzLCBPcHRpb25zOjpMYW5ndWFnZTo6Q1BQKTsKKyAgICBpZiAoYXV0byBmYWlsdXJlID0gc3RkOjpnZXRfaWY8RmFpbHVyZT4oJmV4cGVjdGVkKTsgZmFpbHVyZSkgeworICAgICAgQVNTRVJUX0VRKG51bGxwdHIsIGZvbyk7CisgICAgICBFWFBFQ1RfVEhBVChHZXRDYXB0dXJlZFN0ZGVycigpLCBIYXNTdWJzdHIoZmFpbHVyZS0+ZXJyKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEVYUEVDVF9FUShHZXRDYXB0dXJlZFN0ZGVycigpLCAiIik7CisgICAgICBBU1NFUlRfTkUobnVsbHB0ciwgZm9vKTsKKyAgICAgIEVYUEVDVF9FUShUeXBlRmluZGVyOjpHZXQoKmZvbywgIm0iKSwgc3RkOjpnZXQ8c3RyaW5nPihleHBlY3RlZCkpOworICAgIH0KKyAgfQorfQorCitURVNUX0YoQWlkbFRlc3QsIEhlYWRlckZvck5lc3RlZFR5cGVTaG91bGRQb2ludFRvVG9wTW9zdFBhcmVudCkgeworICBjb25zdCBzdHJpbmcgaW5wdXRfcGF0aCA9ICJwL0lGb28uYWlkbCI7CisgIGNvbnN0IHN0cmluZyBpbnB1dCA9CisgICAgICAicGFja2FnZSBwO1xuIgorICAgICAgImludGVyZmFjZSBJRm9vIHtcbiIKKyAgICAgICIgIHBhcmNlbGFibGUgUmVzdWx0IHt9XG4iCisgICAgICAifSI7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgYXV0byBmb28gPSBQYXJzZShpbnB1dF9wYXRoLCBpbnB1dCwgdHlwZW5hbWVzXywgT3B0aW9uczo6TGFuZ3VhZ2U6OkNQUCk7CisgIEFTU0VSVF9ORShudWxscHRyLCBmb28pOworICBFWFBFQ1RfRVEoR2V0Q2FwdHVyZWRTdGRlcnIoKSwgIiIpOworCisgIGF1dG8gcmVzdWx0ID0gdHlwZW5hbWVzXy5SZXNvbHZlVHlwZW5hbWUoInAuSUZvby5SZXN1bHQiKS5kZWZpbmVkX3R5cGU7CisgIEFTU0VSVF9ORShudWxscHRyLCByZXN1bHQpOworICBFWFBFQ1RfRVEoInAvSUZvby5oIiwgY3BwOjpDcHBIZWFkZXJGb3JUeXBlKCpyZXN1bHQpKTsKK30KKworVEVTVF9GKEFpZGxUZXN0LCBSZW9yZGVyTmVzdGVkVHlwZXNGb3JDcHBPdXRwdXQpIHsKKyAgY29uc3Qgc3RyaW5nIGlucHV0X3BhdGggPSAicC9JRm9vLmFpZGwiOworICBjb25zdCBzdHJpbmcgaW5wdXQgPSBSIigKKyAgICBwYWNrYWdlIHA7CisgICAgaW50ZXJmYWNlIElGb28geworICAgICAgLy8gcGFydGlhbCBvcmRlcmluZ3MgZm9yIFtBLCBELCBHXToKKyAgICAgIC8vICAgRCAtIEEKKyAgICAgIC8vICAgQSAtIEcKKyAgICAgIHBhcmNlbGFibGUgQSB7CisgICAgICAgIC8vIHBhcnRpYWwgb3JkZXJpbmdzIGZvciBbQiwgQ106CisgICAgICAgIC8vICAgQyAtIEIKKyAgICAgICAgcGFyY2VsYWJsZSBCIHsKKyAgICAgICAgICBDIGM7CisgICAgICAgICAgRC5FIGQ7CisgICAgICAgIH0KKyAgICAgICAgcGFyY2VsYWJsZSBDIHt9CisgICAgICB9CisgICAgICBwYXJjZWxhYmxlIEQgeworICAgICAgICAvLyBwYXJ0aWFsIG9yZGVyaW5ncyBmb3IgW0UsIEZdOgorICAgICAgICAvLyAgIEYgLSBFCisgICAgICAgIHBhcmNlbGFibGUgRSB7CisgICAgICAgICAgRiBmOworICAgICAgICB9CisgICAgICAgIHBhcmNlbGFibGUgRiB7fQorICAgICAgfQorICAgICAgcGFyY2VsYWJsZSBHIHsKKyAgICAgICAgQS5CIGI7CisgICAgICB9CisgICAgfQorICApIjsKKyAgT3B0aW9ucyBvcHRpb25zID0gT3B0aW9uczo6RnJvbSgiYWlkbCAtLWxhbmcgY3BwIC1JLiAtb291dCAtaG91dCBwL0lGb28uYWlkbCIpOworICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKGlucHV0X3BhdGgsIGlucHV0KTsKKyAgQ2FwdHVyZVN0ZGVycigpOworICBFWFBFQ1RfVFJVRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9FUShHZXRDYXB0dXJlZFN0ZGVycigpLCAiIik7CisKKyAgc3RyaW5nIGNvZGU7CisgIEVYUEVDVF9UUlVFKGlvX2RlbGVnYXRlXy5HZXRXcml0dGVuQ29udGVudHMoIm91dC9wL0lGb28uaCIsICZjb2RlKSk7CisgIC8vIGNoZWNrIHBhcnRpYWwgb3JkZXJpbmdzOiBhIHNob3VsZCBjb21lcyBiZWZvcmUgYgorICBFWFBFQ1RfTEUoY29kZS5maW5kKCJjbGFzcyBEIiksIGNvZGUuZmluZCgiY2xhc3MgQSIpKTsKKyAgRVhQRUNUX0xFKGNvZGUuZmluZCgiY2xhc3MgQSIpLCBjb2RlLmZpbmQoImNsYXNzIEciKSk7CisgIEVYUEVDVF9MRShjb2RlLmZpbmQoImNsYXNzIEMiKSwgY29kZS5maW5kKCJjbGFzcyBCIikpOworICBFWFBFQ1RfTEUoY29kZS5maW5kKCJjbGFzcyBGIiksIGNvZGUuZmluZCgiY2xhc3MgRSIpKTsKK30KKworVEVTVF9GKEFpZGxUZXN0LCBSZWplY3RzTmVzdGVkVHlwZXNXaXRoQ3ljbGljRGVwcykgeworICBjb25zdCBzdHJpbmcgaW5wdXRfcGF0aCA9ICJwL0lGb28uYWlkbCI7CisgIGNvbnN0IHN0cmluZyBpbnB1dCA9IFIiKAorICAgIHBhY2thZ2UgcDsKKyAgICBpbnRlcmZhY2UgSUZvbyB7CisgICAgICAvLyBDeWNsZXM6CisgICAgICAvLyAgIEQgLSBBCisgICAgICAvLyAgIEEgLSBHCisgICAgICAvLyAgIEcgLSBECisgICAgICBwYXJjZWxhYmxlIEEgeworICAgICAgICBwYXJjZWxhYmxlIEIgeworICAgICAgICAgIEMgYzsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcGFyY2VsYWJsZSBDIHsKKyAgICAgICAgcGFyY2VsYWJsZSBEIHsKKyAgICAgICAgICBFIGU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHBhcmNlbGFibGUgRSB7CisgICAgICAgIHBhcmNlbGFibGUgRiB7CisgICAgICAgICAgQSBhOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICApIjsKKyAgT3B0aW9ucyBvcHRpb25zID0gT3B0aW9uczo6RnJvbSgiYWlkbCAtLWxhbmcgY3BwIC1JLiAtb291dCAtaG91dCBwL0lGb28uYWlkbCIpOworICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKGlucHV0X3BhdGgsIGlucHV0KTsKKyAgQ2FwdHVyZVN0ZGVycigpOworICBFWFBFQ1RfRkFMU0UoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfVEhBVChHZXRDYXB0dXJlZFN0ZGVycigpLCBIYXNTdWJzdHIoIklGb28gaGFzIG5lc3RlZCB0eXBlcyB3aXRoIGN5Y2xpYyByZWZlcmVuY2VzLiIpKTsKK30KKworVEVTVF9GKEFpZGxUZXN0LCBDcHBOYW1lT2ZfR2VuZXJpY1R5cGUpIHsKKyAgY29uc3Qgc3RyaW5nIGlucHV0X3BhdGggPSAicC9XcmFwcGVyLmFpZGwiOworICBjb25zdCBzdHJpbmcgaW5wdXQgPSAicGFja2FnZSBwOyBwYXJjZWxhYmxlIFdyYXBwZXI8VD4ge30iOworCisgIGF1dG8gcGFyc2VfcmVzdWx0ID0gUGFyc2UoaW5wdXRfcGF0aCwgaW5wdXQsIHR5cGVuYW1lc18sIE9wdGlvbnM6Okxhbmd1YWdlOjpDUFApOworICBFWFBFQ1RfTkUobnVsbHB0ciwgcGFyc2VfcmVzdWx0KTsKKworICBhdXRvIHR5cGUgPSBbXShzdGQ6OnN0cmluZyBuYW1lLCBhdXRvJiYuLi4gdHlwZV9wYXJhbXMpIC0+IHN0ZDo6dW5pcXVlX3B0cjxBaWRsVHlwZVNwZWNpZmllcj4geworICAgIGF1dG8gcGFyYW1zID0gbmV3IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxBaWRsVHlwZVNwZWNpZmllcj4+OworICAgICguLi4sIHBhcmFtcy0+ZW1wbGFjZV9iYWNrKHN0ZDo6bW92ZSh0eXBlX3BhcmFtcykpKTsKKyAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxBaWRsVHlwZVNwZWNpZmllcj4oQUlETF9MT0NBVElPTl9IRVJFLCBuYW1lLCBzdGQ6Om51bGxvcHQsIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWVudHN7fSk7CisgIH07CisKKyAgYXV0byBzZXRfbnVsbGFibGUgPSBbXShzdGQ6OnVuaXF1ZV9wdHI8QWlkbFR5cGVTcGVjaWZpZXI+JiYgdHlwZSkgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxBaWRsQW5ub3RhdGlvbj4+IGFubm90YXRpb25zOworICAgIGFubm90YXRpb25zLmVtcGxhY2VfYmFjayhzdGQ6OnVuaXF1ZV9wdHI8QWlkbEFubm90YXRpb24+KAorICAgICAgICBBaWRsQW5ub3RhdGlvbjo6UGFyc2UoQUlETF9MT0NBVElPTl9IRVJFLCAibnVsbGFibGUiLCB7fSwge30pKSk7CisgICAgdHlwZS0+QW5ub3RhdGUoc3RkOjptb3ZlKGFubm90YXRpb25zKSk7CisgICAgcmV0dXJuIHN0ZDo6bW92ZSh0eXBlKTsKKyAgfTsKKworICBhdXRvIHNldF9hcnJheSA9IFtdKHN0ZDo6dW5pcXVlX3B0cjxBaWRsVHlwZVNwZWNpZmllcj4mJiB0eXBlKSB7CisgICAgKHZvaWQpdHlwZS0+TWFrZUFycmF5KER5bmFtaWNBcnJheXt9KTsKKyAgICByZXR1cm4gc3RkOjptb3ZlKHR5cGUpOworICB9OworCisgIGF1dG8gdyA9IHR5cGUoInAuV3JhcHBlciIsIHR5cGUoIlN0cmluZyIpKTsKKyAgRVhQRUNUX0VRKCI6OnA6OldyYXBwZXI8OjphbmRyb2lkOjpTdHJpbmcxNj4iLCBjcHA6OkNwcE5hbWVPZigqdywgdHlwZW5hbWVzXykpOworCisgIGF1dG8gbnVsbGFibGVfdyA9IHNldF9udWxsYWJsZSh0eXBlKCJwLldyYXBwZXIiLCB0eXBlKCJTdHJpbmciKSkpOworICBFWFBFQ1RfRVEoIjo6c3RkOjpvcHRpb25hbDw6OnA6OldyYXBwZXI8OjphbmRyb2lkOjpTdHJpbmcxNj4+IiwKKyAgICAgICAgICAgIGNwcDo6Q3BwTmFtZU9mKCpudWxsYWJsZV93LCB0eXBlbmFtZXNfKSk7CisKKyAgYXV0byBhcnJheV93ID0gc2V0X2FycmF5KHR5cGUoInAuV3JhcHBlciIsIHR5cGUoIlN0cmluZyIpKSk7CisgIEVYUEVDVF9FUSgiOjpzdGQ6OnZlY3Rvcjw6OnA6OldyYXBwZXI8OjphbmRyb2lkOjpTdHJpbmcxNj4+IiwKKyAgICAgICAgICAgIGNwcDo6Q3BwTmFtZU9mKCphcnJheV93LCB0eXBlbmFtZXNfKSk7CisKKyAgYXV0byBudWxsYWJsZV9hcnJheV93ID0gc2V0X251bGxhYmxlKHNldF9hcnJheSh0eXBlKCJwLldyYXBwZXIiLCB0eXBlKCJTdHJpbmciKSkpKTsKKyAgRVhQRUNUX0VRKCI6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6b3B0aW9uYWw8OjpwOjpXcmFwcGVyPDo6YW5kcm9pZDo6U3RyaW5nMTY+Pj4+IiwKKyAgICAgICAgICAgIGNwcDo6Q3BwTmFtZU9mKCpudWxsYWJsZV9hcnJheV93LCB0eXBlbmFtZXNfKSk7CisKKyAgYXV0byBsaXN0X3cgPSB0eXBlKCJMaXN0IiwgdHlwZSgicC5XcmFwcGVyIiwgdHlwZSgiU3RyaW5nIikpKTsKKyAgRVhQRUNUX0VRKCI6OnN0ZDo6dmVjdG9yPDo6cDo6V3JhcHBlcjw6OmFuZHJvaWQ6OlN0cmluZzE2Pj4iLAorICAgICAgICAgICAgY3BwOjpDcHBOYW1lT2YoKmxpc3RfdywgdHlwZW5hbWVzXykpOworCisgIGF1dG8gbnVsbGFibGVfbGlzdF93ID0gc2V0X251bGxhYmxlKHR5cGUoIkxpc3QiLCB0eXBlKCJwLldyYXBwZXIiLCB0eXBlKCJTdHJpbmciKSkpKTsKKyAgRVhQRUNUX0VRKCI6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6b3B0aW9uYWw8OjpwOjpXcmFwcGVyPDo6YW5kcm9pZDo6U3RyaW5nMTY+Pj4+IiwKKyAgICAgICAgICAgIGNwcDo6Q3BwTmFtZU9mKCpudWxsYWJsZV9saXN0X3csIHR5cGVuYW1lc18pKTsKK30KKwogVEVTVF9QKEFpZGxUZXN0LCBVbmRlcnN0YW5kc05hdGl2ZVBhcmNlbGFibGVzKSB7CiAgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoCiAgICAgICAicC9CYXIuYWlkbCIsCkBAIC0xMTk5LDEwICsyMDI5LDEwIEBACiAgIGF1dG8gcGFyc2VfcmVzdWx0ID0gUGFyc2UoaW5wdXRfcGF0aCwgaW5wdXQsIHR5cGVuYW1lc18sIEdldExhbmd1YWdlKCkpOwogICBFWFBFQ1RfTkUobnVsbHB0ciwgcGFyc2VfcmVzdWx0KTsKICAgRVhQRUNUX1RSVUUodHlwZW5hbWVzXy5SZXNvbHZlVHlwZW5hbWUoInAuQmFyIikuaXNfcmVzb2x2ZWQpOwotICBBaWRsVHlwZVNwZWNpZmllciBuYXRpdmVfdHlwZShBSURMX0xPQ0FUSU9OX0hFUkUsICJwLkJhciIsIGZhbHNlLCBudWxscHRyLCB7fSk7Ci0gIG5hdGl2ZV90eXBlLlJlc29sdmUodHlwZW5hbWVzXyk7CisgIEFpZGxUeXBlU3BlY2lmaWVyIG5hdGl2ZV90eXBlKEFJRExfTE9DQVRJT05fSEVSRSwgInAuQmFyIiwgLyphcnJheT0qL3N0ZDo6bnVsbG9wdCwgbnVsbHB0ciwge30pOworICBuYXRpdmVfdHlwZS5SZXNvbHZlKHR5cGVuYW1lc18sIHBhcnNlX3Jlc3VsdCk7CiAKLSAgRVhQRUNUX0VRKCJwLkJhciIsIGphdmE6Okluc3RhbnRpYWJsZUphdmFTaWduYXR1cmVPZihuYXRpdmVfdHlwZSwgdHlwZW5hbWVzXykpOworICBFWFBFQ1RfRVEoInAuQmFyIiwgamF2YTo6SW5zdGFudGlhYmxlSmF2YVNpZ25hdHVyZU9mKG5hdGl2ZV90eXBlKSk7CiAgIC8vIEMrKyB1bmRlcnN0YW5kcyBDKysgc3BlY2lmaWMgc3R1ZmYKICAgRVhQRUNUX0VRKCI6OnA6OkJhciIsIGNwcDo6Q3BwTmFtZU9mKG5hdGl2ZV90eXBlLCB0eXBlbmFtZXNfKSk7CiAgIHNldDxzdHJpbmc+IGhlYWRlcnM7CkBAIC0xMjIyLDcgKzIwNTIsNyBAQAogICAgICJwL0lGb28uYWlkbCJ9OwogICBPcHRpb25zIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKGFyZ3MpOwogICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKG9wdGlvbnMuSW5wdXRGaWxlcygpLmZyb250KCksICJwYWNrYWdlIHA7IGludGVyZmFjZSBJRm9vIHt9Iik7Ci0gIEVYUEVDVF9FUSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX1RSVUUoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogICBzdHJpbmcgYWN0dWFsX2RlcF9maWxlX2NvbnRlbnRzOwogICBFWFBFQ1RfVFJVRShpb19kZWxlZ2F0ZV8uR2V0V3JpdHRlbkNvbnRlbnRzKG9wdGlvbnMuRGVwZW5kZW5jeUZpbGUoKSwgJmFjdHVhbF9kZXBfZmlsZV9jb250ZW50cykpOwogICBFWFBFQ1RfRVEoYWN0dWFsX2RlcF9maWxlX2NvbnRlbnRzLCBrRXhwZWN0ZWREZXBGaWxlQ29udGVudHMpOwpAQCAtMTI0MCw3ICsyMDcwLDcgQEAKICAgICAicC9JRm9vLmFpZGwifTsKICAgT3B0aW9ucyBvcHRpb25zID0gT3B0aW9uczo6RnJvbShhcmdzKTsKICAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cyhvcHRpb25zLklucHV0RmlsZXMoKS5mcm9udCgpLCAicGFja2FnZSBwOyBpbnRlcmZhY2UgSUZvbyB7fSIpOwotICBFWFBFQ1RfRVEoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9UUlVFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKICAgc3RyaW5nIGFjdHVhbF9kZXBfZmlsZV9jb250ZW50czsKICAgRVhQRUNUX1RSVUUoaW9fZGVsZWdhdGVfLkdldFdyaXR0ZW5Db250ZW50cyhvcHRpb25zLkRlcGVuZGVuY3lGaWxlKCksICZhY3R1YWxfZGVwX2ZpbGVfY29udGVudHMpKTsKICAgRVhQRUNUX0VRKGFjdHVhbF9kZXBfZmlsZV9jb250ZW50cywga0V4cGVjdGVkTmluamFEZXBGaWxlQ29udGVudHMpOwpAQCAtMTI1OSw3ICsyMDg5LDcgQEAKICAgICAicC9Gb28uYWlkbCJ9OwogICBPcHRpb25zIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKGFyZ3MpOwogICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKG9wdGlvbnMuSW5wdXRGaWxlcygpLmZyb250KCksICJwYWNrYWdlIHA7IHBhcmNlbGFibGUgRm9vOyIpOwotICBFWFBFQ1RfRVEoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9UUlVFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKICAgc3RyaW5nIGFjdHVhbF9kZXBfZmlsZV9jb250ZW50czsKICAgRVhQRUNUX1RSVUUoaW9fZGVsZWdhdGVfLkdldFdyaXR0ZW5Db250ZW50cyhvcHRpb25zLkRlcGVuZGVuY3lGaWxlKCksICZhY3R1YWxfZGVwX2ZpbGVfY29udGVudHMpKTsKICAgRVhQRUNUX0VRKGFjdHVhbF9kZXBfZmlsZV9jb250ZW50cywga0V4cGVjdGVkUGFyY2VsYWJsZURlY2xhcmF0aW9uRGVwRmlsZUNvbnRlbnRzKTsKQEAgLTEyNzQsNyArMjEwNCw3IEBACiAgICAgInAvRm9vLmFpZGwifTsKICAgT3B0aW9ucyBvcHRpb25zID0gT3B0aW9uczo6RnJvbShhcmdzKTsKICAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cyhvcHRpb25zLklucHV0RmlsZXMoKS5mcm9udCgpLCAicGFja2FnZSBwOyBwYXJjZWxhYmxlIEZvbyB7aW50IGE7fSIpOwotICBFWFBFQ1RfRVEoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9UUlVFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKICAgc3RyaW5nIGFjdHVhbF9kZXBfZmlsZV9jb250ZW50czsKICAgRVhQRUNUX1RSVUUoaW9fZGVsZWdhdGVfLkdldFdyaXR0ZW5Db250ZW50cyhvcHRpb25zLkRlcGVuZGVuY3lGaWxlKCksICZhY3R1YWxfZGVwX2ZpbGVfY29udGVudHMpKTsKICAgRVhQRUNUX0VRKGFjdHVhbF9kZXBfZmlsZV9jb250ZW50cywga0V4cGVjdGVkU3RydWN0dXJlZFBhcmNlbGFibGVEZXBGaWxlQ29udGVudHMpOwpAQCAtMTI4OCwxOSArMjExOCwxNiBAQAogICAgICJwL0Zvby5haWRsIn07CiAgIE9wdGlvbnMgb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oYXJncyk7CiAgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMob3B0aW9ucy5JbnB1dEZpbGVzKCkuZnJvbnQoKSwgInBhY2thZ2UgcDsgcGFyY2VsYWJsZSBGb287Iik7Ci0gIEVYUEVDVF9FUSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX1RSVUUoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogICBzdHJpbmcgb3V0cHV0X2ZpbGVfY29udGVudHM7CiAgIEVYUEVDVF9GQUxTRShpb19kZWxlZ2F0ZV8uR2V0V3JpdHRlbkNvbnRlbnRzKG9wdGlvbnMuT3V0cHV0RmlsZSgpLCAmb3V0cHV0X2ZpbGVfY29udGVudHMpKTsKIH0KIAogVEVTVF9QKEFpZGxUZXN0LCBSZWplY3RzTGlzdEFycmF5KSB7Ci0gIGNvbnN0IHN0cmluZyBleHBlY3RlZF9zdGRlcnIgPSAiRVJST1I6IGEvRm9vLmFpZGw6Mi4xLTc6IExpc3RbXSBpcyBub3Qgc3VwcG9ydGVkLlxuIjsKLSAgY29uc3Qgc3RyaW5nIGxpc3RfYXJyYXlfcGFyY2VsYWJsZSA9Ci0gICAgICAicGFja2FnZSBhOyBwYXJjZWxhYmxlIEZvbyB7XG4iCi0gICAgICAiICBMaXN0W10gbGlzdHM7IH0iOworICBjb25zdCBzdHJpbmcgaW5wdXQgPSAicGFja2FnZSBhOyBwYXJjZWxhYmxlIEZvbyB7IExpc3Q8U3RyaW5nPltdIGxpc3RzOyB9IjsKICAgQ2FwdHVyZVN0ZGVycigpOwotICBFWFBFQ1RfRVEobnVsbHB0ciwgUGFyc2UoImEvRm9vLmFpZGwiLCBsaXN0X2FycmF5X3BhcmNlbGFibGUsIHR5cGVuYW1lc18sIEdldExhbmd1YWdlKCkpKTsKLSAgRVhQRUNUX0VRKGV4cGVjdGVkX3N0ZGVyciwgR2V0Q2FwdHVyZWRTdGRlcnIoKSk7CisgIEVYUEVDVF9FUShudWxscHRyLCBQYXJzZSgiYS9Gb28uYWlkbCIsIGlucHV0LCB0eXBlbmFtZXNfLCBHZXRMYW5ndWFnZSgpKSk7CisgIEVYUEVDVF9USEFUKEdldENhcHR1cmVkU3RkZXJyKCksIEhhc1N1YnN0cigiQXJyYXlzIG9mIExpc3QgYXJlIG5vdCBzdXBwb3J0ZWQiKSk7CiB9CiAKIFRFU1RfUChBaWRsVGVzdCwgUmVqZWN0c1ByaW1pdGl2ZUxpc3RJblN0YWJsZUFpZGwpIHsKQEAgLTEzNDIsMTcgKzIxNjksMTAgQEAKICAgICAgICIgIFBhcmNlbGFibGVIb2xkZXIgZXh0ZW5zaW9uO1xuIgogICAgICAgIiAgUGFyY2VsYWJsZUhvbGRlciBleHRlbnNpb24yO1xuIgogICAgICAgIn0iOwotICBpZiAoR2V0TGFuZ3VhZ2UoKSA9PSBPcHRpb25zOjpMYW5ndWFnZTo6UlVTVCkgewotICAgIEVYUEVDVF9FUShudWxscHRyLCBQYXJzZSgiYS9EYXRhLmFpZGwiLCBleHRlbmRhYmxlX3BhcmNlbGFibGUsIHR5cGVuYW1lc18sIEdldExhbmd1YWdlKCkpKTsKLSAgICBFWFBFQ1RfRVEoCi0gICAgICAgICJFUlJPUjogYS9EYXRhLmFpZGw6Mi4xLTE5OiBUaGUgUnVzdCBiYWNrZW5kIGRvZXMgbm90IHN1cHBvcnQgUGFyY2VsYWJsZUhvbGRlciAiCi0gICAgICAgICJ5ZXQuXG4iLAotICAgICAgICBHZXRDYXB0dXJlZFN0ZGVycigpKTsKLSAgfSBlbHNlIHsKLSAgICBFWFBFQ1RfTkUobnVsbHB0ciwgUGFyc2UoImEvRGF0YS5haWRsIiwgZXh0ZW5kYWJsZV9wYXJjZWxhYmxlLCB0eXBlbmFtZXNfLCBHZXRMYW5ndWFnZSgpKSk7Ci0gICAgRVhQRUNUX0VRKCIiLCBHZXRDYXB0dXJlZFN0ZGVycigpKTsKLSAgfQorICBFWFBFQ1RfTkUobnVsbHB0ciwgUGFyc2UoImEvRGF0YS5haWRsIiwgZXh0ZW5kYWJsZV9wYXJjZWxhYmxlLCB0eXBlbmFtZXNfLCBHZXRMYW5ndWFnZSgpKSk7CisgIEVYUEVDVF9FUSgiIiwgR2V0Q2FwdHVyZWRTdGRlcnIoKSk7CiB9CisKIFRFU1RfUChBaWRsVGVzdCwgUGFyY2VsYWJsZUhvbGRlckFzUmV0dXJuVHlwZSkgewogICBDYXB0dXJlU3RkZXJyKCk7CiAgIHN0cmluZyBwYXJjZWxhYmxlaG9sZGVyX3JldHVybl9pbnRlcmZhY2UgPQpAQCAtMTM2MiwxNCArMjE4Miw2IEBACiAgIEVYUEVDVF9FUShudWxscHRyLAogICAgICAgICAgICAgUGFyc2UoImEvSUZvby5haWRsIiwgcGFyY2VsYWJsZWhvbGRlcl9yZXR1cm5faW50ZXJmYWNlLCB0eXBlbmFtZXNfLCBHZXRMYW5ndWFnZSgpKSk7CiAKLSAgaWYgKEdldExhbmd1YWdlKCkgPT0gT3B0aW9uczo6TGFuZ3VhZ2U6OlJVU1QpIHsKLSAgICBFWFBFQ1RfRVEoCi0gICAgICAgICJFUlJPUjogYS9JRm9vLmFpZGw6Mi4xOS0yMzogUGFyY2VsYWJsZUhvbGRlciBjYW5ub3QgYmUgYSByZXR1cm4gdHlwZVxuIgotICAgICAgICAiRVJST1I6IGEvSUZvby5haWRsOjIuMS0xOTogVGhlIFJ1c3QgYmFja2VuZCBkb2VzIG5vdCBzdXBwb3J0IFBhcmNlbGFibGVIb2xkZXIgIgotICAgICAgICAieWV0LlxuIiwKLSAgICAgICAgR2V0Q2FwdHVyZWRTdGRlcnIoKSk7Ci0gICAgcmV0dXJuOwotICB9CiAgIEVYUEVDVF9FUSgiRVJST1I6IGEvSUZvby5haWRsOjIuMTktMjM6IFBhcmNlbGFibGVIb2xkZXIgY2Fubm90IGJlIGEgcmV0dXJuIHR5cGVcbiIsCiAgICAgICAgICAgICBHZXRDYXB0dXJlZFN0ZGVycigpKTsKIH0KQEAgLTEzODMsMTQgKzIxOTUsNiBAQAogICBFWFBFQ1RfRVEobnVsbHB0ciwKICAgICAgICAgICAgIFBhcnNlKCJhL0lGb28uYWlkbCIsIGV4dGVuZGFibGVfcGFyY2VsYWJsZV9hcmdfaW50ZXJmYWNlLCB0eXBlbmFtZXNfLCBHZXRMYW5ndWFnZSgpKSk7CiAKLSAgaWYgKEdldExhbmd1YWdlKCkgPT0gT3B0aW9uczo6TGFuZ3VhZ2U6OlJVU1QpIHsKLSAgICBFWFBFQ1RfRVEoCi0gICAgICAgICJFUlJPUjogYS9JRm9vLmFpZGw6Mi4zMS0zNDogUGFyY2VsYWJsZUhvbGRlciBjYW5ub3QgYmUgYW4gYXJndW1lbnQgdHlwZVxuIgotICAgICAgICAiRVJST1I6IGEvSUZvby5haWRsOjIuMTQtMzE6IFRoZSBSdXN0IGJhY2tlbmQgZG9lcyBub3Qgc3VwcG9ydCBQYXJjZWxhYmxlSG9sZGVyICIKLSAgICAgICAgInlldC5cbiIsCi0gICAgICAgIEdldENhcHR1cmVkU3RkZXJyKCkpOwotICAgIHJldHVybjsKLSAgfQogICBFWFBFQ1RfRVEoIkVSUk9SOiBhL0lGb28uYWlkbDoyLjMxLTM0OiBQYXJjZWxhYmxlSG9sZGVyIGNhbm5vdCBiZSBhbiBhcmd1bWVudCB0eXBlXG4iLAogICAgICAgICAgICAgR2V0Q2FwdHVyZWRTdGRlcnIoKSk7CiB9CkBAIC0xNDAwLDE1ICsyMjA0LDcgQEAKICAgT3B0aW9ucyBvcHRpb25zID0gT3B0aW9uczo6RnJvbSgiYWlkbCBGb28uYWlkbCAtLWxhbmc9IiArIHRvX3N0cmluZyhHZXRMYW5ndWFnZSgpKSk7CiAgIGNvbnN0IHN0cmluZyBleHBlY3RlZF9zdGRlcnIgPSAiRVJST1I6IEZvby5haWRsOjEuMjctNDQ6IFBhcmNlbGFibGVIb2xkZXIgY2Fubm90IGJlIG51bGxhYmxlLlxuIjsKICAgQ2FwdHVyZVN0ZGVycigpOwotICBFWFBFQ1RfTkUoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7Ci0gIGlmIChHZXRMYW5ndWFnZSgpID09IE9wdGlvbnM6Okxhbmd1YWdlOjpSVVNUKSB7Ci0gICAgRVhQRUNUX0VRKAotICAgICAgICAiRVJST1I6IEZvby5haWRsOjEuMjctNDQ6IFBhcmNlbGFibGVIb2xkZXIgY2Fubm90IGJlIG51bGxhYmxlLlxuIgotICAgICAgICAiRVJST1I6IEZvby5haWRsOjEuMjctNDQ6IFRoZSBSdXN0IGJhY2tlbmQgZG9lcyBub3Qgc3VwcG9ydCBQYXJjZWxhYmxlSG9sZGVyICIKLSAgICAgICAgInlldC5cbiIsCi0gICAgICAgIEdldENhcHR1cmVkU3RkZXJyKCkpOwotICAgIHJldHVybjsKLSAgfQorICBFWFBFQ1RfRkFMU0UoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogICBFWFBFQ1RfRVEoZXhwZWN0ZWRfc3RkZXJyLCBHZXRDYXB0dXJlZFN0ZGVycigpKTsKIH0KIApAQCAtMTQxNiw3ICsyMjEyLDcgQEAKICAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygiRm9vLmFpZGwiLCAicGFyY2VsYWJsZSBGb28geyBjb25zdCBpbnQgQklUID0gMHgxIDw8IDM7IH0iKTsKICAgT3B0aW9ucyBvcHRpb25zID0gT3B0aW9uczo6RnJvbSgiYWlkbCBGb28uYWlkbCAtLWxhbmc9IiArIHRvX3N0cmluZyhHZXRMYW5ndWFnZSgpKSk7CiAgIENhcHR1cmVTdGRlcnIoKTsKLSAgRVhQRUNUX0VRKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfVFJVRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAgIEVYUEVDVF9FUSgiIiwgR2V0Q2FwdHVyZWRTdGRlcnIoKSk7CiB9CiAKQEAgLTE0MjQsNyArMjIyMCw3IEBACiAgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoIkZvby5haWRsIiwgInVuaW9uIEZvbyB7IGNvbnN0IGludCBCSVQgPSAweDEgPDwgMzsgaW50IG47IH0iKTsKICAgT3B0aW9ucyBvcHRpb25zID0gT3B0aW9uczo6RnJvbSgiYWlkbCBGb28uYWlkbCAtLWxhbmc9IiArIHRvX3N0cmluZyhHZXRMYW5ndWFnZSgpKSk7CiAgIENhcHR1cmVTdGRlcnIoKTsKLSAgRVhQRUNUX0VRKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfVFJVRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAgIEVYUEVDVF9FUSgiIiwgR2V0Q2FwdHVyZWRTdGRlcnIoKSk7CiB9CiAKQEAgLTE0MzYsNyArMjIzMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn0iKTsKICAgT3B0aW9ucyBvcHRpb25zID0gT3B0aW9uczo6RnJvbSgiYWlkbCBJRm9vLmFpZGwgLS1sYW5nPWphdmEgLW8gb3V0Iik7CiAgIENhcHR1cmVTdGRlcnIoKTsKLSAgRVhQRUNUX0VRKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfVFJVRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAgIEVYUEVDVF9FUSgiIiwgR2V0Q2FwdHVyZWRTdGRlcnIoKSk7CiAgIHN0cmluZyBjb2RlOwogICBFWFBFQ1RfVFJVRShpb19kZWxlZ2F0ZV8uR2V0V3JpdHRlbkNvbnRlbnRzKCJvdXQvSUZvby5qYXZhIiwgJmNvZGUpKTsKQEAgLTE0NDcsNiArMjI0Myw3IEBACiBURVNUX0YoQWlkbFRlc3QsIEFwaUR1bXApIHsKICAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygKICAgICAgICJmb28vYmFyL0lGb28uYWlkbCIsCisgICAgICAiLy8gY29tbWVudFxuIgogICAgICAgInBhY2thZ2UgZm9vLmJhcjtcbiIKICAgICAgICJpbXBvcnQgZm9vLmJhci5EYXRhO1xuIgogICAgICAgIi8vIGNvbW1lbnRlZCAvKiBAaGlkZSAqL1xuIgpAQCAtMTQ1Niw2ICsyMjUzLDcgQEAKICAgICAgICIgICAgaW50IGZvbyhvdXQgaW50W10gYSwgU3RyaW5nIGIsIGJvb2xlYW4gYywgaW5vdXQgTGlzdDxTdHJpbmc+IGQpO1xuIgogICAgICAgIiAgICBpbnQgZm9vMihAdXRmOEluQ3BwIFN0cmluZyB4LCBpbm91dCBMaXN0PFN0cmluZz4geSk7XG4iCiAgICAgICAiICAgIElGb28gZm9vMyhJRm9vIGZvbyk7XG4iCisgICAgICAiICAgIHZvaWQgZm9vNChpbiBpbnRbMl1bM10gZml4ZWRBcnJheSk7XG4iCiAgICAgICAiICAgIERhdGEgZ2V0RGF0YSgpO1xuIgogICAgICAgIiAgICAvLyBAaGlkZSBub3QgYXBwbGllZFxuIgogICAgICAgIiAgICAvKiogYmxhaGJsYWhcbiIKQEAgLTE0NjYsNiArMjI2NCw3IEBACiAgICAgICAiICAgIGNvbnN0IFN0cmluZyBTVFIgPSBcIkhlbGxvXCI7XG4iCiAgICAgICAifVxuIik7CiAgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoImZvby9iYXIvRGF0YS5haWRsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLy8gY29tbWVudFxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYWNrYWdlIGZvby5iYXI7XG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImltcG9ydCBmb28uYmFyLklGb287XG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8qIEBoaWRlKi9cbiIKQEAgLTE0ODcsNyArMjI4Niw3IEBACiAgIEFTU0VSVF9UUlVFKHJlc3VsdCk7CiAgIHN0cmluZyBhY3R1YWw7CiAgIEVYUEVDVF9UUlVFKGlvX2RlbGVnYXRlXy5HZXRXcml0dGVuQ29udGVudHMoImR1bXAvZm9vL2Jhci9JRm9vLmFpZGwiLCAmYWN0dWFsKSk7Ci0gIEVYUEVDVF9FUShzdHJpbmcoa1ByZWFtYmxlKS5hcHBlbmQoUiIocGFja2FnZSBmb28uYmFyOworICBFWFBFQ1RfRVEoc3RyaW5nKCIvLyBjb21tZW50XG4iKS5hcHBlbmQoc3RyaW5nKGtQcmVhbWJsZSkpLmFwcGVuZChSIihwYWNrYWdlIGZvby5iYXI7CiBpbnRlcmZhY2UgSUZvbyB7CiAgIC8qKgogICAgKiBAaGlkZQpAQCAtMTQ5Niw2ICsyMjk1LDcgQEAKICAgaW50IGZvbyhvdXQgaW50W10gYSwgU3RyaW5nIGIsIGJvb2xlYW4gYywgaW5vdXQgTGlzdDxTdHJpbmc+IGQpOwogICBpbnQgZm9vMihAdXRmOEluQ3BwIFN0cmluZyB4LCBpbm91dCBMaXN0PFN0cmluZz4geSk7CiAgIGZvby5iYXIuSUZvbyBmb28zKGZvby5iYXIuSUZvbyBmb28pOworICB2b2lkIGZvbzQoaW4gaW50WzJdWzNdIGZpeGVkQXJyYXkpOwogICBmb28uYmFyLkRhdGEgZ2V0RGF0YSgpOwogICAvKioKICAgICogQGRlcHJlY2F0ZWQgcmVhc29uIHdoeS4uLgpAQCAtMTUwNyw3ICsyMzA3LDcgQEAKICAgICAgICAgICAgIGFjdHVhbCk7CiAKICAgRVhQRUNUX1RSVUUoaW9fZGVsZWdhdGVfLkdldFdyaXR0ZW5Db250ZW50cygiZHVtcC9mb28vYmFyL0RhdGEuYWlkbCIsICZhY3R1YWwpKTsKLSAgRVhQRUNUX0VRKHN0cmluZyhrUHJlYW1ibGUpLmFwcGVuZChSIihwYWNrYWdlIGZvby5iYXI7CisgIEVYUEVDVF9FUShzdHJpbmcoIi8vIGNvbW1lbnRcbiIpLmFwcGVuZChzdHJpbmcoa1ByZWFtYmxlKSkuYXBwZW5kKFIiKHBhY2thZ2UgZm9vLmJhcjsKIC8qIEBoaWRlICovCiBwYXJjZWxhYmxlIERhdGEgewogICBpbnQgeCA9IDEwOwpAQCAtMTY1Nyw2ICsyNDU3LDE3IEBACiAgICAgICAgICAgICBhY3R1YWwpOwogfQogCitURVNUX0YoQWlkbFRlc3QsIEltcG9ydGVkRG9jdW1lbnRIYXNEdXBsaWNhdGVEZWZpbml0aW9ucykgeworICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJJRm9vLmFpZGwiLCAiaW50ZXJmYWNlIElGb287IGludGVyZmFjZSBJRm9vO1xuIik7CisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoIkJhci5haWRsIiwgImVudW0gQmFyIHsgQ09OU1QgPSBJRm9vLk5PTkUgfVxuIik7CisKKyAgdmVjdG9yPHN0cmluZz4gYXJncyA9IHsiYWlkbCIsICItLWR1bXBhcGkiLCAiLUkuIiwgIi1vIG91dCIsICJCYXIuYWlkbCJ9OworICBPcHRpb25zIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKGFyZ3MpOworICBDYXB0dXJlU3RkZXJyKCk7CisgIEVYUEVDVF9GQUxTRShkdW1wX2FwaShvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRlcnIoKSwgSGFzU3Vic3RyKCJDYW4ndCBmaW5kIE5PTkUgaW4gSUZvbyIpKTsKK30KKwogVEVTVF9GKEFpZGxUZXN0LCBDaGVja051bUdlbmVyaWNUeXBlU2VjaWZpZXIpIHsKICAgY29uc3Qgc3RyaW5nIGV4cGVjdGVkX2xpc3Rfc3RkZXJyID0KICAgICAgICJFUlJPUjogcC9JRm9vLmFpZGw6MS4zNy00MTogTGlzdCBjYW4gb25seSBoYXZlIG9uZSB0eXBlIHBhcmFtZXRlciwgYnV0IGdvdDogIgpAQCAtMTY2OCw0NCArMjQ3OSw0NCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYWNrYWdlIHA7IGludGVyZmFjZSBJRm9vIHsiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZvaWQgZm9vKExpc3Q8U3RyaW5nLCBTdHJpbmc+IGEpO30iKTsKICAgQ2FwdHVyZVN0ZGVycigpOwotICBFWFBFQ1RfTkUoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9GQUxTRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAgIEVYUEVDVF9FUShleHBlY3RlZF9saXN0X3N0ZGVyciwgR2V0Q2FwdHVyZWRTdGRlcnIoKSk7CiAKICAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cyhvcHRpb25zLklucHV0RmlsZXMoKS5mcm9udCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYWNrYWdlIHA7IGludGVyZmFjZSBJRm9vIHsiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZvaWQgZm9vKE1hcDxTdHJpbmc+IGEpO30iKTsKICAgQ2FwdHVyZVN0ZGVycigpOwotICBFWFBFQ1RfTkUoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9GQUxTRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAgIEVYUEVDVF9FUShleHBlY3RlZF9tYXBfc3RkZXJyLCBHZXRDYXB0dXJlZFN0ZGVycigpKTsKIH0KIAogVEVTVF9GKEFpZGxUZXN0LCBDaGVja1R5cGVQYXJhbWV0ZXJJbk1hcFR5cGUpIHsKICAgY29uc3Qgc3RyaW5nIGV4cGVjdGVkX3N0ZGVyciA9CiAgICAgICAiRVJST1I6IHAvSUZvby5haWRsOjEuMjgtMzE6IFRoZSB0eXBlIG9mIGtleSBpbiBtYXAgbXVzdCBiZSBTdHJpbmcsIGJ1dCBpdCBpcyAncC5CYXInXG4iOwotICBPcHRpb25zIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIC1JIHAgcC9JRm9vLmFpZGwiKTsKKyAgT3B0aW9ucyBvcHRpb25zID0gT3B0aW9uczo6RnJvbSgiYWlkbCAtSSAuIHAvSUZvby5haWRsIik7CiAgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoInAvQmFyLmFpZGwiLCAicGFja2FnZSBwOyBwYXJjZWxhYmxlIEJhciB7IFN0cmluZyBzOyB9Iik7CiAKICAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygicC9JRm9vLmFpZGwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYWNrYWdlIHA7IGludGVyZmFjZSBJRm9vIHsiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1hcDxTdHJpbmcsIEJhcj4gZm9vKCk7fSIpOwotICBFWFBFQ1RfRVEoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1hcDxTdHJpbmcsIHAuQmFyPiBmb28oKTt9Iik7CisgIEVYUEVDVF9UUlVFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKIAogICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJwL0lGb28uYWlkbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhY2thZ2UgcDsgaW50ZXJmYWNlIElGb28geyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWFwPEJhciwgQmFyPiBmb28oKTt9Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1hcDxwLkJhciwgcC5CYXI+IGZvbygpO30iKTsKICAgQ2FwdHVyZVN0ZGVycigpOwotICBFWFBFQ1RfTkUoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9GQUxTRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAgIEVYUEVDVF9FUShleHBlY3RlZF9zdGRlcnIsIEdldENhcHR1cmVkU3RkZXJyKCkpOwogCiAgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoInAvSUZvby5haWRsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFja2FnZSBwOyBpbnRlcmZhY2UgSUZvbyB7IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYXA8U3RyaW5nLCBTdHJpbmc+IGZvbygpO30iKTsKLSAgRVhQRUNUX0VRKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfVFJVRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAKICAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygicC9JRm9vLmFpZGwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYWNrYWdlIHA7IGludGVyZmFjZSBJRm9vIHsiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1hcDxTdHJpbmcsIFBhcmNlbEZpbGVEZXNjcmlwdG9yPiBmb28oKTt9Iik7Ci0gIEVYUEVDVF9FUSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX1RSVUUoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogfQogCiBURVNUX0YoQWlkbFRlc3QsIFdyb25nR2VuZXJpY1R5cGUpIHsKQEAgLTE3MTUsNDcgKzI1MjYsNDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFja2FnZSBwOyBpbnRlcmZhY2UgSUZvbyB7IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdHJpbmc8U3RyaW5nPiBmb28oKTsgfSIpOwogICBDYXB0dXJlU3RkZXJyKCk7Ci0gIEVYUEVDVF9ORSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX0ZBTFNFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKICAgRVhQRUNUX0VRKGV4cGVjdGVkX3N0ZGVyciwgR2V0Q2FwdHVyZWRTdGRlcnIoKSk7CiB9CiAKIFRFU1RfRihBaWRsVGVzdCwgVXNlckRlZmluZWRVbnN0cnVjdHVyZWRHZW5lcmljUGFyY2VsYWJsZVR5cGUpIHsKLSAgT3B0aW9ucyBvcHRpb25zRm9yUGFyY2VsYWJsZSA9IE9wdGlvbnM6OkZyb20oImFpZGwgLUkgcCBwL0Jhci5haWRsIik7CisgIE9wdGlvbnMgb3B0aW9uc0ZvclBhcmNlbGFibGUgPSBPcHRpb25zOjpGcm9tKCJhaWRsIC1JIC4gcC9CYXIuYWlkbCIpOwogICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJwL0Jhci5haWRsIiwgInBhY2thZ2UgcDsgcGFyY2VsYWJsZSBCYXI8VCwgVD47Iik7CiAgIENhcHR1cmVTdGRlcnIoKTsKLSAgRVhQRUNUX05FKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnNGb3JQYXJjZWxhYmxlLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX0ZBTFNFKGNvbXBpbGVfYWlkbChvcHRpb25zRm9yUGFyY2VsYWJsZSwgaW9fZGVsZWdhdGVfKSk7CiAgIEVYUEVDVF9FUSgiRVJST1I6IHAvQmFyLmFpZGw6MS4yMi0yNjogRXZlcnkgdHlwZSBwYXJhbWV0ZXIgc2hvdWxkIGJlIHVuaXF1ZS5cbiIsCiAgICAgICAgICAgICBHZXRDYXB0dXJlZFN0ZGVycigpKTsKIAotICBPcHRpb25zIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIC1JIHAgcC9JRm9vLmFpZGwiKTsKKyAgT3B0aW9ucyBvcHRpb25zID0gT3B0aW9uczo6RnJvbSgiYWlkbCAtSSAuIHAvSUZvby5haWRsIik7CiAgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoInAvQmFyLmFpZGwiLCAicGFja2FnZSBwOyBwYXJjZWxhYmxlIEJhcjsiKTsKICAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygicC9JRm9vLmFpZGwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYWNrYWdlIHA7IGludGVyZmFjZSBJRm9vIHsiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhcjxTdHJpbmcsIFN0cmluZz4gZm9vKCk7fSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwLkJhcjxTdHJpbmcsIFN0cmluZz4gZm9vKCk7fSIpOwogICBDYXB0dXJlU3RkZXJyKCk7Ci0gIEVYUEVDVF9ORSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKLSAgRVhQRUNUX0VRKCJFUlJPUjogcC9JRm9vLmFpZGw6MS4yOC0zMTogcC5CYXIgaXMgbm90IGEgZ2VuZXJpYyB0eXBlLlxuIiwgR2V0Q2FwdHVyZWRTdGRlcnIoKSk7CisgIEVYUEVDVF9GQUxTRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9USEFUKEdldENhcHR1cmVkU3RkZXJyKCksIEhhc1N1YnN0cigicC5CYXIgaXMgbm90IGEgZ2VuZXJpYyB0eXBlIikpOwogICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJwL0Jhci5haWRsIiwgInBhY2thZ2UgcDsgcGFyY2VsYWJsZSBCYXI8VD47Iik7CiAgIENhcHR1cmVTdGRlcnIoKTsKLSAgRVhQRUNUX05FKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwotICBFWFBFQ1RfRVEoIkVSUk9SOiBwL0lGb28uYWlkbDoxLjI4LTMxOiBwLkJhciBtdXN0IGhhdmUgMSB0eXBlIHBhcmFtZXRlcnMsIGJ1dCBnb3QgMlxuIiwKLSAgICAgICAgICAgIEdldENhcHR1cmVkU3RkZXJyKCkpOworICBFWFBFQ1RfRkFMU0UoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfVEhBVChHZXRDYXB0dXJlZFN0ZGVycigpLCBIYXNTdWJzdHIoInAuQmFyIG11c3QgaGF2ZSAxIHR5cGUgcGFyYW1ldGVycywgYnV0IGdvdCAyIikpOwogICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJwL0Jhci5haWRsIiwgInBhY2thZ2UgcDsgcGFyY2VsYWJsZSBCYXI8VCwgVj47Iik7Ci0gIEVYUEVDVF9FUSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX1RSVUUoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJwL0lGb28uYWlkbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhY2thZ2UgcDsgaW50ZXJmYWNlIElGb28geyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFyPFN0cmluZywgUGFyY2VsRmlsZURlc2NyaXB0b3I+IGZvbygpO30iKTsKLSAgRVhQRUNUX0VRKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwLkJhcjxTdHJpbmcsIFBhcmNlbEZpbGVEZXNjcmlwdG9yPiBmb28oKTt9Iik7CisgIEVYUEVDVF9UUlVFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKIAogICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJwL0lGb28uYWlkbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhY2thZ2UgcDsgaW50ZXJmYWNlIElGb28geyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFyPGludCwgbG9uZz4gZm9vKCk7fSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwLkJhcjxpbnQsIGxvbmc+IGZvbygpO30iKTsKIAogICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJwL0lGb28uYWlkbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhY2thZ2UgcDsgaW50ZXJmYWNlIElGb28geyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFyPGludFtdLCBsb25nW10+IGZvbygpO30iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicC5CYXI8aW50W10sIGxvbmdbXT4gZm9vKCk7fSIpOwogCi0gIEVYUEVDVF9FUSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX1RSVUUoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogfQogCiBURVNUX0YoQWlkbFRlc3QsIEZhaWxPbk11bHRpcGxlVHlwZXNJblNpbmdsZUZpbGUpIHsKQEAgLTE3NzMsNyArMjU4Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyY2VsYWJsZSBEYXRhMSB7IGludCBhOyBpbnQgYjt9XG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyY2VsYWJsZSBEYXRhMiB7IGludCBhOyBpbnQgYjt9XG4iKTsKICAgICBDYXB0dXJlU3RkZXJyKCk7Ci0gICAgRVhQRUNUX05FKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICAgIEVYUEVDVF9GQUxTRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAgICAgRVhQRUNUX0VRKGV4cGVjdGVkX3N0ZGVyciwgR2V0Q2FwdHVyZWRTdGRlcnIoKSk7CiAKICAgICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKG9wdGlvbnMuSW5wdXRGaWxlcygpLmZyb250KCksCkBAIC0xNzgxLDcgKzI1OTEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVyZmFjZSBJRm9vMSB7IGludCBmb28oKTsgfVxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVyZmFjZSBJRm9vMiB7IGludCBmb28oKTsgfVxuIik7CiAgICAgQ2FwdHVyZVN0ZGVycigpOwotICAgIEVYUEVDVF9ORSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgICBFWFBFQ1RfRkFMU0UoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogICAgIEVYUEVDVF9FUShleHBlY3RlZF9zdGRlcnIsIEdldENhcHR1cmVkU3RkZXJyKCkpOwogCiAgICAgZXhwZWN0ZWRfc3RkZXJyID0gIkVSUk9SOiBmb28vYmFyL0Zvby5haWRsOjMuMTEtMTc6IFlvdSBtdXN0IGRlY2xhcmUgb25seSBvbmUgdHlwZSBwZXIgZmlsZS5cbiI7CkBAIC0xNzkwLDcgKzI2MDAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmNlbGFibGUgRGF0YTEgeyBpbnQgYTsgaW50IGI7fVxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmNlbGFibGUgRGF0YTIgeyBpbnQgYTsgaW50IGI7fVxuIik7CiAgICAgQ2FwdHVyZVN0ZGVycigpOwotICAgIEVYUEVDVF9ORSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgICBFWFBFQ1RfRkFMU0UoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogICAgIEVYUEVDVF9FUShleHBlY3RlZF9zdGRlcnIsIEdldENhcHR1cmVkU3RkZXJyKCkpOwogICB9CiB9CkBAIC0xNzk4LDkgKzI2MDgsMTIgQEAKIFRFU1RfUChBaWRsVGVzdCwgRmFpbFBhcnNlT25FbXB0eUZpbGUpIHsKICAgY29uc3Qgc3RyaW5nIGNvbnRlbnRzID0gIiI7CiAgIGNvbnN0IHN0cmluZyBleHBlY3RlZF9zdGRlcnIgPSAiRVJST1I6IGEvSUZvby5haWRsOjEuMS0xOiBzeW50YXggZXJyb3IsIHVuZXhwZWN0ZWQgJGVuZFxuIjsKKyAgY29uc3Qgc3RyaW5nIGV4cGVjdGVkX3N0ZGVycl9uZXdiaXNvbiA9CisgICAgICAiRVJST1I6IGEvSUZvby5haWRsOjEuMS0xOiBzeW50YXggZXJyb3IsIHVuZXhwZWN0ZWQgZW5kIG9mIGZpbGVcbiI7CiAgIENhcHR1cmVTdGRlcnIoKTsKICAgRVhQRUNUX0VRKG51bGxwdHIsIFBhcnNlKCJhL0lGb28uYWlkbCIsIGNvbnRlbnRzLCB0eXBlbmFtZXNfLCBHZXRMYW5ndWFnZSgpKSk7Ci0gIEVYUEVDVF9FUShleHBlY3RlZF9zdGRlcnIsIEdldENhcHR1cmVkU3RkZXJyKCkpOworICBFWFBFQ1RfVEhBVChHZXRDYXB0dXJlZFN0ZGVycigpLAorICAgICAgICAgICAgICB0ZXN0aW5nOjpBbnlPZih0ZXN0aW5nOjpFcShleHBlY3RlZF9zdGRlcnIpLCB0ZXN0aW5nOjpFcShleHBlY3RlZF9zdGRlcnJfbmV3Ymlzb24pKSk7CiB9CiAKIFRFU1RfRihBaWRsVGVzdCwgTXVsdGlwbGVJbnB1dEZpbGVzKSB7CkBAIC0xODE3LDcgKzI2MzAsNyBAQAogICAgICAgICAiaW1wb3J0IGZvby5iYXIuSUZvbztcbiIKICAgICAgICAgInBhcmNlbGFibGUgRGF0YSB7IElGb28gZm9vOyB9XG4iKTsKIAotICBFWFBFQ1RfRVEoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9UUlVFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKIAogICBzdHJpbmcgY29udGVudDsKICAgZm9yIChjb25zdCBhdXRvIGZpbGUgOiB7CkBAIC0xODQyLDcgKzI2NTUsNyBAQAogICAgICAgICAiaW1wb3J0IGZvby5iYXIuSUZvbztcbiIKICAgICAgICAgInBhcmNlbGFibGUgRGF0YSB7IElGb28gZm9vOyB9XG4iKTsKIAotICBFWFBFQ1RfRVEoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9UUlVFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKIAogICBzdHJpbmcgY29udGVudDsKICAgZm9yIChjb25zdCBhdXRvIGZpbGUgOiB7CkBAIC0xODcwLDcgKzI2ODMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbXBvcnQgZm9vLmJhci5JRm9vO1xuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJjZWxhYmxlIERhdGEgeyBJRm9vIGZvbzsgfVxuIik7CiAKLSAgRVhQRUNUX0VRKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfVFJVRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAKICAgc3RyaW5nIGNvbnRlbnQ7CiAgIGZvciAoY29uc3QgYXV0byBmaWxlIDogeyJvdXQvZm9vL2Jhci9JRm9vLnJzIiwgIm91dC9mb28vYmFyL0RhdGEucnMifSkgewpAQCAtMTg4OSw3ICsyNzAyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFja2FnZSBwOyBpbnRlcmZhY2UgSUZvbyB7IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnQgZ2V0SW50ZXJmYWNlVmVyc2lvbigpOyB9Iik7CiAgIENhcHR1cmVTdGRlcnIoKTsKLSAgRVhQRUNUX05FKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfRkFMU0UoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogICBFWFBFQ1RfRVEoZXhwZWN0ZWRfc3RkZXJyLCBHZXRDYXB0dXJlZFN0ZGVycigpKTsKIH0KIApAQCAtMTkwMyw3ICsyNzE2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFja2FnZSBwOyBpbnRlcmZhY2UgSUZvbyB7IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJib29sZWFuIGdldEludGVyZmFjZVZlcnNpb24oKTsgfSIpOwogICBDYXB0dXJlU3RkZXJyKCk7Ci0gIEVYUEVDVF9ORSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX0ZBTFNFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKICAgRVhQRUNUX0VRKGV4cGVjdGVkX3N0ZGVyciwgR2V0Q2FwdHVyZWRTdGRlcnIoKSk7CiB9CiAKQEAgLTE5MTYsMTQgKzI3MjksMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFja2FnZSBwOyBpbnRlcmZhY2UgSUZvbyB7IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdHJpbmcgZ2V0VHJhbnNhY3Rpb25OYW1lKGludCBjb2RlKTsgfSIpOwogICBDYXB0dXJlU3RkZXJyKCk7Ci0gIEVYUEVDVF9ORSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX0ZBTFNFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKICAgRVhQRUNUX0VRKGV4cGVjdGVkX3N0ZGVyciwgR2V0Q2FwdHVyZWRTdGRlcnIoKSk7CiAKICAgLy8gdGhpcyBpcyBub3QgYSBtZXRhIGludGVyZmFjZSBtZXRob2QgYXMgaXQgZGlmZmVycyB0eXBlIGFyZ3VtZW50cwogICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKG9wdGlvbnMuSW5wdXRGaWxlcygpLmZyb250KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhY2thZ2UgcDsgaW50ZXJmYWNlIElGb28geyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3RyaW5nIGdldFRyYW5zYWN0aW9uTmFtZSgpOyB9Iik7Ci0gIEVYUEVDVF9FUSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX1RSVUUoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogfQogCiBURVNUX0YoQWlkbFRlc3QsIENoZWNrQXBpRm9yRXF1YWxpdHkpIHsKQEAgLTE5NjksNiArMjc4MiwxNyBAQAogICBFWFBFQ1RfVFJVRSg6OmFuZHJvaWQ6OmFpZGw6OmNoZWNrX2FwaShvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKIH0KIAorVEVTVF9GKEFpZGxUZXN0LCBDaGVja0FwaV9FbnVtRmllbGRzRnJvbUltcG9ydGVkKSB7CisgIE9wdGlvbnMgb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgLS1jaGVja2FwaSBvbGQgbmV3IC1JIGltcG9ydCIpOworCisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoIm9sZC9wL0Zvby5haWRsIiwgInBhY2thZ2UgcDsgcGFyY2VsYWJsZSBGb297IG90aGVyLkVudW0gZTsgfSIpOworICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJuZXcvcC9Gb28uYWlkbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhY2thZ2UgcDsgcGFyY2VsYWJsZSBGb297IG90aGVyLkVudW0gZSA9IG90aGVyLkVudW0uRk9POyB9Iik7CisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoImltcG9ydC9vdGhlci9FbnVtLmFpZGwiLCAicGFja2FnZSBvdGhlcjsgZW51bSBFbnVtIHsgRk9PIH0iKTsKKworICBFWFBFQ1RfVFJVRSg6OmFuZHJvaWQ6OmFpZGw6OmNoZWNrX2FwaShvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKK30KKwogVEVTVF9GKEFpZGxUZXN0LCBDaGVja0FwaUVxdWFsX0VudW1GaWVsZHNXaXRoRGVmYXVsdFZhbHVlcykgewogICBPcHRpb25zIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIC0tY2hlY2thcGk9ZXF1YWwgb2xkIG5ldyIpOwogICBjb25zdCBzdHJpbmcgZm9vX2RlZmluaXRpb24gPSAicGFja2FnZSBwOyBwYXJjZWxhYmxlIEZvb3sgcC5FbnVtIGUgPSBwLkVudW0uRk9POyB9IjsKQEAgLTIwMTcsNyArMjg0MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVyZmFjZSBJRm9vIHsiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgdm9pZCBmb28oaW50IGEpOyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICB2b2lkIGJhcigpOyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICB2b2lkIGJheihpbiBMaXN0PElGb28+IGFyZyk7IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIHZvaWQgYmF6KGluIExpc3Q8U3RyaW5nPiBhcmcpOyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifSIpOwogICBFWFBFQ1RfVFJVRSg6OmFuZHJvaWQ6OmFpZGw6OmNoZWNrX2FwaShvcHRpb25zXywgaW9fZGVsZWdhdGVfKSk7CiB9CkBAIC0yMjM4LDYgKzMwNjIsMjIgQEAKICAgRVhQRUNUX1RSVUUoOjphbmRyb2lkOjphaWRsOjpjaGVja19hcGkob3B0aW9uc18sIGlvX2RlbGVnYXRlXykpOwogfQogCitURVNUX0YoQWlkbFRlc3RDb21wYXRpYmxlQ2hhbmdlcywgTmV3TmVzdGVkVHlwZXMpIHsKKyAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygib2xkL3AvRGF0YS5haWRsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFja2FnZSBwO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJjZWxhYmxlIERhdGEge1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIGludCBuO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9Iik7CisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoIm5ldy9wL0RhdGEuYWlkbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhY2thZ2UgcDtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyY2VsYWJsZSBEYXRhIHtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBlbnVtIE5ld0VudW0geyBOID0gMyB9XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgaW50IG47XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgTmV3RW51bSBlID0gTmV3RW51bS5OO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9Iik7CisgIEVYUEVDVF9UUlVFKDo6YW5kcm9pZDo6YWlkbDo6Y2hlY2tfYXBpKG9wdGlvbnNfLCBpb19kZWxlZ2F0ZV8pKTsKK30KKwogVEVTVF9GKEFpZGxUZXN0Q29tcGF0aWJsZUNoYW5nZXMsIE5ld0phdmFTdXBwcmVzc0xpbnQpIHsKICAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygib2xkL3AvSUZvby5haWRsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFja2FnZSBwOyIKQEAgLTI3NjEsMzYgKzM2MDEsMTA1IEBACiAgIEVYUEVDVF9FUShleHBlY3RlZF9zdGRlcnIsIEdldENhcHR1cmVkU3RkZXJyKCkpOwogfQogCitURVNUX0YoQWlkbFRlc3RJbmNvbXBhdGlibGVDaGFuZ2VzLCBJbmNvbXBhdGlibGVDaGFuZ2VzSW5OZXN0ZWRUeXBlKSB7CisgIGNvbnN0IHN0cmluZyBleHBlY3RlZF9zdGRlcnIgPQorICAgICAgIkVSUk9SOiBuZXcvcC9Gb28uYWlkbDoxLjMzLTM3OiBOdW1iZXIgb2YgZmllbGRzIGluIHAuRm9vIGlzIHJlZHVjZWQgZnJvbSAyIHRvIDEuXG4iOworICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJvbGQvcC9Gb28uYWlkbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhY2thZ2UgcDtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyY2VsYWJsZSBGb28ge1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIGludGVyZmFjZSBJQmFyIHtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIHZvaWQgZm9vKCk7IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIH1cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifSIpOworICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJuZXcvcC9Gb28uYWlkbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhY2thZ2UgcDtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyY2VsYWJsZSBGb28ge1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIGludGVyZmFjZSBJQmFyIHtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIHZvaWQgZm9vKGludCBuKTsiICAvLyBpbmNvbXBhdGlibGU6IHNpZ25hdHVyZSBjaGFuZ2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgfVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9Iik7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgRVhQRUNUX0ZBTFNFKDo6YW5kcm9pZDo6YWlkbDo6Y2hlY2tfYXBpKG9wdGlvbnNfLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRlcnIoKSwgSGFzU3Vic3RyKCJSZW1vdmVkIG9yIGNoYW5nZWQgbWV0aG9kOiBwLkZvby5JQmFyLmZvbygpIikpOworfQorCiBURVNUX1AoQWlkbFRlc3QsIFJlamVjdE5vbkZpeGVkU2l6ZUZyb21GaXhlZFNpemUpIHsKICAgY29uc3Qgc3RyaW5nIGV4cGVjdGVkX3N0ZGVyciA9Ci0gICAgICAiRVJST1I6IEZvby5haWRsOjEuMzYtMzg6IFRoZSBARml4ZWRTaXplIHBhcmNlbGFibGUgJ0ZvbycgaGFzIGEgbm9uLWZpeGVkIHNpemUgZmllbGQgbmFtZWQgIgorICAgICAgIkVSUk9SOiBGb28uYWlkbDoyLjgtMTA6IFRoZSBARml4ZWRTaXplIHBhcmNlbGFibGUgJ0ZvbycgaGFzIGEgbm9uLWZpeGVkIHNpemUgZmllbGQgbmFtZWQgIgogICAgICAgImEuXG4iCi0gICAgICAiRVJST1I6IEZvby5haWRsOjEuNDQtNDY6IFRoZSBARml4ZWRTaXplIHBhcmNlbGFibGUgJ0ZvbycgaGFzIGEgbm9uLWZpeGVkIHNpemUgZmllbGQgbmFtZWQgIgotICAgICAgImIuXG4iCi0gICAgICAiRVJST1I6IEZvby5haWRsOjEuNTUtNTc6IFRoZSBARml4ZWRTaXplIHBhcmNlbGFibGUgJ0ZvbycgaGFzIGEgbm9uLWZpeGVkIHNpemUgZmllbGQgbmFtZWQgIgorICAgICAgIkVSUk9SOiBGb28uYWlkbDozLjYtODogVGhlIEBGaXhlZFNpemUgcGFyY2VsYWJsZSAnRm9vJyBoYXMgYSBub24tZml4ZWQgc2l6ZSBmaWVsZCBuYW1lZCBiLlxuIgorICAgICAgIkVSUk9SOiBGb28uYWlkbDo0LjktMTE6IFRoZSBARml4ZWRTaXplIHBhcmNlbGFibGUgJ0ZvbycgaGFzIGEgbm9uLWZpeGVkIHNpemUgZmllbGQgbmFtZWQgIgogICAgICAgImMuXG4iCi0gICAgICAiRVJST1I6IEZvby5haWRsOjEuODAtODI6IFRoZSBARml4ZWRTaXplIHBhcmNlbGFibGUgJ0ZvbycgaGFzIGEgbm9uLWZpeGVkIHNpemUgZmllbGQgbmFtZWQgIgorICAgICAgIkVSUk9SOiBGb28uYWlkbDo1LjIzLTI1OiBUaGUgQEZpeGVkU2l6ZSBwYXJjZWxhYmxlICdGb28nIGhhcyBhIG5vbi1maXhlZCBzaXplIGZpZWxkIG5hbWVkICIKICAgICAgICJkLlxuIgotICAgICAgIkVSUk9SOiBGb28uYWlkbDoxLjkyLTk0OiBUaGUgQEZpeGVkU2l6ZSBwYXJjZWxhYmxlICdGb28nIGhhcyBhIG5vbi1maXhlZCBzaXplIGZpZWxkIG5hbWVkICIKKyAgICAgICJFUlJPUjogRm9vLmFpZGw6Ni4xMC0xMjogVGhlIEBGaXhlZFNpemUgcGFyY2VsYWJsZSAnRm9vJyBoYXMgYSBub24tZml4ZWQgc2l6ZSBmaWVsZCBuYW1lZCAiCiAgICAgICAiZS5cbiIKLSAgICAgICJFUlJPUjogRm9vLmFpZGw6MS4xMDktMTExOiBUaGUgQEZpeGVkU2l6ZSBwYXJjZWxhYmxlICdGb28nIGhhcyBhIG5vbi1maXhlZCBzaXplIGZpZWxkIG5hbWVkICIKLSAgICAgICJmLlxuIjsKKyAgICAgICJFUlJPUjogRm9vLmFpZGw6Ny4xNS0xNzogVGhlIEBGaXhlZFNpemUgcGFyY2VsYWJsZSAnRm9vJyBoYXMgYSBub24tZml4ZWQgc2l6ZSBmaWVsZCBuYW1lZCAiCisgICAgICAiZi5cbiIKKyAgICAgICJFUlJPUjogRm9vLmFpZGw6OS4yMy0zMzogVGhlIEBGaXhlZFNpemUgcGFyY2VsYWJsZSAnRm9vJyBoYXMgYSBub24tZml4ZWQgc2l6ZSBmaWVsZCBuYW1lZCAiCisgICAgICAibnVsbGFibGUxLlxuIgorICAgICAgIkVSUk9SOiBGb28uYWlkbDoxMC4zNC00NDogVGhlIEBGaXhlZFNpemUgcGFyY2VsYWJsZSAnRm9vJyBoYXMgYSBub24tZml4ZWQgc2l6ZSBmaWVsZCBuYW1lZCAiCisgICAgICAibnVsbGFibGUyLlxuIjsKIAogICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJGb28uYWlkbCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkBGaXhlZFNpemUgcGFyY2VsYWJsZSBGb28geyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgaW50W10gYTsiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgQmFyIGI7IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFN0cmluZyBjOyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBQYXJjZWxGaWxlRGVzY3JpcHRvciBkOyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBJQmluZGVyIGU7IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIExpc3Q8U3RyaW5nPiBmOyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBpbnQgaXNGaXhlZFNpemU7IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJARml4ZWRTaXplIHBhcmNlbGFibGUgRm9vIHtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBpbnRbXSBhO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIEJhciBiO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFN0cmluZyBjO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGQ7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgSUJpbmRlciBlO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIExpc3Q8U3RyaW5nPiBmO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIGludCBpc0ZpeGVkU2l6ZTtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBAbnVsbGFibGUgT3RoZXJGaXhlZCBudWxsYWJsZTE7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgQG51bGxhYmxlKGhlYXA9dHJ1ZSkgT3RoZXJGaXhlZCBudWxsYWJsZTI7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgZmxvYXRbMTZdIGZsb2F0cztcbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifSIpOwogICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJCYXIuYWlkbCIsICJwYXJjZWxhYmxlIEJhciB7IGludCBhOyB9Iik7CisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoIk90aGVyRml4ZWQuYWlkbCIsICJARml4ZWRTaXplIHBhcmNlbGFibGUgT3RoZXJGaXhlZCB7IGludCBhOyB9Iik7CiAgIE9wdGlvbnMgb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgRm9vLmFpZGwgLUkgLiAtLWxhbmc9IiArIHRvX3N0cmluZyhHZXRMYW5ndWFnZSgpKSk7CiAKICAgQ2FwdHVyZVN0ZGVycigpOwotICBFWFBFQ1RfTkUoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9GQUxTRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9FUShleHBlY3RlZF9zdGRlcnIsIEdldENhcHR1cmVkU3RkZXJyKCkpOworfQorCitURVNUX1AoQWlkbFRlc3QsIFJlamVjdE5vbkZpeGVkU2l6ZUZyb21GaXhlZFNpemVfVW5pb24pIHsKKyAgY29uc3Qgc3RyaW5nIGV4cGVjdGVkX3N0ZGVyciA9CisgICAgICAiRVJST1I6IEZvby5haWRsOjIuOC0xMDogVGhlIEBGaXhlZFNpemUgcGFyY2VsYWJsZSAnRm9vJyBoYXMgYSBub24tZml4ZWQgc2l6ZSBmaWVsZCBuYW1lZCAiCisgICAgICAiYS5cbiIKKyAgICAgICJFUlJPUjogRm9vLmFpZGw6My42LTg6IFRoZSBARml4ZWRTaXplIHBhcmNlbGFibGUgJ0ZvbycgaGFzIGEgbm9uLWZpeGVkIHNpemUgZmllbGQgbmFtZWQgYi5cbiIKKyAgICAgICJFUlJPUjogRm9vLmFpZGw6NC45LTExOiBUaGUgQEZpeGVkU2l6ZSBwYXJjZWxhYmxlICdGb28nIGhhcyBhIG5vbi1maXhlZCBzaXplIGZpZWxkIG5hbWVkICIKKyAgICAgICJjLlxuIgorICAgICAgIkVSUk9SOiBGb28uYWlkbDo1LjIzLTI1OiBUaGUgQEZpeGVkU2l6ZSBwYXJjZWxhYmxlICdGb28nIGhhcyBhIG5vbi1maXhlZCBzaXplIGZpZWxkIG5hbWVkICIKKyAgICAgICJkLlxuIgorICAgICAgIkVSUk9SOiBGb28uYWlkbDo2LjEwLTEyOiBUaGUgQEZpeGVkU2l6ZSBwYXJjZWxhYmxlICdGb28nIGhhcyBhIG5vbi1maXhlZCBzaXplIGZpZWxkIG5hbWVkICIKKyAgICAgICJlLlxuIgorICAgICAgIkVSUk9SOiBGb28uYWlkbDo3LjE1LTE3OiBUaGUgQEZpeGVkU2l6ZSBwYXJjZWxhYmxlICdGb28nIGhhcyBhIG5vbi1maXhlZCBzaXplIGZpZWxkIG5hbWVkICIKKyAgICAgICJmLlxuIgorICAgICAgIkVSUk9SOiBGb28uYWlkbDo5LjIzLTMzOiBUaGUgQEZpeGVkU2l6ZSBwYXJjZWxhYmxlICdGb28nIGhhcyBhIG5vbi1maXhlZCBzaXplIGZpZWxkIG5hbWVkICIKKyAgICAgICJudWxsYWJsZTEuXG4iCisgICAgICAiRVJST1I6IEZvby5haWRsOjEwLjM0LTQ0OiBUaGUgQEZpeGVkU2l6ZSBwYXJjZWxhYmxlICdGb28nIGhhcyBhIG5vbi1maXhlZCBzaXplIGZpZWxkIG5hbWVkICIKKyAgICAgICJudWxsYWJsZTIuXG4iOworCisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoIkZvby5haWRsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQEZpeGVkU2l6ZSB1bmlvbiBGb28ge1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIGludFtdIGEgPSB7fTtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBCYXIgYjtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBTdHJpbmcgYztcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBQYXJjZWxGaWxlRGVzY3JpcHRvciBkO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIElCaW5kZXIgZTtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBMaXN0PFN0cmluZz4gZjtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBpbnQgaXNGaXhlZFNpemU7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgQG51bGxhYmxlIE90aGVyRml4ZWQgbnVsbGFibGUxO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIEBudWxsYWJsZShoZWFwPXRydWUpIE90aGVyRml4ZWQgbnVsbGFibGUyO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIGZsb2F0WzE2XSBmbG9hdHM7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn0iKTsKKyAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygiQmFyLmFpZGwiLCAicGFyY2VsYWJsZSBCYXIgeyBpbnQgYTsgfSIpOworICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJPdGhlckZpeGVkLmFpZGwiLCAiQEZpeGVkU2l6ZSBwYXJjZWxhYmxlIE90aGVyRml4ZWQgeyBpbnQgYTsgfSIpOworICBPcHRpb25zIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIEZvby5haWRsIC1JIC4gLS1sYW5nPSIgKyB0b19zdHJpbmcoR2V0TGFuZ3VhZ2UoKSkpOworCisgIENhcHR1cmVTdGRlcnIoKTsKKyAgRVhQRUNUX0ZBTFNFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKICAgRVhQRUNUX0VRKGV4cGVjdGVkX3N0ZGVyciwgR2V0Q2FwdHVyZWRTdGRlcnIoKSk7CiB9CiAKQEAgLTI4MDMsNyArMzcxMiw3IEBACiAgIE9wdGlvbnMgb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgRm9vLmFpZGwgLUkgLiAtLWxhbmc9IiArIHRvX3N0cmluZyhHZXRMYW5ndWFnZSgpKSk7CiAKICAgQ2FwdHVyZVN0ZGVycigpOwotICBFWFBFQ1RfRVEoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9UUlVFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKICAgRVhQRUNUX0VRKGV4cGVjdGVkX3N0ZGVyciwgR2V0Q2FwdHVyZWRTdGRlcnIoKSk7CiB9CiAKQEAgLTI4MTksNyArMzcyOCw3IEBACiAgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoImRpcjIvcS9JQmFyLmFpZGwiLCAicGFja2FnZSBxOyBpbnRlcmZhY2UgSUJhcnt9Iik7CiAKICAgQ2FwdHVyZVN0ZGVycigpOwotICBFWFBFQ1RfTkUoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9GQUxTRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAgIEVYUEVDVF9FUShleHBlY3RlZF9zdGRlcnIsIEdldENhcHR1cmVkU3RkZXJyKCkpOwogfQogCkBAIC0yODQ2LDcgKzM3NTUsNyBAQAogICAvLyB1c2Ugd2l0aG91dCBpbXBvcnQKICAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygicC9JRm9vLmFpZGwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYWNrYWdlIHA7IGludGVyZmFjZSBJRm9veyB2b2lkIGZvbyhpbiBQYXJjZWxGaWxlRGVzY3JpcHRvciBmZCk7fSIpOwotICBFWFBFQ1RfRVEoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9UUlVFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKIAogICAvLyBjYXB0dXJlIG91dHB1dCBmaWxlcwogICBtYXA8c3RyaW5nLCBzdHJpbmc+IG91dHB1dHMgPSBpb19kZWxlZ2F0ZV8uT3V0cHV0RmlsZXMoKTsKQEAgLTI4NTUsNyArMzc2NCw3IEBACiAgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoCiAgICAgICAicC9JRm9vLmFpZGwiLAogICAgICAgInBhY2thZ2UgcDsgaW50ZXJmYWNlIElGb297IHZvaWQgZm9vKGluIGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3IgZmQpO30iKTsKLSAgRVhQRUNUX0VRKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfVFJVRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAgIC8vIG91dHB1dCBmaWxlcyBzaG91bGQgYmUgdGhlIHNhbWUKICAgRVhQRUNUX0VRKG91dHB1dHMsIGlvX2RlbGVnYXRlXy5PdXRwdXRGaWxlcygpKTsKIApAQCAtMjg2Niw3ICszNzc1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZXJmYWNlIElGb297IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIHZvaWQgZm9vKGluIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkKTsiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn0iKTsKLSAgRVhQRUNUX0VRKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfVFJVRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAgIC8vIG91dHB1dCBmaWxlcyBzaG91bGQgYmUgdGhlIHNhbWUKICAgRVhQRUNUX0VRKG91dHB1dHMsIGlvX2RlbGVnYXRlXy5PdXRwdXRGaWxlcygpKTsKIH0KQEAgLTI4NzksNyArMzc4OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVyZmFjZSBJRm9veyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICB2b2lkIGZvbyhvdXQgUGFyY2VsRmlsZURlc2NyaXB0b3IgZmQpOyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifSIpOwotICBFWFBFQ1RfRVEoMSwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9GQUxTRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAgIEVYUEVDVF9USEFUKEdldENhcHR1cmVkU3RkZXJyKCksIEhhc1N1YnN0cigiY2FuJ3QgYmUgYW4gb3V0IHBhcmFtZXRlciIpKTsKIH0KIApAQCAtMjg5MSw3ICszODAwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZXJmYWNlIElGb297IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIHZvaWQgZm9vKFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkKTsiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn0iKTsKLSAgRVhQRUNUX0VRKDEsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfRkFMU0UoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogICBFWFBFQ1RfVEhBVChHZXRDYXB0dXJlZFN0ZGVycigpLAogICAgICAgICAgICAgICBIYXNTdWJzdHIoIlBhcmNlbEZpbGVEZXNjcmlwdG9yIGNhbiBiZSBhbiBpbiBvciBpbm91dCBwYXJhbWV0ZXIuIikpOwogfQpAQCAtMjkwMyw3ICszODEyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICB2b2lkIGZvbygpID0gMDtcbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICB2b2lkIGJhcigpID0gMTtcbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifSIpOwotICBFWFBFQ1RfRVEoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9UUlVFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKIH0KIAogVEVTVF9GKEFpZGxUZXN0LCBNYW51YWxJZHNXaXRoTWV0YVRyYW5zYWN0aW9ucykgewpAQCAtMjkxMyw3ICszODIyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICB2b2lkIGZvbygpID0gMDtcbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICB2b2lkIGJhcigpID0gMTtcbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifSIpOwotICBFWFBFQ1RfRVEoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9UUlVFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKIH0KIAogVEVTVF9GKEFpZGxUZXN0LCBGYWlsT25EdXBsaWNhdGVkSWRzKSB7CkBAIC0yOTI2LDcgKzM4MzUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIHZvaWQgYmFyKCkgPSAzO1xuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9Iik7CiAgIENhcHR1cmVTdGRlcnIoKTsKLSAgRVhQRUNUX05FKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfRkFMU0UoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogICBFWFBFQ1RfRVEoZXhwZWN0ZWRfc3RkZXJyLCBHZXRDYXB0dXJlZFN0ZGVycigpKTsKIH0KIApAQCAtMjk0Miw3ICszODUxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICB2b2lkIGJhcigpID0gMTY3NzcxMTU7XG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn0iKTsKICAgQ2FwdHVyZVN0ZGVycigpOwotICBFWFBFQ1RfTkUoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9GQUxTRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAgIEVYUEVDVF9FUShleHBlY3RlZF9zdGRlcnIsIEdldENhcHR1cmVkU3RkZXJyKCkpOwogfQogCkBAIC0yOTU2LDE1ICszODY1LDM4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgdm9pZCBiYXIoKTtcbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifSIpOwogICBDYXB0dXJlU3RkZXJyKCk7Ci0gIEVYUEVDVF9ORSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX0ZBTFNFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKICAgRVhQRUNUX0VRKGV4cGVjdGVkX3N0ZGVyciwgR2V0Q2FwdHVyZWRTdGRlcnIoKSk7CiB9CiAKK1RFU1RfRihBaWRsVGVzdCwgQXNzaWduZWRJZHMpIHsKKyAgQ2FwdHVyZVN0ZGVycigpOworICBFWFBFQ1RfTkUobnVsbHB0ciwgUGFyc2UoIklGb28uYWlkbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZXJmYWNlIElGb28ge1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgdm9pZCBmb28oKTtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIHZvaWQgYmFyKCk7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBpbnRlcmZhY2UgSU5lc3RlZCB7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIHZvaWQgZm9vKCk7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIHZvaWQgYmFyKCk7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICB9XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAifSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZXNfLCBPcHRpb25zOjpMYW5ndWFnZTo6SkFWQSkpOworICBFWFBFQ1RfRVEoIiIsIEdldENhcHR1cmVkU3RkZXJyKCkpOworICBhdXRvIGZvbyA9IHR5cGVuYW1lc18uUmVzb2x2ZVR5cGVuYW1lKCJJRm9vIikuZGVmaW5lZF90eXBlOworICBBU1NFUlRfRVEoMnUsIGZvby0+R2V0TWV0aG9kcygpLnNpemUoKSk7CisgIEVYUEVDVF9FUSgwLCBmb28tPkdldE1ldGhvZHMoKVswXS0+R2V0SWQoKSk7CisgIEVYUEVDVF9FUSgxLCBmb28tPkdldE1ldGhvZHMoKVsxXS0+R2V0SWQoKSk7CisgIGF1dG8gbmVzdGVkID0gdHlwZW5hbWVzXy5SZXNvbHZlVHlwZW5hbWUoIklGb28uSU5lc3RlZCIpLmRlZmluZWRfdHlwZTsKKyAgQVNTRVJUX0VRKDJ1LCBuZXN0ZWQtPkdldE1ldGhvZHMoKS5zaXplKCkpOworICBFWFBFQ1RfRVEoMCwgbmVzdGVkLT5HZXRNZXRob2RzKClbMF0tPkdldElkKCkpOworICBFWFBFQ1RfRVEoMSwgbmVzdGVkLT5HZXRNZXRob2RzKClbMV0tPkdldElkKCkpOworfQorCiBURVNUX0YoQWlkbFRlc3QsIEFsbG93RHVwbGljYXRlZEltcG9ydFBhdGhzKSB7CiAgIE9wdGlvbnMgb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgLS1sYW5nPWphdmEgLUkgZGlyIC1JIGRpciBJRm9vLmFpZGwiKTsKICAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygiZGlyL0lCYXIuYWlkbCIsICJpbnRlcmZhY2UgSUJhcnt9Iik7CiAgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoIklGb28uYWlkbCIsICJpbXBvcnQgSUJhcjsgaW50ZXJmYWNlIElGb297fSIpOwotICBFWFBFQ1RfRVEoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9UUlVFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKIH0KIAogVEVTVF9GKEFpZGxUZXN0LCBGYWlsT25BbWJpZ3VvdXNJbXBvcnRzKSB7CkBAIC0yOTc5LDcgKzM5MTEsNyBAQAogICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJkaXIyL0lCYXIuYWlkbCIsICJpbnRlcmZhY2UgSUJhcnt9Iik7CiAgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoIklGb28uYWlkbCIsICJpbXBvcnQgSUJhcjsgaW50ZXJmYWNlIElGb297fSIpOwogICBDYXB0dXJlU3RkZXJyKCk7Ci0gIEVYUEVDVF9ORSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX0ZBTFNFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKICAgRVhQRUNUX0VRKGV4cGVjdGVkX3N0ZGVyciwgR2V0Q2FwdHVyZWRTdGRlcnIoKSk7CiB9CiAKQEAgLTI5OTMsNyArMzkyNSw3IEBACiAgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoImEvYi9JUXV4LmFpZGwiLCAicGFja2FnZSBhLmI7IGludGVyZmFjZSBJUXV4IHsgdm9pZCBmb28oKTsgfSIpOwogCiAgIE9wdGlvbnMgb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgLS1sYW5nPW5kayBhL2IvSUZvby5haWRsIC1JIC4gLW8gb3V0IC1oIG91dC9pbmNsdWRlIik7Ci0gIEVYUEVDVF9FUSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX1RSVUUoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogCiAgIHN0cmluZyBvdXRwdXQ7CiAgIEVYUEVDVF9UUlVFKGlvX2RlbGVnYXRlXy5HZXRXcml0dGVuQ29udGVudHMoIm91dC9pbmNsdWRlL2FpZGwvYS9iL0lGb28uaCIsICZvdXRwdXQpKTsKQEAgLTMwMjMsNyArMzk1NSw3IEBACiAgICAgfSktLSIpOwogCiAgIE9wdGlvbnMgamF2YV9vcHRpb25zID0gT3B0aW9uczo6RnJvbSgiYWlkbCAtSSAuIC0tbGFuZz1qYXZhIC1vIG91dCBhL0lGb28uYWlkbCBhL015RW51bS5haWRsIik7Ci0gIEVYUEVDVF9FUSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChqYXZhX29wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfVFJVRShjb21waWxlX2FpZGwoamF2YV9vcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKIAogICBzdHJpbmcgamF2YV9vdXQ7CiAgIEVYUEVDVF9UUlVFKGlvX2RlbGVnYXRlXy5HZXRXcml0dGVuQ29udGVudHMoIm91dC9hL0lGb28uamF2YSIsICZqYXZhX291dCkpOwpAQCAtMzA0NCwxNCArMzk3NiwxNCBAQAogICAvLyBPdGhlciBiYWNrZW5kcyBzaG91bGRuJ3QgYmUgYm90aGVyZWQKICAgT3B0aW9ucyBjcHBfb3B0aW9ucyA9CiAgICAgICBPcHRpb25zOjpGcm9tKCJhaWRsIC1JIC4gLS1sYW5nPWNwcCAtbyBvdXQgLWggb3V0IGEvSUZvby5haWRsIGEvTXlFbnVtLmFpZGwiKTsKLSAgRVhQRUNUX0VRKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKGNwcF9vcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX1RSVUUoY29tcGlsZV9haWRsKGNwcF9vcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKIAogICBPcHRpb25zIG5ka19vcHRpb25zID0KICAgICAgIE9wdGlvbnM6OkZyb20oImFpZGwgLUkgLiAtLWxhbmc9bmRrIC1vIG91dCAtaCBvdXQgYS9JRm9vLmFpZGwgYS9NeUVudW0uYWlkbCIpOwotICBFWFBFQ1RfRVEoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwobmRrX29wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfVFJVRShjb21waWxlX2FpZGwobmRrX29wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogCiAgIE9wdGlvbnMgcnVzdF9vcHRpb25zID0gT3B0aW9uczo6RnJvbSgiYWlkbCAtSSAuIC0tbGFuZz1ydXN0IC1vIG91dCBhL0lGb28uYWlkbCBhL015RW51bS5haWRsIik7Ci0gIEVYUEVDVF9FUSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChydXN0X29wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfVFJVRShjb21waWxlX2FpZGwocnVzdF9vcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKIH0KIAogVEVTVF9GKEFpZGxUZXN0LCBQYXJzZVJ1c3REZXJpdmUpIHsKQEAgLTMwNjIsNyArMzk5NCw3IEBACiAgICAgfSkiKTsKIAogICBPcHRpb25zIHJ1c3Rfb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgLS1sYW5nPXJ1c3QgLW8gb3V0IGEvRm9vLmFpZGwiKTsKLSAgRVhQRUNUX0VRKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKHJ1c3Rfb3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9UUlVFKGNvbXBpbGVfYWlkbChydXN0X29wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogCiAgIHN0cmluZyBydXN0X291dDsKICAgRVhQRUNUX1RSVUUoaW9fZGVsZWdhdGVfLkdldFdyaXR0ZW5Db250ZW50cygib3V0L2EvRm9vLnJzIiwgJnJ1c3Rfb3V0KSk7CkBAIC0zMDcwLDEzICs0MDAyLDEzMiBAQAogCiAgIC8vIE90aGVyIGJhY2tlbmRzIHNob3VsZG4ndCBiZSBib3RoZXJlZAogICBPcHRpb25zIGNwcF9vcHRpb25zID0gT3B0aW9uczo6RnJvbSgiYWlkbCAtLWxhbmc9Y3BwIC1vIG91dCAtaCBvdXQgYS9Gb28uYWlkbCIpOwotICBFWFBFQ1RfRVEoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwoY3BwX29wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfVFJVRShjb21waWxlX2FpZGwoY3BwX29wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogCiAgIE9wdGlvbnMgbmRrX29wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIC0tbGFuZz1uZGsgLW8gb3V0IC1oIG91dCBhL0Zvby5haWRsIik7Ci0gIEVYUEVDVF9FUSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChuZGtfb3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9UUlVFKGNvbXBpbGVfYWlkbChuZGtfb3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAKICAgT3B0aW9ucyBqYXZhX29wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIC0tbGFuZz1qYXZhIC1vIG91dCBhL0Zvby5haWRsIik7Ci0gIEVYUEVDVF9FUSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChqYXZhX29wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfVFJVRShjb21waWxlX2FpZGwoamF2YV9vcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKK30KKworVEVTVF9GKEFpZGxUZXN0LCBFbXB0eUVuZm9yY2VBbm5vdGF0aW9uKSB7CisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoImEvSUZvby5haWRsIiwgUiIocGFja2FnZSBhOworICAgIGludGVyZmFjZSBJRm9vIHsKKyAgICAgICAgQEVuZm9yY2VQZXJtaXNzaW9uKCkKKyAgICAgICAgdm9pZCBQcm90ZWN0ZWQoKTsKKyAgICB9KSIpOworCisgIE9wdGlvbnMgb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgLS1sYW5nPWphdmEgLW8gb3V0IGEvSUZvby5haWRsIik7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgRVhQRUNUX0ZBTFNFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRlcnIoKSwgSGFzU3Vic3RyKCJVbmFibGUgdG8gcGFyc2UgQEVuZm9yY2VQZXJtaXNzaW9uIGFubm90YXRpb24iKSk7Cit9CisKK1RFU1RfRihBaWRsVGVzdCwgSW50ZXJmYWNlRW5mb3JjZUNvbmRpdGlvbikgeworICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJhL0lGb28uYWlkbCIsIFIiKHBhY2thZ2UgYTsKKyAgICBARW5mb3JjZVBlcm1pc3Npb24oIklOVEVSTkVUIikKKyAgICBpbnRlcmZhY2UgSUZvbyB7CisgICAgICAgIHZvaWQgUHJvdGVjdGVkKCk7CisgICAgfSkiKTsKKworICBPcHRpb25zIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIC0tbGFuZz1qYXZhIC1vIG91dCBhL0lGb28uYWlkbCIpOworICBFWFBFQ1RfVFJVRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7Cit9CisKK1RFU1RfRihBaWRsVGVzdCwgRW5mb3JjZUNvbmRpdGlvbkFueSkgeworICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJhL0lGb28uYWlkbCIsIFIiKHBhY2thZ2UgYTsKKyAgICBpbnRlcmZhY2UgSUZvbyB7CisgICAgICAgIEBFbmZvcmNlUGVybWlzc2lvbihhbnlPZj17IklOVEVSTkVUIiwgIlJFQURfUEhPTkVfU1RBVEUifSkKKyAgICAgICAgdm9pZCBQcm90ZWN0ZWQoKTsKKyAgICB9KSIpOworCisgIE9wdGlvbnMgb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgLS1sYW5nPWphdmEgLW8gb3V0IGEvSUZvby5haWRsIik7CisgIEVYUEVDVF9UUlVFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKK30KKworVEVTVF9GKEFpZGxUZXN0LCBFbmZvcmNlQ29uZGl0aW9uQWxsKSB7CisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoImEvSUZvby5haWRsIiwgUiIocGFja2FnZSBhOworICAgIGludGVyZmFjZSBJRm9vIHsKKyAgICAgICAgQEVuZm9yY2VQZXJtaXNzaW9uKGFsbE9mPXsiSU5URVJORVQiLCAiUkVBRF9QSE9ORV9TVEFURSJ9KQorICAgICAgICB2b2lkIFByb3RlY3RlZCgpOworICAgIH0pIik7CisKKyAgT3B0aW9ucyBvcHRpb25zID0gT3B0aW9uczo6RnJvbSgiYWlkbCAtLWxhbmc9amF2YSAtbyBvdXQgYS9JRm9vLmFpZGwiKTsKKyAgRVhQRUNUX1RSVUUoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworfQorCitURVNUX0YoQWlkbFRlc3QsIEludGVyZmFjZUFuZE1ldGhvZEVuZm9yY2VDb25kaXRpb24pIHsKKyAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygiYS9JRm9vLmFpZGwiLCBSIihwYWNrYWdlIGE7CisgICAgQEVuZm9yY2VQZXJtaXNzaW9uKCJJTlRFUk5FVCIpCisgICAgaW50ZXJmYWNlIElGb28geworICAgICAgICBARW5mb3JjZVBlcm1pc3Npb24oIlNZU1RFTV9VSUQiKQorICAgICAgICB2b2lkIFByb3RlY3RlZCgpOworICAgIH0pIik7CisKKyAgT3B0aW9ucyBvcHRpb25zID0gT3B0aW9uczo6RnJvbSgiYWlkbCAtLWxhbmc9amF2YSAtbyBvdXQgYS9JRm9vLmFpZGwiKTsKKyAgRVhQRUNUX1RSVUUoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworfQorCitURVNUX0YoQWlkbFRlc3QsIE5vUGVybWlzc2lvbkludGVyZmFjZUVuZm9yY2VNZXRob2QpIHsKKyAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygiYS9JRm9vLmFpZGwiLCBSIihwYWNrYWdlIGE7CisgICAgQFJlcXVpcmVzTm9QZXJtaXNzaW9uCisgICAgaW50ZXJmYWNlIElGb28geworICAgICAgICBARW5mb3JjZVBlcm1pc3Npb24oIklOVEVSTkVUIikKKyAgICAgICAgdm9pZCBQcm90ZWN0ZWQoKTsKKyAgICB9KSIpOworCisgIE9wdGlvbnMgb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgLS1sYW5nPWphdmEgLW8gb3V0IGEvSUZvby5haWRsIik7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgRVhQRUNUX0ZBTFNFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRlcnIoKSwKKyAgICAgICAgICAgICAgSGFzU3Vic3RyKCJUaGUgaW50ZXJmYWNlIElGb28gaXMgYW5ub3RhdGVkIGFzIHJlcXVpcmluZyBubyBwZXJtaXNzaW9uIikpOworfQorCitURVNUX0YoQWlkbFRlc3QsIE1hbnVhbFBlcm1pc3Npb25JbnRlcmZhY2VFbmZvcmNlTWV0aG9kKSB7CisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoImEvSUZvby5haWRsIiwgUiIocGFja2FnZSBhOworICAgIEBQZXJtaXNzaW9uTWFudWFsbHlFbmZvcmNlZAorICAgIGludGVyZmFjZSBJRm9vIHsKKyAgICAgICAgQEVuZm9yY2VQZXJtaXNzaW9uKCJJTlRFUk5FVCIpCisgICAgICAgIHZvaWQgUHJvdGVjdGVkKCk7CisgICAgfSkiKTsKKworICBPcHRpb25zIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIC0tbGFuZz1qYXZhIC1vIG91dCBhL0lGb28uYWlkbCIpOworICBDYXB0dXJlU3RkZXJyKCk7CisgIEVYUEVDVF9GQUxTRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9USEFUKAorICAgICAgR2V0Q2FwdHVyZWRTdGRlcnIoKSwKKyAgICAgIEhhc1N1YnN0cigiVGhlIGludGVyZmFjZSBJRm9vIGlzIGFubm90YXRlZCBhcyBtYW51YWxseSBpbXBsZW1lbnRpbmcgcGVybWlzc2lvbiBjaGVja3MiKSk7Cit9CisKK1RFU1RfRihBaWRsVGVzdCwgRW5mb3JjZUludGVyZmFjZU5vUGVybWlzc2lvbnNNZXRob2QpIHsKKyAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygiYS9JRm9vLmFpZGwiLCBSIihwYWNrYWdlIGE7CisgICAgQEVuZm9yY2VQZXJtaXNzaW9uKCJJTlRFUk5FVCIpCisgICAgaW50ZXJmYWNlIElGb28geworICAgICAgICBAUmVxdWlyZXNOb1Blcm1pc3Npb24KKyAgICAgICAgdm9pZCBQcm90ZWN0ZWQoKTsKKyAgICB9KSIpOworCisgIE9wdGlvbnMgb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgLS1sYW5nPWphdmEgLW8gb3V0IGEvSUZvby5haWRsIik7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgRVhQRUNUX0ZBTFNFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRlcnIoKSwKKyAgICAgICAgICAgICAgSGFzU3Vic3RyKCJUaGUgaW50ZXJmYWNlIElGb28gZW5mb3JjZXMgcGVybWlzc2lvbnMgdXNpbmcgYW5ub3RhdGlvbnMiKSk7Cit9CisKK1RFU1RfRihBaWRsVGVzdCwgRW5mb3JjZUludGVyZmFjZU1hbnVhbFBlcm1pc3Npb25NZXRob2QpIHsKKyAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygiYS9JRm9vLmFpZGwiLCBSIihwYWNrYWdlIGE7CisgICAgQEVuZm9yY2VQZXJtaXNzaW9uKCJJTlRFUk5FVCIpCisgICAgaW50ZXJmYWNlIElGb28geworICAgICAgICBAUGVybWlzc2lvbk1hbnVhbGx5RW5mb3JjZWQKKyAgICAgICAgdm9pZCBQcm90ZWN0ZWQoKTsKKyAgICB9KSIpOworCisgIE9wdGlvbnMgb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgLS1sYW5nPWphdmEgLW8gb3V0IGEvSUZvby5haWRsIik7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgRVhQRUNUX0ZBTFNFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRlcnIoKSwKKyAgICAgICAgICAgICAgSGFzU3Vic3RyKCJUaGUgaW50ZXJmYWNlIElGb28gZW5mb3JjZXMgcGVybWlzc2lvbnMgdXNpbmcgYW5ub3RhdGlvbnMiKSk7CiB9CiAKIFRFU1RfRihBaWRsVGVzdCwgSmF2YVN1cHByZXNzTGludCkgewpAQCAtMzEwMiw3ICs0MTUzLDcgQEAKICAgfQogCiAgIHZvaWQgVGVzdChjb25zdCBPcHRpb25zJiBvcHRpb25zLCBjb25zdCBzdGQ6OnN0cmluZyBleHBlY3RlZF9vdXRwdXRfcGF0aCkgewotICAgIEVYUEVDVF9FUSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgICBFWFBFQ1RfVFJVRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAgICAgLy8gY2hlY2sgdGhlIGV4aXN0ZW5jZQogICAgIEVYUEVDVF9UUlVFKGlvX2RlbGVnYXRlXy5HZXRXcml0dGVuQ29udGVudHMoZXhwZWN0ZWRfb3V0cHV0X3BhdGgsIG51bGxwdHIpKTsKICAgfQpAQCAtMzEzMSw3ICs0MTgyLDcgQEAKIFRFU1RfUChBaWRsVGVzdCwgRmFpbE9uT3V0T2ZCb3VuZHNJbnQzMk1heENvbnN0SW50KSB7CiAgIEFpZGxFcnJvciBlcnJvcjsKICAgY29uc3Qgc3RyaW5nIGV4cGVjdGVkX3N0ZGVyciA9Ci0gICAgICAiRVJST1I6IHAvSUZvby5haWRsOjMuNTgtNjk6IEludmFsaWQgdHlwZSBzcGVjaWZpZXIgZm9yIGFuIGludDY0IGxpdGVyYWw6IGludFxuIjsKKyAgICAgICJFUlJPUjogcC9JRm9vLmFpZGw6My41OC02OTogSW52YWxpZCB0eXBlIHNwZWNpZmllciBmb3IgYW4gaW50NjQgbGl0ZXJhbDogaW50ICgyMTQ3NDgzNjUwKVxuIjsKICAgQ2FwdHVyZVN0ZGVycigpOwogICBFWFBFQ1RfRVEobnVsbHB0ciwgUGFyc2UoInAvSUZvby5haWRsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIiKHBhY2thZ2UgcDsKQEAgLTMxNDcsNyArNDE5OCw4IEBACiBURVNUX1AoQWlkbFRlc3QsIEZhaWxPbk91dE9mQm91bmRzSW50MzJNaW5Db25zdEludCkgewogICBBaWRsRXJyb3IgZXJyb3I7CiAgIGNvbnN0IHN0cmluZyBleHBlY3RlZF9zdGRlcnIgPQotICAgICAgIkVSUk9SOiBwL0lGb28uYWlkbDozLjU4LTYwOiBJbnZhbGlkIHR5cGUgc3BlY2lmaWVyIGZvciBhbiBpbnQ2NCBsaXRlcmFsOiBpbnRcbiI7CisgICAgICAiRVJST1I6IHAvSUZvby5haWRsOjMuNTgtNjA6IEludmFsaWQgdHlwZSBzcGVjaWZpZXIgZm9yIGFuIGludDY0IGxpdGVyYWw6IGludCAiCisgICAgICAiKC0yMTQ3NDgzNjUwKVxuIjsKICAgQ2FwdHVyZVN0ZGVycigpOwogICBFWFBFQ1RfRVEobnVsbHB0ciwgUGFyc2UoInAvSUZvby5haWRsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIiKHBhY2thZ2UgcDsKQEAgLTMxOTUsNyArNDI0Nyw3IEBACiBURVNUX1AoQWlkbFRlc3QsIEZhaWxPbk91dE9mQm91bmRzQXV0b2ZpbGxlZEVudW0pIHsKICAgQWlkbEVycm9yIGVycm9yOwogICBjb25zdCBzdHJpbmcgZXhwZWN0ZWRfc3RkZXJyID0KLSAgICAgICJFUlJPUjogcC9UZXN0RW51bS5haWRsOjUuMS0zNjogSW52YWxpZCB0eXBlIHNwZWNpZmllciBmb3IgYW4gaW50MzIgbGl0ZXJhbDogYnl0ZVxuIgorICAgICAgIkVSUk9SOiBwL1Rlc3RFbnVtLmFpZGw6NS4xLTM2OiBJbnZhbGlkIHR5cGUgc3BlY2lmaWVyIGZvciBhbiBpbnQzMiBsaXRlcmFsOiBieXRlIChGT08rMSlcbiIKICAgICAgICJFUlJPUjogcC9UZXN0RW51bS5haWRsOjUuMS0zNjogRW51bWVyYXRvciB0eXBlIGRpZmZlcnMgZnJvbSBlbnVtIGJhY2tpbmcgdHlwZS5cbiI7CiAgIENhcHR1cmVTdGRlcnIoKTsKICAgRVhQRUNUX0VRKG51bGxwdHIsIFBhcnNlKCJwL1Rlc3RFbnVtLmFpZGwiLApAQCAtMzIxMSw2ICs0MjYzLDI1IEBACiAgIEVYUEVDVF9FUShBaWRsRXJyb3I6OkJBRF9UWVBFLCBlcnJvcik7CiB9CiAKK1RFU1RfUChBaWRsVGVzdCwgRmFpbE9uVW5zdXBwb3J0ZWRCYWNraW5nVHlwZSkgeworICBBaWRsRXJyb3IgZXJyb3I7CisgIGNvbnN0IHN0cmluZyBleHBlY3RlZF9zdGRlcnIgPQorICAgICAgIkVSUk9SOiBwL1Rlc3RFbnVtLmFpZGw6My4zNS00NDogSW52YWxpZCBiYWNraW5nIHR5cGU6IGJvb2xlYW4uIEJhY2tpbmcgdHlwZSBtdXN0IGJlIG9uZSBvZjogIgorICAgICAgImJ5dGUsIGludCwgbG9uZ1xuIjsKKyAgQ2FwdHVyZVN0ZGVycigpOworICBFWFBFQ1RfRVEobnVsbHB0ciwgUGFyc2UoInAvVGVzdEVudW0uYWlkbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBSIihwYWNrYWdlIHA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAQmFja2luZyh0eXBlPSJib29sZWFuIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gVGVzdEVudW0geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT08gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQVIgPSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lc18sIEdldExhbmd1YWdlKCksICZlcnJvcikpOworICBFWFBFQ1RfRVEoZXhwZWN0ZWRfc3RkZXJyLCBHZXRDYXB0dXJlZFN0ZGVycigpKTsKKyAgRVhQRUNUX0VRKEFpZGxFcnJvcjo6QkFEX1RZUEUsIGVycm9yKTsKK30KKwogVEVTVF9QKEFpZGxUZXN0LCBVbnN1cHBvcnRlZEJhY2tpbmdBbm5vdGF0aW9uUGFyYW0pIHsKICAgQWlkbEVycm9yIGVycm9yOwogICBjb25zdCBzdHJpbmcgZXhwZWN0ZWRfc3RkZXJyID0KQEAgLTMyNDUsNyArNDMxNiw3IEBACiAgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoIkJhei5haWRsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQEphdmFPbmx5SW1tdXRhYmxlIEBKYXZhT25seVN0YWJsZVBhcmNlbGFibGUgcGFyY2VsYWJsZSBCYXo7Iik7CiAgIE9wdGlvbnMgb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgLS1sYW5nPWphdmEgLUkgLiBGb28uYWlkbCIpOwotICBFWFBFQ1RfRVEoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9UUlVFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKIH0KIAogVEVTVF9GKEFpZGxUZXN0LCBSZWplY3RNdXRhYmxlUGFyY2VsYWJsZUZyb21KYXZhT25seUltbXV0YWJsZVBhcmNlbGFibGUpIHsKQEAgLTMyNTYsNyArNDMyNyw3IEBACiAgICAgICAibmFtZWQgJ2JhcicuXG4iOwogICBDYXB0dXJlU3RkZXJyKCk7CiAgIE9wdGlvbnMgb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgLS1sYW5nPWphdmEgRm9vLmFpZGwgLUkgLiIpOwotICBFWFBFQ1RfTkUoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9GQUxTRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAgIEVYUEVDVF9FUShleHBlY3RlZF9lcnJvciwgR2V0Q2FwdHVyZWRTdGRlcnIoKSk7CiB9CiAKQEAgLTMyNjUsNyArNDMzNiw3IEBACiAgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoIkJhci5haWRsIiwgImVudW0gQmFyIHsgRk9PIH0iKTsKICAgQ2FwdHVyZVN0ZGVycigpOwogICBPcHRpb25zIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIC0tbGFuZz1qYXZhIEZvby5haWRsIC1JIC4iKTsKLSAgRVhQRUNUX0VRKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfVFJVRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAgIEVYUEVDVF9FUSgiIiwgR2V0Q2FwdHVyZWRTdGRlcnIoKSk7CiB9CiAKQEAgLTMyNzcsNyArNDM0OCw3IEBACiAgICAgICAibmFtZWQgJ2JhcicuXG4iOwogICBDYXB0dXJlU3RkZXJyKCk7CiAgIE9wdGlvbnMgb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgLS1sYW5nPWphdmEgRm9vLmFpZGwgLUkgLiIpOwotICBFWFBFQ1RfTkUoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9GQUxTRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAgIEVYUEVDVF9FUShleHBlY3RlZF9lcnJvciwgR2V0Q2FwdHVyZWRTdGRlcnIoKSk7CiB9CiAKQEAgLTMyODksNyArNDM2MCw3IEBACiAgICAgICAib25seSBiZSBhbiBpbiBwYXJhbWV0ZXIuXG4iOwogICBDYXB0dXJlU3RkZXJyKCk7CiAgIE9wdGlvbnMgb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgLS1sYW5nPWphdmEgSUJhci5haWRsIC1JIC4iKTsKLSAgRVhQRUNUX05FKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfRkFMU0UoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogICBFWFBFQ1RfRVEoZXhwZWN0ZWRfZXJyb3IsIEdldENhcHR1cmVkU3RkZXJyKCkpOwogfQogCkBAIC0zMzAxLDcgKzQzNzIsNyBAQAogICAgICAgIm9ubHkgYmUgYW4gaW4gcGFyYW1ldGVyLlxuIjsKICAgQ2FwdHVyZVN0ZGVycigpOwogICBPcHRpb25zIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIC0tbGFuZz1qYXZhIElCYXIuYWlkbCAtSSAuIik7Ci0gIEVYUEVDVF9ORSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX0ZBTFNFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKICAgRVhQRUNUX0VRKGV4cGVjdGVkX2Vycm9yLCBHZXRDYXB0dXJlZFN0ZGVycigpKTsKIH0KIApAQCAtMzMxMiw3ICs0MzgzLDcgQEAKICAgICAgICJFUlJPUjogRm9vLmFpZGw6MS40Ny00OTogJ0ZvbycgaGFzIGR1cGxpY2F0ZSBmaWVsZCBuYW1lICdBJyBhZnRlciBjYXBpdGFsaXppbmcgdGhlIGZpcnN0ICIKICAgICAgICJsZXR0ZXJcbiI7CiAgIENhcHR1cmVTdGRlcnIoKTsKLSAgRVhQRUNUX05FKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfRkFMU0UoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogICBFWFBFQ1RfRVEoZXhwZWN0ZWRfc3RkZXJyLCBHZXRDYXB0dXJlZFN0ZGVycigpKTsKIH0KIApAQCAtMzM1Niw3ICs0NDI3LDcgQEAKICAgT3B0aW9ucyBvcHRpb25zID0gT3B0aW9uczo6RnJvbSgiYWlkbCBGb28uYWlkbCAtLWxhbmc9IiArIHRvX3N0cmluZyhHZXRMYW5ndWFnZSgpKSk7CiAgIGNvbnN0IHN0cmluZyBleHBlY3RlZF9zdGRlcnIgPSAiIjsKICAgQ2FwdHVyZVN0ZGVycigpOwotICBFWFBFQ1RfRVEoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9UUlVFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKICAgRVhQRUNUX0VRKGV4cGVjdGVkX3N0ZGVyciwgR2V0Q2FwdHVyZWRTdGRlcnIoKSk7CiB9CiAKQEAgLTMzNjcsNyArNDQzOCw3IEBACiAgICAgICBPcHRpb25zOjpGcm9tKCJhaWRsIEZvby5haWRsIC0tbGFuZz0iICsgdG9fc3RyaW5nKE9wdGlvbnM6Okxhbmd1YWdlOjpDUFApICsgIiAtbyBvdXQgLWggb3V0Iik7CiAgIGNvbnN0IHN0cmluZyBleHBlY3RlZF9zdGRlcnIgPSAiIjsKICAgQ2FwdHVyZVN0ZGVycigpOwotICBFWFBFQ1RfRVEoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9UUlVFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKICAgRVhQRUNUX0VRKGV4cGVjdGVkX3N0ZGVyciwgR2V0Q2FwdHVyZWRTdGRlcnIoKSk7CiAKICAgc3RyaW5nIGNvZGU7CkBAIC0zMzg2LDcgKzQ0NTcsNyBAQAogICAgICAgT3B0aW9uczo6RnJvbSgiYWlkbCBGb28uYWlkbCAtLWxhbmc9IiArIHRvX3N0cmluZyhPcHRpb25zOjpMYW5ndWFnZTo6TkRLKSArICIgLW8gb3V0IC1oIG91dCIpOwogICBjb25zdCBzdHJpbmcgZXhwZWN0ZWRfc3RkZXJyID0gIiI7CiAgIENhcHR1cmVTdGRlcnIoKTsKLSAgRVhQRUNUX0VRKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfVFJVRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAgIEVYUEVDVF9FUShleHBlY3RlZF9zdGRlcnIsIEdldENhcHR1cmVkU3RkZXJyKCkpOwogCiAgIHN0cmluZyBjb2RlOwpAQCAtMzQwNiw3ICs0NDc3LDcgQEAKICAgT3B0aW9ucyBvcHRpb25zID0gT3B0aW9uczo6RnJvbSgiYWlkbCBhL0Zvby5haWRsIC1JIC4gLW8gb3V0IC0tbGFuZz1qYXZhIik7CiAgIGNvbnN0IHN0cmluZyBleHBlY3RlZF9zdGRlcnIgPSAiIjsKICAgQ2FwdHVyZVN0ZGVycigpOwotICBFWFBFQ1RfRVEoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9UUlVFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKICAgRVhQRUNUX0VRKGV4cGVjdGVkX3N0ZGVyciwgR2V0Q2FwdHVyZWRTdGRlcnIoKSk7CiAKICAgc3RyaW5nIGNvZGU7CkBAIC0zNDE2LDE1ICs0NDg3LDc4IEBACiAgICAgICAgICAgICAgICAgICAiYS5CYXo8YS5CYXI8YS5CYXI8amF2YS5sYW5nLlN0cmluZ1tdPj5bXSxhLkJhcjxqYXZhLmxhbmcuU3RyaW5nPj4gYmFyc3M7IikpOwogfQogCi1URVNUX0YoQWlkbFRlc3QsIERvdWJsZUFycmF5RXJyb3IpIHsKK1RFU1RfRihBaWRsVGVzdCwgQWNjZXB0TXVsdGlEaW1lbnNpb25hbEZpeGVkU2l6ZUFycmF5KSB7CisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoImEvQmFyLmFpZGwiLCAicGFja2FnZSBhOyBwYXJjZWxhYmxlIEJhciB7IFN0cmluZ1syXVszXSBhOyB9Iik7CisKKyAgT3B0aW9ucyBvcHRpb25zID0gT3B0aW9uczo6RnJvbSgiYWlkbCBhL0Jhci5haWRsIC1JIC4gLW8gb3V0IC0tbGFuZz1uZGsiKTsKKyAgQ2FwdHVyZVN0ZGVycigpOworICBFWFBFQ1RfVFJVRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9FUSgiIiwgR2V0Q2FwdHVyZWRTdGRlcnIoKSk7Cit9CisKK1RFU1RfRihBaWRsVGVzdCwgQWNjZXB0QmluYXJ5U2l6ZUFycmF5KSB7CisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoCisgICAgICAiYS9CYXIuYWlkbCIsICJwYWNrYWdlIGE7IHBhcmNlbGFibGUgQmFyIHsgY29uc3QgaW50IENPTlNUID0gMzsgU3RyaW5nW0NPTlNUICsgMV0gYTsgfSIpOworCisgIE9wdGlvbnMgb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgYS9CYXIuYWlkbCAtSSAuIC1vIG91dCAtLWxhbmc9bmRrIik7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgRVhQRUNUX1RSVUUoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfRVEoIiIsIEdldENhcHR1cmVkU3RkZXJyKCkpOworfQorCitURVNUX0YoQWlkbFRlc3QsIEFjY2VwdFJlZlNpemVBcnJheSkgeworICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKAorICAgICAgImEvQmFyLmFpZGwiLCAicGFja2FnZSBhOyBwYXJjZWxhYmxlIEJhciB7IGNvbnN0IGludCBDT05TVCA9IDM7IFN0cmluZ1tDT05TVF0gYTsgfSIpOworCisgIE9wdGlvbnMgb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgYS9CYXIuYWlkbCAtSSAuIC1vIG91dCAtLWxhbmc9bmRrIik7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgRVhQRUNUX1RSVUUoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfRVEoIiIsIEdldENhcHR1cmVkU3RkZXJyKCkpOworfQorCitURVNUX0YoQWlkbFRlc3QsIFJlamVjdEFycmF5T2ZGaXhlZFNpemVBcnJheSkgeworICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJhL0Jhci5haWRsIiwgInBhY2thZ2UgYTsgcGFyY2VsYWJsZSBCYXIgeyBTdHJpbmdbMl1bXSBhOyB9Iik7CisKKyAgT3B0aW9ucyBvcHRpb25zID0gT3B0aW9uczo6RnJvbSgiYWlkbCBhL0Jhci5haWRsIC1JIC4gLW8gb3V0IC0tbGFuZz1qYXZhIik7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgRVhQRUNUX0ZBTFNFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRlcnIoKSwgSGFzU3Vic3RyKCJNdWx0aS1kaW1lbnNpb25hbCBhcnJheXMgbXVzdCBiZSBmaXhlZCBzaXplLiIpKTsKK30KKworVEVTVF9GKEFpZGxUZXN0LCBSZWplY3RGaXhlZFNpemVBcnJheU9mRHluYW1pY0FycmF5KSB7CisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoImEvQmFyLmFpZGwiLCAicGFja2FnZSBhOyBwYXJjZWxhYmxlIEJhciB7IFN0cmluZ1tdWzNdIGE7IH0iKTsKKworICBPcHRpb25zIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIGEvQmFyLmFpZGwgLUkgLiAtbyBvdXQgLS1sYW5nPWphdmEiKTsKKyAgQ2FwdHVyZVN0ZGVycigpOworICBFWFBFQ1RfRkFMU0UoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfVEhBVChHZXRDYXB0dXJlZFN0ZGVycigpLCBIYXNTdWJzdHIoIk11bHRpLWRpbWVuc2lvbmFsIGFycmF5cyBtdXN0IGJlIGZpeGVkIHNpemUuIikpOworfQorCitURVNUX0YoQWlkbFRlc3QsIFJlamVjdEFycmF5T2ZBcnJheSkgewogICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJhL0Jhci5haWRsIiwgInBhY2thZ2UgYTsgcGFyY2VsYWJsZSBCYXIgeyBTdHJpbmdbXVtdIGE7IH0iKTsKIAogICBPcHRpb25zIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIGEvQmFyLmFpZGwgLUkgLiAtbyBvdXQgLS1sYW5nPWphdmEiKTsKLSAgY29uc3Qgc3RyaW5nIGV4cGVjdGVkX3N0ZGVyciA9Ci0gICAgICAiRVJST1I6IGEvQmFyLmFpZGw6MS4yOC0zNzogQ2FuIG9ubHkgaGF2ZSBvbmUgZGltZW5zaW9uYWwgYXJyYXlzLlxuIjsKICAgQ2FwdHVyZVN0ZGVycigpOwotICBFWFBFQ1RfTkUoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7Ci0gIEVYUEVDVF9FUShleHBlY3RlZF9zdGRlcnIsIEdldENhcHR1cmVkU3RkZXJyKCkpOworICBFWFBFQ1RfRkFMU0UoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfVEhBVChHZXRDYXB0dXJlZFN0ZGVycigpLCBIYXNTdWJzdHIoIk11bHRpLWRpbWVuc2lvbmFsIGFycmF5cyBtdXN0IGJlIGZpeGVkIHNpemUuIikpOworfQorCitURVNUX0YoQWlkbFRlc3QsIFJlamVjdEludmFsaWRBcnJheVNpemVfTmVnYXRpdmUpIHsKKyAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygiYS9CYXIuYWlkbCIsICJwYWNrYWdlIGE7IHBhcmNlbGFibGUgQmFyIHsgU3RyaW5nWy0xXSBhOyB9Iik7CisKKyAgT3B0aW9ucyBvcHRpb25zID0gT3B0aW9uczo6RnJvbSgiYWlkbCBhL0Jhci5haWRsIC1JIC4gLW8gb3V0IC0tbGFuZz1qYXZhIik7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgRVhQRUNUX0ZBTFNFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRlcnIoKSwgSGFzU3Vic3RyKCJBcnJheSBzaXplIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXIiKSk7Cit9CisKK1RFU1RfRihBaWRsVGVzdCwgUmVqZWN0SW52YWxpZEFycmF5U2l6ZV9Xcm9uZ1R5cGUpIHsKKyAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygiYS9CYXIuYWlkbCIsICJwYWNrYWdlIGE7IHBhcmNlbGFibGUgQmFyIHsgU3RyaW5nW1wiM1wiXSBhOyB9Iik7CisKKyAgT3B0aW9ucyBvcHRpb25zID0gT3B0aW9uczo6RnJvbSgiYWlkbCBhL0Jhci5haWRsIC1JIC4gLW8gb3V0IC0tbGFuZz1qYXZhIik7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgRVhQRUNUX0ZBTFNFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRlcnIoKSwgSGFzU3Vic3RyKCJBcnJheSBzaXplIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXIiKSk7CiB9CiAKIFRFU1RfRihBaWRsVGVzdCwgRG91YmxlR2VuZXJpY0Vycm9yKSB7CkBAIC0zNDM1LDcgKzQ1NjksNyBAQAogICBjb25zdCBzdHJpbmcgZXhwZWN0ZWRfc3RkZXJyID0KICAgICAgICJFUlJPUjogYS9CYXIuYWlkbDoxLjI4LTMzOiBDYW4gb25seSBzcGVjaWZ5IG9uZSBzZXQgb2YgdHlwZSBwYXJhbWV0ZXJzLlxuIjsKICAgQ2FwdHVyZVN0ZGVycigpOwotICBFWFBFQ1RfTkUoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9GQUxTRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAgIEVYUEVDVF9FUShleHBlY3RlZF9zdGRlcnIsIEdldENhcHR1cmVkU3RkZXJyKCkpOwogfQogCkBAIC0zNDQ0LDcgKzQ1NzgsNyBAQAogCiAgIE9wdGlvbnMgb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgYS9CYXIuYWlkbCAtSSAuIC1vIG91dCAtLWxhbmc9amF2YSIpOwogICBDYXB0dXJlU3RkZXJyKCk7Ci0gIEVYUEVDVF9ORSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX0ZBTFNFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKICAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRlcnIoKSwgdGVzdGluZzo6SGFzU3Vic3RyKCJzeW50YXggZXJyb3IsIHVuZXhwZWN0ZWQgJzwnIikpOwogfQogCkBAIC0zNDU0LDcgKzQ1ODgsNyBAQAogCiAgIE9wdGlvbnMgb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgYS9CYXIuYWlkbCAtSSAuIC1vIG91dCAtLWxhbmc9amF2YSIpOwogICBDYXB0dXJlU3RkZXJyKCk7Ci0gIEVYUEVDVF9FUSgxLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX0ZBTFNFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKICAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRlcnIoKSwgdGVzdGluZzo6SGFzU3Vic3RyKCJBbm5vdGF0aW9ucyBmb3IgYXJyYXlzIGFyZSBub3Qgc3VwcG9ydGVkLiIpKTsKIH0KIApAQCAtMzQ2NCwxMSArNDU5OCw2NSBAQAogCiAgIE9wdGlvbnMgb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgYS9CYXIuYWlkbCAtSSAuIC1vIG91dCAtLWxhbmc9amF2YSIpOwogICBDYXB0dXJlU3RkZXJyKCk7Ci0gIEVYUEVDVF9FUSgxLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX0ZBTFNFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKICAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRlcnIoKSwKICAgICAgICAgICAgICAgdGVzdGluZzo6SGFzU3Vic3RyKCJBbm5vdGF0aW9ucyBmb3IgdHlwZSBhcmd1bWVudHMgYXJlIG5vdCBzdXBwb3J0ZWQuIikpOwogfQogCitURVNUX0YoQWlkbFRlc3QsIERlZmF1bHRTaG91bGRNYXRjaFdpdGhGaXhlZFNpemVBcnJheSkgeworICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJhL0Jhci5haWRsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFja2FnZSBhO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJjZWxhYmxlIEJhciB7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgaW50WzJdWzNdIGEgPSB7ezEsMiwzfSwgezQsNSw2fX07XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn0iKTsKKworICBPcHRpb25zIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIGEvQmFyLmFpZGwgLUkgLiAtbyBvdXQgLS1sYW5nPW5kayIpOworICBDYXB0dXJlU3RkZXJyKCk7CisgIEVYUEVDVF9UUlVFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX0VRKCIiLCBHZXRDYXB0dXJlZFN0ZGVycigpKTsKK30KKworVEVTVF9GKEFpZGxUZXN0LCBGaXhlZFNpemVBcnJheVdpdGhXcm9uZ1R5cGVEZWZhdWx0VmFsdWUpIHsKKyAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygiYS9CYXIuYWlkbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhY2thZ2UgYTtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyY2VsYWJsZSBCYXIge1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIGludFsyXVszXSBhID0ge3tcIjFcIixcIjJcIixcIjNcIn0sIHs0LDUsNn19O1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9Iik7CisKKyAgT3B0aW9ucyBvcHRpb25zID0gT3B0aW9uczo6RnJvbSgiYWlkbCBhL0Jhci5haWRsIC1JIC4gLW8gb3V0IC0tbGFuZz1qYXZhIik7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgRVhQRUNUX0ZBTFNFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRlcnIoKSwgSGFzU3Vic3RyKCJJbnZhbGlkIHR5cGUgc3BlY2lmaWVyIGZvciBhIGxpdGVyYWwgc3RyaW5nOiBpbnQiKSk7Cit9CisKK1RFU1RfRihBaWRsVGVzdCwgRml4ZWRTaXplQXJyYXlXaXRoTW9yZUVsZW1lbnRzKSB7CisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoImEvQmFyLmFpZGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYWNrYWdlIGE7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmNlbGFibGUgQmFyIHtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBpbnRbMl1bM10gYSA9IHt7MSwyLDMsNH0sIHs0LDUsNn19O1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9Iik7CisKKyAgT3B0aW9ucyBvcHRpb25zID0gT3B0aW9uczo6RnJvbSgiYWlkbCBhL0Jhci5haWRsIC1JIC4gLW8gb3V0IC0tbGFuZz1qYXZhIik7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgRVhQRUNUX0ZBTFNFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRlcnIoKSwKKyAgICAgICAgICAgICAgSGFzU3Vic3RyKCJFeHBlY3RlZCBhbiBhcnJheSBvZiAzIGVsZW1lbnRzLCBidXQgZm91bmQgb25lIHdpdGggNCBlbGVtZW50cyIpKTsKK30KKworVEVTVF9GKEFpZGxUZXN0LCBGaXhlZFNpemVBcnJheVdpdGhGZXdlckVsZW1lbnRzKSB7CisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoImEvQmFyLmFpZGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYWNrYWdlIGE7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmNlbGFibGUgQmFyIHtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBpbnRbMl1bM10gYSA9IHt9O1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9Iik7CisKKyAgT3B0aW9ucyBvcHRpb25zID0gT3B0aW9uczo6RnJvbSgiYWlkbCBhL0Jhci5haWRsIC1JIC4gLW8gb3V0IC0tbGFuZz1qYXZhIik7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgRVhQRUNUX0ZBTFNFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRlcnIoKSwKKyAgICAgICAgICAgICAgSGFzU3Vic3RyKCJFeHBlY3RlZCBhbiBhcnJheSBvZiAyIGVsZW1lbnRzLCBidXQgZm91bmQgb25lIHdpdGggMCBlbGVtZW50cyIpKTsKK30KKwogc3RydWN0IEdlbmVyaWNBaWRsVGVzdCA6IDo6dGVzdGluZzo6VGVzdCB7CiAgIEZha2VJb0RlbGVnYXRlIGlvX2RlbGVnYXRlXzsKICAgdm9pZCBDb21waWxlKHN0cmluZyBjbWQpIHsKQEAgLTM0NzksNyArNDY2Nyw3IEBACiAKICAgICBPcHRpb25zIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKGNtZCk7CiAgICAgQ2FwdHVyZVN0ZGVycigpOwotICAgIEVYUEVDVF9FUSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgICBFWFBFQ1RfVFJVRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAgICAgRVhQRUNUX0VRKCIiLCBHZXRDYXB0dXJlZFN0ZGVycigpKTsKICAgfQogfTsKQEAgLTM1MDgsNyArNDY5Niw3IEBACiAgIGNvbnN0IHN0cmluZyBleHBlY3RlZF9zdGRlcnIgPQogICAgICAgIkVSUk9SOiBGb28uYWlkbDoxLjExLTE1OiBFdmVyeSB0eXBlIHBhcmFtZXRlciBzaG91bGQgYmUgdW5pcXVlLlxuIjsKICAgQ2FwdHVyZVN0ZGVycigpOwotICBFWFBFQ1RfTkUoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9GQUxTRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAgIEVYUEVDVF9FUShleHBlY3RlZF9zdGRlcnIsIEdldENhcHR1cmVkU3RkZXJyKCkpOwogfQogCkBAIC0zNTE3LDcgKzQ3MDUsNyBAQAogICBPcHRpb25zIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIEZvby5haWRsIC0tbGFuZz0iICsgdG9fc3RyaW5nKEdldExhbmd1YWdlKCkpKTsKICAgY29uc3Qgc3RyaW5nIGV4cGVjdGVkX3N0ZGVyciA9ICJFUlJPUjogRm9vLmFpZGw6MS4yMi0yNDogRmFpbGVkIHRvIHJlc29sdmUgJ1QnXG4iOwogICBDYXB0dXJlU3RkZXJyKCk7Ci0gIEVYUEVDVF9ORSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX0ZBTFNFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKICAgRVhQRUNUX0VRKGV4cGVjdGVkX3N0ZGVyciwgR2V0Q2FwdHVyZWRTdGRlcnIoKSk7CiB9CiAKQEAgLTM1MjUsNyArNDcxMyw3IEBACiAgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoIkZvby5haWRsIiwgImVudW0gRm9vIHsgRk9PID0gKDEgPDwgMSkgLyogY29tbWVudCAqLyB8IDB4MCB9Iik7CiAgIE9wdGlvbnMgb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgRm9vLmFpZGwgLS1sYW5nPSIgKyB0b19zdHJpbmcoR2V0TGFuZ3VhZ2UoKSkpOwogICBDYXB0dXJlU3RkZXJyKCk7Ci0gIEVYUEVDVF9FUSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX1RSVUUoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogICBFWFBFQ1RfRVEoIiIsIEdldENhcHR1cmVkU3RkZXJyKCkpOwogfQogCkBAIC0zNTQyLDcgKzQ3MzAsNyBAQAogICAgICAgInByb2hpYml0ZWQgYmVjYXVzZSBpdCBpcyBub3QgZ3VhcmFudGVlZCB0aGF0IHRoZSBvYmplY3RzIGluIHRoZSBsaXN0IGFyZSByZWNvZ25pemFibGUgaW4gIgogICAgICAgInRoZSByZWNlaXZpbmcgc2lkZS4gQ29uc2lkZXIgc3dpdGNoaW5nIHRvIGFuIGFycmF5IG9yIGEgZ2VuZXJpYyBMaXN0L01hcC5cbiI7CiAgIENhcHR1cmVTdGRlcnIoKTsKLSAgRVhQRUNUX05FKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfRkFMU0UoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogICBFWFBFQ1RfRVEoZXhwZWN0ZWRFcnIsIEdldENhcHR1cmVkU3RkZXJyKCkpOwogfQogCkBAIC0zNTU5LDcgKzQ3NDcsNyBAQAogICAgICAgInByb2hpYml0ZWQgYmVjYXVzZSBpdCBpcyBub3QgZ3VhcmFudGVlZCB0aGF0IHRoZSBvYmplY3RzIGluIHRoZSBsaXN0IGFyZSByZWNvZ25pemFibGUgaW4gIgogICAgICAgInRoZSByZWNlaXZpbmcgc2lkZS4gQ29uc2lkZXIgc3dpdGNoaW5nIHRvIGFuIGFycmF5IG9yIGEgZ2VuZXJpYyBMaXN0L01hcC5cbiI7CiAgIENhcHR1cmVTdGRlcnIoKTsKLSAgRVhQRUNUX05FKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfRkFMU0UoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogICBFWFBFQ1RfRVEoZXhwZWN0ZWRFcnIsIEdldENhcHR1cmVkU3RkZXJyKCkpOwogfQogCkBAIC0zNTc4LDcgKzQ3NjYsNyBAQAogICAgICAgInByb2hpYml0ZWQgYmVjYXVzZSBpdCBpcyBub3QgZ3VhcmFudGVlZCB0aGF0IHRoZSBvYmplY3RzIGluIHRoZSBsaXN0IGFyZSByZWNvZ25pemFibGUgaW4gIgogICAgICAgInRoZSByZWNlaXZpbmcgc2lkZS4gQ29uc2lkZXIgc3dpdGNoaW5nIHRvIGFuIGFycmF5IG9yIGEgZ2VuZXJpYyBMaXN0L01hcC5cbiI7CiAgIENhcHR1cmVTdGRlcnIoKTsKLSAgRVhQRUNUX05FKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfRkFMU0UoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogICBFWFBFQ1RfRVEoZXhwZWN0ZWRFcnIsIEdldENhcHR1cmVkU3RkZXJyKCkpOwogfQogCkBAIC0zNTkyLDcgKzQ3ODAsNyBAQAogfSkiKTsKICAgQ2FwdHVyZVN0ZGVycigpOwogICBhdXRvIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIC1JIGEgLS1sYW5nIGphdmEgLW8gb3V0IGEvcC9Gb28uYWlkbCIpOwotICBFWFBFQ1RfRVEoMCwgYWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfVFJVRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAgIGF1dG8gZXJyID0gR2V0Q2FwdHVyZWRTdGRlcnIoKTsKICAgRVhQRUNUX0VRKCIiLCBlcnIpOwogCkBAIC0zNjExLDEzICs0Nzk5LDEzIEBACiB9KSIpOwogICBDYXB0dXJlU3RkZXJyKCk7CiAgIGF1dG8gb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgLUkgYSAtLWxhbmcgY3BwIC1vIG91dCAtaCBvdXQgYS9wL0Zvby5haWRsIik7Ci0gIEVYUEVDVF9FUSgwLCBhaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9UUlVFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKICAgYXV0byBlcnIgPSBHZXRDYXB0dXJlZFN0ZGVycigpOwogICBFWFBFQ1RfRVEoIiIsIGVycik7CiAKICAgc3RyaW5nIGNvZGU7CiAgIEVYUEVDVF9UUlVFKGlvX2RlbGVnYXRlXy5HZXRXcml0dGVuQ29udGVudHMoIm91dC9wL0Zvby5oIiwgJmNvZGUpKTsKLSAgRVhQRUNUX1RIQVQoY29kZSwgdGVzdGluZzo6SGFzU3Vic3RyKCI6OnA6OkVudW0gZSA9IDo6cDo6RW51bSg6OnA6OkVudW06OkJBUik7IikpOworICBFWFBFQ1RfVEhBVChjb2RlLCB0ZXN0aW5nOjpIYXNTdWJzdHIoIjo6cDo6RW51bSBlID0gOjpwOjpFbnVtOjpCQVI7IikpOwogfQogCiBURVNUX0YoQWlkbFRlc3QsIEVudW1XaXRoRGVmYXVsdHNfTmRrKSB7CkBAIC0zNjMwLDcgKzQ4MTgsNyBAQAogfSkiKTsKICAgQ2FwdHVyZVN0ZGVycigpOwogICBhdXRvIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIC1JIGEgLS1sYW5nIG5kayAtbyBvdXQgLWggb3V0IGEvcC9Gb28uYWlkbCIpOwotICBFWFBFQ1RfRVEoMCwgYWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfVFJVRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAgIGF1dG8gZXJyID0gR2V0Q2FwdHVyZWRTdGRlcnIoKTsKICAgRVhQRUNUX0VRKCIiLCBlcnIpOwogCkBAIC0zNjUwLDcgKzQ4MzgsNyBAQAogfSkiKTsKICAgQ2FwdHVyZVN0ZGVycigpOwogICBhdXRvIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIC1JIGEgLS1sYW5nIHJ1c3QgLW8gb3V0IC1oIG91dCBhL3AvRm9vLmFpZGwiKTsKLSAgRVhQRUNUX0VRKDAsIGFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX1RSVUUoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogICBhdXRvIGVyciA9IEdldENhcHR1cmVkU3RkZXJyKCk7CiAgIEVYUEVDVF9FUSgiIiwgZXJyKTsKIApAQCAtMzcyMywxOSArNDkxMSwzMyBAQAogfSkiKTsKICAgQ2FwdHVyZVN0ZGVycigpOwogICBhdXRvIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIC1JIGEgLS1sYW5nIGphdmEgLW8gb3V0IC1oIG91dCBhL3AvRm9vLmFpZGwiKTsKLSAgRVhQRUNUX0VRKDEsIGFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX0ZBTFNFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKICAgYXV0byBlcnIgPSBHZXRDYXB0dXJlZFN0ZGVycigpOwogICBFWFBFQ1RfRVEoIkVSUk9SOiBhL3AvRm9vLmFpZGw6NS4xMS0yMDogSW52YWxpZCB2YWx1ZSAoRW51bS5GT098RW51bS5CQVIpIGZvciBlbnVtIHAuRW51bVxuIiwKICAgICAgICAgICAgIGVycik7CiB9CiAKK1RFU1RfRihBaWRsVGVzdCwgRW51bURlZmF1bHRTaG91bGRCZUVudW1lcmF0b3JzX1JlamVjdHNOdW1lcmljVmFsdWUpIHsKKyAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygiYS9wL0VudW0uYWlkbCIsICJwYWNrYWdlIHA7IGVudW0gRW51bSB7IEZPTyA9IDEsIEJBUiA9IDJ9Iik7CisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoImEvcC9Gb28uYWlkbCIsIFIiKAorcGFja2FnZSBwOworaW1wb3J0IHAuRW51bTsKK3BhcmNlbGFibGUgRm9vIHsKKyAgRW51bSBlID0gMTsKK30pIik7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgYXV0byBvcHRpb25zID0gT3B0aW9uczo6RnJvbSgiYWlkbCAtSSBhIC0tbGFuZyBqYXZhIC1vIG91dCAtaCBvdXQgYS9wL0Zvby5haWRsIik7CisgIEVYUEVDVF9GQUxTRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9USEFUKEdldENhcHR1cmVkU3RkZXJyKCksIEhhc1N1YnN0cigiSW52YWxpZCB2YWx1ZSAoMSkgZm9yIGVudW0gcC5FbnVtIikpOworfQorCiBURVNUX1AoQWlkbFRlc3QsIERlZmF1bHRXaXRoRW1wdHlBcnJheSkgewogICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJhL3AvRm9vLmFpZGwiLCAicGFja2FnZSBwOyBwYXJjZWxhYmxlIEZvbyB7IHAuQmFyW10gYmFycyA9IHt9OyB9Iik7CiAgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoImEvcC9CYXIuYWlkbCIsICJwYWNrYWdlIHA7IHBhcmNlbGFibGUgQmFyIHsgfSIpOwogICBDYXB0dXJlU3RkZXJyKCk7CiAgIGF1dG8gb3B0aW9ucyA9CiAgICAgICBPcHRpb25zOjpGcm9tKCJhaWRsIC1JIGEgLS1sYW5nICIgKyB0b19zdHJpbmcoR2V0TGFuZ3VhZ2UoKSkgKyAiIC1vIG91dCAtaCBvdXQgYS9wL0Zvby5haWRsIik7Ci0gIEVYUEVDVF9FUSgwLCBhaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9UUlVFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKICAgYXV0byBlcnIgPSBHZXRDYXB0dXJlZFN0ZGVycigpOwogICBFWFBFQ1RfRVEoIiIsIGVycik7CiB9CkBAIC0zNzQ5LDcgKzQ5NTEsNyBAQAogICBDYXB0dXJlU3RkZXJyKCk7CiAgIGF1dG8gb3B0aW9ucyA9CiAgICAgICBPcHRpb25zOjpGcm9tKCJhaWRsIC0tbGFuZyAiICsgdG9fc3RyaW5nKEdldExhbmd1YWdlKCkpICsgIiAtbyBvdXQgLWggb3V0IGEvcC9JRm9vLmFpZGwiKTsKLSAgRVhQRUNUX0VRKDEsIGFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX0ZBTFNFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKICAgYXV0byBlcnIgPSBHZXRDYXB0dXJlZFN0ZGVycigpOwogICBFWFBFQ1RfRVEoCiAgICAgICAiRVJST1I6IGEvcC9JRm9vLmFpZGw6My4zMS00MTogVmFsdWUgbXVzdCBiZSBhIGNvbnN0YW50IGV4cHJlc3Npb24gYnV0IGNvbnRhaW5zIHJlZmVyZW5jZSB0byAiCkBAIC0zNzY0LDcgKzQ5NjYsNyBAQAogICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJhL3AvQmFyLmFpZGwiLCAicGFja2FnZSBwOyBlbnVtIEJhciB7IEZPTywgQkFSIH0iKTsKICAgQ2FwdHVyZVN0ZGVycigpOwogICBhdXRvIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIC1JIGEgLS1sYW5nIG5kayAtbyBvdXQgLWggb3V0IGEvcC9Gb28uYWlkbCIpOwotICBFWFBFQ1RfRVEoMCwgYWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfVFJVRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAgIGF1dG8gZXJyID0gR2V0Q2FwdHVyZWRTdGRlcnIoKTsKICAgRVhQRUNUX0VRKCIiLCBlcnIpOwogICBzdHJpbmcgY29kZTsKQEAgLTM3NzgsMTIgKzQ5ODAsOSBAQAogICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJhL3AvRm9vLmFpZGwiLCAicGFja2FnZSBwOyBlbnVtIEZvbyB7IEEgPSBCLCBCIH0iKTsKICAgQ2FwdHVyZVN0ZGVycigpOwogICBhdXRvIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIC1JIGEgLS1sYW5nIG5kayAtbyBvdXQgLWggb3V0IGEvcC9Gb28uYWlkbCIpOwotICBFWFBFQ1RfRVEoMSwgYWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfRkFMU0UoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogICBhdXRvIGVyciA9IEdldENhcHR1cmVkU3RkZXJyKCk7Ci0gIEVYUEVDVF9FUSgKLSAgICAgICJFUlJPUjogYS9wL0Zvby5haWRsOjEuMjYtMjg6IEZvdW5kIGEgY2lyY3VsYXIgcmVmZXJlbmNlOiBCIC0+IEEgLT4gQlxuIgotICAgICAgIkVSUk9SOiBhL3AvRm9vLmFpZGw6MS4yOS0zMTogRm91bmQgYSBjaXJjdWxhciByZWZlcmVuY2U6IEEgLT4gQiAtPiBBXG4iLAotICAgICAgZXJyKTsKKyAgRVhQRUNUX0VRKCJFUlJPUjogYS9wL0Zvby5haWRsOjEuMjYtMjg6IEZvdW5kIGEgY2lyY3VsYXIgcmVmZXJlbmNlOiBCIC0+IEEgLT4gQlxuIiwgZXJyKTsKIH0KIAogVEVTVF9GKEFpZGxUZXN0LCBSZWplY3RzQ2lyY3VsYXJSZWZlcmVuY2luZ0NvbnN0cykgewpAQCAtMzc5MSw3ICs0OTkwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFja2FnZSBwOyBwYXJjZWxhYmxlIEZvbyB7IGNvbnN0IGludCBBID0gQSArIDE7IH0iKTsKICAgQ2FwdHVyZVN0ZGVycigpOwogICBhdXRvIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIC1JIGEgLS1sYW5nIG5kayAtbyBvdXQgLWggb3V0IGEvcC9Gb28uYWlkbCIpOwotICBFWFBFQ1RfRVEoMSwgYWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfRkFMU0UoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogICBhdXRvIGVyciA9IEdldENhcHR1cmVkU3RkZXJyKCk7CiAgIEVYUEVDVF9FUSgiRVJST1I6IGEvcC9Gb28uYWlkbDoxLjQyLTQ0OiBGb3VuZCBhIGNpcmN1bGFyIHJlZmVyZW5jZTogQSAtPiBBXG4iLCBlcnIpOwogfQpAQCAtMzgwNCwyMCArNTAwMyw0MCBAQAogICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJhL3AvQmF6LmFpZGwiLCAicGFja2FnZSBwOyBwYXJjZWxhYmxlIEJheiB7IGNvbnN0IGludCBBID0gMTsgfSIpOwogICBDYXB0dXJlU3RkZXJyKCk7CiAgIGF1dG8gb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgLUkgYSAtLWxhbmcgbmRrIC1vIG91dCAtaCBvdXQgYS9wL0Zvby5haWRsIik7Ci0gIEVYUEVDVF9FUSgwLCBhaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9UUlVFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX0VRKCIiLCBHZXRDYXB0dXJlZFN0ZGVycigpKTsKK30KKworVEVTVF9QKEFpZGxUZXN0LCBDaXJjdWxhclJlZmVyZW5jZVdpdGhGdWxseVF1YWxpZmllZCkgeworICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJGb28uYWlkbCIsICJlbnVtIEZvbyB7IEEgPSBGb28uQSB9Iik7CisgIGF1dG8gb3B0aW9ucyA9CisgICAgICBPcHRpb25zOjpGcm9tKCJhaWRsIC0tbGFuZyAiICsgdG9fc3RyaW5nKEdldExhbmd1YWdlKCkpICsgIiAtSSAuIC1vIG91dCAtaCBvdXQgRm9vLmFpZGwiKTsKKyAgY29uc3Qgc3RyaW5nIGVyciA9ICJFUlJPUjogRm9vLmFpZGw6MS4xNS0yMTogRm91bmQgYSBjaXJjdWxhciByZWZlcmVuY2U6IEZvby5BIC0+IEZvby5BXG4iOworICBDYXB0dXJlU3RkZXJyKCk7CisgIEVYUEVDVF9GQUxTRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9FUShlcnIsIEdldENhcHR1cmVkU3RkZXJyKCkpOworfQorCitURVNUX1AoQWlkbFRlc3QsIENvbnN0UmVmc0NhblBvaW50VG9UaGVTYW1lVmFsdWUpIHsKKyAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygiRm9vLmFpZGwiLCAiZW51bSBGb28geyBBID0gMCB9Iik7CisgIC8vIHRoaXMgZGVtb25zdHJhdGVzIHRoZSBjYXNlIHRoYXQgIkZvby5BIiBjb25zdC1yZWYgbm9kZSBpcyB2aXNpdGVkIHR3aWNlIGJ5IEIgYW5kIEMuCisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoIkJhci5haWRsIiwgImVudW0gQmFyIHsgQSA9IEZvby5BLCBCID0gQSwgQyA9IEEgfSIpOworICBhdXRvIG9wdGlvbnMgPQorICAgICAgT3B0aW9uczo6RnJvbSgiYWlkbCAtLWxhbmcgIiArIHRvX3N0cmluZyhHZXRMYW5ndWFnZSgpKSArICIgLUkgLiAtbyBvdXQgLWggb3V0IEJhci5haWRsIik7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgRVhQRUNUX1RSVUUoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogICBFWFBFQ1RfRVEoIiIsIEdldENhcHR1cmVkU3RkZXJyKCkpOwogfQogCiBURVNUX1AoQWlkbFRlc3QsIFVua25vd25Db25zdFJlZmVyZW5jZSkgewotICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJGb28uYWlkbCIsICIgcGFyY2VsYWJsZSBGb28geyBVbmtub3duVHlwZSBmaWVsZCA9IFVOS05PV05fUkVGOyB9Iik7CisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoIkZvby5haWRsIiwgIiBwYXJjZWxhYmxlIEZvbyB7IGludCBmaWVsZCA9IFVOS05PV05fUkVGOyB9Iik7CiAgIGF1dG8gb3B0aW9ucyA9CiAgICAgICBPcHRpb25zOjpGcm9tKCJhaWRsIC0tbGFuZyAiICsgdG9fc3RyaW5nKEdldExhbmd1YWdlKCkpICsgIiAtbyBvdXQgLWggb3V0IEZvby5haWRsIik7CiAgIGNvbnN0IHN0cmluZyBlcnIgPQotICAgICAgIkVSUk9SOiBGb28uYWlkbDoxLjE4LTMwOiBGYWlsZWQgdG8gcmVzb2x2ZSAnVW5rbm93blR5cGUnXG4iCi0gICAgICAiRVJST1I6IEZvby5haWRsOjEuMzgtNTA6IENhbid0IGZpbmQgVU5LTk9XTl9SRUYgaW4gRm9vXG4iCi0gICAgICAiRVJST1I6IEZvby5haWRsOjEuMzgtNTA6IFVua25vd24gcmVmZXJlbmNlICdVTktOT1dOX1JFRidcbiI7CisgICAgICAiRVJST1I6IEZvby5haWRsOjEuMzAtNDI6IENhbid0IGZpbmQgVU5LTk9XTl9SRUYgaW4gRm9vXG4iCisgICAgICAiRVJST1I6IEZvby5haWRsOjEuMzAtNDI6IFVua25vd24gcmVmZXJlbmNlICdVTktOT1dOX1JFRidcbiI7CiAgIENhcHR1cmVTdGRlcnIoKTsKLSAgRVhQRUNUX0VRKDEsIGFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX0ZBTFNFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKICAgRVhQRUNUX0VRKGVyciwgR2V0Q2FwdHVyZWRTdGRlcnIoKSk7CiB9CiAKQEAgLTM4MzMsOSArNTA1Miw5IEBACiBURVNUX1AoQWlkbFRlc3QsIFdhcm5pbmdJbnRlcmZhY2VOYW1lKSB7CiAgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoInAvRm9vLmFpZGwiLCAiaW50ZXJmYWNlIEZvbyB7fSIpOwogICBhdXRvIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIC0tbGFuZyAiICsgdG9fc3RyaW5nKEdldExhbmd1YWdlKCkpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIC1XZXZlcnl0aGluZyAtbyBvdXQgLWggb3V0IHAvRm9vLmFpZGwiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIC1XaW50ZXJmYWNlLW5hbWUgLW8gb3V0IC1oIG91dCBwL0Zvby5haWRsIik7CiAgIENhcHR1cmVTdGRlcnIoKTsKLSAgRVhQRUNUX0VRKDAsIGFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX1RSVUUoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogICBFWFBFQ1RfRVEoIldBUk5JTkc6IHAvRm9vLmFpZGw6MS4xLTEwOiBJbnRlcmZhY2UgbmFtZXMgc2hvdWxkIHN0YXJ0IHdpdGggSS4gWy1XaW50ZXJmYWNlLW5hbWVdXG4iLAogICAgICAgICAgICAgR2V0Q2FwdHVyZWRTdGRlcnIoKSk7CiB9CkBAIC0zODQzLDkgKzUwNjIsOSBAQAogVEVTVF9QKEFpZGxUZXN0LCBFcnJvckludGVyZmFjZU5hbWUpIHsKICAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygicC9Gb28uYWlkbCIsICJpbnRlcmZhY2UgRm9vIHt9Iik7CiAgIGF1dG8gb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgLS1sYW5nICIgKyB0b19zdHJpbmcoR2V0TGFuZ3VhZ2UoKSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgLVdldmVyeXRoaW5nIC1XZXJyb3IgLW8gb3V0IC1oIG91dCBwL0Zvby5haWRsIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAtV2ludGVyZmFjZS1uYW1lIC1XZXJyb3IgLW8gb3V0IC1oIG91dCBwL0Zvby5haWRsIik7CiAgIENhcHR1cmVTdGRlcnIoKTsKLSAgRVhQRUNUX0VRKDEsIGFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX0ZBTFNFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKICAgRVhQRUNUX0VRKCJFUlJPUjogcC9Gb28uYWlkbDoxLjEtMTA6IEludGVyZmFjZSBuYW1lcyBzaG91bGQgc3RhcnQgd2l0aCBJLiBbLVdpbnRlcmZhY2UtbmFtZV1cbiIsCiAgICAgICAgICAgICBHZXRDYXB0dXJlZFN0ZGVycigpKTsKIH0KQEAgLTM4NTksNyArNTA3OCw3IEBACiAKICAgYXV0byBvcHRpb25zID0gT3B0aW9uczo6RnJvbSh7ImFpZGwtY3BwIiwgaW5wdXRfZmlsZSwgaGVhZGVyX2Rpciwgb3V0cHV0X2ZpbGV9KTsKICAgQ2FwdHVyZVN0ZGVycigpOwotICBFWFBFQ1RfRVEoMSwgYWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfRkFMU0UoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogICBFWFBFQ1RfVEhBVCgKICAgICAgIEdldENhcHR1cmVkU3RkZXJyKCksCiAgICAgICB0ZXN0aW5nOjpTdGFydHNXaXRoKApAQCAtMzg4MiwxNzYgKzUxMDEsMzI2IEBACiAgICAgICB7e3siLypcbiIKICAgICAgICAgICIgKiBIZWxsbywgd29ybGQhXG4iCiAgICAgICAgICAiICovIn19LAotICAgICAgICIvKipcbiIKLSAgICAgICAiICogSGVsbG8sIHdvcmxkIVxuIgotICAgICAgICIgKi8ifSwKLSAgICAgIHt7eyIvKiBAaGlkZSAqLyJ9fSwgIi8qKiBAaGlkZSAqLyJ9LAorICAgICAgICIvKiogSGVsbG8sIHdvcmxkISAqL1xuIn0sCisgICAgICB7e3siLyogQGhpZGUgKi8ifX0sICIvKiogQGhpZGUgKi9cbiJ9LAogICAgICAge3t7Ii8qKlxuIgogICAgICAgICAgIiAgIEBwYXJhbSBmb28gLi4uXG4iCiAgICAgICAgICAiKi8ifX0sCi0gICAgICAgIi8qKlxuIgotICAgICAgICIgICBAcGFyYW0gZm9vIC4uLlxuIgotICAgICAgICIqLyJ9LAotICAgICAge3t7Ii8qIEBoaWRlICovIn0sIHsiLyogQGhpZGUgKi8ifX0sICIvKiBAaGlkZSAqLy8qKiBAaGlkZSAqLyJ9LAorICAgICAgICIvKiogQHBhcmFtIGZvbyAuLi4gKi9cbiJ9LAorICAgICAge3t7Ii8qIEBoaWRlICovIn0sIHsiLyogQGhpZGUgKi8ifX0sICIvKiBAaGlkZSAqL1xuLyoqIEBoaWRlICovXG4ifSwKICAgICAgIHt7eyIvKiBAZGVwcmVjYXRlZCBmaXJzdCAqLyJ9LCB7Ii8qIEBkZXByZWNhdGVkIHNlY29uZCAqLyJ9fSwKLSAgICAgICAiLyogQGRlcHJlY2F0ZWQgZmlyc3QgKi8vKiogQGRlcHJlY2F0ZWQgc2Vjb25kICovIn0sCi0gICAgICB7e3siLyogQGRlcHJlY2F0ZWQgKi8ifSwgeyIvKiogQHBhcmFtIGZvbyAqLyJ9fSwgIi8qIEBkZXByZWNhdGVkICovLyoqIEBwYXJhbSBmb28gKi8ifSwKKyAgICAgICAiLyogQGRlcHJlY2F0ZWQgZmlyc3QgKi9cbi8qKiBAZGVwcmVjYXRlZCBzZWNvbmQgKi9cbiJ9LAorICAgICAge3t7Ii8qIEBkZXByZWNhdGVkICovIn0sIHsiLyoqIEBwYXJhbSBmb28gKi8ifX0sICIvKiBAZGVwcmVjYXRlZCAqL1xuLyoqIEBwYXJhbSBmb28gKi9cbiJ9LAogICAgICAgLy8gTGluZSBjb21tZW50cyBhcmUgcHJpbnRlZCBhcyB0aGV5IGFyZQotICAgICAge3t7Ii8qIEBkZXByZWNhdGVkICovIn0sIHsiLy8gbGluZSBjb21tZW50c1xuIn19LCAiLyogQGRlcHJlY2F0ZWQgKi8vLyBsaW5lIGNvbW1lbnRzXG4ifSwKKyAgICAgIHt7eyIvKiBAZGVwcmVjYXRlZCAqLyJ9LCB7Ii8vIGxpbmUgY29tbWVudHNcbiJ9fSwgIi8qIEBkZXByZWNhdGVkICovXG4vLyBsaW5lIGNvbW1lbnRzXG4ifSwKICAgfTsKICAgZm9yIChjb25zdCBhdXRvJiBbaW5wdXQsIGZvcm1hdHRlZF0gOiB0ZXN0Y2FzZXMpIHsKICAgICBFWFBFQ1RfRVEoZm9ybWF0dGVkLCBGb3JtYXRDb21tZW50c0ZvckphdmEoaW5wdXQpKTsKICAgfQogfQogCi1URVNUX0YoQWlkbFRlc3QsIEhpZGVJc05vdEZvckFyZ3MpIHsKLSAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygiSUZvby5haWRsIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZXJmYWNlIElGb28ge1xuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIHZvaWQgZm9vKGluIEBIaWRlIGludCB4KTtcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifSIpOwotICBhdXRvIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIC0tbGFuZz1qYXZhIElGb28uYWlkbCIpOwotICBDYXB0dXJlU3RkZXJyKCk7Ci0gIEVYUEVDVF9FUSgxLCBhaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7Ci0gIEVYUEVDVF9USEFUKEdldENhcHR1cmVkU3RkZXJyKCksIEhhc1N1YnN0cigiQEhpZGUgaXMgbm90IGF2YWlsYWJsZSIpKTsKLX0KLQogVEVTVF9GKEFpZGxUZXN0LCBTdXBwcmVzc1dhcm5pbmdzSXNOb3RGb3JBcmdzKSB7CiAgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoCiAgICAgICAiSUZvby5haWRsIiwKICAgICAgICJpbnRlcmZhY2UgSUZvbyB7XG4iCi0gICAgICAiICB2b2lkIGZvbyhpbiBAU3VwcHJlc3NXYXJuaW5ncyh2YWx1ZT1cImlub3V0LXBhcmFtZXRlclwiKSBpbnQgeCk7XG4iCisgICAgICAiICB2b2lkIGZvbyhpbiBAU3VwcHJlc3NXYXJuaW5ncyh2YWx1ZT17XCJpbm91dC1wYXJhbWV0ZXJcIn0pIGludCB4KTtcbiIKICAgICAgICJ9Iik7CiAgIGF1dG8gb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgLS1sYW5nPWphdmEgSUZvby5haWRsIik7CiAgIENhcHR1cmVTdGRlcnIoKTsKLSAgRVhQRUNUX0VRKDEsIGFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX0ZBTFNFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKICAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRlcnIoKSwgSGFzU3Vic3RyKCJAU3VwcHJlc3NXYXJuaW5ncyBpcyBub3QgYXZhaWxhYmxlIikpOwogfQogCitURVNUX0YoQWlkbFRlc3QsIFZvaWRDYW50QmVVc2VkSW5NZXRob2RQYXJhbWV0ZXJUeXBlKSB7CisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoInAvSUZvby5haWRsIiwgImludGVyZmFjZSBJRm9veyB2b2lkIGoodm9pZCBuKTt9Iik7CisgIGF1dG8gb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgLS1sYW5nPWphdmEgLW8gb3V0IHAvSUZvby5haWRsIik7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgRVhQRUNUX0ZBTFNFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRlcnIoKSwgSGFzU3Vic3RyKCIndm9pZCcgaXMgYW4gaW52YWxpZCB0eXBlIGZvciB0aGUgcGFyYW1ldGVyICduJyIpKTsKK30KKworVEVTVF9GKEFpZGxUZXN0LCBJbnRlcmZhY2VWZWN0b3JJc0F2YWlsYWJsZUFmdGVyVGlyYW1pc3UpIHsKKyAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygicC9JRm9vLmFpZGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnRlcmZhY2UgSUZvb3tcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICB2b2lkIGZvbyhpbiBJRm9vW10gbik7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgdm9pZCBiYXIoaW4gTGlzdDxJRm9vPiBuKTtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifSIpOworICBDYXB0dXJlU3RkZXJyKCk7CisgIEVYUEVDVF9GQUxTRShjb21waWxlX2FpZGwoCisgICAgICBPcHRpb25zOjpGcm9tKCJhaWRsIC0tbGFuZz1qYXZhIC0tbWluX3Nka192ZXJzaW9uIDMwIC1vIG91dCBwL0lGb28uYWlkbCIpLCBpb19kZWxlZ2F0ZV8pKTsKKyAgYXV0byBjYXB0dXJlZF9zdGRlcnIgPSBHZXRDYXB0dXJlZFN0ZGVycigpOworICBFWFBFQ1RfVEhBVChjYXB0dXJlZF9zdGRlcnIsIEhhc1N1YnN0cigiQXJyYXkgb2YgaW50ZXJmYWNlcyBpcyBhdmFpbGFibGUgc2luY2UiKSk7CisgIEVYUEVDVF9USEFUKGNhcHR1cmVkX3N0ZGVyciwgSGFzU3Vic3RyKCJMaXN0IG9mIGludGVyZmFjZXMgaXMgYXZhaWxhYmxlIHNpbmNlIikpOworCisgIENhcHR1cmVTdGRlcnIoKTsKKyAgRVhQRUNUX1RSVUUoCisgICAgICBjb21waWxlX2FpZGwoT3B0aW9uczo6RnJvbSgiYWlkbCAtLWxhbmc9amF2YSAtLW1pbl9zZGtfdmVyc2lvbiBUaXJhbWlzdSAtbyBvdXQgcC9JRm9vLmFpZGwiKSwKKyAgICAgICAgICAgICAgICAgICBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX0VRKEdldENhcHR1cmVkU3RkZXJyKCksICIiKTsKK30KKworVEVTVF9GKEFpZGxUZXN0LCBSdXN0TmFtZU9mX1BmZEZpeGVkQXJyYXkpIHsKKyAgYXV0byBwZmQgPSB0eXBlbmFtZXNfLk1ha2VSZXNvbHZlZFR5cGUoQUlETF9MT0NBVElPTl9IRVJFLCAiUGFyY2VsRmlsZURlc2NyaXB0b3IiLCBmYWxzZSk7CisgIEFTU0VSVF9UUlVFKHBmZC0+TWFrZUFycmF5KEZpeGVkU2l6ZUFycmF5eworICAgICAgc3RkOjp1bmlxdWVfcHRyPEFpZGxDb25zdGFudFZhbHVlPihBaWRsQ29uc3RhbnRWYWx1ZTo6SW50ZWdyYWwoQUlETF9MT0NBVElPTl9IRVJFLCAiMiIpKX0pKTsKKyAgQVNTRVJUX1RSVUUocGZkLT5NYWtlQXJyYXkoRml4ZWRTaXplQXJyYXl7CisgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QWlkbENvbnN0YW50VmFsdWU+KEFpZGxDb25zdGFudFZhbHVlOjpJbnRlZ3JhbChBSURMX0xPQ0FUSU9OX0hFUkUsICIzIikpfSkpOworICBFWFBFQ1RfRVEoCisgICAgICBydXN0OjpSdXN0TmFtZU9mKCpwZmQsIHR5cGVuYW1lc18sIHJ1c3Q6OlN0b3JhZ2VNb2RlOjpQQVJDRUxBQkxFX0ZJRUxELCBydXN0OjpMaWZldGltZTo6Tk9ORSksCisgICAgICAiW1tPcHRpb248YmluZGVyOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj47IDNdOyAyXSIpOworICBFWFBFQ1RfRVEoCisgICAgICBydXN0OjpSdXN0TmFtZU9mKCpwZmQsIHR5cGVuYW1lc18sIHJ1c3Q6OlN0b3JhZ2VNb2RlOjpERUZBVUxUX1ZBTFVFLCBydXN0OjpMaWZldGltZTo6Tk9ORSksCisgICAgICAiW1tPcHRpb248YmluZGVyOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj47IDNdOyAyXSIpOworICBFWFBFQ1RfRVEoCisgICAgICBydXN0OjpSdXN0TmFtZU9mKCpwZmQsIHR5cGVuYW1lc18sIHJ1c3Q6OlN0b3JhZ2VNb2RlOjpJTl9BUkdVTUVOVCwgcnVzdDo6TGlmZXRpbWU6Ok5PTkUpLAorICAgICAgIiZbW2JpbmRlcjo6UGFyY2VsRmlsZURlc2NyaXB0b3I7IDNdOyAyXSIpOworICBFWFBFQ1RfRVEocnVzdDo6UnVzdE5hbWVPZigqcGZkLCB0eXBlbmFtZXNfLCBydXN0OjpTdG9yYWdlTW9kZTo6VkFMVUUsIHJ1c3Q6OkxpZmV0aW1lOjpOT05FKSwKKyAgICAgICAgICAgICJbW2JpbmRlcjo6UGFyY2VsRmlsZURlc2NyaXB0b3I7IDNdOyAyXSIpOworfQorCitURVNUX0YoQWlkbFRlc3QsIFJ1c3ROYW1lT2ZfUGZkRHluYW1pY0FycmF5KSB7CisgIGF1dG8gcGZkID0gdHlwZW5hbWVzXy5NYWtlUmVzb2x2ZWRUeXBlKEFJRExfTE9DQVRJT05fSEVSRSwgIlBhcmNlbEZpbGVEZXNjcmlwdG9yIiwgdHJ1ZSk7CisgIEVYUEVDVF9FUSgKKyAgICAgIHJ1c3Q6OlJ1c3ROYW1lT2YoKnBmZCwgdHlwZW5hbWVzXywgcnVzdDo6U3RvcmFnZU1vZGU6OlBBUkNFTEFCTEVfRklFTEQsIHJ1c3Q6OkxpZmV0aW1lOjpOT05FKSwKKyAgICAgICJWZWM8YmluZGVyOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj4iKTsKKyAgRVhQRUNUX0VRKAorICAgICAgcnVzdDo6UnVzdE5hbWVPZigqcGZkLCB0eXBlbmFtZXNfLCBydXN0OjpTdG9yYWdlTW9kZTo6REVGQVVMVF9WQUxVRSwgcnVzdDo6TGlmZXRpbWU6Ok5PTkUpLAorICAgICAgIlZlYzxPcHRpb248YmluZGVyOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj4+Iik7CisgIC8vIHdlIHVzZSBVTlNJWkVEX0FSR1VNRU5UIG1vZGUgZm9yIGlucHV0IGFyZ3VtZW50IG9mIGR5bmFtaWMgYXJyYXkKKyAgRVhQRUNUX0VRKAorICAgICAgcnVzdDo6UnVzdE5hbWVPZigqcGZkLCB0eXBlbmFtZXNfLCBydXN0OjpTdG9yYWdlTW9kZTo6VU5TSVpFRF9BUkdVTUVOVCwgcnVzdDo6TGlmZXRpbWU6Ok5PTkUpLAorICAgICAgIiZbYmluZGVyOjpQYXJjZWxGaWxlRGVzY3JpcHRvcl0iKTsKKyAgRVhQRUNUX0VRKHJ1c3Q6OlJ1c3ROYW1lT2YoKnBmZCwgdHlwZW5hbWVzXywgcnVzdDo6U3RvcmFnZU1vZGU6OlZBTFVFLCBydXN0OjpMaWZldGltZTo6Tk9ORSksCisgICAgICAgICAgICAiVmVjPGJpbmRlcjo6UGFyY2VsRmlsZURlc2NyaXB0b3I+Iik7Cit9CisKIHN0cnVjdCBUeXBlUGFyYW0gewogICBzdHJpbmcga2luZDsKICAgc3RyaW5nIGxpdGVyYWw7CiB9OwogCiBjb25zdCBUeXBlUGFyYW0ga1R5cGVQYXJhbXNbXSA9IHsKLSAgICB7InByaW1pdGl2ZSIsICJpbnQifSwgICB7InByaW1pdGl2ZUFycmF5IiwgImludFtdIn0sCi0gICAgeyJTdHJpbmciLCAiU3RyaW5nIn0sICAgeyJTdHJpbmdBcnJheSIsICJTdHJpbmdbXSJ9LAotICAgIHsiSUJpbmRlciIsICJJQmluZGVyIn0sIHsiUGFyY2VsRmlsZURlc2NyaXB0b3IiLCAiUGFyY2VsRmlsZURlc2NyaXB0b3IifSwKLSAgICB7InBhcmNlbGFibGUiLCAiRm9vIn0sICB7ImVudW0iLCAiYS5FbnVtIn0sCi0gICAgeyJ1bmlvbiIsICJhLlVuaW9uIn0sICAgeyJpbnRlcmZhY2UiLCAiYS5JQmFyIn0sCisgICAgeyJwcmltaXRpdmUiLCAiaW50In0sCisgICAgeyJwcmltaXRpdmVBcnJheSIsICJpbnRbXSJ9LAorICAgIHsicHJpbWl0aXZlRml4ZWRBcnJheSIsICJpbnRbM10ifSwKKyAgICB7IlN0cmluZyIsICJTdHJpbmcifSwKKyAgICB7IlN0cmluZ0FycmF5IiwgIlN0cmluZ1tdIn0sCisgICAgeyJJQmluZGVyIiwgIklCaW5kZXIifSwKKyAgICB7IlBhcmNlbEZpbGVEZXNjcmlwdG9yIiwgIlBhcmNlbEZpbGVEZXNjcmlwdG9yIn0sCisgICAgeyJwYXJjZWxhYmxlIiwgImEuRm9vIn0sCisgICAgeyJlbnVtIiwgImEuRW51bSJ9LAorICAgIHsidW5pb24iLCAiYS5VbmlvbiJ9LAorICAgIHsiaW50ZXJmYWNlIiwgImEuSUJhciJ9LAogfTsKIAotY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBrTGlzdFN1cHBvcnRFeHBlY3RhdGlvbnMgPSB7Ci0gICAgeyJjcHBfcHJpbWl0aXZlIiwgIkEgZ2VuZXJpYyB0eXBlIGNhbm5vdCBoYXZlIGFueSBwcmltaXRpdmUgdHlwZSBwYXJhbWV0ZXJzLiJ9LAotICAgIHsiamF2YV9wcmltaXRpdmUiLCAiQSBnZW5lcmljIHR5cGUgY2Fubm90IGhhdmUgYW55IHByaW1pdGl2ZSB0eXBlIHBhcmFtZXRlcnMuIn0sCi0gICAgeyJuZGtfcHJpbWl0aXZlIiwgIkEgZ2VuZXJpYyB0eXBlIGNhbm5vdCBoYXZlIGFueSBwcmltaXRpdmUgdHlwZSBwYXJhbWV0ZXJzLiJ9LAotICAgIHsicnVzdF9wcmltaXRpdmUiLCAiQSBnZW5lcmljIHR5cGUgY2Fubm90IGhhdmUgYW55IHByaW1pdGl2ZSB0eXBlIHBhcmFtZXRlcnMuIn0sCi0gICAgeyJjcHBfcHJpbWl0aXZlQXJyYXkiLCAiTGlzdCBvZiBhcnJheXMgaXMgbm90IHN1cHBvcnRlZC4ifSwKLSAgICB7ImphdmFfcHJpbWl0aXZlQXJyYXkiLCAiTGlzdCBvZiBhcnJheXMgaXMgbm90IHN1cHBvcnRlZC4ifSwKLSAgICB7Im5ka19wcmltaXRpdmVBcnJheSIsICJMaXN0IG9mIGFycmF5cyBpcyBub3Qgc3VwcG9ydGVkLiJ9LAotICAgIHsicnVzdF9wcmltaXRpdmVBcnJheSIsICJMaXN0IG9mIGFycmF5cyBpcyBub3Qgc3VwcG9ydGVkLiJ9LAotICAgIHsiY3BwX1N0cmluZyIsICIifSwKLSAgICB7ImphdmFfU3RyaW5nIiwgIiJ9LAotICAgIHsibmRrX1N0cmluZyIsICIifSwKLSAgICB7InJ1c3RfU3RyaW5nIiwgIiJ9LAotICAgIHsiY3BwX1N0cmluZ0FycmF5IiwgIkxpc3Qgb2YgYXJyYXlzIGlzIG5vdCBzdXBwb3J0ZWQuIn0sCi0gICAgeyJqYXZhX1N0cmluZ0FycmF5IiwgIkxpc3Qgb2YgYXJyYXlzIGlzIG5vdCBzdXBwb3J0ZWQuIn0sCi0gICAgeyJuZGtfU3RyaW5nQXJyYXkiLCAiTGlzdCBvZiBhcnJheXMgaXMgbm90IHN1cHBvcnRlZC4ifSwKLSAgICB7InJ1c3RfU3RyaW5nQXJyYXkiLCAiTGlzdCBvZiBhcnJheXMgaXMgbm90IHN1cHBvcnRlZC4ifSwKLSAgICB7ImNwcF9JQmluZGVyIiwgIiJ9LAotICAgIHsiamF2YV9JQmluZGVyIiwgIiJ9LAotICAgIHsibmRrX0lCaW5kZXIiLCAiTGlzdDxJQmluZGVyPiBpcyBub3Qgc3VwcG9ydGVkLiBMaXN0IGluIE5ESyBkb2Vzbid0IHN1cHBvcnQgSUJpbmRlci4ifSwKLSAgICB7InJ1c3RfSUJpbmRlciIsICIifSwKLSAgICB7ImNwcF9QYXJjZWxGaWxlRGVzY3JpcHRvciIsICIifSwKLSAgICB7ImphdmFfUGFyY2VsRmlsZURlc2NyaXB0b3IiLCAiIn0sCi0gICAgeyJuZGtfUGFyY2VsRmlsZURlc2NyaXB0b3IiLCAiIn0sCi0gICAgeyJydXN0X1BhcmNlbEZpbGVEZXNjcmlwdG9yIiwgIiJ9LAotICAgIHsiY3BwX2ludGVyZmFjZSIsICJMaXN0PGEuSUJhcj4gaXMgbm90IHN1cHBvcnRlZC4ifSwKLSAgICB7ImphdmFfaW50ZXJmYWNlIiwgIkxpc3Q8YS5JQmFyPiBpcyBub3Qgc3VwcG9ydGVkLiJ9LAotICAgIHsibmRrX2ludGVyZmFjZSIsICJMaXN0PGEuSUJhcj4gaXMgbm90IHN1cHBvcnRlZC4ifSwKLSAgICB7InJ1c3RfaW50ZXJmYWNlIiwgIkxpc3Q8YS5JQmFyPiBpcyBub3Qgc3VwcG9ydGVkLiJ9LAotICAgIHsiY3BwX3BhcmNlbGFibGUiLCAiIn0sCi0gICAgeyJqYXZhX3BhcmNlbGFibGUiLCAiIn0sCi0gICAgeyJuZGtfcGFyY2VsYWJsZSIsICIifSwKLSAgICB7InJ1c3RfcGFyY2VsYWJsZSIsICIifSwKLSAgICB7ImNwcF9lbnVtIiwgIkEgZ2VuZXJpYyB0eXBlIGNhbm5vdCBoYXZlIGFueSBwcmltaXRpdmUgdHlwZSBwYXJhbWV0ZXJzLiJ9LAotICAgIHsiamF2YV9lbnVtIiwgIkEgZ2VuZXJpYyB0eXBlIGNhbm5vdCBoYXZlIGFueSBwcmltaXRpdmUgdHlwZSBwYXJhbWV0ZXJzLiJ9LAotICAgIHsibmRrX2VudW0iLCAiQSBnZW5lcmljIHR5cGUgY2Fubm90IGhhdmUgYW55IHByaW1pdGl2ZSB0eXBlIHBhcmFtZXRlcnMuIn0sCi0gICAgeyJydXN0X2VudW0iLCAiQSBnZW5lcmljIHR5cGUgY2Fubm90IGhhdmUgYW55IHByaW1pdGl2ZSB0eXBlIHBhcmFtZXRlcnMuIn0sCi0gICAgeyJjcHBfdW5pb24iLCAiIn0sCi0gICAgeyJqYXZhX3VuaW9uIiwgIiJ9LAotICAgIHsibmRrX3VuaW9uIiwgIiJ9LAotICAgIHsicnVzdF91bmlvbiIsICIifSwKK3N0cnVjdCBFeHBlY3RlZFJlc3VsdCB7CisgIHN0cmluZyBleHBlY3RlZF9lcnJvcjsKKyAgc3RyaW5nIGV4cGVjdGVkX2Vycm9yX2Zvcl9udWxsYWJsZTsKIH07CiAKLWNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4ga0FycmF5U3VwcG9ydEV4cGVjdGF0aW9ucyA9IHsKLSAgICB7ImNwcF9wcmltaXRpdmUiLCAiIn0sCi0gICAgeyJqYXZhX3ByaW1pdGl2ZSIsICIifSwKLSAgICB7Im5ka19wcmltaXRpdmUiLCAiIn0sCi0gICAgeyJydXN0X3ByaW1pdGl2ZSIsICIifSwKLSAgICB7ImNwcF9wcmltaXRpdmVBcnJheSIsICJDYW4gb25seSBoYXZlIG9uZSBkaW1lbnNpb25hbCBhcnJheXMuIn0sCi0gICAgeyJqYXZhX3ByaW1pdGl2ZUFycmF5IiwgIkNhbiBvbmx5IGhhdmUgb25lIGRpbWVuc2lvbmFsIGFycmF5cy4ifSwKLSAgICB7Im5ka19wcmltaXRpdmVBcnJheSIsICJDYW4gb25seSBoYXZlIG9uZSBkaW1lbnNpb25hbCBhcnJheXMuIn0sCi0gICAgeyJydXN0X3ByaW1pdGl2ZUFycmF5IiwgIkNhbiBvbmx5IGhhdmUgb25lIGRpbWVuc2lvbmFsIGFycmF5cy4ifSwKLSAgICB7ImNwcF9TdHJpbmciLCAiIn0sCi0gICAgeyJqYXZhX1N0cmluZyIsICIifSwKLSAgICB7Im5ka19TdHJpbmciLCAiIn0sCi0gICAgeyJydXN0X1N0cmluZyIsICIifSwKLSAgICB7ImNwcF9TdHJpbmdBcnJheSIsICJDYW4gb25seSBoYXZlIG9uZSBkaW1lbnNpb25hbCBhcnJheXMuIn0sCi0gICAgeyJqYXZhX1N0cmluZ0FycmF5IiwgIkNhbiBvbmx5IGhhdmUgb25lIGRpbWVuc2lvbmFsIGFycmF5cy4ifSwKLSAgICB7Im5ka19TdHJpbmdBcnJheSIsICJDYW4gb25seSBoYXZlIG9uZSBkaW1lbnNpb25hbCBhcnJheXMuIn0sCi0gICAgeyJydXN0X1N0cmluZ0FycmF5IiwgIkNhbiBvbmx5IGhhdmUgb25lIGRpbWVuc2lvbmFsIGFycmF5cy4ifSwKLSAgICB7ImNwcF9JQmluZGVyIiwgIiJ9LAotICAgIHsiamF2YV9JQmluZGVyIiwgIiJ9LAotICAgIHsibmRrX0lCaW5kZXIiLCAiVGhlIG5kayBiYWNrZW5kIGRvZXMgbm90IHN1cHBvcnQgYXJyYXkgb2YgSUJpbmRlciJ9LAotICAgIHsicnVzdF9JQmluZGVyIiwgIlRoZSBydXN0IGJhY2tlbmQgZG9lcyBub3Qgc3VwcG9ydCBhcnJheSBvZiBJQmluZGVyIn0sCi0gICAgeyJjcHBfUGFyY2VsRmlsZURlc2NyaXB0b3IiLCAiIn0sCi0gICAgeyJqYXZhX1BhcmNlbEZpbGVEZXNjcmlwdG9yIiwgIiJ9LAotICAgIHsibmRrX1BhcmNlbEZpbGVEZXNjcmlwdG9yIiwgIiJ9LAotICAgIHsicnVzdF9QYXJjZWxGaWxlRGVzY3JpcHRvciIsICIifSwKLSAgICB7ImNwcF9pbnRlcmZhY2UiLCAiQmluZGVyIHR5cGUgY2Fubm90IGJlIGFuIGFycmF5In0sCi0gICAgeyJqYXZhX2ludGVyZmFjZSIsICJCaW5kZXIgdHlwZSBjYW5ub3QgYmUgYW4gYXJyYXkifSwKLSAgICB7Im5ka19pbnRlcmZhY2UiLCAiQmluZGVyIHR5cGUgY2Fubm90IGJlIGFuIGFycmF5In0sCi0gICAgeyJydXN0X2ludGVyZmFjZSIsICJCaW5kZXIgdHlwZSBjYW5ub3QgYmUgYW4gYXJyYXkifSwKLSAgICB7ImNwcF9wYXJjZWxhYmxlIiwgIiJ9LAotICAgIHsiamF2YV9wYXJjZWxhYmxlIiwgIiJ9LAotICAgIHsibmRrX3BhcmNlbGFibGUiLCAiIn0sCi0gICAgeyJydXN0X3BhcmNlbGFibGUiLCAiIn0sCi0gICAgeyJjcHBfZW51bSIsICIifSwKLSAgICB7ImphdmFfZW51bSIsICIifSwKLSAgICB7Im5ka19lbnVtIiwgIiJ9LAotICAgIHsicnVzdF9lbnVtIiwgIiJ9LAotICAgIHsiY3BwX3VuaW9uIiwgIiJ9LAotICAgIHsiamF2YV91bmlvbiIsICIifSwKLSAgICB7Im5ka191bmlvbiIsICIifSwKLSAgICB7InJ1c3RfdW5pb24iLCAiIn0sCitjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgRXhwZWN0ZWRSZXN1bHQ+IGtMaXN0U3VwcG9ydEV4cGVjdGF0aW9ucyA9IHsKKyAgICB7ImNwcF9wcmltaXRpdmUiLCB7IkEgZ2VuZXJpYyB0eXBlIGNhbm5vdCIsICJBIGdlbmVyaWMgdHlwZSBjYW5ub3QifX0sCisgICAgeyJqYXZhX3ByaW1pdGl2ZSIsIHsiQSBnZW5lcmljIHR5cGUgY2Fubm90IiwgIkEgZ2VuZXJpYyB0eXBlIGNhbm5vdCJ9fSwKKyAgICB7Im5ka19wcmltaXRpdmUiLCB7IkEgZ2VuZXJpYyB0eXBlIGNhbm5vdCIsICJBIGdlbmVyaWMgdHlwZSBjYW5ub3QifX0sCisgICAgeyJydXN0X3ByaW1pdGl2ZSIsIHsiQSBnZW5lcmljIHR5cGUgY2Fubm90IiwgIkEgZ2VuZXJpYyB0eXBlIGNhbm5vdCJ9fSwKKyAgICB7ImNwcF9wcmltaXRpdmVBcnJheSIsIHsiTGlzdCBvZiBhcnJheXMgaXMgbm90IHN1cHBvcnRlZCIsICJMaXN0IG9mIGFycmF5cyBpcyBub3Qgc3VwcG9ydGVkIn19LAorICAgIHsiamF2YV9wcmltaXRpdmVBcnJheSIsIHsiTGlzdCBvZiBhcnJheXMgaXMgbm90IHN1cHBvcnRlZCIsICJMaXN0IG9mIGFycmF5cyBpcyBub3Qgc3VwcG9ydGVkIn19LAorICAgIHsibmRrX3ByaW1pdGl2ZUFycmF5IiwgeyJMaXN0IG9mIGFycmF5cyBpcyBub3Qgc3VwcG9ydGVkIiwgIkxpc3Qgb2YgYXJyYXlzIGlzIG5vdCBzdXBwb3J0ZWQifX0sCisgICAgeyJydXN0X3ByaW1pdGl2ZUFycmF5IiwgeyJMaXN0IG9mIGFycmF5cyBpcyBub3Qgc3VwcG9ydGVkIiwgIkxpc3Qgb2YgYXJyYXlzIGlzIG5vdCBzdXBwb3J0ZWQifX0sCisgICAgeyJjcHBfcHJpbWl0aXZlRml4ZWRBcnJheSIsCisgICAgIHsiTGlzdCBvZiBhcnJheXMgaXMgbm90IHN1cHBvcnRlZCIsICJMaXN0IG9mIGFycmF5cyBpcyBub3Qgc3VwcG9ydGVkIn19LAorICAgIHsiamF2YV9wcmltaXRpdmVGaXhlZEFycmF5IiwKKyAgICAgeyJMaXN0IG9mIGFycmF5cyBpcyBub3Qgc3VwcG9ydGVkIiwgIkxpc3Qgb2YgYXJyYXlzIGlzIG5vdCBzdXBwb3J0ZWQifX0sCisgICAgeyJuZGtfcHJpbWl0aXZlRml4ZWRBcnJheSIsCisgICAgIHsiTGlzdCBvZiBhcnJheXMgaXMgbm90IHN1cHBvcnRlZCIsICJMaXN0IG9mIGFycmF5cyBpcyBub3Qgc3VwcG9ydGVkIn19LAorICAgIHsicnVzdF9wcmltaXRpdmVGaXhlZEFycmF5IiwKKyAgICAgeyJMaXN0IG9mIGFycmF5cyBpcyBub3Qgc3VwcG9ydGVkIiwgIkxpc3Qgb2YgYXJyYXlzIGlzIG5vdCBzdXBwb3J0ZWQifX0sCisgICAgeyJjcHBfU3RyaW5nIiwgeyIiLCAiIn19LAorICAgIHsiamF2YV9TdHJpbmciLCB7IiIsICIifX0sCisgICAgeyJuZGtfU3RyaW5nIiwgeyIiLCAiIn19LAorICAgIHsicnVzdF9TdHJpbmciLCB7IiIsICIifX0sCisgICAgeyJjcHBfU3RyaW5nQXJyYXkiLCB7Ikxpc3Qgb2YgYXJyYXlzIGlzIG5vdCBzdXBwb3J0ZWQiLCAiTGlzdCBvZiBhcnJheXMgaXMgbm90IHN1cHBvcnRlZCJ9fSwKKyAgICB7ImphdmFfU3RyaW5nQXJyYXkiLCB7Ikxpc3Qgb2YgYXJyYXlzIGlzIG5vdCBzdXBwb3J0ZWQiLCAiTGlzdCBvZiBhcnJheXMgaXMgbm90IHN1cHBvcnRlZCJ9fSwKKyAgICB7Im5ka19TdHJpbmdBcnJheSIsIHsiTGlzdCBvZiBhcnJheXMgaXMgbm90IHN1cHBvcnRlZCIsICJMaXN0IG9mIGFycmF5cyBpcyBub3Qgc3VwcG9ydGVkIn19LAorICAgIHsicnVzdF9TdHJpbmdBcnJheSIsIHsiTGlzdCBvZiBhcnJheXMgaXMgbm90IHN1cHBvcnRlZCIsICJMaXN0IG9mIGFycmF5cyBpcyBub3Qgc3VwcG9ydGVkIn19LAorICAgIHsiY3BwX0lCaW5kZXIiLCB7IiIsICIifX0sCisgICAgeyJqYXZhX0lCaW5kZXIiLCB7IiIsICIifX0sCisgICAgeyJuZGtfSUJpbmRlciIsIHsiIiwgIiJ9fSwKKyAgICB7InJ1c3RfSUJpbmRlciIsIHsiIiwgIiJ9fSwKKyAgICB7ImNwcF9QYXJjZWxGaWxlRGVzY3JpcHRvciIsIHsiIiwgIiJ9fSwKKyAgICB7ImphdmFfUGFyY2VsRmlsZURlc2NyaXB0b3IiLCB7IiIsICIifX0sCisgICAgeyJuZGtfUGFyY2VsRmlsZURlc2NyaXB0b3IiLCB7IiIsICIifX0sCisgICAgeyJydXN0X1BhcmNlbEZpbGVEZXNjcmlwdG9yIiwgeyIiLCAiIn19LAorICAgIHsiY3BwX2ludGVyZmFjZSIsIHsiIiwgIiJ9fSwKKyAgICB7ImphdmFfaW50ZXJmYWNlIiwgeyIiLCAiIn19LAorICAgIHsibmRrX2ludGVyZmFjZSIsIHsiIiwgIiJ9fSwKKyAgICB7InJ1c3RfaW50ZXJmYWNlIiwgeyIiLCAiIn19LAorICAgIHsiY3BwX3BhcmNlbGFibGUiLCB7IiIsICIifX0sCisgICAgeyJqYXZhX3BhcmNlbGFibGUiLCB7IiIsICIifX0sCisgICAgeyJuZGtfcGFyY2VsYWJsZSIsIHsiIiwgIiJ9fSwKKyAgICB7InJ1c3RfcGFyY2VsYWJsZSIsIHsiIiwgIiJ9fSwKKyAgICB7ImNwcF9lbnVtIiwgeyJBIGdlbmVyaWMgdHlwZSBjYW5ub3QiLCAiQSBnZW5lcmljIHR5cGUgY2Fubm90In19LAorICAgIHsiamF2YV9lbnVtIiwgeyJBIGdlbmVyaWMgdHlwZSBjYW5ub3QiLCAiQSBnZW5lcmljIHR5cGUgY2Fubm90In19LAorICAgIHsibmRrX2VudW0iLCB7IkEgZ2VuZXJpYyB0eXBlIGNhbm5vdCIsICJBIGdlbmVyaWMgdHlwZSBjYW5ub3QifX0sCisgICAgeyJydXN0X2VudW0iLCB7IkEgZ2VuZXJpYyB0eXBlIGNhbm5vdCIsICJBIGdlbmVyaWMgdHlwZSBjYW5ub3QifX0sCisgICAgeyJjcHBfdW5pb24iLCB7IiIsICIifX0sCisgICAgeyJqYXZhX3VuaW9uIiwgeyIiLCAiIn19LAorICAgIHsibmRrX3VuaW9uIiwgeyIiLCAiIn19LAorICAgIHsicnVzdF91bmlvbiIsIHsiIiwgIiJ9fSwKIH07CiAKLWNsYXNzIEFpZGxUeXBlUGFyYW1UZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08c3RkOjp0dXBsZTxPcHRpb25zOjpMYW5ndWFnZSwgVHlwZVBhcmFtPj4geworY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIEV4cGVjdGVkUmVzdWx0PiBrQXJyYXlTdXBwb3J0RXhwZWN0YXRpb25zID0geworICAgIHsiY3BwX3ByaW1pdGl2ZSIsIHsiIiwgIiJ9fSwKKyAgICB7ImphdmFfcHJpbWl0aXZlIiwgeyIiLCAiIn19LAorICAgIHsibmRrX3ByaW1pdGl2ZSIsIHsiIiwgIiJ9fSwKKyAgICB7InJ1c3RfcHJpbWl0aXZlIiwgeyIiLCAiIn19LAorICAgIHsiY3BwX3ByaW1pdGl2ZUFycmF5IiwKKyAgICAgeyJNdWx0aS1kaW1lbnNpb25hbCBhcnJheXMgbXVzdCBiZSBmaXhlZCBzaXplLiIsCisgICAgICAiTXVsdGktZGltZW5zaW9uYWwgYXJyYXlzIG11c3QgYmUgZml4ZWQgc2l6ZS4ifX0sCisgICAgeyJqYXZhX3ByaW1pdGl2ZUFycmF5IiwKKyAgICAgeyJNdWx0aS1kaW1lbnNpb25hbCBhcnJheXMgbXVzdCBiZSBmaXhlZCBzaXplLiIsCisgICAgICAiTXVsdGktZGltZW5zaW9uYWwgYXJyYXlzIG11c3QgYmUgZml4ZWQgc2l6ZS4ifX0sCisgICAgeyJuZGtfcHJpbWl0aXZlQXJyYXkiLAorICAgICB7Ik11bHRpLWRpbWVuc2lvbmFsIGFycmF5cyBtdXN0IGJlIGZpeGVkIHNpemUuIiwKKyAgICAgICJNdWx0aS1kaW1lbnNpb25hbCBhcnJheXMgbXVzdCBiZSBmaXhlZCBzaXplLiJ9fSwKKyAgICB7InJ1c3RfcHJpbWl0aXZlQXJyYXkiLAorICAgICB7Ik11bHRpLWRpbWVuc2lvbmFsIGFycmF5cyBtdXN0IGJlIGZpeGVkIHNpemUuIiwKKyAgICAgICJNdWx0aS1kaW1lbnNpb25hbCBhcnJheXMgbXVzdCBiZSBmaXhlZCBzaXplLiJ9fSwKKyAgICB7ImNwcF9wcmltaXRpdmVGaXhlZEFycmF5IiwKKyAgICAgeyJNdWx0aS1kaW1lbnNpb25hbCBhcnJheXMgbXVzdCBiZSBmaXhlZCBzaXplLiIsCisgICAgICAiTXVsdGktZGltZW5zaW9uYWwgYXJyYXlzIG11c3QgYmUgZml4ZWQgc2l6ZS4ifX0sCisgICAgeyJqYXZhX3ByaW1pdGl2ZUZpeGVkQXJyYXkiLAorICAgICB7Ik11bHRpLWRpbWVuc2lvbmFsIGFycmF5cyBtdXN0IGJlIGZpeGVkIHNpemUuIiwKKyAgICAgICJNdWx0aS1kaW1lbnNpb25hbCBhcnJheXMgbXVzdCBiZSBmaXhlZCBzaXplLiJ9fSwKKyAgICB7Im5ka19wcmltaXRpdmVGaXhlZEFycmF5IiwKKyAgICAgeyJNdWx0aS1kaW1lbnNpb25hbCBhcnJheXMgbXVzdCBiZSBmaXhlZCBzaXplLiIsCisgICAgICAiTXVsdGktZGltZW5zaW9uYWwgYXJyYXlzIG11c3QgYmUgZml4ZWQgc2l6ZS4ifX0sCisgICAgeyJydXN0X3ByaW1pdGl2ZUZpeGVkQXJyYXkiLAorICAgICB7Ik11bHRpLWRpbWVuc2lvbmFsIGFycmF5cyBtdXN0IGJlIGZpeGVkIHNpemUuIiwKKyAgICAgICJNdWx0aS1kaW1lbnNpb25hbCBhcnJheXMgbXVzdCBiZSBmaXhlZCBzaXplLiJ9fSwKKyAgICB7ImNwcF9TdHJpbmciLCB7IiIsICIifX0sCisgICAgeyJqYXZhX1N0cmluZyIsIHsiIiwgIiJ9fSwKKyAgICB7Im5ka19TdHJpbmciLCB7IiIsICIifX0sCisgICAgeyJydXN0X1N0cmluZyIsIHsiIiwgIiJ9fSwKKyAgICB7ImNwcF9TdHJpbmdBcnJheSIsCisgICAgIHsiTXVsdGktZGltZW5zaW9uYWwgYXJyYXlzIG11c3QgYmUgZml4ZWQgc2l6ZS4iLAorICAgICAgIk11bHRpLWRpbWVuc2lvbmFsIGFycmF5cyBtdXN0IGJlIGZpeGVkIHNpemUuIn19LAorICAgIHsiamF2YV9TdHJpbmdBcnJheSIsCisgICAgIHsiTXVsdGktZGltZW5zaW9uYWwgYXJyYXlzIG11c3QgYmUgZml4ZWQgc2l6ZS4iLAorICAgICAgIk11bHRpLWRpbWVuc2lvbmFsIGFycmF5cyBtdXN0IGJlIGZpeGVkIHNpemUuIn19LAorICAgIHsibmRrX1N0cmluZ0FycmF5IiwKKyAgICAgeyJNdWx0aS1kaW1lbnNpb25hbCBhcnJheXMgbXVzdCBiZSBmaXhlZCBzaXplLiIsCisgICAgICAiTXVsdGktZGltZW5zaW9uYWwgYXJyYXlzIG11c3QgYmUgZml4ZWQgc2l6ZS4ifX0sCisgICAgeyJydXN0X1N0cmluZ0FycmF5IiwKKyAgICAgeyJNdWx0aS1kaW1lbnNpb25hbCBhcnJheXMgbXVzdCBiZSBmaXhlZCBzaXplLiIsCisgICAgICAiTXVsdGktZGltZW5zaW9uYWwgYXJyYXlzIG11c3QgYmUgZml4ZWQgc2l6ZS4ifX0sCisgICAgeyJjcHBfSUJpbmRlciIsIHsiIiwgIiJ9fSwKKyAgICB7ImphdmFfSUJpbmRlciIsIHsiIiwgIiJ9fSwKKyAgICB7Im5ka19JQmluZGVyIiwgeyIiLCAiIn19LAorICAgIHsicnVzdF9JQmluZGVyIiwgeyIiLCAiIn19LAorICAgIHsiY3BwX1BhcmNlbEZpbGVEZXNjcmlwdG9yIiwgeyIiLCAiIn19LAorICAgIHsiamF2YV9QYXJjZWxGaWxlRGVzY3JpcHRvciIsIHsiIiwgIiJ9fSwKKyAgICB7Im5ka19QYXJjZWxGaWxlRGVzY3JpcHRvciIsIHsiIiwgIiJ9fSwKKyAgICB7InJ1c3RfUGFyY2VsRmlsZURlc2NyaXB0b3IiLCB7IiIsICIifX0sCisgICAgeyJjcHBfaW50ZXJmYWNlIiwgeyIiLCAiIn19LAorICAgIHsiamF2YV9pbnRlcmZhY2UiLCB7IiIsICIifX0sCisgICAgeyJuZGtfaW50ZXJmYWNlIiwgeyIiLCAiIn19LAorICAgIHsicnVzdF9pbnRlcmZhY2UiLCB7IiIsICIifX0sCisgICAgeyJjcHBfcGFyY2VsYWJsZSIsIHsiIiwgIiJ9fSwKKyAgICB7ImphdmFfcGFyY2VsYWJsZSIsIHsiIiwgIiJ9fSwKKyAgICB7Im5ka19wYXJjZWxhYmxlIiwgeyIiLCAiIn19LAorICAgIHsicnVzdF9wYXJjZWxhYmxlIiwgeyIiLCAiIn19LAorICAgIHsiY3BwX2VudW0iLCB7IiIsICIifX0sCisgICAgeyJqYXZhX2VudW0iLCB7IiIsICIifX0sCisgICAgeyJuZGtfZW51bSIsIHsiIiwgIiJ9fSwKKyAgICB7InJ1c3RfZW51bSIsIHsiIiwgIiJ9fSwKKyAgICB7ImNwcF91bmlvbiIsIHsiIiwgIiJ9fSwKKyAgICB7ImphdmFfdW5pb24iLCB7IiIsICIifX0sCisgICAgeyJuZGtfdW5pb24iLCB7IiIsICIifX0sCisgICAgeyJydXN0X3VuaW9uIiwgeyIiLCAiIn19LAorfTsKKworY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIEV4cGVjdGVkUmVzdWx0PiBrRmllbGRTdXBwb3J0RXhwZWN0YXRpb25zID0geworICAgIHsiY3BwX3ByaW1pdGl2ZSIsIHsiIiwgImNhbm5vdCBnZXQgbnVsbGFibGUgYW5ub3RhdGlvbiJ9fSwKKyAgICB7ImphdmFfcHJpbWl0aXZlIiwgeyIiLCAiY2Fubm90IGdldCBudWxsYWJsZSBhbm5vdGF0aW9uIn19LAorICAgIHsibmRrX3ByaW1pdGl2ZSIsIHsiIiwgImNhbm5vdCBnZXQgbnVsbGFibGUgYW5ub3RhdGlvbiJ9fSwKKyAgICB7InJ1c3RfcHJpbWl0aXZlIiwgeyIiLCAiY2Fubm90IGdldCBudWxsYWJsZSBhbm5vdGF0aW9uIn19LAorICAgIHsiY3BwX3ByaW1pdGl2ZUFycmF5IiwgeyIiLCAiIn19LAorICAgIHsiamF2YV9wcmltaXRpdmVBcnJheSIsIHsiIiwgIiJ9fSwKKyAgICB7Im5ka19wcmltaXRpdmVBcnJheSIsIHsiIiwgIiJ9fSwKKyAgICB7InJ1c3RfcHJpbWl0aXZlQXJyYXkiLCB7IiIsICIifX0sCisgICAgeyJjcHBfcHJpbWl0aXZlRml4ZWRBcnJheSIsIHsiIiwgIiJ9fSwKKyAgICB7ImphdmFfcHJpbWl0aXZlRml4ZWRBcnJheSIsIHsiIiwgIiJ9fSwKKyAgICB7Im5ka19wcmltaXRpdmVGaXhlZEFycmF5IiwgeyIiLCAiIn19LAorICAgIHsicnVzdF9wcmltaXRpdmVGaXhlZEFycmF5IiwgeyIiLCAiIn19LAorICAgIHsiY3BwX1N0cmluZyIsIHsiIiwgIiJ9fSwKKyAgICB7ImphdmFfU3RyaW5nIiwgeyIiLCAiIn19LAorICAgIHsibmRrX1N0cmluZyIsIHsiIiwgIiJ9fSwKKyAgICB7InJ1c3RfU3RyaW5nIiwgeyIiLCAiIn19LAorICAgIHsiY3BwX1N0cmluZ0FycmF5IiwgeyIiLCAiIn19LAorICAgIHsiamF2YV9TdHJpbmdBcnJheSIsIHsiIiwgIiJ9fSwKKyAgICB7Im5ka19TdHJpbmdBcnJheSIsIHsiIiwgIiJ9fSwKKyAgICB7InJ1c3RfU3RyaW5nQXJyYXkiLCB7IiIsICIifX0sCisgICAgeyJjcHBfSUJpbmRlciIsIHsiIiwgIiJ9fSwKKyAgICB7ImphdmFfSUJpbmRlciIsIHsiIiwgIiJ9fSwKKyAgICB7Im5ka19JQmluZGVyIiwgeyIiLCAiIn19LAorICAgIHsicnVzdF9JQmluZGVyIiwgeyIiLCAiIn19LAorICAgIHsiY3BwX1BhcmNlbEZpbGVEZXNjcmlwdG9yIiwgeyIiLCAiIn19LAorICAgIHsiamF2YV9QYXJjZWxGaWxlRGVzY3JpcHRvciIsIHsiIiwgIiJ9fSwKKyAgICB7Im5ka19QYXJjZWxGaWxlRGVzY3JpcHRvciIsIHsiIiwgIiJ9fSwKKyAgICB7InJ1c3RfUGFyY2VsRmlsZURlc2NyaXB0b3IiLCB7IiIsICIifX0sCisgICAgeyJjcHBfaW50ZXJmYWNlIiwgeyIiLCAiIn19LAorICAgIHsiamF2YV9pbnRlcmZhY2UiLCB7IiIsICIifX0sCisgICAgeyJuZGtfaW50ZXJmYWNlIiwgeyIiLCAiIn19LAorICAgIHsicnVzdF9pbnRlcmZhY2UiLCB7IiIsICIifX0sCisgICAgeyJjcHBfcGFyY2VsYWJsZSIsIHsiIiwgIiJ9fSwKKyAgICB7ImphdmFfcGFyY2VsYWJsZSIsIHsiIiwgIiJ9fSwKKyAgICB7Im5ka19wYXJjZWxhYmxlIiwgeyIiLCAiIn19LAorICAgIHsicnVzdF9wYXJjZWxhYmxlIiwgeyIiLCAiIn19LAorICAgIHsiY3BwX2VudW0iLCB7IiIsICJjYW5ub3QgZ2V0IG51bGxhYmxlIGFubm90YXRpb24ifX0sCisgICAgeyJqYXZhX2VudW0iLCB7IiIsICJjYW5ub3QgZ2V0IG51bGxhYmxlIGFubm90YXRpb24ifX0sCisgICAgeyJuZGtfZW51bSIsIHsiIiwgImNhbm5vdCBnZXQgbnVsbGFibGUgYW5ub3RhdGlvbiJ9fSwKKyAgICB7InJ1c3RfZW51bSIsIHsiIiwgImNhbm5vdCBnZXQgbnVsbGFibGUgYW5ub3RhdGlvbiJ9fSwKKyAgICB7ImNwcF91bmlvbiIsIHsiIiwgIiJ9fSwKKyAgICB7ImphdmFfdW5pb24iLCB7IiIsICIifX0sCisgICAgeyJuZGtfdW5pb24iLCB7IiIsICIifX0sCisgICAgeyJydXN0X3VuaW9uIiwgeyIiLCAiIn19LAorfTsKKworY2xhc3MgQWlkbFR5cGVQYXJhbVRlc3QKKyAgICA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHN0ZDo6dHVwbGU8T3B0aW9uczo6TGFuZ3VhZ2UsIFR5cGVQYXJhbSwgYm9vbD4+IHsKICBwdWJsaWM6CiAgIHZvaWQgUnVuKGNvbnN0IHN0ZDo6c3RyaW5nJiBnZW5lcmljX3R5cGVfZGVjbCwKLSAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgZXhwZWN0YXRpb25zKSB7CisgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBFeHBlY3RlZFJlc3VsdD4mIGV4cGVjdGF0aW9ucykgewogICAgIGNvbnN0IGF1dG8mIHBhcmFtID0gR2V0UGFyYW0oKTsKICAgICBjb25zdCBhdXRvJiBsYW5nID0gdG9fc3RyaW5nKHN0ZDo6Z2V0PDA+KHBhcmFtKSk7CiAgICAgY29uc3QgYXV0byYga2luZCA9IHN0ZDo6Z2V0PDE+KHBhcmFtKS5raW5kOworICAgIGNvbnN0IGJvb2wgbnVsbGFibGUgPSBzdGQ6OmdldDwyPihwYXJhbSk7CiAKICAgICBGYWtlSW9EZWxlZ2F0ZSBpbzsKICAgICBpby5TZXRGaWxlQ29udGVudHMoImEvSUJhci5haWRsIiwgInBhY2thZ2UgYTsgaW50ZXJmYWNlIElCYXIgeyB9Iik7CiAgICAgaW8uU2V0RmlsZUNvbnRlbnRzKCJhL0VudW0uYWlkbCIsICJwYWNrYWdlIGE7IGVudW0gRW51bSB7IEEgfSIpOwogICAgIGlvLlNldEZpbGVDb250ZW50cygiYS9Vbmlvbi5haWRsIiwgInBhY2thZ2UgYTsgdW5pb24gVW5pb24geyBpbnQgYTsgfSIpOworICAgIGlvLlNldEZpbGVDb250ZW50cygiYS9Gb28uYWlkbCIsICJwYWNrYWdlIGE7IHBhcmNlbGFibGUgRm9vIHsgaW50IGE7IH0iKTsKICAgICBzdGQ6OnN0cmluZyBkZWNsID0gZm10Ojpmb3JtYXQoZ2VuZXJpY190eXBlX2RlY2wsIHN0ZDo6Z2V0PDE+KHBhcmFtKS5saXRlcmFsKTsKLSAgICBpby5TZXRGaWxlQ29udGVudHMoImEvRm9vLmFpZGwiLCAicGFja2FnZSBhOyBwYXJjZWxhYmxlIEZvbyB7ICIgKyBkZWNsICsgIiBmOyB9Iik7CisgICAgaWYgKG51bGxhYmxlKSB7CisgICAgICBkZWNsID0gIkBudWxsYWJsZSAiICsgZGVjbDsKKyAgICB9CisgICAgaW8uU2V0RmlsZUNvbnRlbnRzKCJhL1RhcmdldC5haWRsIiwgInBhY2thZ2UgYTsgcGFyY2VsYWJsZSBUYXJnZXQgeyAiICsgZGVjbCArICIgZjsgfSIpOwogCi0gICAgY29uc3QgYXV0byBvcHRpb25zID0KLSAgICAgICAgT3B0aW9uczo6RnJvbShmbXQ6OmZvcm1hdCgiYWlkbCAtSSAuIC0tbGFuZz17fSBhL0Zvby5haWRsIC1vIG91dCAtaCBvdXQiLCBsYW5nKSk7CisgICAgY29uc3QgYXV0byBvcHRpb25zID0gT3B0aW9uczo6RnJvbShmbXQ6OmZvcm1hdCgKKyAgICAgICAgImFpZGwgLUkgLiAtLW1pbl9zZGtfdmVyc2lvbiBjdXJyZW50IC0tbGFuZz17fSBhL1RhcmdldC5haWRsIC1vIG91dCAtaCBvdXQiLCBsYW5nKSk7CiAgICAgQ2FwdHVyZVN0ZGVycigpOwogICAgIGNvbXBpbGVfYWlkbChvcHRpb25zLCBpbyk7CiAgICAgYXV0byBpdCA9IGV4cGVjdGF0aW9ucy5maW5kKGxhbmcgKyAiXyIgKyBraW5kKTsKLSAgICBFWFBFQ1RfVFJVRShpdCAhPSBleHBlY3RhdGlvbnMuZW5kKCkpOworICAgIEFTU0VSVF9UUlVFKGl0ICE9IGV4cGVjdGF0aW9ucy5lbmQoKSkgPDwgIm1pc3NpbmcgZXhwZWN0YXRpb24gZm9yICIgPDwgbGFuZyA8PCAiXyIgPDwga2luZDsKICAgICBjb25zdCBzdHJpbmcgZXJyID0gR2V0Q2FwdHVyZWRTdGRlcnIoKTsKLSAgICBpZiAoaXQtPnNlY29uZC5lbXB0eSgpKSB7CisgICAgY29uc3Qgc3RyaW5nIGV4cGVjdGVkX2Vycm9yID0KKyAgICAgICAgbnVsbGFibGUgPyBpdC0+c2Vjb25kLmV4cGVjdGVkX2Vycm9yX2Zvcl9udWxsYWJsZSA6IGl0LT5zZWNvbmQuZXhwZWN0ZWRfZXJyb3I7CisgICAgaWYgKGV4cGVjdGVkX2Vycm9yLmVtcHR5KCkpIHsKICAgICAgIEVYUEVDVF9FUSgiIiwgZXJyKTsKICAgICB9IGVsc2UgewotICAgICAgRVhQRUNUX1RIQVQoZXJyLCB0ZXN0aW5nOjpIYXNTdWJzdHIoaXQtPnNlY29uZCkpOworICAgICAgRVhQRUNUX1RIQVQoZXJyLCB0ZXN0aW5nOjpIYXNTdWJzdHIoZXhwZWN0ZWRfZXJyb3IpKTsKICAgICB9CiAgIH0KIH07CkBAIC00MDYwLDkgKzU0MjksMTMgQEAKICAgICBBaWRsVGVzdFN1aXRlLCBBaWRsVHlwZVBhcmFtVGVzdCwKICAgICB0ZXN0aW5nOjpDb21iaW5lKHRlc3Rpbmc6OlZhbHVlcyhPcHRpb25zOjpMYW5ndWFnZTo6Q1BQLCBPcHRpb25zOjpMYW5ndWFnZTo6SkFWQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25zOjpMYW5ndWFnZTo6TkRLLCBPcHRpb25zOjpMYW5ndWFnZTo6UlVTVCksCi0gICAgICAgICAgICAgICAgICAgICB0ZXN0aW5nOjpWYWx1ZXNJbihrVHlwZVBhcmFtcykpLAotICAgIFtdKGNvbnN0IHRlc3Rpbmc6OlRlc3RQYXJhbUluZm88c3RkOjp0dXBsZTxPcHRpb25zOjpMYW5ndWFnZSwgVHlwZVBhcmFtPj4mIGluZm8pIHsKLSAgICAgIHJldHVybiB0b19zdHJpbmcoc3RkOjpnZXQ8MD4oaW5mby5wYXJhbSkpICsgIl8iICsgc3RkOjpnZXQ8MT4oaW5mby5wYXJhbSkua2luZDsKKyAgICAgICAgICAgICAgICAgICAgIHRlc3Rpbmc6OlZhbHVlc0luKGtUeXBlUGFyYW1zKSwgdGVzdGluZzo6VmFsdWVzKHRydWUsIGZhbHNlKSksCisgICAgW10oY29uc3QgdGVzdGluZzo6VGVzdFBhcmFtSW5mbzxzdGQ6OnR1cGxlPE9wdGlvbnM6Okxhbmd1YWdlLCBUeXBlUGFyYW0sIGJvb2w+PiYgaW5mbykgeworICAgICAgc3RyaW5nIG5hbWUgPSB0b19zdHJpbmcoc3RkOjpnZXQ8MD4oaW5mby5wYXJhbSkpICsgIl8iICsgc3RkOjpnZXQ8MT4oaW5mby5wYXJhbSkua2luZDsKKyAgICAgIGlmIChzdGQ6OmdldDwyPihpbmZvLnBhcmFtKSkgeworICAgICAgICBuYW1lICs9ICJfbnVsbGFibGUiOworICAgICAgfQorICAgICAgcmV0dXJuIG5hbWU7CiAgICAgfSk7CiAKIFRFU1RfUChBaWRsVHlwZVBhcmFtVGVzdCwgTGlzdFN1cHBvcnRlZFR5cGVzKSB7CkBAIC00MDczLDUgKzU0NDYsOSBAQAogICBSdW4oInt9W10iLCBrQXJyYXlTdXBwb3J0RXhwZWN0YXRpb25zKTsKIH0KIAorVEVTVF9QKEFpZGxUeXBlUGFyYW1UZXN0LCBQYXJjZWxhYmxlRmllbGRUeXBlcykgeworICBSdW4oInt9Iiwga0ZpZWxkU3VwcG9ydEV4cGVjdGF0aW9ucyk7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhaWRsCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYXN0X2NwcC5jcHAgYi9hc3RfY3BwLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzlhZjI0Yy4uMDAwMDAwMAotLS0gYS9hc3RfY3BwLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ5OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImFzdF9jcHAuaCIKLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLQotI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdzLmg+Ci0KLSNpbmNsdWRlICJjb2RlX3dyaXRlci5oIgotI2luY2x1ZGUgImxvZ2dpbmcuaCIKLQotdXNpbmcgc3RkOjpzdHJpbmc7Ci11c2luZyBzdGQ6OnVuaXF1ZV9wdHI7Ci11c2luZyBzdGQ6OnZlY3RvcjsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGFpZGwgewotbmFtZXNwYWNlIGNwcCB7Ci0KLXN0ZDo6c3RyaW5nIEFzdE5vZGU6OlRvU3RyaW5nKCkgewotICBzdGQ6OnN0cmluZyBzdHI7Ci0gIFdyaXRlKENvZGVXcml0ZXI6OkZvclN0cmluZygmc3RyKS5nZXQoKSk7Ci0gIHJldHVybiBzdHI7Ci19Ci0KLUxpdGVyYWxEZWNsOjpMaXRlcmFsRGVjbChjb25zdCBzdGQ6OnN0cmluZyYgZXhwcmVzc2lvbikgOiBleHByZXNzaW9uXyhleHByZXNzaW9uKSB7fQotCi12b2lkIExpdGVyYWxEZWNsOjpXcml0ZShDb2RlV3JpdGVyKiB0bykgY29uc3QgewotICB0by0+V3JpdGUoIiVzIiwgZXhwcmVzc2lvbl8uY19zdHIoKSk7Ci19Ci0KLUNsYXNzRGVjbDo6Q2xhc3NEZWNsKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgcGFyZW50LAotICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiB0ZW1wbGF0ZV9wYXJhbXMsIGNvbnN0IHN0ZDo6c3RyaW5nJiBhdHRyaWJ1dGVzKQotICAgIDogbmFtZV8obmFtZSksIHBhcmVudF8ocGFyZW50KSwgYXR0cmlidXRlc18oYXR0cmlidXRlcyksIHRlbXBsYXRlX3BhcmFtc18odGVtcGxhdGVfcGFyYW1zKSB7fQotCi1DbGFzc0RlY2w6OkNsYXNzRGVjbChjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgdGVtcGxhdGVfcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dW5pcXVlX3B0cjxEZWNsYXJhdGlvbj4+IHB1YmxpY19tZW1iZXJzLAotICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dW5pcXVlX3B0cjxEZWNsYXJhdGlvbj4+IHByaXZhdGVfbWVtYmVycywKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhdHRyaWJ1dGVzKQotICAgIDogbmFtZV8obmFtZSksCi0gICAgICBwYXJlbnRfKHBhcmVudCksCi0gICAgICBhdHRyaWJ1dGVzXyhhdHRyaWJ1dGVzKSwKLSAgICAgIHRlbXBsYXRlX3BhcmFtc18odGVtcGxhdGVfcGFyYW1zKSwKLSAgICAgIHB1YmxpY19tZW1iZXJzXyhzdGQ6Om1vdmUocHVibGljX21lbWJlcnMpKSwKLSAgICAgIHByaXZhdGVfbWVtYmVyc18oc3RkOjptb3ZlKHByaXZhdGVfbWVtYmVycykpIHt9Ci0KLXZvaWQgQ2xhc3NEZWNsOjpXcml0ZShDb2RlV3JpdGVyKiB0bykgY29uc3QgewotICBpZiAoIXRlbXBsYXRlX3BhcmFtc18uZW1wdHkoKSkKLSAgICB0by0+V3JpdGUoInRlbXBsYXRlIDx0eXBlbmFtZSAlcz5cbiIsIGJhc2U6OkpvaW4odGVtcGxhdGVfcGFyYW1zXywgIiwgdHlwZW5hbWUgIikuY19zdHIoKSk7Ci0KLSAgdG8tPldyaXRlKCJjbGFzcyIpOwotICBpZiAoIWF0dHJpYnV0ZXNfLmVtcHR5KCkpIHsKLSAgICB0by0+V3JpdGUoIiAlcyIsIGF0dHJpYnV0ZXNfLmNfc3RyKCkpOwotICB9Ci0gIHRvLT5Xcml0ZSgiICVzICIsIG5hbWVfLmNfc3RyKCkpOwotCi0gIGlmIChwYXJlbnRfLmxlbmd0aCgpID4gMCkgdG8tPldyaXRlKCI6IHB1YmxpYyAlcyAiLCBwYXJlbnRfLmNfc3RyKCkpOwotCi0gIHRvLT5Xcml0ZSgie1xuIik7Ci0KLSAgaWYgKCFwdWJsaWNfbWVtYmVyc18uZW1wdHkoKSkgdG8tPldyaXRlKCJwdWJsaWM6XG4iKTsKLQotICB0by0+SW5kZW50KCk7Ci0gIGZvciAoY29uc3QgYXV0byYgZGVjIDogcHVibGljX21lbWJlcnNfKQotICAgIGRlYy0+V3JpdGUodG8pOwotICB0by0+RGVkZW50KCk7Ci0KLSAgaWYgKCFwcml2YXRlX21lbWJlcnNfLmVtcHR5KCkpIHRvLT5Xcml0ZSgicHJpdmF0ZTpcbiIpOwotCi0gIHRvLT5JbmRlbnQoKTsKLSAgZm9yIChjb25zdCBhdXRvJiBkZWMgOiBwcml2YXRlX21lbWJlcnNfKQotICAgIGRlYy0+V3JpdGUodG8pOwotICB0by0+RGVkZW50KCk7Ci0KLSAgdG8tPldyaXRlKCJ9OyAgLy8gY2xhc3MgJXNcbiIsIG5hbWVfLmNfc3RyKCkpOwotfQotCi12b2lkIENsYXNzRGVjbDo6QWRkUHVibGljKHN0ZDo6dW5pcXVlX3B0cjxEZWNsYXJhdGlvbj4gbWVtYmVyKSB7Ci0gIHB1YmxpY19tZW1iZXJzXy5wdXNoX2JhY2soc3RkOjptb3ZlKG1lbWJlcikpOwotfQotCi12b2lkIENsYXNzRGVjbDo6QWRkUHJpdmF0ZShzdGQ6OnVuaXF1ZV9wdHI8RGVjbGFyYXRpb24+IG1lbWJlcikgewotICBwcml2YXRlX21lbWJlcnNfLnB1c2hfYmFjayhzdGQ6Om1vdmUobWVtYmVyKSk7Ci19Ci0KLUVudW06OkVudW1GaWVsZDo6RW51bUZpZWxkKGNvbnN0IHN0cmluZyYgaywgY29uc3Qgc3RyaW5nJiB2LCBjb25zdCBzdHJpbmcmIGEpCi0gICAgOiBrZXkoayksIHZhbHVlKHYpLCBhdHRyaWJ1dGUoYSkge30KLQotRW51bTo6RW51bShjb25zdCBzdHJpbmcmIG5hbWUsIGNvbnN0IHN0cmluZyYgYmFzZV90eXBlLCBib29sIGlzX2NsYXNzLAotICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYXR0cmlidXRlcykKLSAgICA6IGVudW1fbmFtZV8obmFtZSksIHVuZGVybHlpbmdfdHlwZV8oYmFzZV90eXBlKSwgYXR0cmlidXRlc18oYXR0cmlidXRlcyksIGlzX2NsYXNzXyhpc19jbGFzcykge30KLQotdm9pZCBFbnVtOjpXcml0ZShDb2RlV3JpdGVyKiB0bykgY29uc3QgewotICB0by0+V3JpdGUoImVudW0gIik7Ci0gIGlmIChpc19jbGFzc18pIHsKLSAgICB0by0+V3JpdGUoImNsYXNzICIpOwotICB9Ci0gIGlmICghYXR0cmlidXRlc18uZW1wdHkoKSkgewotICAgIHRvLT5Xcml0ZSgiJXMgIiwgYXR0cmlidXRlc18uY19zdHIoKSk7Ci0gIH0KLSAgaWYgKHVuZGVybHlpbmdfdHlwZV8uZW1wdHkoKSkgewotICAgIHRvLT5Xcml0ZSgiJXMge1xuIiwgZW51bV9uYW1lXy5jX3N0cigpKTsKLSAgfSBlbHNlIHsKLSAgICB0by0+V3JpdGUoIiVzIDogJXMge1xuIiwgZW51bV9uYW1lXy5jX3N0cigpLCB1bmRlcmx5aW5nX3R5cGVfLmNfc3RyKCkpOwotICB9Ci0gIHRvLT5JbmRlbnQoKTsKLSAgZm9yIChjb25zdCBhdXRvJiBmaWVsZCA6IGZpZWxkc18pIHsKLSAgICB0by0+V3JpdGUoIiVzIiwgZmllbGQua2V5LmNfc3RyKCkpOwotICAgIGlmICghZmllbGQuYXR0cmlidXRlLmVtcHR5KCkpIHsKLSAgICAgIHRvLT5Xcml0ZSgiICVzIiwgZmllbGQuYXR0cmlidXRlLmNfc3RyKCkpOwotICAgIH0KLSAgICBpZiAoIWZpZWxkLnZhbHVlLmVtcHR5KCkpIHsKLSAgICAgIHRvLT5Xcml0ZSgiID0gJXMiLCBmaWVsZC52YWx1ZS5jX3N0cigpKTsKLSAgICB9Ci0gICAgdG8tPldyaXRlKCIsXG4iKTsKLSAgfQotICB0by0+RGVkZW50KCk7Ci0gIHRvLT5Xcml0ZSgifTtcbiIpOwotfQotCi12b2lkIEVudW06OkFkZFZhbHVlKGNvbnN0IHN0cmluZyYga2V5LCBjb25zdCBzdHJpbmcmIHZhbHVlLCBjb25zdCBzdHJpbmcmIGF0dHJpYnV0ZSkgewotICBmaWVsZHNfLmVtcGxhY2VfYmFjayhrZXksIHZhbHVlLCBhdHRyaWJ1dGUpOwotfQotCi1BcmdMaXN0OjpBcmdMaXN0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzaW5nbGVfYXJndW1lbnQpCi0gICAgOiBBcmdMaXN0KHZlY3RvcjxzdHJpbmc+e3NpbmdsZV9hcmd1bWVudH0pIHt9Ci0KLUFyZ0xpc3Q6OkFyZ0xpc3QoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBhcmdfbGlzdCkgewotICBmb3IgKGNvbnN0IGF1dG8mIHMgOiBhcmdfbGlzdCkgewotICAgIGFyZ3VtZW50c18uZW1wbGFjZV9iYWNrKG5ldyBMaXRlcmFsRXhwcmVzc2lvbihzKSk7Ci0gIH0KLX0KLQotQXJnTGlzdDo6QXJnTGlzdChzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QXN0Tm9kZT4+IGFyZ19saXN0KQotICAgIDogYXJndW1lbnRzXyhzdGQ6Om1vdmUoYXJnX2xpc3QpKSB7fQotCi1BcmdMaXN0OjpBcmdMaXN0KEFyZ0xpc3QmJiBhcmdfbGlzdCkgbm9leGNlcHQgOiBhcmd1bWVudHNfKHN0ZDo6bW92ZShhcmdfbGlzdC5hcmd1bWVudHNfKSkge30KLQotdm9pZCBBcmdMaXN0OjpXcml0ZShDb2RlV3JpdGVyKiB0bykgY29uc3QgewotICB0by0+V3JpdGUoIigiKTsKLSAgYm9vbCBpc19maXJzdCA9IHRydWU7Ci0gIGZvciAoY29uc3QgYXV0byYgcyA6IGFyZ3VtZW50c18pIHsKLSAgICBpZiAoIWlzX2ZpcnN0KSB7IHRvLT5Xcml0ZSgiLCAiKTsgfQotICAgIGlzX2ZpcnN0ID0gZmFsc2U7Ci0gICAgcy0+V3JpdGUodG8pOwotICB9Ci0gIHRvLT5Xcml0ZSgiKSIpOwotfQotCi1Db25zdHJ1Y3RvckRlY2w6OkNvbnN0cnVjdG9yRGVjbCgKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICBBcmdMaXN0JiYgYXJnX2xpc3QpCi0gICAgOiBDb25zdHJ1Y3RvckRlY2wobmFtZSwgc3RkOjptb3ZlKGFyZ19saXN0KSwgMHUpIHt9Ci0KLUNvbnN0cnVjdG9yRGVjbDo6Q29uc3RydWN0b3JEZWNsKAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgIEFyZ0xpc3QmJiBhcmdfbGlzdCwKLSAgICB1aW50MzJfdCBtb2RpZmllcnMpCi0gICAgOiBuYW1lXyhuYW1lKSwKLSAgICAgIGFyZ3VtZW50c18oc3RkOjptb3ZlKGFyZ19saXN0KSksCi0gICAgICBtb2RpZmllcnNfKG1vZGlmaWVycykge30KLQotdm9pZCBDb25zdHJ1Y3RvckRlY2w6OldyaXRlKENvZGVXcml0ZXIqIHRvKSBjb25zdCB7Ci0gIGlmIChtb2RpZmllcnNfICYgTW9kaWZpZXJzOjpJU19WSVJUVUFMKQotICAgIHRvLT5Xcml0ZSgidmlydHVhbCAiKTsKLQotICBpZiAobW9kaWZpZXJzXyAmIE1vZGlmaWVyczo6SVNfRVhQTElDSVQpCi0gICAgdG8tPldyaXRlKCJleHBsaWNpdCAiKTsKLQotICB0by0+V3JpdGUoIiVzIiwgbmFtZV8uY19zdHIoKSk7Ci0KLSAgYXJndW1lbnRzXy5Xcml0ZSh0byk7Ci0KLSAgaWYgKG1vZGlmaWVyc18gJiBNb2RpZmllcnM6OklTX0RFRkFVTFQpCi0gICAgdG8tPldyaXRlKCIgPSBkZWZhdWx0Iik7Ci0KLSAgdG8tPldyaXRlKCI7XG4iKTsKLX0KLQotTWFjcm9EZWNsOjpNYWNyb0RlY2woY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIEFyZ0xpc3QmJiBhcmdfbGlzdCkKLSAgICA6IG5hbWVfKG5hbWUpLAotICAgICAgYXJndW1lbnRzXyhzdGQ6Om1vdmUoYXJnX2xpc3QpKSB7fQotCi12b2lkIE1hY3JvRGVjbDo6V3JpdGUoQ29kZVdyaXRlciogdG8pIGNvbnN0IHsKLSAgdG8tPldyaXRlKCIlcyIsIG5hbWVfLmNfc3RyKCkpOwotICBhcmd1bWVudHNfLldyaXRlKHRvKTsKLSAgdG8tPldyaXRlKCJcbiIpOwotfQotCi1NZXRob2REZWNsOjpNZXRob2REZWNsKGNvbnN0IHN0ZDo6c3RyaW5nJiByZXR1cm5fdHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIEFyZ0xpc3QmJiBhcmdfbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGF0dHJpYnV0ZXMpCi0gICAgOiBNZXRob2REZWNsKHJldHVybl90eXBlLCBuYW1lLCBzdGQ6Om1vdmUoYXJnX2xpc3QpLCAwdSwgYXR0cmlidXRlcykge30KLQotTWV0aG9kRGVjbDo6TWV0aG9kRGVjbChjb25zdCBzdGQ6OnN0cmluZyYgcmV0dXJuX3R5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBBcmdMaXN0JiYgYXJnX2xpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1vZGlmaWVycywgY29uc3Qgc3RkOjpzdHJpbmcmIGF0dHJpYnV0ZXMpCi0gICAgOiByZXR1cm5fdHlwZV8ocmV0dXJuX3R5cGUpLAotICAgICAgbmFtZV8obmFtZSksCi0gICAgICBhdHRyaWJ1dGVzXyhhdHRyaWJ1dGVzKSwKLSAgICAgIGFyZ3VtZW50c18oc3RkOjptb3ZlKGFyZ19saXN0KSksCi0gICAgICBpc19jb25zdF8obW9kaWZpZXJzICYgSVNfQ09OU1QpLAotICAgICAgaXNfdmlydHVhbF8obW9kaWZpZXJzICYgSVNfVklSVFVBTCksCi0gICAgICBpc19vdmVycmlkZV8obW9kaWZpZXJzICYgSVNfT1ZFUlJJREUpLAotICAgICAgaXNfcHVyZV92aXJ0dWFsXyhtb2RpZmllcnMgJiBJU19QVVJFX1ZJUlRVQUwpLAotICAgICAgaXNfc3RhdGljXyhtb2RpZmllcnMgJiBJU19TVEFUSUMpLAotICAgICAgaXNfZmluYWxfKG1vZGlmaWVycyAmIElTX0ZJTkFMKSB7fQotCi12b2lkIE1ldGhvZERlY2w6OldyaXRlKENvZGVXcml0ZXIqIHRvKSBjb25zdCB7Ci0gIGlmIChpc192aXJ0dWFsXykKLSAgICB0by0+V3JpdGUoInZpcnR1YWwgIik7Ci0KLSAgaWYgKGlzX3N0YXRpY18pCi0gICAgdG8tPldyaXRlKCJzdGF0aWMgIik7Ci0KLSAgdG8tPldyaXRlKCIlcyAlcyIsIHJldHVybl90eXBlXy5jX3N0cigpLCBuYW1lXy5jX3N0cigpKTsKLQotICBhcmd1bWVudHNfLldyaXRlKHRvKTsKLQotICBpZiAoaXNfY29uc3RfKQotICAgIHRvLT5Xcml0ZSgiIGNvbnN0Iik7Ci0KLSAgaWYgKGlzX292ZXJyaWRlXykKLSAgICB0by0+V3JpdGUoIiBvdmVycmlkZSIpOwotCi0gIGlmIChpc19maW5hbF8pIHRvLT5Xcml0ZSgiIGZpbmFsIik7Ci0KLSAgaWYgKCFhdHRyaWJ1dGVzXy5lbXB0eSgpKSB0by0+V3JpdGUoIiAlcyIsIGF0dHJpYnV0ZXNfLmNfc3RyKCkpOwotCi0gIGlmIChpc19wdXJlX3ZpcnR1YWxfKQotICAgIHRvLT5Xcml0ZSgiID0gMCIpOwotCi0gIHRvLT5Xcml0ZSgiO1xuIik7Ci19Ci0KLXZvaWQgU3RhdGVtZW50QmxvY2s6OkFkZFN0YXRlbWVudCh1bmlxdWVfcHRyPEFzdE5vZGU+IHN0YXRlbWVudCkgewotICBzdGF0ZW1lbnRzXy5wdXNoX2JhY2soc3RkOjptb3ZlKHN0YXRlbWVudCkpOwotfQotCi12b2lkIFN0YXRlbWVudEJsb2NrOjpBZGRTdGF0ZW1lbnQoQXN0Tm9kZSogc3RhdGVtZW50KSB7Ci0gIHN0YXRlbWVudHNfLmVtcGxhY2VfYmFjayhzdGF0ZW1lbnQpOwotfQotCi12b2lkIFN0YXRlbWVudEJsb2NrOjpBZGRMaXRlcmFsKGNvbnN0IHN0ZDo6c3RyaW5nJiBleHByZXNzaW9uX3N0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhZGRfc2VtaWNvbG9uKSB7Ci0gIGlmIChhZGRfc2VtaWNvbG9uKSB7Ci0gICAgc3RhdGVtZW50c18ucHVzaF9iYWNrKHVuaXF1ZV9wdHI8QXN0Tm9kZT4obmV3IFN0YXRlbWVudChleHByZXNzaW9uX3N0cikpKTsKLSAgfSBlbHNlIHsKLSAgICBzdGF0ZW1lbnRzXy5wdXNoX2JhY2sodW5pcXVlX3B0cjxBc3ROb2RlPigKLSAgICAgICAgbmV3IExpdGVyYWxFeHByZXNzaW9uKGV4cHJlc3Npb25fc3RyKSkpOwotICB9Ci19Ci0KLXZvaWQgU3RhdGVtZW50QmxvY2s6OldyaXRlKENvZGVXcml0ZXIqIHRvKSBjb25zdCB7Ci0gIHRvLT5Xcml0ZSgie1xuIik7Ci0gIHRvLT5JbmRlbnQoKTsKLSAgZm9yIChjb25zdCBhdXRvJiBzdGF0ZW1lbnQgOiBzdGF0ZW1lbnRzXykgewotICAgIHN0YXRlbWVudC0+V3JpdGUodG8pOwotICB9Ci0gIHRvLT5EZWRlbnQoKTsKLSAgdG8tPldyaXRlKCJ9XG4iKTsKLX0KLQotQ29uc3RydWN0b3JJbXBsOjpDb25zdHJ1Y3RvckltcGwoY29uc3Qgc3RyaW5nJiBjbGFzc19uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnTGlzdCYmIGFyZ19saXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjdG9yPHN0cmluZz4mIGluaXRpYWxpemVyX2xpc3QpCi0gICAgICA6IGNsYXNzX25hbWVfKGNsYXNzX25hbWUpLAotICAgICAgICBhcmd1bWVudHNfKHN0ZDo6bW92ZShhcmdfbGlzdCkpLAotICAgICAgICBpbml0aWFsaXplcl9saXN0Xyhpbml0aWFsaXplcl9saXN0KSB7fQotCi1TdGF0ZW1lbnRCbG9jayogQ29uc3RydWN0b3JJbXBsOjpHZXRTdGF0ZW1lbnRCbG9jaygpIHsKLSAgcmV0dXJuICZib2R5XzsKLX0KLQotdm9pZCBDb25zdHJ1Y3RvckltcGw6OldyaXRlKENvZGVXcml0ZXIqIHRvKSBjb25zdCB7Ci0gIHRvLT5Xcml0ZSgiJXM6OiVzIiwgY2xhc3NfbmFtZV8uY19zdHIoKSwgY2xhc3NfbmFtZV8uY19zdHIoKSk7Ci0gIGFyZ3VtZW50c18uV3JpdGUodG8pOwotICB0by0+V3JpdGUoIlxuIik7Ci0KLSAgYm9vbCBpc19maXJzdCA9IHRydWU7Ci0gIGZvciAoY29uc3Qgc3RyaW5nJiBpIDogaW5pdGlhbGl6ZXJfbGlzdF8pIHsKLSAgICBpZiAoaXNfZmlyc3QpIHsKLSAgICAgIHRvLT5Xcml0ZSgiICAgIDogJXMiLCBpLmNfc3RyKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICB0by0+V3JpdGUoIixcbiAgICAgICVzIiwgaS5jX3N0cigpKTsKLSAgICB9Ci0gICAgaXNfZmlyc3QgPSBmYWxzZTsKLSAgfQotCi0gIGJvZHlfLldyaXRlKHRvKTsKLX0KLQotTWV0aG9kSW1wbDo6TWV0aG9kSW1wbChjb25zdCBzdHJpbmcmIHJldHVybl90eXBlLCBjb25zdCBzdHJpbmcmIGNsYXNzX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgbWV0aG9kX25hbWUsIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgdGVtcGxhdGVfcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICBBcmdMaXN0JiYgYXJnX2xpc3QsIGJvb2wgaXNfY29uc3RfbWV0aG9kKQotICAgIDogcmV0dXJuX3R5cGVfKHJldHVybl90eXBlKSwKLSAgICAgIG1ldGhvZF9uYW1lXyhtZXRob2RfbmFtZSksCi0gICAgICBhcmd1bWVudHNfKHN0ZDo6bW92ZShhcmdfbGlzdCkpLAotICAgICAgaXNfY29uc3RfbWV0aG9kXyhpc19jb25zdF9tZXRob2QpLAotICAgICAgdGVtcGxhdGVfcGFyYW1zXyh0ZW1wbGF0ZV9wYXJhbXMpIHsKLSAgaWYgKCFjbGFzc19uYW1lLmVtcHR5KCkpIHsKLSAgICBpZiAoIXRlbXBsYXRlX3BhcmFtcy5lbXB0eSgpKSB7Ci0gICAgICBtZXRob2RfbmFtZV8gPSBjbGFzc19uYW1lICsgIjwiICsgYmFzZTo6Sm9pbih0ZW1wbGF0ZV9wYXJhbXMsICIsIikgKyAiPjo6IiArIG1ldGhvZF9uYW1lOwotICAgIH0gZWxzZSB7Ci0gICAgICBtZXRob2RfbmFtZV8gPSBjbGFzc19uYW1lICsgIjo6IiArIG1ldGhvZF9uYW1lOwotICAgIH0KLSAgfQotfQotCi1TdGF0ZW1lbnRCbG9jayogTWV0aG9kSW1wbDo6R2V0U3RhdGVtZW50QmxvY2soKSB7Ci0gIHJldHVybiAmc3RhdGVtZW50c187Ci19Ci0KLXZvaWQgTWV0aG9kSW1wbDo6V3JpdGUoQ29kZVdyaXRlciogdG8pIGNvbnN0IHsKLSAgaWYgKCF0ZW1wbGF0ZV9wYXJhbXNfLmVtcHR5KCkpCi0gICAgdG8tPldyaXRlKCJ0ZW1wbGF0ZSA8dHlwZW5hbWUgJXM+XG4iLCBiYXNlOjpKb2luKHRlbXBsYXRlX3BhcmFtc18sICIsIHR5cGVuYW1lICIpLmNfc3RyKCkpOwotICB0by0+V3JpdGUoIiVzICVzIiwgcmV0dXJuX3R5cGVfLmNfc3RyKCksIG1ldGhvZF9uYW1lXy5jX3N0cigpKTsKLSAgYXJndW1lbnRzXy5Xcml0ZSh0byk7Ci0gIHRvLT5Xcml0ZSgiJXMgIiwgKGlzX2NvbnN0X21ldGhvZF8pID8gIiBjb25zdCIgOiAiIik7Ci0gIHN0YXRlbWVudHNfLldyaXRlKHRvKTsKLX0KLQotU3dpdGNoU3RhdGVtZW50OjpTd2l0Y2hTdGF0ZW1lbnQoY29uc3Qgc3RkOjpzdHJpbmcmIGV4cHJlc3Npb24pCi0gICAgOiBzd2l0Y2hfZXhwcmVzc2lvbl8oZXhwcmVzc2lvbikge30KLQotU3RhdGVtZW50QmxvY2sqIFN3aXRjaFN0YXRlbWVudDo6QWRkQ2FzZShjb25zdCBzdHJpbmcmIHZhbHVlX2V4cHJlc3Npb24pIHsKLSAgYXV0byBpdCA9IHN0ZDo6ZmluZChjYXNlX3ZhbHVlc18uYmVnaW4oKSwgY2FzZV92YWx1ZXNfLmVuZCgpLCB2YWx1ZV9leHByZXNzaW9uKTsKLSAgaWYgKGl0ICE9IGNhc2VfdmFsdWVzXy5lbmQoKSkgewotICAgIEFJRExfRVJST1IodmFsdWVfZXhwcmVzc2lvbikgPDwgIkR1cGxpY2F0ZSBzd2l0Y2ggY2FzZSBsYWJlbHMiOwotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0gIFN0YXRlbWVudEJsb2NrKiByZXQgPSBuZXcgU3RhdGVtZW50QmxvY2soKTsKLSAgY2FzZV92YWx1ZXNfLnB1c2hfYmFjayh2YWx1ZV9leHByZXNzaW9uKTsKLSAgY2FzZV9sb2dpY18ucHVzaF9iYWNrKHVuaXF1ZV9wdHI8U3RhdGVtZW50QmxvY2s+e3JldH0pOwotICByZXR1cm4gcmV0OwotfQotCi12b2lkIFN3aXRjaFN0YXRlbWVudDo6V3JpdGUoQ29kZVdyaXRlciogdG8pIGNvbnN0IHsKLSAgdG8tPldyaXRlKCJzd2l0Y2ggKCVzKSB7XG4iLCBzd2l0Y2hfZXhwcmVzc2lvbl8uY19zdHIoKSk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2FzZV92YWx1ZXNfLnNpemUoKTsgKytpKSB7Ci0gICAgY29uc3Qgc3RyaW5nJiBjYXNlX3ZhbHVlID0gY2FzZV92YWx1ZXNfW2ldOwotICAgIGNvbnN0IHVuaXF1ZV9wdHI8U3RhdGVtZW50QmxvY2s+JiBzdGF0ZW1lbnRzID0gY2FzZV9sb2dpY19baV07Ci0gICAgaWYgKGNhc2VfdmFsdWUuZW1wdHkoKSkgewotICAgICAgdG8tPldyaXRlKCJkZWZhdWx0OlxuIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRvLT5Xcml0ZSgiY2FzZSAlczpcbiIsIGNhc2VfdmFsdWUuY19zdHIoKSk7Ci0gICAgfQotICAgIHN0YXRlbWVudHMtPldyaXRlKHRvKTsKLSAgICB0by0+V3JpdGUoImJyZWFrO1xuIik7Ci0gIH0KLSAgdG8tPldyaXRlKCJ9XG4iKTsKLX0KLQotCi1Bc3NpZ25tZW50OjpBc3NpZ25tZW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBsZWZ0LCBjb25zdCBzdGQ6OnN0cmluZyYgcmlnaHQpCi0gICAgOiBBc3NpZ25tZW50KGxlZnQsIG5ldyBMaXRlcmFsRXhwcmVzc2lvbntyaWdodH0pIHt9Ci0KLUFzc2lnbm1lbnQ6OkFzc2lnbm1lbnQoY29uc3Qgc3RkOjpzdHJpbmcmIGxlZnQsIEFzdE5vZGUqIHJpZ2h0KQotICAgIDogbGhzXyhsZWZ0KSwKLSAgICAgIHJoc18ocmlnaHQpIHt9Ci0KLXZvaWQgQXNzaWdubWVudDo6V3JpdGUoQ29kZVdyaXRlciogdG8pIGNvbnN0IHsKLSAgdG8tPldyaXRlKCIlcyA9ICIsIGxoc18uY19zdHIoKSk7Ci0gIHJoc18tPldyaXRlKHRvKTsKLSAgdG8tPldyaXRlKCI7XG4iKTsKLX0KLQotTWV0aG9kQ2FsbDo6TWV0aG9kQ2FsbChjb25zdCBzdGQ6OnN0cmluZyYgbWV0aG9kX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzaW5nbGVfYXJndW1lbnQpCi0gICAgOiBNZXRob2RDYWxsKG1ldGhvZF9uYW1lLCBBcmdMaXN0e3NpbmdsZV9hcmd1bWVudH0pIHt9Ci0KLU1ldGhvZENhbGw6Ok1ldGhvZENhbGwoY29uc3Qgc3RkOjpzdHJpbmcmIG1ldGhvZF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBBcmdMaXN0JiYgYXJnX2xpc3QpCi0gICAgOiBtZXRob2RfbmFtZV8obWV0aG9kX25hbWUpLAotICAgICAgYXJndW1lbnRzX3tzdGQ6Om1vdmUoYXJnX2xpc3QpfSB7fQotCi12b2lkIE1ldGhvZENhbGw6OldyaXRlKENvZGVXcml0ZXIqIHRvKSBjb25zdCB7Ci0gIHRvLT5Xcml0ZSgiJXMiLCBtZXRob2RfbmFtZV8uY19zdHIoKSk7Ci0gIGFyZ3VtZW50c18uV3JpdGUodG8pOwotfQotCi1JZlN0YXRlbWVudDo6SWZTdGF0ZW1lbnQoQXN0Tm9kZSogZXhwcmVzc2lvbiwgYm9vbCBpbnZlcnRfZXhwcmVzc2lvbikKLSAgICA6IGV4cHJlc3Npb25fKGV4cHJlc3Npb24pLAotICAgICAgaW52ZXJ0X2V4cHJlc3Npb25fKGludmVydF9leHByZXNzaW9uKSB7fQotCi12b2lkIElmU3RhdGVtZW50OjpXcml0ZShDb2RlV3JpdGVyKiB0bykgY29uc3QgewotICB0by0+V3JpdGUoImlmICglcyIsIChpbnZlcnRfZXhwcmVzc2lvbl8pID8gIiEoIiA6ICIiKTsKLSAgZXhwcmVzc2lvbl8tPldyaXRlKHRvKTsKLSAgdG8tPldyaXRlKCIpJXMgIiwgKGludmVydF9leHByZXNzaW9uXykgPyAiKSIgOiAiIik7Ci0gIG9uX3RydWVfLldyaXRlKHRvKTsKLQotICBpZiAoIW9uX2ZhbHNlXy5FbXB0eSgpKSB7Ci0gICAgdG8tPldyaXRlKCJlbHNlICIpOwotICAgIG9uX2ZhbHNlXy5Xcml0ZSh0byk7Ci0gIH0KLX0KLQotU3RhdGVtZW50OjpTdGF0ZW1lbnQodW5pcXVlX3B0cjxBc3ROb2RlPiBleHByZXNzaW9uKQotICAgIDogZXhwcmVzc2lvbl8oc3RkOjptb3ZlKGV4cHJlc3Npb24pKSB7fQotCi1TdGF0ZW1lbnQ6OlN0YXRlbWVudChBc3ROb2RlKiBleHByZXNzaW9uKSA6IGV4cHJlc3Npb25fKGV4cHJlc3Npb24pIHt9Ci0KLVN0YXRlbWVudDo6U3RhdGVtZW50KGNvbnN0IHN0cmluZyYgZXhwcmVzc2lvbikKLSAgICA6IGV4cHJlc3Npb25fKG5ldyBMaXRlcmFsRXhwcmVzc2lvbihleHByZXNzaW9uKSkge30KLQotdm9pZCBTdGF0ZW1lbnQ6OldyaXRlKENvZGVXcml0ZXIqIHRvKSBjb25zdCB7Ci0gIGV4cHJlc3Npb25fLT5Xcml0ZSh0byk7Ci0gIHRvLT5Xcml0ZSgiO1xuIik7Ci19Ci0KLUNvbXBhcmlzb246OkNvbXBhcmlzb24oQXN0Tm9kZSogbGhzLCBjb25zdCBzdHJpbmcmIGNvbXBhcmlzb24sIEFzdE5vZGUqIHJocykKLSAgICA6IGxlZnRfKGxocyksCi0gICAgICByaWdodF8ocmhzKSwKLSAgICAgIG9wZXJhdG9yXyhjb21wYXJpc29uKSB7fQotCi12b2lkIENvbXBhcmlzb246OldyaXRlKENvZGVXcml0ZXIqIHRvKSBjb25zdCB7Ci0gIHRvLT5Xcml0ZSgiKCgiKTsKLSAgbGVmdF8tPldyaXRlKHRvKTsKLSAgdG8tPldyaXRlKCIpICVzICgiLCBvcGVyYXRvcl8uY19zdHIoKSk7Ci0gIHJpZ2h0Xy0+V3JpdGUodG8pOwotICB0by0+V3JpdGUoIikpIik7Ci19Ci0KLUxpdGVyYWxFeHByZXNzaW9uOjpMaXRlcmFsRXhwcmVzc2lvbihjb25zdCBzdGQ6OnN0cmluZyYgZXhwcmVzc2lvbikKLSAgICA6IGV4cHJlc3Npb25fKGV4cHJlc3Npb24pIHt9Ci0KLXZvaWQgTGl0ZXJhbEV4cHJlc3Npb246OldyaXRlKENvZGVXcml0ZXIqIHRvKSBjb25zdCB7Ci0gIHRvLT5Xcml0ZSgiJXMiLCBleHByZXNzaW9uXy5jX3N0cigpKTsKLX0KLQotQ3BwTmFtZXNwYWNlOjpDcHBOYW1lc3BhY2UoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1bmlxdWVfcHRyPERlY2xhcmF0aW9uPj4gZGVjbGFyYXRpb25zKQotICAgIDogZGVjbGFyYXRpb25zXyhzdGQ6Om1vdmUoZGVjbGFyYXRpb25zKSksCi0gICAgICBuYW1lXyhuYW1lKSB7fQotCi1DcHBOYW1lc3BhY2U6OkNwcE5hbWVzcGFjZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXF1ZV9wdHI8RGVjbGFyYXRpb24+IGRlY2xhcmF0aW9uKQotICAgIDogbmFtZV8obmFtZSkgewotICBkZWNsYXJhdGlvbnNfLnB1c2hfYmFjayhzdGQ6Om1vdmUoZGVjbGFyYXRpb24pKTsKLX0KLUNwcE5hbWVzcGFjZTo6Q3BwTmFtZXNwYWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKQotICAgIDogbmFtZV8obmFtZSkge30KLQotdm9pZCBDcHBOYW1lc3BhY2U6OldyaXRlKENvZGVXcml0ZXIqIHRvKSBjb25zdCB7Ci0gIHRvLT5Xcml0ZSgibmFtZXNwYWNlICVzIHtcblxuIiwgbmFtZV8uY19zdHIoKSk7Ci0KLSAgZm9yIChjb25zdCBhdXRvJiBkZWMgOiBkZWNsYXJhdGlvbnNfKSB7Ci0gICAgZGVjLT5Xcml0ZSh0byk7Ci0gICAgdG8tPldyaXRlKCJcbiIpOwotICB9Ci0KLSAgdG8tPldyaXRlKCJ9ICAvLyBuYW1lc3BhY2UgJXNcbiIsIG5hbWVfLmNfc3RyKCkpOwotfQotCi1Eb2N1bWVudDo6RG9jdW1lbnQoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBpbmNsdWRlX2xpc3QsCi0gICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dW5pcXVlX3B0cjxEZWNsYXJhdGlvbj4+IGRlY2xhcmF0aW9ucykKLSAgICA6IGluY2x1ZGVfbGlzdF8oaW5jbHVkZV9saXN0KSwgZGVjbGFyYXRpb25zXyhzdGQ6Om1vdmUoZGVjbGFyYXRpb25zKSkge30KLQotdm9pZCBEb2N1bWVudDo6V3JpdGUoQ29kZVdyaXRlciogdG8pIGNvbnN0IHsKLSAgZm9yIChjb25zdCBhdXRvJiBpbmNsdWRlIDogaW5jbHVkZV9saXN0XykgewotICAgIHRvLT5Xcml0ZSgiI2luY2x1ZGUgPCVzPlxuIiwgaW5jbHVkZS5jX3N0cigpKTsKLSAgfQotICB0by0+V3JpdGUoIlxuIik7Ci0KLSAgZm9yIChjb25zdCBhdXRvJiBkZWNsYXJhdGlvbiA6IGRlY2xhcmF0aW9uc18pIHsKLSAgICBkZWNsYXJhdGlvbi0+V3JpdGUodG8pOwotICB9Ci19Ci0KLUNwcEhlYWRlcjo6Q3BwSGVhZGVyKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgaW5jbHVkZV9saXN0LAotICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPERlY2xhcmF0aW9uPj4gZGVjbGFyYXRpb25zKQotICAgIDogRG9jdW1lbnQoaW5jbHVkZV9saXN0LCBzdGQ6Om1vdmUoZGVjbGFyYXRpb25zKSkge30KLQotdm9pZCBDcHBIZWFkZXI6OldyaXRlKENvZGVXcml0ZXIqIHRvKSBjb25zdCB7Ci0gIHRvLT5Xcml0ZSgiI3ByYWdtYSBvbmNlXG5cbiIpOwotCi0gIERvY3VtZW50OjpXcml0ZSh0byk7Ci19Ci0KLUNwcFNvdXJjZTo6Q3BwU291cmNlKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgaW5jbHVkZV9saXN0LAotICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPERlY2xhcmF0aW9uPj4gZGVjbGFyYXRpb25zKQotICAgIDogRG9jdW1lbnQoaW5jbHVkZV9saXN0LCBzdGQ6Om1vdmUoZGVjbGFyYXRpb25zKSkge30KLQotfSAgLy8gbmFtZXNwYWNlIGNwcAotfSAgLy8gbmFtZXNwYWNlIGFpZGwKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hc3RfY3BwLmggYi9hc3RfY3BwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNTEwNWMuLjAwMDAwMDAKLS0tIGEvYXN0X2NwcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzk0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgYWlkbCB7Ci1jbGFzcyBDb2RlV3JpdGVyOwotfSAgLy8gbmFtZXNwYWNlIGFpZGwKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBhaWRsIHsKLW5hbWVzcGFjZSBjcHAgewotCi1jbGFzcyBBc3ROb2RlIHsKLSBwdWJsaWM6Ci0gIEFzdE5vZGUoKSA9IGRlZmF1bHQ7Ci0gIHZpcnR1YWwgfkFzdE5vZGUoKSA9IGRlZmF1bHQ7Ci0KLSAgLy8gQWxsIGFzdCBub2RlcyBhcmUgbm9uLWNvcHlhYmxlIGFuZCBub24tbW92YWJsZQotICBBc3ROb2RlKGNvbnN0IEFzdE5vZGUmKSA9IGRlbGV0ZTsKLSAgQXN0Tm9kZShBc3ROb2RlJiYpID0gZGVsZXRlOwotICBBc3ROb2RlJiBvcGVyYXRvcj0oY29uc3QgQXN0Tm9kZSYpID0gZGVsZXRlOwotICBBc3ROb2RlJiBvcGVyYXRvcj0oQXN0Tm9kZSYmKSA9IGRlbGV0ZTsKLQotICB2aXJ0dWFsIHZvaWQgV3JpdGUoQ29kZVdyaXRlciogdG8pIGNvbnN0ID0gMDsKLSAgc3RkOjpzdHJpbmcgVG9TdHJpbmcoKTsKLX07ICAvLyBjbGFzcyBBc3ROb2RlCi0KLWNsYXNzIERlY2xhcmF0aW9uIDogcHVibGljIEFzdE5vZGUgewotIHB1YmxpYzoKLSAgRGVjbGFyYXRpb24oKSA9IGRlZmF1bHQ7Ci0gIHZpcnR1YWwgfkRlY2xhcmF0aW9uKCkgPSBkZWZhdWx0OwotfTsgIC8vIGNsYXNzIERlY2xhcmF0aW9uCi0KLWNsYXNzIExpdGVyYWxEZWNsIDogcHVibGljIERlY2xhcmF0aW9uIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IExpdGVyYWxEZWNsKGNvbnN0IHN0ZDo6c3RyaW5nJiBleHByZXNzaW9uKTsKLSAgfkxpdGVyYWxEZWNsKCkgPSBkZWZhdWx0OwotICB2b2lkIFdyaXRlKENvZGVXcml0ZXIqIHRvKSBjb25zdCBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIGNvbnN0IHN0ZDo6c3RyaW5nIGV4cHJlc3Npb25fOwotfTsgIC8vIGNsYXNzIExpdGVyYWxEZWNsCi0KLWNsYXNzIENsYXNzRGVjbCA6IHB1YmxpYyBEZWNsYXJhdGlvbiB7Ci0gcHVibGljOgotICBDbGFzc0RlY2woY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJlbnQsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHRlbXBsYXRlX3BhcmFtcywgY29uc3Qgc3RkOjpzdHJpbmcmIGF0dHJpYnV0ZXMgPSAiIik7Ci0gIENsYXNzRGVjbChjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHBhcmVudCwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgdGVtcGxhdGVfcGFyYW1zLAotICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPERlY2xhcmF0aW9uPj4gcHVibGljX21lbWJlcnMsCi0gICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8RGVjbGFyYXRpb24+PiBwcml2YXRlX21lbWJlcnMsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYXR0cmlidXRlcyA9ICIiKTsKLSAgdmlydHVhbCB+Q2xhc3NEZWNsKCkgPSBkZWZhdWx0OwotCi0gIHZvaWQgV3JpdGUoQ29kZVdyaXRlciogdG8pIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZvaWQgQWRkUHVibGljKHN0ZDo6dW5pcXVlX3B0cjxEZWNsYXJhdGlvbj4gbWVtYmVyKTsKLSAgdm9pZCBBZGRQcml2YXRlKHN0ZDo6dW5pcXVlX3B0cjxEZWNsYXJhdGlvbj4gbWVtYmVyKTsKLQotIHByaXZhdGU6Ci0gIHN0ZDo6c3RyaW5nIG5hbWVfOwotICBzdGQ6OnN0cmluZyBwYXJlbnRfOwotICBzdGQ6OnN0cmluZyBhdHRyaWJ1dGVzXzsKLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHRlbXBsYXRlX3BhcmFtc187Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxEZWNsYXJhdGlvbj4+IHB1YmxpY19tZW1iZXJzXzsKLSAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPERlY2xhcmF0aW9uPj4gcHJpdmF0ZV9tZW1iZXJzXzsKLX07ICAvLyBjbGFzcyBDbGFzc0RlY2wKLQotY2xhc3MgRW51bSA6IHB1YmxpYyBEZWNsYXJhdGlvbiB7Ci0gcHVibGljOgotICBFbnVtKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgYmFzZV90eXBlLCBib29sIGlzX2NsYXNzLAotICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhdHRyaWJ1dGVzID0gIiIpOwotICB2aXJ0dWFsIH5FbnVtKCkgPSBkZWZhdWx0OwotCi0gIGJvb2wgSGFzVmFsdWVzKCkgY29uc3QgeyByZXR1cm4gIWZpZWxkc18uZW1wdHkoKTsgfQotICB2b2lkIFdyaXRlKENvZGVXcml0ZXIqIHRvKSBjb25zdCBvdmVycmlkZTsKLQotICB2b2lkIEFkZFZhbHVlKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSwKLSAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYXR0cmlidXRlID0gIiIpOwotCi0gcHJpdmF0ZToKLSAgc3RydWN0IEVudW1GaWVsZCB7Ci0gICAgRW51bUZpZWxkKGNvbnN0IHN0ZDo6c3RyaW5nJiBrLCBjb25zdCBzdGQ6OnN0cmluZyYgdiwgY29uc3Qgc3RkOjpzdHJpbmcmIGEpOwotICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGtleTsKLSAgICBjb25zdCBzdGQ6OnN0cmluZyB2YWx1ZTsKLSAgICBjb25zdCBzdGQ6OnN0cmluZyBhdHRyaWJ1dGU7Ci0gIH07Ci0KLSAgc3RkOjpzdHJpbmcgZW51bV9uYW1lXzsKLSAgc3RkOjpzdHJpbmcgdW5kZXJseWluZ190eXBlXzsKLSAgc3RkOjpzdHJpbmcgYXR0cmlidXRlc187Ci0gIGJvb2wgaXNfY2xhc3NfOwotICBzdGQ6OnZlY3RvcjxFbnVtRmllbGQ+IGZpZWxkc187Ci19OyAgLy8gY2xhc3MgRW51bQotCi1jbGFzcyBBcmdMaXN0IDogcHVibGljIEFzdE5vZGUgewotIHB1YmxpYzoKLSAgQXJnTGlzdCgpID0gZGVmYXVsdDsKLSAgZXhwbGljaXQgQXJnTGlzdChjb25zdCBzdGQ6OnN0cmluZyYgc2luZ2xlX2FyZ3VtZW50KTsKLSAgZXhwbGljaXQgQXJnTGlzdChjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ19saXN0KTsKLSAgZXhwbGljaXQgQXJnTGlzdChzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QXN0Tm9kZT4+IGFyZ19saXN0KTsKLSAgQXJnTGlzdChBcmdMaXN0JiYgYXJnX2xpc3QpIG5vZXhjZXB0OwotICB2aXJ0dWFsIH5BcmdMaXN0KCkgPSBkZWZhdWx0OwotCi0gIHZvaWQgV3JpdGUoQ29kZVdyaXRlciogdG8pIGNvbnN0IG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFzdE5vZGU+PiBhcmd1bWVudHNfOwotfTsgIC8vIGNsYXNzIEFyZ0xpc3QKLQotY2xhc3MgQ29uc3RydWN0b3JEZWNsIDogcHVibGljIERlY2xhcmF0aW9uIHsKLSBwdWJsaWM6Ci0gIGVudW0gTW9kaWZpZXJzIHsKLSAgICBJU19WSVJUVUFMID0gMSA8PCAwLAotICAgIElTX0RFRkFVTFQgPSAxIDw8IDEsCi0gICAgSVNfRVhQTElDSVQgPSAxIDw8IDIsCi0gIH07Ci0KLSAgQ29uc3RydWN0b3JEZWNsKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgQXJnTGlzdCYmIGFyZ19saXN0KTsKLSAgQ29uc3RydWN0b3JEZWNsKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgQXJnTGlzdCYmIGFyZ19saXN0LAotICAgICAgICAgICAgICAgICAgdWludDMyX3QgbW9kaWZpZXJzKTsKLQotICB2aXJ0dWFsIH5Db25zdHJ1Y3RvckRlY2woKSA9IGRlZmF1bHQ7Ci0KLSAgdm9pZCBXcml0ZShDb2RlV3JpdGVyKiB0bykgY29uc3Qgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBjb25zdCBzdGQ6OnN0cmluZyBuYW1lXzsKLSAgY29uc3QgQXJnTGlzdCBhcmd1bWVudHNfOwotICBjb25zdCB1aW50MzJfdCBtb2RpZmllcnNfOwotfTsgIC8vIGNsYXNzIENvbnN0cnVjdG9yRGVjbAotCi1jbGFzcyBNYWNyb0RlY2wgOiBwdWJsaWMgRGVjbGFyYXRpb24gewotIHB1YmxpYzoKLSAgTWFjcm9EZWNsKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBBcmdMaXN0JiYgYXJnX2xpc3QpOwotICB2aXJ0dWFsIH5NYWNyb0RlY2woKSA9IGRlZmF1bHQ7Ci0KLSAgdm9pZCBXcml0ZShDb2RlV3JpdGVyKiB0bykgY29uc3Qgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBjb25zdCBzdGQ6OnN0cmluZyBuYW1lXzsKLSAgY29uc3QgQXJnTGlzdCBhcmd1bWVudHNfOwotfTsgIC8vIGNsYXNzIE1hY3JvRGVjbAotCi1jbGFzcyBNZXRob2REZWNsIDogcHVibGljIERlY2xhcmF0aW9uIHsKLSBwdWJsaWM6Ci0gIGVudW0gTW9kaWZpZXJzIHsKLSAgICBJU19DT05TVCA9IDEgPDwgMCwKLSAgICBJU19WSVJUVUFMID0gMSA8PCAxLAotICAgIElTX09WRVJSSURFID0gMSA8PCAyLAotICAgIElTX1BVUkVfVklSVFVBTCA9IDEgPDwgMywKLSAgICBJU19TVEFUSUMgPSAxIDw8IDQsCi0gICAgSVNfRklOQUwgPSAxIDw8IDUsCi0gIH07Ci0KLSAgTWV0aG9kRGVjbChjb25zdCBzdGQ6OnN0cmluZyYgcmV0dXJuX3R5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBBcmdMaXN0JiYgYXJnX2xpc3QsCi0gICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGF0dHJpYnV0ZXMgPSAiIik7Ci0gIE1ldGhvZERlY2woY29uc3Qgc3RkOjpzdHJpbmcmIHJldHVybl90eXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgQXJnTGlzdCYmIGFyZ19saXN0LAotICAgICAgICAgICAgIHVpbnQzMl90IG1vZGlmaWVycywgY29uc3Qgc3RkOjpzdHJpbmcmIGF0dHJpYnV0ZXMgPSAiIik7Ci0gIHZpcnR1YWwgfk1ldGhvZERlY2woKSA9IGRlZmF1bHQ7Ci0KLSAgdm9pZCBXcml0ZShDb2RlV3JpdGVyKiB0bykgY29uc3Qgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBjb25zdCBzdGQ6OnN0cmluZyByZXR1cm5fdHlwZV87Ci0gIGNvbnN0IHN0ZDo6c3RyaW5nIG5hbWVfOwotICBjb25zdCBzdGQ6OnN0cmluZyBhdHRyaWJ1dGVzXzsKLSAgY29uc3QgQXJnTGlzdCBhcmd1bWVudHNfOwotICBib29sIGlzX2NvbnN0XyA9IGZhbHNlOwotICBib29sIGlzX3ZpcnR1YWxfID0gZmFsc2U7Ci0gIGJvb2wgaXNfb3ZlcnJpZGVfID0gZmFsc2U7Ci0gIGJvb2wgaXNfcHVyZV92aXJ0dWFsXyA9IGZhbHNlOwotICBib29sIGlzX3N0YXRpY18gPSB0cnVlOwotICBib29sIGlzX2ZpbmFsXyA9IGZhbHNlOwotfTsgIC8vIGNsYXNzIE1ldGhvZERlY2wKLQotY2xhc3MgU3RhdGVtZW50QmxvY2sgOiBwdWJsaWMgRGVjbGFyYXRpb24gewotIHB1YmxpYzoKLSAgU3RhdGVtZW50QmxvY2soKSA9IGRlZmF1bHQ7Ci0gIHZpcnR1YWwgflN0YXRlbWVudEJsb2NrKCkgPSBkZWZhdWx0OwotCi0gIHZvaWQgQWRkU3RhdGVtZW50KHN0ZDo6dW5pcXVlX3B0cjxBc3ROb2RlPiBzdGF0ZW1lbnQpOwotICB2b2lkIEFkZFN0YXRlbWVudChBc3ROb2RlKiBzdGF0ZW1lbnQpOyAgLy8gVGFrZXMgb3duZXJzaGlwCi0gIHZvaWQgQWRkTGl0ZXJhbChjb25zdCBzdGQ6OnN0cmluZyYgZXhwcmVzc2lvbiwgYm9vbCBhZGRfc2VtaWNvbG9uID0gdHJ1ZSk7Ci0gIGJvb2wgRW1wdHkoKSBjb25zdCB7IHJldHVybiBzdGF0ZW1lbnRzXy5lbXB0eSgpOyB9Ci0KLSAgdm9pZCBXcml0ZShDb2RlV3JpdGVyKiB0bykgY29uc3Qgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QXN0Tm9kZT4+IHN0YXRlbWVudHNfOwotfTsgIC8vIGNsYXNzIFN0YXRlbWVudEJsb2NrCi0KLWNsYXNzIENvbnN0cnVjdG9ySW1wbCA6IHB1YmxpYyBEZWNsYXJhdGlvbiB7Ci0gcHVibGljOgotICBDb25zdHJ1Y3RvckltcGwoY29uc3Qgc3RkOjpzdHJpbmcmIGNsYXNzX25hbWUsCi0gICAgICAgICAgICAgICAgICBBcmdMaXN0JiYgYXJnX2xpc3QsCi0gICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGluaXRpYWxpemVyX2xpc3QpOwotICB2aXJ0dWFsIH5Db25zdHJ1Y3RvckltcGwoKSA9IGRlZmF1bHQ7Ci0KLSAgLy8gQ29uc3RydWN0b3JJbXBsIHJldGFpbnMgb3duZXJzaGlwIG9mIHRoZSBzdGF0ZW1lbnQgYmxvY2suCi0gIFN0YXRlbWVudEJsb2NrKiBHZXRTdGF0ZW1lbnRCbG9jaygpOwotCi0gIHZvaWQgV3JpdGUoQ29kZVdyaXRlciogdG8pIGNvbnN0IG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgc3RkOjpzdHJpbmcgY2xhc3NfbmFtZV87Ci0gIEFyZ0xpc3QgYXJndW1lbnRzXzsKLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGluaXRpYWxpemVyX2xpc3RfOwotICBTdGF0ZW1lbnRCbG9jayBib2R5XzsKLX07ICAvLyBjbGFzcyBDb25zdHJ1Y3RvckltcGwKLQotY2xhc3MgTWV0aG9kSW1wbCA6IHB1YmxpYyBEZWNsYXJhdGlvbiB7Ci0gcHVibGljOgotICAvLyBQYXNzaW5nIGFuIGVtcHR5IGNsYXNzIG5hbWUgY2F1c2VzIHRoZSBtZXRob2QgdG8gYmUgZGVjbGFyZWQgYXMgYSBub3JtYWwKLSAgLy8gZnVuY3Rpb24gKGllLiBubyBDbGFzc05hbWU6OiBxdWFsaWZpZXIpLgotICBNZXRob2RJbXBsKGNvbnN0IHN0ZDo6c3RyaW5nJiByZXR1cm5fdHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGNsYXNzX25hbWUsCi0gICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1ldGhvZF9uYW1lLCBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHRlbXBsYXRlX3BhcmFtcywKLSAgICAgICAgICAgICBBcmdMaXN0JiYgYXJnX2xpc3QsIGJvb2wgaXNfY29uc3RfbWV0aG9kID0gZmFsc2UpOwotICB2aXJ0dWFsIH5NZXRob2RJbXBsKCkgPSBkZWZhdWx0OwotCi0gIC8vIE1ldGhvZEltcGwgcmV0YWlucyBvd25lcnNoaXAgb2YgdGhlIHN0YXRlbWVudCBibG9jay4KLSAgU3RhdGVtZW50QmxvY2sqIEdldFN0YXRlbWVudEJsb2NrKCk7Ci0KLSAgdm9pZCBXcml0ZShDb2RlV3JpdGVyKiB0bykgY29uc3Qgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBzdGQ6OnN0cmluZyByZXR1cm5fdHlwZV87Ci0gIHN0ZDo6c3RyaW5nIG1ldGhvZF9uYW1lXzsKLSAgY29uc3QgQXJnTGlzdCBhcmd1bWVudHNfOwotICBTdGF0ZW1lbnRCbG9jayBzdGF0ZW1lbnRzXzsKLSAgYm9vbCBpc19jb25zdF9tZXRob2RfID0gZmFsc2U7Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB0ZW1wbGF0ZV9wYXJhbXNfOwotfTsgIC8vIGNsYXNzIE1ldGhvZEltcGwKLQotY2xhc3MgU3dpdGNoU3RhdGVtZW50IDogcHVibGljIEFzdE5vZGUgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgU3dpdGNoU3RhdGVtZW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBleHByZXNzaW9uKTsKLSAgdmlydHVhbCB+U3dpdGNoU3RhdGVtZW50KCkgPSBkZWZhdWx0OwotCi0gIC8vIEFkZCBhIGNhc2Ugc3RhdGVtZW50IGFuZCByZXR1cm4gYSBwb2ludGVyIGNvZGUgYmxvY2sgY29ycmVzcG9uZGluZwotICAvLyB0byB0aGUgY2FzZS4gIFRoZSBzd2l0Y2ggc3RhdGVtZW50IHdpbGwgYWRkIGEgYnJlYWsgc3RhdGVtZW50Ci0gIC8vIGFmdGVyIHRoZSBjb2RlIGJsb2NrIGJ5IGRlZmF1bHQgdG8gcHJldmVudCBhY2NpZGVudGFsIGZhbGwtdGhyb3VnaC4KLSAgLy8gUmV0dXJucyBudWxscHRyIG9uIGR1cGxpY2F0ZSB2YWx1ZSBleHByZXNzaW9ucyAoYnkgc3RyY21wLCBub3QgdmFsdWUKLSAgLy8gZXF1aXZhbGVuY2UpLgotICBTdGF0ZW1lbnRCbG9jayogQWRkQ2FzZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWVfZXhwcmVzc2lvbik7Ci0gIHZvaWQgV3JpdGUoQ29kZVdyaXRlciogdG8pIGNvbnN0IG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgY29uc3Qgc3RkOjpzdHJpbmcgc3dpdGNoX2V4cHJlc3Npb25fOwotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY2FzZV92YWx1ZXNfOwotICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8U3RhdGVtZW50QmxvY2s+PiBjYXNlX2xvZ2ljXzsKLX07ICAvLyBjbGFzcyBTd2l0Y2hTdGF0ZW1lbnQKLQotY2xhc3MgQXNzaWdubWVudCA6IHB1YmxpYyBBc3ROb2RlIHsKLSBwdWJsaWM6Ci0gIEFzc2lnbm1lbnQoY29uc3Qgc3RkOjpzdHJpbmcmIGxlZnQsIGNvbnN0IHN0ZDo6c3RyaW5nJiByaWdodCk7Ci0gIEFzc2lnbm1lbnQoY29uc3Qgc3RkOjpzdHJpbmcmIGxlZnQsIEFzdE5vZGUqIHJpZ2h0KTsKLSAgfkFzc2lnbm1lbnQoKSA9IGRlZmF1bHQ7Ci0gIHZvaWQgV3JpdGUoQ29kZVdyaXRlciogdG8pIGNvbnN0IG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgY29uc3Qgc3RkOjpzdHJpbmcgbGhzXzsKLSAgc3RkOjp1bmlxdWVfcHRyPEFzdE5vZGU+IHJoc187Ci19OyAgLy8gY2xhc3MgQXNzaWdubWVudAotCi1jbGFzcyBNZXRob2RDYWxsIDogcHVibGljIEFzdE5vZGUgewotIHB1YmxpYzoKLSAgTWV0aG9kQ2FsbChjb25zdCBzdGQ6OnN0cmluZyYgbWV0aG9kX25hbWUsCi0gICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNpbmdsZV9hcmd1bWVudCk7Ci0gIE1ldGhvZENhbGwoY29uc3Qgc3RkOjpzdHJpbmcmIG1ldGhvZF9uYW1lLCBBcmdMaXN0JiYgYXJnX2xpc3QpOwotICB+TWV0aG9kQ2FsbCgpID0gZGVmYXVsdDsKLSAgdm9pZCBXcml0ZShDb2RlV3JpdGVyKiB0bykgY29uc3Qgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBjb25zdCBzdGQ6OnN0cmluZyBtZXRob2RfbmFtZV87Ci0gIGNvbnN0IEFyZ0xpc3QgYXJndW1lbnRzXzsKLX07ICAvLyBjbGFzcyBNZXRob2RDYWxsCi0KLWNsYXNzIElmU3RhdGVtZW50IDogcHVibGljIEFzdE5vZGUgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgSWZTdGF0ZW1lbnQoQXN0Tm9kZSogZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgYm9vbCBpbnZlcnRfZXhwcmVzc2lvbiA9IGZhbHNlKTsKLSAgdmlydHVhbCB+SWZTdGF0ZW1lbnQoKSA9IGRlZmF1bHQ7Ci0gIFN0YXRlbWVudEJsb2NrKiBPblRydWUoKSB7IHJldHVybiAmb25fdHJ1ZV87IH0KLSAgU3RhdGVtZW50QmxvY2sqIE9uRmFsc2UoKSB7IHJldHVybiAmb25fZmFsc2VfOyB9Ci0gIHZvaWQgV3JpdGUoQ29kZVdyaXRlciogdG8pIGNvbnN0IG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgc3RkOjp1bmlxdWVfcHRyPEFzdE5vZGU+IGV4cHJlc3Npb25fOwotICBib29sIGludmVydF9leHByZXNzaW9uXyA9IGZhbHNlOwotICBTdGF0ZW1lbnRCbG9jayBvbl90cnVlXzsKLSAgU3RhdGVtZW50QmxvY2sgb25fZmFsc2VfOwotfTsgIC8vIGNsYXNzIElmU3RhdGVtZW50Ci0KLWNsYXNzIFN0YXRlbWVudCA6IHB1YmxpYyBBc3ROb2RlIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IFN0YXRlbWVudChzdGQ6OnVuaXF1ZV9wdHI8QXN0Tm9kZT4gZXhwcmVzc2lvbik7Ci0gIGV4cGxpY2l0IFN0YXRlbWVudChBc3ROb2RlKiBleHByZXNzaW9uKTsgIC8vIFRha2VzIHBvc3Nlc3Npb24uCi0gIGV4cGxpY2l0IFN0YXRlbWVudChjb25zdCBzdGQ6OnN0cmluZyYgZXhwcmVzc2lvbik7Ci0gIH5TdGF0ZW1lbnQoKSA9IGRlZmF1bHQ7Ci0gIHZvaWQgV3JpdGUoQ29kZVdyaXRlciogdG8pIGNvbnN0IG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgc3RkOjp1bmlxdWVfcHRyPEFzdE5vZGU+IGV4cHJlc3Npb25fOwotfTsgIC8vIGNsYXNzIFN0YXRlbWVudAotCi1jbGFzcyBDb21wYXJpc29uIDogcHVibGljIEFzdE5vZGUgewotIHB1YmxpYzoKLSAgQ29tcGFyaXNvbihBc3ROb2RlKiBsaHMsIGNvbnN0IHN0ZDo6c3RyaW5nJiBjb21wYXJpc29uLCBBc3ROb2RlKiByaHMpOwotICB+Q29tcGFyaXNvbigpID0gZGVmYXVsdDsKLSAgdm9pZCBXcml0ZShDb2RlV3JpdGVyKiB0bykgY29uc3Qgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBzdGQ6OnVuaXF1ZV9wdHI8QXN0Tm9kZT4gbGVmdF87Ci0gIHN0ZDo6dW5pcXVlX3B0cjxBc3ROb2RlPiByaWdodF87Ci0gIGNvbnN0IHN0ZDo6c3RyaW5nIG9wZXJhdG9yXzsKLX07ICAvLyBjbGFzcyBDb21wYXJpc29uCi0KLWNsYXNzIExpdGVyYWxFeHByZXNzaW9uIDogcHVibGljIEFzdE5vZGUgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgTGl0ZXJhbEV4cHJlc3Npb24oY29uc3Qgc3RkOjpzdHJpbmcmIGV4cHJlc3Npb24pOwotICB+TGl0ZXJhbEV4cHJlc3Npb24oKSA9IGRlZmF1bHQ7Ci0gIHZvaWQgV3JpdGUoQ29kZVdyaXRlciogdG8pIGNvbnN0IG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgY29uc3Qgc3RkOjpzdHJpbmcgZXhwcmVzc2lvbl87Ci19OyAgLy8gY2xhc3MgTGl0ZXJhbEV4cHJlc3Npb24KLQotY2xhc3MgQ3BwTmFtZXNwYWNlIDogcHVibGljIERlY2xhcmF0aW9uIHsKLSBwdWJsaWM6Ci0gIENwcE5hbWVzcGFjZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxEZWNsYXJhdGlvbj4+IGRlY2xhcmF0aW9ucyk7Ci0gIENwcE5hbWVzcGFjZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxEZWNsYXJhdGlvbj4gZGVjbGFyYXRpb24pOwotICBleHBsaWNpdCBDcHBOYW1lc3BhY2UoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpOwotICB2aXJ0dWFsIH5DcHBOYW1lc3BhY2UoKSA9IGRlZmF1bHQ7Ci0KLSAgdm9pZCBXcml0ZShDb2RlV3JpdGVyKiB0bykgY29uc3Qgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8RGVjbGFyYXRpb24+PiBkZWNsYXJhdGlvbnNfOwotICBzdGQ6OnN0cmluZyBuYW1lXzsKLX07ICAvLyBjbGFzcyBDcHBOYW1lc3BhY2UKLQotY2xhc3MgRG9jdW1lbnQgOiBwdWJsaWMgQXN0Tm9kZSB7Ci0gcHVibGljOgotICBEb2N1bWVudChjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGluY2x1ZGVfbGlzdCwKLSAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPERlY2xhcmF0aW9uPj4gZGVjbGFyYXRpb25zKTsKLQotICB2b2lkIFdyaXRlKENvZGVXcml0ZXIqIHRvKSBjb25zdCBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBpbmNsdWRlX2xpc3RfOwotICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8RGVjbGFyYXRpb24+PiBkZWNsYXJhdGlvbnNfOwotfTsgIC8vIGNsYXNzIERvY3VtZW50Ci0KLWNsYXNzIENwcEhlYWRlciBmaW5hbCA6IHB1YmxpYyBEb2N1bWVudCB7Ci0gcHVibGljOgotICBDcHBIZWFkZXIoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBpbmNsdWRlX2xpc3QsCi0gICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8RGVjbGFyYXRpb24+PiBkZWNsYXJhdGlvbnMpOwotICB2b2lkIFdyaXRlKENvZGVXcml0ZXIqIHRvKSBjb25zdCBvdmVycmlkZTsKLX07ICAvLyBjbGFzcyBDcHBIZWFkZXIKLQotY2xhc3MgQ3BwU291cmNlIGZpbmFsIDogcHVibGljIERvY3VtZW50IHsKLSBwdWJsaWM6Ci0gIENwcFNvdXJjZShjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGluY2x1ZGVfbGlzdCwKLSAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxEZWNsYXJhdGlvbj4+IGRlY2xhcmF0aW9ucyk7Ci19OyAgLy8gY2xhc3MgQ3BwU291cmNlCi0KLX0gIC8vIG5hbWVzcGFjZSBjcHAKLX0gIC8vIG5hbWVzcGFjZSBhaWRsCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYXN0X2NwcF91bml0dGVzdC5jcHAgYi9hc3RfY3BwX3VuaXR0ZXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVmZGJjZC4uMDAwMDAwMAotLS0gYS9hc3RfY3BwX3VuaXR0ZXN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDMzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlICJhc3RfY3BwLmgiCi0jaW5jbHVkZSAiY29kZV93cml0ZXIuaCIKLQotdXNpbmcgc3RkOjpzdHJpbmc7Ci11c2luZyBzdGQ6OnZlY3RvcjsKLXVzaW5nIHN0ZDo6dW5pcXVlX3B0cjsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGFpZGwgewotbmFtZXNwYWNlIGNwcCB7Ci1uYW1lc3BhY2UgewotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi1jb25zdCBjaGFyIGtFeHBlY3RlZEhlYWRlck91dHB1dFtdID0KLSAgICBSIigjcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotbmFtZXNwYWNlIHRlc3QgewotCi1jbGFzcyBUZXN0Q2xhc3MgewotcHVibGljOgotICB2b2lkIE5vcm1hbE1ldGhvZChpbnQgbm9ybWFsYXJnLCBmbG9hdCBub3JtYWwyKTsKLSAgdmlydHVhbCB2b2lkIFN1Yk1ldGhvZChpbnQgc3ViYXJnKSBjb25zdDsKLX07ICAvLyBjbGFzcyBUZXN0Q2xhc3MKLQotY2xhc3MgVGVzdFN1YkNsYXNzIDogcHVibGljIFRlc3RDbGFzcyB7Ci1wdWJsaWM6Ci0gIHZpcnR1YWwgdm9pZCBTdWJNZXRob2QoaW50IHN1YmFyZykgY29uc3Q7Ci19OyAgLy8gY2xhc3MgVGVzdFN1YkNsYXNzCi0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0pIjsKLQotY29uc3QgY2hhciBrRXhwZWN0ZWRHZW5lcmljSGVhZGVyT3V0cHV0W10gPQotICAgIFIiKCNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPG1lbW9yeT4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1uYW1lc3BhY2UgdGVzdCB7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBBLCB0eXBlbmFtZSBCPgotY2xhc3MgVGVzdFBhcmNlbGFibGUgOiBwdWJsaWMgOjphbmRyb2lkOjpQYXJjZWxhYmxlIHsKLXB1YmxpYzoKLSAgaW50IGE7Ci19OyAgLy8gY2xhc3MgVGVzdFBhcmNlbGFibGUKLQotfSAgLy8gbmFtZXNwYWNlIHRlc3QKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLSkiOwotLy8gY2xhbmctZm9ybWF0IG9uCi0KLWNvbnN0IGNoYXIga0V4cGVjdGVkU3dpdGNoT3V0cHV0W10gPQotUiIoc3dpdGNoICh2YXIpIHsKLWNhc2UgMjoKLXsKLSAgYmF6OwotfQotYnJlYWs7Ci1jYXNlIDE6Ci17Ci0gIGZvbzsKLSAgYmFyOwotfQotYnJlYWs7Ci19Ci0pIjsKLQotY29uc3QgY2hhciBrRXhwZWN0ZWRNZXRob2RJbXBsT3V0cHV0W10gPQotICAgIFIiKHJldHVybl90eXBlIENsYXNzTmFtZTo6TWV0aG9kTmFtZShpbnQzMl90IGEsIGludDMyX3QgYiwgaW50MzJfdCogYykgY29uc3QgewotICBmb287Ci0gIGJhcjsKLX0KLSkiOwotY29uc3QgY2hhciBrRXhwZWN0ZWRHZW5lcmljTWV0aG9kSW1wbE91dHB1dFtdID0KLSAgICBSIih0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXJldHVybl90eXBlIENsYXNzTmFtZTxUPjo6TWV0aG9kTmFtZShpbnQzMl90IGEsIGludDMyX3QgYiwgaW50MzJfdCogYykgY29uc3QgewotICBmb287Ci0gIGJhcjsKLX0KLSkiOwotfSAgLy8gbmFtZXNwYWNlCi0KLWNsYXNzIEFzdENwcFRlc3RzIDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICB2b2lkIENvbXBhcmVHZW5lcmF0ZWRDb2RlKGNvbnN0IEFzdE5vZGUmIG5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBleHBlY3RlZF9vdXRwdXQpIHsKLSAgICBzdHJpbmcgYWN0dWFsX291dHB1dDsKLSAgICBub2RlLldyaXRlKENvZGVXcml0ZXI6OkZvclN0cmluZygmYWN0dWFsX291dHB1dCkuZ2V0KCkpOwotICAgIEVYUEVDVF9FUShleHBlY3RlZF9vdXRwdXQsIGFjdHVhbF9vdXRwdXQpOwotICB9Ci19OyAgLy8gY2xhc3MgQXN0Q3BwVGVzdHMKLQotCi1URVNUX0YoQXN0Q3BwVGVzdHMsIEdlbmVyYXRlc0hlYWRlcikgewotICB1bmlxdWVfcHRyPE1ldGhvZERlY2w+IG5vcm17bmV3IE1ldGhvZERlY2woCi0gICAgICAidm9pZCIsICJOb3JtYWxNZXRob2QiLAotICAgICAgQXJnTGlzdHt2ZWN0b3I8c3RyaW5nPnsiaW50IG5vcm1hbGFyZyIsICJmbG9hdCBub3JtYWwyIn19KX07Ci0gIHVuaXF1ZV9wdHI8TWV0aG9kRGVjbD4gc3ViewotICAgICAgbmV3IE1ldGhvZERlY2woInZvaWQiLCAiU3ViTWV0aG9kIiwKLSAgICAgICAgICAgICAgICAgICAgIEFyZ0xpc3R7ICJpbnQgc3ViYXJnIiB9LAotICAgICAgICAgICAgICAgICAgICAgTWV0aG9kRGVjbDo6SVNfQ09OU1QgfCBNZXRob2REZWNsOjpJU19WSVJUVUFMKX07Ci0gIHVuaXF1ZV9wdHI8TWV0aG9kRGVjbD4gc3ViMnsKLSAgICAgIG5ldyBNZXRob2REZWNsKCJ2b2lkIiwgIlN1Yk1ldGhvZCIsCi0gICAgICAgICAgICAgICAgICAgICBBcmdMaXN0eyAiaW50IHN1YmFyZyIgfSwKLSAgICAgICAgICAgICAgICAgICAgIE1ldGhvZERlY2w6OklTX0NPTlNUIHwgTWV0aG9kRGVjbDo6SVNfVklSVFVBTCl9OwotICB2ZWN0b3I8dW5pcXVlX3B0cjxEZWNsYXJhdGlvbj4+IHRlc3RfbWV0aG9kczsKLSAgdGVzdF9tZXRob2RzLnB1c2hfYmFjayhzdGQ6Om1vdmUobm9ybSkpOwotICB0ZXN0X21ldGhvZHMucHVzaF9iYWNrKHN0ZDo6bW92ZShzdWIpKTsKLQotICB2ZWN0b3I8dW5pcXVlX3B0cjxEZWNsYXJhdGlvbj4+IHRlc3Rfc3ViX21ldGhvZHM7Ci0gIHRlc3Rfc3ViX21ldGhvZHMucHVzaF9iYWNrKHN0ZDo6bW92ZShzdWIyKSk7Ci0KLSAgdW5pcXVlX3B0cjxEZWNsYXJhdGlvbj4gdGVzdHtuZXcgQ2xhc3NEZWNseyJUZXN0Q2xhc3MiLCAiIiwge30sIHN0ZDo6bW92ZSh0ZXN0X21ldGhvZHMpLCB7fX19OwotCi0gIHVuaXF1ZV9wdHI8RGVjbGFyYXRpb24+IHRlc3Rfc3ViewotICAgICAgbmV3IENsYXNzRGVjbHsiVGVzdFN1YkNsYXNzIiwgIlRlc3RDbGFzcyIsIHt9LCBzdGQ6Om1vdmUodGVzdF9zdWJfbWV0aG9kcyksIHt9fX07Ci0KLSAgdmVjdG9yPHVuaXF1ZV9wdHI8RGVjbGFyYXRpb24+PiBjbGFzc2VzOwotICBjbGFzc2VzLnB1c2hfYmFjayhzdGQ6Om1vdmUodGVzdCkpOwotICBjbGFzc2VzLnB1c2hfYmFjayhzdGQ6Om1vdmUodGVzdF9zdWIpKTsKLQotICB1bmlxdWVfcHRyPENwcE5hbWVzcGFjZT4gdGVzdF9uc3tuZXcgQ3BwTmFtZXNwYWNlIHsidGVzdCIsCi0gICAgICBzdGQ6Om1vdmUoY2xhc3Nlcyl9fTsKLQotICB2ZWN0b3I8dW5pcXVlX3B0cjxEZWNsYXJhdGlvbj4+IHRlc3RfbnNfdmVjOwotICB0ZXN0X25zX3ZlYy5wdXNoX2JhY2soc3RkOjptb3ZlKHRlc3RfbnMpKTsKLQotICB1bmlxdWVfcHRyPENwcE5hbWVzcGFjZT4gYW5kcm9pZF9uc3tuZXcgQ3BwTmFtZXNwYWNlIHsiYW5kcm9pZCIsCi0gICAgICBzdGQ6Om1vdmUodGVzdF9uc192ZWMpIH19OwotCi0gIHZlY3Rvcjx1bmlxdWVfcHRyPERlY2xhcmF0aW9uPj4gdGVzdF9uc19nbG9iYWxzOwotICB0ZXN0X25zX2dsb2JhbHMucHVzaF9iYWNrKHN0ZDo6bW92ZShhbmRyb2lkX25zKSk7Ci0KLSAgQ3BwSGVhZGVyIGNwcF9oZWFkZXJ7eyJzdHJpbmciLCAibWVtb3J5In0sIHN0ZDo6bW92ZSh0ZXN0X25zX2dsb2JhbHMpfTsKLSAgQ29tcGFyZUdlbmVyYXRlZENvZGUoY3BwX2hlYWRlciwga0V4cGVjdGVkSGVhZGVyT3V0cHV0KTsKLX0KLQotVEVTVF9GKEFzdENwcFRlc3RzLCBHZW5lcmF0ZXNHZW5lcmljSGVhZGVyKSB7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB0eXBlX3BhcmFtcyA9IHsiQSIsICJCIn07Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxEZWNsYXJhdGlvbj4+IHB1YmxpY3M7Ci0gIHB1YmxpY3MuZW1wbGFjZV9iYWNrKG5ldyBMaXRlcmFsRGVjbCgiaW50IGE7XG4iKSk7Ci0gIHVuaXF1ZV9wdHI8RGVjbGFyYXRpb24+IHRlc3R7bmV3IENsYXNzRGVjbHsKLSAgICAgICJUZXN0UGFyY2VsYWJsZSIsICI6OmFuZHJvaWQ6OlBhcmNlbGFibGUiLCB0eXBlX3BhcmFtcywgc3RkOjptb3ZlKHB1YmxpY3MpLCB7fX19OwotCi0gIHZlY3Rvcjx1bmlxdWVfcHRyPERlY2xhcmF0aW9uPj4gY2xhc3NlczsKLSAgY2xhc3Nlcy5wdXNoX2JhY2soc3RkOjptb3ZlKHRlc3QpKTsKLQotICB1bmlxdWVfcHRyPENwcE5hbWVzcGFjZT4gdGVzdF9uc3tuZXcgQ3BwTmFtZXNwYWNleyJ0ZXN0Iiwgc3RkOjptb3ZlKGNsYXNzZXMpfX07Ci0KLSAgdmVjdG9yPHVuaXF1ZV9wdHI8RGVjbGFyYXRpb24+PiB0ZXN0X25zX3ZlYzsKLSAgdGVzdF9uc192ZWMucHVzaF9iYWNrKHN0ZDo6bW92ZSh0ZXN0X25zKSk7Ci0KLSAgdW5pcXVlX3B0cjxDcHBOYW1lc3BhY2U+IGFuZHJvaWRfbnN7bmV3IENwcE5hbWVzcGFjZXsiYW5kcm9pZCIsIHN0ZDo6bW92ZSh0ZXN0X25zX3ZlYyl9fTsKLQotICB2ZWN0b3I8dW5pcXVlX3B0cjxEZWNsYXJhdGlvbj4+IHRlc3RfbnNfZ2xvYmFsczsKLSAgdGVzdF9uc19nbG9iYWxzLnB1c2hfYmFjayhzdGQ6Om1vdmUoYW5kcm9pZF9ucykpOwotCi0gIENwcEhlYWRlciBjcHBfaGVhZGVye3sic3RyaW5nIiwgIm1lbW9yeSJ9LCBzdGQ6Om1vdmUodGVzdF9uc19nbG9iYWxzKX07Ci0gIENvbXBhcmVHZW5lcmF0ZWRDb2RlKGNwcF9oZWFkZXIsIGtFeHBlY3RlZEdlbmVyaWNIZWFkZXJPdXRwdXQpOwotfQotCi1URVNUX0YoQXN0Q3BwVGVzdHMsIEdlbmVyYXRlc1Vuc2NvcGVkRW51bSkgewotICBFbnVtIGUoIkZvbyIsICIiLCBmYWxzZSk7Ci0gIGUuQWRkVmFsdWUoIkJBUiIsICI0MiIpOwotICBlLkFkZFZhbHVlKCJCQVoiLCAiIik7Ci0KLSAgc3RyaW5nIGV4cGVjdGVkID0KLSAgICAgIFIiKGVudW0gRm9vIHsKLSAgQkFSID0gNDIsCi0gIEJBWiwKLX07Ci0pIjsKLQotICBDb21wYXJlR2VuZXJhdGVkQ29kZShlLCBleHBlY3RlZCk7Ci19Ci0KLVRFU1RfRihBc3RDcHBUZXN0cywgR2VuZXJhdGVzU2NvcGVkRW51bSkgewotICBFbnVtIGUoIkZvbyIsICJpbnQzMl90IiwgdHJ1ZSk7Ci0gIGUuQWRkVmFsdWUoIkJBUiIsICI0MiIpOwotICBlLkFkZFZhbHVlKCJCQVoiLCAiIik7Ci0KLSAgc3RyaW5nIGV4cGVjdGVkID0KLSAgICAgIFIiKGVudW0gY2xhc3MgRm9vIDogaW50MzJfdCB7Ci0gIEJBUiA9IDQyLAotICBCQVosCi19OwotKSI7Ci0KLSAgQ29tcGFyZUdlbmVyYXRlZENvZGUoZSwgZXhwZWN0ZWQpOwotfQotCi1URVNUX0YoQXN0Q3BwVGVzdHMsIEdlbmVyYXRlc0FyZ0xpc3QpIHsKLSAgQXJnTGlzdCBzaW1wbGUoImZvbyIpOwotICBDb21wYXJlR2VuZXJhdGVkQ29kZShzaW1wbGUsICIoZm9vKSIpOwotICBBcmdMaXN0IGNvbXBvdW5kKHsiZm9vIiwgImJhciIsICJiYXoifSk7Ci0gIENvbXBhcmVHZW5lcmF0ZWRDb2RlKGNvbXBvdW5kLCAiKGZvbywgYmFyLCBiYXopIik7Ci0gIHN0ZDo6dmVjdG9yPHVuaXF1ZV9wdHI8QXN0Tm9kZT4+IGFyZ3M7Ci0gIGFyZ3MuZW1wbGFjZV9iYWNrKG5ldyBMaXRlcmFsRXhwcmVzc2lvbigiZm9vKCkiKSk7Ci0gIEFyZ0xpc3QgbmVzdGVkKHN0ZDo6bW92ZShhcmdzKSk7Ci0gIENvbXBhcmVHZW5lcmF0ZWRDb2RlKG5lc3RlZCwgIihmb28oKSkiKTsKLX0KLQotVEVTVF9GKEFzdENwcFRlc3RzLCBHZW5lcmF0ZXNTdGF0ZW1lbnQpIHsKLSAgU3RhdGVtZW50IHMobmV3IExpdGVyYWxFeHByZXNzaW9uKCJmb28iKSk7Ci0gIENvbXBhcmVHZW5lcmF0ZWRDb2RlKHMsICJmb287XG4iKTsKLX0KLQotVEVTVF9GKEFzdENwcFRlc3RzLCBHZW5lcmF0ZXNDb21wYXJpc29uKSB7Ci0gIENvbXBhcmlzb24gYygKLSAgICAgIG5ldyBMaXRlcmFsRXhwcmVzc2lvbigibGhzIiksICImJiIsIG5ldyBMaXRlcmFsRXhwcmVzc2lvbigicmhzIikpOwotICBDb21wYXJlR2VuZXJhdGVkQ29kZShjLCAiKChsaHMpICYmIChyaHMpKSIpOwotfQotCi1URVNUX0YoQXN0Q3BwVGVzdHMsIEdlbmVyYXRlc1N0YXRlbWVudEJsb2NrKSB7Ci0gIFN0YXRlbWVudEJsb2NrIGJsb2NrOwotICBibG9jay5BZGRTdGF0ZW1lbnQodW5pcXVlX3B0cjxBc3ROb2RlPihuZXcgU3RhdGVtZW50KCJmb28iKSkpOwotICBibG9jay5BZGRTdGF0ZW1lbnQodW5pcXVlX3B0cjxBc3ROb2RlPihuZXcgU3RhdGVtZW50KCJiYXIiKSkpOwotICBDb21wYXJlR2VuZXJhdGVkQ29kZShibG9jaywgIntcbiAgZm9vO1xuICBiYXI7XG59XG4iKTsKLX0KLQotVEVTVF9GKEFzdENwcFRlc3RzLCBHZW5lcmF0ZXNDb25zdHJ1Y3RvckltcGwpIHsKLSAgQ29uc3RydWN0b3JJbXBsIGMoIkNsYXNzTmFtZSIsIEFyZ0xpc3QoeyJhIiwgImIiLCAiYyJ9KSwKLSAgICAgICAgICAgICAgICAgICAgeyJiYXpfKGZvbykiLCAiYmFyXyhibGFoKSJ9KTsKLSAgc3RyaW5nIGV4cGVjdGVkID0gUiIoQ2xhc3NOYW1lOjpDbGFzc05hbWUoYSwgYiwgYykKLSAgICA6IGJhel8oZm9vKSwKLSAgICAgIGJhcl8oYmxhaCl7Ci19Ci0pIjsKLSAgQ29tcGFyZUdlbmVyYXRlZENvZGUoYywgZXhwZWN0ZWQpOwotfQotCi1URVNUX0YoQXN0Q3BwVGVzdHMsIEdlbmVyYXRlc0Fzc2lnbm1lbnQpIHsKLSAgQXNzaWdubWVudCBzaW1wbGUoImZvbyIsICI4Iik7Ci0gIENvbXBhcmVHZW5lcmF0ZWRDb2RlKHNpbXBsZSwgImZvbyA9IDg7XG4iKTsKLSAgQXNzaWdubWVudCBsZXNzX3NpbXBsZSgiZm9vIiwgbmV3IE1ldGhvZENhbGwoImYiLCAiOCIpKTsKLSAgQ29tcGFyZUdlbmVyYXRlZENvZGUobGVzc19zaW1wbGUsICJmb28gPSBmKDgpO1xuIik7Ci19Ci0KLVRFU1RfRihBc3RDcHBUZXN0cywgR2VuZXJhdGVzTWV0aG9kQ2FsbCkgewotICBNZXRob2RDYWxsIHNpbmdsZSgic2luZ2xlIiwgImFyZyIpOwotICBDb21wYXJlR2VuZXJhdGVkQ29kZShzaW5nbGUsICJzaW5nbGUoYXJnKSIpOwotICBNZXRob2RDYWxsIG11bHRpKAotICAgICAgIm11bHRpIiwKLSAgICAgIEFyZ0xpc3QoeyJoYXMiLCAic29tZSIsICJhcmdzIn0pKTsKLSAgQ29tcGFyZUdlbmVyYXRlZENvZGUobXVsdGksICJtdWx0aShoYXMsIHNvbWUsIGFyZ3MpIik7Ci19Ci0KLVRFU1RfRihBc3RDcHBUZXN0cywgR2VuZXJhdGVzSWZTdGF0ZW1lbnQpIHsKLSAgSWZTdGF0ZW1lbnQgcyhuZXcgTGl0ZXJhbEV4cHJlc3Npb24oImZvbyIpKTsKLSAgcy5PblRydWUoKS0+QWRkTGl0ZXJhbCgib24gdHJ1ZTEiKTsKLSAgcy5PbkZhbHNlKCktPkFkZExpdGVyYWwoIm9uIGZhbHNlIik7Ci0gIENvbXBhcmVHZW5lcmF0ZWRDb2RlKHMsICJpZiAoZm9vKSB7XG4gIG9uIHRydWUxO1xufVxuZWxzZSB7XG4gIG9uIGZhbHNlO1xufVxuIik7Ci0KLSAgSWZTdGF0ZW1lbnQgczIobmV3IExpdGVyYWxFeHByZXNzaW9uKCJiYXIiKSk7Ci0gIHMyLk9uVHJ1ZSgpLT5BZGRMaXRlcmFsKCJvbiB0cnVlMSIpOwotICBDb21wYXJlR2VuZXJhdGVkQ29kZShzMiwgImlmIChiYXIpIHtcbiAgb24gdHJ1ZTE7XG59XG4iKTsKLX0KLQotVEVTVF9GKEFzdENwcFRlc3RzLCBHZW5lcmF0ZXNTd2l0Y2hTdGF0ZW1lbnQpIHsKLSAgU3dpdGNoU3RhdGVtZW50IHMoInZhciIpOwotICAvLyBUaGVzZSBhcmUgaW50ZW50aW9uYWxseSBvdXQgb2YgYWxwaGFudW1lcmljIG9yZGVyLiAgV2UncmUgdGVzdGluZwotICAvLyB0aGF0IHN3aXRjaCByZXNwZWN0cyBjYXNlIGFkZGl0aW9uIG9yZGVyLgotICBhdXRvIGNhc2UyID0gcy5BZGRDYXNlKCIyIik7Ci0gIGNhc2UyLT5BZGRTdGF0ZW1lbnQodW5pcXVlX3B0cjxBc3ROb2RlPntuZXcgU3RhdGVtZW50eyJiYXoifX0pOwotICBhdXRvIGNhc2UxID0gcy5BZGRDYXNlKCIxIik7Ci0gIGNhc2UxLT5BZGRTdGF0ZW1lbnQodW5pcXVlX3B0cjxBc3ROb2RlPntuZXcgU3RhdGVtZW50eyJmb28ifX0pOwotICBjYXNlMS0+QWRkU3RhdGVtZW50KHVuaXF1ZV9wdHI8QXN0Tm9kZT57bmV3IFN0YXRlbWVudHsiYmFyIn19KTsKLSAgQ29tcGFyZUdlbmVyYXRlZENvZGUocywga0V4cGVjdGVkU3dpdGNoT3V0cHV0KTsKLX0KLQotVEVTVF9GKEFzdENwcFRlc3RzLCBHZW5lcmF0ZXNNZXRob2RJbXBsKSB7Ci0gIE1ldGhvZEltcGwgbXsicmV0dXJuX3R5cGUiLAotICAgICAgICAgICAgICAgIkNsYXNzTmFtZSIsCi0gICAgICAgICAgICAgICAiTWV0aG9kTmFtZSIsCi0gICAgICAgICAgICAgICB7fSwKLSAgICAgICAgICAgICAgIEFyZ0xpc3R7eyJpbnQzMl90IGEiLCAiaW50MzJfdCBiIiwgImludDMyX3QqIGMifX0sCi0gICAgICAgICAgICAgICB0cnVlfTsKLSAgYXV0byBiID0gbS5HZXRTdGF0ZW1lbnRCbG9jaygpOwotICBiLT5BZGRMaXRlcmFsKCJmb28iKTsKLSAgYi0+QWRkTGl0ZXJhbCgiYmFyIik7Ci0gIENvbXBhcmVHZW5lcmF0ZWRDb2RlKG0sIGtFeHBlY3RlZE1ldGhvZEltcGxPdXRwdXQpOwotfQotCi1URVNUX0YoQXN0Q3BwVGVzdHMsIEdlbmVyYXRlc0dlbmVyaWNNZXRob2RJbXBsKSB7Ci0gIE1ldGhvZEltcGwgbXsicmV0dXJuX3R5cGUiLAotICAgICAgICAgICAgICAgIkNsYXNzTmFtZSIsCi0gICAgICAgICAgICAgICAiTWV0aG9kTmFtZSIsCi0gICAgICAgICAgICAgICB7IlQifSwKLSAgICAgICAgICAgICAgIEFyZ0xpc3R7eyJpbnQzMl90IGEiLCAiaW50MzJfdCBiIiwgImludDMyX3QqIGMifX0sCi0gICAgICAgICAgICAgICB0cnVlfTsKLSAgYXV0byBiID0gbS5HZXRTdGF0ZW1lbnRCbG9jaygpOwotICBiLT5BZGRMaXRlcmFsKCJmb28iKTsKLSAgYi0+QWRkTGl0ZXJhbCgiYmFyIik7Ci0gIENvbXBhcmVHZW5lcmF0ZWRDb2RlKG0sIGtFeHBlY3RlZEdlbmVyaWNNZXRob2RJbXBsT3V0cHV0KTsKLX0KLQotVEVTVF9GKEFzdENwcFRlc3RzLCBUb1N0cmluZykgewotICBzdGQ6OnN0cmluZyBsaXRlcmFsID0gInZvaWQgZm9vKCkge30iOwotICBMaXRlcmFsRGVjbCBkZWNsKGxpdGVyYWwpOwotICBzdGQ6OnN0cmluZyBhY3R1YWwgPSBkZWNsLlRvU3RyaW5nKCk7Ci0gIEVYUEVDVF9FUShsaXRlcmFsLCBhY3R1YWwpOwotICBzdGQ6OnN0cmluZyB3cml0dGVuOwotICBkZWNsLldyaXRlKENvZGVXcml0ZXI6OkZvclN0cmluZygmd3JpdHRlbikuZ2V0KCkpOwotICBFWFBFQ1RfRVEobGl0ZXJhbCwgd3JpdHRlbik7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBjcHAKLX0gIC8vIG5hbWVzcGFjZSBhaWRsCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYXN0X2phdmEuY3BwIGIvYXN0X2phdmEuY3BwCmluZGV4IDA2NjYyNGUuLjdkOTViZDQgMTAwNjQ0Ci0tLSBhL2FzdF9qYXZhLmNwcAorKysgYi9hc3RfamF2YS5jcHAKQEAgLTIzMywxNSArMjMzLDYgQEAKICAgdG8tPldyaXRlKCIpIik7CiB9CiAKLU5ld0FycmF5RXhwcmVzc2lvbjo6TmV3QXJyYXlFeHByZXNzaW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiB0LCBzdGQ6OnNoYXJlZF9wdHI8RXhwcmVzc2lvbj4gcykKLSAgICA6IHR5cGUodCksIHNpemUocykge30KLQotdm9pZCBOZXdBcnJheUV4cHJlc3Npb246OldyaXRlKENvZGVXcml0ZXIqIHRvKSBjb25zdCB7Ci0gIHRvLT5Xcml0ZSgibmV3ICVzWyIsIHRoaXMtPnR5cGUuY19zdHIoKSk7Ci0gIHNpemUtPldyaXRlKHRvKTsKLSAgdG8tPldyaXRlKCJdIik7Ci19Ci0KIENhc3Q6OkNhc3QoY29uc3Qgc3RkOjpzdHJpbmcmIHQsIHN0ZDo6c2hhcmVkX3B0cjxFeHByZXNzaW9uPiBlKSA6IHR5cGUodCksIGV4cHJlc3Npb24oZSkge30KIAogdm9pZCBDYXN0OjpXcml0ZShDb2RlV3JpdGVyKiB0bykgY29uc3QgewpAQCAtMjg1LDYgKzI3NiwxMCBAQAogICB0by0+V3JpdGUoIjtcbiIpOwogfQogCit2b2lkIEJyZWFrU3RhdGVtZW50OjpXcml0ZShDb2RlV3JpdGVyKiB0bykgY29uc3QgeworICB0by0+V3JpdGUoImJyZWFrO1xuIik7Cit9CisKIHZvaWQgVHJ5U3RhdGVtZW50OjpXcml0ZShDb2RlV3JpdGVyKiB0bykgY29uc3QgewogICB0by0+V3JpdGUoInRyeSAiKTsKICAgdGhpcy0+c3RhdGVtZW50cy0+V3JpdGUodG8pOwpAQCAtNDMyLDMxICs0MjcsNiBAQAogICB0by0+V3JpdGUoIn1cbiIpOwogfQogCi1Eb2N1bWVudDo6RG9jdW1lbnQoY29uc3Qgc3RkOjpzdHJpbmcmIGNvbW1lbnQsCi0gICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBhY2thZ2UsCi0gICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENsYXNzPiBjbGF6eikKLSAgICA6IGNvbW1lbnRfKGNvbW1lbnQpLAotICAgICAgcGFja2FnZV8ocGFja2FnZSksCi0gICAgICBjbGF6el8oc3RkOjptb3ZlKGNsYXp6KSkgewotfQotCi12b2lkIERvY3VtZW50OjpXcml0ZShDb2RlV3JpdGVyKiB0bykgY29uc3QgewotICBpZiAoIWNvbW1lbnRfLmVtcHR5KCkpIHsKLSAgICB0by0+V3JpdGUoIiVzXG4iLCBjb21tZW50Xy5jX3N0cigpKTsKLSAgfQotICB0by0+V3JpdGUoCi0gICAgICAiLypcbiIKLSAgICAgICIgKiBUaGlzIGZpbGUgaXMgYXV0by1nZW5lcmF0ZWQuICBETyBOT1QgTU9ESUZZLlxuIgotICAgICAgIiAqL1xuIik7Ci0gIGlmICghcGFja2FnZV8uZW1wdHkoKSkgewotICAgIHRvLT5Xcml0ZSgicGFja2FnZSAlcztcbiIsIHBhY2thZ2VfLmNfc3RyKCkpOwotICB9Ci0KLSAgaWYgKGNsYXp6XykgewotICAgIGNsYXp6Xy0+V3JpdGUodG8pOwotICB9Ci19Ci0KIHN0ZDo6c2hhcmVkX3B0cjxFeHByZXNzaW9uPiBOVUxMX1ZBTFVFID0gc3RkOjptYWtlX3NoYXJlZDxMaXRlcmFsRXhwcmVzc2lvbj4oIm51bGwiKTsKIHN0ZDo6c2hhcmVkX3B0cjxFeHByZXNzaW9uPiBUSElTX1ZBTFVFID0gc3RkOjptYWtlX3NoYXJlZDxMaXRlcmFsRXhwcmVzc2lvbj4oInRoaXMiKTsKIHN0ZDo6c2hhcmVkX3B0cjxFeHByZXNzaW9uPiBTVVBFUl9WQUxVRSA9IHN0ZDo6bWFrZV9zaGFyZWQ8TGl0ZXJhbEV4cHJlc3Npb24+KCJzdXBlciIpOwpkaWZmIC0tZ2l0IGEvYXN0X2phdmEuaCBiL2FzdF9qYXZhLmgKaW5kZXggZDRlODk0NC4uZDdlNWNiNSAxMDA2NDQKLS0tIGEvYXN0X2phdmEuaAorKysgYi9hc3RfamF2YS5oCkBAIC0yMDcsMTUgKzIwNyw2IEBACiAgIHZvaWQgV3JpdGUoQ29kZVdyaXRlciogdG8pIGNvbnN0IG92ZXJyaWRlOwogfTsKIAotc3RydWN0IE5ld0FycmF5RXhwcmVzc2lvbiA6IHB1YmxpYyBFeHByZXNzaW9uIHsKLSAgY29uc3Qgc3RkOjpzdHJpbmcgdHlwZTsKLSAgc3RkOjpzaGFyZWRfcHRyPEV4cHJlc3Npb24+IHNpemU7Ci0KLSAgTmV3QXJyYXlFeHByZXNzaW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiB0eXBlLCBzdGQ6OnNoYXJlZF9wdHI8RXhwcmVzc2lvbj4gc2l6ZSk7Ci0gIHZpcnR1YWwgfk5ld0FycmF5RXhwcmVzc2lvbigpID0gZGVmYXVsdDsKLSAgdm9pZCBXcml0ZShDb2RlV3JpdGVyKiB0bykgY29uc3Qgb3ZlcnJpZGU7Ci19OwotCiBzdHJ1Y3QgQ2FzdCA6IHB1YmxpYyBFeHByZXNzaW9uIHsKICAgY29uc3Qgc3RkOjpzdHJpbmcgdHlwZTsKICAgc3RkOjpzaGFyZWRfcHRyPEV4cHJlc3Npb24+IGV4cHJlc3Npb24gPSBudWxscHRyOwpAQCAtMjU0LDYgKzI0NSwxMiBAQAogICB2b2lkIFdyaXRlKENvZGVXcml0ZXIqIHRvKSBjb25zdCBvdmVycmlkZTsKIH07CiAKK3N0cnVjdCBCcmVha1N0YXRlbWVudCA6IHB1YmxpYyBTdGF0ZW1lbnQgeworICBCcmVha1N0YXRlbWVudCgpID0gZGVmYXVsdDsKKyAgdmlydHVhbCB+QnJlYWtTdGF0ZW1lbnQoKSA9IGRlZmF1bHQ7CisgIHZvaWQgV3JpdGUoQ29kZVdyaXRlciogdG8pIGNvbnN0IG92ZXJyaWRlOworfTsKKwogc3RydWN0IFRyeVN0YXRlbWVudCA6IHB1YmxpYyBTdGF0ZW1lbnQgewogICBzdGQ6OnNoYXJlZF9wdHI8U3RhdGVtZW50QmxvY2s+IHN0YXRlbWVudHMgPSBzdGQ6Om1ha2Vfc2hhcmVkPFN0YXRlbWVudEJsb2NrPigpOwogCkBAIC0zMzIsMjAgKzMyOSw2IEBACiAgIHZvaWQgV3JpdGUoQ29kZVdyaXRlciogdG8pIGNvbnN0IG92ZXJyaWRlOwogfTsKIAotY2xhc3MgRG9jdW1lbnQgOiBwdWJsaWMgQXN0Tm9kZSB7Ci0gcHVibGljOgotICBEb2N1bWVudChjb25zdCBzdGQ6OnN0cmluZyYgY29tbWVudCwKLSAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBhY2thZ2UsCi0gICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDbGFzcz4gY2xhenopOwotICB2aXJ0dWFsIH5Eb2N1bWVudCgpID0gZGVmYXVsdDsKLSAgdm9pZCBXcml0ZShDb2RlV3JpdGVyKiB0bykgY29uc3Qgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBzdGQ6OnN0cmluZyBjb21tZW50XzsKLSAgc3RkOjpzdHJpbmcgcGFja2FnZV87Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDbGFzcz4gY2xhenpfOwotfTsKLQogZXh0ZXJuIHN0ZDo6c2hhcmVkX3B0cjxFeHByZXNzaW9uPiBOVUxMX1ZBTFVFOwogZXh0ZXJuIHN0ZDo6c2hhcmVkX3B0cjxFeHByZXNzaW9uPiBUSElTX1ZBTFVFOwogZXh0ZXJuIHN0ZDo6c2hhcmVkX3B0cjxFeHByZXNzaW9uPiBTVVBFUl9WQUxVRTsKZGlmZiAtLWdpdCBhL2J1aWxkL0FuZHJvaWQuYnAgYi9idWlsZC9BbmRyb2lkLmJwCmluZGV4IDUzY2Y5ZGIuLjI0YjRhOTMgMTAwNjQ0Ci0tLSBhL2J1aWxkL0FuZHJvaWQuYnAKKysrIGIvYnVpbGQvQW5kcm9pZC5icApAQCAtMjcsNyArMjcsNiBAQAogICAgIGRlcHM6IFsKICAgICAgICAgImJsdWVwcmludCIsCiAgICAgICAgICJzb29uZyIsCi0gICAgICAgICJzb29uZy1hcGV4IiwKICAgICAgICAgInNvb25nLWFuZHJvaWQiLAogICAgICAgICAic29vbmctY2MiLAogICAgICAgICAic29vbmctZ2VucnVsZSIsCkBAIC02Myw4ICs2MiwxMSBAQAogLy8gYmUgbW92ZWQgYmFjayB0byBMb2FkSG9vaywgYW5kIHRoZW4gZGVmYXVsdCBjYW4gYmUgYXBwbGllZCBhcyB3ZWxsLgogY2NfZGVmYXVsdHMgewogICAgIG5hbWU6ICJhaWRsLWNwcC1tb2R1bGUtZGVmYXVsdHMiLAotICAgIC8vIFRPRE8oYi8zMTU1OTA5NSk6IHJlbW92ZSB3aGVuIGhvc3QgYmlvbmljIGlzIGF2YWlsYWJsZQotICAgIGRlZmF1bHRzOiBbImxpYmJpbmRlcl9uZGtfaG9zdF91c2VyIl0sCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKIH0KIAogamF2YV9kZWZhdWx0cyB7CkBAIC0xMDIsMTAgKzEwNCw0OCBAQAogICAgICAgICAiMSIsCiAgICAgICAgICIyIiwKICAgICAgICAgIjMiLAorICAgICAgICAiNCIsCiAgICAgXSwKIH0KIAogYWlkbF9pbnRlcmZhY2UgeworICAgIG5hbWU6ICJ0ZXN0LXBpZWNlLW5kay1zZGstMjkiLAorICAgIGxvY2FsX2luY2x1ZGVfZGlyOiAidGVzdHNfMSIsCisgICAgZmxhZ3M6IFsiLVdlcnJvciJdLAorICAgIHNyY3M6IFsKKyAgICAgICAgInRlc3RzXzEvc29tZV9wYWNrYWdlL0lGb28uYWlkbCIsCisgICAgICAgICJ0ZXN0c18xL3NvbWVfcGFja2FnZS9UaGluZy5haWRsIiwKKyAgICAgICAgInRlc3RzXzEvc29tZV9wYWNrYWdlL3N1Yl9wYWNrYWdlLyouYWlkbCIsIC8vIHRlc3RpbmcgZ2xvYiB3L28gZmlsZWdyb3VwCisgICAgXSwKKyAgICB1bnN0YWJsZTogdHJ1ZSwKKyAgICBiYWNrZW5kOiB7IG5kazogeyBzZGtfdmVyc2lvbjogIjI5IiwgfSwgfSwKK30KK2FpZGxfaW50ZXJmYWNlIHsKKyAgICBuYW1lOiAidGVzdC1waWVjZS1uZGstc2RrLTMwIiwKKyAgICBsb2NhbF9pbmNsdWRlX2RpcjogInRlc3RzXzEiLAorICAgIGZsYWdzOiBbIi1XZXJyb3IiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJ0ZXN0c18xL3NvbWVfcGFja2FnZS9JRm9vLmFpZGwiLAorICAgICAgICAidGVzdHNfMS9zb21lX3BhY2thZ2UvVGhpbmcuYWlkbCIsCisgICAgICAgICJ0ZXN0c18xL3NvbWVfcGFja2FnZS9zdWJfcGFja2FnZS8qLmFpZGwiLCAvLyB0ZXN0aW5nIGdsb2Igdy9vIGZpbGVncm91cAorICAgIF0sCisgICAgdW5zdGFibGU6IHRydWUsCisgICAgYmFja2VuZDogeyBuZGs6IHsgc2RrX3ZlcnNpb246ICIzMCIsIH0sIH0sCit9CithaWRsX2ludGVyZmFjZSB7CisgICAgbmFtZTogInRlc3QtcGllY2UtbmRrLXNkay0zMSIsCisgICAgbG9jYWxfaW5jbHVkZV9kaXI6ICJ0ZXN0c18xIiwKKyAgICBmbGFnczogWyItV2Vycm9yIl0sCisgICAgc3JjczogWworICAgICAgICAidGVzdHNfMS9zb21lX3BhY2thZ2UvSUZvby5haWRsIiwKKyAgICAgICAgInRlc3RzXzEvc29tZV9wYWNrYWdlL1RoaW5nLmFpZGwiLAorICAgICAgICAidGVzdHNfMS9zb21lX3BhY2thZ2Uvc3ViX3BhY2thZ2UvKi5haWRsIiwgLy8gdGVzdGluZyBnbG9iIHcvbyBmaWxlZ3JvdXAKKyAgICBdLAorICAgIHVuc3RhYmxlOiB0cnVlLAorICAgIGJhY2tlbmQ6IHsgbmRrOiB7IHNka192ZXJzaW9uOiAiMzEiLCB9LCB9LAorfQorCithaWRsX2ludGVyZmFjZSB7CiAgICAgbmFtZTogInRlc3QtcGllY2UtMiIsCiAgICAgbG9jYWxfaW5jbHVkZV9kaXI6ICJ0ZXN0c18xIiwKICAgICBmbGFnczogWyItV2Vycm9yIl0sCkBAIC0xMTQsNyArMTU0LDcgQEAKICAgICAgICAgInRlc3RzXzEvc29tZV9wYWNrYWdlL0lCYXIuYWlkbCIsCiAgICAgXSwKICAgICBpbXBvcnRzOiBbCi0gICAgICAgICJ0ZXN0LXBpZWNlLTEiLAorICAgICAgICAidGVzdC1waWVjZS0xLVYzIiwKICAgICBdLAogICAgIGJhY2tlbmQ6IHsKICAgICAgICAgamF2YTogewpAQCAtMTIyLDcgKzE2MiwxMyBAQAogICAgICAgICB9LAogICAgIH0sCiAgICAgZ2VuX3RyYWNlOiB0cnVlLAotICAgIHZlcnNpb25zOiBbIjEiXSwKKyAgICB2ZXJzaW9uc193aXRoX2luZm86IFsKKyAgICAgICAgeworICAgICAgICAgICAgdmVyc2lvbjogIjEiLAorICAgICAgICAgICAgaW1wb3J0czogWyJ0ZXN0LXBpZWNlLTEtVjMiXSwKKyAgICAgICAgfSwKKyAgICBdLAorCiB9CiAKIGFpZGxfaW50ZXJmYWNlIHsKQEAgLTEzMyw3ICsxNzksNyBAQAogICAgICAgICAidGVzdHNfMS9vdGhlcl9wYWNrYWdlL0lCYXouYWlkbCIsCiAgICAgXSwKICAgICBpbXBvcnRzOiBbCi0gICAgICAgICJ0ZXN0LXBpZWNlLTIiLAorICAgICAgICAidGVzdC1waWVjZS0yLVYxIiwKICAgICBdLAogICAgIGJhY2tlbmQ6IHsKICAgICAgICAgamF2YTogewpAQCAtMTUyLDcgKzE5OCw3IEBACiAgICAgICAgICJ0ZXN0c18yL2Fub3RoZXJfcGFja2FnZS9JRmF6LmFpZGwiLAogICAgIF0sCiAgICAgaW1wb3J0czogWwotICAgICAgICAidGVzdC1waWVjZS0xIiwKKyAgICAgICAgInRlc3QtcGllY2UtMS1WMyIsCiAgICAgXSwKICAgICBiYWNrZW5kOiB7CiAgICAgICAgIGphdmE6IHsKQEAgLTE3Myw3ICsyMTksNyBAQAogICAgICAgICAidGVzdF9wYWNrYWdlL0lCYXouYWlkbCIsCiAgICAgXSwKICAgICBpbXBvcnRzOiBbCi0gICAgICAgICJ0ZXN0LXBpZWNlLTIiLAorICAgICAgICAidGVzdC1waWVjZS0yLVYxIiwKICAgICBdLAogICAgIGJhY2tlbmQ6IHsKICAgICAgICAgamF2YTogewpAQCAtMTg0LDYgKzIzMCw3IEBACiAgICAgdmVyc2lvbnM6IFsKICAgICAgICAgIjEiLAogICAgICAgICAiMiIsCisgICAgICAgICIzIiwKICAgICBdLAogfQogCkBAIC0xOTgsMTMgKzI0NSwyNCBAQAogICAgIF0sCiB9CiAKK2FpZGxfaW50ZXJmYWNlIHsKKyAgICBuYW1lOiAidGVzdC1waWVjZS02IiwKKyAgICB1bnN0YWJsZTogdHJ1ZSwKKyAgICBsb2NhbF9pbmNsdWRlX2RpcjogInRlc3RzXzYiLAorICAgIGZsYWdzOiBbIi1XZXJyb3IiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJ0ZXN0c182L3Rlc3Q2L0Jhci5haWRsIiwKKyAgICAgICAgInRlc3RzXzYvdGVzdDYvRm9vLmFpZGwiLAorICAgIF0sCit9CisKIC8vIFRoZXNlIHRlc3QgdGhhdCBhIHBhcmNlbCBpbXBvcnRlZCBmcm9tIEEtPkItPkMgd2lsbCBoYXZlIHRoZSByZXF1aXJlZCBkZXBlbmRlbmNpZXMgdG8gbGluayBpbgogLy8gYWxsIGJhY2tlbmRzIChDKysgYmFja2VuZHMgbmVlZCB0byBsaW5rIGRpcmVjbHR5IGFnYWluc3QgdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBwYXJjZWxhYmxlCiAvLyBpbiBvcmRlciB0byB3b3JrKQogYWlkbF9pbnRlcmZhY2UgewogICAgIG5hbWU6ICJ0ZXN0c190cmFuc2l0aXZlX3BhcmNlbC5hIiwKICAgICBmbGFnczogWyItV2Vycm9yIl0sCi0gICAgc3JjczogWyAidGVzdHNfdHJhbnNpdGl2ZV9wYXJjZWwvYS8qLmFpZGwiIF0sCisgICAgc3JjczogWyJ0ZXN0c190cmFuc2l0aXZlX3BhcmNlbC9hLyouYWlkbCJdLAogICAgIGltcG9ydHM6IFsKICAgICAgICAgInRlc3RzX3RyYW5zaXRpdmVfcGFyY2VsLmIiLAogICAgICAgICAidGVzdHNfdHJhbnNpdGl2ZV9wYXJjZWwuYyIsCkBAIC0yMjAsOCArMjc4LDggQEAKIGFpZGxfaW50ZXJmYWNlIHsKICAgICBuYW1lOiAidGVzdHNfdHJhbnNpdGl2ZV9wYXJjZWwuYiIsCiAgICAgZmxhZ3M6IFsiLVdlcnJvciJdLAotICAgIHNyY3M6IFsgInRlc3RzX3RyYW5zaXRpdmVfcGFyY2VsL2IvKi5haWRsIiBdLAotICAgIGltcG9ydHM6IFsgInRlc3RzX3RyYW5zaXRpdmVfcGFyY2VsLmMiIF0sCisgICAgc3JjczogWyJ0ZXN0c190cmFuc2l0aXZlX3BhcmNlbC9iLyouYWlkbCJdLAorICAgIGltcG9ydHM6IFsidGVzdHNfdHJhbnNpdGl2ZV9wYXJjZWwuYyJdLAogICAgIHVuc3RhYmxlOiB0cnVlLAogICAgIGJhY2tlbmQ6IHsKICAgICAgICAgcnVzdDogewpAQCAtMjMzLDcgKzI5MSw3IEBACiBhaWRsX2ludGVyZmFjZSB7CiAgICAgbmFtZTogInRlc3RzX3RyYW5zaXRpdmVfcGFyY2VsLmMiLAogICAgIGZsYWdzOiBbIi1XZXJyb3IiXSwKLSAgICBzcmNzOiBbICJ0ZXN0c190cmFuc2l0aXZlX3BhcmNlbC9jLyouYWlkbCIgXSwKKyAgICBzcmNzOiBbInRlc3RzX3RyYW5zaXRpdmVfcGFyY2VsL2MvKi5haWRsIl0sCiAgICAgdW5zdGFibGU6IHRydWUsCiAgICAgYmFja2VuZDogewogICAgICAgICBydXN0OiB7CkBAIC0yNDEsMyArMjk5LDkgQEAKICAgICAgICAgfSwKICAgICB9LAogfQorCitzaF9iaW5hcnkgeworICAgIG5hbWU6ICJhaWRsX2hhc2hfZ2VuIiwKKyAgICBzcmM6ICJoYXNoX2dlbi5zaCIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCit9CmRpZmYgLS1naXQgYS9idWlsZC9haWRsX2FwaS5nbyBiL2J1aWxkL2FpZGxfYXBpLmdvCmluZGV4IDI3OTgzNzQuLjFmYzQ0NzQgMTAwNjQ0Ci0tLSBhL2J1aWxkL2FpZGxfYXBpLmdvCisrKyBiL2J1aWxkL2FpZGxfYXBpLmdvCkBAIC0zMSwzMiArMzEsMzIgQEAKIAlhaWRsRHVtcEFwaVJ1bGUgPSBwY3R4LlN0YXRpY1J1bGUoImFpZGxEdW1wQXBpUnVsZSIsIGJsdWVwcmludC5SdWxlUGFyYW1zewogCQlDb21tYW5kOiBgcm0gLXJmICIke291dERpcn0iICYmIG1rZGlyIC1wICIke291dERpcn0iICYmIGAgKwogCQkJYCR7YWlkbENtZH0gLS1kdW1wYXBpIC0tc3RydWN0dXJlZCAke2ltcG9ydHN9ICR7b3B0aW9uYWxGbGFnc30gLS1vdXQgJHtvdXREaXJ9ICR7aW59ICYmIGAgKwotCQkJYChjZCAke291dERpcn0gJiYgZmluZCAuLyAtbmFtZSAiKi5haWRsIiAtcHJpbnQwIHwgTENfQUxMPUMgc29ydCAteiB8IHhhcmdzIC0wIHNoYTFzdW0gJiYgZWNobyAke2xhdGVzdFZlcnNpb259KSB8IHNoYTFzdW0gfCBjdXQgLWQgIiAiIC1mIDEgPiAke2hhc2hGaWxlfSBgLAotCQlDb21tYW5kRGVwczogW11zdHJpbmd7IiR7YWlkbENtZH0ifSwKKwkJCWAke2FpZGxIYXNoR2VufSAke291dERpcn0gJHtsYXRlc3RWZXJzaW9ufSAke2hhc2hGaWxlfWAsCisJCUNvbW1hbmREZXBzOiBbXXN0cmluZ3siJHthaWRsQ21kfSIsICIke2FpZGxIYXNoR2VufSJ9LAogCX0sICJvcHRpb25hbEZsYWdzIiwgImltcG9ydHMiLCAib3V0RGlyIiwgImhhc2hGaWxlIiwgImxhdGVzdFZlcnNpb24iKQogCiAJYWlkbENoZWNrQXBpUnVsZSA9IHBjdHguU3RhdGljUnVsZSgiYWlkbENoZWNrQXBpUnVsZSIsIGJsdWVwcmludC5SdWxlUGFyYW1zewotCQlDb21tYW5kOiBgKCR7YWlkbENtZH0gJHtvcHRpb25hbEZsYWdzfSAtLWNoZWNrYXBpPSR7Y2hlY2tBcGlMZXZlbH0gJHtvbGR9ICR7bmV3fSAmJiB0b3VjaCAke291dH0pIHx8IGAgKworCQlDb21tYW5kOiBgKCR7YWlkbENtZH0gJHtvcHRpb25hbEZsYWdzfSAtLWNoZWNrYXBpPSR7Y2hlY2tBcGlMZXZlbH0gJHtpbXBvcnRzfSAke29sZH0gJHtuZXd9ICYmIHRvdWNoICR7b3V0fSkgfHwgYCArCiAJCQlgKGNhdCAke21lc3NhZ2VGaWxlfSAmJiBleGl0IDEpYCwKIAkJQ29tbWFuZERlcHM6IFtdc3RyaW5neyIke2FpZGxDbWR9In0sCiAJCURlc2NyaXB0aW9uOiAiQUlETCBDSEVDSyBBUEk6ICR7bmV3fSBhZ2FpbnN0ICR7b2xkfSIsCi0JfSwgIm9wdGlvbmFsRmxhZ3MiLCAib2xkIiwgIm5ldyIsICJtZXNzYWdlRmlsZSIsICJjaGVja0FwaUxldmVsIikKKwl9LCAib3B0aW9uYWxGbGFncyIsICJpbXBvcnRzIiwgIm9sZCIsICJuZXciLCAibWVzc2FnZUZpbGUiLCAiY2hlY2tBcGlMZXZlbCIpCiAKIAlhaWRsVmVyaWZ5SGFzaFJ1bGUgPSBwY3R4LlN0YXRpY1J1bGUoImFpZGxWZXJpZnlIYXNoUnVsZSIsIGJsdWVwcmludC5SdWxlUGFyYW1zewotCQlDb21tYW5kOiBgaWYgWyAkJChjZCAnJHthcGlEaXJ9JyAmJiB7IGZpbmQgLi8gLW5hbWUgIiouYWlkbCIgLXByaW50MCB8IExDX0FMTD1DIHNvcnQgLXogfCB4YXJncyAtMCBzaGExc3VtICYmIGVjaG8gJHt2ZXJzaW9ufTsgfSB8IHNoYTFzdW0gfCBjdXQgLWQgIiAiIC1mIDEpID0gJCQocmVhZCAtciA8JyR7aGFzaEZpbGV9JyBoYXNoIGV4dHJhOyBwcmludGYgJXMgJCRoYXNoKSBdOyB0aGVuIGAgKworCQlDb21tYW5kOiBgaWYgWyAkJChjZCAnJHthcGlEaXJ9JyAmJiB7IGZpbmQgLi8gLW5hbWUgIiouYWlkbCIgLXByaW50MCB8IExDX0FMTD1DIHNvcnQgLXogfCB4YXJncyAtMCBzaGExc3VtICYmIGVjaG8gJHt2ZXJzaW9ufTsgfSB8IHNoYTFzdW0gfCBjdXQgLWQgIiAiIC1mIDEpID0gJCQodGFpbCAtMSAnJHtoYXNoRmlsZX0nKSBdOyB0aGVuIGAgKwogCQkJYHRvdWNoICR7b3V0fTsgZWxzZSBjYXQgJyR7bWVzc2FnZUZpbGV9JyAmJiBleGl0IDE7IGZpYCwKIAkJRGVzY3JpcHRpb246ICJWZXJpZnkgJHthcGlEaXJ9IGZpbGVzIGhhdmUgbm90IGJlZW4gbW9kaWZpZWQiLAogCX0sICJhcGlEaXIiLCAidmVyc2lvbiIsICJtZXNzYWdlRmlsZSIsICJoYXNoRmlsZSIpCiApCiAKIHR5cGUgYWlkbEFwaVByb3BlcnRpZXMgc3RydWN0IHsKLQlCYXNlTmFtZSAgICAgICAgICAgICAgc3RyaW5nCi0JU3JjcyAgICAgICAgICAgICAgICAgIFtdc3RyaW5nIGBhbmRyb2lkOiJwYXRoImAKLQlBaWRsUm9vdCAgICAgICAgICAgICAgc3RyaW5nICAgLy8gYmFzZSBkaXJlY3RvcnkgZm9yIHRoZSBpbnB1dCBhaWRsIGZpbGUKLQlTdGFiaWxpdHkgICAgICAgICAgICAgKnN0cmluZwotCUltcG9ydHNXaXRob3V0VmVyc2lvbiBbXXN0cmluZwotCVZlcnNpb25zICAgICAgICAgICAgICBbXXN0cmluZwotCUR1bXBhcGkgICAgICAgICAgICAgICBEdW1wQXBpUHJvcGVydGllcworCUJhc2VOYW1lICBzdHJpbmcKKwlTcmNzICAgICAgW11zdHJpbmcgYGFuZHJvaWQ6InBhdGgiYAorCUFpZGxSb290ICBzdHJpbmcgICAvLyBiYXNlIGRpcmVjdG9yeSBmb3IgdGhlIGlucHV0IGFpZGwgZmlsZQorCVN0YWJpbGl0eSAqc3RyaW5nCisJSW1wb3J0cyAgIFtdc3RyaW5nCisJVmVyc2lvbnMgIFtdc3RyaW5nCisJRHVtcGFwaSAgIER1bXBBcGlQcm9wZXJ0aWVzCiB9CiAKIHR5cGUgYWlkbEFwaSBzdHJ1Y3QgewpAQCAtNzUsNiArNzUsOSBAQAogCiAJLy8gZm9yIHRyaWdnZXJpbmcgZnJlZXppbmcgQVBJIGFzIHRoZSBuZXcgdmVyc2lvbgogCWZyZWV6ZUFwaVRpbWVzdGFtcCBhbmRyb2lkLldyaXRhYmxlUGF0aAorCisJLy8gZm9yIGNoZWNraW5nIGZvciBhY3RpdmUgZGV2ZWxvcG1lbnQgb24gdW5mcm96ZW4gdmVyc2lvbgorCWhhc0RldmVsb3BtZW50IGFuZHJvaWQuV3JpdGFibGVQYXRoCiB9CiAKIGZ1bmMgKG0gKmFpZGxBcGkpIGFwaURpcigpIHN0cmluZyB7CkBAIC04NywxMSArOTAsMTcgQEAKIH0KIAogdHlwZSBhcGlEdW1wIHN0cnVjdCB7CisJdmVyc2lvbiAgc3RyaW5nCiAJZGlyICAgICAgYW5kcm9pZC5QYXRoCiAJZmlsZXMgICAgYW5kcm9pZC5QYXRocwogCWhhc2hGaWxlIGFuZHJvaWQuT3B0aW9uYWxQYXRoCiB9CiAKK2Z1bmMgKG0gKmFpZGxBcGkpIGdldEltcG9ydHMoY3R4IGFuZHJvaWQuTW9kdWxlQ29udGV4dCwgdmVyc2lvbiBzdHJpbmcpIG1hcFtzdHJpbmddc3RyaW5nIHsKKwlpZmFjZSA6PSBjdHguR2V0RGlyZWN0RGVwV2l0aFRhZyhtLnByb3BlcnRpZXMuQmFzZU5hbWUsIGludGVyZmFjZURlcCkuKCphaWRsSW50ZXJmYWNlKQorCXJldHVybiBpZmFjZS5nZXRJbXBvcnRzKHZlcnNpb24pCit9CisKIGZ1bmMgKG0gKmFpZGxBcGkpIGNyZWF0ZUFwaUR1bXBGcm9tU291cmNlKGN0eCBhbmRyb2lkLk1vZHVsZUNvbnRleHQpIGFwaUR1bXAgewogCXNyY3MsIGltcG9ydHMgOj0gZ2V0UGF0aHMoY3R4LCBtLnByb3BlcnRpZXMuU3JjcywgbS5wcm9wZXJ0aWVzLkFpZGxSb290KQogCkBAIC05OSwzMSArMTA4LDIwIEBACiAJCXJldHVybiBhcGlEdW1we30KIAl9CiAKLQl2YXIgaW1wb3J0UGF0aHMgW11zdHJpbmcKLQlpbXBvcnRQYXRocyA9IGFwcGVuZChpbXBvcnRQYXRocywgaW1wb3J0cy4uLikKLQljdHguVmlzaXREaXJlY3REZXBzKGZ1bmMoZGVwIGFuZHJvaWQuTW9kdWxlKSB7Ci0JCWlmIGltcG9ydGVkQWlkbCwgb2sgOj0gZGVwLigqYWlkbEludGVyZmFjZSk7IG9rIHsKLQkJCWltcG9ydFBhdGhzID0gYXBwZW5kKGltcG9ydFBhdGhzLCBpbXBvcnRlZEFpZGwucHJvcGVydGllcy5GdWxsX2ltcG9ydF9wYXRocy4uLikKLQkJfQotCX0pCisJLy8gZHVtcGFwaSB1c2VzIGltcG9ydHMgZm9yIFRvVCgiIikgdmVyc2lvbgorCWRlcHMgOj0gZ2V0RGVwcyhjdHgsIG0uZ2V0SW1wb3J0cyhjdHgsIG0ubmV4dFZlcnNpb24oKSkpCisJaW1wb3J0cyA9IGFwcGVuZChpbXBvcnRzLCBkZXBzLmltcG9ydHMuLi4pCiAKIAl2YXIgYXBpRGlyIGFuZHJvaWQuV3JpdGFibGVQYXRoCiAJdmFyIGFwaUZpbGVzIGFuZHJvaWQuV3JpdGFibGVQYXRocwogCXZhciBoYXNoRmlsZSBhbmRyb2lkLldyaXRhYmxlUGF0aAogCiAJYXBpRGlyID0gYW5kcm9pZC5QYXRoRm9yTW9kdWxlT3V0KGN0eCwgImR1bXAiKQotCWFpZGxSb290IDo9IGFuZHJvaWQuUGF0aEZvck1vZHVsZVNyYyhjdHgsIG0ucHJvcGVydGllcy5BaWRsUm9vdCkKIAlmb3IgXywgc3JjIDo9IHJhbmdlIHNyY3MgewotCQliYXNlRGlyIDo9IGdldEJhc2VEaXIoY3R4LCBzcmMsIGFpZGxSb290KQotCQlyZWxQYXRoLCBfIDo9IGZpbGVwYXRoLlJlbChiYXNlRGlyLCBzcmMuU3RyaW5nKCkpCi0JCW91dEZpbGUgOj0gYW5kcm9pZC5QYXRoRm9yTW9kdWxlT3V0KGN0eCwgImR1bXAiLCByZWxQYXRoKQorCQlvdXRGaWxlIDo9IGFuZHJvaWQuUGF0aEZvck1vZHVsZU91dChjdHgsICJkdW1wIiwgc3JjLlJlbCgpKQogCQlhcGlGaWxlcyA9IGFwcGVuZChhcGlGaWxlcywgb3V0RmlsZSkKIAl9CiAJaGFzaEZpbGUgPSBhbmRyb2lkLlBhdGhGb3JNb2R1bGVPdXQoY3R4LCAiZHVtcCIsICIuaGFzaCIpCi0JbGF0ZXN0VmVyc2lvbiA6PSAibGF0ZXN0LXZlcnNpb24iCi0JaWYgbGVuKG0ucHJvcGVydGllcy5WZXJzaW9ucykgPj0gMSB7Ci0JCWxhdGVzdFZlcnNpb24gPSBtLnByb3BlcnRpZXMuVmVyc2lvbnNbbGVuKG0ucHJvcGVydGllcy5WZXJzaW9ucyktMV0KLQl9CiAKIAl2YXIgb3B0aW9uYWxGbGFncyBbXXN0cmluZwogCWlmIG0ucHJvcGVydGllcy5TdGFiaWxpdHkgIT0gbmlsIHsKQEAgLTEzMiwyMCArMTMwLDE0NCBAQAogCWlmIHByb3B0b29scy5Cb29sKG0ucHJvcGVydGllcy5EdW1wYXBpLk5vX2xpY2Vuc2UpIHsKIAkJb3B0aW9uYWxGbGFncyA9IGFwcGVuZChvcHRpb25hbEZsYWdzLCAiLS1ub19saWNlbnNlIikKIAl9CisJb3B0aW9uYWxGbGFncyA9IGFwcGVuZChvcHRpb25hbEZsYWdzLCB3cmFwKCItcCIsIGRlcHMucHJlcHJvY2Vzc2VkLlN0cmluZ3MoKSwgIiIpLi4uKQogCisJdmVyc2lvbiA6PSBuZXh0VmVyc2lvbihtLnByb3BlcnRpZXMuVmVyc2lvbnMpCiAJY3R4LkJ1aWxkKHBjdHgsIGFuZHJvaWQuQnVpbGRQYXJhbXN7Ci0JCVJ1bGU6ICAgIGFpZGxEdW1wQXBpUnVsZSwKLQkJT3V0cHV0czogYXBwZW5kKGFwaUZpbGVzLCBoYXNoRmlsZSksCi0JCUlucHV0czogIHNyY3MsCisJCVJ1bGU6ICAgICAgYWlkbER1bXBBcGlSdWxlLAorCQlPdXRwdXRzOiAgIGFwcGVuZChhcGlGaWxlcywgaGFzaEZpbGUpLAorCQlJbnB1dHM6ICAgIHNyY3MsCisJCUltcGxpY2l0czogZGVwcy5wcmVwcm9jZXNzZWQsCiAJCUFyZ3M6IG1hcFtzdHJpbmddc3RyaW5newogCQkJIm9wdGlvbmFsRmxhZ3MiOiBzdHJpbmdzLkpvaW4ob3B0aW9uYWxGbGFncywgIiAiKSwKLQkJCSJpbXBvcnRzIjogICAgICAgc3RyaW5ncy5Kb2luKHdyYXAoIi1JIiwgaW1wb3J0UGF0aHMsICIiKSwgIiAiKSwKKwkJCSJpbXBvcnRzIjogICAgICAgc3RyaW5ncy5Kb2luKHdyYXAoIi1JIiwgaW1wb3J0cywgIiIpLCAiICIpLAogCQkJIm91dERpciI6ICAgICAgICBhcGlEaXIuU3RyaW5nKCksCiAJCQkiaGFzaEZpbGUiOiAgICAgIGhhc2hGaWxlLlN0cmluZygpLAotCQkJImxhdGVzdFZlcnNpb24iOiBsYXRlc3RWZXJzaW9uLAorCQkJImxhdGVzdFZlcnNpb24iOiB2ZXJzaW9uRm9ySGFzaEdlbih2ZXJzaW9uKSwKIAkJfSwKIAl9KQotCXJldHVybiBhcGlEdW1we2FwaURpciwgYXBpRmlsZXMuUGF0aHMoKSwgYW5kcm9pZC5PcHRpb25hbFBhdGhGb3JQYXRoKGhhc2hGaWxlKX0KKwlyZXR1cm4gYXBpRHVtcHt2ZXJzaW9uLCBhcGlEaXIsIGFwaUZpbGVzLlBhdGhzKCksIGFuZHJvaWQuT3B0aW9uYWxQYXRoRm9yUGF0aChoYXNoRmlsZSl9Cit9CisKK2Z1bmMgd3JhcFdpdGhEaWZmQ2hlY2tJZkVsc2UobSAqYWlkbEFwaSwgcmIgKmFuZHJvaWQuUnVsZUJ1aWxkZXIsIHdyaXRlciBmdW5jKCphbmRyb2lkLlJ1bGVCdWlsZGVyQ29tbWFuZCksIGVsc2VCbG9jayBmdW5jKCphbmRyb2lkLlJ1bGVCdWlsZGVyQ29tbWFuZCkpIHsKKwlyYmMgOj0gcmIuQ29tbWFuZCgpCisJcmJjLlRleHQoImlmIFsgXCIkKGNhdCAiKS5JbnB1dChtLmhhc0RldmVsb3BtZW50KS5UZXh0KCIpXCIgPSBcIjFcIiBdOyB0aGVuIikKKwl3cml0ZXIocmJjKQorCXJiYy5UZXh0KCI7IGVsc2UiKQorCWVsc2VCbG9jayhyYmMpCisJcmJjLlRleHQoIjsgZmkiKQorfQorCitmdW5jIHdyYXBXaXRoRGlmZkNoZWNrSWYobSAqYWlkbEFwaSwgcmIgKmFuZHJvaWQuUnVsZUJ1aWxkZXIsIHdyaXRlciBmdW5jKCphbmRyb2lkLlJ1bGVCdWlsZGVyQ29tbWFuZCksIG5lZWRUb1dyYXAgYm9vbCkgeworCXJiYyA6PSByYi5Db21tYW5kKCkKKwlpZiBuZWVkVG9XcmFwIHsKKwkJcmJjLlRleHQoImlmIFsgXCIkKGNhdCAiKS5JbnB1dChtLmhhc0RldmVsb3BtZW50KS5UZXh0KCIpXCIgPSBcIjFcIiBdOyB0aGVuIikKKwl9CisJd3JpdGVyKHJiYykKKwlpZiBuZWVkVG9XcmFwIHsKKwkJcmJjLlRleHQoIjsgZmkiKQorCX0KK30KKworLy8gTWlncmF0ZSBgdmVyc2lvbnNgIGludG8gYHZlcnNpb25fd2l0aF9pbmZvYCwgYW5kIHRoZW4gYXBwZW5kIGEgdmVyc2lvbiBpZiBpdCBpc24ndCBuaWwKK2Z1bmMgKG0gKmFpZGxBcGkpIG1pZ3JhdGVBbmRBcHBlbmRWZXJzaW9uKGN0eCBhbmRyb2lkLk1vZHVsZUNvbnRleHQsIHJiICphbmRyb2lkLlJ1bGVCdWlsZGVyLCB2ZXJzaW9uICpzdHJpbmcsIHRyYW5zaXRpdmUgYm9vbCkgeworCWlzRnJlZXppbmdBcGkgOj0gdmVyc2lvbiAhPSBuaWwKKworCS8vIFJlbW92ZSBgdmVyc2lvbnNgIHByb3BlcnR5IHdoaWNoIGlzIGRlcHJlY2F0ZWQuCisJd3JhcFdpdGhEaWZmQ2hlY2tJZihtLCByYiwgZnVuYyhyYmMgKmFuZHJvaWQuUnVsZUJ1aWxkZXJDb21tYW5kKSB7CisJCXJiYy5CdWlsdFRvb2woImJwbW9kaWZ5IikuCisJCQlUZXh0KCItdyAtbSAiICsgbS5wcm9wZXJ0aWVzLkJhc2VOYW1lKS4KKwkJCVRleHQoIi1wYXJhbWV0ZXIgdmVyc2lvbnMgLXJlbW92ZS1wcm9wZXJ0eSIpLgorCQkJVGV4dChhbmRyb2lkLlBhdGhGb3JNb2R1bGVTcmMoY3R4LCAiQW5kcm9pZC5icCIpLlN0cmluZygpKQorCX0sIGlzRnJlZXppbmdBcGkpCisKKwl2YXIgaWZhY2UgKmFpZGxJbnRlcmZhY2UKKwljdHguVmlzaXREaXJlY3REZXBzKGZ1bmMoZGVwIGFuZHJvaWQuTW9kdWxlKSB7CisJCXN3aXRjaCBjdHguT3RoZXJNb2R1bGVEZXBlbmRlbmN5VGFnKGRlcCkuKHR5cGUpIHsKKwkJY2FzZSBpbnRlcmZhY2VEZXBUYWc6CisJCQlpZmFjZSA9IGRlcC4oKmFpZGxJbnRlcmZhY2UpCisJCX0KKwl9KQorCWlmIGlmYWNlID09IG5pbCB7CisJCWN0eC5Nb2R1bGVFcnJvcmYoImFpZGxfaW50ZXJmYWNlICVzIGRvZXNuJ3QgZXhpc3QiLCBtLnByb3BlcnRpZXMuQmFzZU5hbWUpCisJCXJldHVybgorCX0KKwl2YXIgdmVyc2lvbnMgW11zdHJpbmcKKwlpZiBsZW4oaWZhY2UucHJvcGVydGllcy5WZXJzaW9uc193aXRoX2luZm8pID09IDAgeworCQl2ZXJzaW9ucyA9IGFwcGVuZCh2ZXJzaW9ucywgaWZhY2UuZ2V0VmVyc2lvbnMoKS4uLikKKwl9CisJaWYgaXNGcmVlemluZ0FwaSB7CisJCXZlcnNpb25zID0gYXBwZW5kKHZlcnNpb25zLCAqdmVyc2lvbikKKwl9CisJZm9yIF8sIHYgOj0gcmFuZ2UgdmVyc2lvbnMgeworCQlpbXBvcnRJZmFjZXMgOj0gbWFrZShtYXBbc3RyaW5nXSphaWRsSW50ZXJmYWNlKQorCQljdHguVmlzaXREaXJlY3REZXBzKGZ1bmMoZGVwIGFuZHJvaWQuTW9kdWxlKSB7CisJCQlpZiBfLCBvayA6PSBjdHguT3RoZXJNb2R1bGVEZXBlbmRlbmN5VGFnKGRlcCkuKGltcG9ydEludGVyZmFjZURlcFRhZyk7IG9rIHsKKwkJCQlvdGhlciA6PSBkZXAuKCphaWRsSW50ZXJmYWNlKQorCQkJCWltcG9ydElmYWNlc1tvdGhlci5CYXNlTW9kdWxlTmFtZSgpXSA9IG90aGVyCisJCQl9CisJCX0pCisJCWltcG9ydHMgOj0gbWFrZShbXXN0cmluZywgMCwgbGVuKGlmYWNlLmdldEltcG9ydHNGb3JWZXJzaW9uKHYpKSkKKwkJbmVlZFRyYW5zaXRpdmVGcmVlemUgOj0gaXNGcmVlemluZ0FwaSAmJiB2ID09ICp2ZXJzaW9uICYmIHRyYW5zaXRpdmUKKworCQlpZiBuZWVkVHJhbnNpdGl2ZUZyZWV6ZSB7CisJCQlpbXBvcnRBcGlzIDo9IG1ha2UobWFwW3N0cmluZ10qYWlkbEFwaSkKKwkJCWN0eC5XYWxrRGVwcyhmdW5jKGNoaWxkIGFuZHJvaWQuTW9kdWxlLCBwYXJlbnQgYW5kcm9pZC5Nb2R1bGUpIGJvb2wgeworCQkJCWlmIGFwaSwgb2sgOj0gY2hpbGQuKCphaWRsQXBpKTsgb2sgeworCQkJCQltb2R1bGVOYW1lIDo9IHN0cmluZ3MuVHJpbVN1ZmZpeChhcGkuTmFtZSgpLCBhaWRsQXBpU3VmZml4KQorCQkJCQlpZiBfLCBvayA6PSBpbXBvcnRJZmFjZXNbbW9kdWxlTmFtZV07IG9rIHsKKwkJCQkJCWltcG9ydEFwaXNbbW9kdWxlTmFtZV0gPSBhcGkKKwkJCQkJCXJldHVybiBmYWxzZQorCQkJCQl9CisJCQkJfQorCQkJCXJldHVybiB0cnVlCisJCQl9KQorCQkJd3JhcFdpdGhEaWZmQ2hlY2tJZihtLCByYiwgZnVuYyhyYmMgKmFuZHJvaWQuUnVsZUJ1aWxkZXJDb21tYW5kKSB7CisJCQkJcmJjLkJ1aWx0VG9vbCgiYnBtb2RpZnkiKS4KKwkJCQkJVGV4dCgiLXcgLW0gIiArIG0ucHJvcGVydGllcy5CYXNlTmFtZSkuCisJCQkJCVRleHQoIi1wYXJhbWV0ZXIgdmVyc2lvbnNfd2l0aF9pbmZvIC1hZGQtbGl0ZXJhbCAnIikuCisJCQkJCVRleHQoZm10LlNwcmludGYoYHt2ZXJzaW9uOiAiJXMiLCBpbXBvcnRzOiBbYCwgdikpCisKKwkJCQlmb3IgXywgaW0gOj0gcmFuZ2UgaWZhY2UuZ2V0SW1wb3J0c0ZvclZlcnNpb24odikgeworCQkJCQltb2R1bGVOYW1lLCB2ZXJzaW9uIDo9IHBhcnNlTW9kdWxlV2l0aFZlcnNpb24oaW0pCisKKwkJCQkJLy8gSW52b2tlIGFuIGltcG9ydGVkIGludGVyZmFjZSdzIGZyZWV6ZS1hcGkgb25seSBpZiBpdCBkZXBlbmRzIG9uIFRvVCB2ZXJzaW9uIGV4cGxpY2l0bHkgb3IgaW1wbGljaXRseS4KKwkJCQkJaWYgdmVyc2lvbiA9PSBpbXBvcnRJZmFjZXNbbW9kdWxlTmFtZV0ubmV4dFZlcnNpb24oKSB8fCAhaGFzVmVyc2lvblN1ZmZpeChpbSkgeworCQkJCQkJcmIuQ29tbWFuZCgpLlRleHQoZm10LlNwcmludGYoYGVjaG8gIkNhbGwgJXMtZnJlZXplLWFwaSBiZWNhdXNlICVzIGRlcGVuZHMgb24gJXMuImAsIG1vZHVsZU5hbWUsIG0ucHJvcGVydGllcy5CYXNlTmFtZSwgbW9kdWxlTmFtZSkpCisJCQkJCQlyYmMuSW1wbGljaXQoaW1wb3J0QXBpc1ttb2R1bGVOYW1lXS5mcmVlemVBcGlUaW1lc3RhbXApCisJCQkJCX0KKwkJCQkJaWYgaGFzVmVyc2lvblN1ZmZpeChpbSkgeworCQkJCQkJcmJjLlRleHQoZm10LlNwcmludGYoYCIlcyIsYCwgaW0pKQorCQkJCQl9IGVsc2UgeworCQkJCQkJcmJjLlRleHQoIlwiIiArIGltICsgIi1WJyIgKyBgJChpZiBbICIkKGNhdCBgKS4KKwkJCQkJCQlJbnB1dChpbXBvcnRBcGlzW2ltXS5oYXNEZXZlbG9wbWVudCkuCisJCQkJCQkJVGV4dChgKSIgPSAiMSIgXTsgdGhlbiBlY2hvICJgICsgaW1wb3J0SWZhY2VzW2ltXS5uZXh0VmVyc2lvbigpICsKKwkJCQkJCQkJYCI7IGVsc2UgZWNobyAiYCArIGltcG9ydElmYWNlc1tpbV0ubGF0ZXN0VmVyc2lvbigpICsgYCI7IGZpKSciLCBgKQorCQkJCQl9CisJCQkJfQorCQkJCXJiYy5UZXh0KCJdfScgIikuCisJCQkJCVRleHQoYW5kcm9pZC5QYXRoRm9yTW9kdWxlU3JjKGN0eCwgIkFuZHJvaWQuYnAiKS5TdHJpbmcoKSkKKwkJCX0sIGlzRnJlZXppbmdBcGkpCisJCX0gZWxzZSB7CisJCQlmb3IgXywgaW0gOj0gcmFuZ2UgaWZhY2UuZ2V0SW1wb3J0c0ZvclZlcnNpb24odikgeworCQkJCWlmIGhhc1ZlcnNpb25TdWZmaXgoaW0pIHsKKwkJCQkJaW1wb3J0cyA9IGFwcGVuZChpbXBvcnRzLCBpbSkKKwkJCQl9IGVsc2UgeworCQkJCQlpbXBvcnRzID0gYXBwZW5kKGltcG9ydHMsIGltKyItViIraW1wb3J0SWZhY2VzW2ltXS5sYXRlc3RWZXJzaW9uKCkpCisJCQkJfQorCQkJfQorCQkJaW1wb3J0c1N0ciA6PSBzdHJpbmdzLkpvaW4od3JhcChgImAsIGltcG9ydHMsIGAiYCksICIsICIpCisJCQlkYXRhIDo9IGZtdC5TcHJpbnRmKGB7dmVyc2lvbjogIiVzIiwgaW1wb3J0czogWyVzXX1gLCB2LCBpbXBvcnRzU3RyKQorCisJCQkvLyBBbHNvIG1vZGlmeSBBbmRyb2lkLmJwIGZpbGUgdG8gYWRkIHRoZSBuZXcgdmVyc2lvbiB0byB0aGUgJ3ZlcnNpb25zX3dpdGhfaW5mbycgcHJvcGVydHkuCisJCQl3cmFwV2l0aERpZmZDaGVja0lmKG0sIHJiLCBmdW5jKHJiYyAqYW5kcm9pZC5SdWxlQnVpbGRlckNvbW1hbmQpIHsKKwkJCQlyYmMuQnVpbHRUb29sKCJicG1vZGlmeSIpLgorCQkJCQlUZXh0KCItdyAtbSAiICsgbS5wcm9wZXJ0aWVzLkJhc2VOYW1lKS4KKwkJCQkJVGV4dCgiLXBhcmFtZXRlciB2ZXJzaW9uc193aXRoX2luZm8gLWFkZC1saXRlcmFsICciICsgZGF0YSArICInICIpLgorCQkJCQlUZXh0KGFuZHJvaWQuUGF0aEZvck1vZHVsZVNyYyhjdHgsICJBbmRyb2lkLmJwIikuU3RyaW5nKCkpCisJCQl9LCBpc0ZyZWV6aW5nQXBpKQorCQl9CisJfQogfQogCiBmdW5jIChtICphaWRsQXBpKSBtYWtlQXBpRHVtcEFzVmVyc2lvbihjdHggYW5kcm9pZC5Nb2R1bGVDb250ZXh0LCBkdW1wIGFwaUR1bXAsIHZlcnNpb24gc3RyaW5nLCBsYXRlc3RWZXJzaW9uRHVtcCAqYXBpRHVtcCkgYW5kcm9pZC5Xcml0YWJsZVBhdGggewpAQCAtMTUzLDEyOCArMjc1LDEwMiBAQAogCW1vZHVsZURpciA6PSBhbmRyb2lkLlBhdGhGb3JNb2R1bGVTcmMoY3R4KS5TdHJpbmcoKQogCXRhcmdldERpciA6PSBmaWxlcGF0aC5Kb2luKG1vZHVsZURpciwgbS5hcGlEaXIoKSwgdmVyc2lvbikKIAlyYiA6PSBhbmRyb2lkLk5ld1J1bGVCdWlsZGVyKHBjdHgsIGN0eCkKLQorCXRyYW5zaXRpdmUgOj0gY3R4LkNvbmZpZygpLklzRW52VHJ1ZSgiQUlETF9UUkFOU0lUSVZFX0ZSRUVaRSIpCisJdmFyIGFjdGlvbldvcmQgc3RyaW5nCiAJaWYgY3JlYXRpbmdOZXdWZXJzaW9uIHsKKwkJYWN0aW9uV29yZCA9ICJNYWtpbmciCiAJCS8vIFdlIGFyZSBhc2tlZCB0byBjcmVhdGUgYSBuZXcgdmVyc2lvbi4gQnV0IGJlZm9yZSBkb2luZyB0aGF0LCBjaGVjayBpZiB0aGUgZ2l2ZW4KIAkJLy8gZHVtcCBpcyB0aGUgc2FtZSBhcyB0aGUgbGF0ZXN0IHZlcnNpb24uIElmIHNvLCBkb24ndCBjcmVhdGUgYSBuZXcgdmVyc2lvbiwKLQkJLy8gb3RoZXJ3aXNlIHdlIHdpbGwgYmUgdW5uZWNlc3NhcmlseSBjcmVhdGluZyBtYW55IHZlcnNpb25zLiBgbmV3VmVyc2lvbk5lZWRlZEZpbGVgCi0JCS8vIGlzIGNyZWF0ZWQgd2hlbiB0aGUgZXF1YWxpdHkgY2hlY2sgZmFpbHMuCi0JCW5ld1ZlcnNpb25OZWVkZWRGaWxlIDo9IGFuZHJvaWQuUGF0aEZvck1vZHVsZU91dChjdHgsICJ1cGRhdGVhcGlfIit2ZXJzaW9uKyIubmVlZGVkIikKLQkJcmIuQ29tbWFuZCgpLlRleHQoInJtIC1mICIgKyBuZXdWZXJzaW9uTmVlZGVkRmlsZS5TdHJpbmcoKSkKLQotCQlpZiBsYXRlc3RWZXJzaW9uRHVtcCAhPSBuaWwgewotCQkJZXF1YWxpdHlDaGVja0NvbW1hbmQgOj0gcmIuQ29tbWFuZCgpCi0JCQllcXVhbGl0eUNoZWNrQ29tbWFuZC5CdWlsdFRvb2woImFpZGwiKS4KLQkJCQlGbGFnV2l0aEFyZygiLS1jaGVja2FwaT0iLCAiZXF1YWwiKQotCQkJaWYgbS5wcm9wZXJ0aWVzLlN0YWJpbGl0eSAhPSBuaWwgewotCQkJCWVxdWFsaXR5Q2hlY2tDb21tYW5kLkZsYWdXaXRoQXJnKCItLXN0YWJpbGl0eSAiLCAqbS5wcm9wZXJ0aWVzLlN0YWJpbGl0eSkKLQkJCX0KLQkJCWVxdWFsaXR5Q2hlY2tDb21tYW5kLgotCQkJCVRleHQobGF0ZXN0VmVyc2lvbkR1bXAuZGlyLlN0cmluZygpKS5JbXBsaWNpdHMobGF0ZXN0VmVyc2lvbkR1bXAuZmlsZXMpLgotCQkJCVRleHQoZHVtcC5kaXIuU3RyaW5nKCkpLkltcGxpY2l0cyhkdW1wLmZpbGVzKS4KLQkJCQlUZXh0KCImPiAvZGV2L251bGwiKQotCQkJZXF1YWxpdHlDaGVja0NvbW1hbmQuCi0JCQkJVGV4dCgifHwgdG91Y2giKS4KLQkJCQlUZXh0KG5ld1ZlcnNpb25OZWVkZWRGaWxlLlN0cmluZygpKQotCQl9IGVsc2UgewotCQkJLy8gSWYgdGhlcmUgaXMgbm8gbGF0ZXN0IHZlcnNpb24gKGkuZS4gd2UgYXJlIGNyZWF0aW5nIHRoZSBpbml0aWFsIHZlcnNpb24pCi0JCQkvLyBjcmVhdGUgdGhlIG5ldyB2ZXJzaW9uIHVuY29uZGl0aW9uYWxseQotCQkJcmIuQ29tbWFuZCgpLlRleHQoInRvdWNoIikuVGV4dChuZXdWZXJzaW9uTmVlZGVkRmlsZS5TdHJpbmcoKSkKLQkJfQotCisJCS8vIG90aGVyd2lzZSB3ZSB3aWxsIGJlIHVubmVjZXNzYXJpbHkgY3JlYXRpbmcgbWFueSB2ZXJzaW9ucy4KIAkJLy8gQ29weSB0aGUgZ2l2ZW4gZHVtcCB0byB0aGUgdGFyZ2V0IGRpcmVjdG9yeSBvbmx5IHdoZW4gdGhlIGVxdWFsaXR5IGNoZWNrIGZhaWxlZAotCQkvLyAoaS5lLiBgbmV3VmVyc2lvbk5lZWRlZEZpbGVgIGV4aXN0cykuCi0JCXJiLkNvbW1hbmQoKS4KLQkJCVRleHQoImlmIFsgLWYgIiArIG5ld1ZlcnNpb25OZWVkZWRGaWxlLlN0cmluZygpICsgIiBdOyB0aGVuIikuCi0JCQlUZXh0KCJjcCAtcmYgIiArIGR1bXAuZGlyLlN0cmluZygpICsgIi8uICIgKyB0YXJnZXREaXIpLkltcGxpY2l0cyhkdW1wLmZpbGVzKS4KLQkJCVRleHQoIjsgZmkiKQotCi0JCS8vIEFsc28gbW9kaWZ5IEFuZHJvaWQuYnAgZmlsZSB0byBhZGQgdGhlIG5ldyB2ZXJzaW9uIHRvIHRoZSAndmVyc2lvbnMnIHByb3BlcnR5LgotCQlyYi5Db21tYW5kKCkuCi0JCQlUZXh0KCJpZiBbIC1mICIgKyBuZXdWZXJzaW9uTmVlZGVkRmlsZS5TdHJpbmcoKSArICIgXTsgdGhlbiIpLgotCQkJQnVpbHRUb29sKCJicG1vZGlmeSIpLgotCQkJVGV4dCgiLXcgLW0gIiArIG0ucHJvcGVydGllcy5CYXNlTmFtZSkuCi0JCQlUZXh0KCItcGFyYW1ldGVyIHZlcnNpb25zIC1hICIgKyB2ZXJzaW9uKS4KLQkJCVRleHQoYW5kcm9pZC5QYXRoRm9yTW9kdWxlU3JjKGN0eCwgIkFuZHJvaWQuYnAiKS5TdHJpbmcoKSkuCi0JCQlUZXh0KCI7IGZpIikKLQorCQkvLyAoaS5lLiBgaGFzX2RldmVsb3BtZW50YCBmaWxlIGNvbnRhaW5zICIxIikuCisJCXdyYXBXaXRoRGlmZkNoZWNrSWYobSwgcmIsIGZ1bmMocmJjICphbmRyb2lkLlJ1bGVCdWlsZGVyQ29tbWFuZCkgeworCQkJcmJjLlRleHQoIm1rZGlyIC1wICIgKyB0YXJnZXREaXIgKyAiICYmICIpLgorCQkJCVRleHQoImNwIC1yZiAiICsgZHVtcC5kaXIuU3RyaW5nKCkgKyAiLy4gIiArIHRhcmdldERpcikuSW1wbGljaXRzKGR1bXAuZmlsZXMpCisJCX0sIHRydWUgLyogbmVlZFRvV3JhcCAqLykKKwkJd3JhcFdpdGhEaWZmQ2hlY2tJZkVsc2UobSwgcmIsIGZ1bmMocmJjICphbmRyb2lkLlJ1bGVCdWlsZGVyQ29tbWFuZCkgeworCQkJcmJjLlRleHQoZm10LlNwcmludGYoYGVjaG8gIlRoZXJlIGlzIGNoYW5nZSBiZXR3ZWVuIFRvVCB2ZXJzaW9uIGFuZCB0aGUgbGF0ZXN0IHN0YWJsZSB2ZXJzaW9uLiBGcmVlemluZyAlcy1WJXMuImAsIG0ucHJvcGVydGllcy5CYXNlTmFtZSwgdmVyc2lvbikpCisJCX0sIGZ1bmMocmJjICphbmRyb2lkLlJ1bGVCdWlsZGVyQ29tbWFuZCkgeworCQkJcmJjLlRleHQoZm10LlNwcmludGYoYGVjaG8gIlRoZXJlIGlzIG5vIGNoYW5nZSBmcm9tIHRoZSBsYXRlc3Qgc3RhYmxlIHZlcnNpb24gb2YgJXMuIE5vdGhpbmcgaGFwcGVuZWQuImAsIG0ucHJvcGVydGllcy5CYXNlTmFtZSkpCisJCX0pCisJCW0ubWlncmF0ZUFuZEFwcGVuZFZlcnNpb24oY3R4LCByYiwgJnZlcnNpb24sIHRyYW5zaXRpdmUpCiAJfSBlbHNlIHsKKwkJYWN0aW9uV29yZCA9ICJVcGRhdGluZyIKIAkJLy8gV2UgYXJlIHVwZGF0aW5nIHRoZSBjdXJyZW50IHZlcnNpb24uIERvbid0IGNvcHkgLmhhc2ggdG8gdGhlIGN1cnJlbnQgZHVtcAogCQlyYi5Db21tYW5kKCkuVGV4dCgibWtkaXIgLXAgIiArIHRhcmdldERpcikKIAkJcmIuQ29tbWFuZCgpLlRleHQoInJtIC1yZiAiICsgdGFyZ2V0RGlyICsgIi8qIikKIAkJcmIuQ29tbWFuZCgpLlRleHQoImNwIC1yZiAiICsgZHVtcC5kaXIuU3RyaW5nKCkgKyAiLyogIiArIHRhcmdldERpcikuSW1wbGljaXRzKGR1bXAuZmlsZXMpCisKKwkJbS5taWdyYXRlQW5kQXBwZW5kVmVyc2lvbihjdHgsIHJiLCBuaWwsIGZhbHNlKQogCX0KIAogCXRpbWVzdGFtcEZpbGUgOj0gYW5kcm9pZC5QYXRoRm9yTW9kdWxlT3V0KGN0eCwgInVwZGF0ZWFwaV8iK3ZlcnNpb24rIi50aW1lc3RhbXAiKQogCXJiLkNvbW1hbmQoKS5UZXh0KCJ0b3VjaCIpLk91dHB1dCh0aW1lc3RhbXBGaWxlKQogCi0JcmIuQnVpbGQoImR1bXBfYWlkbF9hcGkiK20ucHJvcGVydGllcy5CYXNlTmFtZSsiXyIrdmVyc2lvbiwKLQkJIk1ha2luZyBBSURMIEFQSSBvZiAiK20ucHJvcGVydGllcy5CYXNlTmFtZSsiIGFzIHZlcnNpb24gIit2ZXJzaW9uKQorCXJiLkJ1aWxkKCJkdW1wX2FpZGxfYXBpXyIrbS5wcm9wZXJ0aWVzLkJhc2VOYW1lKyJfIit2ZXJzaW9uLCBhY3Rpb25Xb3JkKyIgQUlETCBBUEkgZHVtcCB2ZXJzaW9uICIrdmVyc2lvbisiIGZvciAiK20ucHJvcGVydGllcy5CYXNlTmFtZSsiIChzZWUgIit0YXJnZXREaXIrIikiKQogCXJldHVybiB0aW1lc3RhbXBGaWxlCiB9CiAKLXR5cGUgZGVwVGFnIHN0cnVjdCB7Ci0JYmx1ZXByaW50LkJhc2VEZXBlbmRlbmN5VGFnCi0JbmFtZSBzdHJpbmcKK3R5cGUgZGVwcyBzdHJ1Y3QgeworCXByZXByb2Nlc3NlZCBhbmRyb2lkLlBhdGhzCisJaW1wbGljaXRzICAgIGFuZHJvaWQuUGF0aHMKKwlpbXBvcnRzICAgICAgW11zdHJpbmcKIH0KIAotdmFyICgKLQlhcGlEZXAgICAgICAgPSBkZXBUYWd7bmFtZTogImFwaSJ9Ci0JaW50ZXJmYWNlRGVwID0gZGVwVGFne25hbWU6ICJpbnRlcmZhY2UifQotCi0JaW1wb3J0QXBpRGVwICAgICAgID0gZGVwVGFne25hbWU6ICJpbXBvcnRlZC1hcGkifQotCWltcG9ydEludGVyZmFjZURlcCA9IGRlcFRhZ3tuYW1lOiAiaW1wb3J0ZWQtaW50ZXJmYWNlIn0KLSkKLQogLy8gY2FsY3VsYXRlcyBpbXBvcnQgZmxhZ3MoLUkpIGZyb20gZGVwcy4KIC8vIFdoZW4gdGhlIHRhcmdldCBpcyBUb1QsIHVzZSBUb1Qgb2YgaW1wb3J0ZWQgaW50ZXJmYWNlcy4gSWYgbm90LCB3ZSB1c2UgImN1cnJlbnQiIHNuYXBzaG90IG9mCiAvLyBpbXBvcnRlZCBpbnRlcmZhY2VzLgotZnVuYyBnZXRJbXBvcnRzRnJvbURlcHMoY3R4IGFuZHJvaWQuTW9kdWxlQ29udGV4dCwgdGFyZ2V0SXNUb1QgYm9vbCkgKGltcG9ydFBhdGhzIFtdc3RyaW5nLCBpbXBsaWNpdHMgYW5kcm9pZC5QYXRocykgeworZnVuYyBnZXREZXBzKGN0eCBhbmRyb2lkLk1vZHVsZUNvbnRleHQsIHZlcnNpb25lZEltcG9ydHMgbWFwW3N0cmluZ11zdHJpbmcpIGRlcHMgeworCXZhciBkZXBzIGRlcHMKIAljdHguVmlzaXREaXJlY3REZXBzKGZ1bmMoZGVwIGFuZHJvaWQuTW9kdWxlKSB7Ci0JCXN3aXRjaCBjdHguT3RoZXJNb2R1bGVEZXBlbmRlbmN5VGFnKGRlcCkgewotCQljYXNlIGltcG9ydEludGVyZmFjZURlcDoKKwkJc3dpdGNoIGN0eC5PdGhlck1vZHVsZURlcGVuZGVuY3lUYWcoZGVwKS4odHlwZSkgeworCQljYXNlIGltcG9ydEludGVyZmFjZURlcFRhZzoKIAkJCWlmYWNlIDo9IGRlcC4oKmFpZGxJbnRlcmZhY2UpCi0JCQlpZiBwcm9wdG9vbHMuQm9vbChpZmFjZS5wcm9wZXJ0aWVzLlVuc3RhYmxlKSB8fCB0YXJnZXRJc1RvVCB7Ci0JCQkJaW1wb3J0UGF0aHMgPSBhcHBlbmQoaW1wb3J0UGF0aHMsIGlmYWNlLnByb3BlcnRpZXMuRnVsbF9pbXBvcnRfcGF0aHMuLi4pCi0JCQl9IGVsc2UgewotCQkJCS8vIHVzZSAiY3VycmVudCIgc25hcHNob3QgZnJvbSBzdGFibGUgImltcG9ydGVkIiBtb2R1bGVzCi0JCQkJY3VycmVudERpciA6PSBmaWxlcGF0aC5Kb2luKGN0eC5PdGhlck1vZHVsZURpcihkZXApLCBhaWRsQXBpRGlyLCBpZmFjZS5CYXNlTW9kdWxlTmFtZSgpLCBjdXJyZW50VmVyc2lvbikKLQkJCQlpbXBvcnRQYXRocyA9IGFwcGVuZChpbXBvcnRQYXRocywgY3VycmVudERpcikKLQkJCQkvLyBUT0RPKGIvMTg5Mjg4MzY5KSB0aGlzIHNob3VsZCBiZSB0cmFuc2l0aXZlCi0JCQkJaW1wb3J0UGF0aHMgPSBhcHBlbmQoaW1wb3J0UGF0aHMsIGlmYWNlLnByb3BlcnRpZXMuSW5jbHVkZV9kaXJzLi4uKQorCQkJaWYgdmVyc2lvbiwgb2sgOj0gdmVyc2lvbmVkSW1wb3J0c1tpZmFjZS5CYXNlTW9kdWxlTmFtZSgpXTsgb2sgeworCQkJCWlmIGlmYWNlLnByZXByb2Nlc3NlZFt2ZXJzaW9uXSA9PSBuaWwgeworCQkJCQljdHguTW9kdWxlRXJyb3JmKCJjYW4ndCBpbXBvcnQgJXYncyBwcmVwcm9jZXNzZWQodmVyc2lvbj0ldikiLCBpZmFjZS5CYXNlTW9kdWxlTmFtZSgpLCB2ZXJzaW9uKQorCQkJCX0KKwkJCQlkZXBzLnByZXByb2Nlc3NlZCA9IGFwcGVuZChkZXBzLnByZXByb2Nlc3NlZCwgaWZhY2UucHJlcHJvY2Vzc2VkW3ZlcnNpb25dKQogCQkJfQotCQljYXNlIGludGVyZmFjZURlcDoKKwkJY2FzZSBpbnRlcmZhY2VEZXBUYWc6CiAJCQlpZmFjZSA6PSBkZXAuKCphaWRsSW50ZXJmYWNlKQotCQkJaW1wb3J0UGF0aHMgPSBhcHBlbmQoaW1wb3J0UGF0aHMsIGlmYWNlLnByb3BlcnRpZXMuSW5jbHVkZV9kaXJzLi4uKQotCQljYXNlIGltcG9ydEFwaURlcCwgYXBpRGVwOgorCQkJZGVwcy5pbXBvcnRzID0gYXBwZW5kKGRlcHMuaW1wb3J0cywgaWZhY2UucHJvcGVydGllcy5JbmNsdWRlX2RpcnMuLi4pCisJCWNhc2UgYXBpRGVwVGFnOgogCQkJYXBpIDo9IGRlcC4oKmFpZGxBcGkpCiAJCQkvLyBhZGQgaW1wb3J0ZWQgbW9kdWxlJ3MgY2hlY2thcGlUaW1lc3RhbXBzIGFzIGltcGxpY2l0cyB0byBtYWtlIHN1cmUgdGhhdCBpbXBvcnRlZCBhcGlEdW1wIGlzIHVwLXRvLWRhdGUKLQkJCWltcGxpY2l0cyA9IGFwcGVuZChpbXBsaWNpdHMsIGFwaS5jaGVja0FwaVRpbWVzdGFtcHMuUGF0aHMoKS4uLikKLQkJCWltcGxpY2l0cyA9IGFwcGVuZChpbXBsaWNpdHMsIGFwaS5jaGVja0hhc2hUaW1lc3RhbXBzLlBhdGhzKCkuLi4pCisJCQlkZXBzLmltcGxpY2l0cyA9IGFwcGVuZChkZXBzLmltcGxpY2l0cywgYXBpLmNoZWNrQXBpVGltZXN0YW1wcy5QYXRocygpLi4uKQorCQkJZGVwcy5pbXBsaWNpdHMgPSBhcHBlbmQoZGVwcy5pbXBsaWNpdHMsIGFwaS5jaGVja0hhc2hUaW1lc3RhbXBzLlBhdGhzKCkuLi4pCiAJCX0KIAl9KQotCXJldHVybgorCXJldHVybiBkZXBzCiB9CiAKIGZ1bmMgKG0gKmFpZGxBcGkpIGNoZWNrQXBpKGN0eCBhbmRyb2lkLk1vZHVsZUNvbnRleHQsIG9sZER1bXAsIG5ld0R1bXAgYXBpRHVtcCwgY2hlY2tBcGlMZXZlbCBzdHJpbmcsIG1lc3NhZ2VGaWxlIGFuZHJvaWQuUGF0aCkgYW5kcm9pZC5Xcml0YWJsZVBhdGggewogCW5ld1ZlcnNpb24gOj0gbmV3RHVtcC5kaXIuQmFzZSgpCiAJdGltZXN0YW1wRmlsZSA6PSBhbmRyb2lkLlBhdGhGb3JNb2R1bGVPdXQoY3R4LCAiY2hlY2thcGlfIituZXdWZXJzaW9uKyIudGltZXN0YW1wIikKIAorCS8vIC0tY2hlY2thcGkob2xkLG5ldykgc2hvdWxkIHVzZSBpbXBvcnRzIGZvciAibmV3IgorCWRlcHMgOj0gZ2V0RGVwcyhjdHgsIG0uZ2V0SW1wb3J0cyhjdHgsIG5ld0R1bXAudmVyc2lvbikpCisJdmFyIGltcGxpY2l0cyBhbmRyb2lkLlBhdGhzCisJaW1wbGljaXRzID0gYXBwZW5kKGltcGxpY2l0cywgZGVwcy5pbXBsaWNpdHMuLi4pCisJaW1wbGljaXRzID0gYXBwZW5kKGltcGxpY2l0cywgZGVwcy5wcmVwcm9jZXNzZWQuLi4pCisJaW1wbGljaXRzID0gYXBwZW5kKGltcGxpY2l0cywgb2xkRHVtcC5maWxlcy4uLikKKwlpbXBsaWNpdHMgPSBhcHBlbmQoaW1wbGljaXRzLCBuZXdEdW1wLmZpbGVzLi4uKQorCWltcGxpY2l0cyA9IGFwcGVuZChpbXBsaWNpdHMsIG1lc3NhZ2VGaWxlKQorCiAJdmFyIG9wdGlvbmFsRmxhZ3MgW11zdHJpbmcKIAlpZiBtLnByb3BlcnRpZXMuU3RhYmlsaXR5ICE9IG5pbCB7CiAJCW9wdGlvbmFsRmxhZ3MgPSBhcHBlbmQob3B0aW9uYWxGbGFncywgIi0tc3RhYmlsaXR5IiwgKm0ucHJvcGVydGllcy5TdGFiaWxpdHkpCiAJfQorCW9wdGlvbmFsRmxhZ3MgPSBhcHBlbmQob3B0aW9uYWxGbGFncywgd3JhcCgiLXAiLCBkZXBzLnByZXByb2Nlc3NlZC5TdHJpbmdzKCksICIiKS4uLikKIAotCXZhciBpbXBsaWNpdHMgYW5kcm9pZC5QYXRocwotCWltcGxpY2l0cyA9IGFwcGVuZChpbXBsaWNpdHMsIG9sZER1bXAuZmlsZXMuLi4pCi0JaW1wbGljaXRzID0gYXBwZW5kKGltcGxpY2l0cywgbmV3RHVtcC5maWxlcy4uLikKLQlpbXBsaWNpdHMgPSBhcHBlbmQoaW1wbGljaXRzLCBtZXNzYWdlRmlsZSkKIAljdHguQnVpbGQocGN0eCwgYW5kcm9pZC5CdWlsZFBhcmFtc3sKIAkJUnVsZTogICAgICBhaWRsQ2hlY2tBcGlSdWxlLAogCQlJbXBsaWNpdHM6IGltcGxpY2l0cywKIAkJT3V0cHV0OiAgICB0aW1lc3RhbXBGaWxlLAogCQlBcmdzOiBtYXBbc3RyaW5nXXN0cmluZ3sKIAkJCSJvcHRpb25hbEZsYWdzIjogc3RyaW5ncy5Kb2luKG9wdGlvbmFsRmxhZ3MsICIgIiksCisJCQkiaW1wb3J0cyI6ICAgICAgIHN0cmluZ3MuSm9pbih3cmFwKCItSSIsIGRlcHMuaW1wb3J0cywgIiIpLCAiICIpLAogCQkJIm9sZCI6ICAgICAgICAgICBvbGREdW1wLmRpci5TdHJpbmcoKSwKIAkJCSJuZXciOiAgICAgICAgICAgbmV3RHVtcC5kaXIuU3RyaW5nKCksCiAJCQkibWVzc2FnZUZpbGUiOiAgIG1lc3NhZ2VGaWxlLlN0cmluZygpLApAQCAtMzA0LDEwICs0MDAsNiBAQAogCXJiLkNvbW1hbmQoKS5UZXh0KCJzZWQiKS5GbGFnKCIgcy8lcy8iICsgbS5wcm9wZXJ0aWVzLkJhc2VOYW1lICsgIi9nICIpLklucHV0KG1lc3NhZ2VGaWxlKS5UZXh0KCIgPiAiKS5PdXRwdXQoZm9ybWF0dGVkTWVzc2FnZUZpbGUpCiAJcmIuQnVpbGQoImZvcm1hdF9tZXNzYWdlXyIrbS5wcm9wZXJ0aWVzLkJhc2VOYW1lLCAiIikKIAotCXZhciBpbXBsaWNpdHMgYW5kcm9pZC5QYXRocwotCWltcGxpY2l0cyA9IGFwcGVuZChpbXBsaWNpdHMsIG9sZER1bXAuZmlsZXMuLi4pCi0JaW1wbGljaXRzID0gYXBwZW5kKGltcGxpY2l0cywgbmV3RHVtcC5maWxlcy4uLikKLQlpbXBsaWNpdHMgPSBhcHBlbmQoaW1wbGljaXRzLCBmb3JtYXR0ZWRNZXNzYWdlRmlsZSkKIAlyZXR1cm4gbS5jaGVja0FwaShjdHgsIG9sZER1bXAsIG5ld0R1bXAsICJlcXVhbCIsIGZvcm1hdHRlZE1lc3NhZ2VGaWxlKQogfQogCkBAIC0zMTYsMTMgKzQwOCw2IEBACiAJdGltZXN0YW1wRmlsZSA6PSBhbmRyb2lkLlBhdGhGb3JNb2R1bGVPdXQoY3R4LCAiY2hlY2toYXNoXyIrdmVyc2lvbisiLnRpbWVzdGFtcCIpCiAJbWVzc2FnZUZpbGUgOj0gYW5kcm9pZC5QYXRoRm9yU291cmNlKGN0eCwgInN5c3RlbS90b29scy9haWRsL2J1aWxkL21lc3NhZ2VfY2hlY2tfaW50ZWdyaXR5LnR4dCIpCiAKLQlpLCBfIDo9IHN0cmNvbnYuQXRvaSh2ZXJzaW9uKQotCWlmIGkgPT0gMSB7Ci0JCXZlcnNpb24gPSAibGF0ZXN0LXZlcnNpb24iCi0JfSBlbHNlIHsKLQkJdmVyc2lvbiA9IHN0cmNvbnYuSXRvYShpIC0gMSkKLQl9Ci0KIAl2YXIgaW1wbGljaXRzIGFuZHJvaWQuUGF0aHMKIAlpbXBsaWNpdHMgPSBhcHBlbmQoaW1wbGljaXRzLCBkdW1wLmZpbGVzLi4uKQogCWltcGxpY2l0cyA9IGFwcGVuZChpbXBsaWNpdHMsIGR1bXAuaGFzaEZpbGUuUGF0aCgpKQpAQCAtMzMzLDcgKzQxOCw3IEBACiAJCU91dHB1dDogICAgdGltZXN0YW1wRmlsZSwKIAkJQXJnczogbWFwW3N0cmluZ11zdHJpbmd7CiAJCQkiYXBpRGlyIjogICAgICBkdW1wLmRpci5TdHJpbmcoKSwKLQkJCSJ2ZXJzaW9uIjogICAgIHZlcnNpb24sCisJCQkidmVyc2lvbiI6ICAgICB2ZXJzaW9uRm9ySGFzaEdlbih2ZXJzaW9uKSwKIAkJCSJoYXNoRmlsZSI6ICAgIGR1bXAuaGFzaEZpbGUuUGF0aCgpLlN0cmluZygpLAogCQkJIm1lc3NhZ2VGaWxlIjogbWVzc2FnZUZpbGUuU3RyaW5nKCksCiAJCX0sCkBAIC0zNDEsNiArNDI2LDMxIEBACiAJcmV0dXJuIHRpbWVzdGFtcEZpbGUKIH0KIAorZnVuYyAobSAqYWlkbEFwaSkgY2hlY2tGb3JEZXZlbG9wbWVudChjdHggYW5kcm9pZC5Nb2R1bGVDb250ZXh0LCBsYXRlc3RWZXJzaW9uRHVtcCAqYXBpRHVtcCwgdG90RHVtcCBhcGlEdW1wKSBhbmRyb2lkLldyaXRhYmxlUGF0aCB7CisJaGFzRGV2UGF0aCA6PSBhbmRyb2lkLlBhdGhGb3JNb2R1bGVPdXQoY3R4LCAiaGFzX2RldmVsb3BtZW50IikKKwlyYiA6PSBhbmRyb2lkLk5ld1J1bGVCdWlsZGVyKHBjdHgsIGN0eCkKKwlyYi5Db21tYW5kKCkuVGV4dCgicm0gLWYgIiArIGhhc0RldlBhdGguU3RyaW5nKCkpCisJaWYgbGF0ZXN0VmVyc2lvbkR1bXAgIT0gbmlsIHsKKwkJaGFzRGV2Q29tbWFuZCA6PSByYi5Db21tYW5kKCkKKwkJaGFzRGV2Q29tbWFuZC5CdWlsdFRvb2woImFpZGwiKS5GbGFnV2l0aEFyZygiLS1jaGVja2FwaT0iLCAiZXF1YWwiKQorCQlpZiBtLnByb3BlcnRpZXMuU3RhYmlsaXR5ICE9IG5pbCB7CisJCQloYXNEZXZDb21tYW5kLkZsYWdXaXRoQXJnKCItLXN0YWJpbGl0eSAiLCAqbS5wcm9wZXJ0aWVzLlN0YWJpbGl0eSkKKwkJfQorCQkvLyBjaGVja2FwaShsYXRlc3QsIHRvdCkgc2hvdWxkIHVzZSBpbXBvcnRzIGZvciBuZXh0VmVyc2lvbig9dG90KQorCQlkZXBzIDo9IGdldERlcHMoY3R4LCBtLmdldEltcG9ydHMoY3R4LCBtLm5leHRWZXJzaW9uKCkpKQorCQloYXNEZXZDb21tYW5kLgorCQkJRmxhZ0ZvckVhY2hBcmcoIi1JIiwgZGVwcy5pbXBvcnRzKS5JbXBsaWNpdHMoZGVwcy5pbXBsaWNpdHMpLgorCQkJRmxhZ0ZvckVhY2hJbnB1dCgiLXAiLCBkZXBzLnByZXByb2Nlc3NlZCkuCisJCQlUZXh0KGxhdGVzdFZlcnNpb25EdW1wLmRpci5TdHJpbmcoKSkuSW1wbGljaXRzKGxhdGVzdFZlcnNpb25EdW1wLmZpbGVzKS4KKwkJCVRleHQodG90RHVtcC5kaXIuU3RyaW5nKCkpLkltcGxpY2l0cyh0b3REdW1wLmZpbGVzKS4KKwkJCVRleHQoIjI+IC9kZXYvbnVsbDsgZWNobyAkPyA+IikuT3V0cHV0KGhhc0RldlBhdGgpCisJfSBlbHNlIHsKKwkJcmIuQ29tbWFuZCgpLlRleHQoImVjaG8gMSA+IikuT3V0cHV0KGhhc0RldlBhdGgpCisJfQorCXJiLkJ1aWxkKCJjaGVja19mb3JfZGV2ZWxvcG1lbnQiLCAiIikKKwlyZXR1cm4gaGFzRGV2UGF0aAorfQorCiBmdW5jIChtICphaWRsQXBpKSBHZW5lcmF0ZUFuZHJvaWRCdWlsZEFjdGlvbnMoY3R4IGFuZHJvaWQuTW9kdWxlQ29udGV4dCkgewogCS8vIEFuIEFQSSBkdW1wIGlzIGNyZWF0ZWQgZnJvbSBzb3VyY2UgYW5kIGl0IGlzIGNvbXBhcmVkIGFnYWluc3QgdGhlIEFQSSBkdW1wIG9mIHRoZQogCS8vICdjdXJyZW50JyAoeWV0LXRvLWJlLWZpbmFsaXplZCkgdmVyc2lvbi4gQnkgY2hlY2tpbmcgdGhpcyB3ZSBlbmZvcmNlIHRoYXQgYW55IGNoYW5nZSBpbgpAQCAtMzUxLDYgKzQ2MSw3IEBACiAJdmFyIGN1cnJlbnRBcGlEdW1wIGFwaUR1bXAKIAlpZiBjdXJyZW50QXBpRGlyLlZhbGlkKCkgewogCQljdXJyZW50QXBpRHVtcCA9IGFwaUR1bXB7CisJCQl2ZXJzaW9uOiAgbmV4dFZlcnNpb24obS5wcm9wZXJ0aWVzLlZlcnNpb25zKSwKIAkJCWRpcjogICAgICBjdXJyZW50QXBpRGlyLlBhdGgoKSwKIAkJCWZpbGVzOiAgICBjdHguR2xvYihmaWxlcGF0aC5Kb2luKGN1cnJlbnRBcGlEaXIuUGF0aCgpLlN0cmluZygpLCAiKiovKi5haWRsIiksIG5pbCksCiAJCQloYXNoRmlsZTogYW5kcm9pZC5FeGlzdGVudFBhdGhGb3JTb3VyY2UoY3R4LCBjdHguTW9kdWxlRGlyKCksIG0uYXBpRGlyKCksIGN1cnJlbnRWZXJzaW9uLCAiLmhhc2giKSwKQEAgLTM3OSwxMSArNDkwLDIwIEBACiAJCWFwaURpciA6PSBmaWxlcGF0aC5Kb2luKGN0eC5Nb2R1bGVEaXIoKSwgbS5hcGlEaXIoKSwgdmVyKQogCQlhcGlEaXJQYXRoIDo9IGFuZHJvaWQuRXhpc3RlbnRQYXRoRm9yU291cmNlKGN0eCwgYXBpRGlyKQogCQlpZiBhcGlEaXJQYXRoLlZhbGlkKCkgewotCQkJZHVtcHMgPSBhcHBlbmQoZHVtcHMsIGFwaUR1bXB7CisJCQloYXNoRmlsZVBhdGggOj0gZmlsZXBhdGguSm9pbihhcGlEaXIsICIuaGFzaCIpCisJCQlkdW1wIDo9IGFwaUR1bXB7CisJCQkJdmVyc2lvbjogIHZlciwKIAkJCQlkaXI6ICAgICAgYXBpRGlyUGF0aC5QYXRoKCksCiAJCQkJZmlsZXM6ICAgIGN0eC5HbG9iKGZpbGVwYXRoLkpvaW4oYXBpRGlyUGF0aC5TdHJpbmcoKSwgIioqLyouYWlkbCIpLCBuaWwpLAotCQkJCWhhc2hGaWxlOiBhbmRyb2lkLkV4aXN0ZW50UGF0aEZvclNvdXJjZShjdHgsIGN0eC5Nb2R1bGVEaXIoKSwgbS5hcGlEaXIoKSwgdmVyLCAiLmhhc2giKSwKLQkJCX0pCisJCQkJaGFzaEZpbGU6IGFuZHJvaWQuRXhpc3RlbnRQYXRoRm9yU291cmNlKGN0eCwgaGFzaEZpbGVQYXRoKSwKKwkJCX0KKwkJCWlmICFkdW1wLmhhc2hGaWxlLlZhbGlkKCkgeworCQkJCS8vIFdlIHNob3VsZCBzaG93IHRoZSBzb3VyY2UgcGF0aCBvZiBoYXNoX2dlbiBiZWNhdXNlIGFpZGxfaGFzaF9nZW4gY2Fubm90IGJlIGJ1aWx0IGR1ZSB0byBidWlsZCBlcnJvci4KKwkJCQljbWQgOj0gZm10LlNwcmludGYoYChjcm9vdCAmJiBzeXN0ZW0vdG9vbHMvYWlkbC9idWlsZC9oYXNoX2dlbi5zaCAlcyAlcyAlcylgLCBhcGlEaXIsIHZlcnNpb25Gb3JIYXNoR2VuKHZlciksIGhhc2hGaWxlUGF0aCkKKwkJCQljdHguTW9kdWxlRXJyb3JmKCJBIGZyb3plbiBhaWRsX2ludGVyZmFjZSBtdXN0IGhhdmUgJy5oYXNoJyBmaWxlLCBidXQgJXMtViVzIGRvZXNuJ3QgaGF2ZSBpdC4gVXNlIHRoZSBjb21tYW5kIGJlbG93IHRvIGdlbmVyYXRlIGhhc2guXG4lc1xuIiwKKwkJCQkJbS5wcm9wZXJ0aWVzLkJhc2VOYW1lLCB2ZXIsIGNtZCkKKwkJCX0KKwkJCWR1bXBzID0gYXBwZW5kKGR1bXBzLCBkdW1wKQogCQl9IGVsc2UgaWYgY3R4LkNvbmZpZygpLkFsbG93TWlzc2luZ0RlcGVuZGVuY2llcygpIHsKIAkJCWN0eC5BZGRNaXNzaW5nRGVwZW5kZW5jaWVzKFtdc3RyaW5ne2FwaURpcn0pCiAJCX0gZWxzZSB7CkBAIC00MTAsNiArNTMwLDkgQEAKIAkJbS5jaGVja0FwaVRpbWVzdGFtcHMgPSBhcHBlbmQobS5jaGVja0FwaVRpbWVzdGFtcHMsIGNoZWNrZWQpCiAJfQogCisJLy8gQ2hlY2sgZm9yIGFjdGl2ZSBkZXZlbG9wbWVudCBvbiB0aGUgdW5mcm96ZW4gdmVyc2lvbgorCW0uaGFzRGV2ZWxvcG1lbnQgPSBtLmNoZWNrRm9yRGV2ZWxvcG1lbnQoY3R4LCBsYXRlc3RWZXJzaW9uRHVtcCwgdG90QXBpRHVtcCkKKwogCS8vIEFQSSBkdW1wIGZyb20gc291cmNlIGlzIHVwZGF0ZWQgdG8gdGhlICdjdXJyZW50JyB2ZXJzaW9uLiBUcmlnZ2VyZWQgYnkgYG0gPG5hbWU+LXVwZGF0ZS1hcGlgCiAJbS51cGRhdGVBcGlUaW1lc3RhbXAgPSBtLm1ha2VBcGlEdW1wQXNWZXJzaW9uKGN0eCwgdG90QXBpRHVtcCwgY3VycmVudFZlcnNpb24sIG5pbCkKIApAQCAtNDM0LDcgKzU1Nyw3IEBACiB9CiAKIGZ1bmMgKG0gKmFpZGxBcGkpIERlcHNNdXRhdG9yKGN0eCBhbmRyb2lkLkJvdHRvbVVwTXV0YXRvckNvbnRleHQpIHsKLQljdHguQWRkRGVwZW5kZW5jeShjdHguTW9kdWxlKCksIG5pbCwgd3JhcCgiIiwgbS5wcm9wZXJ0aWVzLkltcG9ydHNXaXRob3V0VmVyc2lvbiwgYWlkbEludGVyZmFjZVN1ZmZpeCkuLi4pCisJY3R4LkFkZFJldmVyc2VEZXBlbmRlbmN5KGN0eC5Nb2R1bGUoKSwgbmlsLCBhaWRsTWV0YWRhdGFTaW5nbGV0b25OYW1lKQogfQogCiBmdW5jIGFpZGxBcGlGYWN0b3J5KCkgYW5kcm9pZC5Nb2R1bGUgewpAQCAtNDUwLDE3ICs1NzMsMjYgQEAKIAltY3R4LkNyZWF0ZU1vZHVsZShhaWRsQXBpRmFjdG9yeSwgJm5hbWVQcm9wZXJ0aWVzewogCQlOYW1lOiBwcm9wdG9vbHMuU3RyaW5nUHRyKGFwaU1vZHVsZSksCiAJfSwgJmFpZGxBcGlQcm9wZXJ0aWVzewotCQlCYXNlTmFtZTogICAgICAgICAgICAgIGkuTW9kdWxlQmFzZS5OYW1lKCksCi0JCVNyY3M6ICAgICAgICAgICAgICAgICAgc3JjcywKLQkJQWlkbFJvb3Q6ICAgICAgICAgICAgICBhaWRsUm9vdCwKLQkJU3RhYmlsaXR5OiAgICAgICAgICAgICBpLnByb3BlcnRpZXMuU3RhYmlsaXR5LAotCQlJbXBvcnRzV2l0aG91dFZlcnNpb246IGNvbmNhdChpLnByb3BlcnRpZXMuSW1wb3J0c1dpdGhvdXRWZXJzaW9uLCBbXXN0cmluZ3tpLk1vZHVsZUJhc2UuTmFtZSgpfSksCi0JCVZlcnNpb25zOiAgICAgICAgICAgICAgaS5wcm9wZXJ0aWVzLlZlcnNpb25zLAotCQlEdW1wYXBpOiAgICAgICAgICAgICAgIGkucHJvcGVydGllcy5EdW1wYXBpLAorCQlCYXNlTmFtZTogIGkuTW9kdWxlQmFzZS5OYW1lKCksCisJCVNyY3M6ICAgICAgc3JjcywKKwkJQWlkbFJvb3Q6ICBhaWRsUm9vdCwKKwkJU3RhYmlsaXR5OiBpLnByb3BlcnRpZXMuU3RhYmlsaXR5LAorCQlJbXBvcnRzOiAgIGkucHJvcGVydGllcy5JbXBvcnRzLAorCQlWZXJzaW9uczogIGkuZ2V0VmVyc2lvbnMoKSwKKwkJRHVtcGFwaTogICBpLnByb3BlcnRpZXMuRHVtcGFwaSwKIAl9KQogCXJldHVybiBhcGlNb2R1bGUKIH0KIAorZnVuYyB2ZXJzaW9uRm9ySGFzaEdlbih2ZXIgc3RyaW5nKSBzdHJpbmcgeworCS8vIGFpZGxIYXNoR2VuIHVzZXMgdGhlIHZlcnNpb24gYmVmb3JlIGN1cnJlbnQgdmVyc2lvbi4gSWYgaXQgaGFzIG5ldmVyIGJlZW4gZnJvemVuLCByZXR1cm4gJ2xhdGVzdC12ZXJzaW9uJy4KKwl2ZXJJbnQsIF8gOj0gc3RyY29udi5BdG9pKHZlcikKKwlpZiB2ZXJJbnQgPiAxIHsKKwkJcmV0dXJuIHN0cmNvbnYuSXRvYSh2ZXJJbnQgLSAxKQorCX0KKwlyZXR1cm4gImxhdGVzdC12ZXJzaW9uIgorfQorCiBmdW5jIGluaXQoKSB7CiAJYW5kcm9pZC5SZWdpc3RlclNpbmdsZXRvblR5cGUoImFpZGwtZnJlZXplLWFwaSIsIGZyZWV6ZUFwaVNpbmdsZXRvbkZhY3RvcnkpCiB9CkBAIC00NzgsNyArNjEwLDE2IEBACiAJCQlyZXR1cm4KIAkJfQogCQlpZiBtLCBvayA6PSBtb2R1bGUuKCphaWRsQXBpKTsgb2sgewotCQkJZmlsZXMgPSBhcHBlbmQoZmlsZXMsIG0uZnJlZXplQXBpVGltZXN0YW1wKQorCQkJb3duZXJzVG9GcmVlemUgOj0gc3RyaW5ncy5GaWVsZHMoY3R4LkNvbmZpZygpLkdldGVudigiQUlETF9GUkVFWkVfT1dORVJTIikpCisJCQl2YXIgc2hvdWxkQmVGcm96ZW4gYm9vbAorCQkJaWYgbGVuKG93bmVyc1RvRnJlZXplKSA+IDAgeworCQkJCXNob3VsZEJlRnJvemVuID0gYW5kcm9pZC5Jbkxpc3QobS5Pd25lcigpLCBvd25lcnNUb0ZyZWV6ZSkKKwkJCX0gZWxzZSB7CisJCQkJc2hvdWxkQmVGcm96ZW4gPSBtLk93bmVyKCkgPT0gIiIKKwkJCX0KKwkJCWlmIHNob3VsZEJlRnJvemVuIHsKKwkJCQlmaWxlcyA9IGFwcGVuZChmaWxlcywgbS5mcmVlemVBcGlUaW1lc3RhbXApCisJCQl9CiAJCX0KIAl9KQogCWN0eC5QaG9ueSgiYWlkbC1mcmVlemUtYXBpIiwgZmlsZXMuLi4pCmRpZmYgLS1naXQgYS9idWlsZC9haWRsX2FwaS90ZXN0LXBpZWNlLTEvNC8uaGFzaCBiL2J1aWxkL2FpZGxfYXBpL3Rlc3QtcGllY2UtMS80Ly5oYXNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyMzhhYjQKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9haWRsX2FwaS90ZXN0LXBpZWNlLTEvNC8uaGFzaApAQCAtMCwwICsxIEBACitiZTVkZDZiZjljOTAwMGVlMDUzNjIxZjExOGI3ZDZhN2NmZDFlNzllCmRpZmYgLS1naXQgYS9idWlsZC9haWRsX2FwaS90ZXN0LXBpZWNlLTEvNC9zb21lX3BhY2thZ2UvSUZvby5haWRsIGIvYnVpbGQvYWlkbF9hcGkvdGVzdC1waWVjZS0xLzQvc29tZV9wYWNrYWdlL0lGb28uYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGE1YmU5Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYWlkbF9hcGkvdGVzdC1waWVjZS0xLzQvc29tZV9wYWNrYWdlL0lGb28uYWlkbApAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFRISVMgRklMRSBJUyBJTU1VVEFCTEUuIERPIE5PVCBFRElUIElOIEFOWSBDQVNFLiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8gVGhpcyBmaWxlIGlzIGEgc25hcHNob3Qgb2YgYW4gQUlETCBmaWxlLiBEbyBub3QgZWRpdCBpdCBtYW51YWxseS4gVGhlcmUgYXJlCisvLyB0d28gY2FzZXM6CisvLyAxKS4gdGhpcyBpcyBhIGZyb3plbiB2ZXJzaW9uIGZpbGUgLSBkbyBub3QgZWRpdCB0aGlzIGluIGFueSBjYXNlLgorLy8gMikuIHRoaXMgaXMgYSAnY3VycmVudCcgZmlsZS4gSWYgeW91IG1ha2UgYSBiYWNrd2FyZHMgY29tcGF0aWJsZSBjaGFuZ2UgdG8KKy8vICAgICB0aGUgaW50ZXJmYWNlIChmcm9tIHRoZSBsYXRlc3QgZnJvemVuIHZlcnNpb24pLCB0aGUgYnVpbGQgc3lzdGVtIHdpbGwKKy8vICAgICBwcm9tcHQgeW91IHRvIHVwZGF0ZSB0aGlzIGZpbGUgd2l0aCBgbSA8bmFtZT4tdXBkYXRlLWFwaWAuCisvLworLy8gWW91IG11c3Qgbm90IG1ha2UgYSBiYWNrd2FyZCBpbmNvbXBhdGlibGUgY2hhbmdlIHRvIGFueSBBSURMIGZpbGUgYnVpbHQKKy8vIHdpdGggdGhlIGFpZGxfaW50ZXJmYWNlIG1vZHVsZSB0eXBlIHdpdGggdmVyc2lvbnMgcHJvcGVydHkgc2V0LiBUaGUgbW9kdWxlCisvLyB0eXBlIGlzIHVzZWQgdG8gYnVpbGQgQUlETCBmaWxlcyBpbiBhIHdheSB0aGF0IHRoZXkgY2FuIGJlIHVzZWQgYWNyb3NzCisvLyBpbmRlcGVuZGVudGx5IHVwZGF0YWJsZSBjb21wb25lbnRzIG9mIHRoZSBzeXN0ZW0uIElmIGEgZGV2aWNlIGlzIHNoaXBwZWQKKy8vIHdpdGggc3VjaCBhIGJhY2t3YXJkIGluY29tcGF0aWJsZSBjaGFuZ2UsIGl0IGhhcyBhIGhpZ2ggcmlzayBvZiBicmVha2luZworLy8gbGF0ZXIgd2hlbiBhIG1vZHVsZSB1c2luZyB0aGUgaW50ZXJmYWNlIGlzIHVwZGF0ZWQsIGUuZy4sIE1haW5saW5lIG1vZHVsZXMuCisKK3BhY2thZ2Ugc29tZV9wYWNrYWdlOworQFN1cHByZXNzV2FybmluZ3ModmFsdWU9eyJpbm91dC1wYXJhbWV0ZXIifSkKK2ludGVyZmFjZSBJRm9vIHsKKyAgdm9pZCBDYW5Zb3VEZWFsV2l0aFRoaXNUaGluZyhpbm91dCBzb21lX3BhY2thZ2UuVGhpbmcgcGFyY2VsKTsKKyAgdm9pZCBDYW5Zb3VEZWFsV2l0aFRoaXNTdWJUaGluZyhpbm91dCBzb21lX3BhY2thZ2Uuc3ViX3BhY2thZ2UuU3ViVGhpbmcgcGFyY2VsKTsKK30KZGlmZiAtLWdpdCBhL2J1aWxkL2FpZGxfYXBpL3Rlc3QtcGllY2UtMS80L3NvbWVfcGFja2FnZS9UaGluZy5haWRsIGIvYnVpbGQvYWlkbF9hcGkvdGVzdC1waWVjZS0xLzQvc29tZV9wYWNrYWdlL1RoaW5nLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBjNTcyMAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FpZGxfYXBpL3Rlc3QtcGllY2UtMS80L3NvbWVfcGFja2FnZS9UaGluZy5haWRsCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVEhJUyBGSUxFIElTIElNTVVUQUJMRS4gRE8gTk9UIEVESVQgSU4gQU5ZIENBU0UuICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLyBUaGlzIGZpbGUgaXMgYSBzbmFwc2hvdCBvZiBhbiBBSURMIGZpbGUuIERvIG5vdCBlZGl0IGl0IG1hbnVhbGx5LiBUaGVyZSBhcmUKKy8vIHR3byBjYXNlczoKKy8vIDEpLiB0aGlzIGlzIGEgZnJvemVuIHZlcnNpb24gZmlsZSAtIGRvIG5vdCBlZGl0IHRoaXMgaW4gYW55IGNhc2UuCisvLyAyKS4gdGhpcyBpcyBhICdjdXJyZW50JyBmaWxlLiBJZiB5b3UgbWFrZSBhIGJhY2t3YXJkcyBjb21wYXRpYmxlIGNoYW5nZSB0bworLy8gICAgIHRoZSBpbnRlcmZhY2UgKGZyb20gdGhlIGxhdGVzdCBmcm96ZW4gdmVyc2lvbiksIHRoZSBidWlsZCBzeXN0ZW0gd2lsbAorLy8gICAgIHByb21wdCB5b3UgdG8gdXBkYXRlIHRoaXMgZmlsZSB3aXRoIGBtIDxuYW1lPi11cGRhdGUtYXBpYC4KKy8vCisvLyBZb3UgbXVzdCBub3QgbWFrZSBhIGJhY2t3YXJkIGluY29tcGF0aWJsZSBjaGFuZ2UgdG8gYW55IEFJREwgZmlsZSBidWlsdAorLy8gd2l0aCB0aGUgYWlkbF9pbnRlcmZhY2UgbW9kdWxlIHR5cGUgd2l0aCB2ZXJzaW9ucyBwcm9wZXJ0eSBzZXQuIFRoZSBtb2R1bGUKKy8vIHR5cGUgaXMgdXNlZCB0byBidWlsZCBBSURMIGZpbGVzIGluIGEgd2F5IHRoYXQgdGhleSBjYW4gYmUgdXNlZCBhY3Jvc3MKKy8vIGluZGVwZW5kZW50bHkgdXBkYXRhYmxlIGNvbXBvbmVudHMgb2YgdGhlIHN5c3RlbS4gSWYgYSBkZXZpY2UgaXMgc2hpcHBlZAorLy8gd2l0aCBzdWNoIGEgYmFja3dhcmQgaW5jb21wYXRpYmxlIGNoYW5nZSwgaXQgaGFzIGEgaGlnaCByaXNrIG9mIGJyZWFraW5nCisvLyBsYXRlciB3aGVuIGEgbW9kdWxlIHVzaW5nIHRoZSBpbnRlcmZhY2UgaXMgdXBkYXRlZCwgZS5nLiwgTWFpbmxpbmUgbW9kdWxlcy4KKworcGFja2FnZSBzb21lX3BhY2thZ2U7CitwYXJjZWxhYmxlIFRoaW5nIHsKKyAgaW50IGE7CisgIGludCBiOworfQpkaWZmIC0tZ2l0IGEvYnVpbGQvYWlkbF9hcGkvdGVzdC1waWVjZS0xLzQvc29tZV9wYWNrYWdlL3N1Yl9wYWNrYWdlL0lGb28uYWlkbCBiL2J1aWxkL2FpZGxfYXBpL3Rlc3QtcGllY2UtMS80L3NvbWVfcGFja2FnZS9zdWJfcGFja2FnZS9JRm9vLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc5ZjE2NgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FpZGxfYXBpL3Rlc3QtcGllY2UtMS80L3NvbWVfcGFja2FnZS9zdWJfcGFja2FnZS9JRm9vLmFpZGwKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBUSElTIEZJTEUgSVMgSU1NVVRBQkxFLiBETyBOT1QgRURJVCBJTiBBTlkgQ0FTRS4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIFRoaXMgZmlsZSBpcyBhIHNuYXBzaG90IG9mIGFuIEFJREwgZmlsZS4gRG8gbm90IGVkaXQgaXQgbWFudWFsbHkuIFRoZXJlIGFyZQorLy8gdHdvIGNhc2VzOgorLy8gMSkuIHRoaXMgaXMgYSBmcm96ZW4gdmVyc2lvbiBmaWxlIC0gZG8gbm90IGVkaXQgdGhpcyBpbiBhbnkgY2FzZS4KKy8vIDIpLiB0aGlzIGlzIGEgJ2N1cnJlbnQnIGZpbGUuIElmIHlvdSBtYWtlIGEgYmFja3dhcmRzIGNvbXBhdGlibGUgY2hhbmdlIHRvCisvLyAgICAgdGhlIGludGVyZmFjZSAoZnJvbSB0aGUgbGF0ZXN0IGZyb3plbiB2ZXJzaW9uKSwgdGhlIGJ1aWxkIHN5c3RlbSB3aWxsCisvLyAgICAgcHJvbXB0IHlvdSB0byB1cGRhdGUgdGhpcyBmaWxlIHdpdGggYG0gPG5hbWU+LXVwZGF0ZS1hcGlgLgorLy8KKy8vIFlvdSBtdXN0IG5vdCBtYWtlIGEgYmFja3dhcmQgaW5jb21wYXRpYmxlIGNoYW5nZSB0byBhbnkgQUlETCBmaWxlIGJ1aWx0CisvLyB3aXRoIHRoZSBhaWRsX2ludGVyZmFjZSBtb2R1bGUgdHlwZSB3aXRoIHZlcnNpb25zIHByb3BlcnR5IHNldC4gVGhlIG1vZHVsZQorLy8gdHlwZSBpcyB1c2VkIHRvIGJ1aWxkIEFJREwgZmlsZXMgaW4gYSB3YXkgdGhhdCB0aGV5IGNhbiBiZSB1c2VkIGFjcm9zcworLy8gaW5kZXBlbmRlbnRseSB1cGRhdGFibGUgY29tcG9uZW50cyBvZiB0aGUgc3lzdGVtLiBJZiBhIGRldmljZSBpcyBzaGlwcGVkCisvLyB3aXRoIHN1Y2ggYSBiYWNrd2FyZCBpbmNvbXBhdGlibGUgY2hhbmdlLCBpdCBoYXMgYSBoaWdoIHJpc2sgb2YgYnJlYWtpbmcKKy8vIGxhdGVyIHdoZW4gYSBtb2R1bGUgdXNpbmcgdGhlIGludGVyZmFjZSBpcyB1cGRhdGVkLCBlLmcuLCBNYWlubGluZSBtb2R1bGVzLgorCitwYWNrYWdlIHNvbWVfcGFja2FnZS5zdWJfcGFja2FnZTsKK0BTdXBwcmVzc1dhcm5pbmdzKHZhbHVlPXsiaW5vdXQtcGFyYW1ldGVyIn0pCitpbnRlcmZhY2UgSUZvbyB7CisgIHZvaWQgQ2FuWW91RGVhbFdpdGhUaGlzVGhpbmcoaW5vdXQgc29tZV9wYWNrYWdlLlRoaW5nIHBhcmNlbCk7CisgIHZvaWQgQ2FuWW91RGVhbFdpdGhUaGlzU3ViVGhpbmcoaW5vdXQgc29tZV9wYWNrYWdlLnN1Yl9wYWNrYWdlLlN1YlRoaW5nIHBhcmNlbCk7Cit9CmRpZmYgLS1naXQgYS9idWlsZC9haWRsX2FwaS90ZXN0LXBpZWNlLTEvNC9zb21lX3BhY2thZ2Uvc3ViX3BhY2thZ2UvU3ViVGhpbmcuYWlkbCBiL2J1aWxkL2FpZGxfYXBpL3Rlc3QtcGllY2UtMS80L3NvbWVfcGFja2FnZS9zdWJfcGFja2FnZS9TdWJUaGluZy5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmZjAwMDgKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9haWRsX2FwaS90ZXN0LXBpZWNlLTEvNC9zb21lX3BhY2thZ2Uvc3ViX3BhY2thZ2UvU3ViVGhpbmcuYWlkbApAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFRISVMgRklMRSBJUyBJTU1VVEFCTEUuIERPIE5PVCBFRElUIElOIEFOWSBDQVNFLiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8gVGhpcyBmaWxlIGlzIGEgc25hcHNob3Qgb2YgYW4gQUlETCBmaWxlLiBEbyBub3QgZWRpdCBpdCBtYW51YWxseS4gVGhlcmUgYXJlCisvLyB0d28gY2FzZXM6CisvLyAxKS4gdGhpcyBpcyBhIGZyb3plbiB2ZXJzaW9uIGZpbGUgLSBkbyBub3QgZWRpdCB0aGlzIGluIGFueSBjYXNlLgorLy8gMikuIHRoaXMgaXMgYSAnY3VycmVudCcgZmlsZS4gSWYgeW91IG1ha2UgYSBiYWNrd2FyZHMgY29tcGF0aWJsZSBjaGFuZ2UgdG8KKy8vICAgICB0aGUgaW50ZXJmYWNlIChmcm9tIHRoZSBsYXRlc3QgZnJvemVuIHZlcnNpb24pLCB0aGUgYnVpbGQgc3lzdGVtIHdpbGwKKy8vICAgICBwcm9tcHQgeW91IHRvIHVwZGF0ZSB0aGlzIGZpbGUgd2l0aCBgbSA8bmFtZT4tdXBkYXRlLWFwaWAuCisvLworLy8gWW91IG11c3Qgbm90IG1ha2UgYSBiYWNrd2FyZCBpbmNvbXBhdGlibGUgY2hhbmdlIHRvIGFueSBBSURMIGZpbGUgYnVpbHQKKy8vIHdpdGggdGhlIGFpZGxfaW50ZXJmYWNlIG1vZHVsZSB0eXBlIHdpdGggdmVyc2lvbnMgcHJvcGVydHkgc2V0LiBUaGUgbW9kdWxlCisvLyB0eXBlIGlzIHVzZWQgdG8gYnVpbGQgQUlETCBmaWxlcyBpbiBhIHdheSB0aGF0IHRoZXkgY2FuIGJlIHVzZWQgYWNyb3NzCisvLyBpbmRlcGVuZGVudGx5IHVwZGF0YWJsZSBjb21wb25lbnRzIG9mIHRoZSBzeXN0ZW0uIElmIGEgZGV2aWNlIGlzIHNoaXBwZWQKKy8vIHdpdGggc3VjaCBhIGJhY2t3YXJkIGluY29tcGF0aWJsZSBjaGFuZ2UsIGl0IGhhcyBhIGhpZ2ggcmlzayBvZiBicmVha2luZworLy8gbGF0ZXIgd2hlbiBhIG1vZHVsZSB1c2luZyB0aGUgaW50ZXJmYWNlIGlzIHVwZGF0ZWQsIGUuZy4sIE1haW5saW5lIG1vZHVsZXMuCisKK3BhY2thZ2Ugc29tZV9wYWNrYWdlLnN1Yl9wYWNrYWdlOworcGFyY2VsYWJsZSBTdWJUaGluZyB7CisgIGludCBhOworICBpbnQgYjsKK30KZGlmZiAtLWdpdCBhL2J1aWxkL2FpZGxfYXBpL3Rlc3QtcGllY2UtMi8xLy5oYXNoIGIvYnVpbGQvYWlkbF9hcGkvdGVzdC1waWVjZS0yLzEvLmhhc2gKaW5kZXggNzA1ZmMzMS4uM2MzMmVkZiAxMDA2NDQKLS0tIGEvYnVpbGQvYWlkbF9hcGkvdGVzdC1waWVjZS0yLzEvLmhhc2gKKysrIGIvYnVpbGQvYWlkbF9hcGkvdGVzdC1waWVjZS0yLzEvLmhhc2gKQEAgLTEgKzEsMiBAQAorYzU0NDkwMmFiOGExZDJlNzJhZTkzOTYwMzJiYTExM2U5Yjk2OThjNAogZmNkMzZkYjQ1MWNkYmVlYjA0OTgzM2ZkN2Y0OTlhOTg3YWNmMzkzMApkaWZmIC0tZ2l0IGEvYnVpbGQvYWlkbF9hcGkvdGVzdC1yb290LXBhY2thZ2UvMy8uaGFzaCBiL2J1aWxkL2FpZGxfYXBpL3Rlc3Qtcm9vdC1wYWNrYWdlLzMvLmhhc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRmYmU3NAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FpZGxfYXBpL3Rlc3Qtcm9vdC1wYWNrYWdlLzMvLmhhc2gKQEAgLTAsMCArMSBAQAorZmUxYjRiNTZiNzI2M2QxMjFjMzZiNTY2YTVkNmRkZjc0OTYyNjFjYwpkaWZmIC0tZ2l0IGEvYnVpbGQvYWlkbF9hcGkvdGVzdC1yb290LXBhY2thZ2UvMy90ZXN0X3BhY2thZ2UvSUJhei5haWRsIGIvYnVpbGQvYWlkbF9hcGkvdGVzdC1yb290LXBhY2thZ2UvMy90ZXN0X3BhY2thZ2UvSUJhei5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZTBhYmUKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9haWRsX2FwaS90ZXN0LXJvb3QtcGFja2FnZS8zL3Rlc3RfcGFja2FnZS9JQmF6LmFpZGwKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBUSElTIEZJTEUgSVMgSU1NVVRBQkxFLiBETyBOT1QgRURJVCBJTiBBTlkgQ0FTRS4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIFRoaXMgZmlsZSBpcyBhIHNuYXBzaG90IG9mIGFuIEFJREwgZmlsZS4gRG8gbm90IGVkaXQgaXQgbWFudWFsbHkuIFRoZXJlIGFyZQorLy8gdHdvIGNhc2VzOgorLy8gMSkuIHRoaXMgaXMgYSBmcm96ZW4gdmVyc2lvbiBmaWxlIC0gZG8gbm90IGVkaXQgdGhpcyBpbiBhbnkgY2FzZS4KKy8vIDIpLiB0aGlzIGlzIGEgJ2N1cnJlbnQnIGZpbGUuIElmIHlvdSBtYWtlIGEgYmFja3dhcmRzIGNvbXBhdGlibGUgY2hhbmdlIHRvCisvLyAgICAgdGhlIGludGVyZmFjZSAoZnJvbSB0aGUgbGF0ZXN0IGZyb3plbiB2ZXJzaW9uKSwgdGhlIGJ1aWxkIHN5c3RlbSB3aWxsCisvLyAgICAgcHJvbXB0IHlvdSB0byB1cGRhdGUgdGhpcyBmaWxlIHdpdGggYG0gPG5hbWU+LXVwZGF0ZS1hcGlgLgorLy8KKy8vIFlvdSBtdXN0IG5vdCBtYWtlIGEgYmFja3dhcmQgaW5jb21wYXRpYmxlIGNoYW5nZSB0byBhbnkgQUlETCBmaWxlIGJ1aWx0CisvLyB3aXRoIHRoZSBhaWRsX2ludGVyZmFjZSBtb2R1bGUgdHlwZSB3aXRoIHZlcnNpb25zIHByb3BlcnR5IHNldC4gVGhlIG1vZHVsZQorLy8gdHlwZSBpcyB1c2VkIHRvIGJ1aWxkIEFJREwgZmlsZXMgaW4gYSB3YXkgdGhhdCB0aGV5IGNhbiBiZSB1c2VkIGFjcm9zcworLy8gaW5kZXBlbmRlbnRseSB1cGRhdGFibGUgY29tcG9uZW50cyBvZiB0aGUgc3lzdGVtLiBJZiBhIGRldmljZSBpcyBzaGlwcGVkCisvLyB3aXRoIHN1Y2ggYSBiYWNrd2FyZCBpbmNvbXBhdGlibGUgY2hhbmdlLCBpdCBoYXMgYSBoaWdoIHJpc2sgb2YgYnJlYWtpbmcKKy8vIGxhdGVyIHdoZW4gYSBtb2R1bGUgdXNpbmcgdGhlIGludGVyZmFjZSBpcyB1cGRhdGVkLCBlLmcuLCBNYWlubGluZSBtb2R1bGVzLgorCitwYWNrYWdlIHRlc3RfcGFja2FnZTsKK0BTdXBwcmVzc1dhcm5pbmdzKHZhbHVlPXsibWl4ZWQtb25ld2F5IiwgImlub3V0LXBhcmFtZXRlciIsICJvdXQtYXJyYXkifSkKK2ludGVyZmFjZSBJQmF6IHsKKyAgb25ld2F5IHZvaWQgQ2FuWW91RGVhbFdpdGhUaGlzQmFyKGluIHNvbWVfcGFja2FnZS5JQmFyIGJhcik7CisgIHZvaWQgTWV0aG9kQWRkZWRJblZlcnNpb24yKCk7CisgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIHJlYWRQRkQoKTsKKyAgdm9pZCB3cml0ZVBGRChpbiBQYXJjZWxGaWxlRGVzY3JpcHRvciBmZCk7CisgIHZvaWQgcmVhZFdyaXRlUEZEKGlub3V0IFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkKTsKKyAgUGFyY2VsRmlsZURlc2NyaXB0b3JbXSByZWFkUEZEQXJyYXkoKTsKKyAgdm9pZCB3cml0ZVBGREFycmF5KGluIFBhcmNlbEZpbGVEZXNjcmlwdG9yW10gZmRzKTsKKyAgdm9pZCByZWFkV3JpdGVQRkRBcnJheShpbm91dCBQYXJjZWxGaWxlRGVzY3JpcHRvcltdIGZkcyk7Cit9CmRpZmYgLS1naXQgYS9idWlsZC9haWRsX2dlbl9ydWxlLmdvIGIvYnVpbGQvYWlkbF9nZW5fcnVsZS5nbwppbmRleCBmOTQ0NjE3Li4zZGQwZmRlIDEwMDY0NAotLS0gYS9idWlsZC9haWRsX2dlbl9ydWxlLmdvCisrKyBiL2J1aWxkL2FpZGxfZ2VuX3J1bGUuZ28KQEAgLTYzLDE5ICs2MywyMiBAQAogKQogCiB0eXBlIGFpZGxHZW5Qcm9wZXJ0aWVzIHN0cnVjdCB7Ci0JU3JjcyAgICAgICAgICAgICAgICAgIFtdc3RyaW5nIGBhbmRyb2lkOiJwYXRoImAKLQlBaWRsUm9vdCAgICAgICAgICAgICAgc3RyaW5nICAgLy8gYmFzZSBkaXJlY3RvcnkgZm9yIHRoZSBpbnB1dCBhaWRsIGZpbGUKLQlJc1RvVCAgICAgICAgICAgICAgICAgYm9vbAotCUltcG9ydHNXaXRob3V0VmVyc2lvbiBbXXN0cmluZwotCVN0YWJpbGl0eSAgICAgICAgICAgICAqc3RyaW5nCi0JTGFuZyAgICAgICAgICAgICAgICAgIHN0cmluZyAvLyB0YXJnZXQgbGFuZ3VhZ2UgW2phdmF8Y3BwfG5ka3xydXN0XQotCUJhc2VOYW1lICAgICAgICAgICAgICBzdHJpbmcKLQlHZW5Mb2cgICAgICAgICAgICAgICAgYm9vbAotCVZlcnNpb24gICAgICAgICAgICAgICBzdHJpbmcKLQlHZW5UcmFjZSAgICAgICAgICAgICAgYm9vbAotCVVuc3RhYmxlICAgICAgICAgICAgICAqYm9vbAotCVZpc2liaWxpdHkgICAgICAgICAgICBbXXN0cmluZwotCUZsYWdzICAgICAgICAgICAgICAgICBbXXN0cmluZworCVNyY3MgICAgICAgICAgICBbXXN0cmluZyBgYW5kcm9pZDoicGF0aCJgCisJQWlkbFJvb3QgICAgICAgIHN0cmluZyAgIC8vIGJhc2UgZGlyZWN0b3J5IGZvciB0aGUgaW5wdXQgYWlkbCBmaWxlCisJSW1wb3J0cyAgICAgICAgIFtdc3RyaW5nCisJU3RhYmlsaXR5ICAgICAgICpzdHJpbmcKKwlNaW5fc2RrX3ZlcnNpb24gKnN0cmluZworCVBsYXRmb3JtX2FwaXMgICBib29sCisJTGFuZyAgICAgICAgICAgIHN0cmluZyAvLyB0YXJnZXQgbGFuZ3VhZ2UgW2phdmF8Y3BwfG5ka3xydXN0XQorCUJhc2VOYW1lICAgICAgICBzdHJpbmcKKwlHZW5Mb2cgICAgICAgICAgYm9vbAorCVZlcnNpb24gICAgICAgICBzdHJpbmcKKwlHZW5ScGMgICAgICAgICAgYm9vbAorCUdlblRyYWNlICAgICAgICBib29sCisJVW5zdGFibGUgICAgICAgICpib29sCisJTm90RnJvemVuICAgICAgIGJvb2wKKwlWaXNpYmlsaXR5ICAgICAgW11zdHJpbmcKKwlGbGFncyAgICAgICAgICAgW11zdHJpbmcKIH0KIAogdHlwZSBhaWRsR2VuUnVsZSBzdHJ1Y3QgewpAQCAtODMsMTAgKzg2LDExIEBACiAKIAlwcm9wZXJ0aWVzIGFpZGxHZW5Qcm9wZXJ0aWVzCiAKKwlkZXBzICAgICAgICAgICBkZXBzCiAJaW1wbGljaXRJbnB1dHMgYW5kcm9pZC5QYXRocwogCWltcG9ydEZsYWdzICAgIHN0cmluZwogCi0JLy8gVE9ETyhiLzE0OTk1MjEzMSk6IGFsd2F5cyBoYXZlIGEgaGFzaCBmaWxlCisJLy8gQSBmcm96ZW4gYWlkbF9pbnRlcmZhY2UgYWx3YXlzIGhhdmUgYSBoYXNoIGZpbGUKIAloYXNoRmlsZSBhbmRyb2lkLlBhdGgKIAogCWdlbk91dERpciAgICAgYW5kcm9pZC5Nb2R1bGVHZW5QYXRoCkBAIC05OCw2ICsxMDIsMTUgQEAKIHZhciBfIGFuZHJvaWQuU291cmNlRmlsZVByb2R1Y2VyID0gKCphaWRsR2VuUnVsZSkobmlsKQogdmFyIF8gZ2VucnVsZS5Tb3VyY2VGaWxlR2VuZXJhdG9yID0gKCphaWRsR2VuUnVsZSkobmlsKQogCitmdW5jIChnICphaWRsR2VuUnVsZSkgYWlkbEludGVyZmFjZShjdHggYW5kcm9pZC5CYXNlTW9kdWxlQ29udGV4dCkgKmFpZGxJbnRlcmZhY2UgeworCXJldHVybiBjdHguR2V0RGlyZWN0RGVwV2l0aFRhZyhnLnByb3BlcnRpZXMuQmFzZU5hbWUsIGludGVyZmFjZURlcCkuKCphaWRsSW50ZXJmYWNlKQorfQorCitmdW5jIChnICphaWRsR2VuUnVsZSkgZ2V0SW1wb3J0cyhjdHggYW5kcm9pZC5Nb2R1bGVDb250ZXh0KSBtYXBbc3RyaW5nXXN0cmluZyB7CisJaWZhY2UgOj0gZy5haWRsSW50ZXJmYWNlKGN0eCkKKwlyZXR1cm4gaWZhY2UuZ2V0SW1wb3J0cyhnLnByb3BlcnRpZXMuVmVyc2lvbikKK30KKwogZnVuYyAoZyAqYWlkbEdlblJ1bGUpIEdlbmVyYXRlQW5kcm9pZEJ1aWxkQWN0aW9ucyhjdHggYW5kcm9pZC5Nb2R1bGVDb250ZXh0KSB7CiAJc3JjcywgaW1wb3J0cyA6PSBnZXRQYXRocyhjdHgsIGcucHJvcGVydGllcy5TcmNzLCBnLnByb3BlcnRpZXMuQWlkbFJvb3QpCiAKQEAgLTEwNSwxMiArMTE4LDE0IEBACiAJCXJldHVybgogCX0KIAorCWcuZGVwcyA9IGdldERlcHMoY3R4LCBnLmdldEltcG9ydHMoY3R4KSkKKwogCWdlbkRpclRpbWVzdGFtcCA6PSBhbmRyb2lkLlBhdGhGb3JNb2R1bGVHZW4oY3R4LCAidGltZXN0YW1wIikgLy8gJG91dC9nZW4vdGltZXN0YW1wCiAJZy5pbXBsaWNpdElucHV0cyA9IGFwcGVuZChnLmltcGxpY2l0SW5wdXRzLCBnZW5EaXJUaW1lc3RhbXApCisJZy5pbXBsaWNpdElucHV0cyA9IGFwcGVuZChnLmltcGxpY2l0SW5wdXRzLCBnLmRlcHMuaW1wbGljaXRzLi4uKQorCWcuaW1wbGljaXRJbnB1dHMgPSBhcHBlbmQoZy5pbXBsaWNpdElucHV0cywgZy5kZXBzLnByZXByb2Nlc3NlZC4uLikKIAotCWltcG9ydFBhdGhzLCBpbXBsaWNpdHMgOj0gZ2V0SW1wb3J0c0Zyb21EZXBzKGN0eCwgZy5wcm9wZXJ0aWVzLklzVG9UKQotCWltcG9ydHMgPSBhcHBlbmQoaW1wb3J0cywgaW1wb3J0UGF0aHMuLi4pCi0KKwlpbXBvcnRzID0gYXBwZW5kKGltcG9ydHMsIGcuZGVwcy5pbXBvcnRzLi4uKQogCWcuaW1wb3J0RmxhZ3MgPSBzdHJpbmdzLkpvaW4od3JhcCgiLUkiLCBpbXBvcnRzLCAiIiksICIgIikKIAogCWcuZ2VuT3V0RGlyID0gYW5kcm9pZC5QYXRoRm9yTW9kdWxlR2VuKGN0eCkKQEAgLTEyMywxMCArMTM4LDkgQEAKIAogCS8vIFRoaXMgaXMgdG8gY2xlYW4gZ2VuT3V0RGlyIGJlZm9yZSBnZW5lcmF0aW5nIGFueSBmaWxlCiAJY3R4LkJ1aWxkKHBjdHgsIGFuZHJvaWQuQnVpbGRQYXJhbXN7Ci0JCVJ1bGU6ICAgICAgYWlkbERpclByZXBhcmVSdWxlLAotCQlJbXBsaWNpdHM6IGltcGxpY2l0cywKLQkJSW5wdXRzOiAgICBzcmNzLAotCQlPdXRwdXQ6ICAgIGdlbkRpclRpbWVzdGFtcCwKKwkJUnVsZTogICBhaWRsRGlyUHJlcGFyZVJ1bGUsCisJCUlucHV0czogc3JjcywKKwkJT3V0cHV0OiBnZW5EaXJUaW1lc3RhbXAsCiAJCUFyZ3M6IG1hcFtzdHJpbmddc3RyaW5newogCQkJIm91dERpciI6IGcuZ2VuT3V0RGlyLlN0cmluZygpLAogCQl9LApAQCAtMTQxLDcgKzE1NSw4IEBACiB9CiAKIGZ1bmMgKGcgKmFpZGxHZW5SdWxlKSBnZW5lcmF0ZUJ1aWxkQWN0aW9uc0ZvclNpbmdsZUFpZGwoY3R4IGFuZHJvaWQuTW9kdWxlQ29udGV4dCwgc3JjIGFuZHJvaWQuUGF0aCkgKGFuZHJvaWQuV3JpdGFibGVQYXRoLCBhbmRyb2lkLlBhdGhzKSB7Ci0JYmFzZURpciA6PSBnZXRCYXNlRGlyKGN0eCwgc3JjLCBhbmRyb2lkLlBhdGhGb3JNb2R1bGVTcmMoY3R4LCBnLnByb3BlcnRpZXMuQWlkbFJvb3QpKQorCXJlbFBhdGggOj0gc3JjLlJlbCgpCisJYmFzZURpciA6PSBzdHJpbmdzLlRyaW1TdWZmaXgoc3RyaW5ncy5UcmltU3VmZml4KHNyYy5TdHJpbmcoKSwgcmVsUGF0aCksICIvIikKIAogCXZhciBleHQgc3RyaW5nCiAJaWYgZy5wcm9wZXJ0aWVzLkxhbmcgPT0gbGFuZ0phdmEgewpAQCAtMTUxLDcgKzE2Niw2IEBACiAJfSBlbHNlIHsKIAkJZXh0ID0gImNwcCIKIAl9Ci0JcmVsUGF0aCwgXyA6PSBmaWxlcGF0aC5SZWwoYmFzZURpciwgc3JjLlN0cmluZygpKQogCW91dEZpbGUgOj0gYW5kcm9pZC5QYXRoRm9yTW9kdWxlR2VuKGN0eCwgcGF0aHRvb2xzLlJlcGxhY2VFeHRlbnNpb24ocmVsUGF0aCwgZXh0KSkKIAlpbXBsaWNpdHMgOj0gZy5pbXBsaWNpdElucHV0cwogCkBAIC0xNjAsMTAgKzE3NCwxMCBAQAogCQlvcHRpb25hbEZsYWdzID0gYXBwZW5kKG9wdGlvbmFsRmxhZ3MsICItLXZlcnNpb24gIitnLnByb3BlcnRpZXMuVmVyc2lvbikKIAogCQloYXNoIDo9ICJub3Rmcm96ZW4iCi0JCWlmICFzdHJpbmdzLkhhc1ByZWZpeChiYXNlRGlyLCBjdHguQ29uZmlnKCkuQnVpbGREaXIoKSkgeworCQlpZiAhc3RyaW5ncy5IYXNQcmVmaXgoYmFzZURpciwgY3R4LkNvbmZpZygpLlNvb25nT3V0RGlyKCkpIHsKIAkJCWhhc2hGaWxlIDo9IGFuZHJvaWQuRXhpc3RlbnRQYXRoRm9yU291cmNlKGN0eCwgYmFzZURpciwgIi5oYXNoIikKIAkJCWlmIGhhc2hGaWxlLlZhbGlkKCkgewotCQkJCWhhc2ggPSAiJCQocmVhZCAtciA8IiArIGhhc2hGaWxlLlBhdGgoKS5TdHJpbmcoKSArICIgaGFzaCBleHRyYTsgcHJpbnRmICclcycgXCIkJGhhc2hcIikiCisJCQkJaGFzaCA9ICIkJCh0YWlsIC0xICciICsgaGFzaEZpbGUuUGF0aCgpLlN0cmluZygpICsgIicpIgogCQkJCWltcGxpY2l0cyA9IGFwcGVuZChpbXBsaWNpdHMsIGhhc2hGaWxlLlBhdGgoKSkKIAogCQkJCWcuaGFzaEZpbGUgPSBoYXNoRmlsZS5QYXRoKCkKQEAgLTE3MSwxMiArMTg1LDIyIEBACiAJCX0KIAkJb3B0aW9uYWxGbGFncyA9IGFwcGVuZChvcHRpb25hbEZsYWdzLCAiLS1oYXNoICIraGFzaCkKIAl9CisJaWYgZy5wcm9wZXJ0aWVzLkdlblJwYyB7CisJCW9wdGlvbmFsRmxhZ3MgPSBhcHBlbmQob3B0aW9uYWxGbGFncywgIi0tcnBjIikKKwl9CiAJaWYgZy5wcm9wZXJ0aWVzLkdlblRyYWNlIHsKIAkJb3B0aW9uYWxGbGFncyA9IGFwcGVuZChvcHRpb25hbEZsYWdzLCAiLXQiKQogCX0KIAlpZiBnLnByb3BlcnRpZXMuU3RhYmlsaXR5ICE9IG5pbCB7CiAJCW9wdGlvbmFsRmxhZ3MgPSBhcHBlbmQob3B0aW9uYWxGbGFncywgIi0tc3RhYmlsaXR5IiwgKmcucHJvcGVydGllcy5TdGFiaWxpdHkpCiAJfQorCWlmIGcucHJvcGVydGllcy5QbGF0Zm9ybV9hcGlzIHsKKwkJb3B0aW9uYWxGbGFncyA9IGFwcGVuZChvcHRpb25hbEZsYWdzLCAiLS1taW5fc2RrX3ZlcnNpb24gcGxhdGZvcm1fYXBpcyIpCisJfSBlbHNlIHsKKwkJbWluU2RrVmVyIDo9IHByb3B0b29scy5TdHJpbmdEZWZhdWx0KGcucHJvcGVydGllcy5NaW5fc2RrX3ZlcnNpb24sICJjdXJyZW50IikKKwkJb3B0aW9uYWxGbGFncyA9IGFwcGVuZChvcHRpb25hbEZsYWdzLCAiLS1taW5fc2RrX3ZlcnNpb24gIittaW5TZGtWZXIpCisJfQorCW9wdGlvbmFsRmxhZ3MgPSBhcHBlbmQob3B0aW9uYWxGbGFncywgd3JhcCgiLXAiLCBnLmRlcHMucHJlcHJvY2Vzc2VkLlN0cmluZ3MoKSwgIiIpLi4uKQogCiAJdmFyIGhlYWRlcnMgYW5kcm9pZC5Xcml0YWJsZVBhdGhzCiAJaWYgZy5wcm9wZXJ0aWVzLkxhbmcgPT0gbGFuZ0phdmEgewpAQCAtMjcyLDE3ICsyOTYsNiBAQAogfQogCiBmdW5jIChnICphaWRsR2VuUnVsZSkgRGVwc011dGF0b3IoY3R4IGFuZHJvaWQuQm90dG9tVXBNdXRhdG9yQ29udGV4dCkgewotCS8vIG9yaWdpbmFsIGludGVyZmFjZQotCWN0eC5BZGREZXBlbmRlbmN5KGN0eC5Nb2R1bGUoKSwgaW50ZXJmYWNlRGVwLCBnLnByb3BlcnRpZXMuQmFzZU5hbWUrYWlkbEludGVyZmFjZVN1ZmZpeCkKLQotCWlmICFwcm9wdG9vbHMuQm9vbChnLnByb3BlcnRpZXMuVW5zdGFibGUpIHsKLQkJLy8gZm9yIGNoZWNrYXBpIHRpbWVzdGFtcHMKLQkJY3R4LkFkZERlcGVuZGVuY3koY3R4Lk1vZHVsZSgpLCBhcGlEZXAsIGcucHJvcGVydGllcy5CYXNlTmFtZSthaWRsQXBpU3VmZml4KQotCX0KLQotCS8vIGltcG9ydGVkIGludGVyZmFjZXMKLQljdHguQWRkRGVwZW5kZW5jeShjdHguTW9kdWxlKCksIGltcG9ydEludGVyZmFjZURlcCwgd3JhcCgiIiwgZy5wcm9wZXJ0aWVzLkltcG9ydHNXaXRob3V0VmVyc2lvbiwgYWlkbEludGVyZmFjZVN1ZmZpeCkuLi4pCi0KIAljdHguQWRkUmV2ZXJzZURlcGVuZGVuY3koY3R4Lk1vZHVsZSgpLCBuaWwsIGFpZGxNZXRhZGF0YVNpbmdsZXRvbk5hbWUpCiB9CiAKZGlmZiAtLWdpdCBhL2J1aWxkL2FpZGxfaW50ZXJmYWNlLmdvIGIvYnVpbGQvYWlkbF9pbnRlcmZhY2UuZ28KaW5kZXggN2JlMTJlOC4uMzY1MjdlNCAxMDA2NDQKLS0tIGEvYnVpbGQvYWlkbF9pbnRlcmZhY2UuZ28KKysrIGIvYnVpbGQvYWlkbF9pbnRlcmZhY2UuZ28KQEAgLTI3LDggKzI3LDggQEAKIAkic29ydCIKIAkic3RyY29udiIKIAkic3RyaW5ncyIKLQkic3luYyIKIAorCSJnaXRodWIuY29tL2dvb2dsZS9ibHVlcHJpbnQiCiAJImdpdGh1Yi5jb20vZ29vZ2xlL2JsdWVwcmludC9wcm9wdG9vbHMiCiApCiAKQEAgLTU1LDEyOCArNTUsMTEzIEBACiBmdW5jIGluaXQoKSB7CiAJcGN0eC5JbXBvcnQoImFuZHJvaWQvc29vbmcvYW5kcm9pZCIpCiAJcGN0eC5Ib3N0QmluVG9vbFZhcmlhYmxlKCJhaWRsQ21kIiwgImFpZGwiKQorCXBjdHguSG9zdEJpblRvb2xWYXJpYWJsZSgiYWlkbEhhc2hHZW4iLCAiYWlkbF9oYXNoX2dlbiIpCiAJcGN0eC5Tb3VyY2VQYXRoVmFyaWFibGUoImFpZGxUb0puaUNtZCIsICJzeXN0ZW0vdG9vbHMvYWlkbC9idWlsZC9haWRsX3RvX2puaS5weSIpCiAJcGN0eC5Tb3VyY2VQYXRoVmFyaWFibGUoImFpZGxSdXN0R2x1ZUNtZCIsICJzeXN0ZW0vdG9vbHMvYWlkbC9idWlsZC9haWRsX3J1c3RfZ2x1ZS5weSIpCiAJYW5kcm9pZC5SZWdpc3Rlck1vZHVsZVR5cGUoImFpZGxfaW50ZXJmYWNlIiwgYWlkbEludGVyZmFjZUZhY3RvcnkpCi0JYW5kcm9pZC5QcmVBcmNoTXV0YXRvcnMocmVnaXN0ZXJQcmVEZXBzTXV0YXRvcnMpCi0JYW5kcm9pZC5QcmVBcmNoQnAyQnVpbGRNdXRhdG9ycyhyZWdpc3RlclByZURlcHNNdXRhdG9ycykKLQlhbmRyb2lkLlBvc3REZXBzTXV0YXRvcnMoZnVuYyhjdHggYW5kcm9pZC5SZWdpc3Rlck11dGF0b3JzQ29udGV4dCkgewotCQljdHguQm90dG9tVXAoImNoZWNrVW5zdGFibGVNb2R1bGUiLCBjaGVja1Vuc3RhYmxlTW9kdWxlTXV0YXRvcikuUGFyYWxsZWwoKQotCQljdHguQm90dG9tVXAoInJlY29yZFZlcnNpb25zIiwgcmVjb3JkVmVyc2lvbnMpLlBhcmFsbGVsKCkKLQkJY3R4LkJvdHRvbVVwKCJjaGVja0R1cGxpY2F0ZWRWZXJzaW9ucyIsIGNoZWNrRHVwbGljYXRlZFZlcnNpb25zKS5QYXJhbGxlbCgpCi0JfSkKKwlhbmRyb2lkLlByZUFyY2hNdXRhdG9ycyhyZWdpc3RlclByZUFyY2hNdXRhdG9ycykKKwlhbmRyb2lkLlByZUFyY2hCcDJCdWlsZE11dGF0b3JzKHJlZ2lzdGVyUHJlQXJjaE11dGF0b3JzKQorCWFuZHJvaWQuUG9zdERlcHNNdXRhdG9ycyhyZWdpc3RlclBvc3REZXBzTXV0YXRvcnMpCiB9CiAKLWZ1bmMgcmVnaXN0ZXJQcmVEZXBzTXV0YXRvcnMoY3R4IGFuZHJvaWQuUmVnaXN0ZXJNdXRhdG9yc0NvbnRleHQpIHsKK2Z1bmMgcmVnaXN0ZXJQcmVBcmNoTXV0YXRvcnMoY3R4IGFuZHJvaWQuUmVnaXN0ZXJNdXRhdG9yc0NvbnRleHQpIHsKKwljdHguQm90dG9tVXAoImFkZEludGVyZmFjZURlcHMiLCBhZGRJbnRlcmZhY2VEZXBzKS5QYXJhbGxlbCgpCiAJY3R4LkJvdHRvbVVwKCJjaGVja0ltcG9ydHMiLCBjaGVja0ltcG9ydHMpLlBhcmFsbGVsKCkKIAljdHguVG9wRG93bigiY3JlYXRlQWlkbEludGVyZmFjZSIsIGNyZWF0ZUFpZGxJbnRlcmZhY2VNdXRhdG9yKS5QYXJhbGxlbCgpCiB9CiAKK2Z1bmMgcmVnaXN0ZXJQb3N0RGVwc011dGF0b3JzKGN0eCBhbmRyb2lkLlJlZ2lzdGVyTXV0YXRvcnNDb250ZXh0KSB7CisJY3R4LkJvdHRvbVVwKCJjaGVja0FpZGxHZW5lcmF0ZWRNb2R1bGVzIiwgY2hlY2tBaWRsR2VuZXJhdGVkTW9kdWxlcykuUGFyYWxsZWwoKQorfQorCiBmdW5jIGNyZWF0ZUFpZGxJbnRlcmZhY2VNdXRhdG9yKG1jdHggYW5kcm9pZC5Ub3BEb3duTXV0YXRvckNvbnRleHQpIHsKIAlpZiBnLCBvayA6PSBtY3R4Lk1vZHVsZSgpLigqYWlkbEltcGxlbWVudGF0aW9uR2VuZXJhdG9yKTsgb2sgewogCQlnLkdlbmVyYXRlSW1wbGVtZW50YXRpb24obWN0eCkKIAl9CiB9CiAKLWZ1bmMgY2hlY2tVbnN0YWJsZU1vZHVsZU11dGF0b3IobWN0eCBhbmRyb2lkLkJvdHRvbVVwTXV0YXRvckNvbnRleHQpIHsKLQkvLyBJZiBpdCBpcyBhbiBhaWRsIGludGVyZmFjZSwgd2UgZG9uJ3QgbmVlZCB0byBjaGVjayBpdHMgZGVwZW5kZW5jaWVzLgotCWlmIGlzQWlkbE1vZHVsZShtY3R4Lk1vZHVsZU5hbWUoKSwgbWN0eC5Db25maWcoKSkgewotCQlyZXR1cm4KLQl9Ci0JbWN0eC5WaXNpdERpcmVjdERlcHNJZihmdW5jKG0gYW5kcm9pZC5Nb2R1bGUpIGJvb2wgewotCQlyZXR1cm4gYW5kcm9pZC5Jbkxpc3QobS5OYW1lKCksICp1bnN0YWJsZU1vZHVsZXMobWN0eC5Db25maWcoKSkpCi0JfSwgZnVuYyhtIGFuZHJvaWQuTW9kdWxlKSB7Ci0JCWlmIG1jdHguTW9kdWxlTmFtZSgpID09IG0uTmFtZSgpIHsKLQkJCXJldHVybgotCQl9Ci0JCS8vIFRPRE8oYi8xNTQwNjY2ODYpOiBSZXBsYWNlIGl0IHdpdGggYSBjb21tb24gbWV0aG9kIGluc3RlYWQgb2YgbGlzdGluZyB1cCBtb2R1bGUgdHlwZXMuCi0JCS8vIFRlc3QgbGlicmFyaWVzIGFyZSBleGVtcHRlZC4KLQkJaWYgYW5kcm9pZC5Jbkxpc3QobWN0eC5Nb2R1bGVUeXBlKCksIFtdc3RyaW5neyJjY190ZXN0X2xpYnJhcnkiLCAiYW5kcm9pZF90ZXN0IiwgImNjX2JlbmNobWFyayIsICJjY190ZXN0In0pIHsKLQkJCXJldHVybgotCQl9CisvLyBBIG1hcmtlciBzdHJ1Y3QgZm9yIEFJREwtZ2VuZXJhdGVkIGxpYnJhcnkgbW9kdWxlcwordHlwZSBBaWRsR2VuZXJhdGVkTW9kdWxlUHJvcGVydGllcyBzdHJ1Y3R7fQogCi0JCW1jdHguTW9kdWxlRXJyb3JmKG0uTmFtZSgpICsgIiBpcyBkaXNhbGxvd2VkIGluIHJlbGVhc2UgdmVyc2lvbiBiZWNhdXNlIGl0IGlzIHVuc3RhYmxlLCBhbmQgaXRzIFwib3duZXJcIiBwcm9wZXJ0eSBpcyBtaXNzaW5nLiIpCi0JfSkKK2Z1bmMgd3JhcExpYnJhcnlGYWN0b3J5KGZhY3RvcnkgZnVuYygpIGFuZHJvaWQuTW9kdWxlKSBmdW5jKCkgYW5kcm9pZC5Nb2R1bGUgeworCXJldHVybiBmdW5jKCkgYW5kcm9pZC5Nb2R1bGUgeworCQltIDo9IGZhY3RvcnkoKQorCQkvLyBwdXQgYSBtYXJrZXIgc3RydWN0IGZvciBBSURMLWdlbmVyYXRlZCBtb2R1bGVzCisJCW0uQWRkUHJvcGVydGllcygmQWlkbEdlbmVyYXRlZE1vZHVsZVByb3BlcnRpZXN7fSkKKwkJcmV0dXJuIG0KKwl9CiB9CiAKLWZ1bmMgaXNBaWRsTW9kdWxlKG1vZHVsZU5hbWUgc3RyaW5nLCBjb25maWcgYW5kcm9pZC5Db25maWcpIGJvb2wgewotCWZvciBfLCBpIDo9IHJhbmdlICphaWRsSW50ZXJmYWNlcyhjb25maWcpIHsKLQkJaWYgYW5kcm9pZC5Jbkxpc3QobW9kdWxlTmFtZSwgaS5pbnRlcm5hbE1vZHVsZU5hbWVzKSB7CitmdW5jIGlzQWlkbEdlbmVyYXRlZE1vZHVsZShtb2R1bGUgYW5kcm9pZC5Nb2R1bGUpIGJvb2wgeworCWZvciBfLCBwcm9wcyA6PSByYW5nZSBtb2R1bGUuR2V0UHJvcGVydGllcygpIHsKKwkJLy8gY2hlY2sgaWYgdGhlcmUncyBhIG1hcmtlciBzdHJ1Y3QKKwkJaWYgXywgb2sgOj0gcHJvcHMuKCpBaWRsR2VuZXJhdGVkTW9kdWxlUHJvcGVydGllcyk7IG9rIHsKIAkJCXJldHVybiB0cnVlCiAJCX0KIAl9CiAJcmV0dXJuIGZhbHNlCiB9CiAKLWZ1bmMgcmVjb3JkVmVyc2lvbnMobWN0eCBhbmRyb2lkLkJvdHRvbVVwTXV0YXRvckNvbnRleHQpIHsKLQlzd2l0Y2ggbWN0eC5Nb2R1bGUoKS4odHlwZSkgewotCWNhc2UgKmphdmEuTGlicmFyeToKLQljYXNlICpjYy5Nb2R1bGU6Ci0JY2FzZSAqcnVzdC5Nb2R1bGU6Ci0JY2FzZSAqYWlkbEdlblJ1bGU6Ci0JZGVmYXVsdDoKLQkJcmV0dXJuCi0JfQotCi0JaXNBaWRsTW9kdWxlIDo9IGlzQWlkbE1vZHVsZShtY3R4Lk1vZHVsZU5hbWUoKSwgbWN0eC5Db25maWcoKSkKLQotCS8vIEZpcnN0LCBnYXRoZXIgYWxsIHRoZSBBSURMIGludGVyZmFjZXMgbW9kdWxlcyB0aGF0IGFyZSBkaXJlY3RseSBvciBpbmRpcmVjdGx5Ci0JLy8gZGVwZW5kZWQgb24gYnkgdGhpcyBtb2R1bGUKLQlteUFpZGxEZXBzIDo9IG1ha2UobWFwW0RlcEluZm9dYm9vbCkKLQltY3R4LlZpc2l0RGlyZWN0RGVwcyhmdW5jKGRlcCBhbmRyb2lkLk1vZHVsZSkgewotCQlzd2l0Y2ggZGVwLih0eXBlKSB7Ci0JCWNhc2UgKmphdmEuTGlicmFyeToKLQkJY2FzZSAqY2MuTW9kdWxlOgotCQljYXNlICpydXN0Lk1vZHVsZToKLQkJY2FzZSAqYWlkbEdlblJ1bGU6Ci0JCQkvLyBEZXBlbmRlbmNpZXMgdG8gdGhlIHNvdXJjZSBtb2R1bGUgaXMgdHJhY2tlZCBvbmx5IHdoZW4gaXQncyBmcm9tIGEgY2xpZW50Ci0JCQkvLyBtb2R1bGUsIGkuZS4gbm90IGZyb20gYW4gQUlETC1nZW5lcmF0ZWQgc3R1YiBsaWJyYXJ5Ci0JCQlpZiBpc0FpZGxNb2R1bGUgewotCQkJCXJldHVybgotCQkJfQotCQlkZWZhdWx0OgotCQkJcmV0dXJuCi0JCX0KLQkJZGVwTmFtZSA6PSBtY3R4Lk90aGVyTW9kdWxlTmFtZShkZXApCi0JCWlzU291cmNlIDo9IHN0cmluZ3MuSGFzU3VmZml4KGRlcE5hbWUsICItc291cmNlIikKLQkJZGVwTmFtZSA9IHN0cmluZ3MuVHJpbVN1ZmZpeChkZXBOYW1lLCAiLXNvdXJjZSIpCi0JCS8vIElmIHRoaXMgbW9kdWxlIGRlcGVuZHMgb24gb25lIG9mIHRoZSBhaWRsIGludGVyZmFjZSBtb2R1bGUsIHJlY29yZCBpdAotCQlmb3IgXywgaSA6PSByYW5nZSAqYWlkbEludGVyZmFjZXMobWN0eC5Db25maWcoKSkgewotCQkJaWYgYW5kcm9pZC5Jbkxpc3QoZGVwTmFtZSwgaS5pbnRlcm5hbE1vZHVsZU5hbWVzKSB7Ci0JCQkJaWZhY2VOYW1lIDo9IGkuTW9kdWxlQmFzZS5OYW1lKCkKLQkJCQl2ZXJMYW5nIDo9IGRlcE5hbWVbbGVuKGlmYWNlTmFtZSk6XQotCQkJCW15QWlkbERlcHNbRGVwSW5mb3tpZmFjZU5hbWUsIHZlckxhbmcsIGlzU291cmNlfV0gPSB0cnVlCi0JCQkJYnJlYWsKLQkJCX0KLQkJfQotCQkvLyBJZiBkZXAgaXMgaW4gYWlkbERlcHMsIHRoYXQgbWVhbnMgZGVwIGhhcyBkaXJlY3Qgb3IgaW5kaXJlY3QgZGVwZW5kZW5jaWVzIHRvIEFJREwgaW50ZXJmYWNlcwotCQkvLyBUaGF0IGJlY29tZXMgdGhpcyBtb2R1bGUncyBhaWRsRGVwcyBhcyB3ZWxsCi0JCWFpZGxEZXBzTXV0ZXguUkxvY2soKQotCQlpZiBkZXBzT2ZEZXAsIG9rIDo9IGFpZGxEZXBzKG1jdHguQ29uZmlnKCkpW2RlcF07IG9rIHsKLQkJCWZvciBfLCBkIDo9IHJhbmdlIGRlcHNPZkRlcCB7Ci0JCQkJbXlBaWRsRGVwc1tkXSA9IHRydWUKLQkJCX0KLQkJfQotCQlhaWRsRGVwc011dGV4LlJVbmxvY2soKQotCX0pCi0KLQlpZiBsZW4obXlBaWRsRGVwcykgPT0gMCB7Ci0JCS8vIFRoaXMgc2hvdWxkIGJlIHVzdWFsIGNhc2UuCi0JCXJldHVybgotCX0KLQotCS8vIFRoZW4sIHJlY29yZCB0aGUgYWlkbCBkZXBzIG9mIHRoaXMgbW9kdWxlIHRvIHRoZSBnbG9iYWwgbWFwIHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgYnkKLQkvLyBuZXh0IHJ1bnMgb2YgdGhpcyBtdXRhdG9yIGZvciB0aGUgbW9kdWxlcyB0aGF0IGRlcGVuZCBvbiB0aGlzIG1vZHVsZS4KLQl2YXIgbGlzdCBbXURlcEluZm8KLQlmb3IgZCA6PSByYW5nZSBteUFpZGxEZXBzIHsKLQkJbGlzdCA9IGFwcGVuZChsaXN0LCBkKQotCX0KLQlhaWRsRGVwc011dGV4LkxvY2soKQotCWFpZGxEZXBzKG1jdHguQ29uZmlnKCkpW21jdHguTW9kdWxlKCldID0gbGlzdAotCWFpZGxEZXBzTXV0ZXguVW5sb2NrKCkKKy8vIEFpbGRWZXJzaW9uSW5mbyBrZWVwcyB0aGUgKi1zb3VyY2UgbW9kdWxlIGZvciBlYWNoIChhaWRsX2ludGVyZmFjZSAmIGxhbmcpIGFuZCB0aGUgbGlzdCBvZgorLy8gbm90LWZyb3plbiB2ZXJzaW9ucyAod2hpY2ggc2hvdWxkbid0IGJlIHVzZWQgYnkgb3RoZXIgbW9kdWxlcykKK3R5cGUgQWlsZFZlcnNpb25JbmZvIHN0cnVjdCB7CisJbm90RnJvemVuIFtdc3RyaW5nCisJc291cmNlTWFwIG1hcFtzdHJpbmddc3RyaW5nCiB9CiAKLWZ1bmMgY2hlY2tEdXBsaWNhdGVkVmVyc2lvbnMobWN0eCBhbmRyb2lkLkJvdHRvbVVwTXV0YXRvckNvbnRleHQpIHsKK3ZhciBBaWRsVmVyc2lvbkluZm9Qcm92aWRlciA9IGJsdWVwcmludC5OZXdNdXRhdG9yUHJvdmlkZXIoQWlsZFZlcnNpb25JbmZve30sICJjaGVja0FpZGxHZW5lcmF0ZWRNb2R1bGVzIikKKworLy8gTWVyZ2VzIGBvdGhlcmAgdmVyc2lvbiBpbmZvIGludG8gdGhpcyBvbmUuCisvLyBSZXR1cm5zIHRoZSBwYWlyIG9mIG1pc21hdGNoaW5nIHZlcnNpb25zIHdoZW4gdGhlcmUncyBjb25mbGljdC4gT3RoZXJ3aXNlIHJldHVybnMgbmlsLgorLy8gRm9yIGV4YW1wbGUsIHdoZW4gYSBtb2R1bGUgZGVwZW5kcyBvbiAnZm9vLVYyLW5kaycsIHRoZSBtYXAgY29udGFpbnMgYW4gZW50cnkgb2YgKGZvbywgZm9vLVYyLW5kay1zb3VyY2UpLgorLy8gTWVyZ2luZyAoZm9vLCBmb28tVjEtbmRrLXNvdXJjZSkgYW5kIChmb28sIGZvby1WMi1uZGstc291cmNlKSB3aWxsIGZhaWwgYW5kIHJldHVybnMKKy8vIHtmb28tVjEtbmRrLXNvdXJjZSwgZm9vLVYyLW5kay1zb3VyY2V9LgorZnVuYyAoaW5mbyAqQWlsZFZlcnNpb25JbmZvKSBtZXJnZShvdGhlciBBaWxkVmVyc2lvbkluZm8pIFtdc3RyaW5nIHsKKwlpbmZvLm5vdEZyb3plbiA9IGFwcGVuZChpbmZvLm5vdEZyb3plbiwgb3RoZXIubm90RnJvemVuLi4uKQorCisJaWYgb3RoZXIuc291cmNlTWFwID09IG5pbCB7CisJCXJldHVybiBuaWwKKwl9CisJaWYgaW5mby5zb3VyY2VNYXAgPT0gbmlsIHsKKwkJaW5mby5zb3VyY2VNYXAgPSBtYWtlKG1hcFtzdHJpbmddc3RyaW5nKQorCX0KKwlmb3IgaWZhY2VOYW1lLCBvdGhlclNvdXJjZU5hbWUgOj0gcmFuZ2Ugb3RoZXIuc291cmNlTWFwIHsKKwkJaWYgc291cmNlTmFtZSwgb2sgOj0gaW5mby5zb3VyY2VNYXBbaWZhY2VOYW1lXTsgb2sgeworCQkJaWYgc291cmNlTmFtZSAhPSBvdGhlclNvdXJjZU5hbWUgeworCQkJCXJldHVybiBbXXN0cmluZ3tzb3VyY2VOYW1lLCBvdGhlclNvdXJjZU5hbWV9CisJCQl9CisJCX0gZWxzZSB7CisJCQlpbmZvLnNvdXJjZU1hcFtpZmFjZU5hbWVdID0gb3RoZXJTb3VyY2VOYW1lCisJCX0KKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIHJlcG9ydFVzaW5nTm90RnJvemVuRXJyb3IoY3R4IGFuZHJvaWQuQmFzZU1vZHVsZUNvbnRleHQsIG5vdEZyb3plbiBbXXN0cmluZykgeworCS8vIFRPRE8oYi8xNTQwNjY2ODYpOiBSZXBsYWNlIGl0IHdpdGggYSBjb21tb24gbWV0aG9kIGluc3RlYWQgb2YgbGlzdGluZyB1cCBtb2R1bGUgdHlwZXMuCisJLy8gVGVzdCBsaWJyYXJpZXMgYXJlIGV4ZW1wdGVkLgorCWlmIGFuZHJvaWQuSW5MaXN0KGN0eC5Nb2R1bGVUeXBlKCksIFtdc3RyaW5neyJjY190ZXN0X2xpYnJhcnkiLCAiYW5kcm9pZF90ZXN0IiwgImNjX2JlbmNobWFyayIsICJjY190ZXN0In0pIHsKKwkJcmV0dXJuCisJfQorCWZvciBfLCBuYW1lIDo9IHJhbmdlIG5vdEZyb3plbiB7CisJCWN0eC5Nb2R1bGVFcnJvcmYoIiV2IGlzIGRpc2FsbG93ZWQgaW4gcmVsZWFzZSB2ZXJzaW9uIGJlY2F1c2UgaXQgaXMgdW5zdGFibGUsIGFuZCBpdHMgXCJvd25lclwiIHByb3BlcnR5IGlzIG1pc3NpbmcuIiwKKwkJCW5hbWUpCisJfQorfQorCitmdW5jIHJlcG9ydE11bHRpcGxlVmVyc2lvbkVycm9yKGN0eCBhbmRyb2lkLkJhc2VNb2R1bGVDb250ZXh0LCB2aW9sYXRvcnMgW11zdHJpbmcpIHsKKwlzb3J0LlN0cmluZ3ModmlvbGF0b3JzKQorCWN0eC5Nb2R1bGVFcnJvcmYoImRlcGVuZHMgb24gbXVsdGlwbGUgdmVyc2lvbnMgb2YgdGhlIHNhbWUgYWlkbF9pbnRlcmZhY2U6ICVzIiwgc3RyaW5ncy5Kb2luKHZpb2xhdG9ycywgIiwgIikpCisJY3R4LldhbGtEZXBzKGZ1bmMoY2hpbGQgYW5kcm9pZC5Nb2R1bGUsIHBhcmVudCBhbmRyb2lkLk1vZHVsZSkgYm9vbCB7CisJCWlmIGFuZHJvaWQuSW5MaXN0KGNoaWxkLk5hbWUoKSwgdmlvbGF0b3JzKSB7CisJCQljdHguTW9kdWxlRXJyb3JmKCJEZXBlbmRlbmN5IHBhdGg6ICVzIiwgY3R4LkdldFBhdGhTdHJpbmcodHJ1ZSkpCisJCQlyZXR1cm4gZmFsc2UKKwkJfQorCQlyZXR1cm4gdHJ1ZQorCX0pCit9CisKK2Z1bmMgY2hlY2tBaWRsR2VuZXJhdGVkTW9kdWxlcyhtY3R4IGFuZHJvaWQuQm90dG9tVXBNdXRhdG9yQ29udGV4dCkgewogCXN3aXRjaCBtY3R4Lk1vZHVsZSgpLih0eXBlKSB7CiAJY2FzZSAqamF2YS5MaWJyYXJ5OgogCWNhc2UgKmNjLk1vZHVsZToKQEAgLTE4NSw0NyArMTcwLDM3IEBACiAJZGVmYXVsdDoKIAkJcmV0dXJuCiAJfQotCi0JYWlkbERlcHNNdXRleC5STG9jaygpCi0JbXlBaWRsRGVwcyA6PSBhaWRsRGVwcyhtY3R4LkNvbmZpZygpKVttY3R4Lk1vZHVsZSgpXQotCWFpZGxEZXBzTXV0ZXguUlVubG9jaygpCi0JaWYgbXlBaWRsRGVwcyA9PSBuaWwgfHwgbGVuKG15QWlkbERlcHMpID09IDAgewotCQlyZXR1cm4gLy8gVGhpcyBzaG91bGQgYmUgdGhlIHVzdWFsIGNhc2UKKwlpZiBnZW4sIG9rIDo9IG1jdHguTW9kdWxlKCkuKCphaWRsR2VuUnVsZSk7IG9rIHsKKwkJdmFyIG5vdEZyb3plbiBbXXN0cmluZworCQlpZiBnZW4ucHJvcGVydGllcy5Ob3RGcm96ZW4geworCQkJbm90RnJvemVuID0gW11zdHJpbmd7c3RyaW5ncy5UcmltU3VmZml4KG1jdHguTW9kdWxlTmFtZSgpLCAiLXNvdXJjZSIpfQorCQl9CisJCW1jdHguU2V0UHJvdmlkZXIoQWlkbFZlcnNpb25JbmZvUHJvdmlkZXIsIEFpbGRWZXJzaW9uSW5mb3sKKwkJCW5vdEZyb3plbjogbm90RnJvemVuLAorCQkJc291cmNlTWFwOiBtYXBbc3RyaW5nXXN0cmluZ3sKKwkJCQlnZW4ucHJvcGVydGllcy5CYXNlTmFtZSArICItIiArIGdlbi5wcm9wZXJ0aWVzLkxhbmc6IGdlbi5OYW1lKCksCisJCQl9LAorCQl9KQorCQlyZXR1cm4KIAl9Ci0KLQkvLyBMYXN0bHksIHJlcG9ydCBhbiBlcnJvciBpZiB0aGVyZSBpcyBhbnkgZHVwbGljYXRlZCB2ZXJzaW9ucyBvZiB0aGUgc2FtZSBpbnRlcmZhY2UgKiBsYW5nCi0JZm9yIF8sIGxhbmcgOj0gcmFuZ2UgW11zdHJpbmd7bGFuZ0phdmEsIGxhbmdDcHAsIGxhbmdOZGssIGxhbmdOZGtQbGF0Zm9ybX0gewotCQkvLyBpbnRlcmZhY2VOYW1lIC0+IHZlckxhbmcgLT4gbGlzdCBvZiBtb2R1bGUgbmFtZXMKLQkJdmVyc2lvbnNPZiA6PSBtYWtlKG1hcFtzdHJpbmddbWFwW3N0cmluZ11bXXN0cmluZykKLQkJZm9yIF8sIGRlcCA6PSByYW5nZSBteUFpZGxEZXBzIHsKLQkJCWlmICFzdHJpbmdzLkhhc1N1ZmZpeChkZXAudmVyTGFuZywgbGFuZykgewotCQkJCWNvbnRpbnVlCi0JCQl9Ci0JCQl2ZXJzaW9ucyA6PSB2ZXJzaW9uc09mW2RlcC5pZmFjZU5hbWVdCi0JCQlpZiB2ZXJzaW9ucyA9PSBuaWwgewotCQkJCXZlcnNpb25zID0gbWFrZShtYXBbc3RyaW5nXVtdc3RyaW5nKQotCQkJCXZlcnNpb25zT2ZbZGVwLmlmYWNlTmFtZV0gPSB2ZXJzaW9ucwotCQkJfQotCQkJdmVyc2lvbnNbZGVwLnZlckxhbmddID0gYXBwZW5kKHZlcnNpb25zW2RlcC52ZXJMYW5nXSwgZGVwLm1vZHVsZU5hbWUoKSkKLQkJfQotCi0JCWZvciBfLCB2ZXJzaW9ucyA6PSByYW5nZSB2ZXJzaW9uc09mIHsKLQkJCWlmIGxlbih2ZXJzaW9ucykgPj0gMiB7Ci0JCQkJdmFyIHZpb2xhdG9ycyBbXXN0cmluZwotCQkJCWZvciBfLCBtb2R1bGVzIDo9IHJhbmdlIHZlcnNpb25zIHsKLQkJCQkJdmlvbGF0b3JzID0gYXBwZW5kKHZpb2xhdG9ycywgbW9kdWxlcy4uLikKLQkJCQl9Ci0JCQkJdmlvbGF0b3JzID0gYW5kcm9pZC5Tb3J0ZWRVbmlxdWVTdHJpbmdzKHZpb2xhdG9ycykKLQkJCQltY3R4Lk1vZHVsZUVycm9yZigiZGVwZW5kcyBvbiBtdWx0aXBsZSB2ZXJzaW9ucyBvZiB0aGUgc2FtZSBhaWRsX2ludGVyZmFjZTogJXMiLCBzdHJpbmdzLkpvaW4odmlvbGF0b3JzLCAiLCAiKSkKLQkJCQltY3R4LldhbGtEZXBzKGZ1bmMoY2hpbGQgYW5kcm9pZC5Nb2R1bGUsIHBhcmVudCBhbmRyb2lkLk1vZHVsZSkgYm9vbCB7Ci0JCQkJCWlmIGFuZHJvaWQuSW5MaXN0KGNoaWxkLk5hbWUoKSwgdmlvbGF0b3JzKSB7Ci0JCQkJCQltY3R4Lk1vZHVsZUVycm9yZigiRGVwZW5kZW5jeSBwYXRoOiAlcyIsIG1jdHguR2V0UGF0aFN0cmluZyh0cnVlKSkKLQkJCQkJCXJldHVybiBmYWxzZQotCQkJCQl9Ci0JCQkJCXJldHVybiB0cnVlCi0JCQkJfSkKKwkvLyBDb2xsZWN0L21lcmdlIEFpbGRWZXJzaW9uSW5mb3MgZnJvbSBkaXJlY3QgZGVwZW5kZW5jaWVzCisJdmFyIGluZm8gQWlsZFZlcnNpb25JbmZvCisJbWN0eC5WaXNpdERpcmVjdERlcHMoZnVuYyhkZXAgYW5kcm9pZC5Nb2R1bGUpIHsKKwkJaWYgbWN0eC5PdGhlck1vZHVsZUhhc1Byb3ZpZGVyKGRlcCwgQWlkbFZlcnNpb25JbmZvUHJvdmlkZXIpIHsKKwkJCW90aGVySW5mbyA6PSBtY3R4Lk90aGVyTW9kdWxlUHJvdmlkZXIoZGVwLCBBaWRsVmVyc2lvbkluZm9Qcm92aWRlcikuKEFpbGRWZXJzaW9uSW5mbykKKwkJCWlmIHZpb2xhdG9ycyA6PSBpbmZvLm1lcmdlKG90aGVySW5mbyk7IHZpb2xhdG9ycyAhPSBuaWwgeworCQkJCXJlcG9ydE11bHRpcGxlVmVyc2lvbkVycm9yKG1jdHgsIHZpb2xhdG9ycykKIAkJCX0KIAkJfQorCX0pCisJaWYgIWlzQWlkbEdlbmVyYXRlZE1vZHVsZShtY3R4Lk1vZHVsZSgpKSAmJiBsZW4oaW5mby5ub3RGcm96ZW4pID4gMCB7CisJCXJlcG9ydFVzaW5nTm90RnJvemVuRXJyb3IobWN0eCwgaW5mby5ub3RGcm96ZW4pCisJfQorCWlmIG1jdHguRmFpbGVkKCkgeworCQlyZXR1cm4KKwl9CisJaWYgaW5mby5zb3VyY2VNYXAgIT0gbmlsIHx8IGxlbihpbmZvLm5vdEZyb3plbikgPiAwIHsKKwkJbWN0eC5TZXRQcm92aWRlcihBaWRsVmVyc2lvbkluZm9Qcm92aWRlciwgaW5mbykKIAl9CiB9CiAKQEAgLTI0MCw3ICsyMTUsNyBAQAogCX0KIAogCWlmIGxlbihzcmNzKSA9PSAwIHsKLQkJY3R4LlByb3BlcnR5RXJyb3JmKCJzcmNzIiwgIk5vIHNvdXJjZXMgcHJvdmlkZWQuIikKKwkJY3R4LlByb3BlcnR5RXJyb3JmKCJzcmNzIiwgIk5vIHNvdXJjZXMgcHJvdmlkZWQgaW4gJXYiLCByb290KQogCX0KIAogCS8vIGdhdGhlciBiYXNlIGRpcmVjdG9yaWVzIGZyb20gaW5wdXQgLmFpZGwgZmlsZXMKQEAgLTI3NywxMSArMjUyLDYgQEAKIAkvLyBGb3IgbmF0aXZlIG1vZHVsZXMsIHRoZSBwcm9wZXJ0eSBuZWVkcyB0byBiZSBzZXQgd2hlbiBhIG1vZHVsZSBpcyBhIHBhcnQgb2YgbWFpbmxpbmUgbW9kdWxlcyhBUEVYKS4KIAkvLyBGb3J3YXJkZWQgdG8gZ2VuZXJhdGVkIGphdmEvbmF0aXZlIG1vZHVsZS4KIAlNaW5fc2RrX3ZlcnNpb24gKnN0cmluZwotCi0JLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBnZW5lcmF0ZWQgc291cmNlIGZpbGVzIGFyZSBhdmFpbGFibGUgb3Igbm90LiBXaGVuIHNldCB0byB0cnVlLAotCS8vIHRoZSBzb3VyY2UgZmlsZXMgY2FuIGJlIGFkZGVkIHRvIGBzcmNzYCBwcm9wZXJ0eSB2aWEgYDo8aWZhY2VuYW1lPi08YmFja2VuZD4tc291cmNlYCwKLQkvLyBlLmcuLCAiOm15YWlkbC1qYXZhLXNvdXJjZSIKLQlTcmNzX2F2YWlsYWJsZSAqYm9vbAogfQogCiB0eXBlIENvbW1vbk5hdGl2ZUJhY2tlbmRQcm9wZXJ0aWVzIHN0cnVjdCB7CkBAIC0zMjMsNiArMjkzLDkgQEAKIAkvLyBXaGV0aGVyIHRoZSBsaWJyYXJ5IGNhbiBiZSBpbnN0YWxsZWQgb24gdGhlIHByb2R1Y3QgaW1hZ2UuCiAJUHJvZHVjdF9hdmFpbGFibGUgKmJvb2wKIAorCS8vIFdoZXRoZXIgdGhlIGxpYnJhcnkgY2FuIGJlIGluc3RhbGxlZCBvbiB0aGUgcmVjb3ZlcnkgaW1hZ2UuCisJUmVjb3ZlcnlfYXZhaWxhYmxlICpib29sCisKIAkvLyBXaGV0aGVyIHRoZSBsaWJyYXJ5IGNhbiBiZSBsb2FkZWQgbXVsdGlwbGUgdGltZXMgaW50byB0aGUgc2FtZSBwcm9jZXNzCiAJRG91YmxlX2xvYWRhYmxlICpib29sCiAKQEAgLTM0NiwxMiArMzE5LDYgQEAKIAkvLyBJdCBjb3VsZCBiZSBhbiBhaWRsX2ludGVyZmFjZSBzb2xlbHkgb3Igd2l0aCB2ZXJzaW9uKHN1Y2ggYXMgLVYxKQogCUltcG9ydHMgW11zdHJpbmcKIAotCS8vIExpc3Qgb2YgYWlkbF9pbnRlcmZhY2UgbW9kdWxlcyB0aGF0IHRoaXMgdXNlcy4gSXQgdHJpbXMgdmVyc2lvbiBzdWZmaXggaW4gJ0ltcG9ydHMnIGZpZWxkLgotCUltcG9ydHNXaXRob3V0VmVyc2lvbiBbXXN0cmluZyBgYmx1ZXByaW50OiJtdXRhdGVkImAKLQotCS8vIFVzZWQgYnkgZ2VuIGRlcGVuZGVuY3kgdG8gZmlsbCBvdXQgYWlkbCBpbmNsdWRlIHBhdGgKLQlGdWxsX2ltcG9ydF9wYXRocyBbXXN0cmluZyBgYmx1ZXByaW50OiJtdXRhdGVkImAKLQogCS8vIFN0YWJpbGl0eSBwcm9taXNlLiBDdXJyZW50bHkgb25seSBzdXBwb3J0cyAidmludGYiLgogCS8vIElmIHRoaXMgaXMgdW5zZXQsIHRoaXMgY29ycmVzcG9uZHMgdG8gYW4gaW50ZXJmYWNlIHdpdGggc3RhYmlsaXR5IHdpdGhpbgogCS8vIHRoaXMgY29tcGlsYXRpb24gY29udGV4dCAoc28gYW4gaW50ZXJmYWNlIGxvYWRlZCBoZXJlIGNhbiBvbmx5IGJlIHVzZWQKQEAgLTM2MCw5ICszMjcsMjYgQEAKIAkvLyBpbnRlcmZhY2UgbXVzdCBiZSBrZXB0IHN0YWJsZSBhcyBsb25nIGFzIGl0IGlzIHVzZWQuCiAJU3RhYmlsaXR5ICpzdHJpbmcKIAorCS8vIERlcHJlY2F0ZWQ6IFVzZSBgdmVyc2lvbnNfd2l0aF9pbmZvYCBpbnN0ZWFkLiBEb24ndCB1c2UgYHZlcnNpb25zYCBwcm9wZXJ0eSBkaXJlY3RseS4KKwlWZXJzaW9ucyBbXXN0cmluZworCiAJLy8gUHJldmlvdXMgQVBJIHZlcnNpb25zIHRoYXQgYXJlIG5vdyBmcm96ZW4uIFRoZSB2ZXJzaW9uIHRoYXQgaXMgbGFzdCBpbgogCS8vIHRoZSBsaXN0IGlzIGNvbnNpZGVyZWQgYXMgdGhlIG1vc3QgcmVjZW50IHZlcnNpb24uCi0JVmVyc2lvbnMgW11zdHJpbmcKKwkvLyBUaGUgc3RydWN0IGNvbnRhaW5zIGJvdGggdmVyc2lvbiBhbmQgaW1wb3J0cyBpbmZvcm1hdGlvbiBwZXIgYSB2ZXJzaW9uLgorCS8vIFVudGlsIHZlcnNpb25zIHByb3BlcnR5IGlzIHJlbW92ZWQsIGRvbid0IHVzZSBgdmVyc2lvbnNfd2l0aF9pbmZvYCBkaXJlY3RseS4KKwlWZXJzaW9uc193aXRoX2luZm8gW11zdHJ1Y3QgeworCQlWZXJzaW9uIHN0cmluZworCQlJbXBvcnRzIFtdc3RyaW5nCisJfQorCisJLy8gVXNlIGFpZGxJbnRlcmZhY2UuZ2V0VmVyc2lvbnMoKQorCVZlcnNpb25zSW50ZXJuYWwgW11zdHJpbmcgYGJsdWVwcmludDoibXV0YXRlZCJgCisKKwkvLyBUaGUgbWluaW11bSB2ZXJzaW9uIG9mIHRoZSBzZGsgdGhhdCB0aGUgY29tcGlsZWQgYXJ0aWZhY3RzIHdpbGwgcnVuIGFnYWluc3QKKwkvLyBGb3IgbmF0aXZlIG1vZHVsZXMsIHRoZSBwcm9wZXJ0eSBuZWVkcyB0byBiZSBzZXQgd2hlbiBhIG1vZHVsZSBpcyBhIHBhcnQgb2YgbWFpbmxpbmUgbW9kdWxlcyhBUEVYKS4KKwkvLyBGb3J3YXJkZWQgdG8gZ2VuZXJhdGVkIGphdmEvbmF0aXZlIG1vZHVsZS4gVGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiBieQorCS8vIGJhY2tlbmQuPG5hbWU+Lm1pbl9zZGtfdmVyc2lvbi4KKwlNaW5fc2RrX3ZlcnNpb24gKnN0cmluZwogCiAJQmFja2VuZCBzdHJ1Y3QgewogCQkvLyBCYWNrZW5kIG9mIHRoZSBjb21waWxlciBnZW5lcmF0aW5nIGNvZGUgZm9yIEphdmEgY2xpZW50cy4KQEAgLTM3NSw2ICszNTksOSBAQAogCQkJLy8gV2hldGhlciB0byBjb21waWxlIGFnYWluc3QgcGxhdGZvcm0gQVBJcyBpbnN0ZWFkIG9mCiAJCQkvLyBhbiBTREsuCiAJCQlQbGF0Zm9ybV9hcGlzICpib29sCisJCQkvLyBXaGV0aGVyIFJQQyBmZWF0dXJlcyBhcmUgZW5hYmxlZCAocmVxdWlyZXMgQVBJIGxldmVsIDMyKQorCQkJLy8gVE9ETyhiLzE3NTgxOTUzNSk6IGVuYWJsZSB0aGlzIGF1dG9tYXRpY2FsbHk/CisJCQlHZW5fcnBjICpib29sCiAJCQkvLyBMaW50IHByb3BlcnRpZXMgZm9yIGdlbmVyYXRlZCBqYXZhIG1vZHVsZQogCQkJamF2YS5MaW50UHJvcGVydGllcwogCQl9CkBAIC0zOTMsNiArMzgwLDExIEBACiAJCU5kayBzdHJ1Y3QgewogCQkJQ29tbW9uTmF0aXZlQmFja2VuZFByb3BlcnRpZXMKIAorCQkJLy8gU2V0IHRvIHRoZSB2ZXJzaW9uIG9mIHRoZSBzZGsgdG8gY29tcGlsZSBhZ2FpbnN0LCBmb3IgdGhlIE5ESworCQkJLy8gdmFyaWFudC4KKwkJCS8vIERlZmF1bHQ6IGN1cnJlbnQKKwkJCVNka192ZXJzaW9uICpzdHJpbmcKKwogCQkJLy8gSWYgc2V0IHRvIGZhbHNlLCB0aGUgbmRrIGJhY2tlbmQgaXMgZXhjbHVzaXZlIHRvIHBsYXRmb3JtIGFuZCBpcyBub3QKIAkJCS8vIGF2YWlsYWJsZSB0byBhcHBsaWNhdGlvbnMuIERlZmF1bHQgaXMgdHJ1ZSAoaS5lLiBhdmFpbGFibGUgdG8gYm90aAogCQkJLy8gYXBwbGljYXRpb25zIGFuZCBwbGF0Zm9ybSkuCkBAIC00MjUsNiArNDE3LDEyIEBACiAKIAkvLyBsaXN0IG9mIG1vZHVsZSBuYW1lcyB0aGF0IGFyZSBjcmVhdGVkIGZvciB0aGlzIGludGVyZmFjZQogCWludGVybmFsTW9kdWxlTmFtZXMgW11zdHJpbmcKKworCS8vIG1hcCBmb3IgdmVyc2lvbiB0byBwcmVwcm9jZXNzZWQuYWlkbCBmaWxlLgorCS8vIFRoZXJlJ3MgdHdvIGFkZGl0aW9uYWwgYWxpYXMgZm9yIHZlcnNpb25zOgorCS8vIC0gIiIoZW1wdHkpIGlzIGZvciBUb1QKKwkvLyAtICJsYXRlc3QiIGlzIGZvciBpLmxhdGVzdFZlcnNpb24oKQorCXByZXByb2Nlc3NlZCBtYXBbc3RyaW5nXWFuZHJvaWQuV3JpdGFibGVQYXRoCiB9CiAKIGZ1bmMgKGkgKmFpZGxJbnRlcmZhY2UpIHNob3VsZEdlbmVyYXRlSmF2YUJhY2tlbmQoKSBib29sIHsKQEAgLTQ0MCw1MCArNDM4LDE0NCBAQAogZnVuYyAoaSAqYWlkbEludGVyZmFjZSkgc2hvdWxkR2VuZXJhdGVOZGtCYWNrZW5kKCkgYm9vbCB7CiAJLy8gZXhwbGljaXRseSB0cnVlIGlmIG5vdCBzcGVjaWZpZWQgdG8gZ2l2ZSBlYXJseSB3YXJuaW5nIHRvIGRldnMKIAlyZXR1cm4gcHJvcHRvb2xzLkJvb2xEZWZhdWx0KGkucHJvcGVydGllcy5CYWNrZW5kLk5kay5FbmFibGVkLCB0cnVlKQotCXJldHVybiBpLnByb3BlcnRpZXMuQmFja2VuZC5OZGsuRW5hYmxlZCA9PSBuaWwgfHwgKmkucHJvcGVydGllcy5CYWNrZW5kLk5kay5FbmFibGVkCiB9CiAKIC8vIFJldHVybnMgd2hldGhlciB0aGUgbmRrIGJhY2tlbmQgc3VwcG9ydHMgYXBwbGljYXRpb25zIG9yIG5vdC4gRGVmYXVsdCBpcyBgdHJ1ZWAuIGBmYWxzZWAgaXMKLS8vIHJldHVybmVkIG9ubHkgd2hlbiBgYXBwc19lbmFibGVkYCBpcyBleHBsaWNpdGx5IHNldCB0byBmYWxzZS4gTm90ZSB0aGF0IHRoZSBuZGtfcGxhdGZvcm0gYmFja2VuZAotLy8gKHdoaWNoIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlKSBpcyBub3QgYWZmZWN0ZWQgYnkgdGhpcy4gSW4gb3RoZXIgd29yZHMsIGl0IGlzIGFsd2F5cwotLy8gZXhjbHVzaXZlIGZvciB0aGUgcGxhdGZvcm0sIGFzIGl0cyBuYW1lIGNsZWFybHkgc2hvd3MuCisvLyByZXR1cm5lZCB3aGVuIGBhcHBzX2VuYWJsZWRgIGlzIGV4cGxpY2l0bHkgc2V0IHRvIGZhbHNlIG9yIHRoZSBpbnRlcmZhY2UgaXMgZXhjbHVzaXZlIHRvIHZlbmRvcgorLy8gKGkuZS4gYHZlbmRvcjogdHJ1ZWApLiBOb3RlIHRoYXQgdGhlIG5ka19wbGF0Zm9ybSBiYWNrZW5kICh3aGljaCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZSkKKy8vIGlzIG5vdCBhZmZlY3RlZCBieSB0aGlzLiBJbiBvdGhlciB3b3JkcywgaXQgaXMgYWx3YXlzIGV4Y2x1c2l2ZSBmb3IgdGhlIHBsYXRmb3JtLCBhcyBpdHMgbmFtZQorLy8gY2xlYXJseSBzaG93cy4KIGZ1bmMgKGkgKmFpZGxJbnRlcmZhY2UpIHNob3VsZEdlbmVyYXRlQXBwTmRrQmFja2VuZCgpIGJvb2wgewogCXJldHVybiBpLnNob3VsZEdlbmVyYXRlTmRrQmFja2VuZCgpICYmCi0JCXByb3B0b29scy5Cb29sRGVmYXVsdChpLnByb3BlcnRpZXMuQmFja2VuZC5OZGsuQXBwc19lbmFibGVkLCB0cnVlKQorCQlwcm9wdG9vbHMuQm9vbERlZmF1bHQoaS5wcm9wZXJ0aWVzLkJhY2tlbmQuTmRrLkFwcHNfZW5hYmxlZCwgdHJ1ZSkgJiYKKwkJIWkuU29jU3BlY2lmaWMoKQogfQogCiBmdW5jIChpICphaWRsSW50ZXJmYWNlKSBzaG91bGRHZW5lcmF0ZVJ1c3RCYWNrZW5kKCkgYm9vbCB7CiAJcmV0dXJuIGkucHJvcGVydGllcy5CYWNrZW5kLlJ1c3QuRW5hYmxlZCAhPSBuaWwgJiYgKmkucHJvcGVydGllcy5CYWNrZW5kLlJ1c3QuRW5hYmxlZAogfQogCi1mdW5jIChpICphaWRsSW50ZXJmYWNlKSBnYXRoZXJJbnRlcmZhY2UobWN0eCBhbmRyb2lkLkxvYWRIb29rQ29udGV4dCkgewotCWFpZGxJbnRlcmZhY2VzIDo9IGFpZGxJbnRlcmZhY2VzKG1jdHguQ29uZmlnKCkpCi0JYWlkbEludGVyZmFjZU11dGV4LkxvY2soKQotCWRlZmVyIGFpZGxJbnRlcmZhY2VNdXRleC5VbmxvY2soKQotCSphaWRsSW50ZXJmYWNlcyA9IGFwcGVuZCgqYWlkbEludGVyZmFjZXMsIGkpCitmdW5jIChpICphaWRsSW50ZXJmYWNlKSBtaW5TZGtWZXJzaW9uKGxhbmcgc3RyaW5nKSAqc3RyaW5nIHsKKwl2YXIgdmVyICpzdHJpbmcKKwlzd2l0Y2ggbGFuZyB7CisJY2FzZSBsYW5nQ3BwOgorCQl2ZXIgPSBpLnByb3BlcnRpZXMuQmFja2VuZC5DcHAuTWluX3Nka192ZXJzaW9uCisJY2FzZSBsYW5nSmF2YToKKwkJdmVyID0gaS5wcm9wZXJ0aWVzLkJhY2tlbmQuSmF2YS5NaW5fc2RrX3ZlcnNpb24KKwljYXNlIGxhbmdOZGssIGxhbmdOZGtQbGF0Zm9ybToKKwkJdmVyID0gaS5wcm9wZXJ0aWVzLkJhY2tlbmQuTmRrLk1pbl9zZGtfdmVyc2lvbgorCWNhc2UgbGFuZ1J1c3Q6CisJCXZlciA9IGkucHJvcGVydGllcy5CYWNrZW5kLlJ1c3QuTWluX3Nka192ZXJzaW9uCisJZGVmYXVsdDoKKwkJcGFuaWMoZm10LkVycm9yZigidW5zdXBwb3J0ZWQgbGFuZ3VhZ2UgYmFja2VuZCAlcVxuIiwgbGFuZykpCisJfQorCWlmIHZlciA9PSBuaWwgeworCQlyZXR1cm4gaS5wcm9wZXJ0aWVzLk1pbl9zZGtfdmVyc2lvbgorCX0KKwlyZXR1cm4gdmVyCiB9CiAKLWZ1bmMgYWRkVW5zdGFibGVNb2R1bGUobWN0eCBhbmRyb2lkLkxvYWRIb29rQ29udGV4dCwgbW9kdWxlTmFtZSBzdHJpbmcpIHsKLQl1bnN0YWJsZU1vZHVsZXMgOj0gdW5zdGFibGVNb2R1bGVzKG1jdHguQ29uZmlnKCkpCi0JdW5zdGFibGVNb2R1bGVNdXRleC5Mb2NrKCkKLQlkZWZlciB1bnN0YWJsZU1vZHVsZU11dGV4LlVubG9jaygpCi0JKnVuc3RhYmxlTW9kdWxlcyA9IGFwcGVuZCgqdW5zdGFibGVNb2R1bGVzLCBtb2R1bGVOYW1lKQorLy8gRGVwIHRvICotYXBpIG1vZHVsZShhaWRsQXBpKQordHlwZSBhcGlEZXBUYWcgc3RydWN0IHsKKwlibHVlcHJpbnQuQmFzZURlcGVuZGVuY3lUYWcKKwluYW1lIHN0cmluZwogfQogCit0eXBlIGltcG9ydEludGVyZmFjZURlcFRhZyBzdHJ1Y3QgeworCWJsdWVwcmludC5CYXNlRGVwZW5kZW5jeVRhZworCWFuSW1wb3J0IHN0cmluZworfQorCit0eXBlIGludGVyZmFjZURlcFRhZyBzdHJ1Y3QgeworCWJsdWVwcmludC5CYXNlRGVwZW5kZW5jeVRhZworfQorCit2YXIgKAorCS8vIERlcCBmcm9tICotc291cmNlIChhaWRsR2VuUnVsZSkgdG8gKi1hcGkgKGFpZGxBcGkpCisJYXBpRGVwID0gYXBpRGVwVGFne25hbWU6ICJhcGkifQorCS8vIERlcCBmcm9tICotYXBpIChhaWRsQXBpKSB0byAqLWFwaSAoYWlkbEFwaSksIHJlcHJlc2VudGluZyBpbXBvcnRlZCBpbnRlcmZhY2VzCisJaW1wb3J0QXBpRGVwID0gYXBpRGVwVGFne25hbWU6ICJpbXBvcnRlZC1hcGkifQorCS8vIERlcCB0byBvcmlnaW5hbCAqLWludGVyZmFjZSAoYWlkbEludGVyZmFjZSkKKwlpbnRlcmZhY2VEZXAgPSBpbnRlcmZhY2VEZXBUYWd7fQorKQorCitmdW5jIGFkZEltcG9ydGVkSW50ZXJmYWNlRGVwcyhjdHggYW5kcm9pZC5Cb3R0b21VcE11dGF0b3JDb250ZXh0LCBpbXBvcnRzIFtdc3RyaW5nKSB7CisJZm9yIF8sIGFuSW1wb3J0IDo9IHJhbmdlIGltcG9ydHMgeworCQluYW1lLCBfIDo9IHBhcnNlTW9kdWxlV2l0aFZlcnNpb24oYW5JbXBvcnQpCisJCWN0eC5BZGREZXBlbmRlbmN5KGN0eC5Nb2R1bGUoKSwgaW1wb3J0SW50ZXJmYWNlRGVwVGFne2FuSW1wb3J0OiBhbkltcG9ydH0sIG5hbWUrYWlkbEludGVyZmFjZVN1ZmZpeCkKKwl9Cit9CisKKy8vIFJ1biBjdXN0b20gIkRlcHMiIG11dGF0b3IgYmV0d2VlbiBBSURMIG1vZHVsZXMgY3JlYXRlZCBhdCBMb2FkSG9vayBzdGFnZS4KKy8vIFdlIGNhbid0IHVzZSB0aGUgIkRlcHNNdXRhdG9yIiBmb3IgdGhlc2UgZGVwZW5kZW5jaWVzIGJlY2F1c2UKKy8vIC0gV2UgbmVlZCB0byBjcmVhdGUgbGlicmFyeSBtb2R1bGVzIChjYy9qYXZhLy4uLikgYmVmb3JlICJhcmNoIiBtdXRhdG9yLiBOb3RlIHRoYXQgY2NfbGlicmFyeQorLy8gICBzaG91bGQgYmUgbXV0YXRlZCBieSBvcy9pbWFnZS9hcmNoIG11dGF0b3JzIGFzIHdlbGwuCisvLyAtIFdoZW4gY3JlYXRpbmcgbGlicmFyeSBtb2R1bGVzLCB3ZSBuZWVkIHRvIGFjY2VzcyB0aGUgb3JpZ2luYWwgaW50ZXJmYWNlIGFuZCBpdHMgaW1wb3J0ZWQKKy8vICAgaW50ZXJmYWNlcyB0byBkZXRlcm1pbmUgd2hpY2ggdmVyc2lvbiB0byB1c2UuIFNlZSBhaWRsSW50ZXJmYWNlLmdldEltcG9ydFdpdGhWZXJzaW9uLgorZnVuYyBhZGRJbnRlcmZhY2VEZXBzKG1jdHggYW5kcm9pZC5Cb3R0b21VcE11dGF0b3JDb250ZXh0KSB7CisJc3dpdGNoIGkgOj0gbWN0eC5Nb2R1bGUoKS4odHlwZSkgeworCWNhc2UgKmFpZGxJbnRlcmZhY2U6CisJCS8vIEluIGZhY3QgdGhpcyBpc24ndCBuZWNlc3NhcnkgYmVjYXVzZSBzb29uZyBjaGVja3MgZGVwZW5kZW5jaWVzIG9uIHVuZGVmaW5lZCBtb2R1bGVzLgorCQkvLyBCdXQgc2luY2UgYWlkbF9pbnRlcmZhY2Ugb3ZlcnJpZGVzIGl0cyBuYW1lIGludGVybmFsbHksIHRoaXMgcHJvdmlkZXMgYmV0dGVyIGVycm9yIG1lc3NhZ2UuCisJCWZvciBfLCBhbkltcG9ydFdpdGhWZXJzaW9uIDo9IHJhbmdlIGkucHJvcGVydGllcy5JbXBvcnRzIHsKKwkJCWFuSW1wb3J0LCBfIDo9IHBhcnNlTW9kdWxlV2l0aFZlcnNpb24oYW5JbXBvcnRXaXRoVmVyc2lvbikKKwkJCWlmICFtY3R4Lk90aGVyTW9kdWxlRXhpc3RzKGFuSW1wb3J0ICsgYWlkbEludGVyZmFjZVN1ZmZpeCkgeworCQkJCWlmICFtY3R4LkNvbmZpZygpLkFsbG93TWlzc2luZ0RlcGVuZGVuY2llcygpIHsKKwkJCQkJbWN0eC5Qcm9wZXJ0eUVycm9yZigiaW1wb3J0cyIsICJJbXBvcnQgZG9lcyBub3QgZXhpc3Q6ICIrYW5JbXBvcnQpCisJCQkJfQorCQkJfQorCQl9CisJCWlmIG1jdHguRmFpbGVkKCkgeworCQkJcmV0dXJuCisJCX0KKwkJYWRkSW1wb3J0ZWRJbnRlcmZhY2VEZXBzKG1jdHgsIGkucHJvcGVydGllcy5JbXBvcnRzKQorCWNhc2UgKmFpZGxJbXBsZW1lbnRhdGlvbkdlbmVyYXRvcjoKKwkJbWN0eC5BZGREZXBlbmRlbmN5KGksIGludGVyZmFjZURlcCwgaS5wcm9wZXJ0aWVzLkFpZGxJbnRlcmZhY2VOYW1lK2FpZGxJbnRlcmZhY2VTdWZmaXgpCisJCWFkZEltcG9ydGVkSW50ZXJmYWNlRGVwcyhtY3R4LCBpLnByb3BlcnRpZXMuSW1wb3J0cykKKwljYXNlICpydXN0Lk1vZHVsZToKKwkJZm9yIF8sIHByb3BzIDo9IHJhbmdlIGkuR2V0UHJvcGVydGllcygpIHsKKwkJCWlmIHNwLCBvayA6PSBwcm9wcy4oKmFpZGxSdXN0U291cmNlUHJvdmlkZXJQcm9wZXJ0aWVzKTsgb2sgeworCQkJCW1jdHguQWRkRGVwZW5kZW5jeShpLCBpbnRlcmZhY2VEZXAsIHNwLkFpZGxJbnRlcmZhY2VOYW1lK2FpZGxJbnRlcmZhY2VTdWZmaXgpCisJCQkJYWRkSW1wb3J0ZWRJbnRlcmZhY2VEZXBzKG1jdHgsIHNwLkltcG9ydHMpCisJCQkJYnJlYWsKKwkJCX0KKwkJfQorCWNhc2UgKmFpZGxBcGk6CisJCW1jdHguQWRkRGVwZW5kZW5jeShpLCBpbnRlcmZhY2VEZXAsIGkucHJvcGVydGllcy5CYXNlTmFtZSthaWRsSW50ZXJmYWNlU3VmZml4KQorCQlhZGRJbXBvcnRlZEludGVyZmFjZURlcHMobWN0eCwgaS5wcm9wZXJ0aWVzLkltcG9ydHMpCisJCWZvciBfLCBhbkltcG9ydCA6PSByYW5nZSBpLnByb3BlcnRpZXMuSW1wb3J0cyB7CisJCQluYW1lLCBfIDo9IHBhcnNlTW9kdWxlV2l0aFZlcnNpb24oYW5JbXBvcnQpCisJCQltY3R4LkFkZERlcGVuZGVuY3koaSwgaW1wb3J0QXBpRGVwLCBuYW1lK2FpZGxBcGlTdWZmaXgpCisJCX0KKwljYXNlICphaWRsR2VuUnVsZToKKwkJbWN0eC5BZGREZXBlbmRlbmN5KGksIGludGVyZmFjZURlcCwgaS5wcm9wZXJ0aWVzLkJhc2VOYW1lK2FpZGxJbnRlcmZhY2VTdWZmaXgpCisJCWFkZEltcG9ydGVkSW50ZXJmYWNlRGVwcyhtY3R4LCBpLnByb3BlcnRpZXMuSW1wb3J0cykKKwkJaWYgIXByb3B0b29scy5Cb29sKGkucHJvcGVydGllcy5VbnN0YWJsZSkgeworCQkJLy8gZm9yIGNoZWNrYXBpIHRpbWVzdGFtcHMKKwkJCW1jdHguQWRkRGVwZW5kZW5jeShpLCBhcGlEZXAsIGkucHJvcGVydGllcy5CYXNlTmFtZSthaWRsQXBpU3VmZml4KQorCQl9CisJfQorfQorCisvLyBjaGVja0ltcG9ydHMgY2hlY2tzIGlmICJpbXBvcnQ6IiBwcm9wZXJ0eSBpcyB2YWxpZC4KKy8vIEluIGZhY3QsIHRoaXMgaXNuJ3QgbmVjZXNzYXJ5IGJlY2F1c2UgU29vbmcgY2FuIGNoZWNrL3JlcG9ydCB3aGVuIHdlIGFkZCBhIGRlcGVuZGVuY3kgdG8KKy8vIHVuZGVmaW5lZC91bmtub3duIG1vZHVsZS4gQnV0IG1vZHVsZSBuYW1lcyBhcmUgdmVyeSBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBhbmQgbWF5IG5vdCBiZSBlYXN5CisvLyB0byB1bmRlcnN0YW5kLiBGb3IgZXhhbXBsZSwgd2hlbiBmb28gKHdpdGggamF2YSBlbmFibGVkKSBkZXBlbmRzIG9uIGJhciAod2l0aCBqYXZhIGRpc2FibGVkKSwgdGhlCisvLyBlcnJvciBtZXNzYWdlIHdvdWxkIGxvb2sgbGlrZSAiZm9vLVYyLWphdmEgZGVwZW5kcyBvbiB1bmtub3duIG1vZHVsZSBgYmFyLVYzLWphdmFgIiwgd2hpY2ggaXNuJ3QKKy8vIGNsZWFyIHRoYXQgYmFja2VuZC5qYXZhLmVuYWJsZWQgc2hvdWxkIGJlIHR1cm5lZCBvbi4KIGZ1bmMgY2hlY2tJbXBvcnRzKG1jdHggYW5kcm9pZC5Cb3R0b21VcE11dGF0b3JDb250ZXh0KSB7CiAJaWYgaSwgb2sgOj0gbWN0eC5Nb2R1bGUoKS4oKmFpZGxJbnRlcmZhY2UpOyBvayB7Ci0JCWZvciBfLCBhbkltcG9ydFdpdGhWZXJzaW9uIDo9IHJhbmdlIGkucHJvcGVydGllcy5JbXBvcnRzIHsKLQkJCWFuSW1wb3J0LCB2ZXJzaW9uIDo9IHBhcnNlTW9kdWxlV2l0aFZlcnNpb24oYW5JbXBvcnRXaXRoVmVyc2lvbikKLQkJCW90aGVyIDo9IGxvb2t1cEludGVyZmFjZShhbkltcG9ydCwgbWN0eC5Db25maWcoKSkKLQotCQkJaWYgb3RoZXIgPT0gbmlsIHsKLQkJCQlpZiBtY3R4LkNvbmZpZygpLkFsbG93TWlzc2luZ0RlcGVuZGVuY2llcygpIHsKLQkJCQkJY29udGludWUKLQkJCQl9Ci0JCQkJbWN0eC5Qcm9wZXJ0eUVycm9yZigiaW1wb3J0cyIsICJJbXBvcnQgZG9lcyBub3QgZXhpc3Q6ICIrYW5JbXBvcnQpCisJCW1jdHguVmlzaXREaXJlY3REZXBzKGZ1bmMoZGVwIGFuZHJvaWQuTW9kdWxlKSB7CisJCQl0YWcsIG9rIDo9IG1jdHguT3RoZXJNb2R1bGVEZXBlbmRlbmN5VGFnKGRlcCkuKGltcG9ydEludGVyZmFjZURlcFRhZykKKwkJCWlmICFvayB7CisJCQkJcmV0dXJuCiAJCQl9CisJCQlvdGhlciA6PSBkZXAuKCphaWRsSW50ZXJmYWNlKQorCQkJYW5JbXBvcnQgOj0gb3RoZXIuTW9kdWxlQmFzZS5OYW1lKCkKKwkJCWFuSW1wb3J0V2l0aFZlcnNpb24gOj0gdGFnLmFuSW1wb3J0CisJCQlfLCB2ZXJzaW9uIDo9IHBhcnNlTW9kdWxlV2l0aFZlcnNpb24odGFnLmFuSW1wb3J0KQogCQkJaWYgdmVyc2lvbiAhPSAiIiB7Ci0JCQkJY2FuZGlkYXRlVmVyc2lvbnMgOj0gY29uY2F0KG90aGVyLnByb3BlcnRpZXMuVmVyc2lvbnMsIFtdc3RyaW5ne290aGVyLm5leHRWZXJzaW9uKCl9KQorCQkJCWNhbmRpZGF0ZVZlcnNpb25zIDo9IGNvbmNhdChvdGhlci5nZXRWZXJzaW9ucygpLCBbXXN0cmluZ3tvdGhlci5uZXh0VmVyc2lvbigpfSkKIAkJCQlpZiAhYW5kcm9pZC5Jbkxpc3QodmVyc2lvbiwgY2FuZGlkYXRlVmVyc2lvbnMpIHsKIAkJCQkJbWN0eC5Qcm9wZXJ0eUVycm9yZigiaW1wb3J0cyIsICIlcSBkZXBlbmRzIG9uICVxIHZlcnNpb24gJXEoJXEpLCB3aGljaCBkb2Vzbid0IGV4aXN0LiBUaGUgdmVyc2lvbiBtdXN0IGJlIG9uZSBvZiAlcSIsIGkuTW9kdWxlQmFzZS5OYW1lKCksIGFuSW1wb3J0LCB2ZXJzaW9uLCBhbkltcG9ydFdpdGhWZXJzaW9uLCBjYW5kaWRhdGVWZXJzaW9ucykKIAkJCQl9CkBAIC01MDcsNyArNTk5LDcgQEAKIAkJCQltY3R4LlByb3BlcnR5RXJyb3JmKCJiYWNrZW5kLnJ1c3QuZW5hYmxlZCIsCiAJCQkJCSJSdXN0IGJhY2tlbmQgbm90IGVuYWJsZWQgaW4gdGhlIGltcG9ydGVkIEFJREwgaW50ZXJmYWNlICVxIiwgYW5JbXBvcnQpCiAJCQl9Ci0JCX0KKwkJfSkKIAl9CiB9CiAKQEAgLTUzNyw5ICs2MjksMjkgQEAKIAl9CiB9CiBmdW5jIChpICphaWRsSW50ZXJmYWNlKSBjaGVja1ZlcnNpb25zKG1jdHggYW5kcm9pZC5Mb2FkSG9va0NvbnRleHQpIHsKKwlpZiBsZW4oaS5wcm9wZXJ0aWVzLlZlcnNpb25zKSA+IDAgJiYgbGVuKGkucHJvcGVydGllcy5WZXJzaW9uc193aXRoX2luZm8pID4gMCB7CisJCW1jdHguTW9kdWxlRXJyb3JmKCJ2ZXJzaW9uczolcSBhbmQgdmVyc2lvbnNfd2l0aF9pbmZvOiVxIGNhbm5vdCBiZSB1c2VkIGF0IHRoZSBzYW1lIHRpbWUuIFVzZSB2ZXJzaW9uc193aXRoX2luZm8gaW5zdGVhZCBvZiB2ZXJzaW9ucy4iLCBpLnByb3BlcnRpZXMuVmVyc2lvbnMsIGkucHJvcGVydGllcy5WZXJzaW9uc193aXRoX2luZm8pCisJfQorCisJaWYgbGVuKGkucHJvcGVydGllcy5WZXJzaW9ucykgPiAwIHsKKwkJaS5wcm9wZXJ0aWVzLlZlcnNpb25zSW50ZXJuYWwgPSBtYWtlKFtdc3RyaW5nLCBsZW4oaS5wcm9wZXJ0aWVzLlZlcnNpb25zKSkKKwkJY29weShpLnByb3BlcnRpZXMuVmVyc2lvbnNJbnRlcm5hbCwgaS5wcm9wZXJ0aWVzLlZlcnNpb25zKQorCX0gZWxzZSBpZiBsZW4oaS5wcm9wZXJ0aWVzLlZlcnNpb25zX3dpdGhfaW5mbykgPiAwIHsKKwkJaS5wcm9wZXJ0aWVzLlZlcnNpb25zSW50ZXJuYWwgPSBtYWtlKFtdc3RyaW5nLCBsZW4oaS5wcm9wZXJ0aWVzLlZlcnNpb25zX3dpdGhfaW5mbykpCisJCWZvciBpZHgsIHZhbHVlIDo9IHJhbmdlIGkucHJvcGVydGllcy5WZXJzaW9uc193aXRoX2luZm8geworCQkJaS5wcm9wZXJ0aWVzLlZlcnNpb25zSW50ZXJuYWxbaWR4XSA9IHZhbHVlLlZlcnNpb24KKwkJCWZvciBfLCBpbSA6PSByYW5nZSB2YWx1ZS5JbXBvcnRzIHsKKwkJCQlpZiAhaGFzVmVyc2lvblN1ZmZpeChpbSkgeworCQkJCQltY3R4Lk1vZHVsZUVycm9yZigiaW1wb3J0cyBpbiB2ZXJzaW9uc193aXRoX2luZm8gbXVzdCBzcGVjaWZ5IGl0cyB2ZXJzaW9uLCBidXQgJXMuIEFkZCBhIHZlcnNpb24gc3VmZml4KHN1Y2ggYXMgJXMtVjEpLiIsIGltLCBpbSkKKwkJCQkJcmV0dXJuCisJCQkJfQorCQkJfQorCQl9CisJfQorCiAJdmVyc2lvbnMgOj0gbWFrZShtYXBbc3RyaW5nXWJvb2wpCi0JaW50VmVyc2lvbnMgOj0gbWFrZShbXWludCwgMCwgbGVuKGkucHJvcGVydGllcy5WZXJzaW9ucykpCi0JZm9yIF8sIHZlciA6PSByYW5nZSBpLnByb3BlcnRpZXMuVmVyc2lvbnMgeworCWludFZlcnNpb25zIDo9IG1ha2UoW11pbnQsIDAsIGxlbihpLmdldFZlcnNpb25zKCkpKQorCWZvciBfLCB2ZXIgOj0gcmFuZ2UgaS5nZXRWZXJzaW9ucygpIHsKIAkJaWYgXywgZHVwIDo9IHZlcnNpb25zW3Zlcl07IGR1cCB7CiAJCQltY3R4LlByb3BlcnR5RXJyb3JmKCJ2ZXJzaW9ucyIsICJkdXBsaWNhdGUgZm91bmQiLCB2ZXIpCiAJCQljb250aW51ZQpAQCAtNTU4LDcgKzY3MCw3IEBACiAKIAl9CiAJaWYgIW1jdHguRmFpbGVkKCkgJiYgIXNvcnQuSW50c0FyZVNvcnRlZChpbnRWZXJzaW9ucykgewotCQltY3R4LlByb3BlcnR5RXJyb3JmKCJ2ZXJzaW9ucyIsICJzaG91bGQgYmUgc29ydGVkLCBidXQgaXMgJXYiLCBpLnByb3BlcnRpZXMuVmVyc2lvbnMpCisJCW1jdHguUHJvcGVydHlFcnJvcmYoInZlcnNpb25zIiwgInNob3VsZCBiZSBzb3J0ZWQsIGJ1dCBpcyAldiIsIGkuZ2V0VmVyc2lvbnMoKSkKIAl9CiB9CiBmdW5jIChpICphaWRsSW50ZXJmYWNlKSBjaGVja1ZuZGtVc2VWZXJzaW9uKG1jdHggYW5kcm9pZC5Mb2FkSG9va0NvbnRleHQpIHsKQEAgLTU3Miw3ICs2ODQsNyBAQAogCWlmICppLnByb3BlcnRpZXMuVm5ka191c2VfdmVyc2lvbiA9PSBpLm5leHRWZXJzaW9uKCkgewogCQlyZXR1cm4KIAl9Ci0JZm9yIF8sIHZlciA6PSByYW5nZSBpLnByb3BlcnRpZXMuVmVyc2lvbnMgeworCWZvciBfLCB2ZXIgOj0gcmFuZ2UgaS5nZXRWZXJzaW9ucygpIHsKIAkJaWYgKmkucHJvcGVydGllcy5WbmRrX3VzZV92ZXJzaW9uID09IHZlciB7CiAJCQlyZXR1cm4KIAkJfQpAQCAtNTg0LDcgKzY5Niw3IEBACiAJaWYgcHJvcHRvb2xzLkJvb2woaS5wcm9wZXJ0aWVzLlVuc3RhYmxlKSB7CiAJCXJldHVybiAiIgogCX0KLQlyZXR1cm4gbmV4dFZlcnNpb24oaS5wcm9wZXJ0aWVzLlZlcnNpb25zKQorCXJldHVybiBuZXh0VmVyc2lvbihpLmdldFZlcnNpb25zKCkpCiB9CiAKIGZ1bmMgbmV4dFZlcnNpb24odmVyc2lvbnMgW11zdHJpbmcpIHN0cmluZyB7CkBAIC02MDMsMTEgKzcxNSwxNSBAQAogCWlmICFpLmhhc1ZlcnNpb24oKSB7CiAJCXJldHVybiAiMCIKIAl9Ci0JcmV0dXJuIGkucHJvcGVydGllcy5WZXJzaW9uc1tsZW4oaS5wcm9wZXJ0aWVzLlZlcnNpb25zKS0xXQorCXJldHVybiBpLmdldFZlcnNpb25zKClbbGVuKGkuZ2V0VmVyc2lvbnMoKSktMV0KIH0KIAogZnVuYyAoaSAqYWlkbEludGVyZmFjZSkgaGFzVmVyc2lvbigpIGJvb2wgewotCXJldHVybiBsZW4oaS5wcm9wZXJ0aWVzLlZlcnNpb25zKSA+IDAKKwlyZXR1cm4gbGVuKGkuZ2V0VmVyc2lvbnMoKSkgPiAwCit9CisKK2Z1bmMgKGkgKmFpZGxJbnRlcmZhY2UpIGdldFZlcnNpb25zKCkgW11zdHJpbmcgeworCXJldHVybiBpLnByb3BlcnRpZXMuVmVyc2lvbnNJbnRlcm5hbAogfQogCiBmdW5jIGhhc1ZlcnNpb25TdWZmaXgobW9kdWxlTmFtZSBzdHJpbmcpIGJvb2wgewpAQCAtNjM3LDE3ICs3NTMsMTAgQEAKIAlpZiBoYXNWZXJzaW9uU3VmZml4KGkuTW9kdWxlQmFzZS5OYW1lKCkpIHsKIAkJbWN0eC5Qcm9wZXJ0eUVycm9yZigibmFtZSIsICJhaWRsX2ludGVyZmFjZSBzaG91bGQgbm90IGhhdmUgJy1WPG51bWJlcj4gc3VmZml4IikKIAl9Ci0JaS5wcm9wZXJ0aWVzLkltcG9ydHNXaXRob3V0VmVyc2lvbiA9IHRyaW1WZXJzaW9uU3VmZml4SW5MaXN0KGkucHJvcGVydGllcy5JbXBvcnRzKQogCWlmICFpc1JlbGF0aXZlUGF0aChpLnByb3BlcnRpZXMuTG9jYWxfaW5jbHVkZV9kaXIpIHsKIAkJbWN0eC5Qcm9wZXJ0eUVycm9yZigibG9jYWxfaW5jbHVkZV9kaXIiLCAibXVzdCBiZSByZWxhdGl2ZSBwYXRoOiAiK2kucHJvcGVydGllcy5Mb2NhbF9pbmNsdWRlX2RpcikKIAl9Ci0JdmFyIGltcG9ydFBhdGhzIFtdc3RyaW5nCi0JaW1wb3J0UGF0aHMgPSBhcHBlbmQoaW1wb3J0UGF0aHMsIGZpbGVwYXRoLkpvaW4obWN0eC5Nb2R1bGVEaXIoKSwgaS5wcm9wZXJ0aWVzLkxvY2FsX2luY2x1ZGVfZGlyKSkKLQlpbXBvcnRQYXRocyA9IGFwcGVuZChpbXBvcnRQYXRocywgaS5wcm9wZXJ0aWVzLkluY2x1ZGVfZGlycy4uLikKIAotCWkucHJvcGVydGllcy5GdWxsX2ltcG9ydF9wYXRocyA9IGltcG9ydFBhdGhzCi0KLQlpLmdhdGhlckludGVyZmFjZShtY3R4KQogCWkuY2hlY2tTdGFiaWxpdHkobWN0eCkKIAlpLmNoZWNrVmVyc2lvbnMobWN0eCkKIAlpLmNoZWNrVm5ka1VzZVZlcnNpb24obWN0eCkKQEAgLTY1OCw3ICs3NjcsNiBAQAogCX0KIAogCXZhciBsaWJzIFtdc3RyaW5nCi0Jc2RrSXNGaW5hbCA6PSAhbWN0eC5Db25maWcoKS5EZWZhdWx0QXBwVGFyZ2V0U2RrKG1jdHgpLklzUHJldmlldygpCiAKIAl1bnN0YWJsZSA6PSBwcm9wdG9vbHMuQm9vbChpLnByb3BlcnRpZXMuVW5zdGFibGUpCiAKQEAgLTY3MywzNyArNzgxLDQ1IEBACiAJCX0KIAl9CiAKKwlzZGtJc0ZpbmFsIDo9ICFtY3R4LkNvbmZpZygpLkRlZmF1bHRBcHBUYXJnZXRTZGsobWN0eCkuSXNQcmV2aWV3KCkKKwlyZXF1aXJlRnJvemVuTm9Pd25lciA6PSBpLk93bmVyKCkgPT0gIiIgJiYgKHNka0lzRmluYWwgfHwgbWN0eC5Db25maWcoKS5Jc0VudlRydWUoIkFJRExfRlJPWkVOX1JFTCIpKQorCXJlcXVpcmVGcm96ZW5XaXRoT3duZXIgOj0gaS5Pd25lcigpICE9ICIiICYmIGFuZHJvaWQuSW5MaXN0KGkuT3duZXIoKSwgc3RyaW5ncy5GaWVsZHMobWN0eC5Db25maWcoKS5HZXRlbnYoIkFJRExfRlJPWkVOX09XTkVSUyIpKSkKKwlyZXF1aXJlRnJvemVuQnlPd25lciA6PSByZXF1aXJlRnJvemVuTm9Pd25lciB8fCByZXF1aXJlRnJvemVuV2l0aE93bmVyCisKIAkvLyBUd28gZGlmZmVyZW50IHR5cGVzIG9mICd1bnN0YWJsZScgaGVyZQogCS8vIC0gJ3Vuc3RhYmxlOiB0cnVlJyBtZWFuaW5nIHRoZSBtb2R1bGUgaXMgbmV2ZXIgc3RhYmxlCiAJLy8gLSBjdXJyZW50IHVuZnJvemVuIFRvVCB2ZXJzaW9uCiAJLy8KIAkvLyBPRU0gYnJhbmNoZXMgbWF5IHJlbW92ZSAnaS5Pd25lcigpJyBoZXJlIHRvIGFwcGx5IHRoZSBjaGVjayB0byBhbGwgaW50ZXJmYWNlcywgaW4KIAkvLyBhZGRpdGlvbiB0byBjb3JlIHBsYXRmb3JtIGludGVyZmFjZXMuIE90aGVyd2lzZSwgd2UgcmVseSBvbiB2dHNfdHJlYmxlX3ZpbnRmX3ZlbmRvcl90ZXN0LgotCXJlcXVpcmVGcm96ZW5WZXJzaW9uIDo9ICF1bnN0YWJsZSAmJiBzZGtJc0ZpbmFsICYmIGkuT3duZXIoKSA9PSAiIgorCXJlcXVpcmVGcm96ZW5WZXJzaW9uIDo9ICF1bnN0YWJsZSAmJiByZXF1aXJlRnJvemVuQnlPd25lcgogCiAJLy8gc3VyZmFjZSBlcnJvciBlYXJseSwgbWFpbiBjaGVjayBpcyB2aWEgY2hlY2tVbnN0YWJsZU1vZHVsZU11dGF0b3IKIAlpZiByZXF1aXJlRnJvemVuVmVyc2lvbiAmJiAhaS5oYXNWZXJzaW9uKCkgewogCQltY3R4LlByb3BlcnR5RXJyb3JmKCJ2ZXJzaW9ucyIsICJtdXN0IGJlIHNldCAobmVlZCB0byBiZSBmcm96ZW4pIHdoZW4gXCJ1bnN0YWJsZVwiIGlzIGZhbHNlLCBQTEFURk9STV9WRVJTSU9OX0NPREVOQU1FIGlzIFJFTCwgYW5kIFwib3duZXJcIiBwcm9wZXJ0eSBpcyBtaXNzaW5nLiIpCiAJfQogCi0JdmVyc2lvbnMgOj0gaS5wcm9wZXJ0aWVzLlZlcnNpb25zCisJdmVyc2lvbnMgOj0gaS5nZXRWZXJzaW9ucygpCiAJbmV4dFZlcnNpb24gOj0gaS5uZXh0VmVyc2lvbigpCiAJc2hvdWxkR2VuZXJhdGVMYW5nQmFja2VuZE1hcCA6PSBtYXBbc3RyaW5nXWJvb2x7Ci0JCWxhbmdDcHA6ICAgICAgICAgaS5zaG91bGRHZW5lcmF0ZUNwcEJhY2tlbmQoKSwKLQkJbGFuZ05kazogICAgICAgICBpLnNob3VsZEdlbmVyYXRlTmRrQmFja2VuZCgpLAotCQlsYW5nTmRrUGxhdGZvcm06IGkuc2hvdWxkR2VuZXJhdGVOZGtCYWNrZW5kKCksCi0JCWxhbmdKYXZhOiAgICAgICAgaS5zaG91bGRHZW5lcmF0ZUphdmFCYWNrZW5kKCksCi0JCWxhbmdSdXN0OiAgICAgICAgaS5zaG91bGRHZW5lcmF0ZVJ1c3RCYWNrZW5kKCl9CisJCWxhbmdDcHA6ICBpLnNob3VsZEdlbmVyYXRlQ3BwQmFja2VuZCgpLAorCQlsYW5nTmRrOiAgaS5zaG91bGRHZW5lcmF0ZU5ka0JhY2tlbmQoKSwKKwkJbGFuZ0phdmE6IGkuc2hvdWxkR2VuZXJhdGVKYXZhQmFja2VuZCgpLAorCQlsYW5nUnVzdDogaS5zaG91bGRHZW5lcmF0ZVJ1c3RCYWNrZW5kKCl9CisKKwkvLyBUaGUgbmRrX3BsYXRmb3JtIGJhY2tlbmQgaXMgZ2VuZXJhdGVkIG9ubHkgd2hlbiBleHBsaWNpdGx5IHJlcXVlc3RlZC4gVGhpcyB3aWxsCisJLy8gZXZlbnR1YWxseSBiZSBjb21wbGV0ZWx5IHJlbW92ZWQgdGhlIGRldmljZXMgaW4gdGhlIGxvbmcgdGFpbCBhcmUgZ29uZS4KKwlpZiBtY3R4LkRldmljZUNvbmZpZygpLkdlbmVyYXRlQWlkbE5ka1BsYXRmb3JtQmFja2VuZCgpIHsKKwkJc2hvdWxkR2VuZXJhdGVMYW5nQmFja2VuZE1hcFtsYW5nTmRrUGxhdGZvcm1dID0gaS5zaG91bGRHZW5lcmF0ZU5ka0JhY2tlbmQoKQorCX0KKwogCWZvciBsYW5nLCBzaG91bGRHZW5lcmF0ZSA6PSByYW5nZSBzaG91bGRHZW5lcmF0ZUxhbmdCYWNrZW5kTWFwIHsKIAkJaWYgIXNob3VsZEdlbmVyYXRlIHsKIAkJCWNvbnRpbnVlCiAJCX0KLQkJbGlicyA9IGFwcGVuZChsaWJzLCBhZGRMaWJyYXJ5KG1jdHgsIGksIG5leHRWZXJzaW9uLCBsYW5nKSkKLQkJaWYgcmVxdWlyZUZyb3plblZlcnNpb24gewotCQkJYWRkVW5zdGFibGVNb2R1bGUobWN0eCwgbGlic1tsZW4obGlicyktMV0pCi0JCX0KKwkJbGlicyA9IGFwcGVuZChsaWJzLCBhZGRMaWJyYXJ5KG1jdHgsIGksIG5leHRWZXJzaW9uLCBsYW5nLCByZXF1aXJlRnJvemVuVmVyc2lvbikpCiAJCWZvciBfLCB2ZXJzaW9uIDo9IHJhbmdlIHZlcnNpb25zIHsKLQkJCWxpYnMgPSBhcHBlbmQobGlicywgYWRkTGlicmFyeShtY3R4LCBpLCB2ZXJzaW9uLCBsYW5nKSkKKwkJCWxpYnMgPSBhcHBlbmQobGlicywgYWRkTGlicmFyeShtY3R4LCBpLCB2ZXJzaW9uLCBsYW5nLCBmYWxzZSkpCiAJCX0KIAl9CiAKQEAgLTc0Nyw4NiArODYzLDEwMSBAQAogCX0KIH0KIAotLy8gc3Jjc1Zpc2liaWxpdHkgZ2l2ZXMgdGhlIHZhbHVlIGZvciB0aGUgYHZpc2liaWxpdHlgIHByb3BlcnR5IG9mIHRoZSBzb3VyY2UgZ2VuIG1vZHVsZSBmb3IgdGhlCi0vLyBsYW5ndWFnZSBiYWNrZW5kIGBsYW5nYC4gQnkgZGVmYXVsdCwgdGhlIHNvdXJjZSBnZW4gbW9kdWxlIGlzIG5vdCB2aXNpYmxlIHRvIHRoZSBjbGllbnRzIG9mCi0vLyBhaWRsX2ludGVyZmFjZSAoYmVjYXVzZSBpdCdzIGFuIGltcGwgZGV0YWlsKSwgYnV0IHdoZW4gYGJhY2tlbmQuPGJhY2tlbmQ+LnNyY3NfYXZhaWxhYmxlYCBpcyBzZXQKLS8vIHRvIHRydWUsIHRoZSBzb3VyY2UgZ2VuIG1vZHVsZSBmb2xsb3dzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBhaWRsX2ludGVyZmFjZSBtb2R1bGUuCi1mdW5jIHNyY3NWaXNpYmlsaXR5KG1jdHggYW5kcm9pZC5Mb2FkSG9va0NvbnRleHQsIGxhbmcgc3RyaW5nKSBbXXN0cmluZyB7Ci0JaWYgYSwgb2sgOj0gbWN0eC5Nb2R1bGUoKS4oKmFpZGxJbnRlcmZhY2UpOyAhb2sgewotCQlwYW5pYyhmbXQuRXJyb3JmKCIlcSBpcyBub3QgYWlkbF9pbnRlcmZhY2UiLCBtY3R4Lk1vZHVsZSgpLlN0cmluZygpKSkKLQl9IGVsc2UgewotCQlpZiBwcm9wdG9vbHMuQm9vbChhLmNvbW1vbkJhY2tlbmRQcm9wZXJ0aWVzKGxhbmcpLlNyY3NfYXZhaWxhYmxlKSB7Ci0JCQkvLyBSZXR1cm5pbmcgbmlsIHNvIHRoYXQgdGhlIHZpc2liaWxpdHkgb2YgdGhlIHNvdXJjZSBtb2R1bGUgZGVmYXVsdHMgdG8gdGhlCi0JCQkvLyB0aGUgcGFja2FnZS1sZXZlbCBkZWZhdWx0IHZpc2liaWxpdHkuIFRoaXMgd2F5LCB0aGUgc291cmNlIG1vZHVsZSBnZXRzCi0JCQkvLyB0aGUgc2FtZSB2aXNpYmlsaXR5IGFzIHRoZSBsaWJyYXJ5IG1vZHVsZXMuCi0JCQlyZXR1cm4gbmlsCi0JCX0KLQl9Ci0JcmV0dXJuIFtdc3RyaW5newotCQkiLy8iICsgbWN0eC5Nb2R1bGVEaXIoKSwKLQkJLy8gc3lzdGVtL3Rvb2xzL2FpZGwvYnVpbGQgaXMgYWx3YXlzIGFkZGVkIGJlY2F1c2UgYWlkbF9tZXRhZGF0YV9qc29uIGluIHRoZQotCQkvLyBkaXJlY3RvcnkgaGFzIGRlcGVuZGVuY2llcyB0byBhbGwgYWlkbF9pbnRlcmZhY2UgbW9kdWxlcy4KLQkJIi8vc3lzdGVtL3Rvb2xzL2FpZGwvYnVpbGQiLAotCX0KLX0KLQogZnVuYyAoaSAqYWlkbEludGVyZmFjZSkgTmFtZSgpIHN0cmluZyB7CiAJcmV0dXJuIGkuTW9kdWxlQmFzZS5OYW1lKCkgKyBhaWRsSW50ZXJmYWNlU3VmZml4CiB9CisKIGZ1bmMgKGkgKmFpZGxJbnRlcmZhY2UpIEdlbmVyYXRlQW5kcm9pZEJ1aWxkQWN0aW9ucyhjdHggYW5kcm9pZC5Nb2R1bGVDb250ZXh0KSB7Ci0JYWlkbFJvb3QgOj0gYW5kcm9pZC5QYXRoRm9yTW9kdWxlU3JjKGN0eCwgaS5wcm9wZXJ0aWVzLkxvY2FsX2luY2x1ZGVfZGlyKQotCWZvciBfLCBzcmMgOj0gcmFuZ2UgYW5kcm9pZC5QYXRoc0Zvck1vZHVsZVNyYyhjdHgsIGkucHJvcGVydGllcy5TcmNzKSB7Ci0JCWJhc2VEaXIgOj0gZ2V0QmFzZURpcihjdHgsIHNyYywgYWlkbFJvb3QpCi0JCXJlbFBhdGgsIF8gOj0gZmlsZXBhdGguUmVsKGJhc2VEaXIsIHNyYy5TdHJpbmcoKSkKLQkJY29tcHV0ZWRUeXBlIDo9IHN0cmluZ3MuVHJpbVN1ZmZpeChzdHJpbmdzLlJlcGxhY2VBbGwocmVsUGF0aCwgIi8iLCAiLiIpLCAiLmFpZGwiKQorCXNyY3MsIF8gOj0gZ2V0UGF0aHMoY3R4LCBpLnByb3BlcnRpZXMuU3JjcywgaS5wcm9wZXJ0aWVzLkxvY2FsX2luY2x1ZGVfZGlyKQorCWZvciBfLCBzcmMgOj0gcmFuZ2Ugc3JjcyB7CisJCWNvbXB1dGVkVHlwZSA6PSBzdHJpbmdzLlRyaW1TdWZmaXgoc3RyaW5ncy5SZXBsYWNlQWxsKHNyYy5SZWwoKSwgIi8iLCAiLiIpLCAiLmFpZGwiKQogCQlpLmNvbXB1dGVkVHlwZXMgPSBhcHBlbmQoaS5jb21wdXRlZFR5cGVzLCBjb21wdXRlZFR5cGUpCiAJfQorCisJaS5wcmVwcm9jZXNzZWQgPSBtYWtlKG1hcFtzdHJpbmddYW5kcm9pZC5Xcml0YWJsZVBhdGgpCisJLy8gZ2VuZXJhdGUgKGxlbih2ZXJzaW9ucykgKyAxKSBwcmVwcm9jZXNzZWQuYWlkbCBmaWxlcworCWZvciBfLCB2ZXJzaW9uIDo9IHJhbmdlIGNvbmNhdChpLmdldFZlcnNpb25zKCksIFtdc3RyaW5ne2kubmV4dFZlcnNpb24oKX0pIHsKKwkJaS5wcmVwcm9jZXNzZWRbdmVyc2lvbl0gPSBpLmJ1aWxkUHJlcHJvY2Vzc2VkKGN0eCwgdmVyc2lvbikKKwl9CisJLy8gaGVscGZ1bCBhbGlhc2VzCisJaWYgIXByb3B0b29scy5Cb29sKGkucHJvcGVydGllcy5VbnN0YWJsZSkgeworCQlpZiBpLmhhc1ZlcnNpb24oKSB7CisJCQlpLnByZXByb2Nlc3NlZFsibGF0ZXN0Il0gPSBpLnByZXByb2Nlc3NlZFtpLmxhdGVzdFZlcnNpb24oKV0KKwkJfSBlbHNlIHsKKwkJCS8vIHdoZW4gd2UgaGF2ZSBubyBmcm96ZW4gdmVyc2lvbnMgeWV0LCB1c2UgIm5leHQgdmVyc2lvbiIgYXMgbGF0ZXN0CisJCQlpLnByZXByb2Nlc3NlZFsibGF0ZXN0Il0gPSBpLnByZXByb2Nlc3NlZFtpLm5leHRWZXJzaW9uKCldCisJCX0KKwkJaS5wcmVwcm9jZXNzZWRbIiJdID0gaS5wcmVwcm9jZXNzZWRbaS5uZXh0VmVyc2lvbigpXQorCX0KIH0KKworZnVuYyAoaSAqYWlkbEludGVyZmFjZSkgZ2V0SW1wb3J0c0ZvclZlcnNpb24odmVyc2lvbiBzdHJpbmcpIFtdc3RyaW5nIHsKKwkvLyBgSW1wb3J0c2AgaXMgdXNlZCB3aGVuIHZlcnNpb24gPT0gaS5uZXh0VmVyc2lvbigpIG9yYHZlcnNpb25zYCBpcyBkZWZpbmVkIGluc3RlYWQgb2YgYHZlcnNpb25zX3dpdGhfaW5mb2AKKwlpbXBvcnRzU3JjIDo9IGkucHJvcGVydGllcy5JbXBvcnRzCisJZm9yIF8sIHYgOj0gcmFuZ2UgaS5wcm9wZXJ0aWVzLlZlcnNpb25zX3dpdGhfaW5mbyB7CisJCWlmIHYuVmVyc2lvbiA9PSB2ZXJzaW9uIHsKKwkJCWltcG9ydHNTcmMgPSB2LkltcG9ydHMKKwkJCWJyZWFrCisJCX0KKwl9CisJaW1wb3J0cyA6PSBtYWtlKFtdc3RyaW5nLCBsZW4oaW1wb3J0c1NyYykpCisJY29weShpbXBvcnRzLCBpbXBvcnRzU3JjKQorCisJcmV0dXJuIGltcG9ydHMKK30KKworZnVuYyAoaSAqYWlkbEludGVyZmFjZSkgZ2V0SW1wb3J0cyh2ZXJzaW9uIHN0cmluZykgbWFwW3N0cmluZ11zdHJpbmcgeworCWltcG9ydHMgOj0gbWFrZShtYXBbc3RyaW5nXXN0cmluZykKKwlpbXBvcnRzX3NyYyA6PSBpLmdldEltcG9ydHNGb3JWZXJzaW9uKHZlcnNpb24pCisKKwl1c2VMYXRlc3RTdGFibGUgOj0gIXByb3B0b29scy5Cb29sKGkucHJvcGVydGllcy5VbnN0YWJsZSkgJiYgdmVyc2lvbiAhPSAiIiAmJiB2ZXJzaW9uICE9IGkubmV4dFZlcnNpb24oKQorCWZvciBfLCBpbXBvcnRTdHJpbmcgOj0gcmFuZ2UgaW1wb3J0c19zcmMgeworCQluYW1lLCB0YXJnZXRWZXJzaW9uIDo9IHBhcnNlTW9kdWxlV2l0aFZlcnNpb24oaW1wb3J0U3RyaW5nKQorCQlpZiB0YXJnZXRWZXJzaW9uID09ICIiICYmIHVzZUxhdGVzdFN0YWJsZSB7CisJCQl0YXJnZXRWZXJzaW9uID0gImxhdGVzdCIKKwkJfQorCQlpbXBvcnRzW25hbWVdID0gdGFyZ2V0VmVyc2lvbgorCX0KKwlyZXR1cm4gaW1wb3J0cworfQorCisvLyBnZW5lcmF0ZSBwcmVwcm9jZXNzZWQuYWlkbCB3aGljaCBjb250YWlucyBvbmx5IHR5cGVzIHdpdGggZXZhbHVhdGVkIGNvbnN0YW50cy4KKy8vICJpbXBvcnRzIiB3aWxsIHVzZSBwcmVwcm9jZXNzZWQuYWlkbCB3aXRoIC1wIGZsYWcgdG8gYXZvaWQgcGFyc2luZyB0aGUgZW50aXJlIHRyYW5zaXRpdmUgbGlzdAorLy8gb2YgZGVwZW5kZW5jaWVzLgorZnVuYyAoaSAqYWlkbEludGVyZmFjZSkgYnVpbGRQcmVwcm9jZXNzZWQoY3R4IGFuZHJvaWQuTW9kdWxlQ29udGV4dCwgdmVyc2lvbiBzdHJpbmcpIGFuZHJvaWQuV3JpdGFibGVQYXRoIHsKKwlkZXBzIDo9IGdldERlcHMoY3R4LCBpLmdldEltcG9ydHModmVyc2lvbikpCisKKwlwcmVwcm9jZXNzZWQgOj0gYW5kcm9pZC5QYXRoRm9yTW9kdWxlT3V0KGN0eCwgdmVyc2lvbiwgInByZXByb2Nlc3NlZC5haWRsIikKKwlyYiA6PSBhbmRyb2lkLk5ld1J1bGVCdWlsZGVyKHBjdHgsIGN0eCkKKwlzcmNzLCByb290X2RpciA6PSBpLnNyY3NGb3JWZXJzaW9uKGN0eCwgdmVyc2lvbikKKworCWlmIGxlbihzcmNzKSA9PSAwIHsKKwkJY3R4LlByb3BlcnR5RXJyb3JmKCJzcmNzIiwgIk5vIHNvdXJjZXMgZm9yIGEgcHJldmlvdXMgdmVyc2lvbiBpbiAldi4gV2FzIGEgdmVyc2lvbiBtYW51YWxseSBhZGRlZCB0byAuYnAgZmlsZT8gVGhpcyBpcyBhZGRlZCBhdXRvbWF0aWNhbGx5IGJ5IDxtb2R1bGU+LWZyZWV6ZS1hcGkuIiwgcm9vdF9kaXIpCisJfQorCisJcGF0aHMsIGltcG9ydHMgOj0gZ2V0UGF0aHMoY3R4LCBzcmNzLCByb290X2RpcikKKworCXByZXByb2Nlc3NDb21tYW5kIDo9IHJiLkNvbW1hbmQoKS5CdWlsdFRvb2woImFpZGwiKS4KKwkJRmxhZ1dpdGhPdXRwdXQoIi0tcHJlcHJvY2VzcyAiLCBwcmVwcm9jZXNzZWQpLgorCQlGbGFnKCItLXN0cnVjdHVyZWQiKQorCWlmIGkucHJvcGVydGllcy5TdGFiaWxpdHkgIT0gbmlsIHsKKwkJcHJlcHJvY2Vzc0NvbW1hbmQuRmxhZ1dpdGhBcmcoIi0tc3RhYmlsaXR5ICIsICppLnByb3BlcnRpZXMuU3RhYmlsaXR5KQorCX0KKwlwcmVwcm9jZXNzQ29tbWFuZC5GbGFnRm9yRWFjaElucHV0KCItcCIsIGRlcHMucHJlcHJvY2Vzc2VkKQorCXByZXByb2Nlc3NDb21tYW5kLkZsYWdGb3JFYWNoQXJnKCItSSIsIGNvbmNhdChpbXBvcnRzLCBpLnByb3BlcnRpZXMuSW5jbHVkZV9kaXJzKSkKKwlwcmVwcm9jZXNzQ29tbWFuZC5JbnB1dHMocGF0aHMpCisJbmFtZSA6PSBpLkJhc2VNb2R1bGVOYW1lKCkKKwlpZiB2ZXJzaW9uICE9ICIiIHsKKwkJbmFtZSArPSAiLyIgKyB2ZXJzaW9uCisJfQorCXJiLkJ1aWxkKCJleHBvcnRfIituYW1lLCAiZXhwb3J0IHR5cGVzIGZvciAiK25hbWUpCisJcmV0dXJuIHByZXByb2Nlc3NlZAorfQorCiBmdW5jIChpICphaWRsSW50ZXJmYWNlKSBEZXBzTXV0YXRvcihjdHggYW5kcm9pZC5Cb3R0b21VcE11dGF0b3JDb250ZXh0KSB7CiAJY3R4LkFkZFJldmVyc2VEZXBlbmRlbmN5KGN0eC5Nb2R1bGUoKSwgbmlsLCBhaWRsTWV0YWRhdGFTaW5nbGV0b25OYW1lKQogfQogCi12YXIgKAotCWFpZGxJbnRlcmZhY2VzS2V5ICAgPSBhbmRyb2lkLk5ld09uY2VLZXkoImFpZGxJbnRlcmZhY2VzIikKLQl1bnN0YWJsZU1vZHVsZXNLZXkgID0gYW5kcm9pZC5OZXdPbmNlS2V5KCJ1bnN0YWJsZU1vZHVsZXMiKQotCWFpZGxEZXBzS2V5ICAgICAgICAgPSBhbmRyb2lkLk5ld09uY2VLZXkoImFpZGxEZXBzIikKLQlhaWRsSW50ZXJmYWNlTXV0ZXggIHN5bmMuTXV0ZXgKLQl1bnN0YWJsZU1vZHVsZU11dGV4IHN5bmMuTXV0ZXgKLQlhaWRsRGVwc011dGV4ICAgICAgIHN5bmMuUldNdXRleAotKQotCi1mdW5jIGFpZGxJbnRlcmZhY2VzKGNvbmZpZyBhbmRyb2lkLkNvbmZpZykgKltdKmFpZGxJbnRlcmZhY2UgewotCXJldHVybiBjb25maWcuT25jZShhaWRsSW50ZXJmYWNlc0tleSwgZnVuYygpIGludGVyZmFjZXt9IHsKLQkJcmV0dXJuICZbXSphaWRsSW50ZXJmYWNle30KLQl9KS4oKltdKmFpZGxJbnRlcmZhY2UpCi19Ci0KLWZ1bmMgdW5zdGFibGVNb2R1bGVzKGNvbmZpZyBhbmRyb2lkLkNvbmZpZykgKltdc3RyaW5nIHsKLQlyZXR1cm4gY29uZmlnLk9uY2UodW5zdGFibGVNb2R1bGVzS2V5LCBmdW5jKCkgaW50ZXJmYWNle30gewotCQlyZXR1cm4gJltdc3RyaW5ne30KLQl9KS4oKltdc3RyaW5nKQotfQotCi10eXBlIERlcEluZm8gc3RydWN0IHsKLQlpZmFjZU5hbWUgc3RyaW5nCi0JdmVyTGFuZyAgIHN0cmluZwotCWlzU291cmNlICBib29sCi19Ci0KLWZ1bmMgKGQgRGVwSW5mbykgbW9kdWxlTmFtZSgpIHN0cmluZyB7Ci0JbmFtZSA6PSBkLmlmYWNlTmFtZSArIGQudmVyTGFuZwotCWlmIGQuaXNTb3VyY2UgewotCQluYW1lICs9ICItc291cmNlIgotCX0KLQlyZXR1cm4gbmFtZQotfQotCi1mdW5jIGFpZGxEZXBzKGNvbmZpZyBhbmRyb2lkLkNvbmZpZykgbWFwW2FuZHJvaWQuTW9kdWxlXVtdRGVwSW5mbyB7Ci0JcmV0dXJuIGNvbmZpZy5PbmNlKGFpZGxEZXBzS2V5LCBmdW5jKCkgaW50ZXJmYWNle30gewotCQlyZXR1cm4gbWFrZShtYXBbYW5kcm9pZC5Nb2R1bGVdW11EZXBJbmZvKQotCX0pLihtYXBbYW5kcm9pZC5Nb2R1bGVdW11EZXBJbmZvKQotfQotCiBmdW5jIGFpZGxJbnRlcmZhY2VGYWN0b3J5KCkgYW5kcm9pZC5Nb2R1bGUgewogCWkgOj0gJmFpZGxJbnRlcmZhY2V7fQogCWkuQWRkUHJvcGVydGllcygmaS5wcm9wZXJ0aWVzKQpAQCAtODM0LDEyICs5NjUsMyBAQAogCWFuZHJvaWQuQWRkTG9hZEhvb2soaSwgZnVuYyhjdHggYW5kcm9pZC5Mb2FkSG9va0NvbnRleHQpIHsgYWlkbEludGVyZmFjZUhvb2soY3R4LCBpKSB9KQogCXJldHVybiBpCiB9Ci0KLWZ1bmMgbG9va3VwSW50ZXJmYWNlKG5hbWUgc3RyaW5nLCBjb25maWcgYW5kcm9pZC5Db25maWcpICphaWRsSW50ZXJmYWNlIHsKLQlmb3IgXywgaSA6PSByYW5nZSAqYWlkbEludGVyZmFjZXMoY29uZmlnKSB7Ci0JCWlmIGkuTW9kdWxlQmFzZS5OYW1lKCkgPT0gbmFtZSB7Ci0JCQlyZXR1cm4gaQotCQl9Ci0JfQotCXJldHVybiBuaWwKLX0KZGlmZiAtLWdpdCBhL2J1aWxkL2FpZGxfaW50ZXJmYWNlX2JhY2tlbmRzLmdvIGIvYnVpbGQvYWlkbF9pbnRlcmZhY2VfYmFja2VuZHMuZ28KaW5kZXggMjFmMGEzMS4uNjJhMTY3YyAxMDA2NDQKLS0tIGEvYnVpbGQvYWlkbF9pbnRlcmZhY2VfYmFja2VuZHMuZ28KKysrIGIvYnVpbGQvYWlkbF9pbnRlcmZhY2VfYmFja2VuZHMuZ28KQEAgLTI2LDE2ICsyNiwxNiBAQAogCSJnaXRodWIuY29tL2dvb2dsZS9ibHVlcHJpbnQvcHJvcHRvb2xzIgogKQogCi1mdW5jIGFkZExpYnJhcnkobWN0eCBhbmRyb2lkLkxvYWRIb29rQ29udGV4dCwgaSAqYWlkbEludGVyZmFjZSwgdmVyc2lvbiBzdHJpbmcsIGxhbmcgc3RyaW5nKSBzdHJpbmcgeworZnVuYyBhZGRMaWJyYXJ5KG1jdHggYW5kcm9pZC5Mb2FkSG9va0NvbnRleHQsIGkgKmFpZGxJbnRlcmZhY2UsIHZlcnNpb24gc3RyaW5nLCBsYW5nIHN0cmluZywgbm90RnJvemVuIGJvb2wpIHN0cmluZyB7CiAJaWYgbGFuZyA9PSBsYW5nSmF2YSB7Ci0JCXJldHVybiBhZGRKYXZhTGlicmFyeShtY3R4LCBpLCB2ZXJzaW9uKQorCQlyZXR1cm4gYWRkSmF2YUxpYnJhcnkobWN0eCwgaSwgdmVyc2lvbiwgbm90RnJvemVuKQogCX0gZWxzZSBpZiBsYW5nID09IGxhbmdSdXN0IHsKLQkJcmV0dXJuIGFkZFJ1c3RMaWJyYXJ5KG1jdHgsIGksIHZlcnNpb24pCisJCXJldHVybiBhZGRSdXN0TGlicmFyeShtY3R4LCBpLCB2ZXJzaW9uLCBub3RGcm96ZW4pCiAJfQotCXJldHVybiBhZGRDcHBMaWJyYXJ5KG1jdHgsIGksIHZlcnNpb24sIGxhbmcpCisJcmV0dXJuIGFkZENwcExpYnJhcnkobWN0eCwgaSwgdmVyc2lvbiwgbGFuZywgbm90RnJvemVuKQogfQogCi1mdW5jIGFkZENwcExpYnJhcnkobWN0eCBhbmRyb2lkLkxvYWRIb29rQ29udGV4dCwgaSAqYWlkbEludGVyZmFjZSwgdmVyc2lvbiBzdHJpbmcsIGxhbmcgc3RyaW5nKSBzdHJpbmcgeworZnVuYyBhZGRDcHBMaWJyYXJ5KG1jdHggYW5kcm9pZC5Mb2FkSG9va0NvbnRleHQsIGkgKmFpZGxJbnRlcmZhY2UsIHZlcnNpb24gc3RyaW5nLCBsYW5nIHN0cmluZywgbm90RnJvemVuIGJvb2wpIHN0cmluZyB7CiAJY3BwU291cmNlR2VuIDo9IGkudmVyc2lvbmVkTmFtZSh2ZXJzaW9uKSArICItIiArIGxhbmcgKyAiLXNvdXJjZSIKIAljcHBNb2R1bGVHZW4gOj0gaS52ZXJzaW9uZWROYW1lKHZlcnNpb24pICsgIi0iICsgbGFuZwogCkBAIC03Myw0MSArNzMsMzAgQEAKIAltY3R4LkNyZWF0ZU1vZHVsZShhaWRsR2VuRmFjdG9yeSwgJm5hbWVQcm9wZXJ0aWVzewogCQlOYW1lOiBwcm9wdG9vbHMuU3RyaW5nUHRyKGNwcFNvdXJjZUdlbiksCiAJfSwgJmFpZGxHZW5Qcm9wZXJ0aWVzewotCQlTcmNzOiAgICAgICAgICAgICAgICAgIHNyY3MsCi0JCUFpZGxSb290OiAgICAgICAgICAgICAgYWlkbFJvb3QsCi0JCUlzVG9UOiAgICAgICAgICAgICAgICAgdmVyc2lvbiA9PSBpLm5leHRWZXJzaW9uKCksCi0JCUltcG9ydHNXaXRob3V0VmVyc2lvbjogaS5wcm9wZXJ0aWVzLkltcG9ydHNXaXRob3V0VmVyc2lvbiwKLQkJU3RhYmlsaXR5OiAgICAgICAgICAgICBpLnByb3BlcnRpZXMuU3RhYmlsaXR5LAotCQlMYW5nOiAgICAgICAgICAgICAgICAgIGxhbmcsCi0JCUJhc2VOYW1lOiAgICAgICAgICAgICAgaS5Nb2R1bGVCYXNlLk5hbWUoKSwKLQkJR2VuTG9nOiAgICAgICAgICAgICAgICBnZW5Mb2csCi0JCVZlcnNpb246ICAgICAgICAgICAgICAgaS52ZXJzaW9uRm9yQWlkbEdlblJ1bGUodmVyc2lvbiksCi0JCUdlblRyYWNlOiAgICAgICAgICAgICAgZ2VuVHJhY2UsCi0JCVVuc3RhYmxlOiAgICAgICAgICAgICAgaS5wcm9wZXJ0aWVzLlVuc3RhYmxlLAotCQlWaXNpYmlsaXR5OiAgICAgICAgICAgIHNyY3NWaXNpYmlsaXR5KG1jdHgsIGxhbmcpLAotCQlGbGFnczogICAgICAgICAgICAgICAgIGkuZmxhZ3NGb3JBaWRsR2VuUnVsZSh2ZXJzaW9uKSwKKwkJU3JjczogICAgICAgICAgICBzcmNzLAorCQlBaWRsUm9vdDogICAgICAgIGFpZGxSb290LAorCQlJbXBvcnRzOiAgICAgICAgIGkuZ2V0SW1wb3J0c0ZvclZlcnNpb24odmVyc2lvbiksCisJCVN0YWJpbGl0eTogICAgICAgaS5wcm9wZXJ0aWVzLlN0YWJpbGl0eSwKKwkJTWluX3Nka192ZXJzaW9uOiBpLm1pblNka1ZlcnNpb24obGFuZyksCisJCUxhbmc6ICAgICAgICAgICAgbGFuZywKKwkJQmFzZU5hbWU6ICAgICAgICBpLk1vZHVsZUJhc2UuTmFtZSgpLAorCQlHZW5Mb2c6ICAgICAgICAgIGdlbkxvZywKKwkJVmVyc2lvbjogICAgICAgICBpLnZlcnNpb25Gb3JJbml0VmVyc2lvbkNvbXBhdCh2ZXJzaW9uKSwKKwkJR2VuVHJhY2U6ICAgICAgICBnZW5UcmFjZSwKKwkJVW5zdGFibGU6ICAgICAgICBpLnByb3BlcnRpZXMuVW5zdGFibGUsCisJCU5vdEZyb3plbjogICAgICAgbm90RnJvemVuLAorCQlGbGFnczogICAgICAgICAgIGkuZmxhZ3NGb3JBaWRsR2VuUnVsZSh2ZXJzaW9uKSwKIAl9KQogCiAJaW1wb3J0RXhwb3J0RGVwZW5kZW5jaWVzIDo9IFtdc3RyaW5ne30KIAl2YXIgc2hhcmVkTGliRGVwZW5kZW5jeSBbXXN0cmluZwogCXZhciBoZWFkZXJMaWJzIFtdc3RyaW5nCiAJdmFyIHNka1ZlcnNpb24gKnN0cmluZwotCXZhciBtaW5TZGtWZXJzaW9uICpzdHJpbmcKIAl2YXIgc3RsICpzdHJpbmcKIAl2YXIgY3BwX3N0ZCAqc3RyaW5nCiAJdmFyIGhvc3RTdXBwb3J0ZWQgKmJvb2wKIAl2YXIgYWRkQ2ZsYWdzIFtdc3RyaW5nCiAJdGFyZ2V0UHJvcCA6PSBjY1RhcmdldFByb3BlcnRpZXN7Ci0JCS8vIEN1cnJlbnRseSBuZWNlc3NhcnkgZm9yIGhvc3QgYnVpbGRzCi0JCS8vIFRPRE8oYi8zMTU1OTA5NSk6IGJpb25pYyBvbiBob3N0IHNob3VsZCBkZWZpbmUgdGhpcwotCQkvLyBUT0RPKGIvMTQ2NDM2MjUxKTogZGVmYXVsdCBpc24ndCBhcHBsaWVkIGJlY2F1c2UgdGhlIG1vZHVsZSBpcyBjcmVhdGVkCi0JCS8vIGluIFByZUFyY2hNdXRhdG9ycywgd2hlbiBpbXBvcnQgYmVoYXZpb3IgYmVjb21lcyBleHBsaWNpdCwgdGhlIGxvZ2ljIGNhbgotCQkvLyBiZSBtb3ZlZCBiYWNrIHRvIExvYWRIb29rCi0JCUhvc3Q6IGhvc3RQcm9wZXJ0aWVze0NmbGFnczogW11zdHJpbmd7Ci0JCQkiLURfX0lOVFJPRFVDRURfSU4obik9IiwKLQkJCSItRF9fYXNzZXJ0KGEsYixjKT0iLAotCQkJLy8gV2Ugd2FudCBhbGwgdGhlIEFQSXMgdG8gYmUgYXZhaWxhYmxlIG9uIHRoZSBob3N0LgotCQkJIi1EX19BTkRST0lEX0FQSV9fPTEwMDAwIn19LAogCQlEYXJ3aW46IGRhcndpblByb3BlcnRpZXN7RW5hYmxlZDogcHJvcHRvb2xzLkJvb2xQdHIoZmFsc2UpfSwKIAl9CiAKQEAgLTExNyw3ICsxMDYsNiBAQAogCQkJc2hhcmVkTGliRGVwZW5kZW5jeSA9IGFwcGVuZChzaGFyZWRMaWJEZXBlbmRlbmN5LCAibGliY3V0aWxzIikKIAkJfQogCQlob3N0U3VwcG9ydGVkID0gaS5wcm9wZXJ0aWVzLkhvc3Rfc3VwcG9ydGVkCi0JCW1pblNka1ZlcnNpb24gPSBpLnByb3BlcnRpZXMuQmFja2VuZC5DcHAuTWluX3Nka192ZXJzaW9uCiAJfSBlbHNlIGlmIGxhbmcgPT0gbGFuZ05kayB8fCBsYW5nID09IGxhbmdOZGtQbGF0Zm9ybSB7CiAJCWltcG9ydEV4cG9ydERlcGVuZGVuY2llcyA9IGFwcGVuZChpbXBvcnRFeHBvcnREZXBlbmRlbmNpZXMsICJsaWJiaW5kZXJfbmRrIikKIAkJbm9uQXBwUHJvcHMgOj0gaW1hZ2VQcm9wZXJ0aWVzewpAQCAtMTMyLDEwICsxMjAsMTMgQEAKIAkJdGFyZ2V0UHJvcC5QbGF0Zm9ybSA9IG5vbkFwcFByb3BzCiAJCXRhcmdldFByb3AuVmVuZG9yID0gbm9uQXBwUHJvcHMKIAkJdGFyZ2V0UHJvcC5Qcm9kdWN0ID0gbm9uQXBwUHJvcHMKLQkJbWluU2RrVmVyc2lvbiA9IGkucHJvcGVydGllcy5CYWNrZW5kLk5kay5NaW5fc2RrX3ZlcnNpb24KIAkJaG9zdFN1cHBvcnRlZCA9IGkucHJvcGVydGllcy5Ib3N0X3N1cHBvcnRlZAogCQlpZiBsYW5nID09IGxhbmdOZGsgJiYgaS5zaG91bGRHZW5lcmF0ZUFwcE5ka0JhY2tlbmQoKSB7Ci0JCQlzZGtWZXJzaW9uID0gcHJvcHRvb2xzLlN0cmluZ1B0cigiY3VycmVudCIpCisJCQlzZGtWZXJzaW9uID0gaS5wcm9wZXJ0aWVzLkJhY2tlbmQuTmRrLlNka192ZXJzaW9uCisJCQlpZiBzZGtWZXJzaW9uID09IG5pbCB7CisJCQkJc2RrVmVyc2lvbiA9IHByb3B0b29scy5TdHJpbmdQdHIoImN1cnJlbnQiKQorCQkJfQorCiAJCQkvLyBEb24ndCB3b3JyeSEgVGhpcyBtYXBzIHRvIGxpYmMrKy5zbyBmb3IgdGhlIHBsYXRmb3JtIHZhcmlhbnQuCiAJCQlzdGwgPSBwcm9wdG9vbHMuU3RyaW5nUHRyKCJjKytfc2hhcmVkIikKIAkJfQpAQCAtMTQ2LDYgKzEzNyw3IEBACiAJdmVuZG9yQXZhaWxhYmxlIDo9IGkucHJvcGVydGllcy5WZW5kb3JfYXZhaWxhYmxlCiAJb2RtQXZhaWxhYmxlIDo9IGkucHJvcGVydGllcy5PZG1fYXZhaWxhYmxlCiAJcHJvZHVjdEF2YWlsYWJsZSA6PSBpLnByb3BlcnRpZXMuUHJvZHVjdF9hdmFpbGFibGUKKwlyZWNvdmVyeUF2YWlsYWJsZSA6PSBpLnByb3BlcnRpZXMuUmVjb3ZlcnlfYXZhaWxhYmxlCiAJaWYgbGFuZyA9PSBsYW5nQ3BwIHsKIAkJLy8gVmVuZG9yIGFuZCBwcm9kdWN0IG1vZHVsZXMgY2Fubm90IHVzZSB0aGUgbGliYmluZGVyIChjcHApIGJhY2tlbmQgb2YgQUlETCBpbiBhCiAJCS8vIHdheSB0aGF0IGlzIHN0YWJsZS4gU28sIGluIG9yZGVyIHRvIHByZXZlbnQgYWNjaWRlbnRhbCB1c2FnZSBvZiB0aGVzZSBsaWJyYXJ5IGJ5CkBAIC0xNjgsMTIgKzE2MCwxNCBAQAogCQlMYW5nOiAgICAgICAgICAgICAgbGFuZywKIAkJQWlkbEludGVyZmFjZU5hbWU6IGkuTW9kdWxlQmFzZS5OYW1lKCksCiAJCVZlcnNpb246ICAgICAgICAgICB2ZXJzaW9uLAorCQlJbXBvcnRzOiAgICAgICAgICAgaS5nZXRJbXBvcnRzRm9yVmVyc2lvbih2ZXJzaW9uKSwKIAkJTW9kdWxlUHJvcGVydGllczogW11pbnRlcmZhY2V7fXsKIAkJCSZjY1Byb3BlcnRpZXN7CiAJCQkJTmFtZTogICAgICAgICAgICAgICAgICAgICAgcHJvcHRvb2xzLlN0cmluZ1B0cihjcHBNb2R1bGVHZW4pLAogCQkJCVZlbmRvcl9hdmFpbGFibGU6ICAgICAgICAgIHZlbmRvckF2YWlsYWJsZSwKIAkJCQlPZG1fYXZhaWxhYmxlOiAgICAgICAgICAgICBvZG1BdmFpbGFibGUsCiAJCQkJUHJvZHVjdF9hdmFpbGFibGU6ICAgICAgICAgcHJvZHVjdEF2YWlsYWJsZSwKKwkJCQlSZWNvdmVyeV9hdmFpbGFibGU6ICAgICAgICByZWNvdmVyeUF2YWlsYWJsZSwKIAkJCQlIb3N0X3N1cHBvcnRlZDogICAgICAgICAgICBob3N0U3VwcG9ydGVkLAogCQkJCURlZmF1bHRzOiAgICAgICAgICAgICAgICAgIFtdc3RyaW5neyJhaWRsLWNwcC1tb2R1bGUtZGVmYXVsdHMifSwKIAkJCQlEb3VibGVfbG9hZGFibGU6ICAgICAgICAgICBpLnByb3BlcnRpZXMuRG91YmxlX2xvYWRhYmxlLApAQCAtMTg4LDggKzE4Miw3IEBACiAJCQkJQ3BwX3N0ZDogICAgICAgICAgICAgICAgICAgY3BwX3N0ZCwKIAkJCQlDZmxhZ3M6ICAgICAgICAgICAgICAgICAgICBhcHBlbmQoYWRkQ2ZsYWdzLCAiLVdleHRyYSIsICItV2FsbCIsICItV2Vycm9yIiwgIi1XZXh0cmEtc2VtaSIpLAogCQkJCUFwZXhfYXZhaWxhYmxlOiAgICAgICAgICAgIGNvbW1vblByb3BlcnRpZXMuQXBleF9hdmFpbGFibGUsCi0JCQkJTWluX3Nka192ZXJzaW9uOiAgICAgICAgICAgbWluU2RrVmVyc2lvbiwKLQkJCQlVc2VBcGV4TmFtZU1hY3JvOiAgICAgICAgICB0cnVlLAorCQkJCU1pbl9zZGtfdmVyc2lvbjogICAgICAgICAgIGkubWluU2RrVmVyc2lvbihsYW5nKSwKIAkJCQlUYXJnZXQ6ICAgICAgICAgICAgICAgICAgICB0YXJnZXRQcm9wLAogCQkJCVRpZHk6ICAgICAgICAgICAgICAgICAgICAgIHByb3B0b29scy5Cb29sUHRyKHRydWUpLAogCQkJCS8vIERvIHRoZSB0aWR5IGNoZWNrIG9ubHkgZm9yIHRoZSBnZW5lcmF0ZWQgaGVhZGVycwpAQCAtMjA0LDcgKzE5Nyw3IEBACiAJcmV0dXJuIGNwcE1vZHVsZUdlbgogfQogCi1mdW5jIGFkZEphdmFMaWJyYXJ5KG1jdHggYW5kcm9pZC5Mb2FkSG9va0NvbnRleHQsIGkgKmFpZGxJbnRlcmZhY2UsIHZlcnNpb24gc3RyaW5nKSBzdHJpbmcgeworZnVuYyBhZGRKYXZhTGlicmFyeShtY3R4IGFuZHJvaWQuTG9hZEhvb2tDb250ZXh0LCBpICphaWRsSW50ZXJmYWNlLCB2ZXJzaW9uIHN0cmluZywgbm90RnJvemVuIGJvb2wpIHN0cmluZyB7CiAJamF2YVNvdXJjZUdlbiA6PSBpLnZlcnNpb25lZE5hbWUodmVyc2lvbikgKyAiLWphdmEtc291cmNlIgogCWphdmFNb2R1bGVHZW4gOj0gaS52ZXJzaW9uZWROYW1lKHZlcnNpb24pICsgIi1qYXZhIgogCXNyY3MsIGFpZGxSb290IDo9IGkuc3Jjc0ZvclZlcnNpb24obWN0eCwgdmVyc2lvbikKQEAgLTIxNCwyOCArMjA3LDM0IEBACiAJCS8vIERvbid0IGNyZWF0ZSBhIGxpYnJhcnkgZm9yIHRoZSB5ZXQtdG8tYmUtZnJvemVuIHZlcnNpb24uCiAJCXJldHVybiAiIgogCX0KLQorCW1pblNka1ZlcnNpb24gOj0gaS5taW5TZGtWZXJzaW9uKGxhbmdKYXZhKQogCXNka1ZlcnNpb24gOj0gaS5wcm9wZXJ0aWVzLkJhY2tlbmQuSmF2YS5TZGtfdmVyc2lvbgogCWlmICFwcm9wdG9vbHMuQm9vbChpLnByb3BlcnRpZXMuQmFja2VuZC5KYXZhLlBsYXRmb3JtX2FwaXMpICYmIHNka1ZlcnNpb24gPT0gbmlsIHsKIAkJLy8gcGxhdGZvcm0gYXBpcyByZXF1aXJlcyBubyBkZWZhdWx0CiAJCXNka1ZlcnNpb24gPSBwcm9wdG9vbHMuU3RyaW5nUHRyKCJzeXN0ZW1fY3VycmVudCIpCiAJfQorCS8vIHVzZSBzZGtWZXJzaW9uIGlmIG1pblNka1ZlcnNpb24gaXMgbm90IHNldAorCWlmIHNka1ZlcnNpb24gIT0gbmlsICYmIG1pblNka1ZlcnNpb24gPT0gbmlsIHsKKwkJbWluU2RrVmVyc2lvbiA9IHByb3B0b29scy5TdHJpbmdQdHIoYW5kcm9pZC5TZGtTcGVjRnJvbShtY3R4LCAqc2RrVmVyc2lvbikuQXBpTGV2ZWwuU3RyaW5nKCkpCisJfQogCiAJbWN0eC5DcmVhdGVNb2R1bGUoYWlkbEdlbkZhY3RvcnksICZuYW1lUHJvcGVydGllc3sKIAkJTmFtZTogcHJvcHRvb2xzLlN0cmluZ1B0cihqYXZhU291cmNlR2VuKSwKIAl9LCAmYWlkbEdlblByb3BlcnRpZXN7Ci0JCVNyY3M6ICAgICAgICAgICAgICAgICAgc3JjcywKLQkJQWlkbFJvb3Q6ICAgICAgICAgICAgICBhaWRsUm9vdCwKLQkJSXNUb1Q6ICAgICAgICAgICAgICAgICB2ZXJzaW9uID09IGkubmV4dFZlcnNpb24oKSwKLQkJSW1wb3J0c1dpdGhvdXRWZXJzaW9uOiBpLnByb3BlcnRpZXMuSW1wb3J0c1dpdGhvdXRWZXJzaW9uLAotCQlTdGFiaWxpdHk6ICAgICAgICAgICAgIGkucHJvcGVydGllcy5TdGFiaWxpdHksCi0JCUxhbmc6ICAgICAgICAgICAgICAgICAgbGFuZ0phdmEsCi0JCUJhc2VOYW1lOiAgICAgICAgICAgICAgaS5Nb2R1bGVCYXNlLk5hbWUoKSwKLQkJVmVyc2lvbjogICAgICAgICAgICAgICBpLnZlcnNpb25Gb3JBaWRsR2VuUnVsZSh2ZXJzaW9uKSwKLQkJR2VuVHJhY2U6ICAgICAgICAgICAgICBwcm9wdG9vbHMuQm9vbChpLnByb3BlcnRpZXMuR2VuX3RyYWNlKSwKLQkJVW5zdGFibGU6ICAgICAgICAgICAgICBpLnByb3BlcnRpZXMuVW5zdGFibGUsCi0JCVZpc2liaWxpdHk6ICAgICAgICAgICAgc3Jjc1Zpc2liaWxpdHkobWN0eCwgbGFuZ0phdmEpLAotCQlGbGFnczogICAgICAgICAgICAgICAgIGkuZmxhZ3NGb3JBaWRsR2VuUnVsZSh2ZXJzaW9uKSwKKwkJU3JjczogICAgICAgICAgICBzcmNzLAorCQlBaWRsUm9vdDogICAgICAgIGFpZGxSb290LAorCQlJbXBvcnRzOiAgICAgICAgIGkuZ2V0SW1wb3J0c0ZvclZlcnNpb24odmVyc2lvbiksCisJCVN0YWJpbGl0eTogICAgICAgaS5wcm9wZXJ0aWVzLlN0YWJpbGl0eSwKKwkJTWluX3Nka192ZXJzaW9uOiBtaW5TZGtWZXJzaW9uLAorCQlQbGF0Zm9ybV9hcGlzOiAgIHByb3B0b29scy5Cb29sKGkucHJvcGVydGllcy5CYWNrZW5kLkphdmEuUGxhdGZvcm1fYXBpcyksCisJCUxhbmc6ICAgICAgICAgICAgbGFuZ0phdmEsCisJCUJhc2VOYW1lOiAgICAgICAgaS5Nb2R1bGVCYXNlLk5hbWUoKSwKKwkJVmVyc2lvbjogICAgICAgICB2ZXJzaW9uLAorCQlHZW5ScGM6ICAgICAgICAgIHByb3B0b29scy5Cb29sKGkucHJvcGVydGllcy5CYWNrZW5kLkphdmEuR2VuX3JwYyksCisJCUdlblRyYWNlOiAgICAgICAgcHJvcHRvb2xzLkJvb2woaS5wcm9wZXJ0aWVzLkdlbl90cmFjZSksCisJCVVuc3RhYmxlOiAgICAgICAgaS5wcm9wZXJ0aWVzLlVuc3RhYmxlLAorCQlOb3RGcm96ZW46ICAgICAgIG5vdEZyb3plbiwKKwkJRmxhZ3M6ICAgICAgICAgICBpLmZsYWdzRm9yQWlkbEdlblJ1bGUodmVyc2lvbiksCiAJfSkKIAogCW1jdHguQ3JlYXRlTW9kdWxlKGFpZGxJbXBsZW1lbnRhdGlvbkdlbmVyYXRvckZhY3RvcnksICZuYW1lUHJvcGVydGllc3sKQEAgLTI0NCw2ICsyNDMsNyBAQAogCQlMYW5nOiAgICAgICAgICAgICAgbGFuZ0phdmEsCiAJCUFpZGxJbnRlcmZhY2VOYW1lOiBpLk1vZHVsZUJhc2UuTmFtZSgpLAogCQlWZXJzaW9uOiAgICAgICAgICAgdmVyc2lvbiwKKwkJSW1wb3J0czogICAgICAgICAgIGkuZ2V0SW1wb3J0c0ZvclZlcnNpb24odmVyc2lvbiksCiAJCU1vZHVsZVByb3BlcnRpZXM6IFtdaW50ZXJmYWNle317JmphdmFQcm9wZXJ0aWVzewogCQkJTmFtZTogICAgICAgICAgICBwcm9wdG9vbHMuU3RyaW5nUHRyKGphdmFNb2R1bGVHZW4pLAogCQkJSW5zdGFsbGFibGU6ICAgICBwcm9wdG9vbHMuQm9vbFB0cih0cnVlKSwKQEAgLTI1MiwxNCArMjUyLDE0IEBACiAJCQlQbGF0Zm9ybV9hcGlzOiAgIGkucHJvcGVydGllcy5CYWNrZW5kLkphdmEuUGxhdGZvcm1fYXBpcywKIAkJCVNyY3M6ICAgICAgICAgICAgW11zdHJpbmd7IjoiICsgamF2YVNvdXJjZUdlbn0sCiAJCQlBcGV4X2F2YWlsYWJsZTogIGkucHJvcGVydGllcy5CYWNrZW5kLkphdmEuQXBleF9hdmFpbGFibGUsCi0JCQlNaW5fc2RrX3ZlcnNpb246IGkucHJvcGVydGllcy5CYWNrZW5kLkphdmEuTWluX3Nka192ZXJzaW9uLAorCQkJTWluX3Nka192ZXJzaW9uOiBpLm1pblNka1ZlcnNpb24obGFuZ0phdmEpLAogCQl9LCAmaS5wcm9wZXJ0aWVzLkJhY2tlbmQuSmF2YS5MaW50UHJvcGVydGllc30sCiAJfSkKIAogCXJldHVybiBqYXZhTW9kdWxlR2VuCiB9CiAKLWZ1bmMgYWRkUnVzdExpYnJhcnkobWN0eCBhbmRyb2lkLkxvYWRIb29rQ29udGV4dCwgaSAqYWlkbEludGVyZmFjZSwgdmVyc2lvbiBzdHJpbmcpIHN0cmluZyB7CitmdW5jIGFkZFJ1c3RMaWJyYXJ5KG1jdHggYW5kcm9pZC5Mb2FkSG9va0NvbnRleHQsIGkgKmFpZGxJbnRlcmZhY2UsIHZlcnNpb24gc3RyaW5nLCBub3RGcm96ZW4gYm9vbCkgc3RyaW5nIHsKIAlydXN0U291cmNlR2VuIDo9IGkudmVyc2lvbmVkTmFtZSh2ZXJzaW9uKSArICItcnVzdC1zb3VyY2UiCiAJcnVzdE1vZHVsZUdlbiA6PSBpLnZlcnNpb25lZE5hbWUodmVyc2lvbikgKyAiLXJ1c3QiCiAJc3JjcywgYWlkbFJvb3QgOj0gaS5zcmNzRm9yVmVyc2lvbihtY3R4LCB2ZXJzaW9uKQpAQCAtMjczLDM1ICsyNzMsMzcgQEAKIAltY3R4LkNyZWF0ZU1vZHVsZShhaWRsR2VuRmFjdG9yeSwgJm5hbWVQcm9wZXJ0aWVzewogCQlOYW1lOiBwcm9wdG9vbHMuU3RyaW5nUHRyKHJ1c3RTb3VyY2VHZW4pLAogCX0sICZhaWRsR2VuUHJvcGVydGllc3sKLQkJU3JjczogICAgICAgICAgICAgICAgICBzcmNzLAotCQlBaWRsUm9vdDogICAgICAgICAgICAgIGFpZGxSb290LAotCQlJbXBvcnRzV2l0aG91dFZlcnNpb246IGkucHJvcGVydGllcy5JbXBvcnRzV2l0aG91dFZlcnNpb24sCi0JCUlzVG9UOiAgICAgICAgICAgICAgICAgdmVyc2lvbiA9PSBpLm5leHRWZXJzaW9uKCksCi0JCVN0YWJpbGl0eTogICAgICAgICAgICAgaS5wcm9wZXJ0aWVzLlN0YWJpbGl0eSwKLQkJTGFuZzogICAgICAgICAgICAgICAgICBsYW5nUnVzdCwKLQkJQmFzZU5hbWU6ICAgICAgICAgICAgICBpLk1vZHVsZUJhc2UuTmFtZSgpLAotCQlWZXJzaW9uOiAgICAgICAgICAgICAgIGkudmVyc2lvbkZvckFpZGxHZW5SdWxlKHZlcnNpb24pLAotCQlVbnN0YWJsZTogICAgICAgICAgICAgIGkucHJvcGVydGllcy5VbnN0YWJsZSwKLQkJVmlzaWJpbGl0eTogICAgICAgICAgICBzcmNzVmlzaWJpbGl0eShtY3R4LCBsYW5nUnVzdCksCi0JCUZsYWdzOiAgICAgICAgICAgICAgICAgaS5mbGFnc0ZvckFpZGxHZW5SdWxlKHZlcnNpb24pLAorCQlTcmNzOiAgICAgICAgICAgIHNyY3MsCisJCUFpZGxSb290OiAgICAgICAgYWlkbFJvb3QsCisJCUltcG9ydHM6ICAgICAgICAgaS5nZXRJbXBvcnRzRm9yVmVyc2lvbih2ZXJzaW9uKSwKKwkJU3RhYmlsaXR5OiAgICAgICBpLnByb3BlcnRpZXMuU3RhYmlsaXR5LAorCQlNaW5fc2RrX3ZlcnNpb246IGkubWluU2RrVmVyc2lvbihsYW5nUnVzdCksCisJCUxhbmc6ICAgICAgICAgICAgbGFuZ1J1c3QsCisJCUJhc2VOYW1lOiAgICAgICAgaS5Nb2R1bGVCYXNlLk5hbWUoKSwKKwkJVmVyc2lvbjogICAgICAgICBpLnZlcnNpb25Gb3JJbml0VmVyc2lvbkNvbXBhdCh2ZXJzaW9uKSwKKwkJVW5zdGFibGU6ICAgICAgICBpLnByb3BlcnRpZXMuVW5zdGFibGUsCisJCU5vdEZyb3plbjogICAgICAgbm90RnJvemVuLAorCQlGbGFnczogICAgICAgICAgIGkuZmxhZ3NGb3JBaWRsR2VuUnVsZSh2ZXJzaW9uKSwKIAl9KQogCiAJdmVyc2lvbmVkUnVzdE5hbWUgOj0gZml4UnVzdE5hbWUoaS52ZXJzaW9uZWROYW1lKHZlcnNpb24pKQogCXJ1c3RDcmF0ZU5hbWUgOj0gZml4UnVzdE5hbWUoaS5Nb2R1bGVCYXNlLk5hbWUoKSkKIAotCW1jdHguQ3JlYXRlTW9kdWxlKGFpZGxSdXN0TGlicmFyeUZhY3RvcnksICZydXN0UHJvcGVydGllc3sKLQkJTmFtZTogICAgICAgICAgIHByb3B0b29scy5TdHJpbmdQdHIocnVzdE1vZHVsZUdlbiksCi0JCUNyYXRlX25hbWU6ICAgICBydXN0Q3JhdGVOYW1lLAotCQlTdGVtOiAgICAgICAgICAgcHJvcHRvb2xzLlN0cmluZ1B0cigibGliIiArIHZlcnNpb25lZFJ1c3ROYW1lKSwKLQkJRGVmYXVsdHM6ICAgICAgIFtdc3RyaW5neyJhaWRsLXJ1c3QtbW9kdWxlLWRlZmF1bHRzIn0sCi0JCUhvc3Rfc3VwcG9ydGVkOiBpLnByb3BlcnRpZXMuSG9zdF9zdXBwb3J0ZWQsCi0JCUFwZXhfYXZhaWxhYmxlOiBpLnByb3BlcnRpZXMuQmFja2VuZC5SdXN0LkFwZXhfYXZhaWxhYmxlLAotCQlUYXJnZXQ6ICAgICAgICAgcnVzdFRhcmdldFByb3BlcnRpZXN7RGFyd2luOiBkYXJ3aW5Qcm9wZXJ0aWVze0VuYWJsZWQ6IHByb3B0b29scy5Cb29sUHRyKGZhbHNlKX19LAorCW1jdHguQ3JlYXRlTW9kdWxlKHdyYXBMaWJyYXJ5RmFjdG9yeShhaWRsUnVzdExpYnJhcnlGYWN0b3J5KSwgJnJ1c3RQcm9wZXJ0aWVzeworCQlOYW1lOiAgICAgICAgICAgICBwcm9wdG9vbHMuU3RyaW5nUHRyKHJ1c3RNb2R1bGVHZW4pLAorCQlDcmF0ZV9uYW1lOiAgICAgICBydXN0Q3JhdGVOYW1lLAorCQlTdGVtOiAgICAgICAgICAgICBwcm9wdG9vbHMuU3RyaW5nUHRyKCJsaWIiICsgdmVyc2lvbmVkUnVzdE5hbWUpLAorCQlEZWZhdWx0czogICAgICAgICBbXXN0cmluZ3siYWlkbC1ydXN0LW1vZHVsZS1kZWZhdWx0cyJ9LAorCQlIb3N0X3N1cHBvcnRlZDogICBpLnByb3BlcnRpZXMuSG9zdF9zdXBwb3J0ZWQsCisJCVZlbmRvcl9hdmFpbGFibGU6IGkucHJvcGVydGllcy5WZW5kb3JfYXZhaWxhYmxlLAorCQlBcGV4X2F2YWlsYWJsZTogICBpLnByb3BlcnRpZXMuQmFja2VuZC5SdXN0LkFwZXhfYXZhaWxhYmxlLAorCQlNaW5fc2RrX3ZlcnNpb246ICBpLm1pblNka1ZlcnNpb24obGFuZ1J1c3QpLAorCQlUYXJnZXQ6ICAgICAgICAgICBydXN0VGFyZ2V0UHJvcGVydGllc3tEYXJ3aW46IGRhcndpblByb3BlcnRpZXN7RW5hYmxlZDogcHJvcHRvb2xzLkJvb2xQdHIoZmFsc2UpfX0sCiAJfSwgJnJ1c3QuU291cmNlUHJvdmlkZXJQcm9wZXJ0aWVzewogCQlTb3VyY2Vfc3RlbTogcHJvcHRvb2xzLlN0cmluZ1B0cih2ZXJzaW9uZWRSdXN0TmFtZSksCiAJfSwgJmFpZGxSdXN0U291cmNlUHJvdmlkZXJQcm9wZXJ0aWVzewogCQlTb3VyY2VHZW46ICAgICAgICAgcnVzdFNvdXJjZUdlbiwKLQkJSW1wb3J0czogICAgICAgICAgIGkucHJvcGVydGllcy5JbXBvcnRzLAorCQlJbXBvcnRzOiAgICAgICAgICAgaS5nZXRJbXBvcnRzRm9yVmVyc2lvbih2ZXJzaW9uKSwKIAkJVmVyc2lvbjogICAgICAgICAgIHZlcnNpb24sCiAJCUFpZGxJbnRlcmZhY2VOYW1lOiBpLk1vZHVsZUJhc2UuTmFtZSgpLAogCX0pCkBAIC0zMjQsNyArMzI2LDcgQEAKIAlyZXR1cm4gbmFtZSArICItViIgKyB2ZXJzaW9uCiB9CiAKLWZ1bmMgKGkgKmFpZGxJbnRlcmZhY2UpIHNyY3NGb3JWZXJzaW9uKG1jdHggYW5kcm9pZC5Mb2FkSG9va0NvbnRleHQsIHZlcnNpb24gc3RyaW5nKSAoc3JjcyBbXXN0cmluZywgYWlkbFJvb3Qgc3RyaW5nKSB7CitmdW5jIChpICphaWRsSW50ZXJmYWNlKSBzcmNzRm9yVmVyc2lvbihtY3R4IGFuZHJvaWQuRWFybHlNb2R1bGVDb250ZXh0LCB2ZXJzaW9uIHN0cmluZykgKHNyY3MgW11zdHJpbmcsIGFpZGxSb290IHN0cmluZykgewogCWlmIHZlcnNpb24gPT0gaS5uZXh0VmVyc2lvbigpIHsKIAkJcmV0dXJuIGkucHJvcGVydGllcy5TcmNzLCBpLnByb3BlcnRpZXMuTG9jYWxfaW5jbHVkZV9kaXIKIAl9IGVsc2UgewpAQCAtMzQxLDcgKzM0MywxMCBAQAogCX0KIH0KIAotZnVuYyAoaSAqYWlkbEludGVyZmFjZSkgdmVyc2lvbkZvckFpZGxHZW5SdWxlKHZlcnNpb24gc3RyaW5nKSBzdHJpbmcgeworLy8gRm9yIGNlcnRhaW4gYmFja2VuZCwgYXZvaWQgYSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGluaXRpYWwgdmVyc2lvbiBvZiBhIHZlcnNpb25lZAorLy8gaW50ZXJmYWNlIGFuZCBhbiB1bnZlcnNpb25lZCBpbnRlcmZhY2UuIFRoaXMgZW5zdXJlcyB0aGF0IHByZWJ1aWx0cyBjYW4ndCBwcmV2ZW50CisvLyBhbiBpbnRlcmZhY2UgZnJvbSBzd2l0Y2hpbmcgZnJvbSB1bnZlcnNpb25lZCB0byB2ZXJzaW9uZWQuCitmdW5jIChpICphaWRsSW50ZXJmYWNlKSB2ZXJzaW9uRm9ySW5pdFZlcnNpb25Db21wYXQodmVyc2lvbiBzdHJpbmcpIHN0cmluZyB7CiAJaWYgIWkuaGFzVmVyc2lvbigpIHsKIAkJcmV0dXJuICIiCiAJfQpAQCAtMzUyLDcgKzM1Nyw3IEBACiAJZmxhZ3MgPSBhcHBlbmQoZmxhZ3MsIGkucHJvcGVydGllcy5GbGFncy4uLikKIAkvLyBGb3IgVG9ULCB0dXJuIG9uICItV2V2ZXJ5dGhpbmciIChlbmFibGUgYWxsIHdhcm5pbmdzKQogCWlmIHZlcnNpb24gPT0gaS5uZXh0VmVyc2lvbigpIHsKLQkJZmxhZ3MgPSBhcHBlbmQoZmxhZ3MsICItV2V2ZXJ5dGhpbmciKQorCQlmbGFncyA9IGFwcGVuZChmbGFncywgIi1XZXZlcnl0aGluZyAtV25vLW1pc3NpbmctcGVybWlzc2lvbi1hbm5vdGF0aW9uIikKIAl9CiAJcmV0dXJuCiB9CkBAIC0zODAsMTEgKzM4NSwxMCBAQAogLy8gVG9UIHZlcnNpb24oaW5jbHVkaW5nIHVuc3RhYmxlKSAgICAgfCB3aGF0ZXZlciAgICAgICAgICAgICAgICB8IFRvVCB2ZXJzaW9uKHVuc3RhYmxlIGlmIHVuc3RhYmxlKQogLy8gb3RoZXJ3aXNlICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB3aGF0ZXZlciAgICAgICAgICAgICAgICB8IHRoZSBsYXRlc3Qgc3RhYmxlIHZlcnNpb24KIC8vIEluIHRoZSBjYXNlIHRoYXQgaW1wb3J0IHNwZWNpZmllcyB0aGUgdmVyc2lvbiB3aGljaCBpdCB3YW50cyB0byB1c2UsIHVzZSB0aGF0IHZlcnNpb24uCi1mdW5jIChpICphaWRsSW50ZXJmYWNlKSBnZXRJbXBvcnRXaXRoVmVyc2lvbih2ZXJzaW9uIHN0cmluZywgYW5JbXBvcnQgc3RyaW5nLCBjb25maWcgYW5kcm9pZC5Db25maWcpIHN0cmluZyB7CitmdW5jIChpICphaWRsSW50ZXJmYWNlKSBnZXRJbXBvcnRXaXRoVmVyc2lvbih2ZXJzaW9uIHN0cmluZywgYW5JbXBvcnQgc3RyaW5nLCBvdGhlciAqYWlkbEludGVyZmFjZSkgc3RyaW5nIHsKIAlpZiBoYXNWZXJzaW9uU3VmZml4KGFuSW1wb3J0KSB7CiAJCXJldHVybiBhbkltcG9ydAogCX0KLQlvdGhlciA6PSBsb29rdXBJbnRlcmZhY2UoYW5JbXBvcnQsIGNvbmZpZykKIAlpZiBwcm9wdG9vbHMuQm9vbChvdGhlci5wcm9wZXJ0aWVzLlVuc3RhYmxlKSB7CiAJCXJldHVybiBhbkltcG9ydAogCX0KQEAgLTM5NCw2ICszOTgsMjEgQEAKIAlyZXR1cm4gb3RoZXIudmVyc2lvbmVkTmFtZShvdGhlci5sYXRlc3RWZXJzaW9uKCkpCiB9CiAKKy8vIEFzc3VtaW5nIHRoYXQgdGhlIGNvbnRleHQgbW9kdWxlIGhhcyBkZXBzIHRvIGl0cyBvcmlnaW5hbCBhaWRsX2ludGVyZmFjZSBhbmQgaW1wb3J0ZWQKKy8vIGFpZGxfaW50ZXJmYWNlIG1vZHVsZXMgd2l0aCBpbnRlcmZhY2VEZXBUYWcgYW5kIGltcG9ydEludGVyZmFjZURlcFRhZywgcmV0dXJucyB0aGUgbGlzdCBvZgorLy8gaW1wb3J0ZWQgaW50ZXJmYWNlcyB3aXRoIHZlcnNpb25zLgorZnVuYyBnZXRJbXBvcnRzV2l0aFZlcnNpb24oY3R4IGFuZHJvaWQuQmFzZU11dGF0b3JDb250ZXh0LCBpbnRlcmZhY2VOYW1lLCB2ZXJzaW9uIHN0cmluZykgW11zdHJpbmcgeworCWkgOj0gY3R4LkdldERpcmVjdERlcFdpdGhUYWcoaW50ZXJmYWNlTmFtZSthaWRsSW50ZXJmYWNlU3VmZml4LCBpbnRlcmZhY2VEZXApLigqYWlkbEludGVyZmFjZSkKKwl2YXIgaW1wb3J0cyBbXXN0cmluZworCWN0eC5WaXNpdERpcmVjdERlcHMoZnVuYyhkZXAgYW5kcm9pZC5Nb2R1bGUpIHsKKwkJaWYgdGFnLCBvayA6PSBjdHguT3RoZXJNb2R1bGVEZXBlbmRlbmN5VGFnKGRlcCkuKGltcG9ydEludGVyZmFjZURlcFRhZyk7IG9rIHsKKwkJCW90aGVyIDo9IGRlcC4oKmFpZGxJbnRlcmZhY2UpCisJCQlpbXBvcnRzID0gYXBwZW5kKGltcG9ydHMsIGkuZ2V0SW1wb3J0V2l0aFZlcnNpb24odmVyc2lvbiwgdGFnLmFuSW1wb3J0LCBvdGhlcikpCisJCX0KKwl9KQorCXJldHVybiBpbXBvcnRzCit9CisKIGZ1bmMgYWlkbEltcGxlbWVudGF0aW9uR2VuZXJhdG9yRmFjdG9yeSgpIGFuZHJvaWQuTW9kdWxlIHsKIAlnIDo9ICZhaWRsSW1wbGVtZW50YXRpb25HZW5lcmF0b3J7fQogCWcuQWRkUHJvcGVydGllcygmZy5wcm9wZXJ0aWVzKQpAQCAtNDEwLDYgKzQyOSw3IEBACiAJTGFuZyAgICAgICAgICAgICAgc3RyaW5nCiAJQWlkbEludGVyZmFjZU5hbWUgc3RyaW5nCiAJVmVyc2lvbiAgICAgICAgICAgc3RyaW5nCisJSW1wb3J0cyAgICAgICAgICAgW11zdHJpbmcKIAlNb2R1bGVQcm9wZXJ0aWVzICBbXWludGVyZmFjZXt9CiB9CiAKQEAgLTQyMCwyNyArNDQwLDE3IEBACiB9CiAKIGZ1bmMgKGcgKmFpZGxJbXBsZW1lbnRhdGlvbkdlbmVyYXRvcikgR2VuZXJhdGVJbXBsZW1lbnRhdGlvbihjdHggYW5kcm9pZC5Ub3BEb3duTXV0YXRvckNvbnRleHQpIHsKLQlpIDo9IGxvb2t1cEludGVyZmFjZShnLnByb3BlcnRpZXMuQWlkbEludGVyZmFjZU5hbWUsIGN0eC5Db25maWcoKSkKLQl2ZXJzaW9uIDo9IGcucHJvcGVydGllcy5WZXJzaW9uCi0JbGFuZyA6PSBnLnByb3BlcnRpZXMuTGFuZworCWltcG9ydHMgOj0gd3JhcCgiIiwgZ2V0SW1wb3J0c1dpdGhWZXJzaW9uKGN0eCwgZy5wcm9wZXJ0aWVzLkFpZGxJbnRlcmZhY2VOYW1lLCBnLnByb3BlcnRpZXMuVmVyc2lvbiksICItIitnLnByb3BlcnRpZXMuTGFuZykKIAlpZiBnLnByb3BlcnRpZXMuTGFuZyA9PSBsYW5nSmF2YSB7Ci0JCWltcG9ydHMgOj0gbWFrZShbXXN0cmluZywgbGVuKGkucHJvcGVydGllcy5JbXBvcnRzKSkKLQkJZm9yIGlkeCwgYW5JbXBvcnQgOj0gcmFuZ2UgaS5wcm9wZXJ0aWVzLkltcG9ydHMgewotCQkJaW1wb3J0c1tpZHhdID0gaS5nZXRJbXBvcnRXaXRoVmVyc2lvbih2ZXJzaW9uLCBhbkltcG9ydCwgY3R4LkNvbmZpZygpKSArICItIiArIGxhbmdKYXZhCi0JCX0KIAkJaWYgcCwgb2sgOj0gZy5wcm9wZXJ0aWVzLk1vZHVsZVByb3BlcnRpZXNbMF0uKCpqYXZhUHJvcGVydGllcyk7IG9rIHsKIAkJCXAuU3RhdGljX2xpYnMgPSBpbXBvcnRzCiAJCX0KLQkJY3R4LkNyZWF0ZU1vZHVsZShqYXZhLkxpYnJhcnlGYWN0b3J5LCBnLnByb3BlcnRpZXMuTW9kdWxlUHJvcGVydGllcy4uLikKKwkJY3R4LkNyZWF0ZU1vZHVsZSh3cmFwTGlicmFyeUZhY3RvcnkoamF2YS5MaWJyYXJ5RmFjdG9yeSksIGcucHJvcGVydGllcy5Nb2R1bGVQcm9wZXJ0aWVzLi4uKQogCX0gZWxzZSB7Ci0JCWltcG9ydHMgOj0gbWFrZShbXXN0cmluZywgbGVuKGkucHJvcGVydGllcy5JbXBvcnRzKSkKLQkJZm9yIGlkeCwgYW5JbXBvcnQgOj0gcmFuZ2UgaS5wcm9wZXJ0aWVzLkltcG9ydHMgewotCQkJaW1wb3J0c1tpZHhdID0gaS5nZXRJbXBvcnRXaXRoVmVyc2lvbih2ZXJzaW9uLCBhbkltcG9ydCwgY3R4LkNvbmZpZygpKSArICItIiArIGxhbmcKLQkJfQogCQlpZiBwLCBvayA6PSBnLnByb3BlcnRpZXMuTW9kdWxlUHJvcGVydGllc1swXS4oKmNjUHJvcGVydGllcyk7IG9rIHsKIAkJCXAuU2hhcmVkX2xpYnMgPSBhcHBlbmQocC5TaGFyZWRfbGlicywgaW1wb3J0cy4uLikKIAkJCXAuRXhwb3J0X3NoYXJlZF9saWJfaGVhZGVycyA9IGFwcGVuZChwLkV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnMsIGltcG9ydHMuLi4pCiAJCX0KLQkJY3R4LkNyZWF0ZU1vZHVsZShjYy5MaWJyYXJ5RmFjdG9yeSwgZy5wcm9wZXJ0aWVzLk1vZHVsZVByb3BlcnRpZXMuLi4pCisJCWN0eC5DcmVhdGVNb2R1bGUod3JhcExpYnJhcnlGYWN0b3J5KGNjLkxpYnJhcnlGYWN0b3J5KSwgZy5wcm9wZXJ0aWVzLk1vZHVsZVByb3BlcnRpZXMuLi4pCiAJfQogfQpkaWZmIC0tZ2l0IGEvYnVpbGQvYWlkbF9pbnRlcmZhY2VfbWV0YWRhdGFfc2luZ2xldG9uLmdvIGIvYnVpbGQvYWlkbF9pbnRlcmZhY2VfbWV0YWRhdGFfc2luZ2xldG9uLmdvCmluZGV4IDg0ZmQ4MzQuLjhiNDIxYTUgMTAwNjQ0Ci0tLSBhL2J1aWxkL2FpZGxfaW50ZXJmYWNlX21ldGFkYXRhX3NpbmdsZXRvbi5nbworKysgYi9idWlsZC9haWRsX2ludGVyZmFjZV9tZXRhZGF0YV9zaW5nbGV0b24uZ28KQEAgLTMxLDExICszMSwxMyBAQAogCQkJYGVjaG8gIlwibmFtZVwiOiBcIiR7bmFtZX1cIiwiICYmIGAgKwogCQkJYGVjaG8gIlwic3RhYmlsaXR5XCI6IFwiJHtzdGFiaWxpdHl9XCIsIiAmJiBgICsKIAkJCWBlY2hvICJcInR5cGVzXCI6IFske3R5cGVzfV0sIiAmJiBgICsKLQkJCWBlY2hvICJcImhhc2hlc1wiOiBbJHtoYXNoZXN9XSIgJiYgYCArCisJCQlgZWNobyAiXCJoYXNoZXNcIjogWyR7aGFzaGVzfV0sIiAmJiBgICsKKwkJCWBlY2hvICJcImhhc19kZXZlbG9wbWVudFwiOiAke2hhc19kZXZlbG9wbWVudH0sIiAmJiBgICsKKwkJCWBlY2hvICJcInZlcnNpb25zXCI6IFske3ZlcnNpb25zfV0iICYmIGAgKwogCQkJYGVjaG8gJ30nIGAgKwogCQkJYDt9ID4+ICR7b3V0fWAsCiAJCURlc2NyaXB0aW9uOiAiQUlETCBtZXRhZGF0YTogJHtvdXR9IiwKLQl9LCAibmFtZSIsICJzdGFiaWxpdHkiLCAidHlwZXMiLCAiaGFzaGVzIikKKwl9LCAibmFtZSIsICJzdGFiaWxpdHkiLCAidHlwZXMiLCAiaGFzaGVzIiwgImhhc19kZXZlbG9wbWVudCIsICJ2ZXJzaW9ucyIpCiAKIAlqb2luSnNvbk9iamVjdHNUb0FycmF5UnVsZSA9IHBjdHguU3RhdGljUnVsZSgiam9pbkpzb25PYmplY3RzVG9BcnJheVJ1bGUiLCBibHVlcHJpbnQuUnVsZVBhcmFtc3sKIAkJUnNwZmlsZTogICAgICAgICIkb3V0LnJzcCIsCkBAIC03OCw5ICs4MCwxMSBAQAogCX0KIAogCXR5cGUgTW9kdWxlSW5mbyBzdHJ1Y3QgewotCQlTdGFiaWxpdHkgICAgIHN0cmluZwotCQlDb21wdXRlZFR5cGVzIFtdc3RyaW5nCi0JCUhhc2hGaWxlcyAgICAgW11zdHJpbmcKKwkJU3RhYmlsaXR5ICAgICAgc3RyaW5nCisJCUNvbXB1dGVkVHlwZXMgIFtdc3RyaW5nCisJCUhhc2hGaWxlcyAgICAgIFtdc3RyaW5nCisJCUhhc0RldmVsb3BtZW50IGFuZHJvaWQuV3JpdGFibGVQYXRoCisJCVZlcnNpb25zICAgICAgIFtdc3RyaW5nCiAJfQogCiAJLy8gbmFtZSAtPiBNb2R1bGVJbmZvCkBAIC05NSw2ICs5OSw3IEBACiAJCQlpbmZvIDo9IG1vZHVsZUluZm9zW3QuTW9kdWxlQmFzZS5OYW1lKCldCiAJCQlpbmZvLlN0YWJpbGl0eSA9IHByb3B0b29scy5TdHJpbmdEZWZhdWx0KHQucHJvcGVydGllcy5TdGFiaWxpdHksICIiKQogCQkJaW5mby5Db21wdXRlZFR5cGVzID0gdC5jb21wdXRlZFR5cGVzCisJCQlpbmZvLlZlcnNpb25zID0gdC5nZXRWZXJzaW9ucygpCiAJCQltb2R1bGVJbmZvc1t0Lk1vZHVsZUJhc2UuTmFtZSgpXSA9IGluZm8KIAkJY2FzZSAqYWlkbEdlblJ1bGU6CiAJCQlpbmZvIDo9IG1vZHVsZUluZm9zW3QucHJvcGVydGllcy5CYXNlTmFtZV0KQEAgLTEwMiw2ICsxMDcsMTAgQEAKIAkJCQlpbmZvLkhhc2hGaWxlcyA9IGFwcGVuZChpbmZvLkhhc2hGaWxlcywgdC5oYXNoRmlsZS5TdHJpbmcoKSkKIAkJCX0KIAkJCW1vZHVsZUluZm9zW3QucHJvcGVydGllcy5CYXNlTmFtZV0gPSBpbmZvCisJCWNhc2UgKmFpZGxBcGk6CisJCQlpbmZvIDo9IG1vZHVsZUluZm9zW3QucHJvcGVydGllcy5CYXNlTmFtZV0KKwkJCWluZm8uSGFzRGV2ZWxvcG1lbnQgPSB0Lmhhc0RldmVsb3BtZW50CisJCQltb2R1bGVJbmZvc1t0LnByb3BlcnRpZXMuQmFzZU5hbWVdID0gaW5mbwogCQl9CiAKIAl9KQpAQCAtMTE2LDIxICsxMjUsMzEgQEAKIAkJLy8gb2JqZWN0cyBwZXIgdmVyc2lvbiBhbmQgc3ViLW9iamVjdHMgcGVyIGJhY2tlbmQsIHdlIGNvdWxkCiAJCS8vIGF2b2lkIG5lZWRpbmcgdG8gZmlsdGVyIG91dCBkdXBsaWNhdGVzLgogCQlpbmZvLkhhc2hGaWxlcyA9IGFuZHJvaWQuRmlyc3RVbmlxdWVTdHJpbmdzKGluZm8uSGFzaEZpbGVzKQorCQlyZWFkSGFzaGVzIDo9ICIiCisJCWlmIGxlbihpbmZvLkhhc2hGaWxlcykgPiAwIHsKKwkJCXJlYWRIYXNoZXMgPSAiJCQoc2VkICdzLy4qL1wiJlwiLC8nICIgKyBzdHJpbmdzLkpvaW4oaW5mby5IYXNoRmlsZXMsICIgIikgKworCQkJCSJ8IHRyICdcXG4nICcgJyB8IHNlZCAncy8sICQkLy8nKSIKKwkJfQogCiAJCWltcGxpY2l0cyA6PSBhbmRyb2lkLlBhdGhzRm9yU291cmNlKGN0eCwgaW5mby5IYXNoRmlsZXMpCisJCWhhc0RldmVsb3BtZW50VmFsdWUgOj0gInRydWUiCisJCWlmIGluZm8uSGFzRGV2ZWxvcG1lbnQgIT0gbmlsIHsKKwkJCWhhc0RldmVsb3BtZW50VmFsdWUgPSAiJCQoaWYgWyBcIiQkKGNhdCAiICsgaW5mby5IYXNEZXZlbG9wbWVudC5TdHJpbmcoKSArCisJCQkJIilcIiA9IFwiMVwiIF07IHRoZW4gZWNobyB0cnVlOyBlbHNlIGVjaG8gZmFsc2U7IGZpKSIKKwkJfQogCiAJCWN0eC5CdWlsZChwY3R4LCBhbmRyb2lkLkJ1aWxkUGFyYW1zewogCQkJUnVsZTogICAgICBhaWRsTWV0YWRhdGFSdWxlLAogCQkJSW1wbGljaXRzOiBpbXBsaWNpdHMsCisJCQlJbnB1dDogICAgIGluZm8uSGFzRGV2ZWxvcG1lbnQsCiAJCQlPdXRwdXQ6ICAgIG1ldGFkYXRhUGF0aCwKIAkJCUFyZ3M6IG1hcFtzdHJpbmddc3RyaW5newotCQkJCSJuYW1lIjogICAgICBuYW1lLAotCQkJCSJzdGFiaWxpdHkiOiBpbmZvLlN0YWJpbGl0eSwKLQkJCQkidHlwZXMiOiAgICAgc3RyaW5ncy5Kb2luKHdyYXAoYFwiYCwgaW5mby5Db21wdXRlZFR5cGVzLCBgXCJgKSwgIiwgIiksCi0JCQkJImhhc2hlcyI6IHN0cmluZ3MuSm9pbigKLQkJCQkJd3JhcChgXCIkJChyZWFkIC1yIDwgYCwKLQkJCQkJCWluZm8uSGFzaEZpbGVzLAotCQkJCQkJYCBoYXNoIGV4dHJhOyBwcmludGYgJyVzJyAkJGhhc2gpXCJgKSwgIiwgIiksCisJCQkJIm5hbWUiOiAgICAgICAgICAgIG5hbWUsCisJCQkJInN0YWJpbGl0eSI6ICAgICAgIGluZm8uU3RhYmlsaXR5LAorCQkJCSJ0eXBlcyI6ICAgICAgICAgICBzdHJpbmdzLkpvaW4od3JhcChgXCJgLCBpbmZvLkNvbXB1dGVkVHlwZXMsIGBcImApLCAiLCAiKSwKKwkJCQkiaGFzaGVzIjogICAgICAgICAgcmVhZEhhc2hlcywKKwkJCQkiaGFzX2RldmVsb3BtZW50IjogaGFzRGV2ZWxvcG1lbnRWYWx1ZSwKKwkJCQkidmVyc2lvbnMiOiAgICAgICAgc3RyaW5ncy5Kb2luKGluZm8uVmVyc2lvbnMsICIsICIpLAogCQkJfSwKIAkJfSkKIAl9CmRpZmYgLS1naXQgYS9idWlsZC9haWRsX3J1c3RfZ2x1ZS5weSBiL2J1aWxkL2FpZGxfcnVzdF9nbHVlLnB5CmluZGV4IGVmMzFjM2IuLmFjYmQ4NzEgMTAwNzU1Ci0tLSBhL2J1aWxkL2FpZGxfcnVzdF9nbHVlLnB5CisrKyBiL2J1aWxkL2FpZGxfcnVzdF9nbHVlLnB5CkBAIC03MSw5ICs3MSwxMSBAQAogICAgICAgICBub2RlLmZpbGVzLmFwcGVuZCgoaW5fbmFtZSwgaW5wKSkKIAogICB3aXRoIG9wZW4ob3V0cHV0LCAidyIpIGFzIGxpYl9yc19maWxlOgorICAgICMgRW5hYmxlIGN1c3RvbSBhdHRyaWJ1dGVzIGZvciAjIVtydXN0Zm10Ojpza2lwXQorICAgIGxpYl9yc19maWxlLndyaXRlKCIjIVtmZWF0dXJlKGN1c3RvbV9pbm5lcl9hdHRyaWJ1dGVzKV1cbiIpCiAgICAgbGliX3JzX2ZpbGUud3JpdGUoIiMhW2FsbG93KG5vbl9zbmFrZV9jYXNlKV1cbiIpCiAgICAgbGliX3JzX2ZpbGUud3JpdGUoIiMhW2FsbG93KG1pc3NpbmdfZG9jcyldXG4iKQotICAgIGxpYl9yc19maWxlLndyaXRlKCJwdWIgdXNlIGJpbmRlcjo6cHVibGljX2FwaSBhcyBiaW5kZXI7XG4iKQorICAgIGxpYl9yc19maWxlLndyaXRlKCJwdWIgdXNlIGJpbmRlcjtcbiIpCiAKICAgICBsaWJfcnNfZmlsZS53cml0ZSgicHViIG1vZCBhaWRsIHtcbiIpCiAgICAgcm9vdF9tb2R1bGUuZW1pdChsaWJfcnNfZmlsZSwgaW5kZW50PSIgICIpCmRpZmYgLS1naXQgYS9idWlsZC9haWRsX3J1c3Rfc291cmNlX3Byb3ZpZGVyLmdvIGIvYnVpbGQvYWlkbF9ydXN0X3NvdXJjZV9wcm92aWRlci5nbwppbmRleCBlYWI0NWYxLi4xNjA1MGZiIDEwMDY0NAotLS0gYS9idWlsZC9haWRsX3J1c3Rfc291cmNlX3Byb3ZpZGVyLmdvCisrKyBiL2J1aWxkL2FpZGxfcnVzdF9zb3VyY2VfcHJvdmlkZXIuZ28KQEAgLTk2LDExICs5Niw4IEBACiBmdW5jIChzcCAqYWlkbFJ1c3RTb3VyY2VQcm92aWRlcikgU291cmNlUHJvdmlkZXJEZXBzKGN0eCBydXN0LkRlcHNDb250ZXh0LCBkZXBzIHJ1c3QuRGVwcykgcnVzdC5EZXBzIHsKIAlkZXBzID0gc3AuQmFzZVNvdXJjZVByb3ZpZGVyLlNvdXJjZVByb3ZpZGVyRGVwcyhjdHgsIGRlcHMpCiAJZGVwcy5SdXN0bGlicyA9IGFwcGVuZChkZXBzLlJ1c3RsaWJzLCAibGliYmluZGVyX3JzIiwgImxpYmxhenlfc3RhdGljIikKLQlhaSA6PSBsb29rdXBJbnRlcmZhY2Uoc3AucHJvcGVydGllcy5BaWRsSW50ZXJmYWNlTmFtZSwgY3R4LkNvbmZpZygpKQotCWZvciBfLCBkZXAgOj0gcmFuZ2Ugc3AucHJvcGVydGllcy5JbXBvcnRzIHsKLQkJZGVwcy5SdXN0bGlicyA9IGFwcGVuZChkZXBzLlJ1c3RsaWJzLCBhaS5nZXRJbXBvcnRXaXRoVmVyc2lvbihzcC5wcm9wZXJ0aWVzLlZlcnNpb24sIGRlcCwgY3R4LkNvbmZpZygpKSsiLSIrbGFuZ1J1c3QpCi0JfQotCisJZGVwcy5SdXN0bGlicyA9IGFwcGVuZChkZXBzLlJ1c3RsaWJzLCB3cmFwKCIiLCBnZXRJbXBvcnRzV2l0aFZlcnNpb24oY3R4LCBzcC5wcm9wZXJ0aWVzLkFpZGxJbnRlcmZhY2VOYW1lLCBzcC5wcm9wZXJ0aWVzLlZlcnNpb24pLCAiLSIrbGFuZ1J1c3QpLi4uKQorCWRlcHMuUHJvY01hY3JvcyA9IGFwcGVuZChkZXBzLlByb2NNYWNyb3MsICJsaWJhc3luY190cmFpdCIpCiAJLy8gQWRkIGEgZGVwZW5jZW5jeSB0byB0aGUgc291cmNlIG1vZHVsZSAoKi1ydXN0LXNvdXJjZSkgZGlyZWN0bHkgdmlhIGBjdHhgIGJlY2F1c2UKIAkvLyB0aGUgc291cmNlIG1vZHVsZSBpcyBzcGVjaWZpYyB0byBhaWRsUnVzdFNvdXJjZVByb3ZpZGVyIGFuZCB3ZSBkb24ndCB3YW50IHRoZSBydXN0IG1vZHVsZQogCS8vIHRvIGtub3cgYWJvdXQgaXQuCmRpZmYgLS1naXQgYS9idWlsZC9haWRsX3Rlc3QuZ28gYi9idWlsZC9haWRsX3Rlc3QuZ28KaW5kZXggMzI1Y2JkYS4uOGMyNThkYiAxMDA2NDQKLS0tIGEvYnVpbGQvYWlkbF90ZXN0LmdvCisrKyBiL2J1aWxkL2FpZGxfdGVzdC5nbwpAQCAtMjUsNyArMjUsNiBAQAogCSJnaXRodWIuY29tL2dvb2dsZS9ibHVlcHJpbnQvcHJvcHRvb2xzIgogCiAJImFuZHJvaWQvc29vbmcvYW5kcm9pZCIKLQkiYW5kcm9pZC9zb29uZy9hcGV4IgogCSJhbmRyb2lkL3Nvb25nL2NjIgogCSJhbmRyb2lkL3Nvb25nL2dlbnJ1bGUiCiAJImFuZHJvaWQvc29vbmcvamF2YSIKQEAgLTU0LDYgKzUzLDE5IEBACiAJfSkKIH0KIAorZnVuYyBzZXRUZXN0RnJlZXplRW52KCkgYW5kcm9pZC5GaXh0dXJlUHJlcGFyZXIgeworCXJldHVybiBhbmRyb2lkLkZpeHR1cmVNZXJnZUVudihtYXBbc3RyaW5nXXN0cmluZ3sKKwkJIkFJRExfRlJPWkVOX1JFTCI6ICAgICJ0cnVlIiwKKwkJIkFJRExfRlJPWkVOX09XTkVSUyI6ICJhb3NwIHRlc3QiLAorCX0pCit9CisKK2Z1bmMgc2V0VHJhbnNpdGl2ZUZyZWV6ZUVudigpIGFuZHJvaWQuRml4dHVyZVByZXBhcmVyIHsKKwlyZXR1cm4gYW5kcm9pZC5GaXh0dXJlTWVyZ2VFbnYobWFwW3N0cmluZ11zdHJpbmd7CisJCSJBSURMX1RSQU5TSVRJVkVfRlJFRVpFIjogInRydWUiLAorCX0pCit9CisKIGZ1bmMgX3Rlc3RBaWRsKHQgKnRlc3RpbmcuVCwgYnAgc3RyaW5nLCBjdXN0b21pemVycyAuLi5hbmRyb2lkLkZpeHR1cmVQcmVwYXJlcikgYW5kcm9pZC5GaXh0dXJlUHJlcGFyZXIgewogCXQuSGVscGVyKCkKIApAQCAtNjMsNiArNzUsNyBAQAogCQljYy5QcmVwYXJlRm9yVGVzdFdpdGhDY0RlZmF1bHRNb2R1bGVzLAogCQlqYXZhLlByZXBhcmVGb3JUZXN0V2l0aEphdmFEZWZhdWx0TW9kdWxlcywKIAkJZ2VucnVsZS5QcmVwYXJlRm9yVGVzdFdpdGhHZW5SdWxlQnVpbGRDb21wb25lbnRzLAorCQlhbmRyb2lkLlByZXBhcmVGb3JUZXN0V2l0aE5hbWVzcGFjZSwKIAkpCiAKIAlicCA9IGJwICsgYApAQCAtODAsMTUgKzkzLDE4IEBACiAJCX0KIAkJY2NfbGlicmFyeSB7CiAJCQluYW1lOiAibGliYmluZGVyIiwKKwkJCXJlY292ZXJ5X2F2YWlsYWJsZTogdHJ1ZSwKIAkJfQogCQljY19saWJyYXJ5IHsKIAkJCW5hbWU6ICJsaWJ1dGlscyIsCisJCQlyZWNvdmVyeV9hdmFpbGFibGU6IHRydWUsCiAJCX0KIAkJY2NfbGlicmFyeSB7CiAJCQluYW1lOiAibGliY3V0aWxzIiwKIAkJfQogCQljY19saWJyYXJ5IHsKIAkJCW5hbWU6ICJsaWJiaW5kZXJfbmRrIiwKKwkJCXJlY292ZXJ5X2F2YWlsYWJsZTogdHJ1ZSwKIAkJCXN0dWJzOiB7CiAJCQkJdmVyc2lvbnM6IFsiMjkiXSwKIAkJCX0KQEAgLTEyOCw4ICsxNDQsMTMgQEAKIAkJCWNyYXRlX25hbWU6ICJiaW5kZXIiLAogCQkJc3JjczogWyIiXSwKIAkJfQorCQlydXN0X3Byb2NfbWFjcm8geworCQkJbmFtZTogImxpYmFzeW5jX3RyYWl0IiwKKwkJCWNyYXRlX25hbWU6ICJhc3luY190cmFpdCIsCisJCQlzcmNzOiBbIiJdLAorCQkJbm9fc3RkbGliczogdHJ1ZSwKKwkJfQogCWAKLQogCXByZXBhcmVycyA9IGFwcGVuZChwcmVwYXJlcnMsIGFuZHJvaWQuRml4dHVyZVdpdGhSb290QW5kcm9pZEJwKGJwKSkKIAlwcmVwYXJlcnMgPSBhcHBlbmQocHJlcGFyZXJzLCBhbmRyb2lkLkZpeHR1cmVBZGRUZXh0RmlsZSgic3lzdGVtL3Rvb2xzL2FpZGwvYnVpbGQvQW5kcm9pZC5icCIsIGAKIAkJYWlkbF9pbnRlcmZhY2VzX21ldGFkYXRhIHsKQEAgLTE1MCw3ICsxNzEsNiBAQAogCXByZXBhcmVycyA9IGFwcGVuZChwcmVwYXJlcnMsIGN1c3RvbWl6ZXJzLi4uKQogCiAJcHJlcGFyZXJzID0gYXBwZW5kKHByZXBhcmVycywKLQkJYXBleC5QcmVwYXJlRm9yVGVzdFdpdGhBcGV4QnVpbGRDb21wb25lbnRzLAogCQlydXN0LlByZXBhcmVGb3JUZXN0V2l0aFJ1c3RCdWlsZENvbXBvbmVudHMsCiAJCWFuZHJvaWQuRml4dHVyZVJlZ2lzdGVyV2l0aENvbnRleHQoZnVuYyhjdHggYW5kcm9pZC5SZWdpc3RyYXRpb25Db250ZXh0KSB7CiAJCQljdHguUmVnaXN0ZXJNb2R1bGVUeXBlKCJhaWRsX2ludGVyZmFjZSIsIGFpZGxJbnRlcmZhY2VGYWN0b3J5KQpAQCAtMTU4LDE3ICsxNzgsOCBAQAogCQkJY3R4LlJlZ2lzdGVyTW9kdWxlVHlwZSgicnVzdF9kZWZhdWx0cyIsIGZ1bmMoKSBhbmRyb2lkLk1vZHVsZSB7CiAJCQkJcmV0dXJuIHJ1c3QuRGVmYXVsdHNGYWN0b3J5KCkKIAkJCX0pCi0KLQkJCWN0eC5QcmVBcmNoTXV0YXRvcnMoZnVuYyhjdHggYW5kcm9pZC5SZWdpc3Rlck11dGF0b3JzQ29udGV4dCkgewotCQkJCWN0eC5Cb3R0b21VcCgiY2hlY2tJbXBvcnRzIiwgY2hlY2tJbXBvcnRzKQotCQkJCWN0eC5Ub3BEb3duKCJjcmVhdGVBaWRsSW50ZXJmYWNlIiwgY3JlYXRlQWlkbEludGVyZmFjZU11dGF0b3IpCi0JCQl9KQotCi0JCQljdHguUG9zdERlcHNNdXRhdG9ycyhmdW5jKGN0eCBhbmRyb2lkLlJlZ2lzdGVyTXV0YXRvcnNDb250ZXh0KSB7Ci0JCQkJY3R4LkJvdHRvbVVwKCJjaGVja1Vuc3RhYmxlTW9kdWxlIiwgY2hlY2tVbnN0YWJsZU1vZHVsZU11dGF0b3IpLlBhcmFsbGVsKCkKLQkJCQljdHguQm90dG9tVXAoInJlY29yZFZlcnNpb25zIiwgcmVjb3JkVmVyc2lvbnMpLlBhcmFsbGVsKCkKLQkJCQljdHguQm90dG9tVXAoImNoZWNrRHVwbGljYXRlZFZlcnNpb25zIiwgY2hlY2tEdXBsaWNhdGVkVmVyc2lvbnMpLlBhcmFsbGVsKCkKLQkJCX0pCisJCQljdHguUHJlQXJjaE11dGF0b3JzKHJlZ2lzdGVyUHJlQXJjaE11dGF0b3JzKQorCQkJY3R4LlBvc3REZXBzTXV0YXRvcnMocmVnaXN0ZXJQb3N0RGVwc011dGF0b3JzKQogCQl9KSwKIAkpCiAKQEAgLTI0NCw5ICsyNTUsMTAgQEAKIAl9YAogCWV4cGVjdGVkRXJyb3IgOj0gYG1vZHVsZSAiZm9vX2ludGVyZmFjZSI6IHZlcnNpb25zOiBtdXN0IGJlIHNldCBcKG5lZWQgdG8gYmUgZnJvemVuXCkgd2hlbiAidW5zdGFibGUiIGlzIGZhbHNlLCBQTEFURk9STV9WRVJTSU9OX0NPREVOQU1FIGlzIFJFTCwgYW5kICJvd25lciIgcHJvcGVydHkgaXMgbWlzc2luZy5gCiAJdGVzdEFpZGxFcnJvcih0LCBleHBlY3RlZEVycm9yLCB2aW50ZldpdGhvdXRWZXJzaW9uQnAsIHNldFJlbGVhc2VFbnYoKSkKKwl0ZXN0QWlkbEVycm9yKHQsIGV4cGVjdGVkRXJyb3IsIHZpbnRmV2l0aG91dFZlcnNpb25CcCwgc2V0VGVzdEZyZWV6ZUVudigpKQogCiAJY3R4LCBfIDo9IHRlc3RBaWRsKHQsIHZpbnRmV2l0aG91dFZlcnNpb25CcCkKLQlhc3NlcnRNb2R1bGVzRXhpc3RzKHQsIGN0eCwgImZvby1WMS1qYXZhIiwgImZvby1WMS1ydXN0IiwgImZvby1WMS1jcHAiLCAiZm9vLVYxLW5kayIsICJmb28tVjEtbmRrX3BsYXRmb3JtIikKKwlhc3NlcnRNb2R1bGVzRXhpc3RzKHQsIGN0eCwgImZvby1WMS1qYXZhIiwgImZvby1WMS1ydXN0IiwgImZvby1WMS1jcHAiLCAiZm9vLVYxLW5kayIpCiB9CiAKIC8vIENoZWNrIGlmIHVzaW5nIHVuc3RhYmxlIHZlcnNpb24gaW4gcmVsZWFzZSBjYXVzZSBhbiBlcnJvci4KQEAgLTI2NSwxNSArMjc3LDE1IEBACiAJCW5hbWU6ICJiYXIiLAogCQlsaWJzOiBbImZvby1WMi1qYXZhIl0sCiAJfWAKKwlmaWxlcyA6PSB3aXRoRmlsZXMobWFwW3N0cmluZ11bXWJ5dGV7CisJCSJhaWRsX2FwaS9mb28vMS9mb28uMS5haWRsIjogbmlsLAorCQkiYWlkbF9hcGkvZm9vLzEvLmhhc2giOiAgICAgIG5pbCwKKwl9KQogCiAJZXhwZWN0ZWRFcnJvciA6PSBgZm9vLVYyLWphdmEgaXMgZGlzYWxsb3dlZCBpbiByZWxlYXNlIHZlcnNpb24gYmVjYXVzZSBpdCBpcyB1bnN0YWJsZS5gCi0JdGVzdEFpZGxFcnJvcih0LCBleHBlY3RlZEVycm9yLCB1bnN0YWJsZVZlcnNpb25Vc2FnZUluSmF2YUJwLCBzZXRSZWxlYXNlRW52KCksIHdpdGhGaWxlcyhtYXBbc3RyaW5nXVtdYnl0ZXsKLQkJImFpZGxfYXBpL2Zvby8xL2Zvby4xLmFpZGwiOiBuaWwsCi0JfSkpCi0KLQl0ZXN0QWlkbCh0LCB1bnN0YWJsZVZlcnNpb25Vc2FnZUluSmF2YUJwLCB3aXRoRmlsZXMobWFwW3N0cmluZ11bXWJ5dGV7Ci0JCSJhaWRsX2FwaS9mb28vMS9mb28uMS5haWRsIjogbmlsLAotCX0pKQorCXRlc3RBaWRsRXJyb3IodCwgZXhwZWN0ZWRFcnJvciwgdW5zdGFibGVWZXJzaW9uVXNhZ2VJbkphdmFCcCwgc2V0UmVsZWFzZUVudigpLCBmaWxlcykKKwl0ZXN0QWlkbEVycm9yKHQsIGV4cGVjdGVkRXJyb3IsIHVuc3RhYmxlVmVyc2lvblVzYWdlSW5KYXZhQnAsIHNldFRlc3RGcmVlemVFbnYoKSwgZmlsZXMpCisJdGVzdEFpZGwodCwgdW5zdGFibGVWZXJzaW9uVXNhZ2VJbkphdmFCcCwgZmlsZXMpCiAKIAkvLyBBIHN0YWJsZSB2ZXJzaW9uIGNhbiBiZSB1c2VkIGluIHJlbGVhc2UgdmVyc2lvbgogCXN0YWJsZVZlcnNpb25Vc2FnZUluSmF2YUJwIDo9IGAKQEAgLTI5MSwxMyArMzAzLDM5IEBACiAJCWxpYnM6IFsiZm9vLVYxLWphdmEiXSwKIAl9YAogCi0JdGVzdEFpZGwodCwgc3RhYmxlVmVyc2lvblVzYWdlSW5KYXZhQnAsIHNldFJlbGVhc2VFbnYoKSwgd2l0aEZpbGVzKG1hcFtzdHJpbmddW11ieXRlewotCQkiYWlkbF9hcGkvZm9vLzEvZm9vLjEuYWlkbCI6IG5pbCwKLQl9KSkKKwl0ZXN0QWlkbCh0LCBzdGFibGVWZXJzaW9uVXNhZ2VJbkphdmFCcCwgc2V0UmVsZWFzZUVudigpLCBmaWxlcykKKwl0ZXN0QWlkbCh0LCBzdGFibGVWZXJzaW9uVXNhZ2VJbkphdmFCcCwgc2V0VGVzdEZyZWV6ZUVudigpLCBmaWxlcykKKwl0ZXN0QWlkbCh0LCBzdGFibGVWZXJzaW9uVXNhZ2VJbkphdmFCcCwgZmlsZXMpCit9CiAKLQl0ZXN0QWlkbCh0LCBzdGFibGVWZXJzaW9uVXNhZ2VJbkphdmFCcCwgd2l0aEZpbGVzKG1hcFtzdHJpbmddW11ieXRleworZnVuYyBUZXN0VXNpbmdVbnN0YWJsZVZlcnNpb25JbmRpcmVjdGx5SW5SZWxlYXNlKHQgKnRlc3RpbmcuVCkgeworCXVuc3RhYmxlVmVyc2lvblVzYWdlSW5KYXZhQnAgOj0gYAorCWFpZGxfaW50ZXJmYWNlIHsKKwkJbmFtZTogInh4eCIsCisJCXNyY3M6IFsiSUZvby5haWRsIl0sCisJCXZlcnNpb25zOiBbIjEiXSwKKwl9CisJYWlkbF9pbnRlcmZhY2UgeworCQluYW1lOiAiZm9vIiwKKwkJaW1wb3J0czogWyJ4eHgtVjIiXSwgICAgLy8gbm90IE9LCisJCXZlcnNpb25zOiBbIjEiXSwKKwkJc3JjczogWyJJRm9vLmFpZGwiXSwKKwl9CisJamF2YV9saWJyYXJ5IHsKKwkJbmFtZTogImJhciIsCisJCWxpYnM6IFsiZm9vLVYxLWphdmEiXSwgIC8vIE9LCisJfWAKKwlmaWxlcyA6PSB3aXRoRmlsZXMobWFwW3N0cmluZ11bXWJ5dGV7CiAJCSJhaWRsX2FwaS9mb28vMS9mb28uMS5haWRsIjogbmlsLAotCX0pKQorCQkiYWlkbF9hcGkvZm9vLzEvLmhhc2giOiAgICAgIG5pbCwKKwkJImFpZGxfYXBpL3h4eC8xL2Zvby4xLmFpZGwiOiBuaWwsCisJCSJhaWRsX2FwaS94eHgvMS8uaGFzaCI6ICAgICAgbmlsLAorCX0pCisKKwlleHBlY3RlZEVycm9yIDo9IGB4eHgtVjItamF2YSBpcyBkaXNhbGxvd2VkIGluIHJlbGVhc2UgdmVyc2lvbiBiZWNhdXNlIGl0IGlzIHVuc3RhYmxlLmAKKwl0ZXN0QWlkbEVycm9yKHQsIGV4cGVjdGVkRXJyb3IsIHVuc3RhYmxlVmVyc2lvblVzYWdlSW5KYXZhQnAsIHNldFJlbGVhc2VFbnYoKSwgZmlsZXMpCisJdGVzdEFpZGxFcnJvcih0LCBleHBlY3RlZEVycm9yLCB1bnN0YWJsZVZlcnNpb25Vc2FnZUluSmF2YUJwLCBzZXRUZXN0RnJlZXplRW52KCksIGZpbGVzKQorCXRlc3RBaWRsKHQsIHVuc3RhYmxlVmVyc2lvblVzYWdlSW5KYXZhQnAsIGZpbGVzKQogfQogCiAvLyBUaGUgbW9kdWxlIHdoaWNoIGhhcyBuZXZlciBiZWVuIGZyb3plbiBhbmQgaXMgbm90ICJ1bnN0YWJsZSIgaXMgbm90IGFsbG93ZWQgaW4gcmVsZWFzZSB2ZXJzaW9uLgpAQCAtMzE3LDYgKzM1NSw3IEBACiAKIAlleHBlY3RlZEVycm9yIDo9IGAiZm9vX2ludGVyZmFjZSI6IHZlcnNpb25zOiBtdXN0IGJlIHNldCBcKG5lZWQgdG8gYmUgZnJvemVuXCkgd2hlbiAidW5zdGFibGUiIGlzIGZhbHNlLCBQTEFURk9STV9WRVJTSU9OX0NPREVOQU1FIGlzIFJFTCwgYW5kICJvd25lciIgcHJvcGVydHkgaXMgbWlzc2luZy5gCiAJdGVzdEFpZGxFcnJvcih0LCBleHBlY3RlZEVycm9yLCBub25WZXJzaW9uZWRNb2R1bGVVc2FnZUluSmF2YUJwLCBzZXRSZWxlYXNlRW52KCkpCisJdGVzdEFpZGxFcnJvcih0LCBleHBlY3RlZEVycm9yLCBub25WZXJzaW9uZWRNb2R1bGVVc2FnZUluSmF2YUJwLCBzZXRUZXN0RnJlZXplRW52KCkpCiAJdGVzdEFpZGwodCwgbm9uVmVyc2lvbmVkTW9kdWxlVXNhZ2VJbkphdmFCcCkKIAogCW5vblZlcnNpb25lZFVuc3RhYmxlTW9kdWxlVXNhZ2VJbkphdmFCcCA6PSBgCkBAIC0zMzQsOSArMzczLDUxIEBACiAJfWAKIAogCXRlc3RBaWRsKHQsIG5vblZlcnNpb25lZFVuc3RhYmxlTW9kdWxlVXNhZ2VJbkphdmFCcCwgc2V0UmVsZWFzZUVudigpKQorCXRlc3RBaWRsKHQsIG5vblZlcnNpb25lZFVuc3RhYmxlTW9kdWxlVXNhZ2VJbkphdmFCcCwgc2V0VGVzdEZyZWV6ZUVudigpKQogCXRlc3RBaWRsKHQsIG5vblZlcnNpb25lZFVuc3RhYmxlTW9kdWxlVXNhZ2VJbkphdmFCcCkKIH0KIAorZnVuYyBUZXN0Tm9uVmVyc2lvbmVkTW9kdWxlT3duZWRCeVRlc3RVc2FnZUluUmVsZWFzZSh0ICp0ZXN0aW5nLlQpIHsKKwlub25WZXJzaW9uZWRNb2R1bGVVc2FnZUluSmF2YUJwIDo9IGAKKwlhaWRsX2ludGVyZmFjZSB7CisJCW5hbWU6ICJmb28iLAorCQlvd25lcjogInRlc3QiLAorCQlzcmNzOiBbCisJCQkiSUZvby5haWRsIiwKKwkJXSwKKwl9CisKKwlqYXZhX2xpYnJhcnkgeworCQluYW1lOiAiYmFyIiwKKwkJbGliczogWyJmb28tVjEtamF2YSJdLAorCX1gCisKKwlleHBlY3RlZEVycm9yIDo9IGAiZm9vX2ludGVyZmFjZSI6IHZlcnNpb25zOiBtdXN0IGJlIHNldCBcKG5lZWQgdG8gYmUgZnJvemVuXCkgd2hlbiAidW5zdGFibGUiIGlzIGZhbHNlLCBQTEFURk9STV9WRVJTSU9OX0NPREVOQU1FIGlzIFJFTCwgYW5kICJvd25lciIgcHJvcGVydHkgaXMgbWlzc2luZy5gCisJdGVzdEFpZGwodCwgbm9uVmVyc2lvbmVkTW9kdWxlVXNhZ2VJbkphdmFCcCwgc2V0UmVsZWFzZUVudigpKQorCXRlc3RBaWRsRXJyb3IodCwgZXhwZWN0ZWRFcnJvciwgbm9uVmVyc2lvbmVkTW9kdWxlVXNhZ2VJbkphdmFCcCwgc2V0VGVzdEZyZWV6ZUVudigpKQorCXRlc3RBaWRsKHQsIG5vblZlcnNpb25lZE1vZHVsZVVzYWdlSW5KYXZhQnApCit9CisKK2Z1bmMgVGVzdE5vblZlcnNpb25lZE1vZHVsZU93bmVkQnlPdGhlclVzYWdlSW5SZWxlYXNlKHQgKnRlc3RpbmcuVCkgeworCW5vblZlcnNpb25lZE1vZHVsZVVzYWdlSW5KYXZhQnAgOj0gYAorCWFpZGxfaW50ZXJmYWNlIHsKKwkJbmFtZTogImZvbyIsCisJCW93bmVyOiAidW5rbm93bi1vd25lciIsCisJCXNyY3M6IFsKKwkJCSJJRm9vLmFpZGwiLAorCQldLAorCX0KKworCWphdmFfbGlicmFyeSB7CisJCW5hbWU6ICJiYXIiLAorCQlsaWJzOiBbImZvby1WMS1qYXZhIl0sCisJfWAKKworCXRlc3RBaWRsKHQsIG5vblZlcnNpb25lZE1vZHVsZVVzYWdlSW5KYXZhQnAsIHNldFJlbGVhc2VFbnYoKSkKKwl0ZXN0QWlkbCh0LCBub25WZXJzaW9uZWRNb2R1bGVVc2FnZUluSmF2YUJwLCBzZXRUZXN0RnJlZXplRW52KCkpCisJdGVzdEFpZGwodCwgbm9uVmVyc2lvbmVkTW9kdWxlVXNhZ2VJbkphdmFCcCkKK30KKwogZnVuYyBUZXN0SW1wb3J0SW5SZWxlYXNlKHQgKnRlc3RpbmcuVCkgewogCWltcG9ydEluUmVsZWFzZSA6PSBgCiAJYWlkbF9pbnRlcmZhY2UgewpAQCAtMzQ0LDcgKzQyNSw3IEBACiAJCXNyY3M6IFsKIAkJCSJJRm9vLmFpZGwiLAogCQldLAotCQlpbXBvcnRzOiBbImJhciJdLAorCQlpbXBvcnRzOiBbImJhci1WMSJdLAogCQl2ZXJzaW9uczogWyIxIl0sCiAJfQogCkBAIC0zNTYsMTMgKzQzNywxNiBAQAogCQl2ZXJzaW9uczogWyIxIl0sCiAJfQogCWAKLQotCXRlc3RBaWRsKHQsIGltcG9ydEluUmVsZWFzZSwgc2V0UmVsZWFzZUVudigpLCB3aXRoRmlsZXMobWFwW3N0cmluZ11bXWJ5dGV7CisJZmlsZXMgOj0gd2l0aEZpbGVzKG1hcFtzdHJpbmddW11ieXRlewogCQkiYWlkbF9hcGkvZm9vLzEvZm9vLjEuYWlkbCI6IG5pbCwKIAkJImFpZGxfYXBpL2Zvby8xLy5oYXNoIjogICAgICBuaWwsCiAJCSJhaWRsX2FwaS9iYXIvMS9iYXIuMS5haWRsIjogbmlsLAogCQkiYWlkbF9hcGkvYmFyLzEvLmhhc2giOiAgICAgIG5pbCwKLQl9KSkKKwl9KQorCisJdGVzdEFpZGwodCwgaW1wb3J0SW5SZWxlYXNlLCBzZXRSZWxlYXNlRW52KCksIGZpbGVzKQorCXRlc3RBaWRsKHQsIGltcG9ydEluUmVsZWFzZSwgc2V0VGVzdEZyZWV6ZUVudigpLCBmaWxlcykKKwl0ZXN0QWlkbCh0LCBpbXBvcnRJblJlbGVhc2UsIGZpbGVzKQogfQogCiBmdW5jIFRlc3RVbnN0YWJsZVZlcnNpb25lZE1vZHVsZVVzYWdlSW5SZWxlYXNlKHQgKnRlc3RpbmcuVCkgewpAQCAtMzgyLDExICs0NjYsNjQgQEAKIAogCWV4cGVjdGVkRXJyb3IgOj0gYEFuZHJvaWQuYnA6MTA6MjogbW9kdWxlIFwiYmFyXCIgdmFyaWFudCBcImFuZHJvaWRfY29tbW9uXCI6IGZvby1WMi1qYXZhIGlzIGRpc2FsbG93ZWQgaW4gcmVsZWFzZSB2ZXJzaW9uIGJlY2F1c2UgaXQgaXMgdW5zdGFibGUsIGFuZCBpdHMgXCJvd25lclwiIHByb3BlcnR5IGlzIG1pc3NpbmcuYAogCXRlc3RBaWRsRXJyb3IodCwgZXhwZWN0ZWRFcnJvciwgbm9uVmVyc2lvbmVkTW9kdWxlVXNhZ2VJbkphdmFCcCwgc2V0UmVsZWFzZUVudigpKQorCXRlc3RBaWRsRXJyb3IodCwgZXhwZWN0ZWRFcnJvciwgbm9uVmVyc2lvbmVkTW9kdWxlVXNhZ2VJbkphdmFCcCwgc2V0VGVzdEZyZWV6ZUVudigpKQogCXRlc3RBaWRsKHQsIG5vblZlcnNpb25lZE1vZHVsZVVzYWdlSW5KYXZhQnAsIHdpdGhGaWxlcyhtYXBbc3RyaW5nXVtdYnl0ZXsKIAkJImFpZGxfYXBpL2Zvby8xL2Zvby4xLmFpZGwiOiBuaWwsCisJCSJhaWRsX2FwaS9mb28vMS8uaGFzaCI6ICAgICAgbmlsLAogCX0pKQogfQogCitmdW5jIFRlc3RVbnN0YWJsZVZlcnNpb25lZE1vZHVsZU93bmVkQnlUZXN0VXNhZ2VJblJlbGVhc2UodCAqdGVzdGluZy5UKSB7CisJbm9uVmVyc2lvbmVkTW9kdWxlVXNhZ2VJbkphdmFCcCA6PSBgCisJYWlkbF9pbnRlcmZhY2UgeworCQluYW1lOiAiZm9vIiwKKwkJb3duZXI6ICJ0ZXN0IiwKKwkJc3JjczogWworCQkJIklGb28uYWlkbCIsCisJCV0sCisJCXZlcnNpb25zOiBbIjEiXSwKKwl9CisKKwlqYXZhX2xpYnJhcnkgeworCQluYW1lOiAiYmFyIiwKKwkJbGliczogWyJmb28tVjItamF2YSJdLAorCX1gCisJZmlsZXMgOj0gd2l0aEZpbGVzKG1hcFtzdHJpbmddW11ieXRleworCQkiYWlkbF9hcGkvZm9vLzEvZm9vLjEuYWlkbCI6IG5pbCwKKwkJImFpZGxfYXBpL2Zvby8xLy5oYXNoIjogICAgICBuaWwsCisJfSkKKworCWV4cGVjdGVkRXJyb3IgOj0gYEFuZHJvaWQuYnA6MTE6MjogbW9kdWxlIFwiYmFyXCIgdmFyaWFudCBcImFuZHJvaWRfY29tbW9uXCI6IGZvby1WMi1qYXZhIGlzIGRpc2FsbG93ZWQgaW4gcmVsZWFzZSB2ZXJzaW9uIGJlY2F1c2UgaXQgaXMgdW5zdGFibGUsIGFuZCBpdHMgXCJvd25lclwiIHByb3BlcnR5IGlzIG1pc3NpbmcuYAorCXRlc3RBaWRsKHQsIG5vblZlcnNpb25lZE1vZHVsZVVzYWdlSW5KYXZhQnAsIHNldFJlbGVhc2VFbnYoKSwgZmlsZXMpCisJdGVzdEFpZGxFcnJvcih0LCBleHBlY3RlZEVycm9yLCBub25WZXJzaW9uZWRNb2R1bGVVc2FnZUluSmF2YUJwLCBzZXRUZXN0RnJlZXplRW52KCksIGZpbGVzKQorCXRlc3RBaWRsKHQsIG5vblZlcnNpb25lZE1vZHVsZVVzYWdlSW5KYXZhQnAsIGZpbGVzKQorfQorCitmdW5jIFRlc3RVbnN0YWJsZVZlcnNpb25lZE1vZHVsZU93bmVkQnlPdGhlclVzYWdlSW5SZWxlYXNlKHQgKnRlc3RpbmcuVCkgeworCW5vblZlcnNpb25lZE1vZHVsZVVzYWdlSW5KYXZhQnAgOj0gYAorCWFpZGxfaW50ZXJmYWNlIHsKKwkJbmFtZTogImZvbyIsCisJCW93bmVyOiAidW5rbm93bi1vd25lciIsCisJCXNyY3M6IFsKKwkJCSJJRm9vLmFpZGwiLAorCQldLAorCQl2ZXJzaW9uczogWyIxIl0sCisJfQorCisJamF2YV9saWJyYXJ5IHsKKwkJbmFtZTogImJhciIsCisJCWxpYnM6IFsiZm9vLVYyLWphdmEiXSwKKwl9YAorCWZpbGVzIDo9IHdpdGhGaWxlcyhtYXBbc3RyaW5nXVtdYnl0ZXsKKwkJImFpZGxfYXBpL2Zvby8xL2Zvby4xLmFpZGwiOiBuaWwsCisJCSJhaWRsX2FwaS9mb28vMS8uaGFzaCI6ICAgICAgbmlsLAorCX0pCisKKwl0ZXN0QWlkbCh0LCBub25WZXJzaW9uZWRNb2R1bGVVc2FnZUluSmF2YUJwLCBzZXRSZWxlYXNlRW52KCksIGZpbGVzKQorCXRlc3RBaWRsKHQsIG5vblZlcnNpb25lZE1vZHVsZVVzYWdlSW5KYXZhQnAsIHNldFRlc3RGcmVlemVFbnYoKSwgZmlsZXMpCisJdGVzdEFpZGwodCwgbm9uVmVyc2lvbmVkTW9kdWxlVXNhZ2VJbkphdmFCcCwgZmlsZXMpCit9CisKIGZ1bmMgVGVzdFVuc3RhYmxlTW9kdWxlcyh0ICp0ZXN0aW5nLlQpIHsKIAl0ZXN0QWlkbEVycm9yKHQsIGBtb2R1bGUgImZvb19pbnRlcmZhY2UiOiBzdGFiaWxpdHk6IG11c3QgYmUgZW1wdHkgd2hlbiAidW5zdGFibGUiIGlzIHRydWVgLCBgCiAJCWFpZGxfaW50ZXJmYWNlIHsKQEAgLTQzNyw3ICs1NzQsNyBAQAogCQl9CiAJYCkKIAotCWFzc2VydE1vZHVsZXNFeGlzdHModCwgY3R4LCAiZm9vLWphdmEiLCAiZm9vLXJ1c3QiLCAiZm9vLWNwcCIsICJmb28tbmRrIiwgImZvby1uZGtfcGxhdGZvcm0iKQorCWFzc2VydE1vZHVsZXNFeGlzdHModCwgY3R4LCAiZm9vLWphdmEiLCAiZm9vLXJ1c3QiLCAiZm9vLWNwcCIsICJmb28tbmRrIikKIH0KIAogZnVuYyBUZXN0Q3JlYXRlc01vZHVsZXNXaXRoTm9WZXJzaW9ucyh0ICp0ZXN0aW5nLlQpIHsKQEAgLTQ1NSwxMiArNTkyLDEyIEBACiAJCX0KIAlgKQogCi0JYXNzZXJ0TW9kdWxlc0V4aXN0cyh0LCBjdHgsICJmb28tVjEtamF2YSIsICJmb28tVjEtcnVzdCIsICJmb28tVjEtY3BwIiwgImZvby1WMS1uZGsiLCAiZm9vLVYxLW5ka19wbGF0Zm9ybSIpCisJYXNzZXJ0TW9kdWxlc0V4aXN0cyh0LCBjdHgsICJmb28tVjEtamF2YSIsICJmb28tVjEtcnVzdCIsICJmb28tVjEtY3BwIiwgImZvby1WMS1uZGsiKQogfQogCiBmdW5jIFRlc3RDcmVhdGVzTW9kdWxlc1dpdGhGcm96ZW5WZXJzaW9ucyh0ICp0ZXN0aW5nLlQpIHsKIAkvLyBFYWNoIHZlcnNpb24gc2hvdWxkIGJlIHVuZGVyIGFpZGxfYXBpLzxuYW1lPi88dmVyPgotCXRlc3RBaWRsRXJyb3IodCwgYGFpZGxfYXBpL2Zvby8xYCwgYAorCXRlc3RBaWRsRXJyb3IodCwgYE5vIHNvdXJjZXMgZm9yIGEgcHJldmlvdXMgdmVyc2lvbiBpbiBhaWRsX2FwaS9mb28vMS4gV2FzIGEgdmVyc2lvbiBtYW51YWxseSBhZGRlZCB0byAuYnAgZmlsZT9gLCBgCiAJCWFpZGxfaW50ZXJmYWNlIHsKIAkJCW5hbWU6ICJmb28iLAogCQkJc3JjczogWwpAQCAtNDk0LDEzICs2MzEsMTQgQEAKIAkJfQogCWAsIHdpdGhGaWxlcyhtYXBbc3RyaW5nXVtdYnl0ZXsKIAkJImFpZGxfYXBpL2Zvby8xL2Zvby4xLmFpZGwiOiBuaWwsCisJCSJhaWRsX2FwaS9mb28vMS8uaGFzaCI6ICAgICAgbmlsLAogCX0pKQogCiAJLy8gRm9yIGZyb3plbiB2ZXJzaW9uICIxIgotCWFzc2VydE1vZHVsZXNFeGlzdHModCwgY3R4LCAiZm9vLVYxLWphdmEiLCAiZm9vLVYxLXJ1c3QiLCAiZm9vLVYxLWNwcCIsICJmb28tVjEtbmRrIiwgImZvby1WMS1uZGtfcGxhdGZvcm0iKQorCWFzc2VydE1vZHVsZXNFeGlzdHModCwgY3R4LCAiZm9vLVYxLWphdmEiLCAiZm9vLVYxLXJ1c3QiLCAiZm9vLVYxLWNwcCIsICJmb28tVjEtbmRrIikKIAogCS8vIEZvciBUb1QgKGN1cnJlbnQpCi0JYXNzZXJ0TW9kdWxlc0V4aXN0cyh0LCBjdHgsICJmb28tVjItamF2YSIsICJmb28tVjItcnVzdCIsICJmb28tVjItY3BwIiwgImZvby1WMi1uZGsiLCAiZm9vLVYyLW5ka19wbGF0Zm9ybSIpCisJYXNzZXJ0TW9kdWxlc0V4aXN0cyh0LCBjdHgsICJmb28tVjItamF2YSIsICJmb28tVjItcnVzdCIsICJmb28tVjItY3BwIiwgImZvby1WMi1uZGsiKQogfQogCiBmdW5jIFRlc3RFcnJvcnNXaXRoVW5zb3J0ZWRWZXJzaW9ucyh0ICp0ZXN0aW5nLlQpIHsKQEAgLTYyOCw3ICs3NjYsOSBAQAogCQl9CiAJYCwgd2l0aEZpbGVzKG1hcFtzdHJpbmddW11ieXRlewogCQkiYWlkbF9hcGkvZm9vLzEvZm9vLjEuYWlkbCI6IG5pbCwKKwkJImFpZGxfYXBpL2Zvby8xLy5oYXNoIjogICAgICBuaWwsCiAJCSJhaWRsX2FwaS9mb28vMi9mb28uMi5haWRsIjogbmlsLAorCQkiYWlkbF9hcGkvZm9vLzIvLmhhc2giOiAgICAgIG5pbCwKIAl9KSkKIAogCS8vIGFsaWFzIGZvciB0aGUgbGF0ZXN0IGZyb3plbiB2ZXJzaW9uICg9MikKQEAgLTY0Niw3ICs3ODYsNyBAQAogCWFzc2VydE91dHB1dCgiZm9vLVYzLWNwcCIsIG5hdGl2ZVZhcmlhbnQsICJmb28tVjMtY3BwLnNvIikKIAlhc3NlcnRPdXRwdXQoImZvby1WMy1ydXN0IiwgbmF0aXZlUnVzdFZhcmlhbnQsICJsaWJmb29fVjMuZHlsaWIuc28iKQogCi0JLy8gc2tpcCBuZGsvbmRrX3BsYXRmb3JtIHNpbmNlIHRoZXkgZm9sbG93IHRoZSBzYW1lIHJ1bGUgd2l0aCBjcHAKKwkvLyBza2lwIG5kayBzaW5jZSB0aGV5IGZvbGxvdyB0aGUgc2FtZSBydWxlIHdpdGggY3BwCiB9CiAKIGZ1bmMgVGVzdEltcG9ydHModCAqdGVzdGluZy5UKSB7CkBAIC02NjksNyArODA5LDcgQEAKIAkJCQkiSUZvby5haWRsIiwKIAkJCV0sCiAJCQlpbXBvcnRzOiBbCi0JCQkJImJhciIsCisJCQkJImJhci1WMSIsCiAJCQldCiAJCX0KIAkJYWlkbF9pbnRlcmZhY2UgewpAQCAtNjkyLDcgKzgzMiw3IEBACiAJCQkJIklGb28uYWlkbCIsCiAJCQldLAogCQkJaW1wb3J0czogWwotCQkJCSJiYXIiLAorCQkJCSJiYXItVjEiLAogCQkJXQogCQl9CiAJCWFpZGxfaW50ZXJmYWNlIHsKQEAgLTcyMCw3ICs4NjAsNyBAQAogCQkJCX0sCiAJCQl9LAogCQkJaW1wb3J0czogWwotCQkJCSJiYXIuMSIsCisJCQkJImJhci4xLVYxIiwKIAkJCV0KIAkJfQogCQlhaWRsX2ludGVyZmFjZSB7CkBAIC03NDUsNyArODg1LDcgQEAKIAogCXJ1c3RjUnVsZSA6PSBjdHguTW9kdWxlRm9yVGVzdHMoImZvby1WMS1ydXN0IiwgbmF0aXZlUnVzdFZhcmlhbnQpLlJ1bGUoInJ1c3RjIikKIAlsaWJGbGFncyA9IHJ1c3RjUnVsZS5BcmdzWyJsaWJGbGFncyJdCi0JbGliQmFyID0gZmlsZXBhdGguSm9pbigib3V0IiwgInNvb25nIiwgIi5pbnRlcm1lZGlhdGVzIiwgImJhci4xLVYxLXJ1c3QiLCBuYXRpdmVSdXN0VmFyaWFudCwgImxpYmJhcl8xX1YxLmR5bGliLnNvIikKKwlsaWJCYXIgPSBmaWxlcGF0aC5Kb2luKCJvdXQiLCAic29vbmciLCAiLmludGVybWVkaWF0ZXMiLCAiYmFyLjEtVjEtcnVzdCIsIG5hdGl2ZVJ1c3RWYXJpYW50LCAidW5zdHJpcHBlZCIsICJsaWJiYXJfMV9WMS5keWxpYi5zbyIpCiAJbGliQmFyRmxhZyA6PSAiLS1leHRlcm4gYmFyXzE9IiArIGxpYkJhcgogCWlmICFzdHJpbmdzLkNvbnRhaW5zKGxpYkZsYWdzLCBsaWJCYXJGbGFnKSB7CiAJCXQuRXJyb3JmKCIlcSBpcyBub3QgZm91bmQgaW4gJXEiLCBsaWJCYXJGbGFnLCBsaWJGbGFncykKQEAgLTc1NSw3ICs4OTUsNyBAQAogZnVuYyBUZXN0RHVwbGljYXRlZFZlcnNpb25zKHQgKnRlc3RpbmcuVCkgewogCS8vIGZvbyBkZXBlbmRzIG9uIG15aWZhY2UtVjItbmRrIHZpYSBkaXJlY3QgZGVwIGFuZCBhbHNvIG9uCiAJLy8gbXlpZmFjZS1WMS1uZGsgdmlhIGluZGlyZWN0IGRlcC4gVGhpcyBzaG91bGQgYmUgcHJvaGliaXRlZC4KLQl0ZXN0QWlkbEVycm9yKHQsIGBkZXBlbmRzIG9uIG11bHRpcGxlIHZlcnNpb25zIG9mIHRoZSBzYW1lIGFpZGxfaW50ZXJmYWNlOiBteWlmYWNlLVYxLW5kaywgbXlpZmFjZS1WMi1uZGtgLCBgCisJdGVzdEFpZGxFcnJvcih0LCBgZGVwZW5kcyBvbiBtdWx0aXBsZSB2ZXJzaW9ucyBvZiB0aGUgc2FtZSBhaWRsX2ludGVyZmFjZTogbXlpZmFjZS1WMS0uKiwgbXlpZmFjZS1WMi0uKmAsIGAKIAkJYWlkbF9pbnRlcmZhY2UgewogCQkJbmFtZTogIm15aWZhY2UiLAogCQkJc3JjczogWyJJRm9vLmFpZGwiXSwKQEAgLTc3OCw3ICs5MTgsNyBAQAogCQkiYWlkbF9hcGkvbXlpZmFjZS8yL215aWZhY2UuMi5haWRsIjogbmlsLAogCQkiYWlkbF9hcGkvbXlpZmFjZS8yLy5oYXNoIjogICAgICAgICAgbmlsLAogCX0pKQotCXRlc3RBaWRsRXJyb3IodCwgYGRlcGVuZHMgb24gbXVsdGlwbGUgdmVyc2lvbnMgb2YgdGhlIHNhbWUgYWlkbF9pbnRlcmZhY2U6IG15aWZhY2UtVjEtbmRrLCBteWlmYWNlLVYyLW5ka2AsIGAKKwl0ZXN0QWlkbEVycm9yKHQsIGBkZXBlbmRzIG9uIG11bHRpcGxlIHZlcnNpb25zIG9mIHRoZSBzYW1lIGFpZGxfaW50ZXJmYWNlOiBteWlmYWNlLVYxLS4qLCBteWlmYWNlLVYyLS4qYCwgYAogCQlhaWRsX2ludGVyZmFjZSB7CiAJCQluYW1lOiAibXlpZmFjZSIsCiAJCQlzcmNzOiBbIklGb28uYWlkbCJdLApAQCAtNzg4LDcgKzkyOCw3IEBACiAJCWFpZGxfaW50ZXJmYWNlIHsKIAkJCW5hbWU6ICJteWlmYWNlMiIsCiAJCQlzcmNzOiBbIklCYXIuYWlkbCJdLAotCQkJaW1wb3J0czogWyJteWlmYWNlIl0KKwkJCWltcG9ydHM6IFsibXlpZmFjZS1WMiJdCiAJCX0KIAogCQljY19saWJyYXJ5IHsKQEAgLTgwMCwyMiArOTQwLDE3IEBACiAJCSJhaWRsX2FwaS9teWlmYWNlLzEvbXlpZmFjZS4xLmFpZGwiOiBuaWwsCiAJCSJhaWRsX2FwaS9teWlmYWNlLzEvLmhhc2giOiAgICAgICAgICBuaWwsCiAJfSkpCi0JdGVzdEFpZGxFcnJvcih0LCBgZGVwZW5kcyBvbiBtdWx0aXBsZSB2ZXJzaW9ucyBvZiB0aGUgc2FtZSBhaWRsX2ludGVyZmFjZTogbXlpZmFjZS1WMS1uZGstc291cmNlLCBteWlmYWNlLVYyLW5ka2AsIGAKKwl0ZXN0QWlkbEVycm9yKHQsIGBkZXBlbmRzIG9uIG11bHRpcGxlIHZlcnNpb25zIG9mIHRoZSBzYW1lIGFpZGxfaW50ZXJmYWNlOiBteWlmYWNlLVYxLS4qLCBteWlmYWNlLVYyLS4qYCwgYAogCQlhaWRsX2ludGVyZmFjZSB7CiAJCQluYW1lOiAibXlpZmFjZSIsCiAJCQlzcmNzOiBbIklGb28uYWlkbCJdLAogCQkJdmVyc2lvbnM6IFsiMSJdLAotCQkJYmFja2VuZDogewotCQkJCW5kazogewotCQkJCQlzcmNzX2F2YWlsYWJsZTogdHJ1ZSwKLQkJCQl9LAotCQkJfSwKIAkJfQogCiAJCWFpZGxfaW50ZXJmYWNlIHsKIAkJCW5hbWU6ICJteWlmYWNlMiIsCiAJCQlzcmNzOiBbIklCYXIuYWlkbCJdLAotCQkJaW1wb3J0czogWyJteWlmYWNlIl0KKwkJCWltcG9ydHM6IFsibXlpZmFjZS1WMiJdCiAJCX0KIAogCQljY19saWJyYXJ5IHsKQEAgLTgyOCwyMiArOTYzLDMyIEBACiAJCSJhaWRsX2FwaS9teWlmYWNlLzEvbXlpZmFjZS4xLmFpZGwiOiBuaWwsCiAJCSJhaWRsX2FwaS9teWlmYWNlLzEvLmhhc2giOiAgICAgICAgICBuaWwsCiAJfSkpCisJLy8gT2theSB0byByZWZlcmVuY2UgdHdvIGRpZmZlcmVudAogCXRlc3RBaWRsKHQsIGAKIAkJYWlkbF9pbnRlcmZhY2UgewogCQkJbmFtZTogIm15aWZhY2UiLAogCQkJc3JjczogWyJJRm9vLmFpZGwiXSwKIAkJCXZlcnNpb25zOiBbIjEiXSwKLQkJCWJhY2tlbmQ6IHsKLQkJCQluZGs6IHsKLQkJCQkJc3Jjc19hdmFpbGFibGU6IHRydWUsCi0JCQkJfSwKLQkJCX0sCisJCX0KKwkJY2NfbGlicmFyeSB7CisJCQluYW1lOiAiZm9vYmFyIiwKKwkJCXNoYXJlZF9saWJzOiBbIm15aWZhY2UtVjEtY3BwIiwgIm15aWZhY2UtVjEtbmRrIl0sCisJCX0KKwlgLCB3aXRoRmlsZXMobWFwW3N0cmluZ11bXWJ5dGV7CisJCSJhaWRsX2FwaS9teWlmYWNlLzEvbXlpZmFjZS4xLmFpZGwiOiBuaWwsCisJCSJhaWRsX2FwaS9teWlmYWNlLzEvLmhhc2giOiAgICAgICAgICBuaWwsCisJfSkpCisJdGVzdEFpZGwodCwgYAorCQlhaWRsX2ludGVyZmFjZSB7CisJCQluYW1lOiAibXlpZmFjZSIsCisJCQlzcmNzOiBbIklGb28uYWlkbCJdLAorCQkJdmVyc2lvbnM6IFsiMSJdLAogCQl9CiAKIAkJYWlkbF9pbnRlcmZhY2UgewogCQkJbmFtZTogIm15aWZhY2UyIiwKIAkJCXNyY3M6IFsiSUJhci5haWRsIl0sCi0JCQlpbXBvcnRzOiBbIm15aWZhY2UiXQorCQkJaW1wb3J0czogWyJteWlmYWNlLVYyIl0KIAkJfQogCiAJCWNjX2xpYnJhcnkgewpAQCAtODY2LDcgKzEwMTEsNyBAQAogCQlhaWRsX2ludGVyZmFjZSB7CiAJCQluYW1lOiAibXlpZmFjZTIiLAogCQkJc3JjczogWyJJQmFyLmFpZGwiXSwKLQkJCWltcG9ydHM6IFsibXlpZmFjZSJdCisJCQlpbXBvcnRzOiBbIm15aWZhY2UtVjIiXQogCQl9CiAKIAkJY2NfbGlicmFyeSB7CkBAIC05MTgsNzUgKzEwNjMsMTYgQEAKIAlgKQogfQogCi1mdW5jIFRlc3RDY01vZHVsZVdpdGhBcGV4TmFtZU1hY3JvKHQgKnRlc3RpbmcuVCkgeworZnVuYyBUZXN0UmVjb3ZlcnlBdmFpbGFibGUodCAqdGVzdGluZy5UKSB7CiAJY3R4LCBfIDo9IHRlc3RBaWRsKHQsIGAKIAkJYWlkbF9pbnRlcmZhY2UgewogCQkJbmFtZTogIm15aWZhY2UiLAorCQkJcmVjb3ZlcnlfYXZhaWxhYmxlOiB0cnVlLAogCQkJc3JjczogWyJJRm9vLmFpZGwiXSwKLQkJCWJhY2tlbmQ6IHsKLQkJCQluZGs6IHsKLQkJCQkJYXBleF9hdmFpbGFibGU6IFsibXlhcGV4Il0sCi0JCQkJfSwKLQkJCX0sCiAJCX0KLQkJYXBleCB7Ci0JCQluYW1lOiAibXlhcGV4IiwKLQkJCWtleTogIm15YXBleC5rZXkiLAotCQkJbmF0aXZlX3NoYXJlZF9saWJzOiBbIm15aWZhY2UtVjEtbmRrX3BsYXRmb3JtIl0sCi0JCQl1cGRhdGFibGU6IGZhbHNlLAotCQl9Ci0JCWFwZXhfa2V5IHsKLQkJCW5hbWU6ICJteWFwZXgua2V5IiwKLQkJCXB1YmxpY19rZXk6ICJ0ZXN0a2V5LmF2YnB1YmtleSIsCi0JCQlwcml2YXRlX2tleTogInRlc3RrZXkucGVtIiwKLQkJfQotCWAsIHdpdGhGaWxlcyhtYXBbc3RyaW5nXVtdYnl0ZXsKLQkJInN5c3RlbS9zZXBvbGljeS9hcGV4L215YXBleC1maWxlX2NvbnRleHRzIjogbmlsLAotCX0pKQotCi0JY2NSdWxlIDo9IGN0eC5Nb2R1bGVGb3JUZXN0cygibXlpZmFjZS1WMS1uZGtfcGxhdGZvcm0iLCAiYW5kcm9pZF9hcm02NF9hcm12OC1hX3N0YXRpY19teWFwZXgiKS5SdWxlKCJjYyIpCi0JYXNzZXJ0Q29udGFpbnModCwgY2NSdWxlLkFyZ3NbImNGbGFncyJdLCAiLURfX0FORFJPSURfQVBFWF9fIikKLQlhc3NlcnRDb250YWlucyh0LCBjY1J1bGUuQXJnc1siY0ZsYWdzIl0sICItRF9fQU5EUk9JRF9BUEVYX05BTUVfXz0nXCJteWFwZXhcIiciKQotCWFzc2VydENvbnRhaW5zKHQsIGNjUnVsZS5BcmdzWyJjRmxhZ3MiXSwgIi1EX19BTkRST0lEX0FQRVhfTVlBUEVYX18iKQotfQotCi1mdW5jIFRlc3RTcmNzQXZhaWxhYmxlKHQgKnRlc3RpbmcuVCkgewotCWJwIDo9IGAKLQkJYWlkbF9pbnRlcmZhY2UgewotCQkJbmFtZTogIm15aWZhY2UiLAotCQkJc3JjczogWyJJRm9vLmFpZGwiXSwKLQkJCWJhY2tlbmQ6IHsKLQkJCQlqYXZhOiB7Ci0JCQkJCXNyY3NfYXZhaWxhYmxlOiAlcywKLQkJCQl9LAotCQkJCWNwcDogewotCQkJCQlzcmNzX2F2YWlsYWJsZTogJXMsCi0JCQkJfSwKLQkJCX0sCi0JCX0KLQlgCi0JY3VzdG9taXplciA6PSB3aXRoRmlsZXMobWFwW3N0cmluZ11bXWJ5dGV7Ci0JCSJvdGhlcnBhY2thZ2UvQW5kcm9pZC5icCI6IFtdYnl0ZShgCi0JCQlqYXZhX2xpYnJhcnkgewotCQkJCW5hbWU6ICJqYXZhbGliIiwKLQkJCQlzcmNzOiBbIjpteWlmYWNlLVYxLWphdmEtc291cmNlIl0sCi0JCQl9Ci0JCQljY19saWJyYXJ5X3NoYXJlZCB7Ci0JCQkJbmFtZTogImNjbGliIiwKLQkJCQlzcmNzOiBbIjpteWlmYWNlLVYxLWNwcC1zb3VyY2UiXSwKLQkJCX0KLQkJYCksCi0JfSkKLQljdHgsIF8gOj0gdGVzdEFpZGwodCwgZm10LlNwcmludGYoYnAsICJ0cnVlIiwgInRydWUiKSwgY3VzdG9taXplcikKLQlqYXZhSW5wdXRzIDo9IGN0eC5Nb2R1bGVGb3JUZXN0cygiamF2YWxpYiIsICJhbmRyb2lkX2NvbW1vbiIpLlJ1bGUoImphdmFjIikuSW5wdXRzLlN0cmluZ3MoKQotCWFzc2VydExpc3RDb250YWlucyh0LCBqYXZhSW5wdXRzLCAibXlpZmFjZS1WMS1qYXZhLXNvdXJjZS9nZW4vSUZvby5qYXZhIikKLQljY0lucHV0IDo9IGN0eC5Nb2R1bGVGb3JUZXN0cygiY2NsaWIiLCAiYW5kcm9pZF9hcm02NF9hcm12OC1hX3NoYXJlZCIpLlJ1bGUoImNjIikuSW5wdXQuU3RyaW5nKCkKLQlhc3NlcnRDb250YWlucyh0LCBjY0lucHV0LCAibXlpZmFjZS1WMS1jcHAtc291cmNlL2dlbi9JRm9vLmNwcCIpCi0KLQl0ZXN0QWlkbEVycm9yKHQsIGBkZXBlbmRzIG9uIC8vLjpteWlmYWNlLVYxLWphdmEtc291cmNlIHdoaWNoIGlzIG5vdCB2aXNpYmxlIHRvIHRoaXMgbW9kdWxlYCwKLQkJZm10LlNwcmludGYoYnAsICJmYWxzZSIsICJ0cnVlIiksIGN1c3RvbWl6ZXIpCi0JdGVzdEFpZGxFcnJvcih0LCBgZGVwZW5kcyBvbiAvLy46bXlpZmFjZS1WMS1jcHAtc291cmNlIHdoaWNoIGlzIG5vdCB2aXNpYmxlIHRvIHRoaXMgbW9kdWxlYCwKLQkJZm10LlNwcmludGYoYnAsICJ0cnVlIiwgImZhbHNlIiksIGN1c3RvbWl6ZXIpCisJYCkKKwljdHguTW9kdWxlRm9yVGVzdHMoIm15aWZhY2UtVjEtbmRrIiwgImFuZHJvaWRfcmVjb3ZlcnlfYXJtNjRfYXJtdjgtYV9zaGFyZWQiKQorCWN0eC5Nb2R1bGVGb3JUZXN0cygibXlpZmFjZS1WMS1jcHAiLCAiYW5kcm9pZF9yZWNvdmVyeV9hcm02NF9hcm12OC1hX3NoYXJlZCIpCiB9CiAKIGZ1bmMgVGVzdFJ1c3REdXBsaWNhdGVOYW1lcyh0ICp0ZXN0aW5nLlQpIHsKQEAgLTEwMDMsNyArMTA4OSw4NiBAQAogCWApCiB9CiAKLWZ1bmMgVGVzdEFpZGxJbXBvcnRGbGFnc0ZvckluY2x1ZGVEaXJzKHQgKnRlc3RpbmcuVCkgeworZnVuYyBUZXN0QWlkbEltcG9ydEZsYWdzRm9ySW1wb3J0ZWRNb2R1bGVzKHQgKnRlc3RpbmcuVCkgeworCWN1c3RvbWl6ZXIgOj0gd2l0aEZpbGVzKG1hcFtzdHJpbmddW11ieXRleworCQkiZm9vL0FuZHJvaWQuYnAiOiBbXWJ5dGUoYAorCQkJYWlkbF9pbnRlcmZhY2UgeworCQkJCW5hbWU6ICJmb28taWZhY2UiLAorCQkJCXNyY3M6IFsiYS9Gb28uYWlkbCJdLAorCQkJCWltcG9ydHM6IFsiYmFyLWlmYWNlLVYyIl0sCisJCQkJdmVyc2lvbnM6IFsiMSJdLAorCQkJfQorCQlgKSwKKwkJImZvby9hL0Zvby5haWRsIjogbmlsLAorCQkiZm9vL2FpZGxfYXBpL2Zvby1pZmFjZS9jdXJyZW50L2EvRm9vLmFpZGwiOiBuaWwsCisJCSJmb28vYWlkbF9hcGkvZm9vLWlmYWNlLzEvYS9Gb28uYWlkbCI6ICAgICAgIG5pbCwKKwkJImZvby9haWRsX2FwaS9mb28taWZhY2UvMS8uaGFzaCI6ICAgICAgICAgICAgbmlsLAorCisJCSJiYXIvQW5kcm9pZC5icCI6IFtdYnl0ZShgCisJCQlhaWRsX2ludGVyZmFjZSB7CisJCQkJbmFtZTogImJhci1pZmFjZSIsCisJCQkJc3JjczogWyJiL0Jhci5haWRsIl0sCisJCQkJaW1wb3J0czogWyJiYXotaWZhY2UtVjEiXSwKKwkJCQl2ZXJzaW9uczogWyIxIl0sCisJCQl9CisJCWApLAorCQkiYmFyL2IvQmFyLmFpZGwiOiBuaWwsCisJCSJiYXIvYWlkbF9hcGkvYmFyLWlmYWNlL2N1cnJlbnQvYi9CYXIuYWlkbCI6IG5pbCwKKwkJImJhci9haWRsX2FwaS9iYXItaWZhY2UvMS9iL0Jhci5haWRsIjogICAgICAgbmlsLAorCQkiYmFyL2FpZGxfYXBpL2Jhci1pZmFjZS8xLy5oYXNoIjogICAgICAgICAgICBuaWwsCisKKwkJImJhei9BbmRyb2lkLmJwIjogW11ieXRlKGAKKwkJCWFpZGxfaW50ZXJmYWNlIHsKKwkJCQluYW1lOiAiYmF6LWlmYWNlIiwKKwkJCQlzcmNzOiBbImIvQmF6LmFpZGwiXSwKKwkJCQlpbmNsdWRlX2RpcnM6IFsiYmF6LWluY2x1ZGUiXSwKKwkJCQl2ZXJzaW9uczogWyIxIl0sCisJCQl9CisJCWApLAorCQkiYmF6L2IvQmF6LmFpZGwiOiBuaWwsCisJCSJiYXovYWlkbF9hcGkvYmF6LWlmYWNlL2N1cnJlbnQvYi9CYXouYWlkbCI6IG5pbCwKKwkJImJhei9haWRsX2FwaS9iYXotaWZhY2UvMS9iL0Jhei5haWRsIjogICAgICAgbmlsLAorCQkiYmF6L2FpZGxfYXBpL2Jhei1pZmFjZS8xLy5oYXNoIjogICAgICAgICAgICBuaWwsCisJfSkKKwljdHgsIF8gOj0gdGVzdEFpZGwodCwgYGAsIGN1c3RvbWl6ZXIpCisKKwkvLyBjaGVja2FwaWR1bXAgcnVsZSBpcyB0byBjb21wYXJlICJjb21wYXRpYmlsaXR5IiBiZXR3ZWVuIFRvVChkdW1wKSBhbmQgImN1cnJlbnQiCisJeworCQlydWxlIDo9IGN0eC5Nb2R1bGVGb3JUZXN0cygiZm9vLWlmYWNlLWFwaSIsICIiKS5PdXRwdXQoImNoZWNrYXBpX2R1bXAudGltZXN0YW1wIikKKwkJYW5kcm9pZC5Bc3NlcnRTdHJpbmdFcXVhbHModCwgImNoZWNrYXBpKGR1bXAgPT0gY3VycmVudCkgaW1wb3J0cyIsICIiLCBydWxlLkFyZ3NbImltcG9ydHMiXSkKKwkJYW5kcm9pZC5Bc3NlcnRTdHJpbmdEb2VzQ29udGFpbih0LCAiY2hlY2thcGkoZHVtcCA9PSBjdXJyZW50KSBvcHRpb25hbEZsYWdzIiwKKwkJCXJ1bGUuQXJnc1sib3B0aW9uYWxGbGFncyJdLAorCQkJIi1wb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL2Jhci9iYXItaWZhY2VfaW50ZXJmYWNlLzIvcHJlcHJvY2Vzc2VkLmFpZGwiKQorCX0KKworCS8vIGhhc19kZXZlbG9wbWVudCBydWxlIHJ1bnMgLS1jaGVja2FwaSBmb3IgZXF1YWxpdHkgYmV0d2VlbiBsYXRlc3QoIjEiKQorCS8vIGFuZCBUb1QKKwl7CisJCXJ1bGUgOj0gY3R4Lk1vZHVsZUZvclRlc3RzKCJmb28taWZhY2UtYXBpIiwgIiIpLk91dHB1dCgiaGFzX2RldmVsb3BtZW50IikKKwkJYW5kcm9pZC5Bc3NlcnRTdHJpbmdEb2VzQ29udGFpbih0LCAiY2hlY2thcGkoZHVtcCA9PSBsYXRlc3QoMSkpIHNob3VsZCBpbXBvcnQgaW1wb3J0J3MgcHJlcHJvY2Vzc2VkIiwKKwkJCXJ1bGUuUnVsZVBhcmFtcy5Db21tYW5kLAorCQkJIi1wb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL2Jhci9iYXItaWZhY2VfaW50ZXJmYWNlLzIvcHJlcHJvY2Vzc2VkLmFpZGwiKQorCX0KKworCS8vIGNvbXBpbGUgKHYxKQorCXsKKwkJcnVsZSA6PSBjdHguTW9kdWxlRm9yVGVzdHMoImZvby1pZmFjZS1WMS1jcHAtc291cmNlIiwgIiIpLk91dHB1dCgiYS9Gb28uY3BwIikKKwkJYW5kcm9pZC5Bc3NlcnRTdHJpbmdFcXVhbHModCwgImNvbXBpbGUob2xkPTEpIHNob3VsZCBpbXBvcnQgYWlkbF9hcGkvMSIsICItSWZvby9haWRsX2FwaS9mb28taWZhY2UvMSIsIHJ1bGUuQXJnc1siaW1wb3J0cyJdKQorCQlhbmRyb2lkLkFzc2VydFN0cmluZ0RvZXNDb250YWluKHQsICJjb21waWxlKG9sZD0xKSBzaG91bGQgaW1wb3J0IGJhci5wcmVwcm9jZXNzZWQiLAorCQkJcnVsZS5BcmdzWyJvcHRpb25hbEZsYWdzIl0sCisJCQkiLXBvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvYmFyL2Jhci1pZmFjZV9pbnRlcmZhY2UvMi9wcmVwcm9jZXNzZWQuYWlkbCIpCisJfQorCS8vIGNvbXBpbGUgVG9UKHYyKQorCXsKKwkJcnVsZSA6PSBjdHguTW9kdWxlRm9yVGVzdHMoImZvby1pZmFjZS1WMi1jcHAtc291cmNlIiwgIiIpLk91dHB1dCgiYS9Gb28uY3BwIikKKwkJYW5kcm9pZC5Bc3NlcnRTdHJpbmdFcXVhbHModCwgImNvbXBpbGUodG90PTIpIHNob3VsZCBpbXBvcnQgYmFzZSBkaXJzIG9mIHNyY3MiLCAiLUlmb28iLCBydWxlLkFyZ3NbImltcG9ydHMiXSkKKwkJYW5kcm9pZC5Bc3NlcnRTdHJpbmdEb2VzQ29udGFpbih0LCAiY29tcGlsZSh0b3Q9Mikgc2hvdWxkIGltcG9ydCBiYXIucHJlcHJvY2Vzc2VkIiwKKwkJCXJ1bGUuQXJnc1sib3B0aW9uYWxGbGFncyJdLAorCQkJIi1wb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL2Jhci9iYXItaWZhY2VfaW50ZXJmYWNlLzIvcHJlcHJvY2Vzc2VkLmFpZGwiKQorCX0KK30KKworZnVuYyBUZXN0QWlkbFByZXByb2Nlc3ModCAqdGVzdGluZy5UKSB7CiAJY3VzdG9taXplciA6PSB3aXRoRmlsZXMobWFwW3N0cmluZ11bXWJ5dGV7CiAJCSJmb28vQW5kcm9pZC5icCI6IFtdYnl0ZShgCiAJCQlhaWRsX2ludGVyZmFjZSB7CkBAIC0xMDE3LDkgKzExODIsOSBAQAogCQkJCQkJInNyYy9mb28vRm9vLmFpZGwiLAogCQkJCV0sCiAJCQkJaW1wb3J0czogWwotCQkJCQkJImJhci1pZmFjZSIsCisJCQkJCSJiYXItaWZhY2UiLAogCQkJCV0sCi0JCQkJdmVyc2lvbnM6IFsiMSIsICIyIl0sCisJCQkJdW5zdGFibGU6IHRydWUsCiAJCQl9CiAJCQlhaWRsX2ludGVyZmFjZSB7CiAJCQkJbmFtZTogImJhci1pZmFjZSIsCkBAIC0xMDI3LDQwICsxMTkyLDYyIEBACiAJCQkJc3JjczogWwogCQkJCQkJInNyYy9iYXIvQmFyLmFpZGwiLAogCQkJCV0sCisJCQkJdW5zdGFibGU6IHRydWUsCiAJCQl9CiAJCWApLAotCQkiZm9vL3NyYy9mb28vRm9vLmFpZGwiOiAgICAgICAgICAgICAgICAgICAgICAgIG5pbCwKLQkJImZvby9zcmMvYmFyL0Jhci5haWRsIjogICAgICAgICAgICAgICAgICAgICAgICBuaWwsCi0JCSJmb28vYWlkbF9hcGkvZm9vLWlmYWNlL2N1cnJlbnQvZm9vL0Zvby5haWRsIjogbmlsLAotCQkiZm9vL2FpZGxfYXBpL2Zvby1pZmFjZS8xL2Zvby9Gb28uYWlkbCI6ICAgICAgIG5pbCwKLQkJImZvby9haWRsX2FwaS9mb28taWZhY2UvMS8uaGFzaCI6ICAgICAgICAgICAgICBuaWwsCi0JCSJmb28vYWlkbF9hcGkvZm9vLWlmYWNlLzIvZm9vL0Zvby5haWRsIjogICAgICAgbmlsLAotCQkiZm9vL2FpZGxfYXBpL2Zvby1pZmFjZS8yLy5oYXNoIjogICAgICAgICAgICAgIG5pbCwKKwkJImZvby9zcmMvZm9vL0Zvby5haWRsIjogbmlsLAorCQkiZm9vL3NyYy9iYXIvQmFyLmFpZGwiOiBuaWwsCiAJfSkKIAljdHgsIF8gOj0gdGVzdEFpZGwodCwgYGAsIGN1c3RvbWl6ZXIpCiAKLQkvLyBjb21waWxlIGZvciBvbGRlciB2ZXJzaW9uCi0JewotCQlydWxlIDo9IGN0eC5Nb2R1bGVGb3JUZXN0cygiZm9vLWlmYWNlLVYxLWNwcC1zb3VyY2UiLCAiIikuT3V0cHV0KCJmb28vRm9vLmNwcCIpCi0JCWltcG9ydHMgOj0gc3RyaW5ncy5TcGxpdChydWxlLkFyZ3NbImltcG9ydHMiXSwgIiAiKQotCQlhbmRyb2lkLkFzc2VydEFycmF5U3RyaW5nKHQsICJzaG91bGQgaW1wb3J0IGZvby8xKHRhcmdldCkgYW5kIGJhci9jdXJyZW50KGltcG9ydGVkKSIsIFtdc3RyaW5newotCQkJIi1JZm9vL2FpZGxfYXBpL2Zvby1pZmFjZS8xIiwKLQkJCSItSXBhdGgxIiwKLQkJCSItSXBhdGgyL3N1YiIsCi0JCQkiLUlmb28vYWlkbF9hcGkvYmFyLWlmYWNlL2N1cnJlbnQiLAotCQl9LCBpbXBvcnRzKQotCX0KLQkvLyBjb21waWxlIGZvciB0b3QgdmVyc2lvbgotCXsKLQkJcnVsZSA6PSBjdHguTW9kdWxlRm9yVGVzdHMoImZvby1pZmFjZS1WMy1jcHAtc291cmNlIiwgIiIpLk91dHB1dCgiZm9vL0Zvby5jcHAiKQotCQlpbXBvcnRzIDo9IHN0cmluZ3MuU3BsaXQocnVsZS5BcmdzWyJpbXBvcnRzIl0sICIgIikKLQkJYW5kcm9pZC5Bc3NlcnRBcnJheVN0cmluZyh0LCAiYWlkbENvbXBpbGUgc2hvdWxkIGltcG9ydCBUb1QiLCBbXXN0cmluZ3sKLQkJCSItSWZvby9zcmMiLAotCQkJIi1JcGF0aDEiLAotCQkJIi1JcGF0aDIvc3ViIiwKLQkJCSItSWZvby9zcmMiLAotCQl9LCBpbXBvcnRzKQotCX0KKwlydWxlIDo9IGN0eC5Nb2R1bGVGb3JUZXN0cygiZm9vLWlmYWNlX2ludGVyZmFjZSIsICIiKS5PdXRwdXQoInByZXByb2Nlc3NlZC5haWRsIikKKwlhbmRyb2lkLkFzc2VydFN0cmluZ0RvZXNDb250YWluKHQsICJwcmVwcm9jZXNzaW5nIHNob3VsZCBpbXBvcnQgc3JjcyBhbmQgaW5jbHVkZV9kaXJzIiwKKwkJcnVsZS5SdWxlUGFyYW1zLkNvbW1hbmQsCisJCSItSWZvby9zcmMgLUlwYXRoMSAtSXBhdGgyL3N1YiIpCisJYW5kcm9pZC5Bc3NlcnRTdHJpbmdEb2VzQ29udGFpbih0LCAicHJlcHJvY2Vzc2luZyBzaG91bGQgaW1wb3J0IGltcG9ydCdzIHByZXByb2Nlc3MiLAorCQlydWxlLlJ1bGVQYXJhbXMuQ29tbWFuZCwKKwkJIi1wb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL2Zvby9iYXItaWZhY2VfaW50ZXJmYWNlL3ByZXByb2Nlc3NlZC5haWRsIikKK30KKworZnVuYyBUZXN0QWlkbEltcG9ydEZsYWdzRm9yVW5zdGFibGUodCAqdGVzdGluZy5UKSB7CisJY3VzdG9taXplciA6PSB3aXRoRmlsZXMobWFwW3N0cmluZ11bXWJ5dGV7CisJCSJmb28vQW5kcm9pZC5icCI6IFtdYnl0ZShgCisJCQlhaWRsX2ludGVyZmFjZSB7CisJCQkJbmFtZTogImZvby1pZmFjZSIsCisJCQkJbG9jYWxfaW5jbHVkZV9kaXI6ICJzcmMiLAorCQkJCWluY2x1ZGVfZGlyczogWworCQkJCQkJInBhdGgxIiwKKwkJCQkJCSJwYXRoMi9zdWIiLAorCQkJCV0sCisJCQkJc3JjczogWworCQkJCQkJInNyYy9mb28vRm9vLmFpZGwiLAorCQkJCV0sCisJCQkJaW1wb3J0czogWworCQkJCQkiYmFyLWlmYWNlIiwKKwkJCQldLAorCQkJCXVuc3RhYmxlOiB0cnVlLAorCQkJfQorCQkJYWlkbF9pbnRlcmZhY2UgeworCQkJCW5hbWU6ICJiYXItaWZhY2UiLAorCQkJCWxvY2FsX2luY2x1ZGVfZGlyOiAic3JjIiwKKwkJCQlzcmNzOiBbCisJCQkJCQkic3JjL2Jhci9CYXIuYWlkbCIsCisJCQkJXSwKKwkJCQl1bnN0YWJsZTogdHJ1ZSwKKwkJCX0KKwkJYCksCisJCSJmb28vc3JjL2Zvby9Gb28uYWlkbCI6IG5pbCwKKwkJImZvby9zcmMvYmFyL0Jhci5haWRsIjogbmlsLAorCX0pCisJY3R4LCBfIDo9IHRlc3RBaWRsKHQsIGBgLCBjdXN0b21pemVyKQorCisJcnVsZSA6PSBjdHguTW9kdWxlRm9yVGVzdHMoImZvby1pZmFjZS1jcHAtc291cmNlIiwgIiIpLk91dHB1dCgiZm9vL0Zvby5jcHAiKQorCWFuZHJvaWQuQXNzZXJ0U3RyaW5nRXF1YWxzKHQsICJjb21waWxlKHVuc3RhYmxlKSBzaG91bGQgaW1wb3J0IGZvby9iYXNlX2RpcnModGFyZ2V0KSBhbmQgYmFyL2Jhc2VfZGlycyhpbXBvcnRlZCkiLAorCQkiLUlmb28vc3JjIC1JcGF0aDEgLUlwYXRoMi9zdWIiLAorCQlydWxlLkFyZ3NbImltcG9ydHMiXSkKKwlhbmRyb2lkLkFzc2VydFN0cmluZ0RvZXNDb250YWluKHQsICJjb21waWxlKHVuc3RhYmxlKSBzaG91bGQgaW1wb3J0IGJhci5wcmVwcm9jZXNzZWQiLAorCQlydWxlLkFyZ3NbIm9wdGlvbmFsRmxhZ3MiXSwKKwkJIi1wb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL2Zvby9iYXItaWZhY2VfaW50ZXJmYWNlL3ByZXByb2Nlc3NlZC5haWRsIikKIH0KIAogZnVuYyBUZXN0U3VwcG9ydHNHZW5ydWxlQW5kRmlsZWdyb3VwKHQgKnRlc3RpbmcuVCkgewpAQCAtMTA3OSw3ICsxMjY2LDcgQEAKIAkJCQkJCSI6Z2VuMSIsCiAJCQkJXSwKIAkJCQlpbXBvcnRzOiBbCi0JCQkJCQkiYmFyLWlmYWNlIiwKKwkJCQkJCSJiYXItaWZhY2UtVjEiLAogCQkJCV0sCiAJCQkJdmVyc2lvbnM6IFsiMSJdLAogCQkJfQpAQCAtMTEwMiw4ICsxMjg5LDE2IEBACiAJCQkJbG9jYWxfaW5jbHVkZV9kaXI6ICJzcmMiLAogCQkJCXNyY3M6IFsKIAkJCQkJCSJzcmMvYmFyL0Jhci5haWRsIiwKKwkJCQkJCSI6Z2VuLWJhciIsCiAJCQkJXSwKIAkJCX0KKwkJCWdlbnJ1bGUgeworCQkJCW5hbWU6ICJnZW4tYmFyIiwKKwkJCQljbWQ6ICJnZW5lcmF0ZSBnZW4vR2VuQmFyLmFpZGwiLAorCQkJCW91dDogWworCQkJCQkiZ2VuL0dlbkJhci5haWRsIiwKKwkJCQldCisJCQl9CiAJCWApLAogCQkiZm9vL2FpZGxfYXBpL2Zvby1pZmFjZS8xL2Zvby9Gb28uYWlkbCI6IG5pbCwKIAkJImZvby9haWRsX2FwaS9mb28taWZhY2UvMS8uaGFzaCI6ICAgICAgICBuaWwsCkBAIC0xMTE1LDI2ICsxMzEwLDIyIEBACiAJLy8gYWlkbENvbXBpbGUgZm9yIHNuYXBzaG90cyAodjEpCiAJewogCQlydWxlIDo9IGN0eC5Nb2R1bGVGb3JUZXN0cygiZm9vLWlmYWNlLVYxLWNwcC1zb3VyY2UiLCAiIikuT3V0cHV0KCJmb28vRm9vLmNwcCIpCi0JCWltcG9ydHMgOj0gc3RyaW5ncy5TcGxpdChydWxlLkFyZ3NbImltcG9ydHMiXSwgIiAiKQotCQlhbmRyb2lkLkFzc2VydEFycmF5U3RyaW5nKHQsICJhaWRsQ29tcGlsZSBzaG91bGQgaW1wb3J0IGZpbGVncm91cC9nZW5ydWxlIGFzIHdlbGwiLCBbXXN0cmluZ3sKLQkJCSItSWZvby9haWRsX2FwaS9mb28taWZhY2UvMSIsCi0JCQkiLUlwYXRoMSIsCi0JCQkiLUlwYXRoMi9zdWIiLAotCQkJIi1JZm9vL2FpZGxfYXBpL2Jhci1pZmFjZS9jdXJyZW50IiwKLQkJfSwgaW1wb3J0cykKKwkJYW5kcm9pZC5Bc3NlcnRTdHJpbmdFcXVhbHModCwgImNvbXBpbGUoMSkgc2hvdWxkIGltcG9ydCBmb28vYWlkbF9hcGkvMSIsCisJCQkiLUlmb28vYWlkbF9hcGkvZm9vLWlmYWNlLzEgLUlwYXRoMSAtSXBhdGgyL3N1YiIsCisJCQlydWxlLkFyZ3NbImltcG9ydHMiXSkKKwkJYW5kcm9pZC5Bc3NlcnRTdHJpbmdEb2VzQ29udGFpbih0LCAiY29tcGlsZSgxKSBzaG91bGQgaW1wb3J0IGJhci5wcmVwcm9jZXNzZWQiLAorCQkJcnVsZS5BcmdzWyJvcHRpb25hbEZsYWdzIl0sCisJCQkiLXBvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvZm9vL2Jhci1pZmFjZV9pbnRlcmZhY2UvMS9wcmVwcm9jZXNzZWQuYWlkbCIpCiAJfQogCS8vIGFpZGxDb21waWxlIGZvciBUb1QgKHYyKQogCXsKIAkJcnVsZSA6PSBjdHguTW9kdWxlRm9yVGVzdHMoImZvby1pZmFjZS1WMi1jcHAtc291cmNlIiwgIiIpLk91dHB1dCgiZm9vL0Zvby5jcHAiKQotCQlpbXBvcnRzIDo9IHN0cmluZ3MuU3BsaXQocnVsZS5BcmdzWyJpbXBvcnRzIl0sICIgIikKLQkJYW5kcm9pZC5Bc3NlcnRBcnJheVN0cmluZyh0LCAiYWlkbENvbXBpbGUgc2hvdWxkIGltcG9ydCBmaWxlZ3JvdXAvZ2VucnVsZSBhcyB3ZWxsIiwgW11zdHJpbmd7Ci0JCQkiLUlmb28vc3JjIiwKLQkJCSItSWZvby9maWxlZ3JvdXAvc3ViIiwKLQkJCSItSW91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9mb28vZ2VuMS9nZW4iLAotCQkJIi1JcGF0aDEiLAotCQkJIi1JcGF0aDIvc3ViIiwKLQkJCSItSWZvby9zcmMiLAotCQl9LCBpbXBvcnRzKQorCQlhbmRyb2lkLkFzc2VydFN0cmluZ0VxdWFscyh0LCAiY29tcGlsZSh0b3Q9Mikgc2hvdWxkIGltcG9ydCBmb28uYmFzZV9kaXJzIiwKKwkJCSItSWZvby9zcmMgLUlmb28vZmlsZWdyb3VwL3N1YiAtSW91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9mb28vZ2VuMS9nZW4gLUlwYXRoMSAtSXBhdGgyL3N1YiIsCisJCQlydWxlLkFyZ3NbImltcG9ydHMiXSkKKwkJYW5kcm9pZC5Bc3NlcnRTdHJpbmdEb2VzQ29udGFpbih0LCAiY29tcGlsZSh0b3Q9Mikgc2hvdWxkIGltcG9ydCBiYXIucHJlcHJvY2Vzc2VkIiwKKwkJCXJ1bGUuQXJnc1sib3B0aW9uYWxGbGFncyJdLAorCQkJIi1wb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL2Zvby9iYXItaWZhY2VfaW50ZXJmYWNlLzEvcHJlcHJvY2Vzc2VkLmFpZGwiKQogCX0KIAogCS8vIGR1bXBhcGkKQEAgLTExNTQsMjMgKzEzNDUsMTIgQEAKIAkJCWR1bXBEaXIgKyAiLy5oYXNoIiwKIAkJfSwgcnVsZS5PdXRwdXRzLlBhdGhzKCkpCiAKLQkJaW1wb3J0cyA6PSBzdHJpbmdzLlNwbGl0KHJ1bGUuQXJnc1siaW1wb3J0cyJdLCAiICIpCi0JCWFuZHJvaWQuQXNzZXJ0QXJyYXlTdHJpbmcodCwgImR1bXBhcGkgc2hvdWxkIGltcG9ydCBmaWxlZ3JvdXAvZ2VucnVsZSBhcyB3ZWxsIiwgW11zdHJpbmd7Ci0JCQkvLyB0aGVzZSBhcmUgZnJvbSBmb28taWZhY2Uuc3JjcwotCQkJIi1JZm9vL3NyYyIsCi0JCQkiLUlmb28vZmlsZWdyb3VwL3N1YiIsCi0JCQkiLUlvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvZm9vL2dlbjEvZ2VuIiwKLQotCQkJLy8gdGhpcyBpcyBmcm9tIGJhci1pZmFjZS5zcmNzCi0JCQkiLUlmb28vc3JjIiwKLQotCQkJLy8gdGhpcyBpcyBmcm9tIGZvby1pZmFjZS5Mb2NhbF9pbmNsdWRlX2RpcgotCQkJIi1JZm9vL3NyYyIsCi0KLQkJCS8vIHRoZXNlIGFyZSBmcm9tIGZvby1pZmFjZS5pbmNsdWRlX2RpcnMKLQkJCSItSXBhdGgxIiwKLQkJCSItSXBhdGgyL3N1YiIsCi0JCX0sIGltcG9ydHMpCisJCWFuZHJvaWQuQXNzZXJ0U3RyaW5nRXF1YWxzKHQsICJkdW1wYXBpIHNob3VsZCBpbXBvcnQgYmFzZV9kaXJzIGFuZCBpbmNsdWRlX2RpcnMiLAorCQkJIi1JZm9vL3NyYyAtSWZvby9maWxlZ3JvdXAvc3ViIC1Jb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL2Zvby9nZW4xL2dlbiAtSXBhdGgxIC1JcGF0aDIvc3ViIiwKKwkJCXJ1bGUuQXJnc1siaW1wb3J0cyJdKQorCQlhbmRyb2lkLkFzc2VydFN0cmluZ0RvZXNDb250YWluKHQsICJkdW1wYXBpIHNob3VsZCBpbXBvcnQgYmFyLnByZXByb2Nlc3NlZCIsCisJCQlydWxlLkFyZ3NbIm9wdGlvbmFsRmxhZ3MiXSwKKwkJCSItcG91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9mb28vYmFyLWlmYWNlX2ludGVyZmFjZS8xL3ByZXByb2Nlc3NlZC5haWRsIikKIAl9CiB9CiAKQEAgLTExOTksNiArMTM3OSwyMiBAQAogCX0KIH0KIAorZnVuYyBUZXN0QWlkbE1vZHVsZUphdmFTZGtWZXJzaW9uRGV0ZXJtaW5lc01pblNka1ZlcnNpb24odCAqdGVzdGluZy5UKSB7CisJY3R4LCBfIDo9IHRlc3RBaWRsKHQsIGAKKwkJYWlkbF9pbnRlcmZhY2UgeworCQkJbmFtZTogIm15aWZhY2UiLAorCQkJc3JjczogWyJhL0Zvby5haWRsIl0sCisJCQliYWNrZW5kOiB7CisJCQkJamF2YTogeworCQkJCQlzZGtfdmVyc2lvbjogIjI4IiwKKwkJCQl9LAorCQkJfSwKKwkJfQorCWAsIGphdmEuRml4dHVyZVdpdGhQcmVidWlsdEFwaXMobWFwW3N0cmluZ11bXXN0cmluZ3siMjgiOiB7ImZvbyJ9fSkpCisJcGFyYW1zIDo9IGN0eC5Nb2R1bGVGb3JUZXN0cygibXlpZmFjZS1WMS1qYXZhLXNvdXJjZSIsICIiKS5PdXRwdXQoImEvRm9vLmphdmEiKQorCWFzc2VydENvbnRhaW5zKHQsIHBhcmFtcy5BcmdzWyJvcHRpb25hbEZsYWdzIl0sICItLW1pbl9zZGtfdmVyc2lvbiAyOCIpCit9CisKIGZ1bmMgVGVzdEFpZGxNb2R1bGVOYW1lQ29udGFpbnNWZXJzaW9uKHQgKnRlc3RpbmcuVCkgewogCXRlc3RBaWRsRXJyb3IodCwgImFpZGxfaW50ZXJmYWNlIHNob3VsZCBub3QgaGF2ZSAnLVY8bnVtYmVyPiBzdWZmaXgiLCBgCiAJCWFpZGxfaW50ZXJmYWNlIHsKQEAgLTEyNzYsMyArMTQ3MiwzMzYgQEAKIAkJImFpZGxfYXBpL2Jhci8xLy5oYXNoIjogICAgbmlsLAogCX0pKQogfQorCitmdW5jIFRlc3RVc2VWZXJzaW9uZWRQcmVwcm9jZXNzZWRXaGVuSW1wb3JvdGVkV2l0aFZlcnNpb25zKHQgKnRlc3RpbmcuVCkgeworCWN0eCwgXyA6PSB0ZXN0QWlkbCh0LCBgCisJCWFpZGxfaW50ZXJmYWNlIHsKKwkJCW5hbWU6ICJ1bnN0YWJsZS1mb28iLAorCQkJc3JjczogWyJmb28vRm9vLmFpZGwiXSwKKwkJCWltcG9ydHM6IFsKKwkJCQkJImJhci1WMiIsCisJCQkJCSJiYXotVjEiLAorCQkJCQkidW5zdGFibGUtYmFyIiwKKwkJCV0sCisJCQl1bnN0YWJsZTogdHJ1ZSwKKwkJfQorCQlhaWRsX2ludGVyZmFjZSB7CisJCQluYW1lOiAiZm9vIiwKKwkJCXNyY3M6IFsiZm9vL0Zvby5haWRsIl0sCisJCQlpbXBvcnRzOiBbCisJCQkJCSJiYXItVjEiLAorCQkJCQkiYmF6LVYxIiwKKwkJCV0sCisJCQl2ZXJzaW9uczogWyIxIl0sCisJCX0KKwkJYWlkbF9pbnRlcmZhY2UgeworCQkJbmFtZTogImZvby1uby12ZXJzaW9ucyIsCisJCQlzcmNzOiBbImZvby9Gb28uYWlkbCJdLAorCQkJaW1wb3J0czogWworCQkJCQkiYmFyLVYyIiwKKwkJCV0sCisJCX0KKwkJYWlkbF9pbnRlcmZhY2UgeworCQkJbmFtZTogImJhciIsCisJCQlzcmNzOiBbImJhci9CYXIuYWlkbCJdLAorCQkJdmVyc2lvbnM6IFsiMSJdLAorCQl9CisJCWFpZGxfaW50ZXJmYWNlIHsKKwkJCW5hbWU6ICJ1bnN0YWJsZS1iYXIiLAorCQkJc3JjczogWyJiYXIvQmFyLmFpZGwiXSwKKwkJCXVuc3RhYmxlOiB0cnVlLAorCQl9CisJCWFpZGxfaW50ZXJmYWNlIHsKKwkJCW5hbWU6ICJiYXoiLAorCQkJc3JjczogWyJiYXovQmF6LmFpZGwiXSwKKwkJCXZlcnNpb25zOiBbIjEiXSwKKwkJfQorCWAsIHdpdGhGaWxlcyhtYXBbc3RyaW5nXVtdYnl0ZXsKKwkJImZvby9Gb28uYWlkbCI6ICAgICAgICAgICAgICAgIG5pbCwKKwkJImJhci9CYXIuYWlkbCI6ICAgICAgICAgICAgICAgIG5pbCwKKwkJImJhei9CYXouYWlkbCI6ICAgICAgICAgICAgICAgIG5pbCwKKwkJImFpZGxfYXBpL2Zvby8xL2Zvby9Gb28uYWlkbCI6IG5pbCwKKwkJImFpZGxfYXBpL2Zvby8xLy5oYXNoIjogICAgICAgIG5pbCwKKwkJImFpZGxfYXBpL2Jhci8xL2Jhci9CYXIuYWlkbCI6IG5pbCwKKwkJImFpZGxfYXBpL2Jhci8xLy5oYXNoIjogICAgICAgIG5pbCwKKwkJImFpZGxfYXBpL2Jhei8xL2Jhei9CYXouYWlkbCI6IG5pbCwKKwkJImFpZGxfYXBpL2Jhei8xLy5oYXNoIjogICAgICAgIG5pbCwKKwl9KSkKKwl7CisJCXJ1bGUgOj0gY3R4Lk1vZHVsZUZvclRlc3RzKCJmb28tVjItamF2YS1zb3VyY2UiLCAiIikuT3V0cHV0KCJmb28vRm9vLmphdmEiKQorCQlhbmRyb2lkLkFzc2VydFN0cmluZ0RvZXNDb250YWluKHQsICJmb28tVjIodG90KSBpbXBvcnRzIGJhci1WMSBmb3IgJ2Jhci1WMSciLCBydWxlLkFyZ3NbIm9wdGlvbmFsRmxhZ3MiXSwKKwkJCSItcG91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9iYXJfaW50ZXJmYWNlLzEvcHJlcHJvY2Vzc2VkLmFpZGwiKQorCQlhbmRyb2lkLkFzc2VydFN0cmluZ0RvZXNDb250YWluKHQsICJmb28tVjIodG90KSBpbXBvcnRzIGJhei1WMSBmb3IgJ2Jhei1WMSciLCBydWxlLkFyZ3NbIm9wdGlvbmFsRmxhZ3MiXSwKKwkJCSItcG91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9iYXpfaW50ZXJmYWNlLzEvcHJlcHJvY2Vzc2VkLmFpZGwiKQorCX0KKwl7CisJCXJ1bGUgOj0gY3R4Lk1vZHVsZUZvclRlc3RzKCJmb28tVjEtamF2YS1zb3VyY2UiLCAiIikuT3V0cHV0KCJmb28vRm9vLmphdmEiKQorCQlhbmRyb2lkLkFzc2VydFN0cmluZ0RvZXNDb250YWluKHQsICJmb28tVjEgaW1wb3J0cyBiYXItVjEobGF0ZXN0KSBmb3IgJ2JhciciLCBydWxlLkFyZ3NbIm9wdGlvbmFsRmxhZ3MiXSwKKwkJCSItcG91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9iYXJfaW50ZXJmYWNlLzEvcHJlcHJvY2Vzc2VkLmFpZGwiKQorCQlhbmRyb2lkLkFzc2VydFN0cmluZ0RvZXNDb250YWluKHQsICJmb28tVjEgaW1wb3J0cyBiYXotVjEgZm9yICdiYXotVjEnIiwgcnVsZS5BcmdzWyJvcHRpb25hbEZsYWdzIl0sCisJCQkiLXBvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvYmF6X2ludGVyZmFjZS8xL3ByZXByb2Nlc3NlZC5haWRsIikKKwl9CisJeworCQlydWxlIDo9IGN0eC5Nb2R1bGVGb3JUZXN0cygidW5zdGFibGUtZm9vLWphdmEtc291cmNlIiwgIiIpLk91dHB1dCgiZm9vL0Zvby5qYXZhIikKKwkJYW5kcm9pZC5Bc3NlcnRTdHJpbmdEb2VzQ29udGFpbih0LCAidW5zdGFibGUtZm9vIGltcG9ydHMgYmFyLVYyKGxhdGVzdCkgZm9yICdiYXInIiwgcnVsZS5BcmdzWyJvcHRpb25hbEZsYWdzIl0sCisJCQkiLXBvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvYmFyX2ludGVyZmFjZS8yL3ByZXByb2Nlc3NlZC5haWRsIikKKwkJYW5kcm9pZC5Bc3NlcnRTdHJpbmdEb2VzQ29udGFpbih0LCAidW5zdGFibGUtZm9vIGltcG9ydHMgYmF6LVYxIGZvciAnYmF6LVYxJyIsIHJ1bGUuQXJnc1sib3B0aW9uYWxGbGFncyJdLAorCQkJIi1wb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL2Jhel9pbnRlcmZhY2UvMS9wcmVwcm9jZXNzZWQuYWlkbCIpCisJCWFuZHJvaWQuQXNzZXJ0U3RyaW5nRG9lc0NvbnRhaW4odCwgInVuc3RhYmxlLWZvbyBpbXBvcnRzIHVuc3RhYmxlLWJhcihUb1QpIGZvciAndW5zdGFibGUtYmFyJyIsIHJ1bGUuQXJnc1sib3B0aW9uYWxGbGFncyJdLAorCQkJIi1wb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3Vuc3RhYmxlLWJhcl9pbnRlcmZhY2UvcHJlcHJvY2Vzc2VkLmFpZGwiKQorCX0KKwl7CisJCXJ1bGUgOj0gY3R4Lk1vZHVsZUZvclRlc3RzKCJmb28tbm8tdmVyc2lvbnMtVjEtamF2YS1zb3VyY2UiLCAiIikuT3V0cHV0KCJmb28vRm9vLmphdmEiKQorCQlhbmRyb2lkLkFzc2VydFN0cmluZ0RvZXNDb250YWluKHQsICJmb28tbm8tdmVyc2lvbnMtVjEobGF0ZXN0KSBpbXBvcnRzIGJhci1WMihsYXRlc3QpIGZvciAnYmFyJyIsIHJ1bGUuQXJnc1sib3B0aW9uYWxGbGFncyJdLAorCQkJIi1wb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL2Jhcl9pbnRlcmZhY2UvMi9wcmVwcm9jZXNzZWQuYWlkbCIpCisJfQorfQorCitmdW5jIEZpbmRNb2R1bGUoY3R4ICphbmRyb2lkLlRlc3RDb250ZXh0LCBuYW1lLCB2YXJpYW50LCBkaXIgc3RyaW5nKSBhbmRyb2lkLk1vZHVsZSB7CisJdmFyIG1vZHVsZSBhbmRyb2lkLk1vZHVsZQorCWN0eC5WaXNpdEFsbE1vZHVsZXMoZnVuYyhtIGJsdWVwcmludC5Nb2R1bGUpIHsKKwkJaWYgY3R4Lk1vZHVsZU5hbWUobSkgPT0gbmFtZSAmJiBjdHguTW9kdWxlU3ViRGlyKG0pID09IHZhcmlhbnQgJiYgY3R4Lk1vZHVsZURpcihtKSA9PSBkaXIgeworCQkJbW9kdWxlID0gbS4oYW5kcm9pZC5Nb2R1bGUpCisJCX0KKwl9KQorCWlmIG1vZHVsZSA9PSBuaWwgeworCQltIDo9IGN0eC5Nb2R1bGVGb3JUZXN0cyhuYW1lLCB2YXJpYW50KS5Nb2R1bGUoKQorCQlwYW5pYyhmbXQuRXJyb3JmKCJmYWlsZWQgdG8gZmluZCBtb2R1bGUgJXEgdmFyaWFudCAlcSBkaXIgJXEsIGJ1dCBmb3VuZCBvbmUgaW4gJXEiLAorCQkJbmFtZSwgdmFyaWFudCwgZGlyLCBjdHguTW9kdWxlRGlyKG0pKSkKKwl9CisJcmV0dXJuIG1vZHVsZQorfQorCitmdW5jIFRlc3REdXBsaWNhdGVJbnRlcmZhY2VzV2l0aFRoZVNhbWVOYW1lSW5EaWZmZXJlbnRTb29uZ05hbWVzcGFjZXModCAqdGVzdGluZy5UKSB7CisJY3R4LCBfIDo9IHRlc3RBaWRsKHQsIGBgLCB3aXRoRmlsZXMobWFwW3N0cmluZ11bXWJ5dGV7CisJCSJjb21tb24vQW5kcm9pZC5icCI6IFtdYnl0ZShgCisJCSAgYWlkbF9pbnRlcmZhY2UgeworCQkJCW5hbWU6ICJjb21tb24iLAorCQkJCXNyY3M6IFsiSUNvbW1vbi5haWRsIl0sCisJCQkJdmVyc2lvbnM6IFsiMSIsICIyIl0sCisJCQl9CisJCWApLAorCQkiY29tbW9uL2FpZGxfYXBpL2NvbW1vbi8xL0lDb21tb24uYWlkbCI6IG5pbCwKKwkJImNvbW1vbi9haWRsX2FwaS9jb21tb24vMS8uaGFzaCI6ICAgICAgICBuaWwsCisJCSJjb21tb24vYWlkbF9hcGkvY29tbW9uLzIvSUNvbW1vbi5haWRsIjogbmlsLAorCQkiY29tbW9uL2FpZGxfYXBpL2NvbW1vbi8yLy5oYXNoIjogICAgICAgIG5pbCwKKwkJInZlbmRvci9hL0FuZHJvaWQuYnAiOiBbXWJ5dGUoYAorCQkJc29vbmdfbmFtZXNwYWNlIHt9CisJCWApLAorCQkidmVuZG9yL2EvZm9vL0FuZHJvaWQuYnAiOiBbXWJ5dGUoYAorCQkJYWlkbF9pbnRlcmZhY2UgeworCQkJCW5hbWU6ICJmb28iLAorCQkJCXNyY3M6IFsiSUZvby5haWRsIl0sCisJCQkJaW1wb3J0czogWyJjb21tb24tVjEiXSwKKwkJCX0KKwkJYCksCisJCSJ2ZW5kb3IvYi9BbmRyb2lkLmJwIjogW11ieXRlKGAKKwkJCXNvb25nX25hbWVzcGFjZSB7fQorCQlgKSwKKwkJInZlbmRvci9iL2Zvby9BbmRyb2lkLmJwIjogW11ieXRlKGAKKwkJCWFpZGxfaW50ZXJmYWNlIHsKKwkJCQluYW1lOiAiZm9vIiwKKwkJCQlzcmNzOiBbIklGb28uYWlkbCJdLAorCQkJCWltcG9ydHM6IFsiY29tbW9uLVYyIl0sCisJCQl9CisJCWApLAorCX0pKQorCisJYUZvb1YxSmF2YSA6PSBGaW5kTW9kdWxlKGN0eCwgImZvby1WMS1qYXZhIiwgImFuZHJvaWRfY29tbW9uIiwgInZlbmRvci9hL2ZvbyIpLigqamF2YS5MaWJyYXJ5KQorCWFuZHJvaWQuQXNzZXJ0U3RyaW5nTGlzdENvbnRhaW5zKHQsICJhL2ZvbyBkZXBzIiwgYUZvb1YxSmF2YS5Db21waWxlckRlcHMoKSwgImNvbW1vbi1WMS1qYXZhIikKKworCWJGb29WMUphdmEgOj0gRmluZE1vZHVsZShjdHgsICJmb28tVjEtamF2YSIsICJhbmRyb2lkX2NvbW1vbiIsICJ2ZW5kb3IvYi9mb28iKS4oKmphdmEuTGlicmFyeSkKKwlhbmRyb2lkLkFzc2VydFN0cmluZ0xpc3RDb250YWlucyh0LCAiYS9mb28gZGVwcyIsIGJGb29WMUphdmEuQ29tcGlsZXJEZXBzKCksICJjb21tb24tVjItamF2YSIpCit9CisKK2Z1bmMgVGVzdFVuc3RhYmxlQ2hlY2tzRm9yQWlkbEludGVyZmFjZXNJbkRpZmZlcmVudE5hbWVzcGFjZXModCAqdGVzdGluZy5UKSB7CisJZmlsZXMgOj0gd2l0aEZpbGVzKG1hcFtzdHJpbmddW11ieXRleworCQkidmVuZG9yL2EvQW5kcm9pZC5icCI6IFtdYnl0ZShgCisJCQlzb29uZ19uYW1lc3BhY2Uge30KKwkJYCksCisJCSJ2ZW5kb3IvYS9mb28vQW5kcm9pZC5icCI6IFtdYnl0ZShgCisJCQlhaWRsX2ludGVyZmFjZSB7CisJCQkJbmFtZTogImZvbyIsCisJCQkJc3JjczogWyJJRm9vLmFpZGwiXSwKKwkJCQl2ZXJzaW9uczogWyIxIiwgIjIiXSwKKwkJCX0KKwkJCWphdmFfbGlicmFyeSB7CisJCQkJbmFtZTogImJhciIsCisJCQkJbGliczogWyJmb28tVjItamF2YSJdLCAgLy8gT0sKKwkJCX0KKwkJYCksCisJCSJ2ZW5kb3IvYS9mb28vYWlkbF9hcGkvZm9vLzEvSUZvby5haWRsIjogbmlsLAorCQkidmVuZG9yL2EvZm9vL2FpZGxfYXBpL2Zvby8xLy5oYXNoIjogICAgIG5pbCwKKwkJInZlbmRvci9hL2Zvby9haWRsX2FwaS9mb28vMi9JRm9vLmFpZGwiOiBuaWwsCisJCSJ2ZW5kb3IvYS9mb28vYWlkbF9hcGkvZm9vLzIvLmhhc2giOiAgICAgbmlsLAorCQkidmVuZG9yL2IvQW5kcm9pZC5icCI6IFtdYnl0ZShgCisJCQlzb29uZ19uYW1lc3BhY2Uge30KKwkJYCksCisJCSJ2ZW5kb3IvYi9mb28vQW5kcm9pZC5icCI6IFtdYnl0ZShgCisJCQlhaWRsX2ludGVyZmFjZSB7CisJCQkJbmFtZTogImZvbyIsCisJCQkJc3JjczogWyJJRm9vLmFpZGwiXSwKKwkJCQl2ZXJzaW9uczogWyIxIl0sCisJCQl9CisJCQlqYXZhX2xpYnJhcnkgeworCQkJCW5hbWU6ICJiYXIiLAorCQkJCWxpYnM6IFsiZm9vLVYxLWphdmEiXSwgIC8vIE9LCisJCQl9CisJCWApLAorCQkidmVuZG9yL2IvZm9vL2FpZGxfYXBpL2Zvby8xL0lGb28uYWlkbCI6IG5pbCwKKwkJInZlbmRvci9iL2Zvby9haWRsX2FwaS9mb28vMS8uaGFzaCI6ICAgICBuaWwsCisJfSkKKworCXRlc3RBaWRsKHQsIGBgLCBmaWxlcywgc2V0UmVsZWFzZUVudigpKQorCXRlc3RBaWRsKHQsIGBgLCBmaWxlcywgc2V0VGVzdEZyZWV6ZUVudigpKQorCXRlc3RBaWRsKHQsIGBgLCBmaWxlcykKK30KKworZnVuYyBUZXN0VmVyc2lvbnNXaXRoSW5mb0FuZFZlcnNpb25zKHQgKnRlc3RpbmcuVCkgeworCWNvbmZsaWN0aW5nRmllbGRzIDo9IGAKKwlhaWRsX2ludGVyZmFjZSB7CisJCW5hbWU6ICJmb28iLAorCQl2ZXJzaW9uczogWworCQkJIjEiLAorCQldLAorCQl2ZXJzaW9uc193aXRoX2luZm86IFsKKwkJCXsKKwkJCQl2ZXJzaW9uOiAiMSIsCisJCQl9CisJCV0sCisJfQorCWAKKwlmaWxlcyA6PSB3aXRoRmlsZXMobWFwW3N0cmluZ11bXWJ5dGV7CisJCSJhaWRsX2FwaS9mb28vMS9mb28uMS5haWRsIjogbmlsLAorCQkiYWlkbF9hcGkvZm9vLzEvLmhhc2giOiAgICAgIG5pbCwKKwl9KQorCisJZXhwZWN0ZWRFcnJvciA6PSBgVXNlIHZlcnNpb25zX3dpdGhfaW5mbyBpbnN0ZWFkIG9mIHZlcnNpb25zLmAKKwl0ZXN0QWlkbEVycm9yKHQsIGV4cGVjdGVkRXJyb3IsIGNvbmZsaWN0aW5nRmllbGRzLCBmaWxlcykKK30KKworZnVuYyBUZXN0VmVyc2lvbnNXaXRoSW5mbyh0ICp0ZXN0aW5nLlQpIHsKKwljdHgsIF8gOj0gdGVzdEFpZGwodCwgYGAsIHdpdGhGaWxlcyhtYXBbc3RyaW5nXVtdYnl0ZXsKKwkJImNvbW1vbi9BbmRyb2lkLmJwIjogW11ieXRlKGAKKwkJICBhaWRsX2ludGVyZmFjZSB7CisJCQkJbmFtZTogImNvbW1vbiIsCisJCQkJc3JjczogWyJJQ29tbW9uLmFpZGwiXSwKKwkJCQl2ZXJzaW9uczogWyIxIiwgIjIiXSwKKwkJCX0KKwkJYCksCisJCSJjb21tb24vYWlkbF9hcGkvY29tbW9uLzEvSUNvbW1vbi5haWRsIjogbmlsLAorCQkiY29tbW9uL2FpZGxfYXBpL2NvbW1vbi8xLy5oYXNoIjogICAgICAgIG5pbCwKKwkJImNvbW1vbi9haWRsX2FwaS9jb21tb24vMi9JQ29tbW9uLmFpZGwiOiBuaWwsCisJCSJjb21tb24vYWlkbF9hcGkvY29tbW9uLzIvLmhhc2giOiAgICAgICAgbmlsLAorCQkiZm9vL0FuZHJvaWQuYnAiOiBbXWJ5dGUoYAorCQkJYWlkbF9pbnRlcmZhY2UgeworCQkJCW5hbWU6ICJmb28iLAorCQkJCXNyY3M6IFsiSUZvby5haWRsIl0sCisJCQkJaW1wb3J0czogWyJjb21tb24iXSwKKwkJCQl2ZXJzaW9uc193aXRoX2luZm86IFsKKwkJCQkJe3ZlcnNpb246ICIxIiwgaW1wb3J0czogWyJjb21tb24tVjEiXX0sCisJCQkJCXt2ZXJzaW9uOiAiMiIsIGltcG9ydHM6IFsiY29tbW9uLVYyIl19LAorCQkJCV0KKwkJCX0KKwkJYCksCisJCSJmb28vYWlkbF9hcGkvZm9vLzEvSUZvby5haWRsIjogbmlsLAorCQkiZm9vL2FpZGxfYXBpL2Zvby8xLy5oYXNoIjogICAgIG5pbCwKKwkJImZvby9haWRsX2FwaS9mb28vMi9JRm9vLmFpZGwiOiBuaWwsCisJCSJmb28vYWlkbF9hcGkvZm9vLzIvLmhhc2giOiAgICAgbmlsLAorCX0pKQorCisJZm9vVjFKYXZhIDo9IEZpbmRNb2R1bGUoY3R4LCAiZm9vLVYxLWphdmEiLCAiYW5kcm9pZF9jb21tb24iLCAiZm9vIikuKCpqYXZhLkxpYnJhcnkpCisJYW5kcm9pZC5Bc3NlcnRTdHJpbmdMaXN0Q29udGFpbnModCwgImEvZm9vLXYxIGRlcHMiLCBmb29WMUphdmEuQ29tcGlsZXJEZXBzKCksICJjb21tb24tVjEtamF2YSIpCisKKwlmb29WMkphdmEgOj0gRmluZE1vZHVsZShjdHgsICJmb28tVjItamF2YSIsICJhbmRyb2lkX2NvbW1vbiIsICJmb28iKS4oKmphdmEuTGlicmFyeSkKKwlhbmRyb2lkLkFzc2VydFN0cmluZ0xpc3RDb250YWlucyh0LCAiYS9mb28tdjIgZGVwcyIsIGZvb1YySmF2YS5Db21waWxlckRlcHMoKSwgImNvbW1vbi1WMi1qYXZhIikKKworCWZvb1YzSmF2YSA6PSBGaW5kTW9kdWxlKGN0eCwgImZvby1WMy1qYXZhIiwgImFuZHJvaWRfY29tbW9uIiwgImZvbyIpLigqamF2YS5MaWJyYXJ5KQorCWFuZHJvaWQuQXNzZXJ0U3RyaW5nTGlzdENvbnRhaW5zKHQsICJhL2Zvby12MyBkZXBzIiwgZm9vVjNKYXZhLkNvbXBpbGVyRGVwcygpLCAiY29tbW9uLVYzLWphdmEiKQorfQorCitmdW5jIFRlc3RWZXJzaW9uc1dpdGhJbmZvSW1wb3J0KHQgKnRlc3RpbmcuVCkgeworCXRlc3RBaWRsRXJyb3IodCwgImltcG9ydHMgaW4gdmVyc2lvbnNfd2l0aF9pbmZvIG11c3Qgc3BlY2lmeSBpdHMgdmVyc2lvbiIsIGBgLCB3aXRoRmlsZXMobWFwW3N0cmluZ11bXWJ5dGV7CisJCSJjb21tb24vQW5kcm9pZC5icCI6IFtdYnl0ZShgCisJCSAgYWlkbF9pbnRlcmZhY2UgeworCQkJCW5hbWU6ICJjb21tb24iLAorCQkJCXNyY3M6IFsiSUNvbW1vbi5haWRsIl0sCisJCQkJdmVyc2lvbnM6IFsiMSIsICIyIl0sCisJCQl9CisJCWApLAorCQkiY29tbW9uL2FpZGxfYXBpL2NvbW1vbi8xL0lDb21tb24uYWlkbCI6IG5pbCwKKwkJImNvbW1vbi9haWRsX2FwaS9jb21tb24vMS8uaGFzaCI6ICAgICAgICBuaWwsCisJCSJjb21tb24vYWlkbF9hcGkvY29tbW9uLzIvSUNvbW1vbi5haWRsIjogbmlsLAorCQkiY29tbW9uL2FpZGxfYXBpL2NvbW1vbi8yLy5oYXNoIjogICAgICAgIG5pbCwKKwkJImZvby9BbmRyb2lkLmJwIjogW11ieXRlKGAKKwkJCWFpZGxfaW50ZXJmYWNlIHsKKwkJCQluYW1lOiAiZm9vIiwKKwkJCQlzcmNzOiBbIklGb28uYWlkbCJdLAorCQkJCWltcG9ydHM6IFsiY29tbW9uIl0sCisJCQkJdmVyc2lvbnNfd2l0aF9pbmZvOiBbCisJCQkJCXt2ZXJzaW9uOiAiMSIsIGltcG9ydHM6IFsiY29tbW9uIl19LAorCQkJCQl7dmVyc2lvbjogIjIiLCBpbXBvcnRzOiBbImNvbW1vbi1WMiJdfSwKKwkJCQldCisJCQl9CisJCWApLAorCQkiZm9vL2FpZGxfYXBpL2Zvby8xL0lGb28uYWlkbCI6IG5pbCwKKwkJImZvby9haWRsX2FwaS9mb28vMS8uaGFzaCI6ICAgICBuaWwsCisJCSJmb28vYWlkbF9hcGkvZm9vLzIvSUZvby5haWRsIjogbmlsLAorCQkiZm9vL2FpZGxfYXBpL2Zvby8yLy5oYXNoIjogICAgIG5pbCwKKwl9KSkKK30KKworZnVuYyBUZXN0RnJlZXplQXBpRGVwcyh0ICp0ZXN0aW5nLlQpIHsKKwlmb3IgXywgdHJhbnNpdGl2ZSA6PSByYW5nZSBbXWJvb2x7dHJ1ZSwgZmFsc2V9IHsKKwkJZm9yIF8sIHRlc3RjYXNlIDo9IHJhbmdlIFtdc3RydWN0IHsKKwkJCXN0cmluZworCQkJYm9vbAorCQl9e3siY29tbW9uIiwgdHJ1ZX0sIHsiY29tbW9uLVYzIiwgdHJ1ZX0sIHsiY29tbW9uLVYyIiwgZmFsc2V9fSB7CisJCQlpbSA6PSB0ZXN0Y2FzZS5zdHJpbmcKKwkJCWN1c3RvbWl6ZXJzIDo9IFtdYW5kcm9pZC5GaXh0dXJlUHJlcGFyZXJ7CisJCQkJd2l0aEZpbGVzKG1hcFtzdHJpbmddW11ieXRleworCQkJCQkiY29tbW9uL0FuZHJvaWQuYnAiOiBbXWJ5dGUoYAorCQkJCSAgYWlkbF9pbnRlcmZhY2UgeworCQkJCQkJbmFtZTogImNvbW1vbiIsCisJCQkJCQlzcmNzOiBbIklDb21tb24uYWlkbCJdLAorCQkJCQkJdmVyc2lvbnM6IFsiMSIsICIyIl0sCisJCQkJCX0KKwkJCQlgKSwKKwkJCQkJImNvbW1vbi9haWRsX2FwaS9jb21tb24vMS9JQ29tbW9uLmFpZGwiOiBuaWwsCisJCQkJCSJjb21tb24vYWlkbF9hcGkvY29tbW9uLzEvLmhhc2giOiAgICAgICAgbmlsLAorCQkJCQkiY29tbW9uL2FpZGxfYXBpL2NvbW1vbi8yL0lDb21tb24uYWlkbCI6IG5pbCwKKwkJCQkJImNvbW1vbi9haWRsX2FwaS9jb21tb24vMi8uaGFzaCI6ICAgICAgICBuaWwsCisJCQkJCSJmb28vQW5kcm9pZC5icCI6IFtdYnl0ZShmbXQuU3ByaW50ZihgCisJCQkJCWFpZGxfaW50ZXJmYWNlIHsKKwkJCQkJCW5hbWU6ICJmb28iLAorCQkJCQkJc3JjczogWyJJRm9vLmFpZGwiXSwKKwkJCQkJCWltcG9ydHM6IFsiJXMiXSwKKwkJCQkJCXZlcnNpb25zX3dpdGhfaW5mbzogWworCQkJCQkJCXt2ZXJzaW9uOiAiMSIsIGltcG9ydHM6IFsiY29tbW9uLVYxIl19LAorCQkJCQkJCXt2ZXJzaW9uOiAiMiIsIGltcG9ydHM6IFsiY29tbW9uLVYyIl19LAorCQkJCQkJXQorCQkJCQl9CisJCQkJYCwgaW0pKSwKKwkJCQkJImZvby9haWRsX2FwaS9mb28vMS9JRm9vLmFpZGwiOiBuaWwsCisJCQkJCSJmb28vYWlkbF9hcGkvZm9vLzEvLmhhc2giOiAgICAgbmlsLAorCQkJCQkiZm9vL2FpZGxfYXBpL2Zvby8yL0lGb28uYWlkbCI6IG5pbCwKKwkJCQkJImZvby9haWRsX2FwaS9mb28vMi8uaGFzaCI6ICAgICBuaWwsCisJCQkJfSksCisJCQl9CisJCQlpZiB0cmFuc2l0aXZlIHsKKwkJCQljdXN0b21pemVycyA9IGFwcGVuZChjdXN0b21pemVycywgc2V0VHJhbnNpdGl2ZUZyZWV6ZUVudigpKQorCQkJfQorCisJCQljdHgsIF8gOj0gdGVzdEFpZGwodCwgYGAsIGN1c3RvbWl6ZXJzLi4uKQorCQkJc2hvdWxkSGF2ZURlcCA6PSB0cmFuc2l0aXZlICYmIHRlc3RjYXNlLmJvb2wKKwkJCWZvb0ZyZWV6ZUFwaVJ1bGUgOj0gY3R4Lk1vZHVsZUZvclRlc3RzKCJmb28tYXBpIiwgIiIpLk91dHB1dCgidXBkYXRlYXBpXzMudGltZXN0YW1wIikKKwkJCWNvbW1vbkZyZWV6ZUFwaU91dHB1dCA6PSBjdHguTW9kdWxlRm9yVGVzdHMoImNvbW1vbi1hcGkiLCAiIikuT3V0cHV0KCJ1cGRhdGVhcGlfMy50aW1lc3RhbXAiKS5PdXRwdXQuU3RyaW5nKCkKKwkJCXRlc3RNZXRob2QgOj0gYW5kcm9pZC5Bc3NlcnRTdHJpbmdMaXN0RG9lc05vdENvbnRhaW4KKwkJCWlmIHNob3VsZEhhdmVEZXAgeworCQkJCXRlc3RNZXRob2QgPSBhbmRyb2lkLkFzc2VydFN0cmluZ0xpc3RDb250YWlucworCQkJfQorCQkJdGVzdE1ldGhvZCh0LCAiT25seSBpZiBBSURMX1RSQU5TSVRJVkVfRlJFRVpFIGlzIHNldCBhbmQgYW4gYWlkbF9pbnRlcmZhY2UgZGVwZW5kcyBvbiBhbiBhbm90aGVyIGFpZGxfaW50ZXJmYWNlJ3MgVG9UIHZlcnNpb24sIGFuIGltcG9ydGVkIGFpZGxfaW50ZXJmYWNlIHNob3VsZCBiZSBmcm96ZW4gYXMgd2VsbC4iLAorCQkJCWZvb0ZyZWV6ZUFwaVJ1bGUuSW1wbGljaXRzLlN0cmluZ3MoKSwgY29tbW9uRnJlZXplQXBpT3V0cHV0KQorCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvYnVpbGQvYWlkbF91dGlscy5nbyBiL2J1aWxkL2FpZGxfdXRpbHMuZ28KaW5kZXggYjE5NzkzYy4uNGUwZmJhOSAxMDA2NDQKLS0tIGEvYnVpbGQvYWlkbF91dGlscy5nbworKysgYi9idWlsZC9haWRsX3V0aWxzLmdvCkBAIC0xNSw3ICsxNSw2IEBACiBwYWNrYWdlIGFpZGwKIAogaW1wb3J0ICgKLQkiYW5kcm9pZC9zb29uZy9hbmRyb2lkIgogCSJzdHJpbmdzIgogKQogCkBAIC00NiwyMiArNDUsNiBAQAogCXJldHVybiByZXQKIH0KIAotLy8gYmFzZURpciBpcyB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBwYWNrYWdlIG5hbWUgc3RhcnRzLiBlLmcuIEZvciBhbiBBSURMIGZpbAotLy8gbXltb2R1bGUvYWlkbF9zcmMvY29tL2FuZHJvaWQvSUZvby5haWRsLCBiYXNlRGlyIGlzIG15bW9kdWxlL2FpZGxfc3JjIGdpdmVuIHRoYXQgdGhlIHBhY2thZ2UgbmFtZSBpcwotLy8gY29tLmFuZHJvaWQuIFRoZSBidWlsZCBzeXN0ZW0gaG93ZXZlciBkb24ndCBrbm93IHRoZSBwYWNrYWdlIG5hbWUgd2l0aG91dCBhY3R1YWxseSByZWFkaW5nIHRoZSBBSURMIGZpbGUuCi0vLyBUaGVyZWZvcmUsIHdlIHJlbHkgb24gdGhlIHVzZXIgdG8gY29ycmVjdGx5IHNldCB0aGUgYmFzZSBkaXJlY3RvcnkgdmlhIGZvbGxvd2luZyB0d28gbWV0aG9kczoKLS8vIDEpIHZpYSB0aGUgJ3BhdGgnIHByb3BlcnR5IG9mIGZpbGVncm91cCBvcgotLy8gMikgdmlhIGBsb2NhbF9pbmNsdWRlX2Rpcicgb2YgdGhlIGFpZGxfaW50ZXJmYWNlIG1vZHVsZS4KLWZ1bmMgZ2V0QmFzZURpcihjdHggYW5kcm9pZC5Nb2R1bGVDb250ZXh0LCBzcmMgYW5kcm9pZC5QYXRoLCBhaWRsUm9vdCBhbmRyb2lkLlBhdGgpIHN0cmluZyB7Ci0JLy8gQnkgZGVmYXVsdCwgd2UgdHJ5IHRvIGdldCAxKSBieSByZWFkaW5nIFJlbCgpIG9mIHRoZSBpbnB1dCBwYXRoLgotCWJhc2VEaXIgOj0gc3RyaW5ncy5UcmltU3VmZml4KHNyYy5TdHJpbmcoKSwgc3JjLlJlbCgpKQotCS8vIEhvd2V2ZXIsIGlmIDIpIGlzIHNldCBhbmQgaXQncyBtb3JlIHNwZWNpZmljIChpLmUuIGRlZXBlcikgdGhhbiAxKSwgd2UgdXNlIDIpLgotCWlmIHN0cmluZ3MuSGFzUHJlZml4KGFpZGxSb290LlN0cmluZygpLCBiYXNlRGlyKSB7Ci0JCWJhc2VEaXIgPSBhaWRsUm9vdC5TdHJpbmcoKQotCX0KLQlyZXR1cm4gYmFzZURpcgotfQotCiBmdW5jIGZpeFJ1c3ROYW1lKG5hbWUgc3RyaW5nKSBzdHJpbmcgewogCXJldHVybiBzdHJpbmdzLk1hcChmdW5jKHIgcnVuZSkgcnVuZSB7CiAJCXN3aXRjaCByIHsKZGlmZiAtLWdpdCBhL2J1aWxkL2FwZXgvQW5kcm9pZC5icCBiL2J1aWxkL2FwZXgvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMzNDJhMy4uMDAwMDAwMAotLS0gYS9idWlsZC9hcGV4L0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1wYWNrYWdlIHsKLSAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCi0gICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0Ci0gICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAic3lzdGVtX3Rvb2xzX2FpZGxfbGljZW5zZSIKLSAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6Ci0gICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi0gICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbInN5c3RlbV90b29sc19haWRsX2xpY2Vuc2UiXSwKLX0KLQotYXBleF90ZXN0IHsKLSAgICBuYW1lOiAiY29tLmFuZHJvaWQuYWlkbHRlc3QiLAotICAgIG1hbmlmZXN0OiAiYXBleF9tYW5pZmVzdC5qc29uIiwKLSAgICBmaWxlX2NvbnRleHRzOiAiOmFwZXgudGVzdC1maWxlX2NvbnRleHRzIiwKLSAgICBrZXk6ICJjb20uYW5kcm9pZC5haWRsdGVzdC5rZXkiLAotICAgIGNlcnRpZmljYXRlOiAiOmNvbS5hbmRyb2lkLmFpZGx0ZXN0LmNlcnRpZmljYXRlIiwKLSAgICBpbnN0YWxsYWJsZTogZmFsc2UsCi0gICAgdXBkYXRhYmxlOiBmYWxzZSwKLQotICAgIG5hdGl2ZV9zaGFyZWRfbGliczogWwotICAgICAgICAidGVzdC1waWVjZS0xLVYzLW5ka19wbGF0Zm9ybSIsCi0gICAgXSwKLX0KLQotYXBleF9rZXkgewotICAgIG5hbWU6ICJjb20uYW5kcm9pZC5haWRsdGVzdC5rZXkiLAotICAgIHB1YmxpY19rZXk6ICJjb20uYW5kcm9pZC5haWRsdGVzdC5wdWJrZXkiLAotICAgIHByaXZhdGVfa2V5OiAiY29tLmFuZHJvaWQuYWlkbHRlc3QucGVtIiwKLX0KLQotYW5kcm9pZF9hcHBfY2VydGlmaWNhdGUgewotICAgIG5hbWU6ICJjb20uYW5kcm9pZC5haWRsdGVzdC5jZXJ0aWZpY2F0ZSIsCi0gICAgY2VydGlmaWNhdGU6ICJjb20uYW5kcm9pZC5haWRsdGVzdCIsCi19CmRpZmYgLS1naXQgYS9idWlsZC9hcGV4L2FwZXhfbWFuaWZlc3QuanNvbiBiL2J1aWxkL2FwZXgvYXBleF9tYW5pZmVzdC5qc29uCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjgxNDAzLi4wMDAwMDAwCi0tLSBhL2J1aWxkL2FwZXgvYXBleF9tYW5pZmVzdC5qc29uCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi17Ci0gICJuYW1lIjogImNvbS5hbmRyb2lkLmFpZGx0ZXN0IiwKLSAgInZlcnNpb24iOiAxCi19CmRpZmYgLS1naXQgYS9idWlsZC9hcGV4L2NvbS5hbmRyb2lkLmFpZGx0ZXN0LnBlbSBiL2J1aWxkL2FwZXgvY29tLmFuZHJvaWQuYWlkbHRlc3QucGVtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTgyYTJkLi4wMDAwMDAwCi0tLSBhL2J1aWxkL2FwZXgvY29tLmFuZHJvaWQuYWlkbHRlc3QucGVtCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQotTUlJSktRSUJBQUtDQWdFQTViOTNRUTZXQitNczAvSXp0Q3o5WnF2RXgwb0wvOVpzQnJ6a2lRY2QzWXA5SFZjRgotSmV2dTRLZVg4NkJ1MnQ4blpucjZDeEpQeTZndzkyaXRmSFNiT1htZCtmczh0Y2gxRDZicXRVM3h4cTNXZzhTQgotQ0tXRDd3Wm9EZDdya0xxQ2pWNklEZWJVSzBEdFAxV210VE1tMm1JR0tUQ25xT2dmY25rU2UxWXdRMjJzdUtLcwotb3JPSXJyczJ3anlJWm5oMGlJdlBwc2ZhSTRZUTZPbzArVlRxYjJrTXBrU2xCMXluZDhmVVR4TVJKQ1lYeXd5TwotdThIVDdEVk1qOS9YWUYwbk43WUZGZi9RY2QwVU9YR2cwdkNibW5pakphd2t2Y2I0ZkxxUXRKL29WYWpCaEMrdAotY25GMW1VZ29oNHFxQkZNVmNhS2lraUxJLzludU9yMmphbG5NNHRwZHpQV2JQQ0JGdHJwKzFCam00NCsyS2R3WgotS2x6enpqNWdMOElPcFRER2JBNzA2bkdhaC9Zc1dJZXd5TE51YjZPeFo5U3VlNFNnampsMm1aTXRvNm8xY21udwotd3pOZjVCNmpxQWE4WDh6TFhqS3VmOUhWUCt2dTZ3VkZtZkZ4Q1ZFUEZUdWlqOGZPQjNZQytxSUt1K3V0N1oyNQotTVBoUFFhSzJ4VHlQRk0rUHhnSThvSUI4VmM0VTBRM0IvRnNSU2l2UTVEM2JVNnQ0NHozNlZOaUUwTFFnV2NWVAotc0M2Ynl2YzNiRlFlbFp4VlpWOWlPYXNLOXRPSVBUUVp5dkZWbEVEQzJVR2xGSWtoOG8xeXZEaVZXcVVtUDZmYQotcWMwNXllKzRXUVUrUWpHTXp4aVNtQXBKdnlXeHdRb25VQTMxd2g3aE40U1l3OTVHUVR6d2gwd0VJdzhDQXdFQQotQVFLQ0FnQUQzc1hUZ3J0a1JwOXFzcG5NWHpXbGxSOHJmRVBYZTNVMlo5Z3h0cno2RG1zdEkxb2kyV2Fjd2pYOQotRktiSmFSancwUUdGVGptcDVKdHVqNFRjbzlvNWphTHJveC9Tc0IzSXRiY2Vkc0dyNXlIRjlubDErOVBOSXY1OQotdlZPYWpJbkdkK0V5MnNDWU9lL0ZNVnd0a1Q4R1RzQnIwVFlCMG1jMU5uVHBQdnB4S0ZmUWhHMEVFS0lzejFxTQoteXhoQklhWlU1b1lJK1RUamhFNmtuYzFtcGRlTktPZmRwU3BpaFYwTTE0RHNGQllsMWI1dzNUVktWR21OZ1JoWgotRkJ3OHMxVUZ5enNxczdSL05vb3dyWWxZQkZXYXRJMkxCT3RaaHhDSWlWd0dydXJyQm55OERWR09xL3FmS21nRQotWUlHY3NRbWJjSEhzcEVsZWhmMU5ZQVJ3dGpLTlY1TjhJbFNGTXVHb01xQmd4a3kyNjd1QmsyTXNtR3BTTmJ3eQotTE5PUnBEeitGYkdpY3hudHFJRStGNzdUSDhYU2kyd0pSOWdTaVd2M3ZmUUYzV0RzdWlUcWpua2NuYWEwai9OaAotWDhia05XOGQ4NDZPb3BieFdTc0xRSGsvMHRnVUhtdng5VlZ3VndndnRkRUhERk9SZFVJMmI2Rmtwd3dxTllCMAotRitRN2VZYzRrK1pVVUNqMU1Dd2ZnU29Jd2lIcGVTanlZc2xGcXNhVGZrNmNNVGRnRkNNcmxqTHlNRGx6MU8zbQotUm1DcnNya3JSQWRsMHdNbHJIaExxNFpTbXdVUGg4UXpEMGxaZExnTzFjYTMvazZxK2wxZDhVcGtNNGs2UGRxYwotUGJVOGRpL0dPbmIzN292UzZxMzZ0Vm9SVm1obS93eE9JME5rNnhCZVMwRjVIdkJYQVFLQ0FRRUErck9nOWZraQotRHNETktNekk4N2FVOC9KVmJBNTBvWW00a3hZaGVEUUNjbDZ4d3E2cGZBc2hSSTRNdXltNUdOUXZ2QVY1a0lFdQotc1A0dTlVR012REZWbkpuNHpmOE9udDUzRE5XTEE1Q0E3ZFIxQ1NVVUM3OHh6eTZ4MnZ3UU4zMWxhYTN6Z0RtbgotMk5yMyt1d3ZCa0s5Nnh1V1BRb1lLb3V5a1EwcHN5aW85cmhBeStWOVBJRW5Ka3BLbjVZSXJPR3NqVEtUWkFsbgotTC91emVIZ0VkZ0dEV3AwanFNTWVNdTgrVkpTYjlMTkQyQ2xxdUxoUm5SemNFSDg4MENycC8zVjIrSjd4dEJ6NgotN1EralY3S2tIK3BQcEl2T2xRMHc3S0syRDluRm83TWRxL0RFMUE4KzhVWXl5MjhEdGdRMlc1amg1dnduNEsxVQotZWJrcEtTZnhPVUpxVndLQ0FRRUE2cHA0a0MxWGJLN2RjZ2FXbFJORk9yMElvdUhtL0pmYVN6SDE3M3FHOWwvRQotempIUWpvUVlOM0ErbFpjWFdYU2NYcm11UzBpUytSVWQ1TG02NUVCMFRFeDQwcjdtOURMLzdwSnhuUlN2ZmJyRAotY05iVFpGUTI1ZTl1SllpS29kdkR5YTcwNmUwbjB3QldiOG1iL1g1TmxDQlRQWG9wWmJDM2ZuNlNMbTBQbk5xOQotL3ZFUE5jWUFCRDJkVWYwaEYwNVEyV3RvR2VZNWRQQ2FPNzd6cStOM002aGdkZkxNbkRpWUpCYnd4YkZVc0g0UgotajhrRFVsZXZRYWFtZGdXU3VISVM0eG41UzVUcDAxOWwrUm1ub0dZYmRXU1N4cXJPc1BSWXVhU1ZLWXgrb0hRUAotVUVzajRIMmswTWNPTGUyYmNRZ2srOFJTaGVJZUlJcnNrZnVEYlZFS0NRS0NBUUVBM09ub3pwZElVYVBIcFVvLwotVWJMME1ycTZWMHV0cnFNRFNHbForT2dydDhpRjc3MmxqNjduRTlmd2xBVENISVR0dzBzM3dnUnp0bmRsdmF5VAotYlVvejNKazVTNXlUcjU3dFhSdlhNYjdtUGF6WHJNVkZrc3hhQWUxdHdFQVpzaXdIYjBaZnFnQWtUYzAyYzZBbwotRitZOElLN2doczBjV25GYldzSTBtckVib3J6ZUxFMy9PNCs3aGR3MVFjY2R3ZW5pK1ZFMTNCTUZJSjAxbXRSMwotYWQwUGVJdTczbnlCWWZTOEFpQXFCVWpxWWRLdFBqVDloZXJtYUlzV2RZRTdUV2FlL1pwaDlvc0srbGFyWXg0QgotempYVkZIUTJCOVhsNUwvRW10Y1ZkNWpnYnFEdGNNZzJlTG1aRFBhNFdHNEIwRms1eHljdnBLWllLQ0xuaUdLdwotQi9ya1pRS0NBUUFEMDZNMXp0ZUhPVTc1Wml3Y29HVFhzVytyb0gyeER4VUxkdlFwQk5tZ3VTMHZvOVpnREwyTQotWWZOVFkxU0pMQUxFOU1ob0IvWUZ4QmRwdkxIVXVVeHNWaTcrV1FqUllPZVZ6Nk8weVRxWGxXMU1zT1JmMVpQVAotcWxVa25aYU5UMVZoTzg1WTVucG8wYStYUVRXZksraytDa3p4U3NYVUY4N1diR0FjQzhGZWNKNzZ3cG5aNmJIawotWDlEcUhuUGt1bTFOTHBoVEc5TkNHZzZaL09KaW9tSTJZSCs2VE15VG04UzNpZnhCYlVRUllPME9hRnY2Z3QyagotOTREdG1lZXJ4SWlVVmI4Z1FYeVM2eEp4dnI1aU9tZ21RUTYzMk45b09ZUWMreGRIeHpmbGpCOFgwekh4bm5zSwotd01SMWNWUEF3ejQvTVJPYmhYV3lXREhGcTlHWC9lTnBBb0lCQVFDeFdxc1liVEM0SnpvQkJhWlNvTUJweVZZQgotUjlsZnlLYU1MbGg0c3pHMFljUDduYVBJNUtBaWRTamtVNHNvbjd2ejdMc1hESEJLemdLNGdNdGJVSUZPcUZGdgotWlVhYVNrU0JrYkVjSmdzN2VQMjRRTUQzSTNrTnBya1BGSVpueU1UOVZLSVJWTGhUb0EyVGRkU1MrSGNJaUxVVgotTnBHN2VEOExaVzlCL0NmVU9FcTdibmMrbXcwS0Q0OGI5NEJqL1BHRjdJT3ZCanlRaE9zOTJPVW53M0grM2xpbwotWDFnZXprbzZxb2JNSUJ2YnU0Z2lHYUpIajdiVGlsMGwwYldSOGR3Zk1ScGhZZjlscFhwa2lMT0svVmpXVC9GbgotNW5KKytWY3pLaTdVZkFDZW1abzl1aFkyby9vRXVYeFE2TkhJL1dleFpTTi9vdm8rUlhjb0JrL1RaakpUCi0tLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBleC9jb20uYW5kcm9pZC5haWRsdGVzdC5wazggYi9idWlsZC9hcGV4L2NvbS5hbmRyb2lkLmFpZGx0ZXN0LnBrOApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE3YTA5Mi4uMDAwMDAwMAotLS0gYS9idWlsZC9hcGV4L2NvbS5hbmRyb2lkLmFpZGx0ZXN0LnBrOAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1aWxkL2FwZXgvY29tLmFuZHJvaWQuYWlkbHRlc3QucHVia2V5IGIvYnVpbGQvYXBleC9jb20uYW5kcm9pZC5haWRsdGVzdC5wdWJrZXkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxOTZjYTYuLjAwMDAwMDAKLS0tIGEvYnVpbGQvYXBleC9jb20uYW5kcm9pZC5haWRsdGVzdC5wdWJrZXkKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idWlsZC9hcGV4L2NvbS5hbmRyb2lkLmFpZGx0ZXN0Lng1MDkucGVtIGIvYnVpbGQvYXBleC9jb20uYW5kcm9pZC5haWRsdGVzdC54NTA5LnBlbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY5NzJmZi4uMDAwMDAwMAotLS0gYS9idWlsZC9hcGV4L2NvbS5hbmRyb2lkLmFpZGx0ZXN0Lng1MDkucGVtCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCi1NSUlHSnpDQ0JBK2dBd0lCQWdJVUdJaXdFdVF3TVRPd25MU0cvNEdHa1kxby9qRXdEUVlKS29aSWh2Y05BUUVMCi1CUUF3Z2FFeEN6QUpCZ05WQkFZVEFsVlRNUk13RVFZRFZRUUlEQXBEWVd4cFptOXlibWxoTVJZd0ZBWURWUVFICi1EQTFOYjNWdWRHRnBiaUJXYVdWM01SQXdEZ1lEVlFRS0RBZEJibVJ5YjJsa01SQXdEZ1lEVlFRTERBZEJibVJ5Ci1iMmxrTVIwd0d3WURWUVFEREJSamIyMHVZVzVrY205cFpDNWhhV1JzZEdWemRERWlNQ0FHQ1NxR1NJYjNEUUVKCi1BUllUWVc1a2NtOXBaRUJoYm1SeWIybGtMbU52YlRBZ0Z3MHlNREE0TVRnd05UUTJNVGhhR0E4ME56VTRNRGN4Ci1OVEExTkRZeE9Gb3dnYUV4Q3pBSkJnTlZCQVlUQWxWVE1STXdFUVlEVlFRSURBcERZV3hwWm05eWJtbGhNUll3Ci1GQVlEVlFRSERBMU5iM1Z1ZEdGcGJpQldhV1YzTVJBd0RnWURWUVFLREFkQmJtUnliMmxrTVJBd0RnWURWUVFMCi1EQWRCYm1SeWIybGtNUjB3R3dZRFZRUUREQlJqYjIwdVlXNWtjbTlwWkM1aGFXUnNkR1Z6ZERFaU1DQUdDU3FHCi1TSWIzRFFFSkFSWVRZVzVrY205cFpFQmhibVJ5YjJsa0xtTnZiVENDQWlJd0RRWUpLb1pJaHZjTkFRRUJCUUFECi1nZ0lQQURDQ0Fnb0NnZ0lCQU1IcXRZK3ZsWEZWSWlSTllsbnJKM2RoZkJQZk54dndLNW4yNUJlQXlaTWxPbUxyCi1MOE5yNVBKVnNpR1h0czZmb3JUVXNuTFNWenJOVWpkRkJXck9XWFNKUS9RYk5uMGx1cnl4Y1V5ZkRCelA4NXZsCi1NNlBabXdpZTMvYnpRekdVWStMWndOcVRNQ0t5MXh2OEtpV2ttejRTTi95YjRBQ2toQlRELzlqUC9XaFRManJwCi12TzcvUnhpZ0E4R3lOcmkvQ1JUWTV0dTFFMXhDK0s5SFZmVEhqblFnNjlTVXpJVlFKcERZQndJUURYa2M3dU51Ci1PVmVvVEZ6eldxVEhwTTZmdklWdkJ1S0JXTDZ1VGFqZG5zSjZlNzVXSVYyMWJ3dXZSQk5sREt1Y0M3WjNoOHE2Ci1oRGdtN3ExWWdMREJqenBmWU9hK1BoQUNFbW41RlNvckNaNlVqbTJvc1dJcWFhVHNyajdNK2l1d09hQU5SVlR1Ci1nUmVVdEh5dzlsaHFvdEJyaEVNa1BNZFJqS25xTVFsaDgxKzNEM0g2L2NaemRFc1ZYRmVyTGV3Wkk4aUpZb2hwCi16MDc3N1NEbzhGRUVCcm1kbS83VmtuTkpSeWtLaGZTcEZmWVpaRTZBaVRMMXg4bEgrNVlCSENiYWRrZC9yZWlRCi1FamZXbHdmZVBQTFY3b0lraTN5cVJXallUMU1UdDNLbEFTR1o5SFpJMm9kZXpJY29qWnZnSGRIWDhNR3l0ZldECi1rWHppSlZyWE1VWGdVZmxqUXdwc2pFaEUxUjEzRTVqZHBWc3B3NjI0QlBMT3dvRXpZNzB0RTBzRWQ2V2xTVkUxCi1GVjNBaVZJUzN2bFhFZ2JLKzZobUcrbGcvcXYwWkljd0QyYmpLbnZFT3RMMDc3SEhXV3BqeTZ6dVZGRXZBZ01CCi1BQUdqVXpCUk1CMEdBMVVkRGdRV0JCU3BZaWFsZ0M1SHlYVmIxRzNycUtueGEwU296akFmQmdOVkhTTUVHREFXCi1nQlNwWWlhbGdDNUh5WFZiMUczcnFLbnhhMFNvempBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUEwR0NTcUdTSWIzCi1EUUVCQ3dVQUE0SUNBUUFQQUlXUWRVcDBwbVJjVHF0SE4wazRDR3ZCSnJVckpqOTJVaTJ2REVpcGhIM2N0eE9aCi1rY1cxbGplMUxsSEdkOWIwNzBuU1FodXd5SkhvcysreEhQUDNKMkZjS2dWUzVYVExQMjdhc0lxWm5TNWJtRVNWCi15akxJaVhXazNpZmd5ZDVudGZSNHBvdjZNVW1mWUo2ZXRSSHorMTZVSDdJZnNEVTRib2FaNXBkMGpOTDl5QUhNCi1TMGhxRVdNVlNVblQ2ZkhsRVhCN1d5WFI5MmZHa21HZFZNbUZ3dHBObm1Ja3RodmZuZHVlYUpFRFdIUmJ3cjFZCi1mMGxidlowcDdkVmk5WmhSMWs2YVJtTTZmdkFXWUI3QTBiWmUva3ZVdEZKak5UaFA0QzZmTHJ2YWxCc0Jhdnc0Ci16YUdKQVV2MGNERDFkbGFONFhYUnMwcExGSWVteHRpeTRGTmIrbFhpbkN1MU0vTGVZMDRTWnJWMjRqTVhYMEpsCi16MGc5OU9CeWVqR24yT3F5Y1RndWhnZE84S0tWT3NIbTI5cDlsOWFEVVVqdEVaR2Q2TUQrei9BQSt5UC9UdkttCi1MdTFmd1NjU3FTbGxaTFkvcU5NRlpVVGFMNHVwWTJXM1hrMkZ4TUcvOWg4SUh3NkRjbjlBNzRQc2Y2dHNkUldnCi1EM3BGY2VnOGs5bkpUaDJNQ0NoaFZCUDJpY0dzckpYdFFSSHRHdXFPVTlsc3o2SEQxcjREUWduUG9IbVA1MTFrCi1wOHVLbE1rMEl4QmY1VDFoQjFlYnZaWVM5VlROQzVKOS9DanAyMExYUjV3WmEzcVQ1dTRHME5NSk4xSlgwTVIxCi1kUVdCcEpqelhJOTMya1lKQTZkM2RqVW44a1hBb2JUQmd5U3M5MGkrTWpLZTA4bDgveFpvLzRGd1hBPT0KLS0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL2J1aWxkL2FwZXgva2V5LnBlbSBiL2J1aWxkL2FwZXgva2V5LnBlbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ1ZjAyYy4uMDAwMDAwMAotLS0gYS9idWlsZC9hcGV4L2tleS5wZW0KKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0tLS0tLUJFR0lOIFBSSVZBVEUgS0VZLS0tLS0KLU1JSUpRUUlCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQ1Nzd2dna25BZ0VBQW9JQ0FRREI2cldQcjVWeFZTSWsKLVRXSlo2eWQzWVh3VDN6Y2I4Q3VaOXVRWGdNbVRKVHBpNnkvRGErVHlWYklobDdiT242SzAxTEp5MGxjNnpWSTMKLVJRVnF6bGwwaVVQMEd6WjlKYnE4c1hGTW53d2N6L09iNVRPajJac0ludC8yODBNeGxHUGkyY0Rha3pBaXN0Y2IKLS9Db2xwSnMrRWpmOG0rQUFwSVFVdy8vWXovMW9VeTQ2NmJ6dS8wY1lvQVBCc2phNHZ3a1UyT2JidFJOY1F2aXYKLVIxWDB4NDUwSU92VWxNeUZVQ2FRMkFjQ0VBMTVITzdqYmpsWHFFeGM4MXFreDZUT243eUZid2JpZ1ZpK3JrMm8KLTNaN0NlbnUrVmlGZHRXOExyMFFUWlF5cm5BdTJkNGZLdW9RNEp1NnRXSUN3d1k4NlgyRG12ajRRQWhKcCtSVXEKLUt3bWVsSTV0cUxGaUttbWs3SzQrelBvcnNEbWdEVVZVN29FWGxMUjhzUFpZYXFMUWE0UkRKRHpIVVl5cDZqRUoKLVlmTmZ0dzl4K3YzR2MzUkxGVnhYcXkzc0dTUElpV0tJYWM5TysrMGc2UEJSQkFhNW5adisxWkp6U1VjcENvWDAKLXFSWDJHV1JPZ0lreTljZkpSL3VXQVJ3bTJuWkhmNjNva0JJMzFwY0gzanp5MWU2Q0pJdDhxa1ZvMkU5VEU3ZHkKLXBRRWhtZlIyU05xSFhzeUhLSTJiNEIzUjEvREJzclgxZzVGODRpVmExekZGNEZINVkwTUtiSXhJUk5VZGR4T1kKLTNhVmJLY090dUFUeXpzS0JNMk85TFJOTEJIZWxwVWxSTlJWZHdJbFNFdDc1VnhJR3l2dW9aaHZwWVA2cjlHU0gKLU1BOW00eXA3eERyUzlPK3h4MWxxWTh1czdsUlJMd0lEQVFBQkFvSUNBRWVuekVsNUQxYmVwNHdVa0VnN3pjeWUKLVdEUWJvb2lQV2YwOXJ4RkVSTGc3NUhSVEJjWkhvMFV0QjNMRVZnZktFMXlRMEJQL3g3M3h5dlNqYTVvSkFDTkEKLTZieFZKZkJldGI4dUxuaXF1TllZdmFNWXNkbFUrcVhYMTFpd2tWN0x2NUUrOTdXTStCZUtVRlNGL0trR1IxdEwKLWJpYkpEcUFPS3NSbG5LL29RM0orY2pIUTEwRFZVZGMyb2N5OFp0NGpzVjVqdkFMcHlXcXBVSzJzUllYN0M1ZTcKLTVva2FKdTBJTGdnTjI2RVdmM1FHamZ1NmFqUUsrNVRKVS9CWjJYdUVxU3dCVitEdy9QTVJBNTluclZlZDNRWDcKLVc3Nzk0VGZISHZldnVsdmJnTFIvUE0xYjJLbkxNUjBhL0FyVXEzRmRkemdzaWxCdUE1SG5PYnZvUlZpMCtsL0QKLVNjMGVvT1MzKzhkUmtsc3YxK3BSMnJKWDZ2TmtzcGV4NEQ2MC9uVi92U0xoYUg1UW5reHMxbHJBcEJ0bG5oVnYKLTR1UkZvdFc4TFhrRlRCbm80YVR4SFhNSzBiSmVRUXNIeUhIZ2xjZEVGcGEzQ1pBZmwvYnZmaVpFdkpCZmJJS0QKLTY5TUhpaS9PUUJsMm5zbFhvSzlDZGNydjRCbGcySHQxVjl2N29wcXZqKzd0SDg2cXlrK1RwR3dqSnYwUkhqK3gKLW5MWnZpeDN6aDc3SmhhUENwNyt1aGk3b284WlQ5eTdvMGdUSFZXRVdGaThWK3ROL1RybjFmTGFyOEFGTXh1RDUKLTRCRlNnUGx5elhvMWh6c1FMcmJXNldIcmJRbzc1TFk2UFFPZU5JN2xrOW1wN1Brelo0SHdlM0FVM1NUQkVaS3oKLXVLZi83T25zem5PY3krcytKMzBwQW9JQkFRRDZ5MENEVW1acys2YVl4SjBEL0FBSXIySlV2UlBsd293Ulo3WWUKLU9pbDIyRFErY0NUYTVqNmx1QVpyUTN4OFFtenkzUlNldGR4ZWt5Z2VoeXVlV0p3eHRmc25VZ1V5SUZsYjFpY0oKLU91MHJCRk1adi9wZnVHZ085UWxKNjdyV25kN2Nlb2xjVDdpM09VdkpNRE1NQ1A1ZHFnUWN5RnFSblRNcm9YMWMKLVkzSU0wUjd0ekpNUFg2bXdnblpYTm4yS1ZLdEQ0WkkyK0Y4dDJHbks2WEh2Mjc0TmhUbDhKQ2RzYjN5dVVoekgKLXpYNmF4TUFWSVhOZDBrZU1RNmVMZEdWNkxUNmRDTllScnJtYmpkOE56c3hiSVc4SXNHWkZsUm9CNmk4NDUvc2EKLUMzN0pudHQyL0c3cDNjVkE4dHlPUTdaWlZaUTJubEwxc004RjhSQUNQZlBhcW1sVkFvSUJBUURGOFRTazkwTlAKLVdjNEhPTnVvOFFQQ01FWGFIbzF0cUgrYVV6cVg5V2FtVldrNHlmdjFCVnVEM3EyVXZLTE5STXpRcGExZ0FaamsKLWU0U1RPYTFlQ05DcGVBM2FxYmR1bnJVcmZvejAyU1FTb1RLTStvNWhiQmlpSDR3SytvWGtrUjI5K1ZkVTJZd3cKLWtDVEtDRmpCZjRoVisydTEvZUJ1UjFNRGNPVndRVzZOM1NrMzdJbXdHdHlnUnJISVB1WThJcjAwV1FtcEtQNlcKLU1NZGkwdFVOWHhwNTF2czhROFRHcmZaQy9sN2dzMU9FYWFTcmIrNjBlcHByd0ZQV01pRnViUEh5UTdmOWRtMzIKLWxiamhVUHZKZkYwNHBUYXpWMmFBeUFZWlBhUW1OaFExVFFsVzhnZ3RaZlZjOS9Idy9lcTRLLzNWZXZpeENxcUsKLW1tY1ljRGY0cXdCekFvSUJBREVodG03RHFzczQ5YWRDQlZ5dGRyZzgyNitzSndUQSt6M0JxcHo3V2ZvdFd2Yk0KLWMzdnExV1VUeXpZaVQzWHNjWG1XdEI1dmxFOTIxc284UXVCUGpiSHphOU9GTHYxbDl2dVYxYW5xUUdKSUE1dXMKLXoza0hJR09sdjM4YXpreVRPd0RJaExadjY4a0JVWWFGaWNxV3pIWS9BM1U4RHZvdDZNTm9iSzIzMGJVUEZ0Y1IKLVY5SVFOS2NldDk1WUQzb1ZJa1EzSWJUaExZeEd0RnNMSnNZTnI0cm9pWjEzVzczVGpZSjlGYVJTN3JXVlMrZ1gKLTJJa04wL1Izb0pBaWFtcm9DRGN0YnZxaDF6elJLMXlDSWVqTWdQc2J5NzFmKzJ0YW5JdXlicS9vaHBzckl1V0oKLWlKVUtYRVZnRHJOVU1wb0h1UFNHU2N4V0tnaUk5RkRzSUNTN2M4MENnZ0VBTFVKbXdDV05iWEppU29KMHIxOVUKLWRhMWwrMmFxL2R6ZU9HSTVibzk5QmlGWGF0VzhWNXorL05zSW80NnlSdThwU2Jmb09hQ0QzaEprRU9uS08wc1cKLXN2a3hhY01Pbnl1SXowWWpZc1RYbTY3aUNSd3RQQmRrVm9XU0Z0eUxpdVNuZ1UybTYwN0c0RC9GT2JESTRvMlAKLWxlRmtFbnZYT2oveXVrR3hKSWJCaVl4OUpUMWZpalhLSnBlamhON2s4L0VaaEFPcjB0TDl5MGVoLzNXbm8yUVEKLWdMVm9RckpZSnZtVjZtR1JQaDJpeGc4RnlQRlNDbEJTU0xyME1IREw5aHpSQVl6OFgrY1pZNTErWlg2SDQ5MGMKLXo1dnZNdmlVQm5RMStNV0FhQUJMaEpoMXZ6eWVKQXRCSEIzUlkwSWJ6anE0MG54SXF1cCtiaXk1ei91d3dKb1IKLUF3S0NBUUJXTUdNNkNOZWMxWnpWQmpFTHV2T2hjbkwrZ042VXBtaUtiUVIrZ0RxeCtOZTJuR1huTnZoSHdtSHoKLTRpdE4vS3dFM3Y2NWQ4OUxWbVdjMVZCRWJDYzIyR1lBZ3RvTm04MU5UZU1JaURac2NrZzRHV0ZyaUc3Tkk3dmwKLXNzbDdOREJIZms1ZjNqU2l2L2RndUVLOEZRZ1VhWUwrVDBmaEg3MTRKemRydTVNQVZaM1hTVHF0VTNLWCtQSGgKLTZyRWgyUnhrUDJpWlpucE0xVmZXL2ljZFVhbHpndDZvK0NOUkVoY2czb3hvNE1LSnFjY1l3OENLaUNPVDVKOTcKLWMreDY5Y0RBT1NTdEM5YkdrUmk0SURPRzcxYXNvZFh2ZnZwTy9Oem5GNDNiUUlzbG00QU82M1Y5QThHK29hRGMKLXJYajI4Wit6VDUyOHZBUUkzbmIrT3EzRXZVTk4KLS0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0KZGlmZiAtLWdpdCBhL2J1aWxkL2dvLm1vZCBiL2J1aWxkL2dvLm1vZAppbmRleCAzZWY3YTQ5Li41ZTVmNGI5IDEwMDY0NAotLS0gYS9idWlsZC9nby5tb2QKKysrIGIvYnVpbGQvZ28ubW9kCkBAIC03LDggKzcsMTYgQEAKIAogcmVwbGFjZSBhbmRyb2lkL3Nvb25nIHYwLjAuMCA9PiAuLi8uLi8uLi8uLi9idWlsZC9zb29uZwogCi1yZXBsYWNlIGdpdGh1Yi5jb20vZ29sYW5nL3Byb3RvYnVmIHYwLjAuMCA9PiAuLi8uLi8uLi8uLi9leHRlcm5hbC9nb2xhbmctcHJvdG9idWYKK3JlcGxhY2UgZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYgdjAuMC4wID0+IC4uLy4uLy4uLy4uL2V4dGVybmFsL2dvbGFuZy1wcm90b2J1ZgogCiByZXBsYWNlIGdpdGh1Yi5jb20vZ29vZ2xlL2JsdWVwcmludCB2MC4wLjAgPT4gLi4vLi4vLi4vLi4vYnVpbGQvYmx1ZXByaW50CiAKKy8vIEluZGlyZWN0IGRlcHMgZnJvbSBnb2xhbmctcHJvdG9idWYKK2V4Y2x1ZGUgZ2l0aHViLmNvbS9nb2xhbmcvcHJvdG9idWYgdjEuNS4wCisKK3JlcGxhY2UgZ2l0aHViLmNvbS9nb29nbGUvZ28tY21wIHYwLjUuNSA9PiAuLi8uLi8uLi8uLi9leHRlcm5hbC9nby1jbXAKKworLy8gSW5kaXJlY3QgZGVwIGZyb20gZ28tY21wCitleGNsdWRlIGdvbGFuZy5vcmcveC94ZXJyb3JzIHYwLjAuMC0yMDE5MTIwNDE5MDUzNi05YmRmYWJlNjg1NDMKKwogZ28gMS4xMwpkaWZmIC0tZ2l0IGEvLmNsYW5nLWZvcm1hdCBiL2J1aWxkL2hhc2hfZ2VuLnNoCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKc2ltaWxhcml0eSBpbmRleCA2MyUKcmVuYW1lIGZyb20gLmNsYW5nLWZvcm1hdApyZW5hbWUgdG8gYnVpbGQvaGFzaF9nZW4uc2gKaW5kZXggZGE3OTA1Ni4uOWJiN2U4MwotLS0gYS8uY2xhbmctZm9ybWF0CisrKyBiL2J1aWxkL2hhc2hfZ2VuLnNoCkBAIC0xLDUgKzEsNiBAQAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIyEvdXNyL2Jpbi9lbnYgYmFzaAorCisjIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAjCiAjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xMiwxMyArMTMsMTEgQEAKICMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCiAKLUJhc2VkT25TdHlsZTogR29vZ2xlCi1Db21tZW50UHJhZ21hczogTk9MSU5UOi4qCi1EZXJpdmVQb2ludGVyQWxpZ25tZW50OiBmYWxzZQotQWxsb3dTaG9ydEZ1bmN0aW9uc09uQVNpbmdsZUxpbmU6IElubGluZQotQ29sdW1uTGltaXQ6IDEwMAotVGFiV2lkdGg6IDIKLVVzZVRhYjogTmV2ZXIKLUluZGVudFdpZHRoOiAyCitzZXQgLWUKKworaWYgWyAkIyAhPSAzIF07IHRoZW4KKyAgZWNobyAiVXNhZ2U6IGhhc2hfZ2VuLnNoIDxhcGlfcGF0aD4gPGxhdGVzdC12ZXJzaW9uPiA8aGFzaF9maWxlX3BhdGg+IgorICBleGl0IDEKK2ZpCisoY2QgJDEgJiYgZmluZCAuLyAtbmFtZSAiKi5haWRsIiAtcHJpbnQwIHwgTENfQUxMPUMgc29ydCAteiB8IHhhcmdzIC0wIHNoYTFzdW0gJiYgZWNobyAkMikgfCBzaGExc3VtIHwgY3V0IC1kICIgIiAtZiAxID4+ICQzCmRpZmYgLS1naXQgYS9idWlsZC9wcm9wZXJ0aWVzLmdvIGIvYnVpbGQvcHJvcGVydGllcy5nbwppbmRleCAxYjMwMmE5Li5hMzc0NTNhIDEwMDY0NAotLS0gYS9idWlsZC9wcm9wZXJ0aWVzLmdvCisrKyBiL2J1aWxkL3Byb3BlcnRpZXMuZ28KQEAgLTUzLDYgKzUzLDcgQEAKIAlWZW5kb3JfYXZhaWxhYmxlICAgICAgICAgICpib29sCiAJT2RtX2F2YWlsYWJsZSAgICAgICAgICAgICAqYm9vbAogCVByb2R1Y3RfYXZhaWxhYmxlICAgICAgICAgKmJvb2wKKwlSZWNvdmVyeV9hdmFpbGFibGUgICAgICAgICpib29sCiAJSG9zdF9zdXBwb3J0ZWQgICAgICAgICAgICAqYm9vbAogCUdlbmVyYXRlZF9zb3VyY2VzICAgICAgICAgW11zdHJpbmcKIAlHZW5lcmF0ZWRfaGVhZGVycyAgICAgICAgIFtdc3RyaW5nCkBAIC02Nyw3ICs2OCw2IEBACiAJU3RlbSAgICAgICAgICAgICAgICAgICAgICAqc3RyaW5nCiAJQXBleF9hdmFpbGFibGUgICAgICAgICAgICBbXXN0cmluZwogCU1pbl9zZGtfdmVyc2lvbiAgICAgICAgICAgKnN0cmluZwotCVVzZUFwZXhOYW1lTWFjcm8gICAgICAgICAgYm9vbAogCVRhcmdldCAgICAgICAgICAgICAgICAgICAgY2NUYXJnZXRQcm9wZXJ0aWVzCiAJVGlkeSAgICAgICAgICAgICAgICAgICAgICAqYm9vbAogCVRpZHlfZmxhZ3MgICAgICAgICAgICAgICAgW11zdHJpbmcKQEAgLTg4LDE2ICs4OCwxOCBAQAogfQogCiB0eXBlIHJ1c3RQcm9wZXJ0aWVzIHN0cnVjdCB7Ci0JTmFtZSAgICAgICAgICAgKnN0cmluZwotCUNyYXRlX25hbWUgICAgIHN0cmluZwotCU93bmVyICAgICAgICAgICpzdHJpbmcKLQlEZWZhdWx0cyAgICAgICBbXXN0cmluZwotCUhvc3Rfc3VwcG9ydGVkICpib29sCi0JU3JjcyAgICAgICAgICAgW11zdHJpbmcKLQlSdXN0bGlicyAgICAgICBbXXN0cmluZwotCVN0ZW0gICAgICAgICAgICpzdHJpbmcKLQlUYXJnZXQgICAgICAgICBydXN0VGFyZ2V0UHJvcGVydGllcwotCUFwZXhfYXZhaWxhYmxlIFtdc3RyaW5nCisJTmFtZSAgICAgICAgICAgICAqc3RyaW5nCisJQ3JhdGVfbmFtZSAgICAgICBzdHJpbmcKKwlPd25lciAgICAgICAgICAgICpzdHJpbmcKKwlEZWZhdWx0cyAgICAgICAgIFtdc3RyaW5nCisJSG9zdF9zdXBwb3J0ZWQgICAqYm9vbAorCVZlbmRvcl9hdmFpbGFibGUgKmJvb2wKKwlTcmNzICAgICAgICAgICAgIFtdc3RyaW5nCisJUnVzdGxpYnMgICAgICAgICBbXXN0cmluZworCVN0ZW0gICAgICAgICAgICAgKnN0cmluZworCVRhcmdldCAgICAgICAgICAgcnVzdFRhcmdldFByb3BlcnRpZXMKKwlBcGV4X2F2YWlsYWJsZSAgIFtdc3RyaW5nCisJTWluX3Nka192ZXJzaW9uICAqc3RyaW5nCiB9CiAKIHR5cGUgcGhvbnlQcm9wZXJ0aWVzIHN0cnVjdCB7CmRpZmYgLS1naXQgYS9idWlsZC90ZXN0c182L3Rlc3Q2L0Jhci5haWRsIGIvYnVpbGQvdGVzdHNfNi90ZXN0Ni9CYXIuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzFlZmFjCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvdGVzdHNfNi90ZXN0Ni9CYXIuYWlkbApAQCAtMCwwICsxLDcgQEAKK3BhY2thZ2UgdGVzdDY7CisKK2ltcG9ydCB0ZXN0Ni5Gb287CisKK3BhcmNlbGFibGUgQmFyIHsKKyAgICBGb29bXSBmb29zOworfQpkaWZmIC0tZ2l0IGEvYnVpbGQvdGVzdHNfNi90ZXN0Ni9Gb28uYWlkbCBiL2J1aWxkL3Rlc3RzXzYvdGVzdDYvRm9vLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQzZDlmMgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL3Rlc3RzXzYvdGVzdDYvRm9vLmFpZGwKQEAgLTAsMCArMSw2IEBACitwYWNrYWdlIHRlc3Q2OworCitwYXJjZWxhYmxlIEZvbyB7CisgICAgUGFyY2VsYWJsZUhvbGRlciBwaDsKKyAgICBQYXJjZWxGaWxlRGVzY3JpcHRvcltdIHBmZHM7IC8vIG5vdCBtb3ZlYWJsZQorfQpkaWZmIC0tZ2l0IGEvY2hlY2tfdmFsaWQuY3BwIGIvY2hlY2tfdmFsaWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3YmNiOGQKLS0tIC9kZXYvbnVsbAorKysgYi9jaGVja192YWxpZC5jcHAKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJjaGVja192YWxpZC5oIgorI2luY2x1ZGUgImFpZGwuaCIKKworI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworCit1c2luZyBUeXBlUHJlZGljYXRlID0gc3RkOjpmdW5jdGlvbjxib29sKGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJik+OworCituYW1lc3BhY2UgeworYm9vbCBJc0xpc3RPZihjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSwgVHlwZVByZWRpY2F0ZSBwcmVkKSB7CisgIHJldHVybiB0eXBlLkdldE5hbWUoKSA9PSAiTGlzdCIgJiYgdHlwZS5Jc0dlbmVyaWMoKSAmJiB0eXBlLkdldFR5cGVQYXJhbWV0ZXJzKCkuc2l6ZSgpID09IDEgJiYKKyAgICAgICAgIHByZWQoKnR5cGUuR2V0VHlwZVBhcmFtZXRlcnMoKS5hdCgwKSk7Cit9Citib29sIElzQXJyYXlPZihjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSwgVHlwZVByZWRpY2F0ZSBwcmVkKSB7CisgIHJldHVybiB0eXBlLklzQXJyYXkoKSAmJiBwcmVkKHR5cGUpOworfQorYm9vbCBJc0ludGVyZmFjZShjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSkgeworICByZXR1cm4gdHlwZS5HZXREZWZpbmVkVHlwZSgpICYmIHR5cGUuR2V0RGVmaW5lZFR5cGUoKS0+QXNJbnRlcmZhY2UoKTsKK30KK30gIC8vIG5hbWVzcGFjZQorCitzdHJ1Y3QgQ2hlY2tUeXBlVmlzaXRvciA6IEFpZGxWaXNpdG9yIHsKKyAgYm9vbCBzdWNjZXNzID0gdHJ1ZTsKKyAgc3RkOjp2ZWN0b3I8VHlwZVByZWRpY2F0ZT4gY2hlY2tlcnM7CisKKyAgdm9pZCBWaXNpdChjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSkgb3ZlcnJpZGUgeworICAgIGZvciAoYXV0byYgY2hlY2tlciA6IGNoZWNrZXJzKSB7CisgICAgICBpZiAoIWNoZWNrZXIodHlwZSkpIHsKKyAgICAgICAgc3VjY2VzcyA9IGZhbHNlOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHZvaWQgQ2hlY2soVHlwZVByZWRpY2F0ZSBjaGVja2VyKSB7IGNoZWNrZXJzLnB1c2hfYmFjayhzdGQ6Om1vdmUoY2hlY2tlcikpOyB9Cit9OworCitib29sIENoZWNrVmFsaWQoY29uc3QgQWlkbERvY3VtZW50JiBkb2MsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgY29uc3QgYXV0byBsYW5nID0gb3B0aW9ucy5UYXJnZXRMYW5ndWFnZSgpOworICBjb25zdCBhdXRvIG1pbl9zZGtfdmVyc2lvbiA9IG9wdGlvbnMuR2V0TWluU2RrVmVyc2lvbigpOworCisgIENoZWNrVHlwZVZpc2l0b3IgdjsKKworICB2LkNoZWNrKFsmXShjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSkgeworICAgIGNvbnN0IGF1dG8gdmFsaWRfdmVyc2lvbiA9IE1pblNka1ZlcnNpb25Gcm9tU3RyaW5nKCJUaXJhbWlzdSIpLnZhbHVlKCk7CisgICAgaWYgKChJc0xpc3RPZih0eXBlLCBJc0ludGVyZmFjZSkgfHwgSXNBcnJheU9mKHR5cGUsIElzSW50ZXJmYWNlKSkgJiYKKyAgICAgICAgbGFuZyA9PSBPcHRpb25zOjpMYW5ndWFnZTo6SkFWQSAmJiBtaW5fc2RrX3ZlcnNpb24gPCB2YWxpZF92ZXJzaW9uKSB7CisgICAgICBjb25zdCBhdXRvIGtpbmQgPSBJc0xpc3RPZih0eXBlLCBJc0ludGVyZmFjZSkgPyAiTGlzdCIgOiAiQXJyYXkiOworICAgICAgQUlETF9FUlJPUih0eXBlKSA8PCBraW5kIDw8ICIgb2YgaW50ZXJmYWNlcyBpcyBhdmFpbGFibGUgc2luY2UgU0RLID0gIiA8PCB2YWxpZF92ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgaW4gSmF2YS4gQ3VycmVudCBtaW5fc2RrX3ZlcnNpb24gaXMgIiA8PCBtaW5fc2RrX3ZlcnNpb24gPDwgIi4iOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSk7CisKKyAgdi5DaGVjayhbJl0oY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHR5cGUpIHsKKyAgICBjb25zdCBhdXRvIHZhbGlkX3ZlcnNpb24gPSBNaW5TZGtWZXJzaW9uRnJvbVN0cmluZygiUyIpLnZhbHVlKCk7CisgICAgaWYgKHR5cGUuR2V0TmFtZSgpID09ICJQYXJjZWxhYmxlSG9sZGVyIiAmJiBtaW5fc2RrX3ZlcnNpb24gPCB2YWxpZF92ZXJzaW9uKSB7CisgICAgICBBSURMX0VSUk9SKHR5cGUpIDw8ICIgUGFyY2VsYWJsZUhvbGRlciBpcyBhdmFpbGFibGUgc2luY2UgU0RLID0gIiA8PCB2YWxpZF92ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIuIEN1cnJlbnQgbWluX3Nka192ZXJzaW9uIGlzICIgPDwgbWluX3Nka192ZXJzaW9uIDw8ICIuIjsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0pOworCisgIFZpc2l0VG9wRG93bih2LCBkb2MpOworICByZXR1cm4gdi5zdWNjZXNzOworfQorCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2NoZWNrX3ZhbGlkLmggYi9jaGVja192YWxpZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmZGQyMjAKLS0tIC9kZXYvbnVsbAorKysgYi9jaGVja192YWxpZC5oCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFpZGxfbGFuZ3VhZ2UuaCIKKyNpbmNsdWRlICJvcHRpb25zLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKKworYm9vbCBDaGVja1ZhbGlkKGNvbnN0IEFpZGxEb2N1bWVudCYgZG9jLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKKworfQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb21tZW50cy5jcHAgYi9jb21tZW50cy5jcHAKaW5kZXggYWZiZGM4Zi4uOGZlZWUyOCAxMDA2NDQKLS0tIGEvY29tbWVudHMuY3BwCisrKyBiL2NvbW1lbnRzLmNwcApAQCAtNDAsNiArNDAsNyBAQAogCiBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmdfdmlldyBrTGluZUNvbW1lbnRCZWdpbiA9ICIvLyI7CiBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmdfdmlldyBrQmxvY2tDb21tZW50QmVnaW4gPSAiLyoiOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nX3ZpZXcga0Jsb2NrQ29tbWVudE1pZCA9ICIgKiI7CiBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmdfdmlldyBrQmxvY2tDb21tZW50RW5kID0gIiovIjsKIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZ192aWV3IGtEb2NDb21tZW50QmVnaW4gPSAiLyoqIjsKIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVGFnRGVwcmVjYXRlZCA9ICJAZGVwcmVjYXRlZCI7CkBAIC0yMjIsMTUgKzIyMywzMSBAQAogICBzdGQ6OnN0cmluZ3N0cmVhbSBvdXQ7CiAgIGZvciAoYXV0byBpdCA9IGJlZ2luKGNvbW1lbnRzKTsgaXQgIT0gZW5kKGNvbW1lbnRzKTsgaXQrKykgewogICAgIGNvbnN0IGJvb2wgbGFzdCA9IG5leHQoaXQpID09IGVuZChjb21tZW50cyk7Ci0gICAgLy8gV2Ugb25seSByZS1mb3JtYXQgdGhlIGxhc3QvYmxvY2sgY29tbWVudCB3aGljaCBpcyBub3QgYWxyZWFkeSBhIGRvYy1zdHlsZSBjb21tZW50LgotICAgIGlmIChsYXN0ICYmIGl0LT50eXBlID09IENvbW1lbnQ6OlR5cGU6OkJMT0NLICYmICFTdGFydHNXaXRoKGl0LT5ib2R5LCBrRG9jQ29tbWVudEJlZ2luKSkgewotICAgICAgb3V0IDw8IGtEb2NDb21tZW50QmVnaW4gPDwgQ29uc3VtZVByZWZpeChpdC0+Ym9keSwga0Jsb2NrQ29tbWVudEJlZ2luKTsKKyAgICBhdXRvIGxpbmVzID0gVHJpbW1lZExpbmVzKCppdCk7CisKKyAgICBpZiAoaXQtPnR5cGUgPT0gQ29tbWVudDo6VHlwZTo6TElORSkgeworICAgICAgZm9yIChjb25zdCBhdXRvJiBsaW5lIDogbGluZXMpIHsKKyAgICAgICAgb3V0IDw8IGtMaW5lQ29tbWVudEJlZ2luIDw8IGxpbmU7CisgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCBpdC0+Ym9keTsKKyAgICAgIGlmIChsYXN0IHx8IFN0YXJ0c1dpdGgoaXQtPmJvZHksIGtEb2NDb21tZW50QmVnaW4pKSB7CisgICAgICAgIG91dCA8PCBrRG9jQ29tbWVudEJlZ2luOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8IGtCbG9ja0NvbW1lbnRCZWdpbjsKKyAgICAgIH0KKyAgICAgIGJvb2wgbXVsdGlsaW5lID0gbGluZXMuc2l6ZSgpID4gMTsKKworICAgICAgaWYgKG11bHRpbGluZSkgb3V0IDw8ICJcbiI7CisgICAgICBmb3IgKGNvbnN0IGF1dG8mIGxpbmUgOiBsaW5lcykgeworICAgICAgICBpZiAobXVsdGlsaW5lKSBvdXQgPDwga0Jsb2NrQ29tbWVudE1pZDsKKyAgICAgICAgb3V0IDw8ICIgIiA8PCBsaW5lOworICAgICAgICBpZiAobXVsdGlsaW5lKSBvdXQgPDwgIlxuIjsKKyAgICAgIH0KKyAgICAgIG91dCA8PCAiICIgPDwga0Jsb2NrQ29tbWVudEVuZCA8PCAiXG4iOwogICAgIH0KICAgfQogICByZXR1cm4gb3V0LnN0cigpOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZGlhZ25vc3RpY3MuY3BwIGIvZGlhZ25vc3RpY3MuY3BwCmluZGV4IDY5NGU5NmEuLjBlY2E4YWUgMTAwNjQ0Ci0tLSBhL2RpYWdub3N0aWNzLmNwcAorKysgYi9kaWFnbm9zdGljcy5jcHAKQEAgLTU1LDYgKzU1LDkgQEAKICAgRGlhZ25vc3RpY3NDb250ZXh0KERpYWdub3N0aWNNYXBwaW5nIG1hcHBpbmcpIDogbWFwcGluZ18oe3N0ZDo6bW92ZShtYXBwaW5nKX0pIHt9CiAgIEFpZGxFcnJvckxvZyBSZXBvcnQoY29uc3QgQWlkbExvY2F0aW9uJiBsb2MsIERpYWdub3N0aWNJRCBpZCwKICAgICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljU2V2ZXJpdHkgZm9yY2Vfc2V2ZXJpdHkgPSBEaWFnbm9zdGljU2V2ZXJpdHk6OkRJU0FCTEVEKSB7CisgICAgaWYgKGxvYy5Jc0ludGVybmFsKCkpIHsKKyAgICAgIHJldHVybiBBaWRsRXJyb3JMb2coQWlkbEVycm9yTG9nOjpOT19PUCwgbG9jKTsKKyAgICB9CiAgICAgY29uc3Qgc3RkOjpzdHJpbmcgc3VmZml4ID0gIiBbLVciICsgdG9fc3RyaW5nKGlkKSArICJdIjsKICAgICBhdXRvIHNldmVyaXR5ID0gc3RkOjptYXgoZm9yY2Vfc2V2ZXJpdHksIG1hcHBpbmdfLnRvcCgpLlNldmVyaXR5KGlkKSk7CiAgICAgc3dpdGNoIChzZXZlcml0eSkgewpAQCAtMTk1LDYgKzE5OCw3IEBACiAgICAgYm9vbCBoYXNfdHdvd2F5ID0gZmFsc2U7CiAgICAgZm9yIChjb25zdCBhdXRvJiBtIDogaS5HZXRNZXRob2RzKCkpIHsKICAgICAgIGlmICghbS0+SXNVc2VyRGVmaW5lZCgpKSBjb250aW51ZTsKKyAgICAgIGlmIChTdXBwcmVzc2VkKCptKSkgY29udGludWU7CiAgICAgICBpZiAobS0+SXNPbmV3YXkoKSkgewogICAgICAgICBoYXNfb25ld2F5ID0gdHJ1ZTsKICAgICAgIH0gZWxzZSB7CkBAIC0yMDgsNiArMjEyLDE0IEBACiAgICAgICAgICAgICAgIm9mIGNsaWVudCBjb2RlLiI7CiAgICAgfQogICB9CisgIGJvb2wgU3VwcHJlc3NlZChjb25zdCBBaWRsTWV0aG9kJiBtKSBjb25zdCB7CisgICAgZm9yIChjb25zdCBhdXRvJiB3IDogbS5HZXRUeXBlKCkuU3VwcHJlc3NXYXJuaW5ncygpKSB7CisgICAgICBpZiAodyA9PSB0b19zdHJpbmcoRGlhZ25vc3RpY0lEOjptaXhlZF9vbmV3YXkpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KIH07CiAKIHN0cnVjdCBEaWFnbm9zZU91dEFycmF5IDogRGlhZ25vc3RpY3NWaXNpdG9yIHsKQEAgLTI0OCw2ICsyNjAsODMgQEAKICAgfQogfTsKIAorc3RydWN0IERpYWdub3NlSW1wb3J0cyA6IERpYWdub3N0aWNzVmlzaXRvciB7CisgIERpYWdub3NlSW1wb3J0cyhEaWFnbm9zdGljc0NvbnRleHQmIGRpYWcpIDogRGlhZ25vc3RpY3NWaXNpdG9yKGRpYWcpIHt9CisgIHZvaWQgVmlzaXQoY29uc3QgQWlkbERvY3VtZW50JiBkb2MpIG92ZXJyaWRlIHsKKyAgICBhdXRvIGNvbGxpZGVfd2l0aF9kZWNscyA9IFsmXShjb25zdCBhdXRvJiBpbXBvcnQpIHsKKyAgICAgIGZvciAoY29uc3QgYXV0byYgdHlwZSA6IGRvYy5EZWZpbmVkVHlwZXMoKSkgeworICAgICAgICBpZiAodHlwZS0+R2V0Q2Fub25pY2FsTmFtZSgpICE9IGltcG9ydCAmJiB0eXBlLT5HZXROYW1lKCkgPT0gU2ltcGxlTmFtZShpbXBvcnQpKSB7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9OworCisgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IGltcG9ydGVkX25hbWVzOworICAgIGZvciAoY29uc3QgYXV0byYgaW1wb3J0IDogZG9jLkltcG9ydHMoKSkgeworICAgICAgaWYgKGNvbGxpZGVfd2l0aF9kZWNscyhpbXBvcnQpKSB7CisgICAgICAgIGRpYWcuUmVwb3J0KGRvYy5HZXRMb2NhdGlvbigpLCBEaWFnbm9zdGljSUQ6OnVuaXF1ZV9pbXBvcnQpCisgICAgICAgICAgICA8PCBTaW1wbGVOYW1lKGltcG9ydCkgPDwgIiBpcyBhbHJlYWR5IGRlZmluZWQgaW4gdGhpcyBmaWxlLiI7CisgICAgICB9CisgICAgICBhdXRvIFtfLCBpbnNlcnRlZF0gPSBpbXBvcnRlZF9uYW1lcy5pbnNlcnQoU2ltcGxlTmFtZShpbXBvcnQpKTsKKyAgICAgIGlmICghaW5zZXJ0ZWQpIHsKKyAgICAgICAgZGlhZy5SZXBvcnQoZG9jLkdldExvY2F0aW9uKCksIERpYWdub3N0aWNJRDo6dW5pcXVlX2ltcG9ydCkKKyAgICAgICAgICAgIDw8IFNpbXBsZU5hbWUoaW1wb3J0KSA8PCAiIGlzIGFscmVhZHkgaW1wb3J0ZWQuIjsKKyAgICAgIH0KKyAgICB9CisgIH0KK307CisKK3N0cnVjdCBEaWFnbm9zZVVudHlwZWRDb2xsZWN0aW9uIDogRGlhZ25vc3RpY3NWaXNpdG9yIHsKKyAgRGlhZ25vc2VVbnR5cGVkQ29sbGVjdGlvbihEaWFnbm9zdGljc0NvbnRleHQmIGRpYWcpIDogRGlhZ25vc3RpY3NWaXNpdG9yKGRpYWcpIHt9CisgIHZvaWQgVmlzaXQoY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHQpIG92ZXJyaWRlIHsKKyAgICBpZiAodC5HZXROYW1lKCkgPT0gIkxpc3QiIHx8IHQuR2V0TmFtZSgpID09ICJNYXAiKSB7CisgICAgICBpZiAoIXQuSXNHZW5lcmljKCkpIHsKKyAgICAgICAgZGlhZy5SZXBvcnQodC5HZXRMb2NhdGlvbigpLCBEaWFnbm9zdGljSUQ6OnVudHlwZWRfY29sbGVjdGlvbikKKyAgICAgICAgICAgIDw8ICJVc2UgTGlzdDxWPiBvciBNYXA8SyxWPiBpbnN0ZWFkLiI7CisgICAgICB9CisgICAgfQorICB9Cit9OworCitzdHJ1Y3QgRGlhZ25vc2VQZXJtaXNzaW9uQW5ub3RhdGlvbnMgOiBEaWFnbm9zdGljc1Zpc2l0b3IgeworICBEaWFnbm9zZVBlcm1pc3Npb25Bbm5vdGF0aW9ucyhEaWFnbm9zdGljc0NvbnRleHQmIGRpYWcpIDogRGlhZ25vc3RpY3NWaXNpdG9yKGRpYWcpIHt9CisgIHZvaWQgVmlzaXQoY29uc3QgQWlkbEludGVyZmFjZSYgaW50Zikgb3ZlcnJpZGUgeworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGRpYWdfbWVzc2FnZSA9CisgICAgICAgICIgaXMgbm90IGFubm90YXRlZCBmb3IgcGVybWlzc2lvbnMuIERlY2xhcmUgd2hpY2ggcGVybWlzc2lvbnMgYXJlICIKKyAgICAgICAgInJlcXVpcmVkIHVzaW5nIEBFbmZvcmNlUGVybWlzc2lvbi4gSWYgcGVybWlzc2lvbnMgYXJlIG1hbnVhbGx5ICIKKyAgICAgICAgInZlcmlmaWVkIHdpdGhpbiB0aGUgaW1wbGVtZW50YXRpb24sIHVzZSBAUGVybWlzc2lvbk1hbnVhbGx5RW5mb3JjZWQuICIKKyAgICAgICAgIklmIG5vIHBlcm1pc3Npb25zIGFyZSByZXF1aXJlZCwgdXNlIEBSZXF1aXJlc05vUGVybWlzc2lvbi4iOworICAgIGlmIChpbnRmLkVuZm9yY2VFeHByZXNzaW9uKCkgfHwgaW50Zi5Jc1Blcm1pc3Npb25NYW51YWwoKSB8fCBpbnRmLklzUGVybWlzc2lvbk5vbmUoKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjb25zdCBhdXRvJiBtZXRob2RzID0gaW50Zi5HZXRNZXRob2RzKCk7CisgICAgc3RkOjp2ZWN0b3I8c2l6ZV90PiBtZXRob2RzX3dpdGhvdXRfYW5ub3RhdGlvbnM7CisgICAgc2l6ZV90IG51bV91c2VyX2RlZmluZWRfbWV0aG9kcyA9IDA7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtZXRob2RzLnNpemUoKTsgKytpKSB7CisgICAgICBhdXRvJiBtID0gbWV0aG9kc1tpXTsKKyAgICAgIGlmICghbS0+SXNVc2VyRGVmaW5lZCgpKSBjb250aW51ZTsKKyAgICAgIG51bV91c2VyX2RlZmluZWRfbWV0aG9kcysrOworICAgICAgaWYgKG0tPkdldFR5cGUoKS5FbmZvcmNlRXhwcmVzc2lvbigpIHx8IG0tPkdldFR5cGUoKS5Jc1Blcm1pc3Npb25NYW51YWwoKSB8fAorICAgICAgICAgIG0tPkdldFR5cGUoKS5Jc1Blcm1pc3Npb25Ob25lKCkpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBtZXRob2RzX3dpdGhvdXRfYW5ub3RhdGlvbnMucHVzaF9iYWNrKGkpOworICAgIH0KKyAgICBpZiAobWV0aG9kc193aXRob3V0X2Fubm90YXRpb25zLnNpemUoKSA9PSBudW1fdXNlcl9kZWZpbmVkX21ldGhvZHMpIHsKKyAgICAgIGRpYWcuUmVwb3J0KGludGYuR2V0TG9jYXRpb24oKSwgRGlhZ25vc3RpY0lEOjptaXNzaW5nX3Blcm1pc3Npb25fYW5ub3RhdGlvbikKKyAgICAgICAgICA8PCBpbnRmLkdldE5hbWUoKSA8PCBkaWFnX21lc3NhZ2UKKyAgICAgICAgICA8PCAiIFRoaXMgY2FuIGJlIGRvbmUgZm9yIHRoZSB3aG9sZSBpbnRlcmZhY2Ugb3IgZm9yIGVhY2ggbWV0aG9kLiI7CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAoc2l6ZV90IGkgOiBtZXRob2RzX3dpdGhvdXRfYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgYXV0byYgbSA9IG1ldGhvZHNbaV07CisgICAgICAgIGRpYWcuUmVwb3J0KG0tPkdldExvY2F0aW9uKCksIERpYWdub3N0aWNJRDo6bWlzc2luZ19wZXJtaXNzaW9uX2Fubm90YXRpb24pCisgICAgICAgICAgICA8PCBtLT5HZXROYW1lKCkgPDwgZGlhZ19tZXNzYWdlOworICAgICAgfQorICAgIH0KKyAgfQorfTsKKwogYm9vbCBEaWFnbm9zZShjb25zdCBBaWRsRG9jdW1lbnQmIGRvYywgY29uc3QgRGlhZ25vc3RpY01hcHBpbmcmIG1hcHBpbmcpIHsKICAgRGlhZ25vc3RpY3NDb250ZXh0IGRpYWcobWFwcGluZyk7CiAKQEAgLTI1OSw2ICszNDgsOSBAQAogICBEaWFnbm9zZU91dEFycmF5e2RpYWd9LkNoZWNrKGRvYyk7CiAgIERpYWdub3NlRmlsZURlc2NyaXB0b3J7ZGlhZ30uQ2hlY2soZG9jKTsKICAgRGlhZ25vc2VPdXROdWxsYWJsZXtkaWFnfS5DaGVjayhkb2MpOworICBEaWFnbm9zZUltcG9ydHN7ZGlhZ30uQ2hlY2soZG9jKTsKKyAgRGlhZ25vc2VVbnR5cGVkQ29sbGVjdGlvbntkaWFnfS5DaGVjayhkb2MpOworICBEaWFnbm9zZVBlcm1pc3Npb25Bbm5vdGF0aW9uc3tkaWFnfS5DaGVjayhkb2MpOwogCiAgIHJldHVybiBkaWFnLkVycm9yQ291bnQoKSA9PSAwOwogfQpkaWZmIC0tZ2l0IGEvZGlhZ25vc3RpY3MuaW5jIGIvZGlhZ25vc3RpY3MuaW5jCmluZGV4IDU5ZWE3YzguLjZhMDU3MGEgMTAwNjQ0Ci0tLSBhL2RpYWdub3N0aWNzLmluYworKysgYi9kaWFnbm9zdGljcy5pbmMKQEAgLTQsNyArNCwxMCBAQAogRElBRyhmaWxlX2Rlc2NyaXB0b3IsICJmaWxlLWRlc2NyaXB0b3IiLCBmYWxzZSkKIERJQUcoaW5vdXRfcGFyYW1ldGVyLCAiaW5vdXQtcGFyYW1ldGVyIiwgZmFsc2UpCiBESUFHKGludGVyZmFjZV9uYW1lLCAiaW50ZXJmYWNlLW5hbWUiLCBmYWxzZSkKK0RJQUcobWlzc2luZ19wZXJtaXNzaW9uX2Fubm90YXRpb24sICJtaXNzaW5nLXBlcm1pc3Npb24tYW5ub3RhdGlvbiIsIGZhbHNlKQogRElBRyhtaXhlZF9vbmV3YXksICJtaXhlZC1vbmV3YXkiLCBmYWxzZSkKIERJQUcob3V0X2FycmF5LCAib3V0LWFycmF5IiwgZmFsc2UpCiBESUFHKG91dF9udWxsYWJsZSwgIm91dC1udWxsYWJsZSIsIGZhbHNlKQorRElBRyh1bmlxdWVfaW1wb3J0LCAidW5pcXVlLWltcG9ydCIsIGZhbHNlKQogRElBRyh1bmtub3duX3dhcm5pbmcsICJ1bmtub3duLXdhcm5pbmciLCBmYWxzZSkKK0RJQUcodW50eXBlZF9jb2xsZWN0aW9uLCAidW50eXBlZC1jb2xsZWN0aW9uIiwgZmFsc2UpCmRpZmYgLS1naXQgYS9kaWFnbm9zdGljc191bml0dGVzdC5jcHAgYi9kaWFnbm9zdGljc191bml0dGVzdC5jcHAKaW5kZXggMGVhMzE0MS4uM2E0NWQwOSAxMDA2NDQKLS0tIGEvZGlhZ25vc3RpY3NfdW5pdHRlc3QuY3BwCisrKyBiL2RpYWdub3N0aWNzX3VuaXR0ZXN0LmNwcApAQCAtMjQsNyArMjQsNiBAQAogI2luY2x1ZGUgInBhcnNlci5oIgogI2luY2x1ZGUgInRlc3RzL2Zha2VfaW9fZGVsZWdhdGUuaCIKIAotdXNpbmcgYW5kcm9pZDo6YWlkbDo6QWlkbEVycm9yOwogdXNpbmcgYW5kcm9pZDo6YWlkbDo6QWlkbFR5cGVuYW1lczsKIHVzaW5nIGFuZHJvaWQ6OmFpZGw6OkRpYWdub3N0aWNJRDsKIHVzaW5nIGFuZHJvaWQ6OmFpZGw6Ok9wdGlvbnM7CkBAIC00MCw1NiArMzksNjMgQEAKICAgICBmb3IgKGNvbnN0IGF1dG8mIFtmaWxlLCBjb250ZW50c10gOiBmaWxlcykgewogICAgICAgaW8uU2V0RmlsZUNvbnRlbnRzKGZpbGUsIGNvbnRlbnRzKTsKICAgICB9CisgICAgaWYgKCFlbmFibGVfZGlhZ25vc3RpYykgeworICAgICAgQVNTRVJUX1RSVUUoZXhwZWN0X2RpYWdub3N0aWMpOworICAgICAgZW5hYmxlX2RpYWdub3N0aWMgPSBleHBlY3RfZGlhZ25vc3RpYzsKKyAgICB9CiAgICAgLy8gZW1pdCBkaWFnbm9zdGljcyBhcyB3YXJuaW5ncy4KICAgICAvLyAiamF2YSIgaGFzIG5vIHNwZWNpZmljIG1lYW5pbmcgaGVyZSBiZWNhdXNlIHdlJ3JlIHRlc3RpbmcgQ2hlY2tWYWxpZCgpCi0gICAgY29uc3QgT3B0aW9ucyBvcHRpb25zID0KLSAgICAgICAgT3B0aW9uczo6RnJvbSgiYWlkbCAiICsgb3B0aW9uYWxfYXJncyArICIgLUkgLiAtLWxhbmcgamF2YSAtbyBvdXQgLVdldmVyeXRoaW5nICIgKyBtYWluKTsKKyAgICBjb25zdCBPcHRpb25zIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsICIgKyBvcHRpb25hbF9hcmdzICsgIiAtSSAuIC0tbGFuZyBqYXZhIC1vIG91dCAtVyIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9fc3RyaW5nKCplbmFibGVfZGlhZ25vc3RpYykgKyAiICIgKyBtYWluKTsKICAgICBDYXB0dXJlU3RkZXJyKCk7CiAgICAgbG9hZF9hbmRfdmFsaWRhdGVfYWlkbChtYWluLCBvcHRpb25zLCBpbywgJnR5cGVuYW1lcywgbnVsbHB0cik7CiAgICAgY29uc3Qgc3RkOjpzdHJpbmcgZXJyID0gR2V0Q2FwdHVyZWRTdGRlcnIoKTsKLSAgICBpZiAoZXhwZWN0X2RpYWdub3N0aWNzLmVtcHR5KCkpIHsKLSAgICAgIEVYUEVDVF9FUSgiIiwgZXJyKTsKKyAgICBpZiAoZXhwZWN0X2RpYWdub3N0aWMpIHsKKyAgICAgIEVYUEVDVF9USEFUKGVyciwgdGVzdGluZzo6SGFzU3Vic3RyKCItVyIgKyB0b19zdHJpbmcoKmV4cGVjdF9kaWFnbm9zdGljKSkpOwogICAgIH0gZWxzZSB7Ci0gICAgICBmb3IgKGNvbnN0IGF1dG8gaWQgOiBleHBlY3RfZGlhZ25vc3RpY3MpIHsKLSAgICAgICAgRVhQRUNUX1RIQVQoZXJyLCB0ZXN0aW5nOjpIYXNTdWJzdHIoIi1XIiArIHRvX3N0cmluZyhpZCkpKTsKLSAgICAgIH0KKyAgICAgIEVYUEVDVF9FUSgiIiwgZXJyKTsKICAgICB9CiAgIH0KIAogICBBaWRsVHlwZW5hbWVzIHR5cGVuYW1lczsKICAgRmFrZUlvRGVsZWdhdGUgaW87CiAgIHN0ZDo6c3RyaW5nIG9wdGlvbmFsX2FyZ3M7Ci0gIHN0ZDo6dmVjdG9yPERpYWdub3N0aWNJRD4gZXhwZWN0X2RpYWdub3N0aWNzOworICAvLyBUaGUgdHlwZSBvZiBkaWFnbm9zdGljIHRvIGVuYWJsZSBmb3IgdGhlIHRlc3QuIElmIGV4cGVjdF9kaWFnbm9zdGljIGlzCisgIC8vIHNldCwgdXNlIHRoZSBzYW1lIHZhbHVlLgorICBzdGQ6Om9wdGlvbmFsPERpYWdub3N0aWNJRD4gZW5hYmxlX2RpYWdub3N0aWM7CisgIC8vIFRoZSBleHBlY3RlZCBkaWFnbm9zdGljLiBNdXN0IGJlIHNldC4KKyAgc3RkOjpvcHRpb25hbDxEaWFnbm9zdGljSUQ+IGV4cGVjdF9kaWFnbm9zdGljOwogfTsKIAogVEVTVF9GKERpYWdub3N0aWNzVGVzdCwgY29uc3RfbmFtZV9Gb3JFbnVtZXJhdG9yKSB7Ci0gIGV4cGVjdF9kaWFnbm9zdGljcyA9IHtEaWFnbm9zdGljSUQ6OmNvbnN0X25hbWV9OworICBleHBlY3RfZGlhZ25vc3RpYyA9IERpYWdub3N0aWNJRDo6Y29uc3RfbmFtZTsKICAgUGFyc2VGaWxlcyh7eyJGb28uYWlkbCIsICJlbnVtIEZvbyB7IGZvbyB9In19KTsKIH0KIAogVEVTVF9GKERpYWdub3N0aWNzVGVzdCwgY29uc3RfbmFtZV9Gb3JDb25zdGFudHMpIHsKLSAgZXhwZWN0X2RpYWdub3N0aWNzID0ge0RpYWdub3N0aWNJRDo6Y29uc3RfbmFtZX07CisgIGV4cGVjdF9kaWFnbm9zdGljID0gRGlhZ25vc3RpY0lEOjpjb25zdF9uYW1lOwogICBQYXJzZUZpbGVzKHt7IklGb28uYWlkbCIsICJpbnRlcmZhY2UgSUZvbyB7IGNvbnN0IGludCBmb28gPSAxOyB9In19KTsKIH0KIAogVEVTVF9GKERpYWdub3N0aWNzVGVzdCwgaW50ZXJmYWNlX25hbWUpIHsKLSAgZXhwZWN0X2RpYWdub3N0aWNzID0ge0RpYWdub3N0aWNJRDo6aW50ZXJmYWNlX25hbWV9OworICBleHBlY3RfZGlhZ25vc3RpYyA9IERpYWdub3N0aWNJRDo6aW50ZXJmYWNlX25hbWU7CiAgIFBhcnNlRmlsZXMoe3siRm9vLmFpZGwiLCAiaW50ZXJmYWNlIEZvbyB7IH0ifX0pOwogfQogCiBURVNUX0YoRGlhZ25vc3RpY3NUZXN0LCBlbnVtX2V4cGxpY2l0X2RlZmF1bHQpIHsKLSAgZXhwZWN0X2RpYWdub3N0aWNzID0ge0RpYWdub3N0aWNJRDo6ZW51bV9leHBsaWNpdF9kZWZhdWx0fTsKKyAgZXhwZWN0X2RpYWdub3N0aWMgPSBEaWFnbm9zdGljSUQ6OmVudW1fZXhwbGljaXRfZGVmYXVsdDsKICAgUGFyc2VGaWxlcyh7eyJGb28uYWlkbCIsICJwYXJjZWxhYmxlIEZvbyB7IEUgZTsgfSJ9LCB7IkUuYWlkbCIsICJlbnVtIEUgeyBBIH0ifX0pOwogfQogCiBURVNUX0YoRGlhZ25vc3RpY3NUZXN0LCBpbm91dF9wYXJhbWV0ZXIpIHsKLSAgZXhwZWN0X2RpYWdub3N0aWNzID0ge0RpYWdub3N0aWNJRDo6aW5vdXRfcGFyYW1ldGVyfTsKKyAgZXhwZWN0X2RpYWdub3N0aWMgPSBEaWFnbm9zdGljSUQ6Omlub3V0X3BhcmFtZXRlcjsKICAgUGFyc2VGaWxlcyh7eyJJRm9vLmFpZGwiLCAiaW50ZXJmYWNlIElGb28geyB2b2lkIGZvbyhpbm91dCBCYXIgYmFyKTsgfSJ9LAogICAgICAgICAgICAgICB7IkJhci5haWRsIiwgInBhcmNlbGFibGUgQmFyIHt9In19KTsKIH0KIAogVEVTVF9GKERpYWdub3N0aWNzVGVzdCwgaW5vdXRfcGFyYW1ldGVyX1N1cHByZXNzQXRNZXRob2RMZXZlbCkgewotICBleHBlY3RfZGlhZ25vc3RpY3MgPSB7fTsKKyAgZW5hYmxlX2RpYWdub3N0aWMgPSBEaWFnbm9zdGljSUQ6Omlub3V0X3BhcmFtZXRlcjsKKyAgZXhwZWN0X2RpYWdub3N0aWMgPSB7fTsKICAgUGFyc2VGaWxlcyh7CiAgICAgICB7IklGb28uYWlkbCIsCiAgICAgICAgImludGVyZmFjZSBJRm9vIHsgQFN1cHByZXNzV2FybmluZ3ModmFsdWU9e1wiaW5vdXQtcGFyYW1ldGVyXCJ9KSB2b2lkIGZvbyhpbm91dCBCYXIgYik7IH0ifSwKQEAgLTk4LDcgKzEwNCw4IEBACiB9CiAKIFRFU1RfRihEaWFnbm9zdGljc1Rlc3QsIGlub3V0X3BhcmFtZXRlcl9TdXBwcmVzc0F0RGVjbExldmVsKSB7Ci0gIGV4cGVjdF9kaWFnbm9zdGljcyA9IHt9OworICBlbmFibGVfZGlhZ25vc3RpYyA9IERpYWdub3N0aWNJRDo6aW5vdXRfcGFyYW1ldGVyOworICBleHBlY3RfZGlhZ25vc3RpYyA9IHt9OwogICBQYXJzZUZpbGVzKHsKICAgICAgIHsiSUZvby5haWRsIiwKICAgICAgICAiQFN1cHByZXNzV2FybmluZ3ModmFsdWU9e1wiaW5vdXQtcGFyYW1ldGVyXCJ9KSBpbnRlcmZhY2UgSUZvbyB7IHZvaWQgZm9vKGlub3V0IEJhciBiKTsgfSJ9LApAQCAtMTA3LDE0ICsxMTQsMTQgQEAKIH0KIAogVEVTVF9GKERpYWdub3N0aWNzVGVzdCwgVW5rbm93bldhcm5pbmcpIHsKLSAgZXhwZWN0X2RpYWdub3N0aWNzID0ge0RpYWdub3N0aWNJRDo6dW5rbm93bl93YXJuaW5nfTsKKyAgZXhwZWN0X2RpYWdub3N0aWMgPSBEaWFnbm9zdGljSUQ6OnVua25vd25fd2FybmluZzsKICAgUGFyc2VGaWxlcyh7CiAgICAgICB7IklGb28uYWlkbCIsICJAU3VwcHJlc3NXYXJuaW5ncyh2YWx1ZT17XCJibGFoYmxhaFwifSkgaW50ZXJmYWNlIElGb28geyB2b2lkIGZvbygpOyB9In0sCiAgIH0pOwogfQogCiBURVNUX0YoRGlhZ25vc3RpY3NUZXN0LCBDYW50U3VwcHJlc3NVbmtub3duV2FybmluZykgewotICBleHBlY3RfZGlhZ25vc3RpY3MgPSB7RGlhZ25vc3RpY0lEOjp1bmtub3duX3dhcm5pbmd9OworICBleHBlY3RfZGlhZ25vc3RpYyA9IERpYWdub3N0aWNJRDo6dW5rbm93bl93YXJuaW5nOwogICBQYXJzZUZpbGVzKHsKICAgICAgIHsiSUZvby5haWRsIiwKICAgICAgICAiQFN1cHByZXNzV2FybmluZ3ModmFsdWU9e1widW5rbm93bi13YXJuaW5nXCJ9KVxuIgpAQCAtMTIzLDI5ICsxMzAsNDIgQEAKIH0KIAogVEVTVF9GKERpYWdub3N0aWNzVGVzdCwgRG9udE1peE9uZXdheVdpdGhUd293YXlNZXRob2RzKSB7Ci0gIGV4cGVjdF9kaWFnbm9zdGljcyA9IHtEaWFnbm9zdGljSUQ6Om1peGVkX29uZXdheX07CisgIGV4cGVjdF9kaWFnbm9zdGljID0gRGlhZ25vc3RpY0lEOjptaXhlZF9vbmV3YXk7CiAgIFBhcnNlRmlsZXMoewogICAgICAgeyJJRm9vLmFpZGwiLCAiaW50ZXJmYWNlIElGb28geyB2b2lkIGZvbygpOyBvbmV3YXkgdm9pZCBiYXIoKTsgfSJ9LAogICB9KTsKIH0KIAorVEVTVF9GKERpYWdub3N0aWNzVGVzdCwgRG9udE1peE9uZXdheVdpdGhUd293YXlNZXRob2RzU3VwcHJlc3NlZEF0TWV0aG9kKSB7CisgIGVuYWJsZV9kaWFnbm9zdGljID0gRGlhZ25vc3RpY0lEOjptaXhlZF9vbmV3YXk7CisgIGV4cGVjdF9kaWFnbm9zdGljID0ge307CisgIFBhcnNlRmlsZXMoeworICAgICAgeyJJRm9vLmFpZGwiLAorICAgICAgICJpbnRlcmZhY2UgSUZvbyB7XG4iCisgICAgICAgIiAgdm9pZCBmb28oKTtcbiIKKyAgICAgICAiICBAU3VwcHJlc3NXYXJuaW5ncyh2YWx1ZT17XCJtaXhlZC1vbmV3YXlcIn0pIG9uZXdheSB2b2lkIGJhcigpO1xuIgorICAgICAgICJ9In0sCisgIH0pOworfQorCiBURVNUX0YoRGlhZ25vc3RpY3NUZXN0LCBPbmV3YXlJbnRlcmZhY2VJc09rYXlXaXRoU3ludGhldGljTWV0aG9kcykgewogICBvcHRpb25hbF9hcmdzID0gIi0tdmVyc2lvbiAyIjsgIC8vIHdpbGwgYWRkIGdldEludGVyZmFjZVZlcnNpb24oKSBzeW50aGV0aWMgbWV0aG9kCi0gIGV4cGVjdF9kaWFnbm9zdGljcyA9IHt9OworICBlbmFibGVfZGlhZ25vc3RpYyA9IERpYWdub3N0aWNJRDo6bWl4ZWRfb25ld2F5OworICBleHBlY3RfZGlhZ25vc3RpYyA9IHt9OwogICBQYXJzZUZpbGVzKHsKICAgICAgIHsiSUZvby5haWRsIiwgIm9uZXdheSBpbnRlcmZhY2UgSUZvbyB7IHZvaWQgZm9vKCk7IH0ifSwKICAgfSk7CiB9CiAKIFRFU1RfRihEaWFnbm9zdGljc1Rlc3QsIEFycmF5c0FzT3V0cHV0UGFyYW1ldGVyc0NvbnNpZGVyZWRIYXJtZnVsKSB7Ci0gIGV4cGVjdF9kaWFnbm9zdGljcyA9IHtEaWFnbm9zdGljSUQ6Om91dF9hcnJheX07CisgIGV4cGVjdF9kaWFnbm9zdGljID0gRGlhZ25vc3RpY0lEOjpvdXRfYXJyYXk7CiAgIFBhcnNlRmlsZXMoewogICAgICAgeyJJRm9vLmFpZGwiLCAiaW50ZXJmYWNlIElGb28geyB2b2lkIGZvbyhvdXQgU3RyaW5nW10gcmV0KTsgfSJ9LAogICB9KTsKIH0KIAogVEVTVF9GKERpYWdub3N0aWNzVGVzdCwgZmlsZV9kZXNjcmlwdG9yKSB7Ci0gIGV4cGVjdF9kaWFnbm9zdGljcyA9IHtEaWFnbm9zdGljSUQ6OmZpbGVfZGVzY3JpcHRvcn07CisgIGV4cGVjdF9kaWFnbm9zdGljID0gRGlhZ25vc3RpY0lEOjpmaWxlX2Rlc2NyaXB0b3I7CiAgIFBhcnNlRmlsZXMoe3siSUZvby5haWRsIiwKICAgICAgICAgICAgICAgICJpbnRlcmZhY2UgSUZvbyB7XG4iCiAgICAgICAgICAgICAgICAiICB2b2lkIGZvbyhpbiBGaWxlRGVzY3JpcHRvciBmZCk7XG4iCkBAIC0xNTMsNyArMTczLDcgQEAKIH0KIAogVEVTVF9GKERpYWdub3N0aWNzVGVzdCwgb3V0X251bGxhYmxlKSB7Ci0gIGV4cGVjdF9kaWFnbm9zdGljcyA9IHtEaWFnbm9zdGljSUQ6Om91dF9udWxsYWJsZX07CisgIGV4cGVjdF9kaWFnbm9zdGljID0gRGlhZ25vc3RpY0lEOjpvdXRfbnVsbGFibGU7CiAgIFBhcnNlRmlsZXMoe3siSUZvby5haWRsIiwKICAgICAgICAgICAgICAgICJpbnRlcmZhY2UgSUZvbyB7XG4iCiAgICAgICAgICAgICAgICAiICB2b2lkIGZvbyhvdXQgQG51bGxhYmxlIEJhciBiYXIpO1xuIgpAQCAtMTYyLDcgKzE4Miw3IEBACiB9CiAKIFRFU1RfRihEaWFnbm9zdGljc1Rlc3QsIGlub3V0X251bGxhYmxlKSB7Ci0gIGV4cGVjdF9kaWFnbm9zdGljcyA9IHtEaWFnbm9zdGljSUQ6Om91dF9udWxsYWJsZX07CisgIGV4cGVjdF9kaWFnbm9zdGljID0gRGlhZ25vc3RpY0lEOjpvdXRfbnVsbGFibGU7CiAgIFBhcnNlRmlsZXMoe3siSUZvby5haWRsIiwKICAgICAgICAgICAgICAgICJpbnRlcmZhY2UgSUZvbyB7XG4iCiAgICAgICAgICAgICAgICAiICB2b2lkIGZvbyhpbm91dCBAbnVsbGFibGUgQmFyIGJhcik7XG4iCkBAIC0xNzEsMTAgKzE5MSw5MyBAQAogfQogCiBURVNUX0YoRGlhZ25vc3RpY3NUZXN0LCBvdXRfbnVsbGFibGVfT2theUZvckFycmF5cykgewotICBleHBlY3RfZGlhZ25vc3RpY3MgPSB7RGlhZ25vc3RpY0lEOjpvdXRfYXJyYXl9OyAgLy8gbm90IHRyaWdnZXJpbmcgb3V0X251bGxhYmxlCisgIGV4cGVjdF9kaWFnbm9zdGljID0gRGlhZ25vc3RpY0lEOjpvdXRfYXJyYXk7ICAvLyBub3QgdHJpZ2dlcmluZyBvdXRfbnVsbGFibGUKICAgUGFyc2VGaWxlcyh7eyJJRm9vLmFpZGwiLAogICAgICAgICAgICAgICAgImludGVyZmFjZSBJRm9vIHtcbiIKICAgICAgICAgICAgICAgICIgIHZvaWQgZm9vKGlub3V0IEBudWxsYWJsZSBCYXJbXSBiYXIxLCBvdXQgQG51bGxhYmxlIEJhcltdIGJhcjIpO1xuIgogICAgICAgICAgICAgICAgIn0ifSwKICAgICAgICAgICAgICAgeyJCYXIuYWlkbCIsICJwYXJjZWxhYmxlIEJhciB7fSJ9fSk7CiB9CisKK1RFU1RfRihEaWFnbm9zdGljc1Rlc3QsIFJlamVjdEltcG9ydHNDb2xsaXNpb25XaXRoVG9wTGV2ZWxEZWNsKSB7CisgIGV4cGVjdF9kaWFnbm9zdGljID0gRGlhZ25vc3RpY0lEOjp1bmlxdWVfaW1wb3J0OworICBQYXJzZUZpbGVzKHt7InAvSUZvby5haWRsIiwKKyAgICAgICAgICAgICAgICJwYWNrYWdlIHA7XG4iCisgICAgICAgICAgICAgICAiaW1wb3J0IHEuSUZvbztcbiIgIC8vIHNob3VsZCBjb2xsaWRlIHdpdGggcHJldmlvdXMgaW1wb3J0CisgICAgICAgICAgICAgICAiaW50ZXJmYWNlIElGb297fSJ9LAorICAgICAgICAgICAgICB7InEvSUZvby5haWRsIiwgInBhY2thZ2UgcTsgaW50ZXJmYWNlIElGb297fSJ9fSk7Cit9CisKK1RFU1RfRihEaWFnbm9zdGljc1Rlc3QsIFJlamVjdEltcG9ydHNDb2xsaXNpb24pIHsKKyAgZXhwZWN0X2RpYWdub3N0aWMgPSBEaWFnbm9zdGljSUQ6OnVuaXF1ZV9pbXBvcnQ7CisgIFBhcnNlRmlsZXMoe3sicC9JRm9vLmFpZGwiLAorICAgICAgICAgICAgICAgInBhY2thZ2UgcDtcbiIKKyAgICAgICAgICAgICAgICJpbXBvcnQgcS5JQmFyO1xuIgorICAgICAgICAgICAgICAgImltcG9ydCByLklCYXI7XG4iICAvLyBzaG91bGQgY29sbGlkZSB3aXRoIHByZXZpb3VzIGltcG9ydAorICAgICAgICAgICAgICAgImludGVyZmFjZSBJRm9ve30ifSwKKyAgICAgICAgICAgICAgeyJxL0lCYXIuYWlkbCIsICJwYWNrYWdlIHE7IGludGVyZmFjZSBJQmFye30ifSwKKyAgICAgICAgICAgICAgeyJyL0lCYXIuYWlkbCIsICJwYWNrYWdlIHI7IGludGVyZmFjZSBJQmFye30ifX0pOworfQorCitURVNUX0YoRGlhZ25vc3RpY3NUZXN0LCBBbGxvd0ltcG9ydGluZ1NlbGYpIHsKKyAgZW5hYmxlX2RpYWdub3N0aWMgPSBEaWFnbm9zdGljSUQ6OnVuaXF1ZV9pbXBvcnQ7CisgIGV4cGVjdF9kaWFnbm9zdGljID0ge307CisgIFBhcnNlRmlsZXMoe3sicC9JRm9vLmFpZGwiLAorICAgICAgICAgICAgICAgInBhY2thZ2UgcDtcbiIKKyAgICAgICAgICAgICAgICJpbXBvcnQgcC5JRm9vO1xuIgorICAgICAgICAgICAgICAgImludGVyZmFjZSBJRm9ve30ifX0pOworfQorCitURVNUX0YoRGlhZ25vc3RpY3NUZXN0LCBSZWR1bmRhbnRJbXBvcnRzKSB7CisgIGV4cGVjdF9kaWFnbm9zdGljID0gRGlhZ25vc3RpY0lEOjp1bmlxdWVfaW1wb3J0OworICBQYXJzZUZpbGVzKHt7InAvSUZvby5haWRsIiwKKyAgICAgICAgICAgICAgICJwYWNrYWdlIHA7XG4iCisgICAgICAgICAgICAgICAiaW1wb3J0IHEuSUJhcjtcbiIKKyAgICAgICAgICAgICAgICJpbXBvcnQgcS5JQmFyO1xuIgorICAgICAgICAgICAgICAgImludGVyZmFjZSBJRm9ve30ifSwKKyAgICAgICAgICAgICAgeyJxL0lCYXIuYWlkbCIsICJwYWNrYWdlIHE7IGludGVyZmFjZSBJQmFye30ifX0pOworfQorCitURVNUX0YoRGlhZ25vc3RpY3NUZXN0LCBVbnR5cGVkQ29sbGVjdGlvbkludGVyZmFjZSkgeworICBleHBlY3RfZGlhZ25vc3RpYyA9IERpYWdub3N0aWNJRDo6dW50eXBlZF9jb2xsZWN0aW9uOworICBQYXJzZUZpbGVzKHt7IklGb28uYWlkbCIsICJpbnRlcmZhY2UgSUZvbyB7IHZvaWQgZm9vKGluIE1hcCBtKTsgfSJ9fSk7Cit9CisKK1RFU1RfRihEaWFnbm9zdGljc1Rlc3QsIFVudHlwZWRDb2xsZWN0aW9uUGFyY2VsYWJsZSkgeworICBleHBlY3RfZGlhZ25vc3RpYyA9IERpYWdub3N0aWNJRDo6dW50eXBlZF9jb2xsZWN0aW9uOworICBQYXJzZUZpbGVzKHt7IkZvby5haWRsIiwgInBhcmNlbGFibGUgRm9vIHsgTWFwIG07IH0ifX0pOworfQorCitURVNUX0YoRGlhZ25vc3RpY3NUZXN0LCBVbnR5cGVkQ29sbGVjdGlvblVuaW9uKSB7CisgIGV4cGVjdF9kaWFnbm9zdGljID0gRGlhZ25vc3RpY0lEOjp1bnR5cGVkX2NvbGxlY3Rpb247CisgIFBhcnNlRmlsZXMoe3siRm9vLmFpZGwiLCAidW5pb24gRm9vIHsgTGlzdCBsOyB9In19KTsKK30KKworVEVTVF9GKERpYWdub3N0aWNzVGVzdCwgVW50eXBlZENvbGxlY3Rpb25JblR5cGVBcmcpIHsKKyAgZXhwZWN0X2RpYWdub3N0aWMgPSBEaWFnbm9zdGljSUQ6OnVudHlwZWRfY29sbGVjdGlvbjsKKyAgUGFyc2VGaWxlcyh7eyJJRm9vLmFpZGwiLCAiaW50ZXJmYWNlIElGb28geyB2b2lkIGZvbyhpbiBCYXI8TWFwPiBtKTsgfSJ9LAorICAgICAgICAgICAgICB7IkJhci5haWRsIiwgInBhcmNlbGFibGUgQmFyPFQ+IHt9In19KTsKK30KKworVEVTVF9GKERpYWdub3N0aWNzVGVzdCwgUGVybWlzc2lvbk1pc3NpbmcpIHsKKyAgZXhwZWN0X2RpYWdub3N0aWMgPSBEaWFnbm9zdGljSUQ6Om1pc3NpbmdfcGVybWlzc2lvbl9hbm5vdGF0aW9uOworICBQYXJzZUZpbGVzKHt7IklGb28uYWlkbCIsICJpbnRlcmZhY2UgSUZvbyB7IHZvaWQgZm9vZCgpOyB9In19KTsKK30KKworVEVTVF9GKERpYWdub3N0aWNzVGVzdCwgUGVybWlzc2lvbk1ldGhvZCkgeworICBlbmFibGVfZGlhZ25vc3RpYyA9IERpYWdub3N0aWNJRDo6bWlzc2luZ19wZXJtaXNzaW9uX2Fubm90YXRpb247CisgIGV4cGVjdF9kaWFnbm9zdGljID0ge307CisgIFBhcnNlRmlsZXMoe3siSUZvby5haWRsIiwgImludGVyZmFjZSBJRm9vIHsgQEVuZm9yY2VQZXJtaXNzaW9uKFwiSU5URVJORVRcIikgdm9pZCBmb29kKCk7IH0ifX0pOworfQorCitURVNUX0YoRGlhZ25vc3RpY3NUZXN0LCBQZXJtaXNzaW9uTWV0aG9kTWlzc2luZykgeworICBleHBlY3RfZGlhZ25vc3RpYyA9IERpYWdub3N0aWNJRDo6bWlzc2luZ19wZXJtaXNzaW9uX2Fubm90YXRpb247CisgIFBhcnNlRmlsZXMoe3siSUZvby5haWRsIiwKKyAgICAgICAgICAgICAgICJpbnRlcmZhY2UgSUZvbyB7IEBFbmZvcmNlUGVybWlzc2lvbihcIklOVEVSTkVUXCIpIHZvaWQgZm9vZCgpOyB2b2lkIGZvbzIoKTsgfSJ9fSk7Cit9CisKK1RFU1RfRihEaWFnbm9zdGljc1Rlc3QsIFBlcm1pc3Npb25JbnRlcmZhY2UpIHsKKyAgZW5hYmxlX2RpYWdub3N0aWMgPSBEaWFnbm9zdGljSUQ6Om1pc3NpbmdfcGVybWlzc2lvbl9hbm5vdGF0aW9uOworICBleHBlY3RfZGlhZ25vc3RpYyA9IHt9OworICBQYXJzZUZpbGVzKHt7IklGb28uYWlkbCIsICJARW5mb3JjZVBlcm1pc3Npb24oXCJJTlRFUk5FVFwiKSBpbnRlcmZhY2UgSUZvbyB7IHZvaWQgZm9vZCgpOyB9In19KTsKK30KZGlmZiAtLWdpdCBhL2dlbmVyYXRlX2FpZGxfbWFwcGluZ3MuY3BwIGIvZ2VuZXJhdGVfYWlkbF9tYXBwaW5ncy5jcHAKaW5kZXggOTk0ZDZhMy4uNGQyYTVhMCAxMDA2NDQKLS0tIGEvZ2VuZXJhdGVfYWlkbF9tYXBwaW5ncy5jcHAKKysrIGIvZ2VuZXJhdGVfYWlkbF9tYXBwaW5ncy5jcHAKQEAgLTI3LDggKzI3LDcgQEAKICAgcmV0dXJuIG1ldGhvZC5QcmludExpbmUoKTsKIH0KIAotU2lnbmF0dXJlTWFwIGdlbmVyYXRlX21hcHBpbmdzKGNvbnN0IEFpZGxEZWZpbmVkVHlwZSogZGVmaW5lZF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcykgeworU2lnbmF0dXJlTWFwIGdlbmVyYXRlX21hcHBpbmdzKGNvbnN0IEFpZGxEZWZpbmVkVHlwZSogZGVmaW5lZF90eXBlKSB7CiAgIGNvbnN0IEFpZGxJbnRlcmZhY2UqIGludGVyZmFjZSA9IGRlZmluZWRfdHlwZS0+QXNJbnRlcmZhY2UoKTsKICAgU2lnbmF0dXJlTWFwIG1hcHBpbmdzOwogICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKQEAgLTQwLDEwICszOSwxMCBAQAogICAgICAgc2lnbmF0dXJlIDw8IGludGVyZmFjZS0+R2V0Q2Fub25pY2FsTmFtZSgpIDw8ICJ8IjsKICAgICAgIHNpZ25hdHVyZSA8PCBtZXRob2QtPkdldE5hbWUoKSA8PCAifCI7CiAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGFyZyA6IG1ldGhvZC0+R2V0QXJndW1lbnRzKCkpIHsKLSAgICAgICAgc2lnbmF0dXJlIDw8IGphdmE6OkphdmFTaWduYXR1cmVPZihhcmctPkdldFR5cGUoKSwgdHlwZW5hbWVzKSA8PCAiLCI7CisgICAgICAgIHNpZ25hdHVyZSA8PCBqYXZhOjpKYXZhU2lnbmF0dXJlT2YoYXJnLT5HZXRUeXBlKCkpIDw8ICIsIjsKICAgICAgIH0KICAgICAgIHNpZ25hdHVyZSA8PCAifCI7Ci0gICAgICBzaWduYXR1cmUgPDwgamF2YTo6SmF2YVNpZ25hdHVyZU9mKG1ldGhvZC0+R2V0VHlwZSgpLCB0eXBlbmFtZXMpOworICAgICAgc2lnbmF0dXJlIDw8IGphdmE6OkphdmFTaWduYXR1cmVPZihtZXRob2QtPkdldFR5cGUoKSk7CiAgICAgICBtYXBwaW5nc1tzaWduYXR1cmUuc3RyKCldID0gZHVtcF9sb2NhdGlvbigqbWV0aG9kKTsKICAgICB9CiAgIH0KZGlmZiAtLWdpdCBhL2dlbmVyYXRlX2FpZGxfbWFwcGluZ3MuaCBiL2dlbmVyYXRlX2FpZGxfbWFwcGluZ3MuaAppbmRleCBkNzRhMTdmLi4wOWY2MTFlIDEwMDY0NAotLS0gYS9nZW5lcmF0ZV9haWRsX21hcHBpbmdzLmgKKysrIGIvZ2VuZXJhdGVfYWlkbF9tYXBwaW5ncy5oCkBAIC0yNiw3ICsyNiw3IEBACiAKIHVzaW5nIFNpZ25hdHVyZU1hcCA9IHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+OwogCi1TaWduYXR1cmVNYXAgZ2VuZXJhdGVfbWFwcGluZ3MoY29uc3QgQWlkbERlZmluZWRUeXBlKiBpZmFjZSwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzKTsKK1NpZ25hdHVyZU1hcCBnZW5lcmF0ZV9tYXBwaW5ncyhjb25zdCBBaWRsRGVmaW5lZFR5cGUqIGlmYWNlKTsKIH0gIC8vIG5hbWVzcGFjZSBtYXBwaW5ncwogfSAgLy8gbmFtZXNwYWNlIGFpZGwKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9nZW5lcmF0ZV9jcHAuY3BwIGIvZ2VuZXJhdGVfY3BwLmNwcAppbmRleCA2MTlhMmYyLi45ODhhYzJiIDEwMDY0NAotLS0gYS9nZW5lcmF0ZV9jcHAuY3BwCisrKyBiL2dlbmVyYXRlX2NwcC5jcHAKQEAgLTEsNCArMSw0IEBACi0vKgorLyoqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMTUsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKQEAgLTMxLDcgKzMxLDYgQEAKIAogI2luY2x1ZGUgImFpZGxfbGFuZ3VhZ2UuaCIKICNpbmNsdWRlICJhaWRsX3RvX2NwcC5oIgotI2luY2x1ZGUgImFzdF9jcHAuaCIKICNpbmNsdWRlICJjb2RlX3dyaXRlci5oIgogI2luY2x1ZGUgImxvZ2dpbmcuaCIKICNpbmNsdWRlICJvcy5oIgpAQCAtNTUsNiArNTQsNyBAQAogY29uc3QgY2hhciBrRGF0YVZhck5hbWVbXSA9ICJfYWlkbF9kYXRhIjsKIGNvbnN0IGNoYXIga0Vycm9yTGFiZWxbXSA9ICJfYWlkbF9lcnJvciI7CiBjb25zdCBjaGFyIGtJbXBsVmFyTmFtZVtdID0gIl9haWRsX2ltcGwiOworY29uc3QgY2hhciBrRGVsZWdhdGVJbXBsVmFyTmFtZVtdID0gIl9haWRsX2RlbGVnYXRlIjsKIGNvbnN0IGNoYXIga1BhcmNlbFZhck5hbWVbXSA9ICJfYWlkbF9wYXJjZWwiOwogY29uc3QgY2hhciBrUmVwbHlWYXJOYW1lW10gPSAiX2FpZGxfcmVwbHkiOwogY29uc3QgY2hhciBrUmV0dXJuVmFyTmFtZVtdID0gIl9haWRsX3JldHVybiI7CkBAIC03NSwzMiArNzUsMjQgQEAKIGNvbnN0IGNoYXIga1N0cm9uZ1BvaW50ZXJIZWFkZXJbXSA9ICJ1dGlscy9TdHJvbmdQb2ludGVyLmgiOwogY29uc3QgY2hhciBrQW5kcm9pZEJhc2VNYWNyb3NIZWFkZXJbXSA9ICJhbmRyb2lkLWJhc2UvbWFjcm9zLmgiOwogCi11bmlxdWVfcHRyPEFzdE5vZGU+IEJyZWFrT25TdGF0dXNOb3RPaygpIHsKLSAgSWZTdGF0ZW1lbnQqIHJldCA9IG5ldyBJZlN0YXRlbWVudChuZXcgQ29tcGFyaXNvbigKLSAgICAgIG5ldyBMaXRlcmFsRXhwcmVzc2lvbihrQW5kcm9pZFN0YXR1c1Zhck5hbWUpLCAiIT0iLAotICAgICAgbmV3IExpdGVyYWxFeHByZXNzaW9uKGtBbmRyb2lkU3RhdHVzT2spKSk7Ci0gIHJldC0+T25UcnVlKCktPkFkZExpdGVyYWwoImJyZWFrIik7Ci0gIHJldHVybiB1bmlxdWVfcHRyPEFzdE5vZGU+KHJldCk7Cit2b2lkIEdlbmVyYXRlQnJlYWtPblN0YXR1c05vdE9rKENvZGVXcml0ZXImIG91dCkgeworICBvdXQuV3JpdGUoImlmICgoKCVzKSAhPSAoJXMpKSkge1xuIiwga0FuZHJvaWRTdGF0dXNWYXJOYW1lLCBrQW5kcm9pZFN0YXR1c09rKTsKKyAgb3V0LldyaXRlKCIgIGJyZWFrO1xuIik7CisgIG91dC5Xcml0ZSgifVxuIik7CiB9CiAKLXVuaXF1ZV9wdHI8QXN0Tm9kZT4gR290b0Vycm9yT25CYWRTdGF0dXMoKSB7Ci0gIElmU3RhdGVtZW50KiByZXQgPSBuZXcgSWZTdGF0ZW1lbnQobmV3IENvbXBhcmlzb24oCi0gICAgICBuZXcgTGl0ZXJhbEV4cHJlc3Npb24oa0FuZHJvaWRTdGF0dXNWYXJOYW1lKSwgIiE9IiwKLSAgICAgIG5ldyBMaXRlcmFsRXhwcmVzc2lvbihrQW5kcm9pZFN0YXR1c09rKSkpOwotICByZXQtPk9uVHJ1ZSgpLT5BZGRMaXRlcmFsKFN0cmluZ1ByaW50ZigiZ290byAlcyIsIGtFcnJvckxhYmVsKSk7Ci0gIHJldHVybiB1bmlxdWVfcHRyPEFzdE5vZGU+KHJldCk7Cit2b2lkIEdlbmVyYXRlR290b0Vycm9yT25CYWRTdGF0dXMoQ29kZVdyaXRlciYgb3V0KSB7CisgIG91dC5Xcml0ZSgiaWYgKCgoJXMpICE9ICglcykpKSB7XG4iLCBrQW5kcm9pZFN0YXR1c1Zhck5hbWUsIGtBbmRyb2lkU3RhdHVzT2spOworICBvdXQuV3JpdGUoIiAgZ290byAlcztcbiIsIGtFcnJvckxhYmVsKTsKKyAgb3V0LldyaXRlKCJ9XG4iKTsKIH0KIAotdW5pcXVlX3B0cjxBc3ROb2RlPiBSZXR1cm5PblN0YXR1c05vdE9rKCkgewotICBJZlN0YXRlbWVudCogcmV0ID0gbmV3IElmU3RhdGVtZW50KG5ldyBDb21wYXJpc29uKG5ldyBMaXRlcmFsRXhwcmVzc2lvbihrQW5kcm9pZFN0YXR1c1Zhck5hbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIhPSIsIG5ldyBMaXRlcmFsRXhwcmVzc2lvbihrQW5kcm9pZFN0YXR1c09rKSkpOwotICByZXQtPk9uVHJ1ZSgpLT5BZGRMaXRlcmFsKFN0cmluZ1ByaW50ZigicmV0dXJuICVzIiwga0FuZHJvaWRTdGF0dXNWYXJOYW1lKSk7Ci0gIHJldHVybiB1bmlxdWVfcHRyPEFzdE5vZGU+KHJldCk7Ci19Ci0KLUFyZ0xpc3QgQnVpbGRBcmdMaXN0KGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywgY29uc3QgQWlkbE1ldGhvZCYgbWV0aG9kLCBib29sIGZvcl9kZWNsYXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgIGJvb2wgdHlwZV9uYW1lX29ubHkgPSBmYWxzZSkgewotICAvLyBCdWlsZCB1cCB0aGUgYXJndW1lbnQgbGlzdCBmb3IgdGhlIHNlcnZlciBtZXRob2QgY2FsbC4KKy8vIEZvcm1hdCB0aHJlZSB0eXBlcyBvZiBhcmcgbGlzdCBmb3IgbWV0aG9kLgorLy8gIGZvcl9kZWNsYXJhdGlvbiAmICF0eXBlX25hbWVfb25seTogaW50IGEgICAgICAvLyBmb3IgbWV0aG9kIGRlY2wgd2l0aCB0eXBlIGFuZCBhcmcKKy8vICBmb3JfZGVjbGFyYXRpb24gJiAgdHlwZV9uYW1lX29ubHk6IGludCAvKmEqLyAgLy8gZm9yIG1ldGhvZCBkZWNsIHdpdGggdHlwZQorLy8gIWZvcl9kZWNsYXJhdGlvbiAgICAgICAgICAgICAgICAgIDogICAgIGEgICAgICAvLyBmb3IgbWV0aG9kIGNhbGwgd2l0aCBhcmcgKHdpdGggZGlyZWN0aW9uKQorc3RyaW5nIEdlbmVyYXRlQXJnTGlzdChjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsIGNvbnN0IEFpZGxNZXRob2QmIG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JfZGVjbGFyYXRpb24sIGJvb2wgdHlwZV9uYW1lX29ubHkpIHsKICAgdmVjdG9yPHN0cmluZz4gbWV0aG9kX2FyZ3VtZW50czsKICAgZm9yIChjb25zdCB1bmlxdWVfcHRyPEFpZGxBcmd1bWVudD4mIGEgOiBtZXRob2QuR2V0QXJndW1lbnRzKCkpIHsKICAgICBzdHJpbmcgbGl0ZXJhbDsKQEAgLTEwOCw3ICsxMDAsNyBAQAogICAgIC8vIGNvbnN0IHJlZmVyZW5jZSBidXQgYnkgdmFsdWUgdG8gbWFrZSBpdCBlYXNpZXIgZm9yIHRoZSB1c2VyIHRvIGtlZXAKICAgICAvLyBpdCBiZXlvbmQgdGhlIHNjb3BlIG9mIHRoZSBjYWxsLiB1bmlxdWVfZmQgaXMgYSB0aGluIHdyYXBwZXIgZm9yIGFuCiAgICAgLy8gaW50IChmZCkgc28gcGFzc2luZyBieSB2YWx1ZSBpcyBub3QgZXhwZW5zaXZlLgotICAgIGNvbnN0IGJvb2wgbm9uQ29weWFibGUgPSBJc05vbkNvcHlhYmxlVHlwZShhLT5HZXRUeXBlKCksIHR5cGVuYW1lcyk7CisgICAgY29uc3QgYm9vbCBub25fY29weWFibGUgPSBJc05vbkNvcHlhYmxlVHlwZShhLT5HZXRUeXBlKCksIHR5cGVuYW1lcyk7CiAgICAgaWYgKGZvcl9kZWNsYXJhdGlvbikgewogICAgICAgLy8gTWV0aG9kIGRlY2xhcmF0aW9ucyBuZWVkIHR5cGVuYW1lcywgcG9pbnRlcnMgdG8gb3V0IHBhcmFtcywgYW5kIHZhcmlhYmxlCiAgICAgICAvLyBuYW1lcyB0aGF0IG1hdGNoIHRoZSAuYWlkbCBzcGVjaWZpY2F0aW9uLgpAQCAtMTE3LDI4ICsxMDksMzAgQEAKICAgICAgIGlmIChhLT5Jc091dCgpKSB7CiAgICAgICAgIGxpdGVyYWwgPSBsaXRlcmFsICsgIioiOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgY29uc3QgYXV0byBkZWZpbmVkVHlwZSA9IHR5cGVuYW1lcy5UcnlHZXREZWZpbmVkVHlwZShhLT5HZXRUeXBlKCkuR2V0TmFtZSgpKTsKKyAgICAgICAgY29uc3QgYXV0byBkZWZpbmVkX3R5cGUgPSB0eXBlbmFtZXMuVHJ5R2V0RGVmaW5lZFR5cGUoYS0+R2V0VHlwZSgpLkdldE5hbWUoKSk7CiAKLSAgICAgICAgY29uc3QgYm9vbCBpc0VudW0gPSBkZWZpbmVkVHlwZSAmJiBkZWZpbmVkVHlwZS0+QXNFbnVtRGVjbGFyYXRpb24oKSAhPSBudWxscHRyOwotICAgICAgICBjb25zdCBib29sIGlzUHJpbWl0aXZlID0gQWlkbFR5cGVuYW1lczo6SXNQcmltaXRpdmVUeXBlbmFtZShhLT5HZXRUeXBlKCkuR2V0TmFtZSgpKTsKKyAgICAgICAgY29uc3QgYm9vbCBpc19lbnVtID0gZGVmaW5lZF90eXBlICYmIGRlZmluZWRfdHlwZS0+QXNFbnVtRGVjbGFyYXRpb24oKSAhPSBudWxscHRyOworICAgICAgICBjb25zdCBib29sIGlzX3ByaW1pdGl2ZSA9IEFpZGxUeXBlbmFtZXM6OklzUHJpbWl0aXZlVHlwZW5hbWUoYS0+R2V0VHlwZSgpLkdldE5hbWUoKSk7CiAKICAgICAgICAgLy8gV2UgcGFzcyBpbiBwYXJhbWV0ZXJzIHRoYXQgYXJlIG5vdCBwcmltaXRpdmVzIGJ5IGNvbnN0IHJlZmVyZW5jZS4KICAgICAgICAgLy8gQXJyYXlzIG9mIHByaW1pdGl2ZXMgYXJlIG5vdCBwcmltaXRpdmVzLgotICAgICAgICBpZiAoIShpc1ByaW1pdGl2ZSB8fCBpc0VudW0gfHwgbm9uQ29weWFibGUpIHx8IGEtPkdldFR5cGUoKS5Jc0FycmF5KCkpIHsKKyAgICAgICAgaWYgKCEoaXNfcHJpbWl0aXZlIHx8IGlzX2VudW0gfHwgbm9uX2NvcHlhYmxlKSB8fCBhLT5HZXRUeXBlKCkuSXNBcnJheSgpKSB7CiAgICAgICAgICAgbGl0ZXJhbCA9ICJjb25zdCAiICsgbGl0ZXJhbCArICImIjsKICAgICAgICAgfQogICAgICAgfQotICAgICAgaWYgKCF0eXBlX25hbWVfb25seSkgeworICAgICAgaWYgKHR5cGVfbmFtZV9vbmx5KSB7CisgICAgICAgIGxpdGVyYWwgKz0gIiAvKiIgKyBhLT5HZXROYW1lKCkgKyAiKi8iOworICAgICAgfSBlbHNlIHsKICAgICAgICAgbGl0ZXJhbCArPSAiICIgKyBhLT5HZXROYW1lKCk7CiAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgIHN0ZDo6c3RyaW5nIHZhck5hbWUgPSBCdWlsZFZhck5hbWUoKmEpOworICAgICAgc3RkOjpzdHJpbmcgdmFyX25hbWUgPSBCdWlsZFZhck5hbWUoKmEpOwogICAgICAgaWYgKGEtPklzT3V0KCkpIHsKLSAgICAgICAgbGl0ZXJhbCA9ICImIiArIHZhck5hbWU7Ci0gICAgICB9IGVsc2UgaWYgKG5vbkNvcHlhYmxlKSB7Ci0gICAgICAgIGxpdGVyYWwgPSAic3RkOjptb3ZlKCIgKyB2YXJOYW1lICsgIikiOworICAgICAgICBsaXRlcmFsID0gIiYiICsgdmFyX25hbWU7CisgICAgICB9IGVsc2UgaWYgKG5vbl9jb3B5YWJsZSkgeworICAgICAgICBsaXRlcmFsID0gInN0ZDo6bW92ZSgiICsgdmFyX25hbWUgKyAiKSI7CiAgICAgICB9IGVsc2UgewotICAgICAgICBsaXRlcmFsID0gdmFyTmFtZTsKKyAgICAgICAgbGl0ZXJhbCA9IHZhcl9uYW1lOwogICAgICAgfQogICAgIH0KICAgICBtZXRob2RfYXJndW1lbnRzLnB1c2hfYmFjayhsaXRlcmFsKTsKQEAgLTE0OCw3ICsxNDIsOSBAQAogICAgIHN0cmluZyBsaXRlcmFsOwogICAgIGlmIChmb3JfZGVjbGFyYXRpb24pIHsKICAgICAgIGxpdGVyYWwgPSBDcHBOYW1lT2YobWV0aG9kLkdldFR5cGUoKSwgdHlwZW5hbWVzKSArICIqIjsKLSAgICAgIGlmICghdHlwZV9uYW1lX29ubHkpIHsKKyAgICAgIGlmICh0eXBlX25hbWVfb25seSkgeworICAgICAgICBsaXRlcmFsICs9ICIgLyoiICsgc3RyaW5nKGtSZXR1cm5WYXJOYW1lKSArICIqLyI7CisgICAgICB9IGVsc2UgewogICAgICAgICBsaXRlcmFsICs9ICIgIiArIHN0cmluZyhrUmV0dXJuVmFyTmFtZSk7CiAgICAgICB9CiAgICAgfSBlbHNlIHsKQEAgLTE1NywxNjUgKzE1Myw4NSBAQAogICAgIG1ldGhvZF9hcmd1bWVudHMucHVzaF9iYWNrKGxpdGVyYWwpOwogICB9CiAKLSAgcmV0dXJuIEFyZ0xpc3QobWV0aG9kX2FyZ3VtZW50cyk7CisgIHJldHVybiBKb2luKG1ldGhvZF9hcmd1bWVudHMsICIsICIpOwogfQogCi11bmlxdWVfcHRyPERlY2xhcmF0aW9uPiBCdWlsZE1ldGhvZERlY2woY29uc3QgQWlkbE1ldGhvZCYgbWV0aG9kLCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JfaW50ZXJmYWNlKSB7Ci0gIHVpbnQzMl90IG1vZGlmaWVycyA9IDA7Ci0gIGlmIChmb3JfaW50ZXJmYWNlKSB7Ci0gICAgbW9kaWZpZXJzIHw9IE1ldGhvZERlY2w6OklTX1ZJUlRVQUw7Ci0gICAgbW9kaWZpZXJzIHw9IE1ldGhvZERlY2w6OklTX1BVUkVfVklSVFVBTDsKLSAgfSBlbHNlIHsKLSAgICBtb2RpZmllcnMgfD0gTWV0aG9kRGVjbDo6SVNfT1ZFUlJJREU7Ci0gIH0KLQotICBjb25zdCBzdHJpbmcgYXR0cmlidXRlID0gR2V0RGVwcmVjYXRlZEF0dHJpYnV0ZShtZXRob2QpOwotICByZXR1cm4gdW5pcXVlX3B0cjxEZWNsYXJhdGlvbj57bmV3IE1ldGhvZERlY2x7Ci0gICAgICBrQmluZGVyU3RhdHVzTGl0ZXJhbCwgbWV0aG9kLkdldE5hbWUoKSwKLSAgICAgIEJ1aWxkQXJnTGlzdCh0eXBlbmFtZXMsIG1ldGhvZCwgdHJ1ZSAvKiBmb3IgbWV0aG9kIGRlY2wgKi8pLCBtb2RpZmllcnMsIGF0dHJpYnV0ZX19Owordm9pZCBHZW5lcmF0ZU1ldGhvZERlY2woQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywgY29uc3QgQWlkbE1ldGhvZCYgbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBjbGF6eikgeworICBzdHJpbmcgY2xhenpfcHJlZml4ID0gY2xhenouZW1wdHkoKSA/ICIiIDogY2xhenogKyAiOjoiOworICBvdXQgPDwgIjo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgIiA8PCBjbGF6el9wcmVmaXggPDwgbWV0aG9kLkdldE5hbWUoKSA8PCAiKCIKKyAgICAgIDw8IEdlbmVyYXRlQXJnTGlzdCh0eXBlcywgbWV0aG9kLCAvKmZvcl9kZWNsYXJ0aW9uPSovdHJ1ZSwgLyp0eXBlX25hbWVfb25seT0qL2ZhbHNlKSA8PCAiKSI7CiB9CiAKLXVuaXF1ZV9wdHI8RGVjbGFyYXRpb24+IEJ1aWxkTWV0YU1ldGhvZERlY2woY29uc3QgQWlkbE1ldGhvZCYgbWV0aG9kLCBjb25zdCBBaWRsVHlwZW5hbWVzJiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucywgYm9vbCBmb3JfaW50ZXJmYWNlKSB7Ci0gIEFJRExfRkFUQUxfSUYobWV0aG9kLklzVXNlckRlZmluZWQoKSwgbWV0aG9kKTsKLSAgaWYgKG1ldGhvZC5HZXROYW1lKCkgPT0ga0dldEludGVyZmFjZVZlcnNpb24gJiYgb3B0aW9ucy5WZXJzaW9uKCkpIHsKLSAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gY29kZTsKLSAgICBpZiAoZm9yX2ludGVyZmFjZSkgewotICAgICAgY29kZSA8PCAidmlydHVhbCAiOwotICAgIH0KLSAgICBjb2RlIDw8ICJpbnQzMl90ICIgPDwga0dldEludGVyZmFjZVZlcnNpb24gPDwgIigpIjsKLSAgICBpZiAoZm9yX2ludGVyZmFjZSkgewotICAgICAgY29kZSA8PCAiID0gMDtcbiI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGNvZGUgPDwgIiBvdmVycmlkZTtcbiI7Ci0gICAgfQotICAgIHJldHVybiB1bmlxdWVfcHRyPERlY2xhcmF0aW9uPihuZXcgTGl0ZXJhbERlY2woY29kZS5zdHIoKSkpOwotICB9Ci0gIGlmIChtZXRob2QuR2V0TmFtZSgpID09IGtHZXRJbnRlcmZhY2VIYXNoICYmICFvcHRpb25zLkhhc2goKS5lbXB0eSgpKSB7Ci0gICAgc3RkOjpvc3RyaW5nc3RyZWFtIGNvZGU7Ci0gICAgaWYgKGZvcl9pbnRlcmZhY2UpIHsKLSAgICAgIGNvZGUgPDwgInZpcnR1YWwgIjsKLSAgICB9Ci0gICAgY29kZSA8PCAic3RkOjpzdHJpbmcgIiA8PCBrR2V0SW50ZXJmYWNlSGFzaCA8PCAiKCkiOwotICAgIGlmIChmb3JfaW50ZXJmYWNlKSB7Ci0gICAgICBjb2RlIDw8ICIgPSAwO1xuIjsKLSAgICB9IGVsc2UgewotICAgICAgY29kZSA8PCAiIG92ZXJyaWRlO1xuIjsKLSAgICB9Ci0gICAgcmV0dXJuIHVuaXF1ZV9wdHI8RGVjbGFyYXRpb24+KG5ldyBMaXRlcmFsRGVjbChjb2RlLnN0cigpKSk7Ci0gIH0KLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci0KLXN0ZDo6dmVjdG9yPHVuaXF1ZV9wdHI8RGVjbGFyYXRpb24+PiBOZXN0SW5OYW1lc3BhY2VzKHZlY3Rvcjx1bmlxdWVfcHRyPERlY2xhcmF0aW9uPj4gZGVjbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3I8c3RyaW5nPiYgcGFja2FnZSkgewotICBhdXRvIGl0ID0gcGFja2FnZS5jcmJlZ2luKCk7ICAvLyBJdGVyYXRlIG92ZXIgdGhlIG5hbWVzcGFjZXMgaW5uZXIgdG8gb3V0ZXIKLSAgZm9yICg7IGl0ICE9IHBhY2thZ2UuY3JlbmQoKTsgKytpdCkgewotICAgIHZlY3Rvcjx1bmlxdWVfcHRyPERlY2xhcmF0aW9uPj4gaW5uZXI7Ci0gICAgaW5uZXIuZW1wbGFjZV9iYWNrKHVuaXF1ZV9wdHI8RGVjbGFyYXRpb24+e25ldyBDcHBOYW1lc3BhY2V7Kml0LCBzdGQ6Om1vdmUoZGVjbHMpfX0pOwotCi0gICAgZGVjbHMgPSBzdGQ6Om1vdmUoaW5uZXIpOwotICB9Ci0gIHJldHVybiBkZWNsczsKLX0KLQotc3RkOjp2ZWN0b3I8dW5pcXVlX3B0cjxEZWNsYXJhdGlvbj4+IE5lc3RJbk5hbWVzcGFjZXModW5pcXVlX3B0cjxEZWNsYXJhdGlvbj4gZGVjbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlY3RvcjxzdHJpbmc+JiBwYWNrYWdlKSB7Ci0gIHZlY3Rvcjx1bmlxdWVfcHRyPERlY2xhcmF0aW9uPj4gZGVjbHM7Ci0gIGRlY2xzLnB1c2hfYmFjayhzdGQ6Om1vdmUoZGVjbCkpOwotICByZXR1cm4gTmVzdEluTmFtZXNwYWNlcyhzdGQ6Om1vdmUoZGVjbHMpLCBwYWNrYWdlKTsKLX0KLQotdW5pcXVlX3B0cjxEZWNsYXJhdGlvbj4gRGVmaW5lQ2xpZW50VHJhbnNhY3Rpb24oY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbEludGVyZmFjZSYgaW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbE1ldGhvZCYgbWV0aG9kLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7Cit2b2lkIEdlbmVyYXRlQ2xpZW50VHJhbnNhY3Rpb24oQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbEludGVyZmFjZSYgaW50ZXJmYWNlLCBjb25zdCBBaWRsTWV0aG9kJiBtZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgewogICBjb25zdCBzdHJpbmcgaV9uYW1lID0gQ2xhc3NOYW1lKGludGVyZmFjZSwgQ2xhc3NOYW1lczo6SU5URVJGQUNFKTsKLSAgY29uc3Qgc3RyaW5nIGJwX25hbWUgPSBDbGFzc05hbWUoaW50ZXJmYWNlLCBDbGFzc05hbWVzOjpDTElFTlQpOwotICB1bmlxdWVfcHRyPE1ldGhvZEltcGw+IHJldHsKLSAgICAgIG5ldyBNZXRob2RJbXBse2tCaW5kZXJTdGF0dXNMaXRlcmFsLAotICAgICAgICAgICAgICAgICAgICAgYnBfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgIG1ldGhvZC5HZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICB7fSwKLSAgICAgICAgICAgICAgICAgICAgIEFyZ0xpc3R7QnVpbGRBcmdMaXN0KHR5cGVuYW1lcywgbWV0aG9kLCB0cnVlIC8qIGZvciBtZXRob2QgZGVjbCAqLyl9fX07Ci0gIFN0YXRlbWVudEJsb2NrKiBiID0gcmV0LT5HZXRTdGF0ZW1lbnRCbG9jaygpOworICBjb25zdCBzdHJpbmcgYnBfbmFtZSA9IEdldFF1YWxpZmllZE5hbWUoaW50ZXJmYWNlLCBDbGFzc05hbWVzOjpDTElFTlQpOworICBjb25zdCBzdHJpbmcgYm5fbmFtZSA9IEdldFF1YWxpZmllZE5hbWUoaW50ZXJmYWNlLCBDbGFzc05hbWVzOjpTRVJWRVIpOworCisgIEdlbmVyYXRlTWV0aG9kRGVjbChvdXQsIHR5cGVuYW1lcywgbWV0aG9kLCBicF9uYW1lKTsKKyAgb3V0IDw8ICIge1xuIjsKKyAgb3V0LkluZGVudCgpOwogCiAgIC8vIERlY2xhcmUgcGFyY2VscyB0byBob2xkIG91ciBxdWVyeSBhbmQgdGhlIHJlc3BvbnNlLgotICBiLT5BZGRMaXRlcmFsKFN0cmluZ1ByaW50ZigiJXMgJXMiLCBrQW5kcm9pZFBhcmNlbExpdGVyYWwsIGtEYXRhVmFyTmFtZSkpOworICBvdXQuV3JpdGUoIiVzICVzO1xuIiwga0FuZHJvaWRQYXJjZWxMaXRlcmFsLCBrRGF0YVZhck5hbWUpOwogICBpZiAoaW50ZXJmYWNlLklzU2Vuc2l0aXZlRGF0YSgpKSB7Ci0gICAgYi0+QWRkTGl0ZXJhbChTdHJpbmdQcmludGYoIiVzLm1hcmtTZW5zaXRpdmUoKSIsIGtEYXRhVmFyTmFtZSkpOworICAgIG91dC5Xcml0ZSgiJXMubWFya1NlbnNpdGl2ZSgpO1xuIiwga0RhdGFWYXJOYW1lKTsKICAgfQotICBiLT5BZGRMaXRlcmFsKFN0cmluZ1ByaW50ZigiJXMubWFya0ZvckJpbmRlcihyZW1vdGVTdHJvbmcoKSkiLCBrRGF0YVZhck5hbWUpKTsKKyAgb3V0LldyaXRlKCIlcy5tYXJrRm9yQmluZGVyKHJlbW90ZVN0cm9uZygpKTtcbiIsIGtEYXRhVmFyTmFtZSk7CiAKICAgLy8gRXZlbiBpZiB3ZSdyZSBvbmV3YXksIHRoZSB0cmFuc2FjdCBtZXRob2Qgc3RpbGwgdGFrZXMgYSBwYXJjZWwuCi0gIGItPkFkZExpdGVyYWwoU3RyaW5nUHJpbnRmKCIlcyAlcyIsIGtBbmRyb2lkUGFyY2VsTGl0ZXJhbCwga1JlcGx5VmFyTmFtZSkpOworICBvdXQuV3JpdGUoIiVzICVzO1xuIiwga0FuZHJvaWRQYXJjZWxMaXRlcmFsLCBrUmVwbHlWYXJOYW1lKTsKIAogICAvLyBEZWNsYXJlIHRoZSBzdGF0dXNfdCB2YXJpYWJsZSB3ZSBuZWVkIGZvciBlcnJvciBoYW5kbGluZy4KLSAgYi0+QWRkTGl0ZXJhbChTdHJpbmdQcmludGYoIiVzICVzID0gJXMiLCBrQW5kcm9pZFN0YXR1c0xpdGVyYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtBbmRyb2lkU3RhdHVzVmFyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0FuZHJvaWRTdGF0dXNPaykpOworICBvdXQuV3JpdGUoIiVzICVzID0gJXM7XG4iLCBrQW5kcm9pZFN0YXR1c0xpdGVyYWwsIGtBbmRyb2lkU3RhdHVzVmFyTmFtZSwga0FuZHJvaWRTdGF0dXNPayk7CiAgIC8vIFdlIHVuY29uZGl0aW9uYWxseSByZXR1cm4gYSBTdGF0dXMgb2JqZWN0LgotICBiLT5BZGRMaXRlcmFsKFN0cmluZ1ByaW50ZigiJXMgJXMiLCBrQmluZGVyU3RhdHVzTGl0ZXJhbCwga1N0YXR1c1Zhck5hbWUpKTsKKyAgb3V0LldyaXRlKCIlcyAlcztcbiIsIGtCaW5kZXJTdGF0dXNMaXRlcmFsLCBrU3RhdHVzVmFyTmFtZSk7CiAKICAgaWYgKG9wdGlvbnMuR2VuVHJhY2VzKCkpIHsKLSAgICBiLT5BZGRMaXRlcmFsKAotICAgICAgICBTdHJpbmdQcmludGYoIjo6YW5kcm9pZDo6U2NvcGVkVHJhY2UgJXMoQVRSQUNFX1RBR19BSURMLCBcIkFJREw6OmNwcDo6JXM6OiVzOjpjcHBDbGllbnRcIikiLAotICAgICAgICAgICAgICAgICAgICAga1RyYWNlVmFyTmFtZSwgaW50ZXJmYWNlLkdldE5hbWUoKS5jX3N0cigpLCBtZXRob2QuR2V0TmFtZSgpLmNfc3RyKCkpKTsKKyAgICBvdXQuV3JpdGUoIjo6YW5kcm9pZDo6U2NvcGVkVHJhY2UgJXMoQVRSQUNFX1RBR19BSURMLCBcIkFJREw6OmNwcDo6JXM6OiVzOjpjcHBDbGllbnRcIik7XG4iLAorICAgICAgICAgICAgICBrVHJhY2VWYXJOYW1lLCBpbnRlcmZhY2UuR2V0TmFtZSgpLmNfc3RyKCksIG1ldGhvZC5HZXROYW1lKCkuY19zdHIoKSk7CiAgIH0KIAogICBpZiAob3B0aW9ucy5HZW5Mb2coKSkgewotICAgIGItPkFkZExpdGVyYWwoR2VuTG9nQmVmb3JlRXhlY3V0ZShicF9uYW1lLCBtZXRob2QsIGZhbHNlIC8qIGlzU2VydmVyICovLCBmYWxzZSAvKiBpc05kayAqLyksCi0gICAgICAgICAgICAgICAgICBmYWxzZSAvKiBubyBzZW1pY29sb24gKi8pOworICAgIG91dCA8PCBHZW5Mb2dCZWZvcmVFeGVjdXRlKGJwX25hbWUsIG1ldGhvZCwgZmFsc2UgLyogaXNTZXJ2ZXIgKi8sIGZhbHNlIC8qIGlzTmRrICovKTsKICAgfQogCiAgIC8vIEFkZCB0aGUgbmFtZSBvZiB0aGUgaW50ZXJmYWNlIHdlJ3JlIGhvcGluZyB0byBjYWxsLgotICBiLT5BZGRTdGF0ZW1lbnQobmV3IEFzc2lnbm1lbnQoCi0gICAgICBrQW5kcm9pZFN0YXR1c1Zhck5hbWUsCi0gICAgICBuZXcgTWV0aG9kQ2FsbChTdHJpbmdQcmludGYoIiVzLndyaXRlSW50ZXJmYWNlVG9rZW4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtEYXRhVmFyTmFtZSksCi0gICAgICAgICAgICAgICAgICAgICAiZ2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpIikpKTsKLSAgYi0+QWRkU3RhdGVtZW50KEdvdG9FcnJvck9uQmFkU3RhdHVzKCkpOworICBvdXQuV3JpdGUoIiVzID0gJXMud3JpdGVJbnRlcmZhY2VUb2tlbihnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpO1xuIiwga0FuZHJvaWRTdGF0dXNWYXJOYW1lLAorICAgICAgICAgICAga0RhdGFWYXJOYW1lKTsKKyAgR2VuZXJhdGVHb3RvRXJyb3JPbkJhZFN0YXR1cyhvdXQpOwogCi0gIGZvciAoY29uc3QgYXV0byYgYTogbWV0aG9kLkdldEFyZ3VtZW50cygpKSB7CisgIGZvciAoY29uc3QgYXV0byYgYSA6IG1ldGhvZC5HZXRBcmd1bWVudHMoKSkgewogICAgIGNvbnN0IHN0cmluZyB2YXJfbmFtZSA9ICgoYS0+SXNPdXQoKSkgPyAiKiIgOiAiIikgKyBhLT5HZXROYW1lKCk7CiAKICAgICBpZiAoYS0+SXNJbigpKSB7CiAgICAgICAvLyBTZXJpYWxpemF0aW9uIGxvb2tzIHJvdWdobHkgbGlrZToKICAgICAgIC8vICAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS5Xcml0ZUludDMyKGluX3BhcmFtX25hbWUpOwogICAgICAgLy8gICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IDo6YW5kcm9pZDo6T0spIHsgZ290byBlcnJvcjsgfQotICAgICAgY29uc3Qgc3RyaW5nJiBtZXRob2QgPSBQYXJjZWxXcml0ZU1ldGhvZE9mKGEtPkdldFR5cGUoKSwgdHlwZW5hbWVzKTsKLSAgICAgIGItPkFkZFN0YXRlbWVudCgKLSAgICAgICAgICBuZXcgQXNzaWdubWVudChrQW5kcm9pZFN0YXR1c1Zhck5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE1ldGhvZENhbGwoU3RyaW5nUHJpbnRmKCIlcy4lcyIsIGtEYXRhVmFyTmFtZSwgbWV0aG9kLmNfc3RyKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbFdyaXRlQ2FzdE9mKGEtPkdldFR5cGUoKSwgdHlwZW5hbWVzLCB2YXJfbmFtZSkpKSk7Ci0gICAgICBiLT5BZGRTdGF0ZW1lbnQoR290b0Vycm9yT25CYWRTdGF0dXMoKSk7Ci0gICAgfSBlbHNlIGlmIChhLT5Jc091dCgpICYmIGEtPkdldFR5cGUoKS5Jc0FycmF5KCkpIHsKKyAgICAgIG91dC5Xcml0ZSgiJXMgPSAlcy4lcyglcyk7XG4iLCBrQW5kcm9pZFN0YXR1c1Zhck5hbWUsIGtEYXRhVmFyTmFtZSwKKyAgICAgICAgICAgICAgICBQYXJjZWxXcml0ZU1ldGhvZE9mKGEtPkdldFR5cGUoKSwgdHlwZW5hbWVzKS5jX3N0cigpLAorICAgICAgICAgICAgICAgIFBhcmNlbFdyaXRlQ2FzdE9mKGEtPkdldFR5cGUoKSwgdHlwZW5hbWVzLCB2YXJfbmFtZSkuY19zdHIoKSk7CisgICAgICBHZW5lcmF0ZUdvdG9FcnJvck9uQmFkU3RhdHVzKG91dCk7CisgICAgfSBlbHNlIGlmIChhLT5Jc091dCgpICYmIGEtPkdldFR5cGUoKS5Jc0R5bmFtaWNBcnJheSgpKSB7CiAgICAgICAvLyBTcGVjaWFsIGNhc2UsIHRoZSBsZW5ndGggb2YgdGhlIG91dCBhcnJheSBpcyB3cml0dGVuIGludG8gdGhlIHBhcmNlbC4KICAgICAgIC8vICAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZVZlY3RvclNpemUoJm91dF9wYXJhbV9uYW1lKTsKICAgICAgIC8vICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSA6OmFuZHJvaWQ6Ok9LKSB7IGdvdG8gZXJyb3I7IH0KLSAgICAgIGItPkFkZFN0YXRlbWVudChuZXcgQXNzaWdubWVudCgKLSAgICAgICAgICBrQW5kcm9pZFN0YXR1c1Zhck5hbWUsCi0gICAgICAgICAgbmV3IE1ldGhvZENhbGwoU3RyaW5nUHJpbnRmKCIlcy53cml0ZVZlY3RvclNpemUiLCBrRGF0YVZhck5hbWUpLCB2YXJfbmFtZSkpKTsKLSAgICAgIGItPkFkZFN0YXRlbWVudChHb3RvRXJyb3JPbkJhZFN0YXR1cygpKTsKKyAgICAgIG91dC5Xcml0ZSgiJXMgPSAlcy53cml0ZVZlY3RvclNpemUoJXMpO1xuIiwga0FuZHJvaWRTdGF0dXNWYXJOYW1lLCBrRGF0YVZhck5hbWUsCisgICAgICAgICAgICAgICAgdmFyX25hbWUuY19zdHIoKSk7CisgICAgICBHZW5lcmF0ZUdvdG9FcnJvck9uQmFkU3RhdHVzKG91dCk7CiAgICAgfQogICB9CiAKICAgLy8gSW52b2tlIHRoZSB0cmFuc2FjdGlvbiBvbiB0aGUgcmVtb3RlIGJpbmRlciBhbmQgY29uZmlybSBzdGF0dXMuCi0gIHN0cmluZyB0cmFuc2FjdGlvbl9jb2RlID0gR2V0VHJhbnNhY3Rpb25JZEZvcihpbnRlcmZhY2UsIG1ldGhvZCk7Ci0KLSAgdmVjdG9yPHN0cmluZz4gYXJncyA9IHt0cmFuc2FjdGlvbl9jb2RlLCBrRGF0YVZhck5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUHJpbnRmKCImJXMiLCBrUmVwbHlWYXJOYW1lKX07Ci0KICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGZsYWdzOwogICBpZiAobWV0aG9kLklzT25ld2F5KCkpIGZsYWdzLnB1c2hfYmFjaygiOjphbmRyb2lkOjpJQmluZGVyOjpGTEFHX09ORVdBWSIpOwogICBpZiAoaW50ZXJmYWNlLklzU2Vuc2l0aXZlRGF0YSgpKSBmbGFncy5wdXNoX2JhY2soIjo6YW5kcm9pZDo6SUJpbmRlcjo6RkxBR19DTEVBUl9CVUYiKTsKIAotICBhcmdzLnB1c2hfYmFjayhmbGFncy5lbXB0eSgpID8gIjAiIDogSm9pbihmbGFncywgIiB8ICIpKTsKLQotICBiLT5BZGRTdGF0ZW1lbnQobmV3IEFzc2lnbm1lbnQoCi0gICAgICBrQW5kcm9pZFN0YXR1c1Zhck5hbWUsCi0gICAgICBuZXcgTWV0aG9kQ2FsbCgicmVtb3RlKCktPnRyYW5zYWN0IiwKLSAgICAgICAgICAgICAgICAgICAgIEFyZ0xpc3QoYXJncykpKSk7CisgIG91dC5Xcml0ZSgiJXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoJXMsICVzLCAmJXMsICVzKTtcbiIsIGtBbmRyb2lkU3RhdHVzVmFyTmFtZSwKKyAgICAgICAgICAgIEdldFRyYW5zYWN0aW9uSWRGb3IoYm5fbmFtZSwgbWV0aG9kKS5jX3N0cigpLCBrRGF0YVZhck5hbWUsIGtSZXBseVZhck5hbWUsCisgICAgICAgICAgICBmbGFncy5lbXB0eSgpID8gIjAiIDogSm9pbihmbGFncywgIiB8ICIpLmNfc3RyKCkpOwogCiAgIC8vIElmIHRoZSBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkIGluIHRoZSByZW1vdGUgc2lkZSwgdHJ5IHRvIGNhbGwgdGhlCiAgIC8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb24sIGlmIHByb3ZpZGVkLgpAQCAtMzMwLDMwICsyNDYsMjQgQEAKICAgaWYgKG1ldGhvZC5HZXRUeXBlKCkuR2V0TmFtZSgpICE9ICJ2b2lkIikgewogICAgIGFyZ19uYW1lcy5lbXBsYWNlX2JhY2soa1JldHVyblZhck5hbWUpOwogICB9Ci0gIGItPkFkZExpdGVyYWwoU3RyaW5nUHJpbnRmKCJpZiAoVU5MSUtFTFkoX2FpZGxfcmV0X3N0YXR1cyA9PSA6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04gJiYgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6OmdldERlZmF1bHRJbXBsKCkpKSB7XG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICByZXR1cm4gJXM6OmdldERlZmF1bHRJbXBsKCktPiVzKCVzKTtcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn1cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlfbmFtZS5jX3N0cigpLCBpX25hbWUuY19zdHIoKSwgbWV0aG9kLkdldE5hbWUoKS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKb2luKGFyZ19uYW1lcywgIiwgIikuY19zdHIoKSksCi0gICAgICAgICAgICAgICAgZmFsc2UgLyogbm8gc2VtaWNvbG9uICovKTsKLQotICBiLT5BZGRTdGF0ZW1lbnQoR290b0Vycm9yT25CYWRTdGF0dXMoKSk7CisgIG91dC5Xcml0ZSgiaWYgKFVOTElLRUxZKCVzID09IDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTiAmJiAlczo6Z2V0RGVmYXVsdEltcGwoKSkpIHtcbiIsCisgICAgICAgICAgICBrQW5kcm9pZFN0YXR1c1Zhck5hbWUsIGlfbmFtZS5jX3N0cigpKTsKKyAgb3V0LldyaXRlKCIgICByZXR1cm4gJXM6OmdldERlZmF1bHRJbXBsKCktPiVzKCVzKTtcbiIsIGlfbmFtZS5jX3N0cigpLCBtZXRob2QuR2V0TmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgICBKb2luKGFyZ19uYW1lcywgIiwgIikuY19zdHIoKSk7CisgIG91dC5Xcml0ZSgifVxuIik7CisgIEdlbmVyYXRlR290b0Vycm9yT25CYWRTdGF0dXMob3V0KTsKIAogICBpZiAoIW1ldGhvZC5Jc09uZXdheSgpKSB7CiAgICAgLy8gU3RyaXAgb2ZmIHRoZSBleGNlcHRpb24gaGVhZGVyIGFuZCBmYWlsIGlmIHdlIHNlZSBhIHJlbW90ZSBleGNlcHRpb24uCiAgICAgLy8gX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy5yZWFkRnJvbVBhcmNlbChfYWlkbF9yZXBseSk7CiAgICAgLy8gaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gOjphbmRyb2lkOjpPSykgeyBnb3RvIGVycm9yOyB9CiAgICAgLy8gaWYgKCFfYWlkbF9zdGF0dXMuaXNPaygpKSB7IHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOyB9Ci0gICAgYi0+QWRkU3RhdGVtZW50KG5ldyBBc3NpZ25tZW50KAotICAgICAgICBrQW5kcm9pZFN0YXR1c1Zhck5hbWUsCi0gICAgICAgIFN0cmluZ1ByaW50ZigiJXMucmVhZEZyb21QYXJjZWwoJXMpIiwga1N0YXR1c1Zhck5hbWUsIGtSZXBseVZhck5hbWUpKSk7Ci0gICAgYi0+QWRkU3RhdGVtZW50KEdvdG9FcnJvck9uQmFkU3RhdHVzKCkpOwotICAgIElmU3RhdGVtZW50KiBleGNlcHRpb25fY2hlY2sgPSBuZXcgSWZTdGF0ZW1lbnQoCi0gICAgICAgIG5ldyBMaXRlcmFsRXhwcmVzc2lvbihTdHJpbmdQcmludGYoIiElcy5pc09rKCkiLCBrU3RhdHVzVmFyTmFtZSkpKTsKLSAgICBiLT5BZGRTdGF0ZW1lbnQoZXhjZXB0aW9uX2NoZWNrKTsKLSAgICBleGNlcHRpb25fY2hlY2stPk9uVHJ1ZSgpLT5BZGRMaXRlcmFsKAotICAgICAgICBTdHJpbmdQcmludGYoInJldHVybiAlcyIsIGtTdGF0dXNWYXJOYW1lKSk7CisgICAgb3V0LldyaXRlKCIlcyA9ICVzLnJlYWRGcm9tUGFyY2VsKCVzKTtcbiIsIGtBbmRyb2lkU3RhdHVzVmFyTmFtZSwga1N0YXR1c1Zhck5hbWUsCisgICAgICAgICAgICAgIGtSZXBseVZhck5hbWUpOworICAgIEdlbmVyYXRlR290b0Vycm9yT25CYWRTdGF0dXMob3V0KTsKKyAgICBvdXQuV3JpdGUoImlmICghJXMuaXNPaygpKSB7XG4iLCBrU3RhdHVzVmFyTmFtZSk7CisgICAgb3V0LldyaXRlKCIgIHJldHVybiAlcztcbiIsIGtTdGF0dXNWYXJOYW1lKTsKKyAgICBvdXQuV3JpdGUoIn1cbiIpOwogICB9CiAKICAgLy8gVHlwZSBjaGVja2luZyBzaG91bGQgZ3VhcmFudGVlIHRoYXQgbm90aGluZyBiZWxvdyBlbWl0cyBjb2RlIHVudGlsICJyZXR1cm4KQEAgLTM2MSwyNSArMjcxLDIwIEBACiAKICAgLy8gSWYgdGhlIG1ldGhvZCBpcyBleHBlY3RlZCB0byByZXR1cm4gc29tZXRoaW5nLCByZWFkIGl0IGZpcnN0IGJ5IGNvbnZlbnRpb24uCiAgIGlmIChtZXRob2QuR2V0VHlwZSgpLkdldE5hbWUoKSAhPSAidm9pZCIpIHsKLSAgICBjb25zdCBzdHJpbmcmIG1ldGhvZF9jYWxsID0gUGFyY2VsUmVhZE1ldGhvZE9mKG1ldGhvZC5HZXRUeXBlKCksIHR5cGVuYW1lcyk7Ci0gICAgYi0+QWRkU3RhdGVtZW50KG5ldyBBc3NpZ25tZW50KAotICAgICAgICBrQW5kcm9pZFN0YXR1c1Zhck5hbWUsCi0gICAgICAgIG5ldyBNZXRob2RDYWxsKFN0cmluZ1ByaW50ZigiJXMuJXMiLCBrUmVwbHlWYXJOYW1lLCBtZXRob2RfY2FsbC5jX3N0cigpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsUmVhZENhc3RPZihtZXRob2QuR2V0VHlwZSgpLCB0eXBlbmFtZXMsIGtSZXR1cm5WYXJOYW1lKSkpKTsKLSAgICBiLT5BZGRTdGF0ZW1lbnQoR290b0Vycm9yT25CYWRTdGF0dXMoKSk7CisgICAgb3V0LldyaXRlKCIlcyA9ICVzLiVzKCVzKTtcbiIsIGtBbmRyb2lkU3RhdHVzVmFyTmFtZSwga1JlcGx5VmFyTmFtZSwKKyAgICAgICAgICAgICAgUGFyY2VsUmVhZE1ldGhvZE9mKG1ldGhvZC5HZXRUeXBlKCksIHR5cGVuYW1lcykuY19zdHIoKSwKKyAgICAgICAgICAgICAgUGFyY2VsUmVhZENhc3RPZihtZXRob2QuR2V0VHlwZSgpLCB0eXBlbmFtZXMsIGtSZXR1cm5WYXJOYW1lKS5jX3N0cigpKTsKKyAgICBHZW5lcmF0ZUdvdG9FcnJvck9uQmFkU3RhdHVzKG91dCk7CiAgIH0KIAogICBmb3IgKGNvbnN0IEFpZGxBcmd1bWVudCogYSA6IG1ldGhvZC5HZXRPdXRBcmd1bWVudHMoKSkgewogICAgIC8vIERlc2VyaWFsaXphdGlvbiBsb29rcyByb3VnaGx5IGxpa2U6CiAgICAgLy8gICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS5SZWFkSW50MzIob3V0X3BhcmFtX25hbWUpOwogICAgIC8vICAgICBpZiAoX2FpZGxfc3RhdHVzICE9IDo6YW5kcm9pZDo6T0spIHsgZ290byBfYWlkbF9lcnJvcjsgfQotICAgIHN0cmluZyBtZXRob2QgPSBQYXJjZWxSZWFkTWV0aG9kT2YoYS0+R2V0VHlwZSgpLCB0eXBlbmFtZXMpOwotCi0gICAgYi0+QWRkU3RhdGVtZW50KAotICAgICAgICBuZXcgQXNzaWdubWVudChrQW5kcm9pZFN0YXR1c1Zhck5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIG5ldyBNZXRob2RDYWxsKFN0cmluZ1ByaW50ZigiJXMuJXMiLCBrUmVwbHlWYXJOYW1lLCBtZXRob2QuY19zdHIoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbFJlYWRDYXN0T2YoYS0+R2V0VHlwZSgpLCB0eXBlbmFtZXMsIGEtPkdldE5hbWUoKSkpKSk7Ci0gICAgYi0+QWRkU3RhdGVtZW50KEdvdG9FcnJvck9uQmFkU3RhdHVzKCkpOworICAgIG91dC5Xcml0ZSgiJXMgPSAlcy4lcyglcyk7XG4iLCBrQW5kcm9pZFN0YXR1c1Zhck5hbWUsIGtSZXBseVZhck5hbWUsCisgICAgICAgICAgICAgIFBhcmNlbFJlYWRNZXRob2RPZihhLT5HZXRUeXBlKCksIHR5cGVuYW1lcykuY19zdHIoKSwKKyAgICAgICAgICAgICAgUGFyY2VsUmVhZENhc3RPZihhLT5HZXRUeXBlKCksIHR5cGVuYW1lcywgYS0+R2V0TmFtZSgpKS5jX3N0cigpKTsKKyAgICBHZW5lcmF0ZUdvdG9FcnJvck9uQmFkU3RhdHVzKG91dCk7CiAgIH0KIAogICAvLyBJZiB3ZSd2ZSBnb3R0ZW4gdG8gaGVyZSwgb25lIG9mIHR3byB0aGluZ3MgaXMgdHJ1ZToKQEAgLTM4NywyMjggKzI5MiwxODUgQEAKICAgLy8gICAyKSBXZSd2ZSBvbmx5IHJlYWQgc3RhdHVzX3QgPT0gT0sgYW5kIHRoZXJlIHdhcyBubyBleGNlcHRpb24gaW4gdGhlCiAgIC8vICAgICAgcmVzcG9uc2UuCiAgIC8vIEluIGJvdGggY2FzZXMsIHdlJ3JlIGZyZWUgdG8gc2V0IFN0YXR1cyBmcm9tIHRoZSBzdGF0dXNfdCBhbmQgcmV0dXJuLgotICBiLT5BZGRMaXRlcmFsKFN0cmluZ1ByaW50ZigiJXM6XG4iLCBrRXJyb3JMYWJlbCksIGZhbHNlIC8qIG5vIHNlbWljb2xvbiAqLyk7Ci0gIGItPkFkZExpdGVyYWwoCi0gICAgICBTdHJpbmdQcmludGYoIiVzLnNldEZyb21TdGF0dXNUKCVzKSIsIGtTdGF0dXNWYXJOYW1lLAotICAgICAgICAgICAgICAgICAgIGtBbmRyb2lkU3RhdHVzVmFyTmFtZSkpOworICBvdXQuV3JpdGUoIiVzOlxuIiwga0Vycm9yTGFiZWwpOworICBvdXQuV3JpdGUoIiVzLnNldEZyb21TdGF0dXNUKCVzKTtcbiIsIGtTdGF0dXNWYXJOYW1lLCBrQW5kcm9pZFN0YXR1c1Zhck5hbWUpOwogCiAgIGlmIChvcHRpb25zLkdlbkxvZygpKSB7Ci0gICAgYi0+QWRkTGl0ZXJhbChHZW5Mb2dBZnRlckV4ZWN1dGUoYnBfbmFtZSwgaW50ZXJmYWNlLCBtZXRob2QsIGtTdGF0dXNWYXJOYW1lLCBrUmV0dXJuVmFyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBpc1NlcnZlciAqLywgZmFsc2UgLyogaXNOZGsgKi8pLAotICAgICAgICAgICAgICAgICAgZmFsc2UgLyogbm8gc2VtaWNvbG9uICovKTsKKyAgICBvdXQgPDwgR2VuTG9nQWZ0ZXJFeGVjdXRlKGJwX25hbWUsIGludGVyZmFjZSwgbWV0aG9kLCBrU3RhdHVzVmFyTmFtZSwga1JldHVyblZhck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBpc1NlcnZlciAqLywgZmFsc2UgLyogaXNOZGsgKi8pOwogICB9CiAKLSAgYi0+QWRkTGl0ZXJhbChTdHJpbmdQcmludGYoInJldHVybiAlcyIsIGtTdGF0dXNWYXJOYW1lKSk7Ci0KLSAgcmV0dXJuIHVuaXF1ZV9wdHI8RGVjbGFyYXRpb24+KHJldC5yZWxlYXNlKCkpOworICBvdXQuV3JpdGUoInJldHVybiAlcztcbiIsIGtTdGF0dXNWYXJOYW1lKTsKKyAgb3V0LkRlZGVudCgpOworICBvdXQgPDwgIn1cbiI7CiB9CiAKLXVuaXF1ZV9wdHI8RGVjbGFyYXRpb24+IERlZmluZUNsaWVudE1ldGFUcmFuc2FjdGlvbihjb25zdCBBaWRsVHlwZW5hbWVzJiAvKiB0eXBlbmFtZXMgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbEludGVyZmFjZSYgaW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxNZXRob2QmIG1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7Cit2b2lkIEdlbmVyYXRlQ2xpZW50TWV0YVRyYW5zYWN0aW9uKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbEludGVyZmFjZSYgaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsTWV0aG9kJiBtZXRob2QsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKICAgQUlETF9GQVRBTF9JRihtZXRob2QuSXNVc2VyRGVmaW5lZCgpLCBtZXRob2QpOworICBjb25zdCBzdHJpbmcgYnBfbmFtZSA9IEdldFF1YWxpZmllZE5hbWUoaW50ZXJmYWNlLCBDbGFzc05hbWVzOjpDTElFTlQpOworICBjb25zdCBzdHJpbmcgYm5fbmFtZSA9IEdldFF1YWxpZmllZE5hbWUoaW50ZXJmYWNlLCBDbGFzc05hbWVzOjpTRVJWRVIpOwogICBpZiAobWV0aG9kLkdldE5hbWUoKSA9PSBrR2V0SW50ZXJmYWNlVmVyc2lvbiAmJiBvcHRpb25zLlZlcnNpb24oKSA+IDApIHsKLSAgICBjb25zdCBzdHJpbmcgaWZhY2UgPSBDbGFzc05hbWUoaW50ZXJmYWNlLCBDbGFzc05hbWVzOjpJTlRFUkZBQ0UpOwotICAgIGNvbnN0IHN0cmluZyBwcm94eSA9IENsYXNzTmFtZShpbnRlcmZhY2UsIENsYXNzTmFtZXM6OkNMSUVOVCk7CiAgICAgLy8gTm90ZTogcmFjZSBjb25kaXRpb24gY2FuIGhhcHBlbiBoZXJlLCBidXQgbm8gbG9ja2luZyBpcyByZXF1aXJlZAogICAgIC8vIGJlY2F1c2UgMSkgd3JpdGluZyBhbiBpbnRlcmdlciBpcyBhdG9taWMgYW5kIDIpIHRoaXMgdHJhbnNhY3Rpb24KICAgICAvLyB3aWxsIGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgdmFsdWUsIGkuZS4sIGNvbXBldGluZyB0aHJlYWRzIHdpbGwKICAgICAvLyBnaXZlIHdyaXRlIHRoZSBzYW1lIHZhbHVlIHRvIGNhY2hlZF92ZXJzaW9uXy4KLSAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gY29kZTsKLSAgICBjb2RlIDw8ICJpbnQzMl90ICIgPDwgcHJveHkgPDwgIjo6IiA8PCBrR2V0SW50ZXJmYWNlVmVyc2lvbiA8PCAiKCkge1xuIgotICAgICAgICAgPDwgIiAgaWYgKGNhY2hlZF92ZXJzaW9uXyA9PSAtMSkge1xuIgotICAgICAgICAgPDwgIiAgICA6OmFuZHJvaWQ6OlBhcmNlbCBkYXRhO1xuIgotICAgICAgICAgPDwgIiAgICA6OmFuZHJvaWQ6OlBhcmNlbCByZXBseTtcbiIKLSAgICAgICAgIDw8ICIgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKGdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7XG4iCi0gICAgICAgICA8PCAiICAgIDo6YW5kcm9pZDo6c3RhdHVzX3QgZXJyID0gcmVtb3RlKCktPnRyYW5zYWN0KCIgPDwgR2V0VHJhbnNhY3Rpb25JZEZvcihpbnRlcmZhY2UsIG1ldGhvZCkKLSAgICAgICAgIDw8ICIsIGRhdGEsICZyZXBseSk7XG4iCi0gICAgICAgICA8PCAiICAgIGlmIChlcnIgPT0gOjphbmRyb2lkOjpPSykge1xuIgotICAgICAgICAgPDwgIiAgICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzO1xuIgotICAgICAgICAgPDwgIiAgICAgIGVyciA9IF9haWRsX3N0YXR1cy5yZWFkRnJvbVBhcmNlbChyZXBseSk7XG4iCi0gICAgICAgICA8PCAiICAgICAgaWYgKGVyciA9PSA6OmFuZHJvaWQ6Ok9LICYmIF9haWRsX3N0YXR1cy5pc09rKCkpIHtcbiIKLSAgICAgICAgIDw8ICIgICAgICAgIGNhY2hlZF92ZXJzaW9uXyA9IHJlcGx5LnJlYWRJbnQzMigpO1xuIgotICAgICAgICAgPDwgIiAgICAgIH1cbiIKLSAgICAgICAgIDw8ICIgICAgfVxuIgotICAgICAgICAgPDwgIiAgfVxuIgotICAgICAgICAgPDwgIiAgcmV0dXJuIGNhY2hlZF92ZXJzaW9uXztcbiIKLSAgICAgICAgIDw8ICJ9XG4iOwotICAgIHJldHVybiB1bmlxdWVfcHRyPERlY2xhcmF0aW9uPihuZXcgTGl0ZXJhbERlY2woY29kZS5zdHIoKSkpOworICAgIG91dCA8PCAiaW50MzJfdCAiIDw8IGJwX25hbWUgPDwgIjo6IiA8PCBrR2V0SW50ZXJmYWNlVmVyc2lvbiA8PCAiKCkge1xuIgorICAgICAgICA8PCAiICBpZiAoY2FjaGVkX3ZlcnNpb25fID09IC0xKSB7XG4iCisgICAgICAgIDw8ICIgICAgOjphbmRyb2lkOjpQYXJjZWwgZGF0YTtcbiIKKyAgICAgICAgPDwgIiAgICA6OmFuZHJvaWQ6OlBhcmNlbCByZXBseTtcbiIKKyAgICAgICAgPDwgIiAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oZ2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTtcbiIKKyAgICAgICAgPDwgIiAgICA6OmFuZHJvaWQ6OnN0YXR1c190IGVyciA9IHJlbW90ZSgpLT50cmFuc2FjdCgiCisgICAgICAgIDw8IEdldFRyYW5zYWN0aW9uSWRGb3IoYm5fbmFtZSwgbWV0aG9kKSA8PCAiLCBkYXRhLCAmcmVwbHkpO1xuIgorICAgICAgICA8PCAiICAgIGlmIChlcnIgPT0gOjphbmRyb2lkOjpPSykge1xuIgorICAgICAgICA8PCAiICAgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXM7XG4iCisgICAgICAgIDw8ICIgICAgICBlcnIgPSBfYWlkbF9zdGF0dXMucmVhZEZyb21QYXJjZWwocmVwbHkpO1xuIgorICAgICAgICA8PCAiICAgICAgaWYgKGVyciA9PSA6OmFuZHJvaWQ6Ok9LICYmIF9haWRsX3N0YXR1cy5pc09rKCkpIHtcbiIKKyAgICAgICAgPDwgIiAgICAgICAgY2FjaGVkX3ZlcnNpb25fID0gcmVwbHkucmVhZEludDMyKCk7XG4iCisgICAgICAgIDw8ICIgICAgICB9XG4iCisgICAgICAgIDw8ICIgICAgfVxuIgorICAgICAgICA8PCAiICB9XG4iCisgICAgICAgIDw8ICIgIHJldHVybiBjYWNoZWRfdmVyc2lvbl87XG4iCisgICAgICAgIDw8ICJ9XG4iOworICAgIG91dCA8PCAiXG4iOwogICB9CiAgIGlmIChtZXRob2QuR2V0TmFtZSgpID09IGtHZXRJbnRlcmZhY2VIYXNoICYmICFvcHRpb25zLkhhc2goKS5lbXB0eSgpKSB7Ci0gICAgY29uc3Qgc3RyaW5nIGlmYWNlID0gQ2xhc3NOYW1lKGludGVyZmFjZSwgQ2xhc3NOYW1lczo6SU5URVJGQUNFKTsKLSAgICBjb25zdCBzdHJpbmcgcHJveHkgPSBDbGFzc05hbWUoaW50ZXJmYWNlLCBDbGFzc05hbWVzOjpDTElFTlQpOwotICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBjb2RlOwotICAgIGNvZGUgPDwgInN0ZDo6c3RyaW5nICIgPDwgcHJveHkgPDwgIjo6IiA8PCBrR2V0SW50ZXJmYWNlSGFzaCA8PCAiKCkge1xuIgotICAgICAgICAgPDwgIiAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2tHdWFyZChjYWNoZWRfaGFzaF9tdXRleF8pO1xuIgotICAgICAgICAgPDwgIiAgaWYgKGNhY2hlZF9oYXNoXyA9PSBcIi0xXCIpIHtcbiIKLSAgICAgICAgIDw8ICIgICAgOjphbmRyb2lkOjpQYXJjZWwgZGF0YTtcbiIKLSAgICAgICAgIDw8ICIgICAgOjphbmRyb2lkOjpQYXJjZWwgcmVwbHk7XG4iCi0gICAgICAgICA8PCAiICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpO1xuIgotICAgICAgICAgPDwgIiAgICA6OmFuZHJvaWQ6OnN0YXR1c190IGVyciA9IHJlbW90ZSgpLT50cmFuc2FjdCgiIDw8IEdldFRyYW5zYWN0aW9uSWRGb3IoaW50ZXJmYWNlLCBtZXRob2QpCi0gICAgICAgICA8PCAiLCBkYXRhLCAmcmVwbHkpO1xuIgotICAgICAgICAgPDwgIiAgICBpZiAoZXJyID09IDo6YW5kcm9pZDo6T0spIHtcbiIKLSAgICAgICAgIDw8ICIgICAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1cztcbiIKLSAgICAgICAgIDw8ICIgICAgICBlcnIgPSBfYWlkbF9zdGF0dXMucmVhZEZyb21QYXJjZWwocmVwbHkpO1xuIgotICAgICAgICAgPDwgIiAgICAgIGlmIChlcnIgPT0gOjphbmRyb2lkOjpPSyAmJiBfYWlkbF9zdGF0dXMuaXNPaygpKSB7XG4iCi0gICAgICAgICA8PCAiICAgICAgICByZXBseS5yZWFkVXRmOEZyb21VdGYxNigmY2FjaGVkX2hhc2hfKTtcbiIKLSAgICAgICAgIDw8ICIgICAgICB9XG4iCi0gICAgICAgICA8PCAiICAgIH1cbiIKLSAgICAgICAgIDw8ICIgIH1cbiIKLSAgICAgICAgIDw8ICIgIHJldHVybiBjYWNoZWRfaGFzaF87XG4iCi0gICAgICAgICA8PCAifVxuIjsKLSAgICByZXR1cm4gdW5pcXVlX3B0cjxEZWNsYXJhdGlvbj4obmV3IExpdGVyYWxEZWNsKGNvZGUuc3RyKCkpKTsKKyAgICBvdXQgPDwgInN0ZDo6c3RyaW5nICIgPDwgYnBfbmFtZSA8PCAiOjoiIDw8IGtHZXRJbnRlcmZhY2VIYXNoIDw8ICIoKSB7XG4iCisgICAgICAgIDw8ICIgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrR3VhcmQoY2FjaGVkX2hhc2hfbXV0ZXhfKTtcbiIKKyAgICAgICAgPDwgIiAgaWYgKGNhY2hlZF9oYXNoXyA9PSBcIi0xXCIpIHtcbiIKKyAgICAgICAgPDwgIiAgICA6OmFuZHJvaWQ6OlBhcmNlbCBkYXRhO1xuIgorICAgICAgICA8PCAiICAgIDo6YW5kcm9pZDo6UGFyY2VsIHJlcGx5O1xuIgorICAgICAgICA8PCAiICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpO1xuIgorICAgICAgICA8PCAiICAgIDo6YW5kcm9pZDo6c3RhdHVzX3QgZXJyID0gcmVtb3RlKCktPnRyYW5zYWN0KCIKKyAgICAgICAgPDwgR2V0VHJhbnNhY3Rpb25JZEZvcihibl9uYW1lLCBtZXRob2QpIDw8ICIsIGRhdGEsICZyZXBseSk7XG4iCisgICAgICAgIDw8ICIgICAgaWYgKGVyciA9PSA6OmFuZHJvaWQ6Ok9LKSB7XG4iCisgICAgICAgIDw8ICIgICAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1cztcbiIKKyAgICAgICAgPDwgIiAgICAgIGVyciA9IF9haWRsX3N0YXR1cy5yZWFkRnJvbVBhcmNlbChyZXBseSk7XG4iCisgICAgICAgIDw8ICIgICAgICBpZiAoZXJyID09IDo6YW5kcm9pZDo6T0sgJiYgX2FpZGxfc3RhdHVzLmlzT2soKSkge1xuIgorICAgICAgICA8PCAiICAgICAgICByZXBseS5yZWFkVXRmOEZyb21VdGYxNigmY2FjaGVkX2hhc2hfKTtcbiIKKyAgICAgICAgPDwgIiAgICAgIH1cbiIKKyAgICAgICAgPDwgIiAgICB9XG4iCisgICAgICAgIDw8ICIgIH1cbiIKKyAgICAgICAgPDwgIiAgcmV0dXJuIGNhY2hlZF9oYXNoXztcbiIKKyAgICAgICAgPDwgIn1cbiI7CiAgIH0KLSAgcmV0dXJuIG51bGxwdHI7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZQogCi11bmlxdWVfcHRyPERvY3VtZW50PiBCdWlsZENsaWVudFNvdXJjZShjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsSW50ZXJmYWNlJiBpbnRlcmZhY2UsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKK3ZvaWQgR2VuZXJhdGVDbGllbnRTb3VyY2UoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsSW50ZXJmYWNlJiBpbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgewogICB2ZWN0b3I8c3RyaW5nPiBpbmNsdWRlX2xpc3QgPSB7CiAgICAgICBIZWFkZXJGaWxlKGludGVyZmFjZSwgQ2xhc3NOYW1lczo6Q0xJRU5ULCBmYWxzZSksCi0gICAgICBIZWFkZXJGaWxlKGludGVyZmFjZSwgQ2xhc3NOYW1lczo6U0VSVkVSLCBmYWxzZSksIC8vIGZvciBUUkFOU0FDVElPTl8qIGNvbnN0cwotICAgICAga1BhcmNlbEhlYWRlciwKLSAgICAgIGtBbmRyb2lkQmFzZU1hY3Jvc0hlYWRlcgotICB9OworICAgICAgSGVhZGVyRmlsZShpbnRlcmZhY2UsIENsYXNzTmFtZXM6OlNFUlZFUiwgZmFsc2UpLCAgLy8gZm9yIFRSQU5TQUNUSU9OXyogY29uc3RzCisgICAgICBrUGFyY2VsSGVhZGVyLCBrQW5kcm9pZEJhc2VNYWNyb3NIZWFkZXJ9OwogICBpZiAob3B0aW9ucy5HZW5Mb2coKSkgewogICAgIGluY2x1ZGVfbGlzdC5lbXBsYWNlX2JhY2soImNocm9ubyIpOwogICAgIGluY2x1ZGVfbGlzdC5lbXBsYWNlX2JhY2soImZ1bmN0aW9uYWwiKTsKICAgfQotICB2ZWN0b3I8dW5pcXVlX3B0cjxEZWNsYXJhdGlvbj4+IGZpbGVfZGVjbHM7CisgIGZvciAoY29uc3QgYXV0byYgcGF0aCA6IGluY2x1ZGVfbGlzdCkgeworICAgIG91dCA8PCAiI2luY2x1ZGUgPCIgPDwgcGF0aCA8PCAiPlxuIjsKKyAgfQorICBvdXQgPDwgIlxuIjsKKworICBjb25zdCBzdHJpbmcgaV9uYW1lID0gQ2xhc3NOYW1lKGludGVyZmFjZSwgQ2xhc3NOYW1lczo6SU5URVJGQUNFKTsKKyAgY29uc3Qgc3RyaW5nIGJwX25hbWUgPSBDbGFzc05hbWUoaW50ZXJmYWNlLCBDbGFzc05hbWVzOjpDTElFTlQpOworICBjb25zdCBzdHJpbmcgcV9uYW1lID0gR2V0UXVhbGlmaWVkTmFtZShpbnRlcmZhY2UsIENsYXNzTmFtZXM6OkNMSUVOVCk7CisKKyAgRW50ZXJOYW1lc3BhY2Uob3V0LCBpbnRlcmZhY2UpOworICBvdXQgPDwgIlxuIjsKIAogICAvLyBUaGUgY29uc3RydWN0b3IganVzdCBwYXNzZXMgdGhlIElCaW5kZXIgaW5zdGFuY2UgdXAgdG8gdGhlIHN1cGVyCiAgIC8vIGNsYXNzLgotICBjb25zdCBzdHJpbmcgaV9uYW1lID0gQ2xhc3NOYW1lKGludGVyZmFjZSwgQ2xhc3NOYW1lczo6SU5URVJGQUNFKTsKLSAgY29uc3Qgc3RyaW5nIGJwX25hbWUgPSBDbGFzc05hbWUoaW50ZXJmYWNlLCBDbGFzc05hbWVzOjpDTElFTlQpOwotICBmaWxlX2RlY2xzLnB1c2hfYmFjayh1bmlxdWVfcHRyPERlY2xhcmF0aW9uPntuZXcgQ29uc3RydWN0b3JJbXBsewotICAgICAgYnBfbmFtZSwKLSAgICAgIEFyZ0xpc3R7U3RyaW5nUHJpbnRmKCJjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4mICVzIiwga0ltcGxWYXJOYW1lKX0sCi0gICAgICB7IkJwSW50ZXJmYWNlPCIgKyBpX25hbWUgKyAiPigiICsga0ltcGxWYXJOYW1lICsgIikifX19KTsKKyAgb3V0IDw8IHFfbmFtZSA8PCAiOjoiIDw8IGJwX25hbWUgPDwgIihjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4mIF9haWRsX2ltcGwpXG4iOworICBvdXQgPDwgIiAgICA6IEJwSW50ZXJmYWNlPCIgKyBpX25hbWUgKyAiPihfYWlkbF9pbXBsKXtcbiI7CisgIG91dCA8PCAifVxuIjsKKyAgb3V0IDw8ICJcbiI7CiAKICAgaWYgKG9wdGlvbnMuR2VuTG9nKCkpIHsKLSAgICBzdHJpbmcgY29kZTsKLSAgICBDb2RlV3JpdGVyUHRyIHdyaXRlciA9IENvZGVXcml0ZXI6OkZvclN0cmluZygmY29kZSk7Ci0gICAgKCp3cml0ZXIpIDw8ICJzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgIiArIGJwX25hbWUgKyAiOjpUcmFuc2FjdGlvbkxvZyYpPiAiIDw8IGJwX25hbWUKLSAgICAgICAgICAgICAgPDwgIjo6bG9nRnVuYztcbiI7Ci0gICAgd3JpdGVyLT5DbG9zZSgpOwotICAgIGZpbGVfZGVjbHMucHVzaF9iYWNrKHVuaXF1ZV9wdHI8RGVjbGFyYXRpb24+KG5ldyBMaXRlcmFsRGVjbChjb2RlKSkpOworICAgIG91dCA8PCAic3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0ICIgKyBxX25hbWUgKyAiOjpUcmFuc2FjdGlvbkxvZyYpPiAiIDw8IHFfbmFtZQorICAgICAgICA8PCAiOjpsb2dGdW5jO1xuIjsKKyAgICBvdXQgPDwgIlxuIjsKICAgfQogCiAgIC8vIENsaWVudHMgZGVmaW5lIGEgbWV0aG9kIHBlciB0cmFuc2FjdGlvbi4KICAgZm9yIChjb25zdCBhdXRvJiBtZXRob2QgOiBpbnRlcmZhY2UuR2V0TWV0aG9kcygpKSB7Ci0gICAgdW5pcXVlX3B0cjxEZWNsYXJhdGlvbj4gbTsKICAgICBpZiAobWV0aG9kLT5Jc1VzZXJEZWZpbmVkKCkpIHsKLSAgICAgIG0gPSBEZWZpbmVDbGllbnRUcmFuc2FjdGlvbih0eXBlbmFtZXMsIGludGVyZmFjZSwgKm1ldGhvZCwgb3B0aW9ucyk7CisgICAgICBHZW5lcmF0ZUNsaWVudFRyYW5zYWN0aW9uKG91dCwgdHlwZW5hbWVzLCBpbnRlcmZhY2UsICptZXRob2QsIG9wdGlvbnMpOwogICAgIH0gZWxzZSB7Ci0gICAgICBtID0gRGVmaW5lQ2xpZW50TWV0YVRyYW5zYWN0aW9uKHR5cGVuYW1lcywgaW50ZXJmYWNlLCAqbWV0aG9kLCBvcHRpb25zKTsKKyAgICAgIEdlbmVyYXRlQ2xpZW50TWV0YVRyYW5zYWN0aW9uKG91dCwgaW50ZXJmYWNlLCAqbWV0aG9kLCBvcHRpb25zKTsKICAgICB9Ci0gICAgaWYgKCFtKSB7IHJldHVybiBudWxscHRyOyB9Ci0gICAgZmlsZV9kZWNscy5wdXNoX2JhY2soc3RkOjptb3ZlKG0pKTsKKyAgICBvdXQgPDwgIlxuIjsKICAgfQotICByZXR1cm4gdW5pcXVlX3B0cjxEb2N1bWVudD57bmV3IENwcFNvdXJjZXsKLSAgICAgIGluY2x1ZGVfbGlzdCwKLSAgICAgIE5lc3RJbk5hbWVzcGFjZXMoc3RkOjptb3ZlKGZpbGVfZGVjbHMpLCBpbnRlcmZhY2UuR2V0U3BsaXRQYWNrYWdlKCkpfX07CisKKyAgTGVhdmVOYW1lc3BhY2Uob3V0LCBpbnRlcmZhY2UpOwogfQogCiBuYW1lc3BhY2UgewogCi12b2lkIEJ1aWxkQ29uc3RhbnREZWZpbml0aW9ucyhjb25zdCBBaWRsRGVmaW5lZFR5cGUmIHR5cGUsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgdHlwZV9wYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY2xhc3NfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3Rvcjx1bmlxdWVfcHRyPERlY2xhcmF0aW9uPj4mIGRlY2xzKSB7Cit2b2lkIEdlbmVyYXRlQ29uc3RhbnREZWZpbml0aW9ucyhDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxEZWZpbmVkVHlwZSYgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywgY29uc3Qgc3RyaW5nJiB0ZW1wbGF0ZV9kZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBxX25hbWUpIHsKICAgZm9yIChjb25zdCBhdXRvJiBjb25zdGFudCA6IHR5cGUuR2V0Q29uc3RhbnREZWNsYXJhdGlvbnMoKSkgewogICAgIGNvbnN0IEFpZGxDb25zdGFudFZhbHVlJiB2YWx1ZSA9IGNvbnN0YW50LT5HZXRWYWx1ZSgpOwogICAgIGlmICh2YWx1ZS5HZXRUeXBlKCkgIT0gQWlkbENvbnN0YW50VmFsdWU6OlR5cGU6OlNUUklORykgY29udGludWU7CiAKLSAgICBzdGQ6OnN0cmluZyBjcHBUeXBlID0gQ3BwTmFtZU9mKGNvbnN0YW50LT5HZXRUeXBlKCksIHR5cGVuYW1lcyk7Ci0gICAgdW5pcXVlX3B0cjxNZXRob2RJbXBsPiBnZXR0ZXIoCi0gICAgICAgIG5ldyBNZXRob2RJbXBsKCJjb25zdCAiICsgY3BwVHlwZSArICImIiwgY2xhc3NfbmFtZSwgY29uc3RhbnQtPkdldE5hbWUoKSwgdHlwZV9wYXJhbXMsIHt9KSk7Ci0gICAgZ2V0dGVyLT5HZXRTdGF0ZW1lbnRCbG9jaygpLT5BZGRMaXRlcmFsKAotICAgICAgICBTdHJpbmdQcmludGYoInN0YXRpYyBjb25zdCAlcyB2YWx1ZSglcykiLCBjcHBUeXBlLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICBjb25zdGFudC0+VmFsdWVTdHJpbmcoQ29uc3RhbnRWYWx1ZURlY29yYXRvcikuY19zdHIoKSkpOwotICAgIGdldHRlci0+R2V0U3RhdGVtZW50QmxvY2soKS0+QWRkTGl0ZXJhbCgicmV0dXJuIHZhbHVlIik7Ci0gICAgZGVjbHMucHVzaF9iYWNrKHN0ZDo6bW92ZShnZXR0ZXIpKTsKKyAgICBzdGQ6OnN0cmluZyBjcHBfdHlwZSA9IENwcE5hbWVPZihjb25zdGFudC0+R2V0VHlwZSgpLCB0eXBlbmFtZXMpOworICAgIG91dCA8PCB0ZW1wbGF0ZV9kZWNsOworICAgIG91dCA8PCAiY29uc3QgIiA8PCBjcHBfdHlwZSA8PCAiJiAiIDw8IHFfbmFtZSA8PCAiOjoiIDw8IGNvbnN0YW50LT5HZXROYW1lKCkgPDwgIigpIHtcbiI7CisgICAgb3V0IDw8ICIgIHN0YXRpYyBjb25zdCAiIDw8IGNwcF90eXBlIDw8ICIgdmFsdWUoIgorICAgICAgICA8PCBjb25zdGFudC0+VmFsdWVTdHJpbmcoQ29uc3RhbnRWYWx1ZURlY29yYXRvcikgPDwgIik7XG4iOworICAgIG91dCA8PCAiICByZXR1cm4gdmFsdWU7XG4iOworICAgIG91dCA8PCAifVxuIjsKICAgfQogfQogCi12b2lkIEJ1aWxkQ29uc3RhbnREZWNsYXJhdGlvbnMoY29uc3QgQWlkbERlZmluZWRUeXBlJiB0eXBlLCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlX3B0cjxDbGFzc0RlY2w+JiBjbHMsIHNldDxzdHJpbmc+JiBpbmNsdWRlcykgewotICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8RGVjbGFyYXRpb24+PiBzdHJpbmdfY29uc3RhbnRzOwotICB1bmlxdWVfcHRyPEVudW0+IGJ5dGVfY29uc3RhbnRfZW51bXtuZXcgRW51bXsiIiwgImludDhfdCIsIGZhbHNlfX07Ci0gIHVuaXF1ZV9wdHI8RW51bT4gaW50X2NvbnN0YW50X2VudW17bmV3IEVudW17IiIsICJpbnQzMl90IiwgZmFsc2V9fTsKLSAgdW5pcXVlX3B0cjxFbnVtPiBsb25nX2NvbnN0YW50X2VudW17bmV3IEVudW17IiIsICJpbnQ2NF90IiwgZmFsc2V9fTsKK3ZvaWQgR2VuZXJhdGVDb25zdGFudERlY2xhcmF0aW9ucyhDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxEZWZpbmVkVHlwZSYgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMpIHsKICAgZm9yIChjb25zdCBhdXRvJiBjb25zdGFudCA6IHR5cGUuR2V0Q29uc3RhbnREZWNsYXJhdGlvbnMoKSkgewogICAgIGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiB0eXBlID0gY29uc3RhbnQtPkdldFR5cGUoKTsKLSAgICBjb25zdCBBaWRsQ29uc3RhbnRWYWx1ZSYgdmFsdWUgPSBjb25zdGFudC0+R2V0VmFsdWUoKTsKLQotICAgIGNvbnN0IHN0cmluZyBhdHRyaWJ1dGUgPSBHZXREZXByZWNhdGVkQXR0cmlidXRlKCpjb25zdGFudCk7CisgICAgY29uc3QgYXV0byBjcHBfdHlwZSA9IENwcE5hbWVPZih0eXBlLCB0eXBlbmFtZXMpOwogICAgIGlmICh0eXBlLlNpZ25hdHVyZSgpID09ICJTdHJpbmciKSB7Ci0gICAgICBzdGQ6OnN0cmluZyBjcHBUeXBlID0gQ3BwTmFtZU9mKGNvbnN0YW50LT5HZXRUeXBlKCksIHR5cGVuYW1lcyk7Ci0gICAgICB1bmlxdWVfcHRyPERlY2xhcmF0aW9uPiBnZXR0ZXIobmV3IE1ldGhvZERlY2woImNvbnN0ICIgKyBjcHBUeXBlICsgIiYiLCBjb25zdGFudC0+R2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt9LCBNZXRob2REZWNsOjpJU19TVEFUSUMsIGF0dHJpYnV0ZSkpOwotICAgICAgc3RyaW5nX2NvbnN0YW50cy5wdXNoX2JhY2soc3RkOjptb3ZlKGdldHRlcikpOwotICAgIH0gZWxzZSBpZiAodHlwZS5TaWduYXR1cmUoKSA9PSAiYnl0ZSIpIHsKLSAgICAgIGJ5dGVfY29uc3RhbnRfZW51bS0+QWRkVmFsdWUoY29uc3RhbnQtPkdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RhbnQtPlZhbHVlU3RyaW5nKENvbnN0YW50VmFsdWVEZWNvcmF0b3IpLCBhdHRyaWJ1dGUpOwotICAgIH0gZWxzZSBpZiAodHlwZS5TaWduYXR1cmUoKSA9PSAiaW50IikgewotICAgICAgaW50X2NvbnN0YW50X2VudW0tPkFkZFZhbHVlKGNvbnN0YW50LT5HZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RhbnQtPlZhbHVlU3RyaW5nKENvbnN0YW50VmFsdWVEZWNvcmF0b3IpLCBhdHRyaWJ1dGUpOwotICAgIH0gZWxzZSBpZiAodHlwZS5TaWduYXR1cmUoKSA9PSAibG9uZyIpIHsKLSAgICAgIGxvbmdfY29uc3RhbnRfZW51bS0+QWRkVmFsdWUoY29uc3RhbnQtPkdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RhbnQtPlZhbHVlU3RyaW5nKENvbnN0YW50VmFsdWVEZWNvcmF0b3IpLCBhdHRyaWJ1dGUpOworICAgICAgb3V0IDw8ICJzdGF0aWMgY29uc3QgIiA8PCBjcHBfdHlwZSA8PCAiJiAiIDw8IGNvbnN0YW50LT5HZXROYW1lKCkgPDwgIigpIjsKKyAgICAgIEdlbmVyYXRlRGVwcmVjYXRlZChvdXQsICpjb25zdGFudCk7CisgICAgICBvdXQgPDwgIjtcbiI7CiAgICAgfSBlbHNlIHsKLSAgICAgIEFJRExfRkFUQUwodmFsdWUpIDw8ICJVbnJlY29nbml6ZWQgY29uc3RhbnQgdHlwZTogIiA8PCB0eXBlLlNpZ25hdHVyZSgpOwotICAgIH0KLSAgfQotICBpZiAoYnl0ZV9jb25zdGFudF9lbnVtLT5IYXNWYWx1ZXMoKSkgewotICAgIGNscy0+QWRkUHVibGljKHN0ZDo6bW92ZShieXRlX2NvbnN0YW50X2VudW0pKTsKLSAgfQotICBpZiAoaW50X2NvbnN0YW50X2VudW0tPkhhc1ZhbHVlcygpKSB7Ci0gICAgY2xzLT5BZGRQdWJsaWMoc3RkOjptb3ZlKGludF9jb25zdGFudF9lbnVtKSk7Ci0gIH0KLSAgaWYgKGxvbmdfY29uc3RhbnRfZW51bS0+SGFzVmFsdWVzKCkpIHsKLSAgICBjbHMtPkFkZFB1YmxpYyhzdGQ6Om1vdmUobG9uZ19jb25zdGFudF9lbnVtKSk7Ci0gIH0KLSAgaWYgKCFzdHJpbmdfY29uc3RhbnRzLmVtcHR5KCkpIHsKLSAgICBpbmNsdWRlcy5pbnNlcnQoa1N0cmluZzE2SGVhZGVyKTsKLQotICAgIGZvciAoYXV0byYgc3RyaW5nX2NvbnN0YW50IDogc3RyaW5nX2NvbnN0YW50cykgewotICAgICAgY2xzLT5BZGRQdWJsaWMoc3RkOjptb3ZlKHN0cmluZ19jb25zdGFudCkpOworICAgICAgb3V0IDw8ICJlbnVtIDogIiA8PCBjcHBfdHlwZSA8PCAiIHsgIiA8PCBjb25zdGFudC0+R2V0TmFtZSgpOworICAgICAgR2VuZXJhdGVEZXByZWNhdGVkKG91dCwgKmNvbnN0YW50KTsKKyAgICAgIG91dCA8PCAiID0gIiA8PCBjb25zdGFudC0+VmFsdWVTdHJpbmcoQ29uc3RhbnRWYWx1ZURlY29yYXRvcikgPDwgIiB9O1xuIjsKICAgICB9CiAgIH0KIH0KIAotYm9vbCBIYW5kbGVTZXJ2ZXJUcmFuc2FjdGlvbihjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsIGNvbnN0IEFpZGxJbnRlcmZhY2UmIGludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbE1ldGhvZCYgbWV0aG9kLCBjb25zdCBPcHRpb25zJiBvcHRpb25zLCBTdGF0ZW1lbnRCbG9jayogYikgewordm9pZCBHZW5lcmF0ZVNlcnZlclRyYW5zYWN0aW9uKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbEludGVyZmFjZSYgaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxNZXRob2QmIG1ldGhvZCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgY29uc3Qgc3RyaW5nIGJuX25hbWUgPSBHZXRRdWFsaWZpZWROYW1lKGludGVyZmFjZSwgQ2xhc3NOYW1lczo6U0VSVkVSKTsKKwogICAvLyBEZWNsYXJlIGFsbCB0aGUgcGFyYW1ldGVycyBub3cuICBJbiB0aGUgY29tbW9uIGNhc2UsIHdlIGV4cGVjdCBubyBlcnJvcnMKICAgLy8gaW4gc2VyaWFsaXphdGlvbi4KICAgZm9yIChjb25zdCB1bmlxdWVfcHRyPEFpZGxBcmd1bWVudD4mIGEgOiBtZXRob2QuR2V0QXJndW1lbnRzKCkpIHsKLSAgICBiLT5BZGRMaXRlcmFsKFN0cmluZ1ByaW50ZigiJXMgJXMiLCBDcHBOYW1lT2YoYS0+R2V0VHlwZSgpLCB0eXBlbmFtZXMpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVpbGRWYXJOYW1lKCphKS5jX3N0cigpKSk7CisgICAgb3V0LldyaXRlKCIlcyAlcztcbiIsIENwcE5hbWVPZihhLT5HZXRUeXBlKCksIHR5cGVuYW1lcykuY19zdHIoKSwgQnVpbGRWYXJOYW1lKCphKS5jX3N0cigpKTsKICAgfQogCiAgIC8vIERlY2xhcmUgYSB2YXJpYWJsZSB0byBob2xkIHRoZSByZXR1cm4gdmFsdWUuCiAgIGlmIChtZXRob2QuR2V0VHlwZSgpLkdldE5hbWUoKSAhPSAidm9pZCIpIHsKLSAgICBzdHJpbmcgdHlwZSA9IENwcE5hbWVPZihtZXRob2QuR2V0VHlwZSgpLCB0eXBlbmFtZXMpOwotICAgIGItPkFkZExpdGVyYWwoU3RyaW5nUHJpbnRmKCIlcyAlcyIsIHR5cGUuY19zdHIoKSwga1JldHVyblZhck5hbWUpKTsKKyAgICBvdXQuV3JpdGUoIiVzICVzO1xuIiwgQ3BwTmFtZU9mKG1ldGhvZC5HZXRUeXBlKCksIHR5cGVuYW1lcykuY19zdHIoKSwga1JldHVyblZhck5hbWUpOwogICB9CiAKICAgLy8gQ2hlY2sgdGhhdCB0aGUgY2xpZW50IGlzIGNhbGxpbmcgdGhlIGNvcnJlY3QgaW50ZXJmYWNlLgotICBJZlN0YXRlbWVudCogaW50ZXJmYWNlX2NoZWNrID0gbmV3IElmU3RhdGVtZW50KAotICAgICAgbmV3IE1ldGhvZENhbGwoU3RyaW5nUHJpbnRmKCIlcy5jaGVja0ludGVyZmFjZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0RhdGFWYXJOYW1lKSwgInRoaXMiKSwKLSAgICAgIHRydWUgLyogaW52ZXJ0IHRoZSBjaGVjayAqLyk7Ci0gIGItPkFkZFN0YXRlbWVudChpbnRlcmZhY2VfY2hlY2spOwotICBpbnRlcmZhY2VfY2hlY2stPk9uVHJ1ZSgpLT5BZGRTdGF0ZW1lbnQoCi0gICAgICBuZXcgQXNzaWdubWVudChrQW5kcm9pZFN0YXR1c1Zhck5hbWUsICI6OmFuZHJvaWQ6OkJBRF9UWVBFIikpOwotICBpbnRlcmZhY2VfY2hlY2stPk9uVHJ1ZSgpLT5BZGRMaXRlcmFsKCJicmVhayIpOworICBvdXQuV3JpdGUoImlmICghKCVzLmNoZWNrSW50ZXJmYWNlKHRoaXMpKSkge1xuIiwga0RhdGFWYXJOYW1lKTsKKyAgb3V0LldyaXRlKCIgICVzID0gOjphbmRyb2lkOjpCQURfVFlQRTtcbiIsIGtBbmRyb2lkU3RhdHVzVmFyTmFtZSk7CisgIG91dC5Xcml0ZSgiICBicmVhaztcbiIpOworICBvdXQuV3JpdGUoIn1cbiIpOwogCiAgIGlmIChvcHRpb25zLkdlblRyYWNlcygpKSB7Ci0gICAgYi0+QWRkTGl0ZXJhbCgKLSAgICAgICAgU3RyaW5nUHJpbnRmKCI6OmFuZHJvaWQ6OlNjb3BlZFRyYWNlICVzKEFUUkFDRV9UQUdfQUlETCwgXCJBSURMOjpjcHA6OiVzOjolczo6Y3BwU2VydmVyXCIpIiwKLSAgICAgICAgICAgICAgICAgICAgIGtUcmFjZVZhck5hbWUsIGludGVyZmFjZS5HZXROYW1lKCkuY19zdHIoKSwgbWV0aG9kLkdldE5hbWUoKS5jX3N0cigpKSk7CisgICAgb3V0LldyaXRlKCI6OmFuZHJvaWQ6OlNjb3BlZFRyYWNlICVzKEFUUkFDRV9UQUdfQUlETCwgXCJBSURMOjpjcHA6OiVzOjolczo6Y3BwU2VydmVyXCIpO1xuIiwKKyAgICAgICAgICAgICAga1RyYWNlVmFyTmFtZSwgaW50ZXJmYWNlLkdldE5hbWUoKS5jX3N0cigpLCBtZXRob2QuR2V0TmFtZSgpLmNfc3RyKCkpOworICB9CisKKyAgaWYgKGludGVyZmFjZS5FbmZvcmNlRXhwcmVzc2lvbigpIHx8IG1ldGhvZC5HZXRUeXBlKCkuRW5mb3JjZUV4cHJlc3Npb24oKSkgeworICAgIG91dC5Xcml0ZSgiI2Vycm9yIFBlcm1pc3Npb24gY2hlY2tzIG5vdCBpbXBsZW1lbnRlZCBmb3IgdGhlIGNwcCBiYWNrZW5kXG4iKTsKICAgfQogCiAgIC8vIERlc2VyaWFsaXplIGVhY2ggImluIiBwYXJhbWV0ZXIgdG8gdGhlIHRyYW5zYWN0aW9uLgpAQCAtNjE4LDExMSArNDgwLDE1OCBAQAogICAgIC8vICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSA6OmFuZHJvaWQ6Ok9LKSB7IGJyZWFrOyB9CiAgICAgY29uc3Qgc3RyaW5nJiB2YXJfbmFtZSA9ICImIiArIEJ1aWxkVmFyTmFtZSgqYSk7CiAgICAgaWYgKGEtPklzSW4oKSkgewotICAgICAgY29uc3Qgc3RyaW5nJiByZWFkTWV0aG9kID0gUGFyY2VsUmVhZE1ldGhvZE9mKGEtPkdldFR5cGUoKSwgdHlwZW5hbWVzKTsKLSAgICAgIGItPkFkZFN0YXRlbWVudCgKLSAgICAgICAgICBuZXcgQXNzaWdubWVudHtrQW5kcm9pZFN0YXR1c1Zhck5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE1ldGhvZENhbGx7c3RyaW5nKGtEYXRhVmFyTmFtZSkgKyAiLiIgKyByZWFkTWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbFJlYWRDYXN0T2YoYS0+R2V0VHlwZSgpLCB0eXBlbmFtZXMsIHZhcl9uYW1lKX19KTsKLSAgICAgIGItPkFkZFN0YXRlbWVudChCcmVha09uU3RhdHVzTm90T2soKSk7Ci0gICAgfSBlbHNlIGlmIChhLT5Jc091dCgpICYmIGEtPkdldFR5cGUoKS5Jc0FycmF5KCkpIHsKKyAgICAgIG91dC5Xcml0ZSgiJXMgPSAlcy4lcyglcyk7XG4iLCBrQW5kcm9pZFN0YXR1c1Zhck5hbWUsIGtEYXRhVmFyTmFtZSwKKyAgICAgICAgICAgICAgICBQYXJjZWxSZWFkTWV0aG9kT2YoYS0+R2V0VHlwZSgpLCB0eXBlbmFtZXMpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgUGFyY2VsUmVhZENhc3RPZihhLT5HZXRUeXBlKCksIHR5cGVuYW1lcywgdmFyX25hbWUpLmNfc3RyKCkpOworICAgICAgR2VuZXJhdGVCcmVha09uU3RhdHVzTm90T2sob3V0KTsKKyAgICB9IGVsc2UgaWYgKGEtPklzT3V0KCkgJiYgYS0+R2V0VHlwZSgpLklzRHluYW1pY0FycmF5KCkpIHsKICAgICAgIC8vIFNwZWNpYWwgY2FzZSwgdGhlIGxlbmd0aCBvZiB0aGUgb3V0IGFycmF5IGlzIHdyaXR0ZW4gaW50byB0aGUgcGFyY2VsLgogICAgICAgLy8gICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLnJlc2l6ZU91dFZlY3Rvcigmb3V0X3BhcmFtX25hbWUpOwogICAgICAgLy8gICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IDo6YW5kcm9pZDo6T0spIHsgYnJlYWs7IH0KLSAgICAgIGItPkFkZFN0YXRlbWVudCgKLSAgICAgICAgICBuZXcgQXNzaWdubWVudHtrQW5kcm9pZFN0YXR1c1Zhck5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE1ldGhvZENhbGx7c3RyaW5nKGtEYXRhVmFyTmFtZSkgKyAiLnJlc2l6ZU91dFZlY3RvciIsIHZhcl9uYW1lfX0pOwotICAgICAgYi0+QWRkU3RhdGVtZW50KEJyZWFrT25TdGF0dXNOb3RPaygpKTsKKyAgICAgIG91dC5Xcml0ZSgiJXMgPSAlcy5yZXNpemVPdXRWZWN0b3IoJXMpO1xuIiwga0FuZHJvaWRTdGF0dXNWYXJOYW1lLCBrRGF0YVZhck5hbWUsCisgICAgICAgICAgICAgICAgdmFyX25hbWUuY19zdHIoKSk7CisgICAgICBHZW5lcmF0ZUJyZWFrT25TdGF0dXNOb3RPayhvdXQpOwogICAgIH0KICAgfQogCi0gIGNvbnN0IHN0cmluZyBibl9uYW1lID0gQ2xhc3NOYW1lKGludGVyZmFjZSwgQ2xhc3NOYW1lczo6U0VSVkVSKTsKICAgaWYgKG9wdGlvbnMuR2VuTG9nKCkpIHsKLSAgICBiLT5BZGRMaXRlcmFsKEdlbkxvZ0JlZm9yZUV4ZWN1dGUoYm5fbmFtZSwgbWV0aG9kLCB0cnVlIC8qIGlzU2VydmVyICovLCBmYWxzZSAvKiBpc05kayAqLyksCi0gICAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgb3V0IDw8IEdlbkxvZ0JlZm9yZUV4ZWN1dGUoYm5fbmFtZSwgbWV0aG9kLCB0cnVlIC8qIGlzU2VydmVyICovLCBmYWxzZSAvKiBpc05kayAqLyk7CiAgIH0KKworICBpZiAoIW1ldGhvZC5HZXRBcmd1bWVudHMoKS5lbXB0eSgpICYmIG9wdGlvbnMuR2V0TWluU2RrVmVyc2lvbigpID49IFNES19WRVJTSU9OX1RpcmFtaXN1KSB7CisgICAgb3V0IDw8ICJpZiAoYXV0byBzdCA9IF9haWRsX2RhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7ICFzdC5pc09rKCkpIHtcbiI7CisgICAgb3V0IDw8ICIgIF9haWRsX3JldF9zdGF0dXMgPSBzdC53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTtcbiI7CisgICAgb3V0IDw8ICIgIGJyZWFrO1xuIjsKKyAgICBvdXQgPDwgIn1cbiI7CisgIH0KKwogICAvLyBDYWxsIHRoZSBhY3R1YWwgbWV0aG9kLiAgVGhpcyBpcyBpbXBsZW1lbnRlZCBieSB0aGUgc3ViY2xhc3MuCi0gIHZlY3Rvcjx1bmlxdWVfcHRyPEFzdE5vZGU+PiBzdGF0dXNfYXJnczsKLSAgc3RhdHVzX2FyZ3MuZW1wbGFjZV9iYWNrKG5ldyBNZXRob2RDYWxsKAotICAgICAgbWV0aG9kLkdldE5hbWUoKSwgQnVpbGRBcmdMaXN0KHR5cGVuYW1lcywgbWV0aG9kLCBmYWxzZSAvKiBub3QgZm9yIG1ldGhvZCBkZWNsICovKSkpOwotICBiLT5BZGRTdGF0ZW1lbnQobmV3IFN0YXRlbWVudChuZXcgTWV0aG9kQ2FsbCgKLSAgICAgIFN0cmluZ1ByaW50ZigiJXMgJXMiLCBrQmluZGVyU3RhdHVzTGl0ZXJhbCwga1N0YXR1c1Zhck5hbWUpLAotICAgICAgQXJnTGlzdChzdGQ6Om1vdmUoc3RhdHVzX2FyZ3MpKSkpKTsKKyAgb3V0LldyaXRlKCIlcyAlcyglcyglcykpO1xuIiwga0JpbmRlclN0YXR1c0xpdGVyYWwsIGtTdGF0dXNWYXJOYW1lLCBtZXRob2QuR2V0TmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgICBHZW5lcmF0ZUFyZ0xpc3QodHlwZW5hbWVzLCBtZXRob2QsIC8qZm9yX2RlY2xhcmF0aW9uPSovZmFsc2UsIC8qdHlwZV9uYW1lX29ubHk9Ki9mYWxzZSkKKyAgICAgICAgICAgICAgICAuY19zdHIoKSk7CiAKICAgaWYgKG9wdGlvbnMuR2VuTG9nKCkpIHsKLSAgICBiLT5BZGRMaXRlcmFsKEdlbkxvZ0FmdGVyRXhlY3V0ZShibl9uYW1lLCBpbnRlcmZhY2UsIG1ldGhvZCwga1N0YXR1c1Zhck5hbWUsIGtSZXR1cm5WYXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogaXNTZXJ2ZXIgKi8sIGZhbHNlIC8qIGlzTmRrICovKSwKLSAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICBvdXQgPDwgR2VuTG9nQWZ0ZXJFeGVjdXRlKGJuX25hbWUsIGludGVyZmFjZSwgbWV0aG9kLCBrU3RhdHVzVmFyTmFtZSwga1JldHVyblZhck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGlzU2VydmVyICovLCBmYWxzZSAvKiBpc05kayAqLyk7CiAgIH0KIAogICAvLyBXcml0ZSBleGNlcHRpb25zIGR1cmluZyB0cmFuc2FjdGlvbiBoYW5kbGluZyB0byBwYXJjZWwuCiAgIGlmICghbWV0aG9kLklzT25ld2F5KCkpIHsKLSAgICBiLT5BZGRTdGF0ZW1lbnQobmV3IEFzc2lnbm1lbnQoCi0gICAgICAgIGtBbmRyb2lkU3RhdHVzVmFyTmFtZSwKLSAgICAgICAgU3RyaW5nUHJpbnRmKCIlcy53cml0ZVRvUGFyY2VsKCVzKSIsIGtTdGF0dXNWYXJOYW1lLCBrUmVwbHlWYXJOYW1lKSkpOwotICAgIGItPkFkZFN0YXRlbWVudChCcmVha09uU3RhdHVzTm90T2soKSk7Ci0gICAgSWZTdGF0ZW1lbnQqIGV4Y2VwdGlvbl9jaGVjayA9IG5ldyBJZlN0YXRlbWVudCgKLSAgICAgICAgbmV3IExpdGVyYWxFeHByZXNzaW9uKFN0cmluZ1ByaW50ZigiISVzLmlzT2soKSIsIGtTdGF0dXNWYXJOYW1lKSkpOwotICAgIGItPkFkZFN0YXRlbWVudChleGNlcHRpb25fY2hlY2spOwotICAgIGV4Y2VwdGlvbl9jaGVjay0+T25UcnVlKCktPkFkZExpdGVyYWwoImJyZWFrIik7CisgICAgb3V0LldyaXRlKCIlcyA9ICVzLndyaXRlVG9QYXJjZWwoJXMpO1xuIiwga0FuZHJvaWRTdGF0dXNWYXJOYW1lLCBrU3RhdHVzVmFyTmFtZSwga1JlcGx5VmFyTmFtZSk7CisgICAgR2VuZXJhdGVCcmVha09uU3RhdHVzTm90T2sob3V0KTsKKyAgICBvdXQuV3JpdGUoImlmICghJXMuaXNPaygpKSB7XG4iLCBrU3RhdHVzVmFyTmFtZSk7CisgICAgb3V0LldyaXRlKCIgIGJyZWFrO1xuIik7CisgICAgb3V0LldyaXRlKCJ9XG4iKTsKICAgfQogCiAgIC8vIElmIHdlIGhhdmUgYSByZXR1cm4gdmFsdWUsIHdyaXRlIGl0IGZpcnN0LgogICBpZiAobWV0aG9kLkdldFR5cGUoKS5HZXROYW1lKCkgIT0gInZvaWQiKSB7Ci0gICAgc3RyaW5nIHdyaXRlTWV0aG9kID0KLSAgICAgICAgc3RyaW5nKGtSZXBseVZhck5hbWUpICsgIi0+IiArIFBhcmNlbFdyaXRlTWV0aG9kT2YobWV0aG9kLkdldFR5cGUoKSwgdHlwZW5hbWVzKTsKLSAgICBiLT5BZGRTdGF0ZW1lbnQobmV3IEFzc2lnbm1lbnQoCi0gICAgICAgIGtBbmRyb2lkU3RhdHVzVmFyTmFtZSwKLSAgICAgICAgbmV3IE1ldGhvZENhbGwod3JpdGVNZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbFdyaXRlQ2FzdE9mKG1ldGhvZC5HZXRUeXBlKCksIHR5cGVuYW1lcywga1JldHVyblZhck5hbWUpKSkpOwotICAgIGItPkFkZFN0YXRlbWVudChCcmVha09uU3RhdHVzTm90T2soKSk7CisgICAgb3V0LldyaXRlKCIlcyA9ICVzLT4lcyglcyk7XG4iLCBrQW5kcm9pZFN0YXR1c1Zhck5hbWUsIGtSZXBseVZhck5hbWUsCisgICAgICAgICAgICAgIFBhcmNlbFdyaXRlTWV0aG9kT2YobWV0aG9kLkdldFR5cGUoKSwgdHlwZW5hbWVzKS5jX3N0cigpLAorICAgICAgICAgICAgICBQYXJjZWxXcml0ZUNhc3RPZihtZXRob2QuR2V0VHlwZSgpLCB0eXBlbmFtZXMsIGtSZXR1cm5WYXJOYW1lKS5jX3N0cigpKTsKKyAgICBHZW5lcmF0ZUJyZWFrT25TdGF0dXNOb3RPayhvdXQpOwogICB9CiAgIC8vIFdyaXRlIGVhY2ggb3V0IHBhcmFtZXRlciB0byB0aGUgcmVwbHkgcGFyY2VsLgogICBmb3IgKGNvbnN0IEFpZGxBcmd1bWVudCogYSA6IG1ldGhvZC5HZXRPdXRBcmd1bWVudHMoKSkgewogICAgIC8vIFNlcmlhbGl6YXRpb24gbG9va3Mgcm91Z2hseSBsaWtlOgogICAgIC8vICAgICBfYWlkbF9yZXRfc3RhdHVzID0gZGF0YS5Xcml0ZUludDMyKG91dF9wYXJhbV9uYW1lKTsKICAgICAvLyAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gOjphbmRyb2lkOjpPSykgeyBicmVhazsgfQotICAgIGNvbnN0IHN0cmluZyYgd3JpdGVNZXRob2QgPSBQYXJjZWxXcml0ZU1ldGhvZE9mKGEtPkdldFR5cGUoKSwgdHlwZW5hbWVzKTsKLSAgICBiLT5BZGRTdGF0ZW1lbnQobmV3IEFzc2lnbm1lbnQoCi0gICAgICAgIGtBbmRyb2lkU3RhdHVzVmFyTmFtZSwKLSAgICAgICAgbmV3IE1ldGhvZENhbGwoc3RyaW5nKGtSZXBseVZhck5hbWUpICsgIi0+IiArIHdyaXRlTWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWxXcml0ZUNhc3RPZihhLT5HZXRUeXBlKCksIHR5cGVuYW1lcywgQnVpbGRWYXJOYW1lKCphKSkpKSk7Ci0gICAgYi0+QWRkU3RhdGVtZW50KEJyZWFrT25TdGF0dXNOb3RPaygpKTsKKyAgICBvdXQuV3JpdGUoIiVzID0gJXMtPiVzKCVzKTtcbiIsIGtBbmRyb2lkU3RhdHVzVmFyTmFtZSwga1JlcGx5VmFyTmFtZSwKKyAgICAgICAgICAgICAgUGFyY2VsV3JpdGVNZXRob2RPZihhLT5HZXRUeXBlKCksIHR5cGVuYW1lcykuY19zdHIoKSwKKyAgICAgICAgICAgICAgUGFyY2VsV3JpdGVDYXN0T2YoYS0+R2V0VHlwZSgpLCB0eXBlbmFtZXMsIEJ1aWxkVmFyTmFtZSgqYSkpLmNfc3RyKCkpOworICAgIEdlbmVyYXRlQnJlYWtPblN0YXR1c05vdE9rKG91dCk7CiAgIH0KLQotICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBIYW5kbGVTZXJ2ZXJNZXRhVHJhbnNhY3Rpb24oY29uc3QgQWlkbFR5cGVuYW1lcyYsIGNvbnN0IEFpZGxJbnRlcmZhY2UmIGludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxNZXRob2QmIG1ldGhvZCwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlbWVudEJsb2NrKiBiKSB7Cit2b2lkIEdlbmVyYXRlU2VydmVyTWV0YVRyYW5zYWN0aW9uKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbEludGVyZmFjZSYgaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsTWV0aG9kJiBtZXRob2QsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKICAgQUlETF9GQVRBTF9JRihtZXRob2QuSXNVc2VyRGVmaW5lZCgpLCBtZXRob2QpOwogCisgIHN0cmluZyBpZmFjZSA9IENsYXNzTmFtZShpbnRlcmZhY2UsIENsYXNzTmFtZXM6OklOVEVSRkFDRSk7CiAgIGlmIChtZXRob2QuR2V0TmFtZSgpID09IGtHZXRJbnRlcmZhY2VWZXJzaW9uICYmIG9wdGlvbnMuVmVyc2lvbigpID4gMCkgewotICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBjb2RlOwotICAgIGNvZGUgPDwgIl9haWRsX2RhdGEuY2hlY2tJbnRlcmZhY2UodGhpcyk7XG4iCi0gICAgICAgICA8PCAiX2FpZGxfcmVwbHktPndyaXRlTm9FeGNlcHRpb24oKTtcbiIKLSAgICAgICAgIDw8ICJfYWlkbF9yZXBseS0+d3JpdGVJbnQzMigiIDw8IENsYXNzTmFtZShpbnRlcmZhY2UsIENsYXNzTmFtZXM6OklOVEVSRkFDRSkKLSAgICAgICAgIDw8ICI6OlZFUlNJT04pIjsKLSAgICBiLT5BZGRMaXRlcmFsKGNvZGUuc3RyKCkpOwotICAgIHJldHVybiB0cnVlOworICAgIG91dCA8PCAiX2FpZGxfZGF0YS5jaGVja0ludGVyZmFjZSh0aGlzKTtcbiIKKyAgICAgICAgPDwgIl9haWRsX3JlcGx5LT53cml0ZU5vRXhjZXB0aW9uKCk7XG4iCisgICAgICAgIDw8ICJfYWlkbF9yZXBseS0+d3JpdGVJbnQzMigiIDw8IGlmYWNlIDw8ICI6OlZFUlNJT04pO1xuIjsKICAgfQogICBpZiAobWV0aG9kLkdldE5hbWUoKSA9PSBrR2V0SW50ZXJmYWNlSGFzaCAmJiAhb3B0aW9ucy5IYXNoKCkuZW1wdHkoKSkgewotICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBjb2RlOwotICAgIGNvZGUgPDwgIl9haWRsX2RhdGEuY2hlY2tJbnRlcmZhY2UodGhpcyk7XG4iCi0gICAgICAgICA8PCAiX2FpZGxfcmVwbHktPndyaXRlTm9FeGNlcHRpb24oKTtcbiIKLSAgICAgICAgIDw8ICJfYWlkbF9yZXBseS0+d3JpdGVVdGY4QXNVdGYxNigiIDw8IENsYXNzTmFtZShpbnRlcmZhY2UsIENsYXNzTmFtZXM6OklOVEVSRkFDRSkKLSAgICAgICAgIDw8ICI6OkhBU0gpIjsKLSAgICBiLT5BZGRMaXRlcmFsKGNvZGUuc3RyKCkpOwotICAgIHJldHVybiB0cnVlOworICAgIG91dCA8PCAiX2FpZGxfZGF0YS5jaGVja0ludGVyZmFjZSh0aGlzKTtcbiIKKyAgICAgICAgPDwgIl9haWRsX3JlcGx5LT53cml0ZU5vRXhjZXB0aW9uKCk7XG4iCisgICAgICAgIDw8ICJfYWlkbF9yZXBseS0+d3JpdGVVdGY4QXNVdGYxNigiIDw8IGlmYWNlIDw8ICI6OkhBU0gpO1xuIjsKICAgfQotICByZXR1cm4gZmFsc2U7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZQogCi11bmlxdWVfcHRyPERvY3VtZW50PiBCdWlsZFNlcnZlclNvdXJjZShjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsSW50ZXJmYWNlJiBpbnRlcmZhY2UsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKK3ZvaWQgR2VuZXJhdGVTZXJ2ZXJPblRyYW5zYWN0KENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbEludGVyZmFjZSYgaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CiAgIGNvbnN0IHN0cmluZyBibl9uYW1lID0gQ2xhc3NOYW1lKGludGVyZmFjZSwgQ2xhc3NOYW1lczo6U0VSVkVSKTsKKyAgY29uc3Qgc3RyaW5nIHFfbmFtZSA9IEdldFF1YWxpZmllZE5hbWUoaW50ZXJmYWNlLCBDbGFzc05hbWVzOjpTRVJWRVIpOworCisgIGJvb2wgZGVwcmVjYXRlZCA9IGludGVyZmFjZS5Jc0RlcHJlY2F0ZWQoKSB8fAorICAgICAgICAgICAgICAgICAgICBzdGQ6OmFueV9vZihpbnRlcmZhY2UuR2V0TWV0aG9kcygpLmJlZ2luKCksIGludGVyZmFjZS5HZXRNZXRob2RzKCkuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKGNvbnN0IGF1dG8mIG0pIHsgcmV0dXJuIG0tPklzRGVwcmVjYXRlZCgpOyB9KTsKKyAgaWYgKGRlcHJlY2F0ZWQpIHsKKyAgICBvdXQgPDwgIiNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoXG4iOworICAgIG91dCA8PCAiI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgXCItV2RlcHJlY2F0ZWRcIlxuIjsKKyAgICBvdXQgPDwgIlxuIjsKKyAgfQorCisgIG91dC5Xcml0ZSgiJXMgJXM6Om9uVHJhbnNhY3QodWludDMyX3QgJXMsIGNvbnN0ICVzJiAlcywgJXMqICVzLCB1aW50MzJfdCAlcykge1xuIiwKKyAgICAgICAgICAgIGtBbmRyb2lkU3RhdHVzTGl0ZXJhbCwgcV9uYW1lLmNfc3RyKCksIGtDb2RlVmFyTmFtZSwga0FuZHJvaWRQYXJjZWxMaXRlcmFsLAorICAgICAgICAgICAga0RhdGFWYXJOYW1lLCBrQW5kcm9pZFBhcmNlbExpdGVyYWwsIGtSZXBseVZhck5hbWUsIGtGbGFnc1Zhck5hbWUpOworICBvdXQuSW5kZW50KCk7CisgIC8vIERlY2xhcmUgdGhlIHN0YXR1c190IHZhcmlhYmxlCisgIG91dC5Xcml0ZSgiJXMgJXMgPSAlcztcbiIsIGtBbmRyb2lkU3RhdHVzTGl0ZXJhbCwga0FuZHJvaWRTdGF0dXNWYXJOYW1lLCBrQW5kcm9pZFN0YXR1c09rKTsKKworICAvLyBBZGQgdGhlIGFsbCBpbXBvcnRhbnQgc3dpdGNoIHN0YXRlbWVudAorICBvdXQuV3JpdGUoInN3aXRjaCAoJXMpIHtcbiIsIGtDb2RlVmFyTmFtZSk7CisKKyAgLy8gVGhlIHN3aXRjaCBzdGF0ZW1lbnQgaGFzIGEgY2FzZSBzdGF0ZW1lbnQgZm9yIGVhY2ggdHJhbnNhY3Rpb24gY29kZS4KKyAgZm9yIChjb25zdCBhdXRvJiBtZXRob2QgOiBpbnRlcmZhY2UuR2V0TWV0aG9kcygpKSB7CisgICAgb3V0LldyaXRlKCJjYXNlICVzOlxuIiwgR2V0VHJhbnNhY3Rpb25JZEZvcihibl9uYW1lLCAqbWV0aG9kKS5jX3N0cigpKTsKKyAgICBvdXQgPDwgIntcbiI7CisgICAgb3V0LkluZGVudCgpOworICAgIGlmIChtZXRob2QtPklzVXNlckRlZmluZWQoKSkgeworICAgICAgR2VuZXJhdGVTZXJ2ZXJUcmFuc2FjdGlvbihvdXQsIGludGVyZmFjZSwgKm1ldGhvZCwgdHlwZW5hbWVzLCBvcHRpb25zKTsKKyAgICB9IGVsc2UgeworICAgICAgR2VuZXJhdGVTZXJ2ZXJNZXRhVHJhbnNhY3Rpb24ob3V0LCBpbnRlcmZhY2UsICptZXRob2QsIG9wdGlvbnMpOworICAgIH0KKyAgICBvdXQuRGVkZW50KCk7CisgICAgb3V0IDw8ICJ9XG4iOworICAgIG91dCA8PCAiYnJlYWs7XG4iOworICB9CisKKyAgLy8gVGhlIHN3aXRjaCBzdGF0ZW1lbnQgaGFzIGEgZGVmYXVsdCBjYXNlIHdoaWNoIGRlZmVycyB0byB0aGUgc3VwZXIgY2xhc3MuCisgIC8vIFRoZSBzdXBlcmNsYXNzIGhhbmRsZXMgYSBmZXcgcHJlLWRlZmluZWQgdHJhbnNhY3Rpb25zLgorICBvdXQgPDwgImRlZmF1bHQ6XG4iOworICBvdXQgPDwgIntcbiI7CisgIG91dC5Xcml0ZSgiICAlcyA9IDo6YW5kcm9pZDo6QkJpbmRlcjo6b25UcmFuc2FjdCglcywgJXMsICVzLCAlcyk7XG4iLCBrQW5kcm9pZFN0YXR1c1Zhck5hbWUsCisgICAgICAgICAgICBrQ29kZVZhck5hbWUsIGtEYXRhVmFyTmFtZSwga1JlcGx5VmFyTmFtZSwga0ZsYWdzVmFyTmFtZSk7CisgIG91dCA8PCAifVxuIjsKKyAgb3V0IDw8ICJicmVhaztcbiI7CisgIG91dCA8PCAifVxuIjsgIC8vIHN3aXRjaAorCisgIC8vIElmIHdlIHNhdyBhIG51bGwgcmVmZXJlbmNlLCB3ZSBjYW4gbWFwIHRoYXQgdG8gYW4gYXBwcm9wcmlhdGUgZXhjZXB0aW9uLgorICBvdXQuV3JpdGUoImlmICglcyA9PSA6OmFuZHJvaWQ6OlVORVhQRUNURURfTlVMTCkge1xuIiwga0FuZHJvaWRTdGF0dXNWYXJOYW1lKTsKKyAgb3V0LldyaXRlKCIgICVzID0gJXM6OmZyb21FeGNlcHRpb25Db2RlKCVzOjpFWF9OVUxMX1BPSU5URVIpLndyaXRlT3ZlclBhcmNlbCglcyk7XG4iLAorICAgICAgICAgICAga0FuZHJvaWRTdGF0dXNWYXJOYW1lLCBrQmluZGVyU3RhdHVzTGl0ZXJhbCwga0JpbmRlclN0YXR1c0xpdGVyYWwsIGtSZXBseVZhck5hbWUpOworICBvdXQuV3JpdGUoIn1cbiIpOworCisgIC8vIEZpbmFsbHksIHRoZSBzZXJ2ZXIncyBvblRyYW5zYWN0IG1ldGhvZCBqdXN0IHJldHVybnMgYSBzdGF0dXMgY29kZS4KKyAgb3V0LldyaXRlKCJyZXR1cm4gJXM7XG4iLCBrQW5kcm9pZFN0YXR1c1Zhck5hbWUpOworCisgIG91dC5EZWRlbnQoKTsKKyAgb3V0IDw8ICJ9XG4iOworICBvdXQgPDwgIlxuIjsKKworICBpZiAoZGVwcmVjYXRlZCkgeworICAgIG91dCA8PCAiI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcFxuIjsKKyAgICBvdXQgPDwgIlxuIjsKKyAgfQorfQorCit2b2lkIEdlbmVyYXRlU2VydmVyU291cmNlKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbEludGVyZmFjZSYgaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKICAgdmVjdG9yPHN0cmluZz4gaW5jbHVkZV9saXN0ewogICAgICAgSGVhZGVyRmlsZShpbnRlcmZhY2UsIENsYXNzTmFtZXM6OlNFUlZFUiwgZmFsc2UpLAogICAgICAga1BhcmNlbEhlYWRlciwKQEAgLTczMiwzMjcgKzY0MSwyOTggQEAKICAgICBpbmNsdWRlX2xpc3QuZW1wbGFjZV9iYWNrKCJjaHJvbm8iKTsKICAgICBpbmNsdWRlX2xpc3QuZW1wbGFjZV9iYWNrKCJmdW5jdGlvbmFsIik7CiAgIH0KLQotICB1bmlxdWVfcHRyPENvbnN0cnVjdG9ySW1wbD4gY29uc3RydWN0b3J7bmV3IENvbnN0cnVjdG9ySW1wbHtibl9uYW1lLCBBcmdMaXN0e30sIHt9fX07Ci0KLSAgaWYgKGludGVyZmFjZS5Jc1ZpbnRmU3RhYmlsaXR5KCkpIHsKLSAgICBjb25zdHJ1Y3Rvci0+R2V0U3RhdGVtZW50QmxvY2soKS0+QWRkTGl0ZXJhbCgiOjphbmRyb2lkOjppbnRlcm5hbDo6U3RhYmlsaXR5OjptYXJrVmludGYodGhpcykiKTsKLSAgfSBlbHNlIHsKLSAgICBjb25zdHJ1Y3Rvci0+R2V0U3RhdGVtZW50QmxvY2soKS0+QWRkTGl0ZXJhbCgKLSAgICAgICAgIjo6YW5kcm9pZDo6aW50ZXJuYWw6OlN0YWJpbGl0eTo6bWFya0NvbXBpbGF0aW9uVW5pdCh0aGlzKSIpOworICBmb3IgKGNvbnN0IGF1dG8mIGluY2x1ZGUgOiBpbmNsdWRlX2xpc3QpIHsKKyAgICBvdXQgPDwgIiNpbmNsdWRlIDwiIDw8IGluY2x1ZGUgPDwgIj5cbiI7CiAgIH0KKyAgb3V0IDw8ICJcbiI7CiAKLSAgdW5pcXVlX3B0cjxNZXRob2RJbXBsPiBvbl90cmFuc2FjdHsKLSAgICAgIG5ldyBNZXRob2RJbXBse2tBbmRyb2lkU3RhdHVzTGl0ZXJhbCwKLSAgICAgICAgICAgICAgICAgICAgIGJuX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAib25UcmFuc2FjdCIsCi0gICAgICAgICAgICAgICAgICAgICB7fSwKLSAgICAgICAgICAgICAgICAgICAgIEFyZ0xpc3R7e1N0cmluZ1ByaW50ZigidWludDMyX3QgJXMiLCBrQ29kZVZhck5hbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUHJpbnRmKCJjb25zdCAlcyYgJXMiLCBrQW5kcm9pZFBhcmNlbExpdGVyYWwsIGtEYXRhVmFyTmFtZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQcmludGYoIiVzKiAlcyIsIGtBbmRyb2lkUGFyY2VsTGl0ZXJhbCwga1JlcGx5VmFyTmFtZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQcmludGYoInVpbnQzMl90ICVzIiwga0ZsYWdzVmFyTmFtZSl9fX19OwotCi0gIC8vIERlY2xhcmUgdGhlIHN0YXR1c190IHZhcmlhYmxlCi0gIG9uX3RyYW5zYWN0LT5HZXRTdGF0ZW1lbnRCbG9jaygpLT5BZGRMaXRlcmFsKAotICAgICAgU3RyaW5nUHJpbnRmKCIlcyAlcyA9ICVzIiwga0FuZHJvaWRTdGF0dXNMaXRlcmFsLCBrQW5kcm9pZFN0YXR1c1Zhck5hbWUsCi0gICAgICAgICAgICAgICAgICAga0FuZHJvaWRTdGF0dXNPaykpOwotCi0gIC8vIEFkZCB0aGUgYWxsIGltcG9ydGFudCBzd2l0Y2ggc3RhdGVtZW50LCBidXQgcmV0YWluIGEgcG9pbnRlciB0byBpdC4KLSAgU3dpdGNoU3RhdGVtZW50KiBzID0gbmV3IFN3aXRjaFN0YXRlbWVudHtrQ29kZVZhck5hbWV9OwotICBvbl90cmFuc2FjdC0+R2V0U3RhdGVtZW50QmxvY2soKS0+QWRkU3RhdGVtZW50KHMpOwotCi0gIC8vIFRoZSBzd2l0Y2ggc3RhdGVtZW50IGhhcyBhIGNhc2Ugc3RhdGVtZW50IGZvciBlYWNoIHRyYW5zYWN0aW9uIGNvZGUuCi0gIGZvciAoY29uc3QgYXV0byYgbWV0aG9kIDogaW50ZXJmYWNlLkdldE1ldGhvZHMoKSkgewotICAgIFN0YXRlbWVudEJsb2NrKiBiID0gcy0+QWRkQ2FzZShHZXRUcmFuc2FjdGlvbklkRm9yKGludGVyZmFjZSwgKm1ldGhvZCkpOwotICAgIGlmICghYikgeyByZXR1cm4gbnVsbHB0cjsgfQotCi0gICAgYm9vbCBzdWNjZXNzID0gZmFsc2U7Ci0gICAgaWYgKG1ldGhvZC0+SXNVc2VyRGVmaW5lZCgpKSB7Ci0gICAgICBzdWNjZXNzID0gSGFuZGxlU2VydmVyVHJhbnNhY3Rpb24odHlwZW5hbWVzLCBpbnRlcmZhY2UsICptZXRob2QsIG9wdGlvbnMsIGIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBzdWNjZXNzID0gSGFuZGxlU2VydmVyTWV0YVRyYW5zYWN0aW9uKHR5cGVuYW1lcywgaW50ZXJmYWNlLCAqbWV0aG9kLCBvcHRpb25zLCBiKTsKLSAgICB9Ci0gICAgaWYgKCFzdWNjZXNzKSB7Ci0gICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0gIH0KLQotICAvLyBUaGUgc3dpdGNoIHN0YXRlbWVudCBoYXMgYSBkZWZhdWx0IGNhc2Ugd2hpY2ggZGVmZXJzIHRvIHRoZSBzdXBlciBjbGFzcy4KLSAgLy8gVGhlIHN1cGVyY2xhc3MgaGFuZGxlcyBhIGZldyBwcmUtZGVmaW5lZCB0cmFuc2FjdGlvbnMuCi0gIFN0YXRlbWVudEJsb2NrKiBiID0gcy0+QWRkQ2FzZSgiIik7Ci0gIGItPkFkZExpdGVyYWwoU3RyaW5nUHJpbnRmKAotICAgICAgICAgICAgICAgICIlcyA9IDo6YW5kcm9pZDo6QkJpbmRlcjo6b25UcmFuc2FjdCglcywgJXMsICIKLSAgICAgICAgICAgICAgICAiJXMsICVzKSIsIGtBbmRyb2lkU3RhdHVzVmFyTmFtZSwga0NvZGVWYXJOYW1lLAotICAgICAgICAgICAgICAgIGtEYXRhVmFyTmFtZSwga1JlcGx5VmFyTmFtZSwga0ZsYWdzVmFyTmFtZSkpOwotCi0gIC8vIElmIHdlIHNhdyBhIG51bGwgcmVmZXJlbmNlLCB3ZSBjYW4gbWFwIHRoYXQgdG8gYW4gYXBwcm9wcmlhdGUgZXhjZXB0aW9uLgotICBJZlN0YXRlbWVudCogbnVsbF9jaGVjayA9IG5ldyBJZlN0YXRlbWVudCgKLSAgICAgIG5ldyBMaXRlcmFsRXhwcmVzc2lvbihzdHJpbmcoa0FuZHJvaWRTdGF0dXNWYXJOYW1lKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiA9PSA6OmFuZHJvaWQ6OlVORVhQRUNURURfTlVMTCIpKTsKLSAgb25fdHJhbnNhY3QtPkdldFN0YXRlbWVudEJsb2NrKCktPkFkZFN0YXRlbWVudChudWxsX2NoZWNrKTsKLSAgbnVsbF9jaGVjay0+T25UcnVlKCktPkFkZFN0YXRlbWVudChuZXcgQXNzaWdubWVudCgKLSAgICAgIGtBbmRyb2lkU3RhdHVzVmFyTmFtZSwKLSAgICAgIFN0cmluZ1ByaW50ZigiJXM6OmZyb21FeGNlcHRpb25Db2RlKCVzOjpFWF9OVUxMX1BPSU5URVIpIgotICAgICAgICAgICAgICAgICAgICIud3JpdGVUb1BhcmNlbCglcykiLAotICAgICAgICAgICAgICAgICAgIGtCaW5kZXJTdGF0dXNMaXRlcmFsLCBrQmluZGVyU3RhdHVzTGl0ZXJhbCwKLSAgICAgICAgICAgICAgICAgICBrUmVwbHlWYXJOYW1lKSkpOwotCi0gIC8vIEZpbmFsbHksIHRoZSBzZXJ2ZXIncyBvblRyYW5zYWN0IG1ldGhvZCBqdXN0IHJldHVybnMgYSBzdGF0dXMgY29kZS4KLSAgb25fdHJhbnNhY3QtPkdldFN0YXRlbWVudEJsb2NrKCktPkFkZExpdGVyYWwoCi0gICAgICBTdHJpbmdQcmludGYoInJldHVybiAlcyIsIGtBbmRyb2lkU3RhdHVzVmFyTmFtZSkpOwotICB2ZWN0b3I8dW5pcXVlX3B0cjxEZWNsYXJhdGlvbj4+IGRlY2xzOwotICBkZWNscy5wdXNoX2JhY2soc3RkOjptb3ZlKGNvbnN0cnVjdG9yKSk7Ci0KLSAgYm9vbCBkZXByZWNhdGVkID0gaW50ZXJmYWNlLklzRGVwcmVjYXRlZCgpIHx8Ci0gICAgICAgICAgICAgICAgICAgIHN0ZDo6YW55X29mKGludGVyZmFjZS5HZXRNZXRob2RzKCkuYmVnaW4oKSwgaW50ZXJmYWNlLkdldE1ldGhvZHMoKS5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10oY29uc3QgYXV0byYgbSkgeyByZXR1cm4gbS0+SXNEZXByZWNhdGVkKCk7IH0pOwotICBpZiAoZGVwcmVjYXRlZCkgewotICAgIGRlY2xzLmVtcGxhY2VfYmFjaygKLSAgICAgICAgbmV3IExpdGVyYWxEZWNsKCIjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaFxuIgotICAgICAgICAgICAgICAgICAgICAgICAgIiNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkIFwiLVdkZXByZWNhdGVkXCJcbiIpKTsKLSAgfQotICBkZWNscy5wdXNoX2JhY2soc3RkOjptb3ZlKG9uX3RyYW5zYWN0KSk7Ci0gIGlmIChkZXByZWNhdGVkKSB7Ci0gICAgZGVjbHMuZW1wbGFjZV9iYWNrKG5ldyBMaXRlcmFsRGVjbCgiI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcFxuIikpOwotICB9Ci0KLSAgaWYgKG9wdGlvbnMuVmVyc2lvbigpID4gMCkgewotICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBjb2RlOwotICAgIGNvZGUgPDwgImludDMyX3QgIiA8PCBibl9uYW1lIDw8ICI6OiIgPDwga0dldEludGVyZmFjZVZlcnNpb24gPDwgIigpIHtcbiIKLSAgICAgICAgIDw8ICIgIHJldHVybiAiIDw8IENsYXNzTmFtZShpbnRlcmZhY2UsIENsYXNzTmFtZXM6OklOVEVSRkFDRSkgPDwgIjo6VkVSU0lPTjtcbiIKLSAgICAgICAgIDw8ICJ9XG4iOwotICAgIGRlY2xzLmVtcGxhY2VfYmFjayhuZXcgTGl0ZXJhbERlY2woY29kZS5zdHIoKSkpOwotICB9Ci0gIGlmICghb3B0aW9ucy5IYXNoKCkuZW1wdHkoKSkgewotICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBjb2RlOwotICAgIGNvZGUgPDwgInN0ZDo6c3RyaW5nICIgPDwgYm5fbmFtZSA8PCAiOjoiIDw8IGtHZXRJbnRlcmZhY2VIYXNoIDw8ICIoKSB7XG4iCi0gICAgICAgICA8PCAiICByZXR1cm4gIiA8PCBDbGFzc05hbWUoaW50ZXJmYWNlLCBDbGFzc05hbWVzOjpJTlRFUkZBQ0UpIDw8ICI6OkhBU0g7XG4iCi0gICAgICAgICA8PCAifVxuIjsKLSAgICBkZWNscy5lbXBsYWNlX2JhY2sobmV3IExpdGVyYWxEZWNsKGNvZGUuc3RyKCkpKTsKLSAgfQotCi0gIGlmIChvcHRpb25zLkdlbkxvZygpKSB7Ci0gICAgc3RyaW5nIGNvZGU7Ci0gICAgQ29kZVdyaXRlclB0ciB3cml0ZXIgPSBDb2RlV3JpdGVyOjpGb3JTdHJpbmcoJmNvZGUpOwotICAgICgqd3JpdGVyKSA8PCAic3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0ICIgKyBibl9uYW1lICsgIjo6VHJhbnNhY3Rpb25Mb2cmKT4gIiA8PCBibl9uYW1lCi0gICAgICAgICAgICAgIDw8ICI6OmxvZ0Z1bmM7XG4iOwotICAgIHdyaXRlci0+Q2xvc2UoKTsKLSAgICBkZWNscy5wdXNoX2JhY2sodW5pcXVlX3B0cjxEZWNsYXJhdGlvbj4obmV3IExpdGVyYWxEZWNsKGNvZGUpKSk7Ci0gIH0KLSAgcmV0dXJuIHVuaXF1ZV9wdHI8RG9jdW1lbnQ+ewotICAgICAgbmV3IENwcFNvdXJjZXtpbmNsdWRlX2xpc3QsIE5lc3RJbk5hbWVzcGFjZXMoc3RkOjptb3ZlKGRlY2xzKSwgaW50ZXJmYWNlLkdldFNwbGl0UGFja2FnZSgpKX19OwotfQotCi11bmlxdWVfcHRyPERvY3VtZW50PiBCdWlsZEludGVyZmFjZVNvdXJjZShjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsSW50ZXJmYWNlJiBpbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbW21heWJlX3VudXNlZF1dIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKLSAgdmVjdG9yPHN0cmluZz4gaW5jbHVkZV9saXN0ewotICAgICAgSGVhZGVyRmlsZShpbnRlcmZhY2UsIENsYXNzTmFtZXM6OlJBVywgZmFsc2UpLAotICAgICAgSGVhZGVyRmlsZShpbnRlcmZhY2UsIENsYXNzTmFtZXM6OkNMSUVOVCwgZmFsc2UpLAotICB9OwotCi0gIHZlY3Rvcjx1bmlxdWVfcHRyPERlY2xhcmF0aW9uPj4gZGVjbHM7Ci0KLSAgdW5pcXVlX3B0cjxNYWNyb0RlY2w+IG1ldGFfaWZ7Ci0gICAgICBuZXcgTWFjcm9EZWNseyJET19OT1RfRElSRUNUTFlfVVNFX01FX0lNUExFTUVOVF9NRVRBX0lOVEVSRkFDRSIsCi0gICAgICAgICAgICAgICAgICAgIEFyZ0xpc3R7dmVjdG9yPHN0cmluZz57Q2xhc3NOYW1lKGludGVyZmFjZSwgQ2xhc3NOYW1lczo6QkFTRSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyInICsgaW50ZXJmYWNlLkdldERlc2NyaXB0b3IoKSArICciJ319fX07Ci0gIGRlY2xzLnB1c2hfYmFjayhzdGQ6Om1vdmUobWV0YV9pZikpOwotCi0gIEJ1aWxkQ29uc3RhbnREZWZpbml0aW9ucyhpbnRlcmZhY2UsIHR5cGVuYW1lcywge30sIENsYXNzTmFtZShpbnRlcmZhY2UsIENsYXNzTmFtZXM6OklOVEVSRkFDRSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNscyk7Ci0KLSAgcmV0dXJuIHVuaXF1ZV9wdHI8RG9jdW1lbnQ+e25ldyBDcHBTb3VyY2V7Ci0gICAgICBpbmNsdWRlX2xpc3QsCi0gICAgICBOZXN0SW5OYW1lc3BhY2VzKHN0ZDo6bW92ZShkZWNscyksIGludGVyZmFjZS5HZXRTcGxpdFBhY2thZ2UoKSl9fTsKLX0KLQotdW5pcXVlX3B0cjxEb2N1bWVudD4gQnVpbGRDbGllbnRIZWFkZXIoY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbEludGVyZmFjZSYgaW50ZXJmYWNlLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7Ci0gIGNvbnN0IHN0cmluZyBpX25hbWUgPSBDbGFzc05hbWUoaW50ZXJmYWNlLCBDbGFzc05hbWVzOjpJTlRFUkZBQ0UpOwotICBjb25zdCBzdHJpbmcgYnBfbmFtZSA9IENsYXNzTmFtZShpbnRlcmZhY2UsIENsYXNzTmFtZXM6OkNMSUVOVCk7Ci0KLSAgdmVjdG9yPHN0cmluZz4gaW5jbHVkZXMgPSB7a0lCaW5kZXJIZWFkZXIsIGtJSW50ZXJmYWNlSGVhZGVyLCAidXRpbHMvRXJyb3JzLmgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIZWFkZXJGaWxlKGludGVyZmFjZSwgQ2xhc3NOYW1lczo6UkFXLCBmYWxzZSl9OwotCi0gIHVuaXF1ZV9wdHI8Q29uc3RydWN0b3JEZWNsPiBjb25zdHJ1Y3RvcntuZXcgQ29uc3RydWN0b3JEZWNsewotICAgICAgYnBfbmFtZSwKLSAgICAgIEFyZ0xpc3R7U3RyaW5nUHJpbnRmKCJjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4mICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGtJbXBsVmFyTmFtZSl9LAotICAgICAgQ29uc3RydWN0b3JEZWNsOjpJU19FWFBMSUNJVAotICB9fTsKLSAgdW5pcXVlX3B0cjxDb25zdHJ1Y3RvckRlY2w+IGRlc3RydWN0b3J7bmV3IENvbnN0cnVjdG9yRGVjbHsKLSAgICAgICJ+IiArIGJwX25hbWUsCi0gICAgICBBcmdMaXN0e30sCi0gICAgICBDb25zdHJ1Y3RvckRlY2w6OklTX1ZJUlRVQUwgfCBDb25zdHJ1Y3RvckRlY2w6OklTX0RFRkFVTFR9fTsKLQotICB2ZWN0b3I8dW5pcXVlX3B0cjxEZWNsYXJhdGlvbj4+IHB1YmxpY3M7Ci0gIHZlY3Rvcjx1bmlxdWVfcHRyPERlY2xhcmF0aW9uPj4gcHJpdmF0ZXM7Ci0KLSAgcHVibGljcy5wdXNoX2JhY2soc3RkOjptb3ZlKGNvbnN0cnVjdG9yKSk7Ci0gIHB1YmxpY3MucHVzaF9iYWNrKHN0ZDo6bW92ZShkZXN0cnVjdG9yKSk7Ci0KLSAgZm9yIChjb25zdCBhdXRvJiBtZXRob2Q6IGludGVyZmFjZS5HZXRNZXRob2RzKCkpIHsKLSAgICBpZiAobWV0aG9kLT5Jc1VzZXJEZWZpbmVkKCkpIHsKLSAgICAgIHB1YmxpY3MucHVzaF9iYWNrKEJ1aWxkTWV0aG9kRGVjbCgqbWV0aG9kLCB0eXBlbmFtZXMsIGZhbHNlKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHB1YmxpY3MucHVzaF9iYWNrKEJ1aWxkTWV0YU1ldGhvZERlY2woKm1ldGhvZCwgdHlwZW5hbWVzLCBvcHRpb25zLCBmYWxzZSkpOwotICAgIH0KLSAgfQotCi0gIGlmIChvcHRpb25zLkdlbkxvZygpKSB7Ci0gICAgaW5jbHVkZXMuZW1wbGFjZV9iYWNrKCJmdW5jdGlvbmFsIik7ICAvLyBmb3Igc3RkOjpmdW5jdGlvbgotICAgIGluY2x1ZGVzLmVtcGxhY2VfYmFjaygiYW5kcm9pZC9iaW5kZXJfdG9fc3RyaW5nLmgiKTsKLQotICAgIHB1YmxpY3MuZW1wbGFjZV9iYWNrKG5ldyBMaXRlcmFsRGVjbHtrVHJhbnNhY3Rpb25Mb2dTdHJ1Y3R9KTsKLSAgICBwdWJsaWNzLmVtcGxhY2VfYmFjaygKLSAgICAgICAgbmV3IExpdGVyYWxEZWNseyJzdGF0aWMgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFRyYW5zYWN0aW9uTG9nJik+IGxvZ0Z1bmM7XG4ifSk7Ci0gIH0KLQotICBpZiAob3B0aW9ucy5WZXJzaW9uKCkgPiAwKSB7Ci0gICAgcHJpdmF0ZXMuZW1wbGFjZV9iYWNrKG5ldyBMaXRlcmFsRGVjbCgiaW50MzJfdCBjYWNoZWRfdmVyc2lvbl8gPSAtMTtcbiIpKTsKLSAgfQotICBpZiAoIW9wdGlvbnMuSGFzaCgpLmVtcHR5KCkpIHsKLSAgICBwcml2YXRlcy5lbXBsYWNlX2JhY2sobmV3IExpdGVyYWxEZWNsKCJzdGQ6OnN0cmluZyBjYWNoZWRfaGFzaF8gPSBcIi0xXCI7XG4iKSk7Ci0gICAgcHJpdmF0ZXMuZW1wbGFjZV9iYWNrKG5ldyBMaXRlcmFsRGVjbCgic3RkOjptdXRleCBjYWNoZWRfaGFzaF9tdXRleF87XG4iKSk7Ci0gIH0KLQotICBjb25zdCBzdHJpbmcgYXR0cmlidXRlID0gR2V0RGVwcmVjYXRlZEF0dHJpYnV0ZShpbnRlcmZhY2UpOwotICB1bmlxdWVfcHRyPENsYXNzRGVjbD4gYnBfY2xhc3N7bmV3IENsYXNzRGVjbHsKLSAgICAgIGJwX25hbWUsCi0gICAgICAiOjphbmRyb2lkOjpCcEludGVyZmFjZTwiICsgaV9uYW1lICsgIj4iLAotICAgICAge30sCi0gICAgICBzdGQ6Om1vdmUocHVibGljcyksCi0gICAgICBzdGQ6Om1vdmUocHJpdmF0ZXMpLAotICAgICAgYXR0cmlidXRlLAotICB9fTsKLQotICByZXR1cm4gdW5pcXVlX3B0cjxEb2N1bWVudD57Ci0gICAgICBuZXcgQ3BwSGVhZGVye2luY2x1ZGVzLCBOZXN0SW5OYW1lc3BhY2VzKHN0ZDo6bW92ZShicF9jbGFzcyksIGludGVyZmFjZS5HZXRTcGxpdFBhY2thZ2UoKSl9fTsKLX0KLQotdW5pcXVlX3B0cjxEb2N1bWVudD4gQnVpbGRTZXJ2ZXJIZWFkZXIoY29uc3QgQWlkbFR5cGVuYW1lcyYgLyogdHlwZW5hbWVzICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbEludGVyZmFjZSYgaW50ZXJmYWNlLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CiAgIGNvbnN0IHN0cmluZyBpX25hbWUgPSBDbGFzc05hbWUoaW50ZXJmYWNlLCBDbGFzc05hbWVzOjpJTlRFUkZBQ0UpOwogICBjb25zdCBzdHJpbmcgYm5fbmFtZSA9IENsYXNzTmFtZShpbnRlcmZhY2UsIENsYXNzTmFtZXM6OlNFUlZFUik7CisgIGNvbnN0IHN0cmluZyBxX25hbWUgPSBHZXRRdWFsaWZpZWROYW1lKGludGVyZmFjZSwgQ2xhc3NOYW1lczo6U0VSVkVSKTsKIAotICB1bmlxdWVfcHRyPENvbnN0cnVjdG9yRGVjbD4gY29uc3RydWN0b3J7Ci0gICAgICBuZXcgQ29uc3RydWN0b3JEZWNse2JuX25hbWUsIEFyZ0xpc3R7fSwgQ29uc3RydWN0b3JEZWNsOjpJU19FWFBMSUNJVH19OworICBFbnRlck5hbWVzcGFjZShvdXQsIGludGVyZmFjZSk7CisgIG91dCA8PCAiXG4iOwogCi0gIHVuaXF1ZV9wdHI8RGVjbGFyYXRpb24+IG9uX3RyYW5zYWN0e25ldyBNZXRob2REZWNsewotICAgICAga0FuZHJvaWRTdGF0dXNMaXRlcmFsLCAib25UcmFuc2FjdCIsCi0gICAgICBBcmdMaXN0e3tTdHJpbmdQcmludGYoInVpbnQzMl90ICVzIiwga0NvZGVWYXJOYW1lKSwKLSAgICAgICAgICAgICAgIFN0cmluZ1ByaW50ZigiY29uc3QgJXMmICVzIiwga0FuZHJvaWRQYXJjZWxMaXRlcmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtEYXRhVmFyTmFtZSksCi0gICAgICAgICAgICAgICBTdHJpbmdQcmludGYoIiVzKiAlcyIsIGtBbmRyb2lkUGFyY2VsTGl0ZXJhbCwga1JlcGx5VmFyTmFtZSksCi0gICAgICAgICAgICAgICBTdHJpbmdQcmludGYoInVpbnQzMl90ICVzIiwga0ZsYWdzVmFyTmFtZSl9fSwKLSAgICAgIE1ldGhvZERlY2w6OklTX09WRVJSSURFCi0gIH19OwotICB2ZWN0b3I8c3RyaW5nPiBpbmNsdWRlcyA9IHsiYmluZGVyL0lJbnRlcmZhY2UuaCIsIEhlYWRlckZpbGUoaW50ZXJmYWNlLCBDbGFzc05hbWVzOjpSQVcsIGZhbHNlKX07Ci0KLSAgdmVjdG9yPHVuaXF1ZV9wdHI8RGVjbGFyYXRpb24+PiBwdWJsaWNzOwotICB2ZWN0b3I8dW5pcXVlX3B0cjxEZWNsYXJhdGlvbj4+IHByaXZhdGVzOwotCi0gIGZvciAoY29uc3QgYXV0byYgbWV0aG9kIDogaW50ZXJmYWNlLkdldE1ldGhvZHMoKSkgewotICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBjb2RlOwotICAgIGNvZGUgPDwgInN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fIiA8PCBtZXRob2QtPkdldE5hbWUoKSA8PCAiID0gIgotICAgICAgICAgPDwgIjo6YW5kcm9pZDo6SUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArICIgPDwgbWV0aG9kLT5HZXRJZCgpIDw8ICI7XG4iOwotICAgIHB1YmxpY3MucHVzaF9iYWNrKHN0ZDo6bWFrZV91bmlxdWU8TGl0ZXJhbERlY2w+KGNvZGUuc3RyKCkpKTsKKyAgLy8gY29uc3RydWN0b3IKKyAgb3V0LldyaXRlKCIlczo6JXMoKVxuIiwgcV9uYW1lLmNfc3RyKCksIGJuX25hbWUuY19zdHIoKSk7CisgIG91dCA8PCAie1xuIjsKKyAgb3V0LkluZGVudCgpOworICBpZiAoaW50ZXJmYWNlLklzVmludGZTdGFiaWxpdHkoKSkgeworICAgIG91dCA8PCAiOjphbmRyb2lkOjppbnRlcm5hbDo6U3RhYmlsaXR5OjptYXJrVmludGYodGhpcyk7XG4iOworICB9IGVsc2UgeworICAgIG91dCA8PCAiOjphbmRyb2lkOjppbnRlcm5hbDo6U3RhYmlsaXR5OjptYXJrQ29tcGlsYXRpb25Vbml0KHRoaXMpO1xuIjsKICAgfQorICBvdXQuRGVkZW50KCk7CisgIG91dCA8PCAifVxuIjsKKyAgb3V0IDw8ICJcbiI7CiAKLSAgcHVibGljcy5wdXNoX2JhY2soc3RkOjptb3ZlKGNvbnN0cnVjdG9yKSk7Ci0gIHB1YmxpY3MucHVzaF9iYWNrKHN0ZDo6bW92ZShvbl90cmFuc2FjdCkpOworICBHZW5lcmF0ZVNlcnZlck9uVHJhbnNhY3Qob3V0LCBpbnRlcmZhY2UsIHR5cGVuYW1lcywgb3B0aW9ucyk7CiAKICAgaWYgKG9wdGlvbnMuVmVyc2lvbigpID4gMCkgewotICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBjb2RlOwotICAgIGNvZGUgPDwgImludDMyX3QgIiA8PCBrR2V0SW50ZXJmYWNlVmVyc2lvbiA8PCAiKCkgZmluYWw7XG4iOwotICAgIHB1YmxpY3MuZW1wbGFjZV9iYWNrKG5ldyBMaXRlcmFsRGVjbChjb2RlLnN0cigpKSk7CisgICAgb3V0IDw8ICJpbnQzMl90ICIgPDwgcV9uYW1lIDw8ICI6OiIgPDwga0dldEludGVyZmFjZVZlcnNpb24gPDwgIigpIHtcbiIKKyAgICAgICAgPDwgIiAgcmV0dXJuICIgPDwgaV9uYW1lIDw8ICI6OlZFUlNJT047XG4iCisgICAgICAgIDw8ICJ9XG4iOwogICB9CiAgIGlmICghb3B0aW9ucy5IYXNoKCkuZW1wdHkoKSkgewotICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBjb2RlOwotICAgIGNvZGUgPDwgInN0ZDo6c3RyaW5nICIgPDwga0dldEludGVyZmFjZUhhc2ggPDwgIigpO1xuIjsKLSAgICBwdWJsaWNzLmVtcGxhY2VfYmFjayhuZXcgTGl0ZXJhbERlY2woY29kZS5zdHIoKSkpOworICAgIG91dCA8PCAic3RkOjpzdHJpbmcgIiA8PCBxX25hbWUgPDwgIjo6IiA8PCBrR2V0SW50ZXJmYWNlSGFzaCA8PCAiKCkge1xuIgorICAgICAgICA8PCAiICByZXR1cm4gIiA8PCBpX25hbWUgPDwgIjo6SEFTSDtcbiIKKyAgICAgICAgPDwgIn1cbiI7CisgIH0KKyAgaWYgKG9wdGlvbnMuR2VuTG9nKCkpIHsKKyAgICBvdXQgPDwgInN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCAiICsgcV9uYW1lICsgIjo6VHJhbnNhY3Rpb25Mb2cmKT4gIiA8PCBxX25hbWUKKyAgICAgICAgPDwgIjo6bG9nRnVuYztcbiI7CisgIH0KKworICBMZWF2ZU5hbWVzcGFjZShvdXQsIGludGVyZmFjZSk7Cit9CisKK3ZvaWQgR2VuZXJhdGVJbnRlcmZhY2VTb3VyY2UoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsSW50ZXJmYWNlJiBpbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywgY29uc3QgT3B0aW9ucyYpIHsKKyAgb3V0IDw8ICIjaW5jbHVkZSA8IiA8PCBIZWFkZXJGaWxlKGludGVyZmFjZSwgQ2xhc3NOYW1lczo6UkFXLCBmYWxzZSkgPDwgIj5cbiI7CisgIG91dCA8PCAiI2luY2x1ZGUgPCIgPDwgSGVhZGVyRmlsZShpbnRlcmZhY2UsIENsYXNzTmFtZXM6OkNMSUVOVCwgZmFsc2UpIDw8ICI+XG4iOworCisgIEVudGVyTmFtZXNwYWNlKG91dCwgaW50ZXJmYWNlKTsKKworICBpZiAoYXV0byBwYXJlbnQgPSBpbnRlcmZhY2UuR2V0UGFyZW50VHlwZSgpOyBwYXJlbnQpIHsKKyAgICBvdXQgPDwgZm10Ojpmb3JtYXQoIkRPX05PVF9ESVJFQ1RMWV9VU0VfTUVfSU1QTEVNRU5UX01FVEFfTkVTVEVEX0lOVEVSRkFDRSh7fSwge30sIFwie31cIilcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIEdldFF1YWxpZmllZE5hbWUoKnBhcmVudCksIENsYXNzTmFtZShpbnRlcmZhY2UsIENsYXNzTmFtZXM6OkJBU0UpLAorICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2UuR2V0RGVzY3JpcHRvcigpKTsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgZm10Ojpmb3JtYXQoIkRPX05PVF9ESVJFQ1RMWV9VU0VfTUVfSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKHt9LCBcInt9XCIpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBDbGFzc05hbWUoaW50ZXJmYWNlLCBDbGFzc05hbWVzOjpCQVNFKSwgaW50ZXJmYWNlLkdldERlc2NyaXB0b3IoKSk7CisgIH0KKworICBHZW5lcmF0ZUNvbnN0YW50RGVmaW5pdGlvbnMob3V0LCBpbnRlcmZhY2UsIHR5cGVuYW1lcywgLyp0ZW1wbGF0ZV9kZWNsPSovIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc05hbWUoaW50ZXJmYWNlLCBDbGFzc05hbWVzOjpJTlRFUkZBQ0UpKTsKKworICBMZWF2ZU5hbWVzcGFjZShvdXQsIGludGVyZmFjZSk7Cit9CisKK3ZvaWQgR2VuZXJhdGVDbGllbnRDbGFzc0RlY2woQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsSW50ZXJmYWNlJiBpbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICBjb25zdCBzdHJpbmcgYnBfbmFtZSA9IENsYXNzTmFtZShpbnRlcmZhY2UsIENsYXNzTmFtZXM6OkNMSUVOVCk7CisgIGNvbnN0IHN0cmluZyBpZmFjZSA9IENsYXNzTmFtZShpbnRlcmZhY2UsIENsYXNzTmFtZXM6OklOVEVSRkFDRSk7CisKKyAgb3V0IDw8ICJjbGFzcyI7CisgIEdlbmVyYXRlRGVwcmVjYXRlZChvdXQsIGludGVyZmFjZSk7CisgIG91dCA8PCAiICIgPDwgYnBfbmFtZSA8PCAiIDogcHVibGljIDo6YW5kcm9pZDo6QnBJbnRlcmZhY2U8IiA8PCBpZmFjZSA8PCAiPiB7XG4iOworICBvdXQgPDwgInB1YmxpYzpcbiI7CisgIG91dC5JbmRlbnQoKTsKKyAgb3V0IDw8ICJleHBsaWNpdCAiIDw8IGJwX25hbWUgPDwgIihjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4mICIgPDwga0ltcGxWYXJOYW1lCisgICAgICA8PCAiKTtcbiI7CisgIG91dCA8PCAidmlydHVhbCB+IiA8PCBicF9uYW1lIDw8ICIoKSA9IGRlZmF1bHQ7XG4iOworCisgIGZvciAoY29uc3QgYXV0byYgbWV0aG9kIDogaW50ZXJmYWNlLkdldE1ldGhvZHMoKSkgeworICAgIGlmIChtZXRob2QtPklzVXNlckRlZmluZWQoKSkgeworICAgICAgR2VuZXJhdGVNZXRob2REZWNsKG91dCwgdHlwZW5hbWVzLCAqbWV0aG9kLCAvKmNsYXp6PSovIiIpOworICAgICAgb3V0IDw8ICIgb3ZlcnJpZGUiOworICAgICAgR2VuZXJhdGVEZXByZWNhdGVkKG91dCwgKm1ldGhvZCk7CisgICAgICBvdXQgPDwgIjtcbiI7CisgICAgfSBlbHNlIGlmIChtZXRob2QtPkdldE5hbWUoKSA9PSBrR2V0SW50ZXJmYWNlVmVyc2lvbiAmJiBvcHRpb25zLlZlcnNpb24oKSA+IDApIHsKKyAgICAgIG91dCA8PCAiaW50MzJfdCAiIDw8IG1ldGhvZC0+R2V0TmFtZSgpIDw8ICIoKSBvdmVycmlkZTtcbiI7CisgICAgfSBlbHNlIGlmIChtZXRob2QtPkdldE5hbWUoKSA9PSBrR2V0SW50ZXJmYWNlSGFzaCAmJiAhb3B0aW9ucy5IYXNoKCkuZW1wdHkoKSkgeworICAgICAgb3V0IDw8ICJzdGQ6OnN0cmluZyAiIDw8IG1ldGhvZC0+R2V0TmFtZSgpIDw8ICIoKSBvdmVycmlkZTtcbiI7CisgICAgfQogICB9CiAKICAgaWYgKG9wdGlvbnMuR2VuTG9nKCkpIHsKLSAgICBpbmNsdWRlcy5lbXBsYWNlX2JhY2soImZ1bmN0aW9uYWwiKTsgIC8vIGZvciBzdGQ6OmZ1bmN0aW9uCi0gICAgaW5jbHVkZXMuZW1wbGFjZV9iYWNrKCJhbmRyb2lkL2JpbmRlcl90b19zdHJpbmcuaCIpOwotCi0gICAgcHVibGljcy5lbXBsYWNlX2JhY2sobmV3IExpdGVyYWxEZWNse2tUcmFuc2FjdGlvbkxvZ1N0cnVjdH0pOwotICAgIHB1YmxpY3MuZW1wbGFjZV9iYWNrKAotICAgICAgICBuZXcgTGl0ZXJhbERlY2x7InN0YXRpYyBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgVHJhbnNhY3Rpb25Mb2cmKT4gbG9nRnVuYztcbiJ9KTsKKyAgICBvdXQgPDwga1RyYW5zYWN0aW9uTG9nU3RydWN0OworICAgIG91dCA8PCAic3RhdGljIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBUcmFuc2FjdGlvbkxvZyYpPiBsb2dGdW5jO1xuIjsKICAgfQotICBjb25zdCBzdHJpbmcgYXR0cmlidXRlID0gR2V0RGVwcmVjYXRlZEF0dHJpYnV0ZShpbnRlcmZhY2UpOwotICB1bmlxdWVfcHRyPENsYXNzRGVjbD4gYm5fY2xhc3N7bmV3IENsYXNzRGVjbHsKLSAgICAgIGJuX25hbWUsCi0gICAgICAiOjphbmRyb2lkOjpCbkludGVyZmFjZTwiICsgaV9uYW1lICsgIj4iLAotICAgICAge30sCi0gICAgICBzdGQ6Om1vdmUocHVibGljcyksCi0gICAgICBzdGQ6Om1vdmUocHJpdmF0ZXMpLAotICAgICAgYXR0cmlidXRlLAotICB9fTsKKyAgb3V0LkRlZGVudCgpOwogCi0gIHJldHVybiB1bmlxdWVfcHRyPERvY3VtZW50PnsKLSAgICAgIG5ldyBDcHBIZWFkZXJ7aW5jbHVkZXMsIE5lc3RJbk5hbWVzcGFjZXMoc3RkOjptb3ZlKGJuX2NsYXNzKSwgaW50ZXJmYWNlLkdldFNwbGl0UGFja2FnZSgpKX19OworICBpZiAob3B0aW9ucy5WZXJzaW9uKCkgPiAwIHx8ICFvcHRpb25zLkhhc2goKS5lbXB0eSgpKSB7CisgICAgb3V0IDw8ICJwcml2YXRlOlxuIjsKKyAgICBvdXQuSW5kZW50KCk7CisgICAgaWYgKG9wdGlvbnMuVmVyc2lvbigpID4gMCkgeworICAgICAgb3V0IDw8ICJpbnQzMl90IGNhY2hlZF92ZXJzaW9uXyA9IC0xO1xuIjsKKyAgICB9CisgICAgaWYgKCFvcHRpb25zLkhhc2goKS5lbXB0eSgpKSB7CisgICAgICBvdXQgPDwgInN0ZDo6c3RyaW5nIGNhY2hlZF9oYXNoXyA9IFwiLTFcIjtcbiI7CisgICAgICBvdXQgPDwgInN0ZDo6bXV0ZXggY2FjaGVkX2hhc2hfbXV0ZXhfO1xuIjsKKyAgICB9CisgICAgb3V0LkRlZGVudCgpOworICB9CisKKyAgb3V0IDw8ICJ9OyAgLy8gY2xhc3MgIiA8PCBicF9uYW1lIDw8ICJcbiI7CiB9CiAKLXVuaXF1ZV9wdHI8RG9jdW1lbnQ+IEJ1aWxkSW50ZXJmYWNlSGVhZGVyKGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxJbnRlcmZhY2UmIGludGVyZmFjZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgewotICBzZXQ8c3RyaW5nPiBpbmNsdWRlcyA9IHtrSUJpbmRlckhlYWRlciwga0lJbnRlcmZhY2VIZWFkZXIsIGtTdGF0dXNIZWFkZXIsIGtTdHJvbmdQb2ludGVySGVhZGVyfTsKLQotICBmb3IgKGNvbnN0IGF1dG8mIG1ldGhvZCA6IGludGVyZmFjZS5HZXRNZXRob2RzKCkpIHsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIGFyZ3VtZW50IDogbWV0aG9kLT5HZXRBcmd1bWVudHMoKSkgewotICAgICAgQWRkSGVhZGVycyhhcmd1bWVudC0+R2V0VHlwZSgpLCB0eXBlbmFtZXMsICZpbmNsdWRlcyk7Ci0gICAgfQotCi0gICAgQWRkSGVhZGVycyhtZXRob2QtPkdldFR5cGUoKSwgdHlwZW5hbWVzLCAmaW5jbHVkZXMpOwordm9pZCBHZW5lcmF0ZUNsaWVudEhlYWRlcihDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxJbnRlcmZhY2UmIGludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIG91dCA8PCAiI3ByYWdtYSBvbmNlXG5cbiI7CisgIG91dCA8PCAiI2luY2x1ZGUgPCIgPDwga0lCaW5kZXJIZWFkZXIgPDwgIj5cbiI7CisgIG91dCA8PCAiI2luY2x1ZGUgPCIgPDwga0lJbnRlcmZhY2VIZWFkZXIgPDwgIj5cbiI7CisgIG91dCA8PCAiI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPlxuIjsKKyAgb3V0IDw8ICIjaW5jbHVkZSA8IiA8PCBIZWFkZXJGaWxlKGludGVyZmFjZSwgQ2xhc3NOYW1lczo6UkFXLCBmYWxzZSkgPDwgIj5cbiI7CisgIGlmIChvcHRpb25zLkdlbkxvZygpKSB7CisgICAgb3V0IDw8ICIjaW5jbHVkZSA8ZnVuY3Rpb25hbD5cbiI7ICAvLyBmb3Igc3RkOjpmdW5jdGlvbgorICAgIG91dCA8PCAiI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3RvX3N0cmluZy5oPlxuIjsKICAgfQorICBvdXQgPDwgIlxuIjsKKyAgRW50ZXJOYW1lc3BhY2Uob3V0LCBpbnRlcmZhY2UpOworICBHZW5lcmF0ZUNsaWVudENsYXNzRGVjbChvdXQsIGludGVyZmFjZSwgdHlwZW5hbWVzLCBvcHRpb25zKTsKKyAgTGVhdmVOYW1lc3BhY2Uob3V0LCBpbnRlcmZhY2UpOworfQogCi0gIGNvbnN0IHN0cmluZyBpX25hbWUgPSBDbGFzc05hbWUoaW50ZXJmYWNlLCBDbGFzc05hbWVzOjpJTlRFUkZBQ0UpOwotICBjb25zdCBzdHJpbmcgYXR0cmlidXRlID0gR2V0RGVwcmVjYXRlZEF0dHJpYnV0ZShpbnRlcmZhY2UpOwotICB1bmlxdWVfcHRyPENsYXNzRGVjbD4gaWZfY2xhc3N7bmV3IENsYXNzRGVjbHtpX25hbWUsICI6OmFuZHJvaWQ6OklJbnRlcmZhY2UiLCB7fSwgYXR0cmlidXRlfX07Ci0gIGlmX2NsYXNzLT5BZGRQdWJsaWModW5pcXVlX3B0cjxEZWNsYXJhdGlvbj57bmV3IE1hY3JvRGVjbHsKLSAgICAgICJERUNMQVJFX01FVEFfSU5URVJGQUNFIiwKLSAgICAgIEFyZ0xpc3R7dmVjdG9yPHN0cmluZz57Q2xhc3NOYW1lKGludGVyZmFjZSwgQ2xhc3NOYW1lczo6QkFTRSl9fX19KTsKK3ZvaWQgR2VuZXJhdGVTZXJ2ZXJDbGFzc0RlY2woQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsSW50ZXJmYWNlJiBpbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICBjb25zdCBzdHJpbmcgYm5fbmFtZSA9IENsYXNzTmFtZShpbnRlcmZhY2UsIENsYXNzTmFtZXM6OlNFUlZFUik7CisgIGNvbnN0IHN0cmluZyBpZmFjZSA9IENsYXNzTmFtZShpbnRlcmZhY2UsIENsYXNzTmFtZXM6OklOVEVSRkFDRSk7CiAKKyAgb3V0IDw8ICJjbGFzcyI7CisgIEdlbmVyYXRlRGVwcmVjYXRlZChvdXQsIGludGVyZmFjZSk7CisgIG91dCA8PCAiICIgPDwgYm5fbmFtZSA8PCAiIDogcHVibGljICIKKyAgICAgIDw8ICI6OmFuZHJvaWQ6OkJuSW50ZXJmYWNlPCIgPDwgaWZhY2UgPDwgIj4ge1xuIjsKKyAgb3V0IDw8ICJwdWJsaWM6XG4iOworICBvdXQuSW5kZW50KCk7CisgIGZvciAoY29uc3QgYXV0byYgbWV0aG9kIDogaW50ZXJmYWNlLkdldE1ldGhvZHMoKSkgeworICAgIG91dCA8PCAic3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl8iIDw8IG1ldGhvZC0+R2V0TmFtZSgpIDw8ICIgPSAiCisgICAgICAgIDw8ICI6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAiIDw8IHN0ZDo6dG9fc3RyaW5nKG1ldGhvZC0+R2V0SWQoKSkKKyAgICAgICAgPDwgIjtcbiI7CisgIH0KKyAgb3V0IDw8ICJleHBsaWNpdCAiIDw8IGJuX25hbWUgPDwgIigpO1xuIjsKKyAgb3V0IDw8IGZtdDo6Zm9ybWF0KCJ7fSBvblRyYW5zYWN0KHVpbnQzMl90IHt9LCBjb25zdCB7fSYge30sIHt9KiB7fSwgdWludDMyX3Qge30pIG92ZXJyaWRlO1xuIiwKKyAgICAgICAgICAgICAgICAgICAgIGtBbmRyb2lkU3RhdHVzTGl0ZXJhbCwga0NvZGVWYXJOYW1lLCBrQW5kcm9pZFBhcmNlbExpdGVyYWwsIGtEYXRhVmFyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIGtBbmRyb2lkUGFyY2VsTGl0ZXJhbCwga1JlcGx5VmFyTmFtZSwga0ZsYWdzVmFyTmFtZSk7CiAgIGlmIChvcHRpb25zLlZlcnNpb24oKSA+IDApIHsKLSAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gY29kZTsKLSAgICBjb2RlIDw8ICJjb25zdCBpbnQzMl90IFZFUlNJT04gPSAiIDw8IG9wdGlvbnMuVmVyc2lvbigpIDw8ICI7XG4iOwotCi0gICAgaWZfY2xhc3MtPkFkZFB1YmxpYyh1bmlxdWVfcHRyPERlY2xhcmF0aW9uPihuZXcgTGl0ZXJhbERlY2woY29kZS5zdHIoKSkpKTsKKyAgICBvdXQgPDwgImludDMyX3QgIiA8PCBrR2V0SW50ZXJmYWNlVmVyc2lvbiA8PCAiKCk7XG4iOwogICB9CiAgIGlmICghb3B0aW9ucy5IYXNoKCkuZW1wdHkoKSkgewotICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBjb2RlOwotICAgIGNvZGUgPDwgImNvbnN0IHN0ZDo6c3RyaW5nIEhBU0ggPSBcIiIgPDwgb3B0aW9ucy5IYXNoKCkgPDwgIlwiO1xuIjsKLQotICAgIGlmX2NsYXNzLT5BZGRQdWJsaWModW5pcXVlX3B0cjxEZWNsYXJhdGlvbj4obmV3IExpdGVyYWxEZWNsKGNvZGUuc3RyKCkpKSk7CisgICAgb3V0IDw8ICJzdGQ6OnN0cmluZyAiIDw8IGtHZXRJbnRlcmZhY2VIYXNoIDw8ICIoKTtcbiI7CiAgIH0KLQotICBCdWlsZENvbnN0YW50RGVjbGFyYXRpb25zKGludGVyZmFjZSwgdHlwZW5hbWVzLCBpZl9jbGFzcywgaW5jbHVkZXMpOwotCi0gIGlmIChvcHRpb25zLkdlblRyYWNlcygpKSB7Ci0gICAgaW5jbHVkZXMuaW5zZXJ0KGtUcmFjZUhlYWRlcik7CisgIGlmIChvcHRpb25zLkdlbkxvZygpKSB7CisgICAgb3V0IDw8IGtUcmFuc2FjdGlvbkxvZ1N0cnVjdDsKKyAgICBvdXQgPDwgInN0YXRpYyBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgVHJhbnNhY3Rpb25Mb2cmKT4gbG9nRnVuYztcbiI7CiAgIH0KKyAgb3V0LkRlZGVudCgpOworICBvdXQgPDwgIn07ICAvLyBjbGFzcyAiIDw8IGJuX25hbWUgPDwgIlxuXG4iOwogCi0gIGlmICghaW50ZXJmYWNlLkdldE1ldGhvZHMoKS5lbXB0eSgpKSB7Ci0gICAgZm9yIChjb25zdCBhdXRvJiBtZXRob2QgOiBpbnRlcmZhY2UuR2V0TWV0aG9kcygpKSB7Ci0gICAgICBpZiAobWV0aG9kLT5Jc1VzZXJEZWZpbmVkKCkpIHsKLSAgICAgICAgLy8gRWFjaCBtZXRob2QgZ2V0cyBhbiBlbnVtIGVudHJ5IGFuZCBwdXJlIHZpcnR1YWwgZGVjbGFyYXRpb24uCi0gICAgICAgIGlmX2NsYXNzLT5BZGRQdWJsaWMoQnVpbGRNZXRob2REZWNsKCptZXRob2QsIHR5cGVuYW1lcywgdHJ1ZSkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWZfY2xhc3MtPkFkZFB1YmxpYyhCdWlsZE1ldGFNZXRob2REZWNsKCptZXRob2QsIHR5cGVuYW1lcywgb3B0aW9ucywgdHJ1ZSkpOworICBzdGQ6OnN0cmluZyBkX25hbWUgPSBDbGFzc05hbWUoaW50ZXJmYWNlLCBDbGFzc05hbWVzOjpERUxFR0FUT1JfSU1QTCk7CisgIG91dCA8PCAiY2xhc3MiOworICBHZW5lcmF0ZURlcHJlY2F0ZWQob3V0LCBpbnRlcmZhY2UpOworICBvdXQgPDwgIiAiIDw8IGRfbmFtZSA8PCAiIDogcHVibGljICIgPDwgYm5fbmFtZSA8PCAiIHtcbiI7CisgIG91dCA8PCAicHVibGljOlxuIjsKKyAgb3V0LkluZGVudCgpOworICBvdXQgPDwgImV4cGxpY2l0ICIgPDwgZF9uYW1lIDw8ICIoIiA8PCBTdHJpbmdQcmludGYoIjo6YW5kcm9pZDo6c3A8JXM+ICZpbXBsIiwgaWZhY2UuY19zdHIoKSkKKyAgICAgIDw8ICIpICIgPDwgU3RyaW5nUHJpbnRmKCI6ICVzKGltcGwpIiwga0RlbGVnYXRlSW1wbFZhck5hbWUpIDw8ICIge31cblxuIjsKKworICBmb3IgKGNvbnN0IGF1dG8mIG1ldGhvZCA6IGludGVyZmFjZS5HZXRNZXRob2RzKCkpIHsKKyAgICBpZiAobWV0aG9kLT5Jc1VzZXJEZWZpbmVkKCkpIHsKKyAgICAgIEdlbmVyYXRlTWV0aG9kRGVjbChvdXQsIHR5cGVuYW1lcywgKm1ldGhvZCwgLypjbGF6ej0qLyIiKTsKKyAgICAgIG91dCA8PCAiIG92ZXJyaWRlIjsKKyAgICAgIEdlbmVyYXRlRGVwcmVjYXRlZChvdXQsICptZXRob2QpOworCisgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gYXJnczsKKyAgICAgIGZvciAoY29uc3QgYXV0byYgYXJnIDogbWV0aG9kLT5HZXRBcmd1bWVudHMoKSkgeworICAgICAgICBpZiAoSXNOb25Db3B5YWJsZVR5cGUoYXJnLT5HZXRUeXBlKCksIHR5cGVuYW1lcykpIHsKKyAgICAgICAgICBhcmdzLnB1c2hfYmFjayhTdHJpbmdQcmludGYoInN0ZDo6bW92ZSglcykiLCBhcmctPkdldE5hbWUoKS5jX3N0cigpKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYXJncy5wdXNoX2JhY2soYXJnLT5HZXROYW1lKCkpOworICAgICAgICB9CiAgICAgICB9CisgICAgICBpZiAobWV0aG9kLT5HZXRUeXBlKCkuR2V0TmFtZSgpICE9ICJ2b2lkIikgeworICAgICAgICBhcmdzLnB1c2hfYmFjayhrUmV0dXJuVmFyTmFtZSk7CisgICAgICB9CisgICAgICBvdXQgPDwgIiB7XG4iCisgICAgICAgICAgPDwgIiAgcmV0dXJuICIgPDwga0RlbGVnYXRlSW1wbFZhck5hbWUgPDwgIi0+IiA8PCBtZXRob2QtPkdldE5hbWUoKSA8PCAiKCIKKyAgICAgICAgICA8PCBiYXNlOjpKb2luKGFyZ3MsICIsICIpIDw8ICIpO1xuIjsKKyAgICAgIG91dCA8PCAifVxuIjsKKyAgICB9IGVsc2UgaWYgKG1ldGhvZC0+R2V0TmFtZSgpID09IGtHZXRJbnRlcmZhY2VWZXJzaW9uICYmIG9wdGlvbnMuVmVyc2lvbigpKSB7CisgICAgICBvdXQgPDwgImludDMyX3QgIiA8PCBrR2V0SW50ZXJmYWNlVmVyc2lvbiA8PCAiKCkiCisgICAgICAgICAgPDwgIiBvdmVycmlkZSB7XG4iOworICAgICAgb3V0LkluZGVudCgpOworICAgICAgb3V0IDw8ICJpbnQzMl90IF9kZWxlZ2F0b3JfdmVyID0gIiA8PCBibl9uYW1lIDw8ICI6OiIgPDwga0dldEludGVyZmFjZVZlcnNpb24gPDwgIigpO1xuIjsKKyAgICAgIG91dCA8PCAiaW50MzJfdCBfaW1wbF92ZXIgPSAiIDw8IGtEZWxlZ2F0ZUltcGxWYXJOYW1lIDw8ICItPiIgPDwga0dldEludGVyZmFjZVZlcnNpb24KKyAgICAgICAgICA8PCAiKCk7XG4iOworICAgICAgb3V0IDw8ICJyZXR1cm4gX2RlbGVnYXRvcl92ZXIgPCBfaW1wbF92ZXIgPyBfZGVsZWdhdG9yX3ZlciA6IF9pbXBsX3ZlcjtcbiI7CisgICAgICBvdXQuRGVkZW50KCk7CisgICAgICBvdXQgPDwgIn1cbiI7CisgICAgfSBlbHNlIGlmIChtZXRob2QtPkdldE5hbWUoKSA9PSBrR2V0SW50ZXJmYWNlSGFzaCAmJiAhb3B0aW9ucy5IYXNoKCkuZW1wdHkoKSkgeworICAgICAgb3V0IDw8ICJzdGQ6OnN0cmluZyAiIDw8IGtHZXRJbnRlcmZhY2VIYXNoIDw8ICIoKSIKKyAgICAgICAgICA8PCAiIG92ZXJyaWRlIHtcbiI7CisgICAgICBvdXQgPDwgIiAgcmV0dXJuICIgPDwga0RlbGVnYXRlSW1wbFZhck5hbWUgPDwgIi0+IiA8PCBrR2V0SW50ZXJmYWNlSGFzaCA8PCAiKCk7XG4iOworICAgICAgb3V0IDw8ICJ9XG4iOwogICAgIH0KICAgfQorICBvdXQuRGVkZW50KCk7CisgIG91dCA8PCAicHJpdmF0ZTpcbiI7CisgIG91dC5JbmRlbnQoKTsKKyAgb3V0IDw8ICI6OmFuZHJvaWQ6OnNwPCIgPDwgaWZhY2UgPDwgIj4gIiA8PCBrRGVsZWdhdGVJbXBsVmFyTmFtZSA8PCAiO1xuIjsKKyAgb3V0LkRlZGVudCgpOworICBvdXQgPDwgIn07ICAvLyBjbGFzcyAiIDw8IGRfbmFtZSA8PCAiXG4iOworfQorCit2b2lkIEdlbmVyYXRlU2VydmVySGVhZGVyKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbEludGVyZmFjZSYgaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgb3V0IDw8ICIjcHJhZ21hIG9uY2VcblxuIjsKKyAgb3V0IDw8ICIjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD5cbiI7CisgIG91dCA8PCAiI2luY2x1ZGUgPCIgPDwgSGVhZGVyRmlsZShpbnRlcmZhY2UsIENsYXNzTmFtZXM6OlJBVywgZmFsc2UpIDw8ICI+XG4iOworICBpZiAob3B0aW9ucy5HZW5Mb2coKSkgeworICAgIG91dCA8PCAiI2luY2x1ZGUgPGZ1bmN0aW9uYWw+XG4iOyAgLy8gZm9yIHN0ZDo6ZnVuY3Rpb24KKyAgICBvdXQgPDwgIiNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl90b19zdHJpbmcuaD5cbiI7CisgIH0KKyAgb3V0IDw8ICJcbiI7CisgIEVudGVyTmFtZXNwYWNlKG91dCwgaW50ZXJmYWNlKTsKKyAgR2VuZXJhdGVTZXJ2ZXJDbGFzc0RlY2wob3V0LCBpbnRlcmZhY2UsIHR5cGVuYW1lcywgb3B0aW9ucyk7CisgIExlYXZlTmFtZXNwYWNlKG91dCwgaW50ZXJmYWNlKTsKK30KKwordm9pZCBHZW5lcmF0ZUNsYXNzRGVjbChDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxEZWZpbmVkVHlwZSYgZGVmaW5lZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOworCit2b2lkIEdlbmVyYXRlTmVzdGVkVHlwZURlY2xzKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbERlZmluZWRUeXBlJiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgYXV0byB2aXNpdCA9IFsmXShjb25zdCBhdXRvJiBuZXN0ZWQpIHsgR2VuZXJhdGVDbGFzc0RlY2wob3V0LCBuZXN0ZWQsIHR5cGVuYW1lcywgb3B0aW9ucyk7IH07CisgIEFJRExfRkFUQUxfSUYoIVRvcG9sb2dpY2FsVmlzaXQodHlwZS5HZXROZXN0ZWRUeXBlcygpLCB2aXNpdCksIHR5cGUpIDw8ICJDeWNsZSBkZXRlY3RlZC4iOworfQorCit2b2lkIEdlbmVyYXRlSW50ZXJmYWNlQ2xhc3NEZWNsKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbEludGVyZmFjZSYgaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgY29uc3Qgc3RyaW5nIGlfbmFtZSA9IENsYXNzTmFtZShpbnRlcmZhY2UsIENsYXNzTmFtZXM6OklOVEVSRkFDRSk7CisKKyAgb3V0IDw8ICJjbGFzcyI7CisgIEdlbmVyYXRlRGVwcmVjYXRlZChvdXQsIGludGVyZmFjZSk7CisgIG91dCA8PCAiICIgPDwgaV9uYW1lIDw8ICIgOiBwdWJsaWMgOjphbmRyb2lkOjpJSW50ZXJmYWNlIHtcbiI7CisgIG91dCA8PCAicHVibGljOlxuIjsKKyAgb3V0LkluZGVudCgpOworICBvdXQgPDwgIkRFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoIiA8PCBDbGFzc05hbWUoaW50ZXJmYWNlLCBDbGFzc05hbWVzOjpCQVNFKSA8PCAiKVxuIjsKKyAgaWYgKG9wdGlvbnMuVmVyc2lvbigpID4gMCkgeworICAgIG91dCA8PCAiY29uc3QgaW50MzJfdCBWRVJTSU9OID0gIiA8PCBzdGQ6OnRvX3N0cmluZyhvcHRpb25zLlZlcnNpb24oKSkgPDwgIjtcbiI7CisgIH0KKyAgaWYgKCFvcHRpb25zLkhhc2goKS5lbXB0eSgpKSB7CisgICAgb3V0IDw8ICJjb25zdCBzdGQ6OnN0cmluZyBIQVNIID0gXCIiIDw8IG9wdGlvbnMuSGFzaCgpIDw8ICJcIjtcbiI7CisgIH0KKyAgR2VuZXJhdGVOZXN0ZWRUeXBlRGVjbHMob3V0LCBpbnRlcmZhY2UsIHR5cGVuYW1lcywgb3B0aW9ucyk7CisgIEdlbmVyYXRlQ29uc3RhbnREZWNsYXJhdGlvbnMob3V0LCBpbnRlcmZhY2UsIHR5cGVuYW1lcyk7CisgIGZvciAoY29uc3QgYXV0byYgbWV0aG9kIDogaW50ZXJmYWNlLkdldE1ldGhvZHMoKSkgeworICAgIGlmIChtZXRob2QtPklzVXNlckRlZmluZWQoKSkgeworICAgICAgb3V0IDw8ICJ2aXJ0dWFsICI7CisgICAgICBHZW5lcmF0ZU1ldGhvZERlY2wob3V0LCB0eXBlbmFtZXMsICptZXRob2QsIC8qY2xheno9Ki8iIik7CisgICAgICBHZW5lcmF0ZURlcHJlY2F0ZWQob3V0LCAqbWV0aG9kKTsKKyAgICAgIG91dCA8PCAiID0gMDtcbiI7CisgICAgfSBlbHNlIGlmIChtZXRob2QtPkdldE5hbWUoKSA9PSBrR2V0SW50ZXJmYWNlVmVyc2lvbiAmJiBvcHRpb25zLlZlcnNpb24oKSA+IDApIHsKKyAgICAgIG91dCA8PCAidmlydHVhbCBpbnQzMl90ICIgPDwgbWV0aG9kLT5HZXROYW1lKCkgPDwgIigpID0gMDtcbiI7CisgICAgfSBlbHNlIGlmIChtZXRob2QtPkdldE5hbWUoKSA9PSBrR2V0SW50ZXJmYWNlSGFzaCAmJiAhb3B0aW9ucy5IYXNoKCkuZW1wdHkoKSkgeworICAgICAgb3V0IDw8ICJ2aXJ0dWFsIHN0ZDo6c3RyaW5nICIgPDwgbWV0aG9kLT5HZXROYW1lKCkgPDwgIigpID0gMDtcbiI7CisgICAgfQorICB9CisgIG91dC5EZWRlbnQoKTsKKyAgb3V0IDw8ICJ9OyAgLy8gY2xhc3MgIiA8PCBpX25hbWUgPDwgIlxuIjsKKyAgb3V0IDw8ICJcbiI7CiAKICAgLy8gSW1wbGVtZW50IHRoZSBkZWZhdWx0IGltcGwgY2xhc3MuCi0gIHZlY3Rvcjx1bmlxdWVfcHRyPERlY2xhcmF0aW9uPj4gbWV0aG9kX2RlY2xzOworICBjb25zdCBzdHJpbmcgZGVmYXVsdF9pbXBsID0gQ2xhc3NOYW1lKGludGVyZmFjZSwgQ2xhc3NOYW1lczo6REVGQVVMVF9JTVBMKTsKKyAgb3V0IDw8ICJjbGFzcyI7CisgIEdlbmVyYXRlRGVwcmVjYXRlZChvdXQsIGludGVyZmFjZSk7CisgIG91dCA8PCAiICIgPDwgZGVmYXVsdF9pbXBsIDw8ICIgOiBwdWJsaWMgIiA8PCBpX25hbWUgPDwgIiB7XG4iOworICBvdXQgPDwgInB1YmxpYzpcbiI7CisgIG91dC5JbmRlbnQoKTsKICAgLy8gb25Bc0JpbmRlciByZXR1cm5zIG51bGxwdHIgYXMgdGhpcyBpbnRlcmZhY2UgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhCiAgIC8vIHJlYWwgYmluZGVyLgotICBtZXRob2RfZGVjbHMuZW1wbGFjZV9iYWNrKAotICAgICAgbmV3IExpdGVyYWxEZWNsKCI6OmFuZHJvaWQ6OklCaW5kZXIqIG9uQXNCaW5kZXIoKSBvdmVycmlkZSB7XG4iCi0gICAgICAgICAgICAgICAgICAgICAgIiAgcmV0dXJuIG51bGxwdHI7XG4iCi0gICAgICAgICAgICAgICAgICAgICAgIn1cbiIpKTsKKyAgb3V0IDw8ICI6OmFuZHJvaWQ6OklCaW5kZXIqIG9uQXNCaW5kZXIoKSBvdmVycmlkZSB7XG4iCisgICAgICA8PCAiICByZXR1cm4gbnVsbHB0cjtcbiIKKyAgICAgIDw8ICJ9XG4iOworCiAgIC8vIEVhY2ggaW50ZXJmYWNlIG1ldGhvZCBieSBkZWZhdWx0IHJldHVybnMgVU5LTk9XTl9UUkFOU0FDVElPTiB3aXRoIGlzCiAgIC8vIHRoZSBzYW1lIHN0YXR1cyB0aGF0IGlzIHJldHVybmVkIGJ5IHRyYW5zYWN0KCkgd2hlbiB0aGUgbWV0aG9kIGlzCiAgIC8vIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGUgc2VydmVyIHNpZGUuIEluIG90aGVyIHdvcmRzLCB0aGVzZSBkZWZhdWx0CkBAIC0xMDYwLDExNyArOTQwLDgxIEBACiAgIC8vIGltcGwgY2xhc3Mgd2l0aG91dCBoYXZpbmcgdG8gb3ZlcnJpZGUgYWxsIG1ldGhvZHMgaW4gYW4gaW50ZXJmYWNlLgogICBmb3IgKGNvbnN0IGF1dG8mIG1ldGhvZCA6IGludGVyZmFjZS5HZXRNZXRob2RzKCkpIHsKICAgICBpZiAobWV0aG9kLT5Jc1VzZXJEZWZpbmVkKCkpIHsKLSAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBjb2RlOwotICAgICAgY29kZSA8PCAiOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyAiIDw8IG1ldGhvZC0+R2V0TmFtZSgpCi0gICAgICAgICAgIDw8IEJ1aWxkQXJnTGlzdCh0eXBlbmFtZXMsICptZXRob2QsIHRydWUsIHRydWUpLlRvU3RyaW5nKCkgPDwgIiBvdmVycmlkZSI7Ci0gICAgICBHZW5lcmF0ZURlcHJlY2F0ZWQoY29kZSwgKm1ldGhvZCk7Ci0gICAgICBjb2RlIDw8ICIge1xuIgotICAgICAgICAgICA8PCAiICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTtcbiIKLSAgICAgICAgICAgPDwgIn1cbiI7Ci0gICAgICBtZXRob2RfZGVjbHMuZW1wbGFjZV9iYWNrKG5ldyBMaXRlcmFsRGVjbChjb2RlLnN0cigpKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChtZXRob2QtPkdldE5hbWUoKSA9PSBrR2V0SW50ZXJmYWNlVmVyc2lvbiAmJiBvcHRpb25zLlZlcnNpb24oKSA+IDApIHsKLSAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIGNvZGU7Ci0gICAgICAgIGNvZGUgPDwgImludDMyX3QgIiA8PCBrR2V0SW50ZXJmYWNlVmVyc2lvbiA8PCAiKCkgb3ZlcnJpZGUge1xuIgotICAgICAgICAgICAgIDw8ICIgIHJldHVybiAwO1xuIgotICAgICAgICAgICAgIDw8ICJ9XG4iOwotICAgICAgICBtZXRob2RfZGVjbHMuZW1wbGFjZV9iYWNrKG5ldyBMaXRlcmFsRGVjbChjb2RlLnN0cigpKSk7Ci0gICAgICB9Ci0gICAgICBpZiAobWV0aG9kLT5HZXROYW1lKCkgPT0ga0dldEludGVyZmFjZUhhc2ggJiYgIW9wdGlvbnMuSGFzaCgpLmVtcHR5KCkpIHsKLSAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIGNvZGU7Ci0gICAgICAgIGNvZGUgPDwgInN0ZDo6c3RyaW5nICIgPDwga0dldEludGVyZmFjZUhhc2ggPDwgIigpIG92ZXJyaWRlIHtcbiIKLSAgICAgICAgICAgICA8PCAiICByZXR1cm4gXCJcIjtcbiIKLSAgICAgICAgICAgICA8PCAifVxuIjsKLSAgICAgICAgbWV0aG9kX2RlY2xzLmVtcGxhY2VfYmFjayhuZXcgTGl0ZXJhbERlY2woY29kZS5zdHIoKSkpOwotICAgICAgfQorICAgICAgb3V0IDw8ICI6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzICIgPDwgbWV0aG9kLT5HZXROYW1lKCkgPDwgIigiCisgICAgICAgICAgPDwgR2VuZXJhdGVBcmdMaXN0KHR5cGVuYW1lcywgKm1ldGhvZCwgLypmb3JfZGVjbGFyYXRpb249Ki90cnVlLCAvKnR5cGVfbmFtZV9vbmx5PSovdHJ1ZSkKKyAgICAgICAgICA8PCAiKSBvdmVycmlkZSI7CisgICAgICBHZW5lcmF0ZURlcHJlY2F0ZWQob3V0LCAqbWV0aG9kKTsKKyAgICAgIG91dCA8PCAiIHtcbiIKKyAgICAgICAgICA8PCAiICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTtcbiIKKyAgICAgICAgICA8PCAifVxuIjsKKyAgICB9IGVsc2UgaWYgKG1ldGhvZC0+R2V0TmFtZSgpID09IGtHZXRJbnRlcmZhY2VWZXJzaW9uICYmIG9wdGlvbnMuVmVyc2lvbigpID4gMCkgeworICAgICAgb3V0IDw8ICJpbnQzMl90ICIgPDwga0dldEludGVyZmFjZVZlcnNpb24gPDwgIigpIG92ZXJyaWRlIHtcbiIKKyAgICAgICAgICA8PCAiICByZXR1cm4gMDtcbiIKKyAgICAgICAgICA8PCAifVxuIjsKKyAgICB9IGVsc2UgaWYgKG1ldGhvZC0+R2V0TmFtZSgpID09IGtHZXRJbnRlcmZhY2VIYXNoICYmICFvcHRpb25zLkhhc2goKS5lbXB0eSgpKSB7CisgICAgICBvdXQgPDwgInN0ZDo6c3RyaW5nICIgPDwga0dldEludGVyZmFjZUhhc2ggPDwgIigpIG92ZXJyaWRlIHtcbiIKKyAgICAgICAgICA8PCAiICByZXR1cm4gXCJcIjtcbiIKKyAgICAgICAgICA8PCAifVxuIjsKICAgICB9CiAgIH0KKyAgb3V0LkRlZGVudCgpOworICBvdXQgPDwgIn07ICAvLyBjbGFzcyAiIDw8IGRlZmF1bHRfaW1wbCA8PCAiXG4iOwogCi0gIHZlY3Rvcjx1bmlxdWVfcHRyPERlY2xhcmF0aW9uPj4gZGVjbHM7Ci0gIGRlY2xzLmVtcGxhY2VfYmFjayhzdGQ6Om1vdmUoaWZfY2xhc3MpKTsKLSAgZGVjbHMuZW1wbGFjZV9iYWNrKG5ldyBDbGFzc0RlY2x7Ci0gICAgICBDbGFzc05hbWUoaW50ZXJmYWNlLCBDbGFzc05hbWVzOjpERUZBVUxUX0lNUEwpLAotICAgICAgaV9uYW1lLAotICAgICAge30sCi0gICAgICBzdGQ6Om1vdmUobWV0aG9kX2RlY2xzKSwKLSAgICAgIHt9LAotICAgICAgYXR0cmlidXRlLCAgLy8gaW5oZXJpdHMgdGhlIHNhbWUgYXR0cmlidXRlcwotICB9KTsKLQotICByZXR1cm4gdW5pcXVlX3B0cjxEb2N1bWVudD57Ci0gICAgICBuZXcgQ3BwSGVhZGVye3ZlY3RvcjxzdHJpbmc+KGluY2x1ZGVzLmJlZ2luKCksIGluY2x1ZGVzLmVuZCgpKSwKLSAgICAgICAgICAgICAgICAgICAgTmVzdEluTmFtZXNwYWNlcyhzdGQ6Om1vdmUoZGVjbHMpLCBpbnRlcmZhY2UuR2V0U3BsaXRQYWNrYWdlKCkpfX07Ci19Ci0KLXN0cmluZyBHZXRJbml0aWFsaXplcihjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsIGNvbnN0IEFpZGxWYXJpYWJsZURlY2xhcmF0aW9uJiB2YXJpYWJsZSkgewotICBzdHJpbmcgY3BwVHlwZSA9IENwcE5hbWVPZih2YXJpYWJsZS5HZXRUeXBlKCksIHR5cGVuYW1lcyk7Ci0gIHJldHVybiBjcHBUeXBlICsgIigiICsgdmFyaWFibGUuVmFsdWVTdHJpbmcoQ29uc3RhbnRWYWx1ZURlY29yYXRvcikgKyAiKSI7Ci19Ci0KLXZvaWQgQWRkVHlwZVNwZWNpZmljSGVhZGVycyhjb25zdCBBaWRsU3RydWN0dXJlZFBhcmNlbGFibGUmLCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4mIGluY2x1ZGVzKSB7Ci0gIGluY2x1ZGVzLmluc2VydCgidHVwbGUiKTsgIC8vIHN0ZDo6dGllIGluIGNvbXBhcmlzb24gb3BlcmF0b3JzCi19Ci0KLXZvaWQgQnVpbGRSZWFkRnJvbVBhcmNlbChjb25zdCBBaWRsU3RydWN0dXJlZFBhcmNlbGFibGUmIHBhcmNlbCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlbWVudEJsb2NrKiByZWFkX2Jsb2NrKSB7Ci0gIHJlYWRfYmxvY2stPkFkZExpdGVyYWwoCi0gICAgICBTdHJpbmdQcmludGYoIiVzICVzID0gJXMiLCBrQW5kcm9pZFN0YXR1c0xpdGVyYWwsIGtBbmRyb2lkU3RhdHVzVmFyTmFtZSwga0FuZHJvaWRTdGF0dXNPaykpOwotCi0gIHJlYWRfYmxvY2stPkFkZExpdGVyYWwoCi0gICAgICAiW1ttYXliZV91bnVzZWRdXSBzaXplX3QgX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKTtcbiIKLSAgICAgICJpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPSBfYWlkbF9wYXJjZWwtPnJlYWRJbnQzMigpO1xuIgotICAgICAgImlmIChfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplIDwgMCkgcmV0dXJuIDo6YW5kcm9pZDo6QkFEX1ZBTFVFO1xuIgotICAgICAgIltbbWF5YmVfdW51c2VkXV0gc2l6ZV90IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9ICIKLSAgICAgICJzdGF0aWNfY2FzdDxzaXplX3Q+KF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUpO1xuIgotICAgICAgImlmIChfYWlkbF9zdGFydF9wb3MgPiBTSVpFX01BWCAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuIDo6YW5kcm9pZDo6QkFEX1ZBTFVFO1xuIiwKLSAgICAgIC8qYWRkX3NlbWljb2xvbj0qL2ZhbHNlKTsKLQotICBhdXRvIGNoZWNrQXZhaWxhYmxlRGF0YSA9IFN0cmluZ1ByaW50ZigKLSAgICAgICJpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHtcbiIKLSAgICAgICIgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7XG4iCi0gICAgICAiICByZXR1cm4gJXM7XG4iCi0gICAgICAifVxuIiwKLSAgICAgIGtBbmRyb2lkU3RhdHVzVmFyTmFtZSk7Ci0KLSAgZm9yIChjb25zdCBhdXRvJiB2YXJpYWJsZSA6IHBhcmNlbC5HZXRGaWVsZHMoKSkgewotICAgIHJlYWRfYmxvY2stPkFkZExpdGVyYWwoY2hlY2tBdmFpbGFibGVEYXRhLCAvKmFkZF9zZW1pY29sb249Ki9mYWxzZSk7Ci0gICAgc3RyaW5nIG1ldGhvZCA9IFBhcmNlbFJlYWRNZXRob2RPZih2YXJpYWJsZS0+R2V0VHlwZSgpLCB0eXBlbmFtZXMpOwotICAgIHJlYWRfYmxvY2stPkFkZFN0YXRlbWVudChuZXcgQXNzaWdubWVudCgKLSAgICAgICAga0FuZHJvaWRTdGF0dXNWYXJOYW1lLCBuZXcgTWV0aG9kQ2FsbChTdHJpbmdQcmludGYoIl9haWRsX3BhcmNlbC0+JXMiLCBtZXRob2QuY19zdHIoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsUmVhZENhc3RPZih2YXJpYWJsZS0+R2V0VHlwZSgpLCB0eXBlbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJiIgKyB2YXJpYWJsZS0+R2V0TmFtZSgpKSkpKTsKLSAgICByZWFkX2Jsb2NrLT5BZGRTdGF0ZW1lbnQoUmV0dXJuT25TdGF0dXNOb3RPaygpKTsKKyAgLy8gV2hlbiBhbiBpbnRlcmZhY2UgaXMgbmVzdGVkLCBldmVyeSBjbGFzcyBzaG91bGQgYmUgZGVmaW5lZCB0b2dldGhlciBoZXJlCisgIC8vIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSBzZXBhcmF0ZSBoZWFkZXJzIGZvciB0aGVtLgorICAvLyAoZS5nLiBJRm9vLCBJRm9vRGVmYXVsdCwgQnBGb28sIEJuRm9vLCBJRm9vRGVsZWdhdG9yKQorICBpZiAoaW50ZXJmYWNlLkdldFBhcmVudFR5cGUoKSkgeworICAgIEdlbmVyYXRlQ2xpZW50Q2xhc3NEZWNsKG91dCwgaW50ZXJmYWNlLCB0eXBlbmFtZXMsIG9wdGlvbnMpOworICAgIEdlbmVyYXRlU2VydmVyQ2xhc3NEZWNsKG91dCwgaW50ZXJmYWNlLCB0eXBlbmFtZXMsIG9wdGlvbnMpOwogICB9Ci0gIHJlYWRfYmxvY2stPkFkZExpdGVyYWwoIl9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkiKTsKLSAgcmVhZF9ibG9jay0+QWRkTGl0ZXJhbChTdHJpbmdQcmludGYoInJldHVybiAlcyIsIGtBbmRyb2lkU3RhdHVzVmFyTmFtZSkpOwogfQogCi12b2lkIEJ1aWxkV3JpdGVUb1BhcmNlbChjb25zdCBBaWRsU3RydWN0dXJlZFBhcmNlbGFibGUmIHBhcmNlbCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGVtZW50QmxvY2sqIHdyaXRlX2Jsb2NrKSB7Ci0gIHdyaXRlX2Jsb2NrLT5BZGRMaXRlcmFsKAotICAgICAgU3RyaW5nUHJpbnRmKCIlcyAlcyA9ICVzIiwga0FuZHJvaWRTdGF0dXNMaXRlcmFsLCBrQW5kcm9pZFN0YXR1c1Zhck5hbWUsIGtBbmRyb2lkU3RhdHVzT2spKTsKK3ZvaWQgR2VuZXJhdGVSZWFkRnJvbVBhcmNlbChDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxTdHJ1Y3R1cmVkUGFyY2VsYWJsZSYgcGFyY2VsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcykgeworICBvdXQgPDwgIjo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7XG4iOworICBvdXQgPDwgInNpemVfdCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpO1xuIjsKKyAgb3V0IDw8ICJpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPSAwO1xuIjsKKyAgb3V0IDw8ICJfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkSW50MzIoJl9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUpO1xuIjsKKyAgb3V0IDw8ICJpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7XG4iOworICBvdXQgPDwgIiAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7XG4iOworICBvdXQgPDwgIn1cbiI7CisgIG91dCA8PCAiaWYgKF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPCA0KSByZXR1cm4gOjphbmRyb2lkOjpCQURfVkFMVUU7XG4iOworICBvdXQgPDwgInNpemVfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUpO1xuIjsKKyAgb3V0IDw8ICJpZiAoX2FpZGxfc3RhcnRfcG9zID4gU0laRV9NQVggLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTtcbiI7CisgIGZvciAoY29uc3QgYXV0byYgdmFyaWFibGUgOiBwYXJjZWwuR2V0RmllbGRzKCkpIHsKKyAgICBzdHJpbmcgbWV0aG9kID0gUGFyY2VsUmVhZE1ldGhvZE9mKHZhcmlhYmxlLT5HZXRUeXBlKCksIHR5cGVuYW1lcyk7CisgICAgc3RyaW5nIGFyZyA9IFBhcmNlbFJlYWRDYXN0T2YodmFyaWFibGUtPkdldFR5cGUoKSwgdHlwZW5hbWVzLCAiJiIgKyB2YXJpYWJsZS0+R2V0TmFtZSgpKTsKKyAgICBvdXQgPDwgImlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkge1xuIjsKKyAgICBvdXQgPDwgIiAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTtcbiI7CisgICAgb3V0IDw8ICIgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzO1xuIjsKKyAgICBvdXQgPDwgIn1cbiI7CisgICAgb3V0IDw8ICJfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT4iIDw8IG1ldGhvZCA8PCAiKCIgPDwgYXJnIDw8ICIpO1xuIjsKKyAgICBvdXQgPDwgImlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHtcbiI7CisgICAgb3V0IDw8ICIgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzO1xuIjsKKyAgICBvdXQgPDwgIn1cbiI7CisgIH0KKyAgb3V0IDw8ICJfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpO1xuIjsKKyAgb3V0IDw8ICJyZXR1cm4gX2FpZGxfcmV0X3N0YXR1cztcbiI7Cit9CiAKLSAgd3JpdGVfYmxvY2stPkFkZExpdGVyYWwoCi0gICAgICAiYXV0byBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpO1xuIgotICAgICAgIl9haWRsX3BhcmNlbC0+d3JpdGVJbnQzMigwKTtcbiIsCi0gICAgICAvKmFkZF9zZW1pY29sb249Ki9mYWxzZSk7Ci0KK3ZvaWQgR2VuZXJhdGVXcml0ZVRvUGFyY2VsKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbFN0cnVjdHVyZWRQYXJjZWxhYmxlJiBwYXJjZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMpIHsKKyAgb3V0IDw8ICI6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LO1xuIjsKKyAgb3V0IDw8ICJhdXRvIF9haWRsX3N0YXJ0X3BvcyA9ICIgPDwga1BhcmNlbFZhck5hbWUgPDwgIi0+ZGF0YVBvc2l0aW9uKCk7XG4iOworICBvdXQgPDwga1BhcmNlbFZhck5hbWUgPDwgIi0+d3JpdGVJbnQzMigwKTtcbiI7CiAgIGZvciAoY29uc3QgYXV0byYgdmFyaWFibGUgOiBwYXJjZWwuR2V0RmllbGRzKCkpIHsKICAgICBzdHJpbmcgbWV0aG9kID0gUGFyY2VsV3JpdGVNZXRob2RPZih2YXJpYWJsZS0+R2V0VHlwZSgpLCB0eXBlbmFtZXMpOwotICAgIHdyaXRlX2Jsb2NrLT5BZGRTdGF0ZW1lbnQobmV3IEFzc2lnbm1lbnQoCi0gICAgICAgIGtBbmRyb2lkU3RhdHVzVmFyTmFtZSwKLSAgICAgICAgbmV3IE1ldGhvZENhbGwoU3RyaW5nUHJpbnRmKCJfYWlkbF9wYXJjZWwtPiVzIiwgbWV0aG9kLmNfc3RyKCkpLAotICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWxXcml0ZUNhc3RPZih2YXJpYWJsZS0+R2V0VHlwZSgpLCB0eXBlbmFtZXMsIHZhcmlhYmxlLT5HZXROYW1lKCkpKSkpOwotICAgIHdyaXRlX2Jsb2NrLT5BZGRTdGF0ZW1lbnQoUmV0dXJuT25TdGF0dXNOb3RPaygpKTsKKyAgICBzdHJpbmcgYXJnID0gUGFyY2VsV3JpdGVDYXN0T2YodmFyaWFibGUtPkdldFR5cGUoKSwgdHlwZW5hbWVzLCB2YXJpYWJsZS0+R2V0TmFtZSgpKTsKKyAgICBvdXQgPDwgIl9haWRsX3JldF9zdGF0dXMgPSAiIDw8IGtQYXJjZWxWYXJOYW1lIDw8ICItPiIgPDwgbWV0aG9kIDw8ICIoIiA8PCBhcmcgPDwgIik7XG4iOworICAgIG91dCA8PCAiaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkge1xuIjsKKyAgICBvdXQgPDwgIiAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7XG4iOworICAgIG91dCA8PCAifVxuIjsKICAgfQotCi0gIHdyaXRlX2Jsb2NrLT5BZGRMaXRlcmFsKAotICAgICAgImF1dG8gX2FpZGxfZW5kX3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7XG4iCi0gICAgICAiX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zKTtcbiIKLSAgICAgICJfYWlkbF9wYXJjZWwtPndyaXRlSW50MzIoX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7XG4iCi0gICAgICAiX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfZW5kX3Bvcyk7XG4iLAotICAgICAgLyphZGRfc2VtaWNvbG9uPSovZmFsc2UpOwotICB3cml0ZV9ibG9jay0+QWRkTGl0ZXJhbChTdHJpbmdQcmludGYoInJldHVybiAlcyIsIGtBbmRyb2lkU3RhdHVzVmFyTmFtZSkpOworICBvdXQgPDwgImF1dG8gX2FpZGxfZW5kX3BvcyA9ICIgPDwga1BhcmNlbFZhck5hbWUgPDwgIi0+ZGF0YVBvc2l0aW9uKCk7XG4iOworICBvdXQgPDwga1BhcmNlbFZhck5hbWUgPDwgIi0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3Bvcyk7XG4iOworICBvdXQgPDwga1BhcmNlbFZhck5hbWUgPDwgIi0+d3JpdGVJbnQzMihfYWlkbF9lbmRfcG9zIC0gX2FpZGxfc3RhcnRfcG9zKTtcbiI7CisgIG91dCA8PCBrUGFyY2VsVmFyTmFtZSA8PCAiLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfZW5kX3Bvcyk7XG4iOworICBvdXQgPDwgInJldHVybiBfYWlkbF9yZXRfc3RhdHVzO1xuIjsKIH0KIAogUGFyY2VsV3JpdGVyQ29udGV4dCBHZXRQYXJjZWxXcml0ZXJDb250ZXh0KGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcykgewpAQCAtMTE5MSwzODIgKzEwMzUsMTU3IEBACiAgIH07CiB9CiAKLXZvaWQgQWRkVHlwZVNwZWNpZmljSGVhZGVycyhjb25zdCBBaWRsVW5pb25EZWNsJiwgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+JiBpbmNsdWRlcykgewotICBpbmNsdWRlcy5pbnNlcnQoc3RkOjpiZWdpbihVbmlvbldyaXRlcjo6aGVhZGVycyksIHN0ZDo6ZW5kKFVuaW9uV3JpdGVyOjpoZWFkZXJzKSk7Ci19Ci0KLXZvaWQgQnVpbGRSZWFkRnJvbVBhcmNlbChjb25zdCBBaWRsVW5pb25EZWNsJiBkZWNsLCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGVtZW50QmxvY2sqIHJlYWRfYmxvY2spIHsKLSAgc3RyaW5nIGJvZHk7Cit2b2lkIEdlbmVyYXRlUmVhZEZyb21QYXJjZWwoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsVW5pb25EZWNsJiBkZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcykgewogICBVbmlvbldyaXRlciB1d3tkZWNsLCB0eXBlbmFtZXMsICZDcHBOYW1lT2YsICZDb25zdGFudFZhbHVlRGVjb3JhdG9yfTsKLSAgdXcuUmVhZEZyb21QYXJjZWwoKkNvZGVXcml0ZXI6OkZvclN0cmluZygmYm9keSksIEdldFBhcmNlbFdyaXRlckNvbnRleHQodHlwZW5hbWVzKSk7Ci0gIHJlYWRfYmxvY2stPkFkZExpdGVyYWwoYm9keSwgLyphZGRfc2VtaWNvbG9uPSovZmFsc2UpOworICB1dy5SZWFkRnJvbVBhcmNlbChvdXQsIEdldFBhcmNlbFdyaXRlckNvbnRleHQodHlwZW5hbWVzKSk7CiB9CiAKLXZvaWQgQnVpbGRXcml0ZVRvUGFyY2VsKGNvbnN0IEFpZGxVbmlvbkRlY2wmIGRlY2wsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlbWVudEJsb2NrKiB3cml0ZV9ibG9jaykgewotICBzdHJpbmcgYm9keTsKK3ZvaWQgR2VuZXJhdGVXcml0ZVRvUGFyY2VsKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbFVuaW9uRGVjbCYgZGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcykgewogICBVbmlvbldyaXRlciB1d3tkZWNsLCB0eXBlbmFtZXMsICZDcHBOYW1lT2YsICZDb25zdGFudFZhbHVlRGVjb3JhdG9yfTsKLSAgdXcuV3JpdGVUb1BhcmNlbCgqQ29kZVdyaXRlcjo6Rm9yU3RyaW5nKCZib2R5KSwgR2V0UGFyY2VsV3JpdGVyQ29udGV4dCh0eXBlbmFtZXMpKTsKLSAgd3JpdGVfYmxvY2stPkFkZExpdGVyYWwoYm9keSwgLyphZGRfc2VtaWNvbG9uPSovZmFsc2UpOworICB1dy5Xcml0ZVRvUGFyY2VsKG91dCwgR2V0UGFyY2VsV3JpdGVyQ29udGV4dCh0eXBlbmFtZXMpKTsKIH0KIAotdm9pZCBCdWlsZFBhcmNlbEZpZWxkcyhDbGFzc0RlY2wmIGNsYXp6LCBjb25zdCBBaWRsU3RydWN0dXJlZFBhcmNlbGFibGUmIGRlY2wsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcykgewordm9pZCBHZW5lcmF0ZVBhcmNlbEZpZWxkcyhDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxTdHJ1Y3R1cmVkUGFyY2VsYWJsZSYgZGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzKSB7CiAgIGZvciAoY29uc3QgYXV0byYgdmFyaWFibGUgOiBkZWNsLkdldEZpZWxkcygpKSB7Ci0gICAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKLSAgICBzdGQ6OnN0cmluZyBjcHBUeXBlID0gQ3BwTmFtZU9mKHZhcmlhYmxlLT5HZXRUeXBlKCksIHR5cGVuYW1lcyk7Ci0gICAgb3V0IDw8IGNwcFR5cGU7CisgICAgY29uc3QgYXV0byYgdHlwZSA9IHZhcmlhYmxlLT5HZXRUeXBlKCk7CisgICAgc3RkOjpzdHJpbmcgY3BwX3R5cGUgPSBDcHBOYW1lT2YodHlwZSwgdHlwZW5hbWVzKTsKKyAgICBvdXQgPDwgY3BwX3R5cGU7CiAgICAgR2VuZXJhdGVEZXByZWNhdGVkKG91dCwgKnZhcmlhYmxlKTsKLSAgICBvdXQgPDwgIiAiIDw8IHZhcmlhYmxlLT5HZXROYW1lKCkuY19zdHIoKTsKKyAgICBvdXQgPDwgIiAiIDw8IHZhcmlhYmxlLT5HZXROYW1lKCk7CiAgICAgaWYgKHZhcmlhYmxlLT5HZXREZWZhdWx0VmFsdWUoKSkgewotICAgICAgb3V0IDw8ICIgPSAiIDw8IEdldEluaXRpYWxpemVyKHR5cGVuYW1lcywgKnZhcmlhYmxlKTsKLSAgICB9IGVsc2UgaWYgKHZhcmlhYmxlLT5HZXRUeXBlKCkuR2V0TmFtZSgpID09ICJQYXJjZWxhYmxlSG9sZGVyIikgewotICAgICAgaWYgKGRlY2wuSXNWaW50ZlN0YWJpbGl0eSgpKSB7Ci0gICAgICAgIG91dCA8PCAiIHsgOjphbmRyb2lkOjpQYXJjZWxhYmxlOjpTdGFiaWxpdHk6OlNUQUJJTElUWV9WSU5URiB9IjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCAiIHsgOjphbmRyb2lkOjpQYXJjZWxhYmxlOjpTdGFiaWxpdHk6OlNUQUJJTElUWV9MT0NBTCB9IjsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGF1dG8gdHlwZSA9IHZhcmlhYmxlLT5HZXRUeXBlKCkuR2V0RGVmaW5lZFR5cGUoKTsgdHlwZSkgewotICAgICAgaWYgKGF1dG8gZW51bV90eXBlID0gdHlwZS0+QXNFbnVtRGVjbGFyYXRpb24oKTsgZW51bV90eXBlKSB7Ci0gICAgICAgIGlmICghdmFyaWFibGUtPkdldFR5cGUoKS5Jc0FycmF5KCkpIHsKLSAgICAgICAgICAvLyBpZiBhbiBlbnVtIGRvZXNuJ3QgaGF2ZSBleHBsaWNpdCBkZWZhdWx0IHZhbHVlLCBkbyB6ZXJvLWluaXRpYWxpemF0aW9uCi0gICAgICAgICAgb3V0IDw8ICIgPSAiIDw8IGNwcFR5cGUgPDwgIigwKSI7CisgICAgICBvdXQgPDwgIiA9ICIgPDwgdmFyaWFibGUtPlZhbHVlU3RyaW5nKENvbnN0YW50VmFsdWVEZWNvcmF0b3IpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBTb21lIHR5cGVzIG5lZWRzIHRvIGJlIGV4cGxpY2l0bHkgaW5pdGlhbGl6ZWQgZXZlbiB3aGVuIG5vIGRlZmF1bHQgdmFsdWUgaXMgc2V0LgorICAgICAgLy8gLSBQYXJjZWxhYmxlSG9sZGVyIHNob3VsZCBiZSBpbml0aWFsaXplZCB3aXRoIHN0YWJpbGl0eQorICAgICAgLy8gLSBlbnVtIHNob3VsZCBiZSB6ZXJvIGluaXRpYWxpemVkLCBvdGhlcndpc2UgdGhlIHZhbHVlIHdpbGwgYmUgaW5kZXRlcm1pbmF0ZQorICAgICAgLy8gLSBmaXhlZC1zaXplIGFycmF5cyBzaG91bGQgYmUgaW5pdGlhbGl6ZWQsIG90aGVyd2lzZSB0aGUgdmFsdWUgd2lsbCBiZSBpbmRldGVybWluYXRlCisgICAgICBpZiAodHlwZS5HZXROYW1lKCkgPT0gIlBhcmNlbGFibGVIb2xkZXIiKSB7CisgICAgICAgIGlmIChkZWNsLklzVmludGZTdGFiaWxpdHkoKSkgeworICAgICAgICAgIG91dCA8PCAiIHsgOjphbmRyb2lkOjpQYXJjZWxhYmxlOjpTdGFiaWxpdHk6OlNUQUJJTElUWV9WSU5URiB9IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgIiB7IDo6YW5kcm9pZDo6UGFyY2VsYWJsZTo6U3RhYmlsaXR5OjpTVEFCSUxJVFlfTE9DQUwgfSI7CiAgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAodHlwZW5hbWVzLkdldEVudW1EZWNsYXJhdGlvbih0eXBlKSAmJiAhdHlwZS5Jc0FycmF5KCkpIHsKKyAgICAgICAgb3V0IDw8ICIgPSAiIDw8IGNwcF90eXBlIDw8ICIoMCkiOworICAgICAgfSBlbHNlIGlmICh0eXBlLklzRml4ZWRTaXplQXJyYXkoKSAmJiAhdHlwZS5Jc051bGxhYmxlKCkpIHsKKyAgICAgICAgb3V0IDw8ICIgPSB7e319IjsKICAgICAgIH0KICAgICB9CiAgICAgb3V0IDw8ICI7XG4iOwotCi0gICAgY2xhenouQWRkUHVibGljKHN0ZDo6dW5pcXVlX3B0cjxMaXRlcmFsRGVjbD4obmV3IExpdGVyYWxEZWNsKG91dC5zdHIoKSkpKTsKICAgfQogfQogCi12b2lkIEJ1aWxkUGFyY2VsRmllbGRzKENsYXNzRGVjbCYgY2xhenosIGNvbnN0IEFpZGxVbmlvbkRlY2wmIGRlY2wsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcykgewordm9pZCBHZW5lcmF0ZVBhcmNlbEZpZWxkcyhDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxVbmlvbkRlY2wmIGRlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcykgewogICBVbmlvbldyaXRlciB1d3tkZWNsLCB0eXBlbmFtZXMsICZDcHBOYW1lT2YsICZDb25zdGFudFZhbHVlRGVjb3JhdG9yfTsKLSAgc3RyaW5nIHB1YmxpY19maWVsZHM7Ci0gIHN0cmluZyBwcml2YXRlX2ZpZWxkczsKLSAgdXcuUHVibGljRmllbGRzKCpDb2RlV3JpdGVyOjpGb3JTdHJpbmcoJnB1YmxpY19maWVsZHMpKTsKLSAgdXcuUHJpdmF0ZUZpZWxkcygqQ29kZVdyaXRlcjo6Rm9yU3RyaW5nKCZwcml2YXRlX2ZpZWxkcykpOwotICBjbGF6ei5BZGRQdWJsaWMoc3RkOjptYWtlX3VuaXF1ZTxMaXRlcmFsRGVjbD4ocHVibGljX2ZpZWxkcykpOwotICBjbGF6ei5BZGRQcml2YXRlKHN0ZDo6bWFrZV91bmlxdWU8TGl0ZXJhbERlY2w+KHByaXZhdGVfZmllbGRzKSk7CisgIHV3LlB1YmxpY0ZpZWxkcyhvdXQpOwogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgUGFyY2VsYWJsZVR5cGU+Ci1zdGQ6OnVuaXF1ZV9wdHI8RG9jdW1lbnQ+IEJ1aWxkUGFyY2VsSGVhZGVyKGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyY2VsYWJsZVR5cGUmIHBhcmNlbCwgY29uc3QgT3B0aW9ucyYpIHsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiB0eXBlX3BhcmFtcyA9Ci0gICAgICBwYXJjZWwuSXNHZW5lcmljKCkgPyBwYXJjZWwuR2V0VHlwZVBhcmFtZXRlcnMoKSA6IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPigpOwotICBjb25zdCBzdGQ6OnN0cmluZyBhdHRyaWJ1dGUgPSBHZXREZXByZWNhdGVkQXR0cmlidXRlKHBhcmNlbCk7Ci0gIHVuaXF1ZV9wdHI8Q2xhc3NEZWNsPiBwYXJjZWxfY2xhc3N7Ci0gICAgICBuZXcgQ2xhc3NEZWNse3BhcmNlbC5HZXROYW1lKCksICI6OmFuZHJvaWQ6OlBhcmNlbGFibGUiLCB0eXBlX3BhcmFtcywgYXR0cmlidXRlfX07Cit2b2lkIEdlbmVyYXRlUGFyY2VsQ2xhc3NEZWNsKENvZGVXcml0ZXImIG91dCwgY29uc3QgUGFyY2VsYWJsZVR5cGUmIHBhcmNlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIGNvbnN0IHN0cmluZyBjbGF6eiA9IHBhcmNlbC5HZXROYW1lKCk7CiAKLSAgc2V0PHN0cmluZz4gaW5jbHVkZXMgPSB7a1N0YXR1c0hlYWRlciwga1BhcmNlbEhlYWRlciwga1N0cmluZzE2SGVhZGVyfTsKLSAgQWRkVHlwZVNwZWNpZmljSGVhZGVycyhwYXJjZWwsIGluY2x1ZGVzKTsKKyAgb3V0IDw8IFRlbXBsYXRlRGVjbChwYXJjZWwpOworICBvdXQgPDwgImNsYXNzIjsKKyAgR2VuZXJhdGVEZXByZWNhdGVkKG91dCwgcGFyY2VsKTsKKyAgb3V0IDw8ICIgIiA8PCBjbGF6eiA8PCAiIDogcHVibGljIDo6YW5kcm9pZDo6UGFyY2VsYWJsZSB7XG4iOworICBvdXQgPDwgInB1YmxpYzpcbiI7CisgIG91dC5JbmRlbnQoKTsKIAotICBmb3IgKGNvbnN0IGF1dG8mIHZhcmlhYmxlIDogcGFyY2VsLkdldEZpZWxkcygpKSB7Ci0gICAgQWRkSGVhZGVycyh2YXJpYWJsZS0+R2V0VHlwZSgpLCB0eXBlbmFtZXMsICZpbmNsdWRlcyk7Ci0gIH0KLQotICBzdHJpbmcgb3BlcmF0b3JfY29kZTsKLSAgR2VuZXJhdGVQYXJjZWxhYmxlQ29tcGFyaXNvbk9wZXJhdG9ycygqQ29kZVdyaXRlcjo6Rm9yU3RyaW5nKCZvcGVyYXRvcl9jb2RlKSwgcGFyY2VsKTsKLSAgcGFyY2VsX2NsYXNzLT5BZGRQdWJsaWMoc3RkOjptYWtlX3VuaXF1ZTxMaXRlcmFsRGVjbD4ob3BlcmF0b3JfY29kZSkpOwotCi0gIEJ1aWxkUGFyY2VsRmllbGRzKCpwYXJjZWxfY2xhc3MsIHBhcmNlbCwgdHlwZW5hbWVzKTsKLSAgQnVpbGRDb25zdGFudERlY2xhcmF0aW9ucyhwYXJjZWwsIHR5cGVuYW1lcywgcGFyY2VsX2NsYXNzLCBpbmNsdWRlcyk7CisgIEdlbmVyYXRlTmVzdGVkVHlwZURlY2xzKG91dCwgcGFyY2VsLCB0eXBlbmFtZXMsIG9wdGlvbnMpOworICBHZW5lcmF0ZVBhcmNlbEZpZWxkcyhvdXQsIHBhcmNlbCwgdHlwZW5hbWVzKTsKKyAgR2VuZXJhdGVQYXJjZWxhYmxlQ29tcGFyaXNvbk9wZXJhdG9ycyhvdXQsIHBhcmNlbCk7CisgIEdlbmVyYXRlQ29uc3RhbnREZWNsYXJhdGlvbnMob3V0LCBwYXJjZWwsIHR5cGVuYW1lcyk7CiAKICAgaWYgKHBhcmNlbC5Jc1ZpbnRmU3RhYmlsaXR5KCkpIHsKLSAgICBwYXJjZWxfY2xhc3MtPkFkZFB1YmxpYyhzdGQ6OnVuaXF1ZV9wdHI8TGl0ZXJhbERlY2w+KAotICAgICAgICBuZXcgTGl0ZXJhbERlY2woIjo6YW5kcm9pZDo6UGFyY2VsYWJsZTo6U3RhYmlsaXR5IGdldFN0YWJpbGl0eSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuICIKLSAgICAgICAgICAgICAgICAgICAgICAgICI6OmFuZHJvaWQ6OlBhcmNlbGFibGU6OlN0YWJpbGl0eTo6U1RBQklMSVRZX1ZJTlRGOyB9XG4iKSkpOworICAgIG91dCA8PCAiOjphbmRyb2lkOjpQYXJjZWxhYmxlOjpTdGFiaWxpdHkgZ2V0U3RhYmlsaXR5KCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gIgorICAgICAgICAgICAiOjphbmRyb2lkOjpQYXJjZWxhYmxlOjpTdGFiaWxpdHk6OlNUQUJJTElUWV9WSU5URjsgfVxuIjsKICAgfQogCi0gIHVuaXF1ZV9wdHI8TWV0aG9kRGVjbD4gcmVhZChuZXcgTWV0aG9kRGVjbChrQW5kcm9pZFN0YXR1c0xpdGVyYWwsICJyZWFkRnJvbVBhcmNlbCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdMaXN0KCJjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2REZWNsOjpJU19GSU5BTCkpOwotICBwYXJjZWxfY2xhc3MtPkFkZFB1YmxpYyhzdGQ6Om1vdmUocmVhZCkpOwotICB1bmlxdWVfcHRyPE1ldGhvZERlY2w+IHdyaXRlKG5ldyBNZXRob2REZWNsKGtBbmRyb2lkU3RhdHVzTGl0ZXJhbCwgIndyaXRlVG9QYXJjZWwiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ0xpc3QoIjo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2REZWNsOjpJU19DT05TVCB8IE1ldGhvZERlY2w6OklTX0ZJTkFMKSk7Ci0gIHBhcmNlbF9jbGFzcy0+QWRkUHVibGljKHN0ZDo6bW92ZSh3cml0ZSkpOworICBvdXQgPDwga0FuZHJvaWRTdGF0dXNMaXRlcmFsIDw8ICIgcmVhZEZyb21QYXJjZWwoY29uc3QgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgZmluYWw7XG4iOworICBvdXQgPDwga0FuZHJvaWRTdGF0dXNMaXRlcmFsIDw8ICIgd3JpdGVUb1BhcmNlbCg6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCBmaW5hbDtcbiI7CiAKLSAgcGFyY2VsX2NsYXNzLT5BZGRQdWJsaWMoc3RkOjp1bmlxdWVfcHRyPExpdGVyYWxEZWNsPigKLSAgICAgIG5ldyBMaXRlcmFsRGVjbChTdHJpbmdQcmludGYoInN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiBnZXRQYXJjZWxhYmxlRGVzY3JpcHRvcigpIHtcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgc3RhdGljIGNvbnN0IDo6YW5kcm9pZDo6U3RhdGljU3RyaW5nMTYgREVTQ0lQVE9SICh1XCIlc1wiKTtcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgcmV0dXJuIERFU0NJUFRPUjtcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn1cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmNlbC5HZXRDYW5vbmljYWxOYW1lKCkuY19zdHIoKSkpKSk7CisgIGNvbnN0IHN0cmluZyBjYW5vbmljYWxfbmFtZSA9IHBhcmNlbC5HZXRDYW5vbmljYWxOYW1lKCk7CisgIG91dCA8PCAic3RhdGljIGNvbnN0IDo6YW5kcm9pZDo6U3RyaW5nMTYmIGdldFBhcmNlbGFibGVEZXNjcmlwdG9yKCkge1xuIgorICAgICAgPDwgIiAgc3RhdGljIGNvbnN0IDo6YW5kcm9pZDo6U3RhdGljU3RyaW5nMTYgREVTQ0lQVE9SICh1XCIiIDw8IGNhbm9uaWNhbF9uYW1lIDw8ICJcIik7XG4iCisgICAgICA8PCAiICByZXR1cm4gREVTQ0lQVE9SO1xuIgorICAgICAgPDwgIn1cbiI7CiAKLSAgLy8gdG9TdHJpbmcoKSBtZXRob2QKLSAgaW5jbHVkZXMuaW5zZXJ0KCJhbmRyb2lkL2JpbmRlcl90b19zdHJpbmcuaCIpOwotICBzdHJpbmcgdG9fc3RyaW5nOwotICBHZW5lcmF0ZVRvU3RyaW5nKCpDb2RlV3JpdGVyOjpGb3JTdHJpbmcoJnRvX3N0cmluZyksIHBhcmNlbCk7Ci0gIHBhcmNlbF9jbGFzcy0+QWRkUHVibGljKHN0ZDo6bWFrZV91bmlxdWU8TGl0ZXJhbERlY2w+KHRvX3N0cmluZykpOworICBHZW5lcmF0ZVRvU3RyaW5nKG91dCwgcGFyY2VsKTsKIAotICBhdXRvIGRlY2xzID0gTmVzdEluTmFtZXNwYWNlcyhzdGQ6Om1vdmUocGFyY2VsX2NsYXNzKSwgcGFyY2VsLkdldFNwbGl0UGFja2FnZSgpKTsKLSAgLy8gVE9ETyhiLzMxNTU5MDk1KSBiaW9uaWMgb24gaG9zdCBzaG91bGQgZGVmaW5lIHRoaXMKLSAgaWYgKHBhcmNlbC5Bc1VuaW9uRGVjbGFyYXRpb24oKSkgewotICAgIGRlY2xzLmluc2VydChkZWNscy5iZWdpbigpLAotICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPExpdGVyYWxEZWNsPigKLSAgICAgICAgICAgICAgICAgICAgICIjaWZuZGVmIF9fQklPTklDX19cbiNkZWZpbmUgX19hc3NlcnQyKGEsYixjLGQpICgodm9pZCkwKVxuI2VuZGlmXG5cbiIpKTsKKyAgb3V0LkRlZGVudCgpOworCisgIGlmIChhdXRvIGRlY2wgPSBBaWRsQ2FzdDxBaWRsVW5pb25EZWNsPihwYXJjZWwpOyBkZWNsKSB7CisgICAgb3V0IDw8ICJwcml2YXRlOlxuIjsKKyAgICBvdXQuSW5kZW50KCk7CisgICAgVW5pb25Xcml0ZXIgdXd7KmRlY2wsIHR5cGVuYW1lcywgJkNwcE5hbWVPZiwgJkNvbnN0YW50VmFsdWVEZWNvcmF0b3J9OworICAgIHV3LlByaXZhdGVGaWVsZHMob3V0KTsKKyAgICBvdXQuRGVkZW50KCk7CiAgIH0KLSAgcmV0dXJuIHVuaXF1ZV9wdHI8RG9jdW1lbnQ+ewotICAgICAgbmV3IENwcEhlYWRlcnt2ZWN0b3I8c3RyaW5nPihpbmNsdWRlcy5iZWdpbigpLCBpbmNsdWRlcy5lbmQoKSksIHN0ZDo6bW92ZShkZWNscyl9fTsKKworICBvdXQgPDwgIn07ICAvLyBjbGFzcyAiIDw8IGNsYXp6IDw8ICJcbiI7CiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RkOjp1bmlxdWVfcHRyPERvY3VtZW50PiBCdWlsZFBhcmNlbFNvdXJjZShjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsIGNvbnN0IFQmIHBhcmNlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYpIHsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiB0eXBlX3BhcmFtcyA9Ci0gICAgICBwYXJjZWwuSXNHZW5lcmljKCkgPyBwYXJjZWwuR2V0VHlwZVBhcmFtZXRlcnMoKSA6IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPigpOwotICBhdXRvIHJlYWQgPQotICAgICAgc3RkOjptYWtlX3VuaXF1ZTxNZXRob2RJbXBsPihrQW5kcm9pZFN0YXR1c0xpdGVyYWwsIHBhcmNlbC5HZXROYW1lKCksICJyZWFkRnJvbVBhcmNlbCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVfcGFyYW1zLCBBcmdMaXN0KCJjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsIikpOwotICBCdWlsZFJlYWRGcm9tUGFyY2VsKHBhcmNlbCwgdHlwZW5hbWVzLCByZWFkLT5HZXRTdGF0ZW1lbnRCbG9jaygpKTsKK3ZvaWQgR2VuZXJhdGVQYXJjZWxTb3VyY2UoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBUJiBwYXJjZWwsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYpIHsKKyAgc3RyaW5nIHFfbmFtZSA9IEdldFF1YWxpZmllZE5hbWUocGFyY2VsKTsKKyAgaWYgKHBhcmNlbC5Jc0dlbmVyaWMoKSkgeworICAgIHFfbmFtZSArPSAiPCIgKyBKb2luKHBhcmNlbC5HZXRUeXBlUGFyYW1ldGVycygpLCAiLCIpICsgIj4iOworICB9CiAKLSAgYXV0byB3cml0ZSA9IHN0ZDo6bWFrZV91bmlxdWU8TWV0aG9kSW1wbD4oCi0gICAgICBrQW5kcm9pZFN0YXR1c0xpdGVyYWwsIHBhcmNlbC5HZXROYW1lKCksICJ3cml0ZVRvUGFyY2VsIiwgdHlwZV9wYXJhbXMsCi0gICAgICBBcmdMaXN0KCI6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsIiksIHRydWUgLypjb25zdCovKTsKLSAgQnVpbGRXcml0ZVRvUGFyY2VsKHBhcmNlbCwgdHlwZW5hbWVzLCB3cml0ZS0+R2V0U3RhdGVtZW50QmxvY2soKSk7CisgIG91dCA8PCAiI2luY2x1ZGUgPCIgPDwgQ3BwSGVhZGVyRm9yVHlwZShwYXJjZWwpIDw8ICI+XG5cbiI7CiAKLSAgdmVjdG9yPHVuaXF1ZV9wdHI8RGVjbGFyYXRpb24+PiBmaWxlX2RlY2xzOwotICBCdWlsZENvbnN0YW50RGVmaW5pdGlvbnMocGFyY2VsLCB0eXBlbmFtZXMsIHR5cGVfcGFyYW1zLCBwYXJjZWwuR2V0TmFtZSgpLCBmaWxlX2RlY2xzKTsKLSAgZmlsZV9kZWNscy5wdXNoX2JhY2soc3RkOjptb3ZlKHJlYWQpKTsKLSAgZmlsZV9kZWNscy5wdXNoX2JhY2soc3RkOjptb3ZlKHdyaXRlKSk7CisgIEVudGVyTmFtZXNwYWNlKG91dCwgcGFyY2VsKTsKKyAgR2VuZXJhdGVDb25zdGFudERlZmluaXRpb25zKG91dCwgcGFyY2VsLCB0eXBlbmFtZXMsIFRlbXBsYXRlRGVjbChwYXJjZWwpLCBxX25hbWUpOwogCi0gIHNldDxzdHJpbmc+IGluY2x1ZGVzID0ge307Ci0gIEFkZEhlYWRlcnMocGFyY2VsLCAmaW5jbHVkZXMpOworICBvdXQgPDwgVGVtcGxhdGVEZWNsKHBhcmNlbCk7CisgIG91dCA8PCAiOjphbmRyb2lkOjpzdGF0dXNfdCAiIDw8IHFfbmFtZSA8PCAiOjpyZWFkRnJvbVBhcmNlbChjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCogIgorICAgICAgPDwga1BhcmNlbFZhck5hbWUgPDwgIikge1xuIjsKKyAgb3V0LkluZGVudCgpOworICBHZW5lcmF0ZVJlYWRGcm9tUGFyY2VsKG91dCwgcGFyY2VsLCB0eXBlbmFtZXMpOworICBvdXQuRGVkZW50KCk7CisgIG91dCA8PCAifVxuIjsKIAotICByZXR1cm4gdW5pcXVlX3B0cjxEb2N1bWVudD57Ci0gICAgICBuZXcgQ3BwU291cmNle3ZlY3RvcjxzdHJpbmc+KGluY2x1ZGVzLmJlZ2luKCksIGluY2x1ZGVzLmVuZCgpKSwKLSAgICAgICAgICAgICAgICAgICAgTmVzdEluTmFtZXNwYWNlcyhzdGQ6Om1vdmUoZmlsZV9kZWNscyksIHBhcmNlbC5HZXRTcGxpdFBhY2thZ2UoKSl9fTsKKyAgb3V0IDw8IFRlbXBsYXRlRGVjbChwYXJjZWwpOworICBvdXQgPDwgIjo6YW5kcm9pZDo6c3RhdHVzX3QgIiA8PCBxX25hbWUgPDwgIjo6d3JpdGVUb1BhcmNlbCg6OmFuZHJvaWQ6OlBhcmNlbCogIiA8PCBrUGFyY2VsVmFyTmFtZQorICAgICAgPDwgIikgY29uc3Qge1xuIjsKKyAgb3V0LkluZGVudCgpOworICBHZW5lcmF0ZVdyaXRlVG9QYXJjZWwob3V0LCBwYXJjZWwsIHR5cGVuYW1lcyk7CisgIG91dC5EZWRlbnQoKTsKKyAgb3V0IDw8ICJ9XG4iOworICBMZWF2ZU5hbWVzcGFjZShvdXQsIHBhcmNlbCk7CiB9CiAKLXN0ZDo6c3RyaW5nIEdlbmVyYXRlRW51bVRvU3RyaW5nKGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxFbnVtRGVjbGFyYXRpb24mIGVudW1fZGVjbCkgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gY29kZTsKLSAgY29kZSA8PCAiW1tub2Rpc2NhcmRdXSI7Ci0gIEdlbmVyYXRlRGVwcmVjYXRlZChjb2RlLCBlbnVtX2RlY2wpOwotICBjb2RlIDw8ICIgc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZygiIDw8IGVudW1fZGVjbC5HZXROYW1lKCkgPDwgIiB2YWwpIjsKLSAgY29kZSA8PCAiIHtcbiI7Ci0gIGNvZGUgPDwgIiAgc3dpdGNoKHZhbCkge1xuIjsKLSAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IHVuaXF1ZV9jYXNlczsKLSAgZm9yIChjb25zdCBhdXRvJiBlbnVtZXJhdG9yIDogZW51bV9kZWNsLkdldEVudW1lcmF0b3JzKCkpIHsKLSAgICBzdGQ6OnN0cmluZyBjID0gZW51bWVyYXRvci0+VmFsdWVTdHJpbmcoZW51bV9kZWNsLkdldEJhY2tpbmdUeXBlKCksIENvbnN0YW50VmFsdWVEZWNvcmF0b3IpOwotICAgIC8vIE9ubHkgYWRkIGEgY2FzZSBpZiBpdHMgdmFsdWUgaGFzIG5vdCB5ZXQgYmVlbiB1c2VkIGluIHRoZSBzd2l0Y2gKLSAgICAvLyBzdGF0ZW1lbnQuIEMrKyBkb2VzIG5vdCBhbGxvdyBtdWx0aXBsZSBjYXNlcyB3aXRoIHRoZSBzYW1lIHZhbHVlLCBidXQKLSAgICAvLyBlbnVtcyBkb2VzIGFsbG93IHRoaXMuIEluIHRoaXMgc2NlbmFyaW8sIHRoZSBmaXJzdCBkZWNsYXJlZAotICAgIC8vIGVudW1lcmF0b3Igd2l0aCB0aGUgZ2l2ZW4gdmFsdWUgaXMgcHJpbnRlZC4KLSAgICBpZiAodW5pcXVlX2Nhc2VzLmNvdW50KGMpID09IDApIHsKLSAgICAgIHVuaXF1ZV9jYXNlcy5pbnNlcnQoYyk7Ci0gICAgICBjb2RlIDw8ICIgIGNhc2UgIiA8PCBlbnVtX2RlY2wuR2V0TmFtZSgpIDw8ICI6OiIgPDwgZW51bWVyYXRvci0+R2V0TmFtZSgpIDw8ICI6XG4iOwotICAgICAgY29kZSA8PCAiICAgIHJldHVybiBcIiIgPDwgZW51bWVyYXRvci0+R2V0TmFtZSgpIDw8ICJcIjtcbiI7Ci0gICAgfQotICB9Ci0gIGNvZGUgPDwgIiAgZGVmYXVsdDpcbiI7Ci0gIGNvZGUgPDwgIiAgICByZXR1cm4gc3RkOjp0b19zdHJpbmcoc3RhdGljX2Nhc3Q8IgotICAgICAgIDw8IENwcE5hbWVPZihlbnVtX2RlY2wuR2V0QmFja2luZ1R5cGUoKSwgdHlwZW5hbWVzKSA8PCAiPih2YWwpKTtcbiI7Ci0gIGNvZGUgPDwgIiAgfVxuIjsKLSAgY29kZSA8PCAifVxuIjsKLSAgcmV0dXJuIGNvZGUuc3RyKCk7Cit2b2lkIEdlbmVyYXRlRW51bUNsYXNzRGVjbChDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxFbnVtRGVjbGFyYXRpb24mIGVudW1fZGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcykgeworICBjcHA6OkdlbmVyYXRlRW51bUNsYXNzRGVjbChvdXQsIGVudW1fZGVjbCwgQ3BwTmFtZU9mKGVudW1fZGVjbC5HZXRCYWNraW5nVHlwZSgpLCB0eXBlbmFtZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudFZhbHVlRGVjb3JhdG9yKTsKIH0KIAotc3RkOjp1bmlxdWVfcHRyPERvY3VtZW50PiBCdWlsZEVudW1IZWFkZXIoY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbEVudW1EZWNsYXJhdGlvbiYgZW51bV9kZWNsKSB7Ci0gIGNvbnN0IHN0ZDo6c3RyaW5nIGF0dHJpYnV0ZSA9IEdldERlcHJlY2F0ZWRBdHRyaWJ1dGUoZW51bV9kZWNsKTsKLSAgc3RkOjp1bmlxdWVfcHRyPEVudW0+IGdlbmVyYXRlZF9lbnVte25ldyBFbnVtewotICAgICAgZW51bV9kZWNsLkdldE5hbWUoKSwgQ3BwTmFtZU9mKGVudW1fZGVjbC5HZXRCYWNraW5nVHlwZSgpLCB0eXBlbmFtZXMpLCB0cnVlLCBhdHRyaWJ1dGV9fTsKLSAgZm9yIChjb25zdCBhdXRvJiBlbnVtZXJhdG9yIDogZW51bV9kZWNsLkdldEVudW1lcmF0b3JzKCkpIHsKLSAgICBnZW5lcmF0ZWRfZW51bS0+QWRkVmFsdWUoCi0gICAgICAgIGVudW1lcmF0b3ItPkdldE5hbWUoKSwKLSAgICAgICAgZW51bWVyYXRvci0+VmFsdWVTdHJpbmcoZW51bV9kZWNsLkdldEJhY2tpbmdUeXBlKCksIENvbnN0YW50VmFsdWVEZWNvcmF0b3IpKTsKK3ZvaWQgR2VuZXJhdGVDbGFzc0RlY2woQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsRGVmaW5lZFR5cGUmIGRlZmluZWRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIGlmIChhdXRvIGlmYWNlID0gQWlkbENhc3Q8QWlkbEludGVyZmFjZT4oZGVmaW5lZF90eXBlKTsgaWZhY2UpIHsKKyAgICBHZW5lcmF0ZUludGVyZmFjZUNsYXNzRGVjbChvdXQsICppZmFjZSwgdHlwZW5hbWVzLCBvcHRpb25zKTsKKyAgfSBlbHNlIGlmIChhdXRvIHBhcmNlbGFibGUgPSBBaWRsQ2FzdDxBaWRsU3RydWN0dXJlZFBhcmNlbGFibGU+KGRlZmluZWRfdHlwZSk7IHBhcmNlbGFibGUpIHsKKyAgICBHZW5lcmF0ZVBhcmNlbENsYXNzRGVjbChvdXQsICpwYXJjZWxhYmxlLCB0eXBlbmFtZXMsIG9wdGlvbnMpOworICB9IGVsc2UgaWYgKGF1dG8gdW5pb25fZGVjbCA9IEFpZGxDYXN0PEFpZGxVbmlvbkRlY2w+KGRlZmluZWRfdHlwZSk7IHVuaW9uX2RlY2wpIHsKKyAgICBHZW5lcmF0ZVBhcmNlbENsYXNzRGVjbChvdXQsICp1bmlvbl9kZWNsLCB0eXBlbmFtZXMsIG9wdGlvbnMpOworICB9IGVsc2UgaWYgKGF1dG8gZW51bV9kZWNsID0gQWlkbENhc3Q8QWlkbEVudW1EZWNsYXJhdGlvbj4oZGVmaW5lZF90eXBlKTsgZW51bV9kZWNsKSB7CisgICAgR2VuZXJhdGVFbnVtQ2xhc3NEZWNsKG91dCwgKmVudW1fZGVjbCwgdHlwZW5hbWVzKTsKKyAgfSBlbHNlIHsKKyAgICBBSURMX0ZBVEFMKGRlZmluZWRfdHlwZSkgPDwgIlVucmVjb2duaXplZCB0eXBlIHNlbnQgZm9yIENQUCBnZW5lcmF0aW9uLiI7CiAgIH0KLQotICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gaW5jbHVkZXMgPSB7Ci0gICAgICAiYXJyYXkiLAotICAgICAgImJpbmRlci9FbnVtcy5oIiwKLSAgICAgICJzdHJpbmciLAotICB9OwotICBBZGRIZWFkZXJzKGVudW1fZGVjbC5HZXRCYWNraW5nVHlwZSgpLCB0eXBlbmFtZXMsICZpbmNsdWRlcyk7Ci0KLSAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPERlY2xhcmF0aW9uPj4gZGVjbHMxOwotICBkZWNsczEucHVzaF9iYWNrKHN0ZDo6bW92ZShnZW5lcmF0ZWRfZW51bSkpOwotICBkZWNsczEucHVzaF9iYWNrKHN0ZDo6bWFrZV91bmlxdWU8TGl0ZXJhbERlY2w+KEdlbmVyYXRlRW51bVRvU3RyaW5nKHR5cGVuYW1lcywgZW51bV9kZWNsKSkpOwotCi0gIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxEZWNsYXJhdGlvbj4+IGRlY2xzMjsKLSAgZGVjbHMyLnB1c2hfYmFjayhzdGQ6Om1ha2VfdW5pcXVlPExpdGVyYWxEZWNsPihHZW5lcmF0ZUVudW1WYWx1ZXMoZW51bV9kZWNsLCB7IiJ9KSkpOwotCi0gIHJldHVybiB1bmlxdWVfcHRyPERvY3VtZW50PnsKLSAgICAgIG5ldyBDcHBIZWFkZXJ7dmVjdG9yPHN0cmluZz4oaW5jbHVkZXMuYmVnaW4oKSwgaW5jbHVkZXMuZW5kKCkpLAotICAgICAgICAgICAgICAgICAgICBBcHBlbmQoTmVzdEluTmFtZXNwYWNlcyhzdGQ6Om1vdmUoZGVjbHMxKSwgZW51bV9kZWNsLkdldFNwbGl0UGFja2FnZSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE5lc3RJbk5hbWVzcGFjZXMoc3RkOjptb3ZlKGRlY2xzMiksIHsiYW5kcm9pZCIsICJpbnRlcm5hbCJ9KSl9fTsKLX0KLQotYm9vbCBXcml0ZUhlYWRlcihjb25zdCBPcHRpb25zJiBvcHRpb25zLCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsCi0gICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxJbnRlcmZhY2UmIGludGVyZmFjZSwgY29uc3QgSW9EZWxlZ2F0ZSYgaW9fZGVsZWdhdGUsCi0gICAgICAgICAgICAgICAgIENsYXNzTmFtZXMgaGVhZGVyX3R5cGUpIHsKLSAgdW5pcXVlX3B0cjxEb2N1bWVudD4gaGVhZGVyOwotICBzd2l0Y2ggKGhlYWRlcl90eXBlKSB7Ci0gICAgY2FzZSBDbGFzc05hbWVzOjpJTlRFUkZBQ0U6Ci0gICAgICBoZWFkZXIgPSBCdWlsZEludGVyZmFjZUhlYWRlcih0eXBlbmFtZXMsIGludGVyZmFjZSwgb3B0aW9ucyk7Ci0gICAgICBoZWFkZXJfdHlwZSA9IENsYXNzTmFtZXM6OlJBVzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ2xhc3NOYW1lczo6Q0xJRU5UOgotICAgICAgaGVhZGVyID0gQnVpbGRDbGllbnRIZWFkZXIodHlwZW5hbWVzLCBpbnRlcmZhY2UsIG9wdGlvbnMpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDbGFzc05hbWVzOjpTRVJWRVI6Ci0gICAgICBoZWFkZXIgPSBCdWlsZFNlcnZlckhlYWRlcih0eXBlbmFtZXMsIGludGVyZmFjZSwgb3B0aW9ucyk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgQUlETF9GQVRBTChpbnRlcmZhY2UpIDw8ICJhaWRsIGludGVybmFsIGVycm9yIjsKLSAgfQotICBpZiAoIWhlYWRlcikgewotICAgIEFJRExfRVJST1IoaW50ZXJmYWNlKSA8PCAiYWlkbCBpbnRlcm5hbCBlcnJvcjogRmFpbGVkIHRvIGdlbmVyYXRlIGhlYWRlci4iOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGNvbnN0IHN0cmluZyBoZWFkZXJfcGF0aCA9IG9wdGlvbnMuT3V0cHV0SGVhZGVyRGlyKCkgKyBIZWFkZXJGaWxlKGludGVyZmFjZSwgaGVhZGVyX3R5cGUpOwotICB1bmlxdWVfcHRyPENvZGVXcml0ZXI+IGNvZGVfd3JpdGVyKGlvX2RlbGVnYXRlLkdldENvZGVXcml0ZXIoaGVhZGVyX3BhdGgpKTsKLSAgaGVhZGVyLT5Xcml0ZShjb2RlX3dyaXRlci5nZXQoKSk7Ci0KLSAgY29uc3QgYm9vbCBzdWNjZXNzID0gY29kZV93cml0ZXItPkNsb3NlKCk7Ci0gIGlmICghc3VjY2VzcykgewotICAgIGlvX2RlbGVnYXRlLlJlbW92ZVBhdGgoaGVhZGVyX3BhdGgpOwotICB9Ci0KLSAgcmV0dXJuIHN1Y2Nlc3M7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbHMKIAogdXNpbmcgbmFtZXNwYWNlIGludGVybmFsczsKIAotYm9vbCBHZW5lcmF0ZUNwcEludGVyZmFjZShjb25zdCBzdHJpbmcmIG91dHB1dF9maWxlLCBjb25zdCBPcHRpb25zJiBvcHRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsIGNvbnN0IEFpZGxJbnRlcmZhY2UmIGludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW9EZWxlZ2F0ZSYgaW9fZGVsZWdhdGUpIHsKLSAgYXV0byBpbnRlcmZhY2Vfc3JjID0gQnVpbGRJbnRlcmZhY2VTb3VyY2UodHlwZW5hbWVzLCBpbnRlcmZhY2UsIG9wdGlvbnMpOwotICBhdXRvIGNsaWVudF9zcmMgPSBCdWlsZENsaWVudFNvdXJjZSh0eXBlbmFtZXMsIGludGVyZmFjZSwgb3B0aW9ucyk7Ci0gIGF1dG8gc2VydmVyX3NyYyA9IEJ1aWxkU2VydmVyU291cmNlKHR5cGVuYW1lcywgaW50ZXJmYWNlLCBvcHRpb25zKTsKLQotICBpZiAoIWludGVyZmFjZV9zcmMgfHwgIWNsaWVudF9zcmMgfHwgIXNlcnZlcl9zcmMpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoIVdyaXRlSGVhZGVyKG9wdGlvbnMsIHR5cGVuYW1lcywgaW50ZXJmYWNlLCBpb19kZWxlZ2F0ZSwgQ2xhc3NOYW1lczo6SU5URVJGQUNFKSB8fAotICAgICAgIVdyaXRlSGVhZGVyKG9wdGlvbnMsIHR5cGVuYW1lcywgaW50ZXJmYWNlLCBpb19kZWxlZ2F0ZSwgQ2xhc3NOYW1lczo6Q0xJRU5UKSB8fAotICAgICAgIVdyaXRlSGVhZGVyKG9wdGlvbnMsIHR5cGVuYW1lcywgaW50ZXJmYWNlLCBpb19kZWxlZ2F0ZSwgQ2xhc3NOYW1lczo6U0VSVkVSKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHVuaXF1ZV9wdHI8Q29kZVdyaXRlcj4gd3JpdGVyID0gaW9fZGVsZWdhdGUuR2V0Q29kZVdyaXRlcihvdXRwdXRfZmlsZSk7Ci0gIGludGVyZmFjZV9zcmMtPldyaXRlKHdyaXRlci5nZXQoKSk7Ci0gIGNsaWVudF9zcmMtPldyaXRlKHdyaXRlci5nZXQoKSk7Ci0gIHNlcnZlcl9zcmMtPldyaXRlKHdyaXRlci5nZXQoKSk7Ci0KLSAgY29uc3QgYm9vbCBzdWNjZXNzID0gd3JpdGVyLT5DbG9zZSgpOwotICBpZiAoIXN1Y2Nlc3MpIHsKLSAgICBpb19kZWxlZ2F0ZS5SZW1vdmVQYXRoKG91dHB1dF9maWxlKTsKLSAgfQotCi0gIHJldHVybiBzdWNjZXNzOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUGFyY2VsYWJsZVR5cGU+Ci1ib29sIEdlbmVyYXRlQ3BwUGFyY2VsYWJsZShjb25zdCBzdGQ6OnN0cmluZyYgb3V0cHV0X2ZpbGUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsIGNvbnN0IFBhcmNlbGFibGVUeXBlJiBwYXJjZWxhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW9EZWxlZ2F0ZSYgaW9fZGVsZWdhdGUpIHsKLSAgYXV0byBoZWFkZXIgPSBCdWlsZFBhcmNlbEhlYWRlcih0eXBlbmFtZXMsIHBhcmNlbGFibGUsIG9wdGlvbnMpOwotICBhdXRvIHNvdXJjZSA9IEJ1aWxkUGFyY2VsU291cmNlKHR5cGVuYW1lcywgcGFyY2VsYWJsZSwgb3B0aW9ucyk7Ci0KLSAgaWYgKCFoZWFkZXIgfHwgIXNvdXJjZSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGNvbnN0IHN0cmluZyBoZWFkZXJfcGF0aCA9IG9wdGlvbnMuT3V0cHV0SGVhZGVyRGlyKCkgKyBIZWFkZXJGaWxlKHBhcmNlbGFibGUsIENsYXNzTmFtZXM6OlJBVyk7Ci0gIHVuaXF1ZV9wdHI8Q29kZVdyaXRlcj4gaGVhZGVyX3dyaXRlcihpb19kZWxlZ2F0ZS5HZXRDb2RlV3JpdGVyKGhlYWRlcl9wYXRoKSk7Ci0gIGhlYWRlci0+V3JpdGUoaGVhZGVyX3dyaXRlci5nZXQoKSk7Ci0gIGlmIChwYXJjZWxhYmxlLklzR2VuZXJpYygpKSB7Ci0gICAgLy8gTmVlZCB0byB3cml0ZSBhbGwgb2YgdGhlIHNvdXJjZSBpbiB0aGUgaGVhZGVyIGZpbGUsIG5vdCBjcHAgZmlsZS4KLSAgICBzb3VyY2UtPldyaXRlKGhlYWRlcl93cml0ZXIuZ2V0KCkpOwotICB9Ci0gIEFJRExfRkFUQUxfSUYoIWhlYWRlcl93cml0ZXItPkNsb3NlKCksIGhlYWRlcl9wYXRoKTsKLQotICAvLyBUT0RPKGIvMTExMzYyNTkzKTogbm8gdW5lY2Vzc2FyeSBmaWxlcyBqdXN0IHRvIGhhdmUgY29uc2lzdGVudCBvdXRwdXQgd2l0aCBpbnRlcmZhY2VzCi0gIGNvbnN0IHN0cmluZyBicF9oZWFkZXIgPSBvcHRpb25zLk91dHB1dEhlYWRlckRpcigpICsgSGVhZGVyRmlsZShwYXJjZWxhYmxlLCBDbGFzc05hbWVzOjpDTElFTlQpOwotICB1bmlxdWVfcHRyPENvZGVXcml0ZXI+IGJwX3dyaXRlcihpb19kZWxlZ2F0ZS5HZXRDb2RlV3JpdGVyKGJwX2hlYWRlcikpOwotICBicF93cml0ZXItPldyaXRlKCIjZXJyb3IgVE9ETyhiLzExMTM2MjU5MykgcGFyY2VsYWJsZXMgZG8gbm90IGhhdmUgYnAgY2xhc3NlcyIpOwotICBBSURMX0ZBVEFMX0lGKCFicF93cml0ZXItPkNsb3NlKCksIGJwX2hlYWRlcik7Ci0gIGNvbnN0IHN0cmluZyBibl9oZWFkZXIgPSBvcHRpb25zLk91dHB1dEhlYWRlckRpcigpICsgSGVhZGVyRmlsZShwYXJjZWxhYmxlLCBDbGFzc05hbWVzOjpTRVJWRVIpOwotICB1bmlxdWVfcHRyPENvZGVXcml0ZXI+IGJuX3dyaXRlcihpb19kZWxlZ2F0ZS5HZXRDb2RlV3JpdGVyKGJuX2hlYWRlcikpOwotICBibl93cml0ZXItPldyaXRlKCIjZXJyb3IgVE9ETyhiLzExMTM2MjU5MykgcGFyY2VsYWJsZXMgZG8gbm90IGhhdmUgYm4gY2xhc3NlcyIpOwotICBBSURMX0ZBVEFMX0lGKCFibl93cml0ZXItPkNsb3NlKCksIGJuX2hlYWRlcik7Ci0KLSAgdW5pcXVlX3B0cjxDb2RlV3JpdGVyPiBzb3VyY2Vfd3JpdGVyID0gaW9fZGVsZWdhdGUuR2V0Q29kZVdyaXRlcihvdXRwdXRfZmlsZSk7Ci0gIGlmIChwYXJjZWxhYmxlLklzR2VuZXJpYygpKSB7Ci0gICAgLy8gU2luY2UgdGhlIHR5cGUgaXMgZ2VuZXJpYywgdGhlIHNvdXJjZSBpcyB3cml0dGVuIGluIHRoZSBoZWFkZXIgZmlsZQotICAgIGF1dG8gZW1wdHlfc291cmNlID0gdW5pcXVlX3B0cjxEb2N1bWVudD57bmV3IENwcFNvdXJjZXt7fSwge319fTsKLSAgICBlbXB0eV9zb3VyY2UtPldyaXRlKHNvdXJjZV93cml0ZXIuZ2V0KCkpOwotICB9IGVsc2UgewotICAgIHNvdXJjZS0+V3JpdGUoc291cmNlX3dyaXRlci5nZXQoKSk7Ci0gIH0KLSAgQUlETF9GQVRBTF9JRighc291cmNlX3dyaXRlci0+Q2xvc2UoKSwgb3V0cHV0X2ZpbGUpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIEdlbmVyYXRlQ3BwUGFyY2VsRGVjbGFyYXRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLCBjb25zdCBPcHRpb25zJiBvcHRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxQYXJjZWxhYmxlJiBwYXJjZWxhYmxlLCBjb25zdCBJb0RlbGVnYXRlJiBpb19kZWxlZ2F0ZSkgewotICBDb2RlV3JpdGVyUHRyIHNvdXJjZV93cml0ZXIgPSBpb19kZWxlZ2F0ZS5HZXRDb2RlV3JpdGVyKGZpbGVuYW1lKTsKLSAgKnNvdXJjZV93cml0ZXIKLSAgICAgIDw8ICIvLyBUaGlzIGZpbGUgaXMgaW50ZW50aW9uYWxseSBsZWZ0IGJsYW5rIGFzIHBsYWNlaG9sZGVyIGZvciBwYXJjZWwgZGVjbGFyYXRpb24uXG4iOwotICBBSURMX0ZBVEFMX0lGKCFzb3VyY2Vfd3JpdGVyLT5DbG9zZSgpLCBmaWxlbmFtZSk7Ci0KLSAgLy8gVE9ETyhiLzExMTM2MjU5Myk6IG5vIHVuZWNlc3NhcnkgZmlsZXMganVzdCB0byBoYXZlIGNvbnNpc3RlbnQgb3V0cHV0IHdpdGggaW50ZXJmYWNlcwotICBjb25zdCBzdHJpbmcgaGVhZGVyX3BhdGggPSBvcHRpb25zLk91dHB1dEhlYWRlckRpcigpICsgSGVhZGVyRmlsZShwYXJjZWxhYmxlLCBDbGFzc05hbWVzOjpSQVcpOwotICB1bmlxdWVfcHRyPENvZGVXcml0ZXI+IGhlYWRlcl93cml0ZXIoaW9fZGVsZWdhdGUuR2V0Q29kZVdyaXRlcihoZWFkZXJfcGF0aCkpOwotICBoZWFkZXJfd3JpdGVyLT5Xcml0ZSgiI2Vycm9yIFRPRE8oYi8xMTEzNjI1OTMpIHBhcmNlbGFibGVzIGRvIG5vdCBoYXZlIGhlYWRlcnMiKTsKLSAgQUlETF9GQVRBTF9JRighaGVhZGVyX3dyaXRlci0+Q2xvc2UoKSwgaGVhZGVyX3BhdGgpOwotICBjb25zdCBzdHJpbmcgYnBfaGVhZGVyID0gb3B0aW9ucy5PdXRwdXRIZWFkZXJEaXIoKSArIEhlYWRlckZpbGUocGFyY2VsYWJsZSwgQ2xhc3NOYW1lczo6Q0xJRU5UKTsKLSAgdW5pcXVlX3B0cjxDb2RlV3JpdGVyPiBicF93cml0ZXIoaW9fZGVsZWdhdGUuR2V0Q29kZVdyaXRlcihicF9oZWFkZXIpKTsKLSAgYnBfd3JpdGVyLT5Xcml0ZSgiI2Vycm9yIFRPRE8oYi8xMTEzNjI1OTMpIHBhcmNlbGFibGVzIGRvIG5vdCBoYXZlIGJwIGNsYXNzZXMiKTsKLSAgQUlETF9GQVRBTF9JRighYnBfd3JpdGVyLT5DbG9zZSgpLCBicF9oZWFkZXIpOwotICBjb25zdCBzdHJpbmcgYm5faGVhZGVyID0gb3B0aW9ucy5PdXRwdXRIZWFkZXJEaXIoKSArIEhlYWRlckZpbGUocGFyY2VsYWJsZSwgQ2xhc3NOYW1lczo6U0VSVkVSKTsKLSAgdW5pcXVlX3B0cjxDb2RlV3JpdGVyPiBibl93cml0ZXIoaW9fZGVsZWdhdGUuR2V0Q29kZVdyaXRlcihibl9oZWFkZXIpKTsKLSAgYm5fd3JpdGVyLT5Xcml0ZSgiI2Vycm9yIFRPRE8oYi8xMTEzNjI1OTMpIHBhcmNlbGFibGVzIGRvIG5vdCBoYXZlIGJuIGNsYXNzZXMiKTsKLSAgQUlETF9GQVRBTF9JRighYm5fd3JpdGVyLT5DbG9zZSgpLCBibl9oZWFkZXIpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIEdlbmVyYXRlQ3BwRW51bURlY2xhcmF0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsRW51bURlY2xhcmF0aW9uJiBlbnVtX2RlY2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElvRGVsZWdhdGUmIGlvX2RlbGVnYXRlKSB7Ci0gIGF1dG8gaGVhZGVyID0gQnVpbGRFbnVtSGVhZGVyKHR5cGVuYW1lcywgZW51bV9kZWNsKTsKLSAgaWYgKCFoZWFkZXIpIHJldHVybiBmYWxzZTsKLQotICBjb25zdCBzdHJpbmcgaGVhZGVyX3BhdGggPSBvcHRpb25zLk91dHB1dEhlYWRlckRpcigpICsgSGVhZGVyRmlsZShlbnVtX2RlY2wsIENsYXNzTmFtZXM6OlJBVyk7Ci0gIHVuaXF1ZV9wdHI8Q29kZVdyaXRlcj4gaGVhZGVyX3dyaXRlcihpb19kZWxlZ2F0ZS5HZXRDb2RlV3JpdGVyKGhlYWRlcl9wYXRoKSk7Ci0gIGhlYWRlci0+V3JpdGUoaGVhZGVyX3dyaXRlci5nZXQoKSk7Ci0gIEFJRExfRkFUQUxfSUYoIWhlYWRlcl93cml0ZXItPkNsb3NlKCksIGhlYWRlcl9wYXRoKTsKLQotICAvLyBUT0RPKGIvMTExMzYyNTkzKTogbm8gdW5uZWNlc3NhcnkgZmlsZXMganVzdCB0byBoYXZlIGNvbnNpc3RlbnQgb3V0cHV0IHdpdGggaW50ZXJmYWNlcwotICBDb2RlV3JpdGVyUHRyIHNvdXJjZV93cml0ZXIgPSBpb19kZWxlZ2F0ZS5HZXRDb2RlV3JpdGVyKGZpbGVuYW1lKTsKLSAgKnNvdXJjZV93cml0ZXIKLSAgICAgIDw8ICIvLyBUaGlzIGZpbGUgaXMgaW50ZW50aW9uYWxseSBsZWZ0IGJsYW5rIGFzIHBsYWNlaG9sZGVyIGZvciBlbnVtIGRlY2xhcmF0aW9uLlxuIjsKLSAgQUlETF9GQVRBTF9JRighc291cmNlX3dyaXRlci0+Q2xvc2UoKSwgZmlsZW5hbWUpOwotICBjb25zdCBzdHJpbmcgYnBfaGVhZGVyID0gb3B0aW9ucy5PdXRwdXRIZWFkZXJEaXIoKSArIEhlYWRlckZpbGUoZW51bV9kZWNsLCBDbGFzc05hbWVzOjpDTElFTlQpOwotICB1bmlxdWVfcHRyPENvZGVXcml0ZXI+IGJwX3dyaXRlcihpb19kZWxlZ2F0ZS5HZXRDb2RlV3JpdGVyKGJwX2hlYWRlcikpOwotICBicF93cml0ZXItPldyaXRlKCIjZXJyb3IgVE9ETyhiLzExMTM2MjU5MykgZW51bXMgZG8gbm90IGhhdmUgYnAgY2xhc3NlcyIpOwotICBBSURMX0ZBVEFMX0lGKCFicF93cml0ZXItPkNsb3NlKCksIGJwX2hlYWRlcik7Ci0gIGNvbnN0IHN0cmluZyBibl9oZWFkZXIgPSBvcHRpb25zLk91dHB1dEhlYWRlckRpcigpICsgSGVhZGVyRmlsZShlbnVtX2RlY2wsIENsYXNzTmFtZXM6OlNFUlZFUik7Ci0gIHVuaXF1ZV9wdHI8Q29kZVdyaXRlcj4gYm5fd3JpdGVyKGlvX2RlbGVnYXRlLkdldENvZGVXcml0ZXIoYm5faGVhZGVyKSk7Ci0gIGJuX3dyaXRlci0+V3JpdGUoIiNlcnJvciBUT0RPKGIvMTExMzYyNTkzKSBlbnVtcyBkbyBub3QgaGF2ZSBibiBjbGFzc2VzIik7Ci0gIEFJRExfRkFUQUxfSUYoIWJuX3dyaXRlci0+Q2xvc2UoKSwgYm5faGVhZGVyKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQogLy8gRW5zdXJlcyB0aGF0IG91dHB1dF9maWxlIGlzICA8b3V0X2Rpcj4vPHBhY2thZ2VuYW1lPi88dHlwZW5hbWU+LmNwcAogYm9vbCBWYWxpZGF0ZU91dHB1dEZpbGVQYXRoKGNvbnN0IHN0cmluZyYgb3V0cHV0X2ZpbGUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbERlZmluZWRUeXBlJiBkZWZpbmVkX3R5cGUpIHsKQEAgLTE1OTIsNDEgKzEyMTEsMjM1IEBACiAgIHJldHVybiB0cnVlOwogfQogCisvLyBDb2xsZWN0IGFsbCBpbmNsdWRlcyBmb3IgdGhlIHR5cGUncyBoZWFkZXIuIE5lc3RlZCB0eXBlcyBhcmUgdmlzaXRlZCBhcyB3ZWxsIHZpYSBWaXNpdFRvcERvd24uCit2b2lkIEdlbmVyYXRlSGVhZGVySW5jbHVkZXMoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsRGVmaW5lZFR5cGUmIGRlZmluZWRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgc3RydWN0IFZpc2l0b3IgOiBBaWRsVmlzaXRvciB7CisgICAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzOworICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnM7CisgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IGluY2x1ZGVzOworICAgIFZpc2l0b3IoY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKQorICAgICAgICA6IHR5cGVuYW1lcyh0eXBlbmFtZXMpLCBvcHRpb25zKG9wdGlvbnMpIHt9CisKKyAgICAvLyBDb2xsZWN0IGluY2x1ZGVzIGZvciBlYWNoIHR5cGUgcmVmZXJlbmNlIGluY2x1ZGluZyBidWlsdC1pbiB0eXBlCisgICAgdm9pZCBWaXNpdChjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSkgb3ZlcnJpZGUgeworICAgICAgY3BwOjpBZGRIZWFkZXJzKHR5cGUsIHR5cGVuYW1lcywgJmluY2x1ZGVzKTsKKyAgICB9CisKKyAgICAvLyBDb2xsZWN0IGltcGxlbWVudGF0aW9uLXNwZWNpZmljIGluY2x1ZGVzIGZvciBlYWNoIHR5cGUgZGVmaW5pdGlvbgorICAgIHZvaWQgVmlzaXQoY29uc3QgQWlkbEludGVyZmFjZSYgaWZhY2UpIG92ZXJyaWRlIHsKKyAgICAgIGluY2x1ZGVzLmluc2VydChrSUJpbmRlckhlYWRlcik7ICAgICAgICAvLyBJQmluZGVyCisgICAgICBpbmNsdWRlcy5pbnNlcnQoa0lJbnRlcmZhY2VIZWFkZXIpOyAgICAgLy8gSUludGVyZmFjZQorICAgICAgaW5jbHVkZXMuaW5zZXJ0KGtTdGF0dXNIZWFkZXIpOyAgICAgICAgIC8vIFN0YXR1cworICAgICAgaW5jbHVkZXMuaW5zZXJ0KGtTdHJvbmdQb2ludGVySGVhZGVyKTsgIC8vIHNwPD4KKworICAgICAgaWYgKG9wdGlvbnMuR2VuVHJhY2VzKCkpIHsKKyAgICAgICAgaW5jbHVkZXMuaW5zZXJ0KGtUcmFjZUhlYWRlcik7CisgICAgICB9CisKKyAgICAgIC8vIEZvciBhIG5lc3RlZCBpbnRlcmZhY2UsIGNsaWVudC9zZXJ2ZXIgY2xhc3NlcyBhcmUgZGVjbGFyZWQgdGhlIHNhbWUgaGVhZGVyIGFzIHdlbGwuCisgICAgICBpZiAoaWZhY2UuR2V0UGFyZW50VHlwZSgpKSB7CisgICAgICAgIC8vIGNsaWVudC9zZXJ2ZXIgY2xhc3MgcHJvdmlkZXMgbG9nRnVuYyB3aGVuIGdlbl9sb2cgaXMgb24KKyAgICAgICAgaWYgKG9wdGlvbnMuR2VuTG9nKCkpIHsKKyAgICAgICAgICBpbmNsdWRlcy5pbnNlcnQoImZ1bmN0aW9uYWwiKTsgICAgICAgICAgICAgICAgICAvLyBzdGQ6OmZ1bmN0aW9uIGZvciBsb2dGdW5jCisgICAgICAgICAgaW5jbHVkZXMuaW5zZXJ0KCJhbmRyb2lkL2JpbmRlcl90b19zdHJpbmcuaCIpOyAgLy8gR2VuZXJpYyBUb1N0cmluZyBoZWxwZXIKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHZvaWQgVmlzaXQoY29uc3QgQWlkbFN0cnVjdHVyZWRQYXJjZWxhYmxlJikgb3ZlcnJpZGUgeworICAgICAgQWRkUGFyY2VsYWJsZUNvbW1vbkhlYWRlcnMoKTsKKyAgICAgIGluY2x1ZGVzLmluc2VydCgidHVwbGUiKTsgIC8vIHN0ZDo6dGllIGluIGNvbXBhcmlzb24gb3BlcmF0b3JzCisgICAgfQorCisgICAgdm9pZCBWaXNpdChjb25zdCBBaWRsVW5pb25EZWNsJiB1bmlvbl9kZWNsKSBvdmVycmlkZSB7CisgICAgICBBZGRQYXJjZWxhYmxlQ29tbW9uSGVhZGVycygpOworICAgICAgYXV0byB1bmlvbl9oZWFkZXJzID0gY3BwOjpVbmlvbldyaXRlcjo6R2V0SGVhZGVycyh1bmlvbl9kZWNsKTsKKyAgICAgIGluY2x1ZGVzLmluc2VydChzdGQ6OmJlZ2luKHVuaW9uX2hlYWRlcnMpLCBzdGQ6OmVuZCh1bmlvbl9oZWFkZXJzKSk7CisgICAgfQorCisgICAgdm9pZCBWaXNpdChjb25zdCBBaWRsRW51bURlY2xhcmF0aW9uJikgb3ZlcnJpZGUgeworICAgICAgaW5jbHVkZXMuaW5zZXJ0KCJhcnJheSIpOyAgICAgICAgICAgLy8gdXNlZCBpbiBlbnVtX3ZhbHVlcworICAgICAgaW5jbHVkZXMuaW5zZXJ0KCJiaW5kZXIvRW51bXMuaCIpOyAgLy8gcHJvdmlkZXMgZW51bV9yYW5nZQorICAgICAgaW5jbHVkZXMuaW5zZXJ0KCJzdHJpbmciKTsgICAgICAgICAgLy8gdG9TdHJpbmcoKSByZXR1cm5zIHN0ZDo6c3RyaW5nCisgICAgfQorCisgICAgdm9pZCBBZGRQYXJjZWxhYmxlQ29tbW9uSGVhZGVycygpIHsKKyAgICAgIGluY2x1ZGVzLmluc2VydChrUGFyY2VsSGVhZGVyKTsgICAgICAgICAgICAgICAgIC8vIFBhcmNlbCBpbiByZWFkRnJvbVBhcmNlbC93cml0ZVRvUGFyY2VsCisgICAgICBpbmNsdWRlcy5pbnNlcnQoa1N0YXR1c0hlYWRlcik7ICAgICAgICAgICAgICAgICAvLyBTdGF0dXMKKyAgICAgIGluY2x1ZGVzLmluc2VydChrU3RyaW5nMTZIZWFkZXIpOyAgICAgICAgICAgICAgIC8vIFN0cmluZzE2IGluIGdldFBhcmNlbGFibGVEZXNjcmlwdG9yCisgICAgICBpbmNsdWRlcy5pbnNlcnQoImFuZHJvaWQvYmluZGVyX3RvX3N0cmluZy5oIik7ICAvLyB0b1N0cmluZygpCisgICAgfQorICB9IHYodHlwZW5hbWVzLCBvcHRpb25zKTsKKyAgVmlzaXRUb3BEb3duKHYsIGRlZmluZWRfdHlwZSk7CisKKyAgZm9yIChjb25zdCBhdXRvJiBwYXRoIDogdi5pbmNsdWRlcykgeworICAgIG91dCA8PCAiI2luY2x1ZGUgPCIgPDwgcGF0aCA8PCAiPlxuIjsKKyAgfQorICBvdXQgPDwgIlxuIjsKKyAgaWYgKHYuaW5jbHVkZXMuY291bnQoImNhc3NlcnQiKSkgeworICAgIC8vIFRPRE8oYi8zMTU1OTA5NSkgYmlvbmljIG9uIGhvc3Qgc2hvdWxkIGRlZmluZSBfX2Fzc2VydDIKKyAgICBvdXQgPDwgIiNpZm5kZWYgX19CSU9OSUNfX1xuI2RlZmluZSBfX2Fzc2VydDIoYSxiLGMsZCkgKCh2b2lkKTApXG4jZW5kaWZcblxuIjsKKyAgfQorfQorCisvLyBHZW5lcmljIHBhcmNlbGFibGVzIGFuZCBlbnVtIHV0aWxpdGllcyBzaG91bGQgYmUgZGVmaW5lZCBpbiBoZWFkZXIuCit2b2lkIEdlbmVyYXRlSGVhZGVyRGVmaW5pdGlvbnMoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsRGVmaW5lZFR5cGUmIGRlZmluZWRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgc3RydWN0IFZpc2l0b3IgOiBBaWRsVmlzaXRvciB7CisgICAgQ29kZVdyaXRlciYgb3V0OworICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lczsKKyAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zOworICAgIFZpc2l0b3IoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpCisgICAgICAgIDogb3V0KG91dCksIHR5cGVuYW1lcyh0eXBlbmFtZXMpLCBvcHRpb25zKG9wdGlvbnMpIHt9CisKKyAgICB2b2lkIFZpc2l0KGNvbnN0IEFpZGxFbnVtRGVjbGFyYXRpb24mIGVudW1fZGVjbCkgb3ZlcnJpZGUgeworICAgICAgY29uc3QgYXV0byBiYWNraW5nX3R5cGUgPSBDcHBOYW1lT2YoZW51bV9kZWNsLkdldEJhY2tpbmdUeXBlKCksIHR5cGVuYW1lcyk7CisgICAgICBFbnRlck5hbWVzcGFjZShvdXQsIGVudW1fZGVjbCk7CisgICAgICBvdXQgPDwgR2VuZXJhdGVFbnVtVG9TdHJpbmcoZW51bV9kZWNsLCBiYWNraW5nX3R5cGUpOworICAgICAgTGVhdmVOYW1lc3BhY2Uob3V0LCBlbnVtX2RlY2wpOworCisgICAgICBvdXQgPDwgIm5hbWVzcGFjZSBhbmRyb2lkIHtcbiI7CisgICAgICBvdXQgPDwgIm5hbWVzcGFjZSBpbnRlcm5hbCB7XG4iOworICAgICAgb3V0IDw8IEdlbmVyYXRlRW51bVZhbHVlcyhlbnVtX2RlY2wsIHsiIn0pOworICAgICAgb3V0IDw8ICJ9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWxcbiI7CisgICAgICBvdXQgPDwgIn0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkXG4iOworICAgIH0KKworICAgIHZvaWQgVmlzaXQoY29uc3QgQWlkbFN0cnVjdHVyZWRQYXJjZWxhYmxlJiBwYXJjZWxhYmxlKSBvdmVycmlkZSB7CisgICAgICBpZiAocGFyY2VsYWJsZS5Jc0dlbmVyaWMoKSkgeworICAgICAgICBHZW5lcmF0ZVBhcmNlbFNvdXJjZShvdXQsIHBhcmNlbGFibGUsIHR5cGVuYW1lcywgb3B0aW9ucyk7CisgICAgICB9CisgICAgfQorCisgICAgdm9pZCBWaXNpdChjb25zdCBBaWRsVW5pb25EZWNsJiB1bmlvbl9kZWNsKSBvdmVycmlkZSB7CisgICAgICBpZiAodW5pb25fZGVjbC5Jc0dlbmVyaWMoKSkgeworICAgICAgICBHZW5lcmF0ZVBhcmNlbFNvdXJjZShvdXQsIHVuaW9uX2RlY2wsIHR5cGVuYW1lcywgb3B0aW9ucyk7CisgICAgICB9CisgICAgfQorCisgIH0gdihvdXQsIHR5cGVuYW1lcywgb3B0aW9ucyk7CisgIFZpc2l0VG9wRG93bih2LCBkZWZpbmVkX3R5cGUpOworfQorCit2b2lkIEdlbmVyYXRlSGVhZGVyKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbERlZmluZWRUeXBlJiBkZWZpbmVkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICBpZiAoYXV0byBwYXJjZWxhYmxlID0gQWlkbENhc3Q8QWlkbFBhcmNlbGFibGU+KGRlZmluZWRfdHlwZSk7IHBhcmNlbGFibGUpIHsKKyAgICBvdXQgPDwgIiNlcnJvciBUT0RPKGIvMTExMzYyNTkzKSBwYXJjZWxhYmxlcyBkbyBub3QgaGF2ZSBoZWFkZXJzIjsKKyAgICByZXR1cm47CisgIH0KKyAgb3V0IDw8ICIjcHJhZ21hIG9uY2VcblxuIjsKKyAgR2VuZXJhdGVIZWFkZXJJbmNsdWRlcyhvdXQsIGRlZmluZWRfdHlwZSwgdHlwZW5hbWVzLCBvcHRpb25zKTsKKyAgRW50ZXJOYW1lc3BhY2Uob3V0LCBkZWZpbmVkX3R5cGUpOworICAvLyBFYWNoIGNsYXNzIGRlY2wgY29udGFpbnMgaXRzIG93biBuZXN0ZWQgdHlwZXMnIGNsYXNzIGRlY2xzCisgIEdlbmVyYXRlQ2xhc3NEZWNsKG91dCwgZGVmaW5lZF90eXBlLCB0eXBlbmFtZXMsIG9wdGlvbnMpOworICBMZWF2ZU5hbWVzcGFjZShvdXQsIGRlZmluZWRfdHlwZSk7CisgIEdlbmVyYXRlSGVhZGVyRGVmaW5pdGlvbnMob3V0LCBkZWZpbmVkX3R5cGUsIHR5cGVuYW1lcywgb3B0aW9ucyk7Cit9CisKK3ZvaWQgR2VuZXJhdGVDbGllbnRIZWFkZXIoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsRGVmaW5lZFR5cGUmIGRlZmluZWRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIGlmIChhdXRvIGlmYWNlID0gQWlkbENhc3Q8QWlkbEludGVyZmFjZT4oZGVmaW5lZF90eXBlKTsgaWZhY2UpIHsKKyAgICBHZW5lcmF0ZUNsaWVudEhlYWRlcihvdXQsICppZmFjZSwgdHlwZW5hbWVzLCBvcHRpb25zKTsKKyAgfSBlbHNlIGlmIChhdXRvIHBhcmNlbGFibGUgPSBBaWRsQ2FzdDxBaWRsU3RydWN0dXJlZFBhcmNlbGFibGU+KGRlZmluZWRfdHlwZSk7IHBhcmNlbGFibGUpIHsKKyAgICBvdXQgPDwgIiNlcnJvciBUT0RPKGIvMTExMzYyNTkzKSBwYXJjZWxhYmxlcyBkbyBub3QgaGF2ZSBicCBjbGFzc2VzIjsKKyAgfSBlbHNlIGlmIChhdXRvIHVuaW9uX2RlY2wgPSBBaWRsQ2FzdDxBaWRsVW5pb25EZWNsPihkZWZpbmVkX3R5cGUpOyB1bmlvbl9kZWNsKSB7CisgICAgb3V0IDw8ICIjZXJyb3IgVE9ETyhiLzExMTM2MjU5MykgcGFyY2VsYWJsZXMgZG8gbm90IGhhdmUgYnAgY2xhc3NlcyI7CisgIH0gZWxzZSBpZiAoYXV0byBlbnVtX2RlY2wgPSBBaWRsQ2FzdDxBaWRsRW51bURlY2xhcmF0aW9uPihkZWZpbmVkX3R5cGUpOyBlbnVtX2RlY2wpIHsKKyAgICBvdXQgPDwgIiNlcnJvciBUT0RPKGIvMTExMzYyNTkzKSBlbnVtcyBkbyBub3QgaGF2ZSBicCBjbGFzc2VzIjsKKyAgfSBlbHNlIGlmIChhdXRvIHBhcmNlbGFibGUgPSBBaWRsQ2FzdDxBaWRsUGFyY2VsYWJsZT4oZGVmaW5lZF90eXBlKTsgcGFyY2VsYWJsZSkgeworICAgIG91dCA8PCAiI2Vycm9yIFRPRE8oYi8xMTEzNjI1OTMpIHBhcmNlbGFibGVzIGRvIG5vdCBoYXZlIGJwIGNsYXNzZXMiOworICB9IGVsc2UgeworICAgIEFJRExfRkFUQUwoZGVmaW5lZF90eXBlKSA8PCAiVW5yZWNvZ25pemVkIHR5cGUgc2VudCBmb3IgQ1BQIGdlbmVyYXRpb24uIjsKKyAgfQorfQorCit2b2lkIEdlbmVyYXRlU2VydmVySGVhZGVyKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbERlZmluZWRUeXBlJiBkZWZpbmVkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICBpZiAoYXV0byBpZmFjZSA9IEFpZGxDYXN0PEFpZGxJbnRlcmZhY2U+KGRlZmluZWRfdHlwZSk7IGlmYWNlKSB7CisgICAgR2VuZXJhdGVTZXJ2ZXJIZWFkZXIob3V0LCAqaWZhY2UsIHR5cGVuYW1lcywgb3B0aW9ucyk7CisgIH0gZWxzZSBpZiAoYXV0byBwYXJjZWxhYmxlID0gQWlkbENhc3Q8QWlkbFN0cnVjdHVyZWRQYXJjZWxhYmxlPihkZWZpbmVkX3R5cGUpOyBwYXJjZWxhYmxlKSB7CisgICAgb3V0IDw8ICIjZXJyb3IgVE9ETyhiLzExMTM2MjU5MykgcGFyY2VsYWJsZXMgZG8gbm90IGhhdmUgYm4gY2xhc3NlcyI7CisgIH0gZWxzZSBpZiAoYXV0byB1bmlvbl9kZWNsID0gQWlkbENhc3Q8QWlkbFVuaW9uRGVjbD4oZGVmaW5lZF90eXBlKTsgdW5pb25fZGVjbCkgeworICAgIG91dCA8PCAiI2Vycm9yIFRPRE8oYi8xMTEzNjI1OTMpIHBhcmNlbGFibGVzIGRvIG5vdCBoYXZlIGJuIGNsYXNzZXMiOworICB9IGVsc2UgaWYgKGF1dG8gZW51bV9kZWNsID0gQWlkbENhc3Q8QWlkbEVudW1EZWNsYXJhdGlvbj4oZGVmaW5lZF90eXBlKTsgZW51bV9kZWNsKSB7CisgICAgb3V0IDw8ICIjZXJyb3IgVE9ETyhiLzExMTM2MjU5MykgZW51bXMgZG8gbm90IGhhdmUgYm4gY2xhc3NlcyI7CisgIH0gZWxzZSBpZiAoYXV0byBwYXJjZWxhYmxlID0gQWlkbENhc3Q8QWlkbFBhcmNlbGFibGU+KGRlZmluZWRfdHlwZSk7IHBhcmNlbGFibGUpIHsKKyAgICBvdXQgPDwgIiNlcnJvciBUT0RPKGIvMTExMzYyNTkzKSBwYXJjZWxhYmxlcyBkbyBub3QgaGF2ZSBibiBjbGFzc2VzIjsKKyAgfSBlbHNlIHsKKyAgICBBSURMX0ZBVEFMKGRlZmluZWRfdHlwZSkgPDwgIlVucmVjb2duaXplZCB0eXBlIHNlbnQgZm9yIENQUCBnZW5lcmF0aW9uLiI7CisgIH0KK30KKwordm9pZCBHZW5lcmF0ZVNvdXJjZShDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxEZWZpbmVkVHlwZSYgZGVmaW5lZF90eXBlLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgc3RydWN0IFZpc2l0b3IgOiBBaWRsVmlzaXRvciB7CisgICAgQ29kZVdyaXRlciYgb3V0OworICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lczsKKyAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zOworICAgIFZpc2l0b3IoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpCisgICAgICAgIDogb3V0KG91dCksIHR5cGVuYW1lcyh0eXBlbmFtZXMpLCBvcHRpb25zKG9wdGlvbnMpIHt9CisKKyAgICB2b2lkIFZpc2l0KGNvbnN0IEFpZGxJbnRlcmZhY2UmIGludGVyZmFjZSkgb3ZlcnJpZGUgeworICAgICAgR2VuZXJhdGVJbnRlcmZhY2VTb3VyY2Uob3V0LCBpbnRlcmZhY2UsIHR5cGVuYW1lcywgb3B0aW9ucyk7CisgICAgICBHZW5lcmF0ZUNsaWVudFNvdXJjZShvdXQsIGludGVyZmFjZSwgdHlwZW5hbWVzLCBvcHRpb25zKTsKKyAgICAgIEdlbmVyYXRlU2VydmVyU291cmNlKG91dCwgaW50ZXJmYWNlLCB0eXBlbmFtZXMsIG9wdGlvbnMpOworICAgIH0KKworICAgIHZvaWQgVmlzaXQoY29uc3QgQWlkbFN0cnVjdHVyZWRQYXJjZWxhYmxlJiBwYXJjZWxhYmxlKSBvdmVycmlkZSB7CisgICAgICBpZiAoIXBhcmNlbGFibGUuSXNHZW5lcmljKCkpIHsKKyAgICAgICAgR2VuZXJhdGVQYXJjZWxTb3VyY2Uob3V0LCBwYXJjZWxhYmxlLCB0eXBlbmFtZXMsIG9wdGlvbnMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8ICJcbiI7CisgICAgICB9CisgICAgfQorCisgICAgdm9pZCBWaXNpdChjb25zdCBBaWRsVW5pb25EZWNsJiB1bmlvbl9kZWNsKSBvdmVycmlkZSB7CisgICAgICBpZiAoIXVuaW9uX2RlY2wuSXNHZW5lcmljKCkpIHsKKyAgICAgICAgR2VuZXJhdGVQYXJjZWxTb3VyY2Uob3V0LCB1bmlvbl9kZWNsLCB0eXBlbmFtZXMsIG9wdGlvbnMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8ICJcbiI7CisgICAgICB9CisgICAgfQorCisgICAgdm9pZCBWaXNpdChjb25zdCBBaWRsRW51bURlY2xhcmF0aW9uJiBlbnVtX2RlY2wpIG92ZXJyaWRlIHsKKyAgICAgIGlmICghZW51bV9kZWNsLkdldFBhcmVudFR5cGUoKSkgeworICAgICAgICBvdXQgPDwgIi8vIFRoaXMgZmlsZSBpcyBpbnRlbnRpb25hbGx5IGxlZnQgYmxhbmsgYXMgcGxhY2Vob2xkZXIgZm9yIGVudW0gZGVjbGFyYXRpb24uXG4iOworICAgICAgfQorICAgIH0KKworICAgIHZvaWQgVmlzaXQoY29uc3QgQWlkbFBhcmNlbGFibGUmIHBhcmNlbGFibGUpIG92ZXJyaWRlIHsKKyAgICAgIEFJRExfRkFUQUxfSUYocGFyY2VsYWJsZS5HZXRQYXJlbnRUeXBlKCksIHBhcmNlbGFibGUpCisgICAgICAgICAgPDwgIlVuc3RydWN0dXJlZCBwYXJjZWxhYmxlIGNhbid0IGJlIG5lc3RlZC4iOworICAgICAgb3V0IDw8ICIvLyBUaGlzIGZpbGUgaXMgaW50ZW50aW9uYWxseSBsZWZ0IGJsYW5rIGFzIHBsYWNlaG9sZGVyIGZvciBwYXJjZWwgZGVjbGFyYXRpb24uXG4iOworICAgIH0KKyAgfSB2KG91dCwgdHlwZW5hbWVzLCBvcHRpb25zKTsKKyAgVmlzaXRUb3BEb3duKHYsIGRlZmluZWRfdHlwZSk7Cit9CisKIGJvb2wgR2VuZXJhdGVDcHAoY29uc3Qgc3RyaW5nJiBvdXRwdXRfZmlsZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucywgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLAogICAgICAgICAgICAgICAgICBjb25zdCBBaWRsRGVmaW5lZFR5cGUmIGRlZmluZWRfdHlwZSwgY29uc3QgSW9EZWxlZ2F0ZSYgaW9fZGVsZWdhdGUpIHsKICAgaWYgKCFWYWxpZGF0ZU91dHB1dEZpbGVQYXRoKG91dHB1dF9maWxlLCBvcHRpb25zLCBkZWZpbmVkX3R5cGUpKSB7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKLSAgY29uc3QgQWlkbFN0cnVjdHVyZWRQYXJjZWxhYmxlKiBwYXJjZWxhYmxlID0gZGVmaW5lZF90eXBlLkFzU3RydWN0dXJlZFBhcmNlbGFibGUoKTsKLSAgaWYgKHBhcmNlbGFibGUgIT0gbnVsbHB0cikgewotICAgIHJldHVybiBHZW5lcmF0ZUNwcFBhcmNlbGFibGUob3V0cHV0X2ZpbGUsIG9wdGlvbnMsIHR5cGVuYW1lcywgKnBhcmNlbGFibGUsIGlvX2RlbGVnYXRlKTsKLSAgfQorICB1c2luZyBHZW5GbiA9IHZvaWQgKCopKENvZGVXcml0ZXIgJiBvdXQsIGNvbnN0IEFpZGxEZWZpbmVkVHlwZSYgZGVmaW5lZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7CisgIC8vIFdyYXAgR2VuZXJhdGUqIGZ1bmN0aW9uIHRvIGhhbmRsZSBDb2RlV3JpdGVyIGZvciBhIGZpbGUuCisgIGF1dG8gZ2VuID0gWyZdKGF1dG8gZmlsZSwgR2VuRm4gZm4pIHsKKyAgICB1bmlxdWVfcHRyPENvZGVXcml0ZXI+IHdyaXRlcihpb19kZWxlZ2F0ZS5HZXRDb2RlV3JpdGVyKGZpbGUpKTsKKyAgICBmbigqd3JpdGVyLCBkZWZpbmVkX3R5cGUsIHR5cGVuYW1lcywgb3B0aW9ucyk7CisgICAgQUlETF9GQVRBTF9JRighd3JpdGVyLT5DbG9zZSgpLCBkZWZpbmVkX3R5cGUpIDw8ICJJL08gRXJyb3IhIjsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfTsKIAotICAvLyBzaG91bGQgY29tZSBiZWZvcmUgQXNQYXJjZWxhYmxlKCkgYmVjYXVzZSB1bmlvbiBpcyBhIHBhcmNlbGFibGUKLSAgY29uc3QgQWlkbFVuaW9uRGVjbCogdW5pb25fZGVjbCA9IGRlZmluZWRfdHlwZS5Bc1VuaW9uRGVjbGFyYXRpb24oKTsKLSAgaWYgKHVuaW9uX2RlY2wgIT0gbnVsbHB0cikgewotICAgIHJldHVybiBHZW5lcmF0ZUNwcFBhcmNlbGFibGUob3V0cHV0X2ZpbGUsIG9wdGlvbnMsIHR5cGVuYW1lcywgKnVuaW9uX2RlY2wsIGlvX2RlbGVnYXRlKTsKLSAgfQotCi0gIC8vIHVuc3RydWN0dXJlZCBwYXJjZWxhYmxlCi0gIGNvbnN0IEFpZGxQYXJjZWxhYmxlKiBwYXJjZWxhYmxlX2RlY2wgPSBkZWZpbmVkX3R5cGUuQXNQYXJjZWxhYmxlKCk7Ci0gIGlmIChwYXJjZWxhYmxlX2RlY2wgIT0gbnVsbHB0cikgewotICAgIHJldHVybiBHZW5lcmF0ZUNwcFBhcmNlbERlY2xhcmF0aW9uKG91dHB1dF9maWxlLCBvcHRpb25zLCAqcGFyY2VsYWJsZV9kZWNsLCBpb19kZWxlZ2F0ZSk7Ci0gIH0KLQotICBjb25zdCBBaWRsRW51bURlY2xhcmF0aW9uKiBlbnVtX2RlY2wgPSBkZWZpbmVkX3R5cGUuQXNFbnVtRGVjbGFyYXRpb24oKTsKLSAgaWYgKGVudW1fZGVjbCAhPSBudWxscHRyKSB7Ci0gICAgcmV0dXJuIEdlbmVyYXRlQ3BwRW51bURlY2xhcmF0aW9uKG91dHB1dF9maWxlLCBvcHRpb25zLCB0eXBlbmFtZXMsICplbnVtX2RlY2wsIGlvX2RlbGVnYXRlKTsKLSAgfQotCi0gIGNvbnN0IEFpZGxJbnRlcmZhY2UqIGludGVyZmFjZSA9IGRlZmluZWRfdHlwZS5Bc0ludGVyZmFjZSgpOwotICBpZiAoaW50ZXJmYWNlICE9IG51bGxwdHIpIHsKLSAgICByZXR1cm4gR2VuZXJhdGVDcHBJbnRlcmZhY2Uob3V0cHV0X2ZpbGUsIG9wdGlvbnMsIHR5cGVuYW1lcywgKmludGVyZmFjZSwgaW9fZGVsZWdhdGUpOwotICB9Ci0KLSAgQUlETF9GQVRBTChkZWZpbmVkX3R5cGUpIDw8ICJVbnJlY29nbml6ZWQgdHlwZSBzZW50IGZvciBjcHAgZ2VuZXJhdGlvbi4iOwotICByZXR1cm4gZmFsc2U7CisgIHJldHVybiBnZW4ob3B0aW9ucy5PdXRwdXRIZWFkZXJEaXIoKSArIEhlYWRlckZpbGUoZGVmaW5lZF90eXBlLCBDbGFzc05hbWVzOjpSQVcpLAorICAgICAgICAgICAgICZHZW5lcmF0ZUhlYWRlcikgJiYKKyAgICAgICAgIGdlbihvcHRpb25zLk91dHB1dEhlYWRlckRpcigpICsgSGVhZGVyRmlsZShkZWZpbmVkX3R5cGUsIENsYXNzTmFtZXM6OkNMSUVOVCksCisgICAgICAgICAgICAgJkdlbmVyYXRlQ2xpZW50SGVhZGVyKSAmJgorICAgICAgICAgZ2VuKG9wdGlvbnMuT3V0cHV0SGVhZGVyRGlyKCkgKyBIZWFkZXJGaWxlKGRlZmluZWRfdHlwZSwgQ2xhc3NOYW1lczo6U0VSVkVSKSwKKyAgICAgICAgICAgICAmR2VuZXJhdGVTZXJ2ZXJIZWFkZXIpICYmCisgICAgICAgICBnZW4ob3V0cHV0X2ZpbGUsICZHZW5lcmF0ZVNvdXJjZSk7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBjcHAKZGlmZiAtLWdpdCBhL2dlbmVyYXRlX2NwcC5oIGIvZ2VuZXJhdGVfY3BwLmgKaW5kZXggM2I3ZDJiOS4uYWNkM2QzOSAxMDA2NDQKLS0tIGEvZ2VuZXJhdGVfY3BwLmgKKysrIGIvZ2VuZXJhdGVfY3BwLmgKQEAgLTIyLDcgKzIyLDYgQEAKICNpbmNsdWRlICJhaWRsX2xhbmd1YWdlLmgiCiAjaW5jbHVkZSAiYWlkbF90b19jcHAuaCIKICNpbmNsdWRlICJhaWRsX3RvX2NwcF9jb21tb24uaCIKLSNpbmNsdWRlICJhc3RfY3BwLmgiCiAjaW5jbHVkZSAib3B0aW9ucy5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC0zMiwyOCArMzEsNiBAQAogYm9vbCBHZW5lcmF0ZUNwcChjb25zdCBzdHJpbmcmIG91dHB1dF9maWxlLCBjb25zdCBPcHRpb25zJiBvcHRpb25zLCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsCiAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxEZWZpbmVkVHlwZSYgcGFyc2VkX2RvYywgY29uc3QgSW9EZWxlZ2F0ZSYgaW9fZGVsZWdhdGUpOwogCi1uYW1lc3BhY2UgaW50ZXJuYWxzIHsKLXN0ZDo6dW5pcXVlX3B0cjxEb2N1bWVudD4gQnVpbGRDbGllbnRTb3VyY2UoY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsSW50ZXJmYWNlJiBwYXJzZWRfZG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKLXN0ZDo6dW5pcXVlX3B0cjxEb2N1bWVudD4gQnVpbGRTZXJ2ZXJTb3VyY2UoY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsSW50ZXJmYWNlJiBwYXJzZWRfZG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKLXN0ZDo6dW5pcXVlX3B0cjxEb2N1bWVudD4gQnVpbGRJbnRlcmZhY2VTb3VyY2UoY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsSW50ZXJmYWNlJiBwYXJzZWRfZG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKLXN0ZDo6dW5pcXVlX3B0cjxEb2N1bWVudD4gQnVpbGRDbGllbnRIZWFkZXIoY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsSW50ZXJmYWNlJiBwYXJzZWRfZG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKLXN0ZDo6dW5pcXVlX3B0cjxEb2N1bWVudD4gQnVpbGRTZXJ2ZXJIZWFkZXIoY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsSW50ZXJmYWNlJiBwYXJzZWRfZG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKLXN0ZDo6dW5pcXVlX3B0cjxEb2N1bWVudD4gQnVpbGRJbnRlcmZhY2VIZWFkZXIoY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsSW50ZXJmYWNlJiBwYXJzZWRfZG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKLXN0ZDo6dW5pcXVlX3B0cjxEb2N1bWVudD4gQnVpbGRFbnVtSGVhZGVyKGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxFbnVtRGVjbGFyYXRpb24mIHBhcnNlZF9kb2MpOwotfQogfSAgLy8gbmFtZXNwYWNlIGNwcAogfSAgLy8gbmFtZXNwYWNlIGFpZGwKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9nZW5lcmF0ZV9jcHBfdW5pdHRlc3QuY3BwIGIvZ2VuZXJhdGVfY3BwX3VuaXR0ZXN0LmNwcAppbmRleCBjZTdjMThjLi5kNzlmMjI1IDEwMDY0NAotLS0gYS9nZW5lcmF0ZV9jcHBfdW5pdHRlc3QuY3BwCisrKyBiL2dlbmVyYXRlX2NwcF91bml0dGVzdC5jcHAKQEAgLTIxLDcgKzIxLDYgQEAKIAogI2luY2x1ZGUgImFpZGwuaCIKICNpbmNsdWRlICJhaWRsX2xhbmd1YWdlLmgiCi0jaW5jbHVkZSAiYXN0X2NwcC5oIgogI2luY2x1ZGUgImNvZGVfd3JpdGVyLmgiCiAjaW5jbHVkZSAiZ2VuZXJhdGVfY3BwLmgiCiAjaW5jbHVkZSAib3MuaCIKQEAgLTQ3LDcgKzQ2LDcgQEAKICAgICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKG9wdGlvbnNfLklucHV0RmlsZXMoKS5hdCgwKSwgZmlsZV9jb250ZW50c18pOwogCiAgICAgdmVjdG9yPHN0cmluZz4gaW1wb3J0ZWRfZmlsZXM7Ci0gICAgSW1wb3J0UmVzb2x2ZXIgaW1wb3J0X3Jlc29sdmVye2lvX2RlbGVnYXRlXywgb3B0aW9uc18uSW5wdXRGaWxlcygpLmF0KDApLCB7Ii4ifSwge319OworICAgIEltcG9ydFJlc29sdmVyIGltcG9ydF9yZXNvbHZlcntpb19kZWxlZ2F0ZV8sIG9wdGlvbnNfLklucHV0RmlsZXMoKS5hdCgwKSwgeyIuIn19OwogICAgIEFpZGxFcnJvciBlcnIgPSA6OmFuZHJvaWQ6OmFpZGw6OmludGVybmFsczo6bG9hZF9hbmRfdmFsaWRhdGVfYWlkbCgKICAgICAgICAgb3B0aW9uc18uSW5wdXRGaWxlcygpLmZyb250KCksIG9wdGlvbnNfLCBpb19kZWxlZ2F0ZV8sICZ0eXBlbmFtZXNfLCAmaW1wb3J0ZWRfZmlsZXMpOwogCkBAIC02MiwzNiArNjEsNiBAQAogICAgIHJldHVybiBkZWZpbmVkX3R5cGVzLmZyb250KCkuZ2V0KCktPkFzSW50ZXJmYWNlKCk7CiAgIH0KIAotICBBaWRsRW51bURlY2xhcmF0aW9uKiBQYXJzZVNpbmdsZUVudW1EZWNsYXJhdGlvbigpIHsKLSAgICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKG9wdGlvbnNfLklucHV0RmlsZXMoKS5hdCgwKSwgZmlsZV9jb250ZW50c18pOwotCi0gICAgdmVjdG9yPHN0cmluZz4gaW1wb3J0ZWRfZmlsZXM7Ci0gICAgQWlkbEVycm9yIGVyciA9IDo6YW5kcm9pZDo6YWlkbDo6aW50ZXJuYWxzOjpsb2FkX2FuZF92YWxpZGF0ZV9haWRsKAotICAgICAgICBvcHRpb25zXy5JbnB1dEZpbGVzKCkuZnJvbnQoKSwgb3B0aW9uc18sIGlvX2RlbGVnYXRlXywgJnR5cGVuYW1lc18sICZpbXBvcnRlZF9maWxlcyk7Ci0KLSAgICBpZiAoZXJyICE9IEFpZGxFcnJvcjo6T0spIHsKLSAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLQotICAgIGNvbnN0IGF1dG8mIGRlZmluZWRfdHlwZXMgPSB0eXBlbmFtZXNfLk1haW5Eb2N1bWVudCgpLkRlZmluZWRUeXBlcygpOwotICAgIEVYUEVDVF9FUSgxdWwsIGRlZmluZWRfdHlwZXMuc2l6ZSgpKTsKLSAgICBFWFBFQ1RfTkUobnVsbHB0ciwgZGVmaW5lZF90eXBlcy5mcm9udCgpLmdldCgpLT5Bc0VudW1EZWNsYXJhdGlvbigpKTsKLQotICAgIHJldHVybiBkZWZpbmVkX3R5cGVzLmZyb250KCkuZ2V0KCktPkFzRW51bURlY2xhcmF0aW9uKCk7Ci0gIH0KLQotICB2b2lkIENvbXBhcmUoRG9jdW1lbnQqIGRvYywgY29uc3QgY2hhciogZXhwZWN0ZWQpIHsKLSAgICBzdHJpbmcgb3V0cHV0OwotICAgIGRvYy0+V3JpdGUoQ29kZVdyaXRlcjo6Rm9yU3RyaW5nKCZvdXRwdXQpLmdldCgpKTsKLQotICAgIGlmIChleHBlY3RlZCA9PSBvdXRwdXQpIHsKLSAgICAgIHJldHVybjsgLy8gU3VjY2VzcwotICAgIH0KLQotICAgIHRlc3Q6OlByaW50RGlmZihleHBlY3RlZCwgb3V0cHV0KTsKLSAgICBGQUlMKCkgPDwgIkRvY3VtZW50IGNvbnRlbnRzIGRpZCBub3QgbWF0Y2ggZXhwZWN0ZWQgY29udGVudHMiOwotICB9Ci0KICAgY29uc3QgT3B0aW9ucyBvcHRpb25zXzsKICAgY29uc3Qgc3RyaW5nIGZpbGVfY29udGVudHNfOwogICBGYWtlSW9EZWxlZ2F0ZSBpb19kZWxlZ2F0ZV87CkBAIC0xMzEsMTEgKzEwMCwxMCBAQAogICAgICAgU3RyaW5nUHJpbnRmKCIlcyVjJXMiLCBrSGVhZGVyRGlyLCBPU19QQVRIX1NFUEFSQVRPUiwKICAgICAgICAgICAgICAgICAgICBrSW50ZXJmYWNlSGVhZGVyUmVsUGF0aCk7CiAgIGlvX2RlbGVnYXRlXy5BZGRCcm9rZW5GaWxlUGF0aChoZWFkZXJfcGF0aCk7Ci0gIEFTU0VSVF9GQUxTRShHZW5lcmF0ZUNwcChvcHRpb25zXy5PdXRwdXRGaWxlKCksIG9wdGlvbnNfLCB0eXBlbmFtZXNfLCAqaW50ZXJmYWNlLCBpb19kZWxlZ2F0ZV8pKTsKKyAgQVNTRVJUX0RFQVRIKEdlbmVyYXRlQ3BwKG9wdGlvbnNfLk91dHB1dEZpbGUoKSwgb3B0aW9uc18sIHR5cGVuYW1lc18sICppbnRlcmZhY2UsIGlvX2RlbGVnYXRlXyksCisgICAgICAgICAgICAgICAiSS9PIEVycm9yISIpOwogICAvLyBXZSBzaG91bGQgbmV2ZXIgYXR0ZW1wdCB0byB3cml0ZSB0aGUgQysrIGZpbGUgaWYgd2UgZmFpbCB3cml0aW5nIGhlYWRlcnMuCiAgIEFTU0VSVF9GQUxTRShpb19kZWxlZ2F0ZV8uR2V0V3JpdHRlbkNvbnRlbnRzKGtPdXRwdXRQYXRoLCBudWxscHRyKSk7Ci0gIC8vIFdlIHNob3VsZCByZW1vdmUgcGFydGlhbCByZXN1bHRzLgotICBBU1NFUlRfVFJVRShpb19kZWxlZ2F0ZV8uUGF0aFdhc1JlbW92ZWQoaGVhZGVyX3BhdGgpKTsKIH0KIAogVEVTVF9GKElvRXJyb3JIYW5kbGluZ1Rlc3QsIEhhbmRsZXNCYWRDcHBXcml0ZSkgewpAQCAtMTQ1LDkgKzExMyw4IEBACiAKICAgLy8gU2ltdWxhdGUgaXNzdWVzIGNsb3NpbmcgdGhlIGNwcCBmaWxlLgogICBpb19kZWxlZ2F0ZV8uQWRkQnJva2VuRmlsZVBhdGgoa091dHB1dFBhdGgpOwotICBBU1NFUlRfRkFMU0UoR2VuZXJhdGVDcHAob3B0aW9uc18uT3V0cHV0RmlsZSgpLCBvcHRpb25zXywgdHlwZW5hbWVzXywgKmludGVyZmFjZSwgaW9fZGVsZWdhdGVfKSk7Ci0gIC8vIFdlIHNob3VsZCByZW1vdmUgcGFydGlhbCByZXN1bHRzLgotICBBU1NFUlRfVFJVRShpb19kZWxlZ2F0ZV8uUGF0aFdhc1JlbW92ZWQoa091dHB1dFBhdGgpKTsKKyAgQVNTRVJUX0RFQVRIKEdlbmVyYXRlQ3BwKG9wdGlvbnNfLk91dHB1dEZpbGUoKSwgb3B0aW9uc18sIHR5cGVuYW1lc18sICppbnRlcmZhY2UsIGlvX2RlbGVnYXRlXyksCisgICAgICAgICAgICAgICAiSS9PIEVycm9yISIpOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgY3BwCmRpZmYgLS1naXQgYS9nZW5lcmF0ZV9qYXZhLmNwcCBiL2dlbmVyYXRlX2phdmEuY3BwCmluZGV4IGUxZDgyOTguLjM0MjA2NjkgMTAwNjQ0Ci0tLSBhL2dlbmVyYXRlX2phdmEuY3BwCisrKyBiL2dlbmVyYXRlX2phdmEuY3BwCkBAIC00NCwxNSArNDQsMTUgQEAKIHVzaW5nIGFuZHJvaWQ6OmFpZGw6OmphdmE6OkNvZGVHZW5lcmF0b3JDb250ZXh0OwogdXNpbmcgYW5kcm9pZDo6YWlkbDo6amF2YTo6Q29uc3RhbnRWYWx1ZURlY29yYXRvcjsKIAotaW5saW5lIHN0cmluZyBnZXR0ZXJfbmFtZShjb25zdCBBaWRsVmFyaWFibGVEZWNsYXJhdGlvbiYgdmFyaWFibGUpIHsKK2lubGluZSBzdHJpbmcgR2V0dGVyTmFtZShjb25zdCBBaWRsVmFyaWFibGVEZWNsYXJhdGlvbiYgdmFyaWFibGUpIHsKICAgcmV0dXJuICJnZXQiICsgdmFyaWFibGUuR2V0Q2FwaXRhbGl6ZWROYW1lKCk7CiB9Ci1pbmxpbmUgc3RyaW5nIHNldHRlcl9uYW1lKGNvbnN0IEFpZGxWYXJpYWJsZURlY2xhcmF0aW9uJiB2YXJpYWJsZSkgeworaW5saW5lIHN0cmluZyBTZXR0ZXJOYW1lKGNvbnN0IEFpZGxWYXJpYWJsZURlY2xhcmF0aW9uJiB2YXJpYWJsZSkgewogICByZXR1cm4gInNldCIgKyB2YXJpYWJsZS5HZXRDYXBpdGFsaXplZE5hbWUoKTsKIH0KIAogLy8gY2xhbmctZm9ybWF0IG9mZgotY29uc3QgbWFwPHN0cmluZywgc3RyaW5nPiBjb250ZW50c19kZXNjcmliZXJzIHsKK2NvbnN0IG1hcDxzdHJpbmcsIHN0cmluZz4ga0NvbnRlbnRzRGVzY3JpYmVycyB7CiAgIHsiRmlsZURlc2NyaXB0b3IiLCBSIihpZiAoX3YgaW5zdGFuY2VvZiBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yKSB7CiAgIHJldHVybiBhbmRyb2lkLm9zLlBhcmNlbGFibGUuQ09OVEVOVFNfRklMRV9ERVNDUklQVE9SOwogfSkifSwKQEAgLTY5LDggKzY5LDcgQEAKICAgfQogICByZXR1cm4gX21hc2s7CiB9KSJ9LAotICB7IkFycmF5IiwgUiIoQ2xhc3M8Pz4gX2NsYXp6ID0gX3YuZ2V0Q2xhc3MoKTsKLWlmIChfY2xhenouaXNBcnJheSgpICYmIF9jbGF6ei5nZXRDb21wb25lbnRUeXBlKCkgPT0gT2JqZWN0LmNsYXNzKSB7CisgIHsiQXJyYXkiLCBSIihpZiAoX3YgaW5zdGFuY2VvZiBPYmplY3RbXSkgewogICBpbnQgX21hc2sgPSAwOwogICBmb3IgKE9iamVjdCBvIDogKE9iamVjdFtdKSBfdikgewogICAgIF9tYXNrIHw9IGRlc2NyaWJlQ29udGVudHMobyk7CkBAIC04NSw3ICs4NCw3IEBACiAgIG91dC5JbmRlbnQoKTsKICAgb3V0IDw8ICJpZiAoX3YgPT0gbnVsbCkgcmV0dXJuIDA7XG4iOwogICBmb3IgKGNvbnN0IGF1dG8mIGQgOiBkZXNjcmliZXJzKSB7Ci0gICAgb3V0IDw8IGNvbnRlbnRzX2Rlc2NyaWJlcnMuYXQoZCkgPDwgIlxuIjsKKyAgICBvdXQgPDwga0NvbnRlbnRzRGVzY3JpYmVycy5hdChkKSA8PCAiXG4iOwogICB9CiAgIG91dCA8PCAicmV0dXJuIDA7XG4iOwogICBvdXQuRGVkZW50KCk7CkBAIC05Nyw3ICs5NiwxMiBAQAogYm9vbCBDYW5EZXNjcmliZUNvbnRlbnRzKGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiB0eXBlLCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywKICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ8c3RyaW5nPiogZGVzY3JpYmVycykgewogICBpZiAodHlwZS5Jc0FycmF5KCkpIHsKLSAgICBpZiAoQ2FuRGVzY3JpYmVDb250ZW50cyh0eXBlLkFycmF5QmFzZSgpLCB0eXBlcywgZGVzY3JpYmVycykpIHsKKyAgICBib29sIGNhbkRlc2NyaWJlID0gZmFsc2U7CisgICAgdHlwZS5WaWV3QXNBcnJheUJhc2UoWyZdKGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiBiYXNlKSB7CisgICAgICBjYW5EZXNjcmliZSA9IENhbkRlc2NyaWJlQ29udGVudHMoYmFzZSwgdHlwZXMsIGRlc2NyaWJlcnMpOworICAgIH0pOworCisgICAgaWYgKGNhbkRlc2NyaWJlKSB7CiAgICAgICBkZXNjcmliZXJzLT5pbnNlcnQoIkFycmF5Iik7CiAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CkBAIC0xNjgsNyArMTcyLDcgQEAKICAgICBpZiAoQ2FuRGVzY3JpYmVDb250ZW50cyhmLT5HZXRUeXBlKCksIHR5cGVzLCAmZGVzY3JpYmVycykpIHsKICAgICAgIG91dCA8PCAiY2FzZSAiIDw8IGYtPkdldE5hbWUoKSA8PCAiOlxuIjsKICAgICAgIG91dC5JbmRlbnQoKTsKLSAgICAgIG91dCA8PCAiX21hc2sgfD0gZGVzY3JpYmVDb250ZW50cygiIDw8IGdldHRlcl9uYW1lKCpmKSA8PCAiKCkpO1xuIjsKKyAgICAgIG91dCA8PCAiX21hc2sgfD0gZGVzY3JpYmVDb250ZW50cygiIDw8IEdldHRlck5hbWUoKmYpIDw8ICIoKSk7XG4iOwogICAgICAgb3V0IDw8ICJicmVhaztcbiI7CiAgICAgICBvdXQuRGVkZW50KCk7CiAgICAgfQpAQCAtMTgzLDcgKzE4Nyw3IEBACiB9CiAKIHZvaWQgR2VuZXJhdGVUb1N0cmluZyhDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxTdHJ1Y3R1cmVkUGFyY2VsYWJsZSYgcGFyY2VsLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcykgeworICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgewogICBvdXQgPDwgIkBPdmVycmlkZVxuIjsKICAgb3V0IDw8ICJwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkge1xuIjsKICAgb3V0LkluZGVudCgpOwpAQCAtMTk1LDYgKzE5OSw3IEBACiAgICAgICAgIC50eXBlbmFtZXMgPSB0eXBlbmFtZXMsCiAgICAgICAgIC50eXBlID0gZmllbGQtPkdldFR5cGUoKSwKICAgICAgICAgLnZhciA9IGZpZWxkLT5HZXROYW1lKCksCisgICAgICAgIC5taW5fc2RrX3ZlcnNpb24gPSBvcHRpb25zLkdldE1pblNka1ZlcnNpb24oKSwKICAgICB9OwogICAgIG91dCA8PCAiX2FpZGxfc2ouYWRkKFwiIiA8PCBmaWVsZC0+R2V0TmFtZSgpIDw8ICI6IFwiICsgKCI7CiAgICAgVG9TdHJpbmdGb3IoY3R4KTsKQEAgLTIwNSw4ICsyMTAsOCBAQAogICBvdXQgPDwgIn1cbiI7CiB9CiAKLXZvaWQgR2VuZXJhdGVUb1N0cmluZyhDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxVbmlvbkRlY2wmIHBhcmNlbCwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMpIHsKK3ZvaWQgR2VuZXJhdGVUb1N0cmluZyhDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxVbmlvbkRlY2wmIHBhcmNlbCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKICAgb3V0IDw8ICJAT3ZlcnJpZGVcbiI7CiAgIG91dCA8PCAicHVibGljIFN0cmluZyB0b1N0cmluZygpIHtcbiI7CiAgIG91dC5JbmRlbnQoKTsKQEAgLTIxNiw3ICsyMjEsOCBAQAogICAgICAgICAud3JpdGVyID0gb3V0LAogICAgICAgICAudHlwZW5hbWVzID0gdHlwZW5hbWVzLAogICAgICAgICAudHlwZSA9IGZpZWxkLT5HZXRUeXBlKCksCi0gICAgICAgIC52YXIgPSBnZXR0ZXJfbmFtZSgqZmllbGQpICsgIigpIiwKKyAgICAgICAgLnZhciA9IEdldHRlck5hbWUoKmZpZWxkKSArICIoKSIsCisgICAgICAgIC5taW5fc2RrX3ZlcnNpb24gPSBvcHRpb25zLkdldE1pblNka1ZlcnNpb24oKSwKICAgICB9OwogICAgIG91dCA8PCAiY2FzZSAiIDw8IGZpZWxkLT5HZXROYW1lKCkgPDwgIjogcmV0dXJuIFwiIiA8PCBwYXJjZWwuR2V0Q2Fub25pY2FsTmFtZSgpIDw8ICIuIgogICAgICAgICA8PCBmaWVsZC0+R2V0TmFtZSgpIDw8ICIoXCIgKyAoIjsKQEAgLTI5MCwxMSArMjk2LDcgQEAKIG5hbWVzcGFjZSBqYXZhIHsKIAogc3RkOjpzdHJpbmcgR2VuZXJhdGVDb21tZW50cyhjb25zdCBBaWRsQ29tbWVudGFibGUmIG5vZGUpIHsKLSAgc3RkOjpzdHJpbmcgY29tbWVudHMgPSBGb3JtYXRDb21tZW50c0ZvckphdmEobm9kZS5HZXRDb21tZW50cygpKTsKLSAgaWYgKCFjb21tZW50cy5lbXB0eSgpICYmIGNvbW1lbnRzLmJhY2soKSAhPSAnXG4nKSB7Ci0gICAgY29tbWVudHMgKz0gJ1xuJzsKLSAgfQotICByZXR1cm4gY29tbWVudHM7CisgIHJldHVybiBGb3JtYXRDb21tZW50c0ZvckphdmEobm9kZS5HZXRDb21tZW50cygpKTsKIH0KIAogc3RkOjpzdHJpbmcgR2VuZXJhdGVBbm5vdGF0aW9ucyhjb25zdCBBaWRsTm9kZSYgbm9kZSkgewpAQCAtMzA1LDc2ICszMDcsOSBAQAogICByZXR1cm4gcmVzdWx0OwogfQogCi1ib29sIGdlbmVyYXRlX2phdmFfaW50ZXJmYWNlKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsIGNvbnN0IEFpZGxJbnRlcmZhY2UqIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsIGNvbnN0IElvRGVsZWdhdGUmIGlvX2RlbGVnYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7Ci0gIGF1dG8gY2wgPSBnZW5lcmF0ZV9iaW5kZXJfaW50ZXJmYWNlX2NsYXNzKGlmYWNlLCB0eXBlbmFtZXMsIG9wdGlvbnMpOwotCi0gIHN0ZDo6dW5pcXVlX3B0cjxEb2N1bWVudD4gZG9jdW1lbnQgPQotICAgICAgc3RkOjptYWtlX3VuaXF1ZTxEb2N1bWVudD4oIiIgLyogbm8gY29tbWVudCAqLywgaWZhY2UtPkdldFBhY2thZ2UoKSwgc3RkOjptb3ZlKGNsKSk7Ci0KLSAgQ29kZVdyaXRlclB0ciBjb2RlX3dyaXRlciA9IGlvX2RlbGVnYXRlLkdldENvZGVXcml0ZXIoZmlsZW5hbWUpOwotICBkb2N1bWVudC0+V3JpdGUoY29kZV93cml0ZXIuZ2V0KCkpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIGdlbmVyYXRlX2phdmFfcGFyY2VsKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwgY29uc3QgQWlkbFN0cnVjdHVyZWRQYXJjZWxhYmxlKiBwYXJjZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywgY29uc3QgSW9EZWxlZ2F0ZSYgaW9fZGVsZWdhdGUpIHsKLSAgYXV0byBjbCA9IGdlbmVyYXRlX3BhcmNlbF9jbGFzcyhwYXJjZWwsIHR5cGVuYW1lcyk7Ci0KLSAgc3RkOjp1bmlxdWVfcHRyPERvY3VtZW50PiBkb2N1bWVudCA9Ci0gICAgICBzdGQ6Om1ha2VfdW5pcXVlPERvY3VtZW50PigiIiAvKiBubyBjb21tZW50ICovLCBwYXJjZWwtPkdldFBhY2thZ2UoKSwgc3RkOjptb3ZlKGNsKSk7Ci0KLSAgQ29kZVdyaXRlclB0ciBjb2RlX3dyaXRlciA9IGlvX2RlbGVnYXRlLkdldENvZGVXcml0ZXIoZmlsZW5hbWUpOwotICBkb2N1bWVudC0+V3JpdGUoY29kZV93cml0ZXIuZ2V0KCkpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIGdlbmVyYXRlX2phdmFfZW51bV9kZWNsYXJhdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsRW51bURlY2xhcmF0aW9uKiBlbnVtX2RlY2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsIGNvbnN0IElvRGVsZWdhdGUmIGlvX2RlbGVnYXRlKSB7Ci0gIENvZGVXcml0ZXJQdHIgY29kZV93cml0ZXIgPSBpb19kZWxlZ2F0ZS5HZXRDb2RlV3JpdGVyKGZpbGVuYW1lKTsKLSAgZ2VuZXJhdGVfZW51bShjb2RlX3dyaXRlciwgZW51bV9kZWNsLCB0eXBlbmFtZXMpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBnZW5lcmF0ZV9qYXZhX3VuaW9uX2RlY2xhcmF0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwgY29uc3QgQWlkbFVuaW9uRGVjbCogZGVjbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW9EZWxlZ2F0ZSYgaW9fZGVsZWdhdGUpIHsKLSAgQ29kZVdyaXRlclB0ciBjb2RlX3dyaXRlciA9IGlvX2RlbGVnYXRlLkdldENvZGVXcml0ZXIoZmlsZW5hbWUpOwotICBnZW5lcmF0ZV91bmlvbigqY29kZV93cml0ZXIsIGRlY2wsIHR5cGVuYW1lcyk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIGdlbmVyYXRlX2phdmEoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLCBjb25zdCBBaWRsRGVmaW5lZFR5cGUqIGRlZmluZWRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsIGNvbnN0IElvRGVsZWdhdGUmIGlvX2RlbGVnYXRlLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKLSAgaWYgKGNvbnN0IEFpZGxTdHJ1Y3R1cmVkUGFyY2VsYWJsZSogcGFyY2VsYWJsZSA9IGRlZmluZWRfdHlwZS0+QXNTdHJ1Y3R1cmVkUGFyY2VsYWJsZSgpOwotICAgICAgcGFyY2VsYWJsZSAhPSBudWxscHRyKSB7Ci0gICAgcmV0dXJuIGdlbmVyYXRlX2phdmFfcGFyY2VsKGZpbGVuYW1lLCBwYXJjZWxhYmxlLCB0eXBlbmFtZXMsIGlvX2RlbGVnYXRlKTsKLSAgfQotCi0gIGlmIChjb25zdCBBaWRsRW51bURlY2xhcmF0aW9uKiBlbnVtX2RlY2wgPSBkZWZpbmVkX3R5cGUtPkFzRW51bURlY2xhcmF0aW9uKCk7Ci0gICAgICBlbnVtX2RlY2wgIT0gbnVsbHB0cikgewotICAgIHJldHVybiBnZW5lcmF0ZV9qYXZhX2VudW1fZGVjbGFyYXRpb24oZmlsZW5hbWUsIGVudW1fZGVjbCwgdHlwZW5hbWVzLCBpb19kZWxlZ2F0ZSk7Ci0gIH0KLQotICBpZiAoY29uc3QgQWlkbEludGVyZmFjZSogaW50ZXJmYWNlID0gZGVmaW5lZF90eXBlLT5Bc0ludGVyZmFjZSgpOyBpbnRlcmZhY2UgIT0gbnVsbHB0cikgewotICAgIHJldHVybiBnZW5lcmF0ZV9qYXZhX2ludGVyZmFjZShmaWxlbmFtZSwgaW50ZXJmYWNlLCB0eXBlbmFtZXMsIGlvX2RlbGVnYXRlLCBvcHRpb25zKTsKLSAgfQotCi0gIGlmIChjb25zdCBBaWRsVW5pb25EZWNsKiB1bmlvbl9kZWNsID0gZGVmaW5lZF90eXBlLT5Bc1VuaW9uRGVjbGFyYXRpb24oKTsgdW5pb25fZGVjbCAhPSBudWxscHRyKSB7Ci0gICAgcmV0dXJuIGdlbmVyYXRlX2phdmFfdW5pb25fZGVjbGFyYXRpb24oZmlsZW5hbWUsIHVuaW9uX2RlY2wsIHR5cGVuYW1lcywgaW9fZGVsZWdhdGUpOwotICB9Ci0KLSAgQUlETF9GQVRBTChkZWZpbmVkX3R5cGUpIDw8ICJVbnJlY29nbml6ZWQgdHlwZSBzZW50IGZvciBKYXZhIGdlbmVyYXRpb24uIjsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGQ6OnVuaXF1ZV9wdHI8YW5kcm9pZDo6YWlkbDo6amF2YTo6Q2xhc3M+IGdlbmVyYXRlX3BhcmNlbF9jbGFzcygKLSAgICBjb25zdCBBaWRsU3RydWN0dXJlZFBhcmNlbGFibGUqIHBhcmNlbCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzKSB7CitzdGQ6OnVuaXF1ZV9wdHI8YW5kcm9pZDo6YWlkbDo6amF2YTo6Q2xhc3M+IEdlbmVyYXRlUGFyY2VsYWJsZUNsYXNzKAorICAgIGNvbnN0IEFpZGxTdHJ1Y3R1cmVkUGFyY2VsYWJsZSogcGFyY2VsLCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsCisgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgewogICBhdXRvIHBhcmNlbF9jbGFzcyA9IHN0ZDo6bWFrZV91bmlxdWU8Q2xhc3M+KCk7CiAgIHBhcmNlbF9jbGFzcy0+Y29tbWVudCA9IEdlbmVyYXRlQ29tbWVudHMoKnBhcmNlbCk7CiAgIHBhcmNlbF9jbGFzcy0+bW9kaWZpZXJzID0gUFVCTElDOwpAQCAtMzgyLDYgKzMxNyw5IEBACiAgIHBhcmNlbF9jbGFzcy0+dHlwZSA9IHBhcmNlbC0+R2V0Q2Fub25pY2FsTmFtZSgpOwogICBwYXJjZWxfY2xhc3MtPmludGVyZmFjZXMucHVzaF9iYWNrKCJhbmRyb2lkLm9zLlBhcmNlbGFibGUiKTsKICAgcGFyY2VsX2NsYXNzLT5hbm5vdGF0aW9ucyA9IEphdmFBbm5vdGF0aW9uc0ZvcigqcGFyY2VsKTsKKyAgaWYgKHBhcmNlbC0+R2V0UGFyZW50VHlwZSgpKSB7CisgICAgcGFyY2VsX2NsYXNzLT5tb2RpZmllcnMgfD0gU1RBVElDOworICB9CiAKICAgaWYgKHBhcmNlbC0+SXNHZW5lcmljKCkpIHsKICAgICBwYXJjZWxfY2xhc3MtPnR5cGUgKz0gIjwiICsgYmFzZTo6Sm9pbihwYXJjZWwtPkdldFR5cGVQYXJhbWV0ZXJzKCksICIsIikgKyAiPiI7CkBAIC0zOTYsMTIgKzMzNCwxMiBAQAogICAgIGlmICh2YXJpYWJsZS0+R2V0VHlwZSgpLkdldE5hbWUoKSA9PSAiUGFyY2VsYWJsZUhvbGRlciIgfHwgcGFyY2VsLT5Jc0phdmFPbmx5SW1tdXRhYmxlKCkpIHsKICAgICAgIG91dCA8PCAiZmluYWwgIjsKICAgICB9Ci0gICAgb3V0IDw8IEphdmFTaWduYXR1cmVPZih2YXJpYWJsZS0+R2V0VHlwZSgpLCB0eXBlbmFtZXMpIDw8ICIgIiA8PCB2YXJpYWJsZS0+R2V0TmFtZSgpOworICAgIG91dCA8PCBKYXZhU2lnbmF0dXJlT2YodmFyaWFibGUtPkdldFR5cGUoKSkgPDwgIiAiIDw8IHZhcmlhYmxlLT5HZXROYW1lKCk7CiAgICAgaWYgKCFwYXJjZWwtPklzSmF2YU9ubHlJbW11dGFibGUoKSAmJiB2YXJpYWJsZS0+R2V0RGVmYXVsdFZhbHVlKCkpIHsKICAgICAgIG91dCA8PCAiID0gIiA8PCB2YXJpYWJsZS0+VmFsdWVTdHJpbmcoQ29uc3RhbnRWYWx1ZURlY29yYXRvcik7CiAgICAgfSBlbHNlIGlmICh2YXJpYWJsZS0+R2V0VHlwZSgpLkdldE5hbWUoKSA9PSAiUGFyY2VsYWJsZUhvbGRlciIpIHsKICAgICAgIG91dCA8PCBzdGQ6OmJvb2xhbHBoYTsKLSAgICAgIG91dCA8PCAiID0gbmV3ICIgPDwgSmF2YVNpZ25hdHVyZU9mKHZhcmlhYmxlLT5HZXRUeXBlKCksIHR5cGVuYW1lcykgPDwgIigiOworICAgICAgb3V0IDw8ICIgPSBuZXcgIiA8PCBKYXZhU2lnbmF0dXJlT2YodmFyaWFibGUtPkdldFR5cGUoKSkgPDwgIigiOwogICAgICAgaWYgKHBhcmNlbC0+SXNWaW50ZlN0YWJpbGl0eSgpKSB7CiAgICAgICAgIG91dCA8PCAiYW5kcm9pZC5vcy5QYXJjZWxhYmxlLlBBUkNFTEFCTEVfU1RBQklMSVRZX1ZJTlRGIjsKICAgICAgIH0gZWxzZSB7CkBAIC00MjMsMTUgKzM2MSwxMyBAQAogCiAgICAgb3V0LnN0cigiIik7CiAgICAgZm9yIChjb25zdCBhdXRvJiB2YXJpYWJsZSA6IHBhcmNlbC0+R2V0RmllbGRzKCkpIHsKLSAgICAgIG91dCA8PCAicHJpdmF0ZSAiIDw8IEphdmFTaWduYXR1cmVPZih2YXJpYWJsZS0+R2V0VHlwZSgpLCB0eXBlbmFtZXMpIDw8ICIgIgotICAgICAgICAgIDw8IHZhcmlhYmxlLT5HZXROYW1lKCk7CisgICAgICBvdXQgPDwgInByaXZhdGUgIiA8PCBKYXZhU2lnbmF0dXJlT2YodmFyaWFibGUtPkdldFR5cGUoKSkgPDwgIiAiIDw8IHZhcmlhYmxlLT5HZXROYW1lKCk7CiAgICAgICBpZiAodmFyaWFibGUtPkdldERlZmF1bHRWYWx1ZSgpKSB7CiAgICAgICAgIG91dCA8PCAiID0gIiA8PCB2YXJpYWJsZS0+VmFsdWVTdHJpbmcoQ29uc3RhbnRWYWx1ZURlY29yYXRvcik7CiAgICAgICB9CiAgICAgICBvdXQgPDwgIjtcbiI7Ci0gICAgICBvdXQgPDwgInB1YmxpYyBCdWlsZGVyICIgPDwgc2V0dGVyX25hbWUoKnZhcmlhYmxlKSA8PCAiKCIKLSAgICAgICAgICA8PCBKYXZhU2lnbmF0dXJlT2YodmFyaWFibGUtPkdldFR5cGUoKSwgdHlwZW5hbWVzKSA8PCAiICIgPDwgdmFyaWFibGUtPkdldE5hbWUoKQotICAgICAgICAgIDw8ICIpIHtcbiIKKyAgICAgIG91dCA8PCAicHVibGljIEJ1aWxkZXIgIiA8PCBTZXR0ZXJOYW1lKCp2YXJpYWJsZSkgPDwgIigiCisgICAgICAgICAgPDwgSmF2YVNpZ25hdHVyZU9mKHZhcmlhYmxlLT5HZXRUeXBlKCkpIDw8ICIgIiA8PCB2YXJpYWJsZS0+R2V0TmFtZSgpIDw8ICIpIHtcbiIKICAgICAgICAgICA8PCAiICAiCiAgICAgICAgICAgPDwgInRoaXMuIiA8PCB2YXJpYWJsZS0+R2V0TmFtZSgpIDw8ICIgPSAiIDw8IHZhcmlhYmxlLT5HZXROYW1lKCkgPDwgIjtcbiIKICAgICAgICAgICA8PCAiICByZXR1cm4gdGhpcztcbiIKQEAgLTQ5OSw3ICs0MzUsOCBAQAogICAgICAgICAudHlwZSA9IGZpZWxkLT5HZXRUeXBlKCksCiAgICAgICAgIC5wYXJjZWwgPSBwYXJjZWxfdmFyaWFibGUtPm5hbWUsCiAgICAgICAgIC52YXIgPSBmaWVsZC0+R2V0TmFtZSgpLAotICAgICAgICAuaXNfcmV0dXJuX3ZhbHVlID0gZmFsc2UsCisgICAgICAgIC5taW5fc2RrX3ZlcnNpb24gPSBvcHRpb25zLkdldE1pblNka1ZlcnNpb24oKSwKKyAgICAgICAgLndyaXRlX3RvX3BhcmNlbF9mbGFnID0gIl9haWRsX2ZsYWciLAogICAgIH07CiAgICAgV3JpdGVUb1BhcmNlbEZvcihjb250ZXh0KTsKICAgICB3cml0ZXItPkNsb3NlKCk7CkBAIC01MjIsOCArNDU5LDggQEAKICAgICBjb25zdHJ1Y3Rvci0+bmFtZSA9IHBhcmNlbC0+R2V0TmFtZSgpOwogICAgIGNvbnN0cnVjdG9yLT5zdGF0ZW1lbnRzID0gc3RkOjptYWtlX3NoYXJlZDxTdGF0ZW1lbnRCbG9jaz4oKTsKICAgICBmb3IgKGNvbnN0IGF1dG8mIGZpZWxkIDogcGFyY2VsLT5HZXRGaWVsZHMoKSkgewotICAgICAgY29uc3RydWN0b3ItPnBhcmFtZXRlcnMucHVzaF9iYWNrKHN0ZDo6bWFrZV9zaGFyZWQ8VmFyaWFibGU+KAotICAgICAgICAgIEphdmFTaWduYXR1cmVPZihmaWVsZC0+R2V0VHlwZSgpLCB0eXBlbmFtZXMpLCBmaWVsZC0+R2V0TmFtZSgpKSk7CisgICAgICBjb25zdHJ1Y3Rvci0+cGFyYW1ldGVycy5wdXNoX2JhY2soCisgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxWYXJpYWJsZT4oSmF2YVNpZ25hdHVyZU9mKGZpZWxkLT5HZXRUeXBlKCkpLCBmaWVsZC0+R2V0TmFtZSgpKSk7CiAgICAgICBvdXQuc3RyKCIiKTsKIAogICAgICAgb3V0IDw8ICJ0aGlzLiIgPDwgZmllbGQtPkdldE5hbWUoKSA8PCAiID0gIjsKQEAgLTU2Niw3ICs1MDMsOCBAQAogICBvdXQgPDwgImludCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCk7XG4iCiAgICAgICA8PCAiaW50IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IF9haWRsX3BhcmNlbC5yZWFkSW50KCk7XG4iCiAgICAgICA8PCAidHJ5IHtcbiIKLSAgICAgIDw8ICIgIGlmIChfYWlkbF9wYXJjZWxhYmxlX3NpemUgPCAwKSByZXR1cm4iOworICAgICAgPDwgIiAgaWYgKF9haWRsX3BhcmNlbGFibGVfc2l6ZSA8IDQpIHRocm93IG5ldyAiCisgICAgICAgICAiYW5kcm9pZC5vcy5CYWRQYXJjZWxhYmxlRXhjZXB0aW9uKFwiUGFyY2VsYWJsZSB0b28gc21hbGxcIik7IjsKICAgaWYgKHBhcmNlbC0+SXNKYXZhT25seUltbXV0YWJsZSgpKSB7CiAgICAgb3V0IDw8ICIgIiA8PCBidWlsZGVyX3ZhcmlhYmxlIDw8ICIuYnVpbGQoKSI7CiAgIH0KQEAgLTU5NywxNiArNTM1LDE3IEBACiAgICAgICAgIC50eXBlID0gZmllbGQtPkdldFR5cGUoKSwKICAgICAgICAgLnBhcmNlbCA9IHBhcmNlbF92YXJpYWJsZS0+bmFtZSwKICAgICAgICAgLnZhciA9IGZpZWxkX3ZhcmlhYmxlX25hbWUsCisgICAgICAgIC5taW5fc2RrX3ZlcnNpb24gPSBvcHRpb25zLkdldE1pblNka1ZlcnNpb24oKSwKICAgICAgICAgLmlzX2NsYXNzbG9hZGVyX2NyZWF0ZWQgPSAmaXNfY2xhc3Nsb2FkZXJfY3JlYXRlZCwKICAgICB9OwogICAgIGNvbnRleHQud3JpdGVyLkluZGVudCgpOwogICAgIGlmIChwYXJjZWwtPklzSmF2YU9ubHlJbW11dGFibGUoKSkgewotICAgICAgY29udGV4dC53cml0ZXIuV3JpdGUoIiVzICVzO1xuIiwgSmF2YVNpZ25hdHVyZU9mKGZpZWxkLT5HZXRUeXBlKCksIHR5cGVuYW1lcykuY19zdHIoKSwKKyAgICAgIGNvbnRleHQud3JpdGVyLldyaXRlKCIlcyAlcztcbiIsIEphdmFTaWduYXR1cmVPZihmaWVsZC0+R2V0VHlwZSgpKS5jX3N0cigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfdmFyaWFibGVfbmFtZS5jX3N0cigpKTsKICAgICB9CiAgICAgQ3JlYXRlRnJvbVBhcmNlbEZvcihjb250ZXh0KTsKICAgICBpZiAocGFyY2VsLT5Jc0phdmFPbmx5SW1tdXRhYmxlKCkpIHsKLSAgICAgIGNvbnRleHQud3JpdGVyLldyaXRlKCIlcy4lcyglcyk7XG4iLCBidWlsZGVyX3ZhcmlhYmxlLmNfc3RyKCksIHNldHRlcl9uYW1lKCpmaWVsZCkuY19zdHIoKSwKKyAgICAgIGNvbnRleHQud3JpdGVyLldyaXRlKCIlcy4lcyglcyk7XG4iLCBidWlsZGVyX3ZhcmlhYmxlLmNfc3RyKCksIFNldHRlck5hbWUoKmZpZWxkKS5jX3N0cigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfdmFyaWFibGVfbmFtZS5jX3N0cigpKTsKICAgICB9CiAgICAgd3JpdGVyLT5DbG9zZSgpOwpAQCAtNjMwLDEyICs1NjksMTIgQEAKICAgcGFyY2VsX2NsYXNzLT5lbGVtZW50cy5wdXNoX2JhY2socmVhZF9vcl9jcmVhdGVfbWV0aG9kKTsKIAogICBzdHJpbmcgY29uc3RhbnRzOwotICBnZW5lcmF0ZV9jb25zdGFudF9kZWNsYXJhdGlvbnMoKkNvZGVXcml0ZXI6OkZvclN0cmluZygmY29uc3RhbnRzKSwgKnBhcmNlbCk7CisgIEdlbmVyYXRlQ29uc3RhbnREZWNsYXJhdGlvbnMoKkNvZGVXcml0ZXI6OkZvclN0cmluZygmY29uc3RhbnRzKSwgKnBhcmNlbCk7CiAgIHBhcmNlbF9jbGFzcy0+ZWxlbWVudHMucHVzaF9iYWNrKHN0ZDo6bWFrZV9zaGFyZWQ8TGl0ZXJhbENsYXNzRWxlbWVudD4oY29uc3RhbnRzKSk7CiAKICAgaWYgKHBhcmNlbC0+SmF2YURlcml2ZSgidG9TdHJpbmciKSkgewogICAgIHN0cmluZyB0b19zdHJpbmc7Ci0gICAgR2VuZXJhdGVUb1N0cmluZygqQ29kZVdyaXRlcjo6Rm9yU3RyaW5nKCZ0b19zdHJpbmcpLCAqcGFyY2VsLCB0eXBlbmFtZXMpOworICAgIEdlbmVyYXRlVG9TdHJpbmcoKkNvZGVXcml0ZXI6OkZvclN0cmluZygmdG9fc3RyaW5nKSwgKnBhcmNlbCwgdHlwZW5hbWVzLCBvcHRpb25zKTsKICAgICBwYXJjZWxfY2xhc3MtPmVsZW1lbnRzLnB1c2hfYmFjayhzdGQ6Om1ha2Vfc2hhcmVkPExpdGVyYWxDbGFzc0VsZW1lbnQ+KHRvX3N0cmluZykpOwogICB9CiAKQEAgLTY1MCw1MCArNTg5LDkxIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWVzKTsKICAgcGFyY2VsX2NsYXNzLT5lbGVtZW50cy5wdXNoX2JhY2soc3RkOjptYWtlX3NoYXJlZDxMaXRlcmFsQ2xhc3NFbGVtZW50PihkZXNjcmliZV9jb250ZW50cykpOwogCisgIC8vIGFsbCB0aGUgbmVzdGVkIHR5cGVzCisgIHN0cmluZyBjb2RlOworICBhdXRvIHdyaXRlciA9IENvZGVXcml0ZXI6OkZvclN0cmluZygmY29kZSk7CisgIGZvciAoY29uc3QgYXV0byYgbmVzdGVkIDogcGFyY2VsLT5HZXROZXN0ZWRUeXBlcygpKSB7CisgICAgR2VuZXJhdGVDbGFzcygqd3JpdGVyLCAqbmVzdGVkLCB0eXBlbmFtZXMsIG9wdGlvbnMpOworICB9CisgIEdlbmVyYXRlUGFyY2VsSGVscGVycygqd3JpdGVyLCAqcGFyY2VsLCBvcHRpb25zKTsKKyAgd3JpdGVyLT5DbG9zZSgpOworICBwYXJjZWxfY2xhc3MtPmVsZW1lbnRzLnB1c2hfYmFjayhzdGQ6Om1ha2Vfc2hhcmVkPExpdGVyYWxDbGFzc0VsZW1lbnQ+KGNvZGUpKTsKKwogICByZXR1cm4gcGFyY2VsX2NsYXNzOwogfQogCi12b2lkIGdlbmVyYXRlX2VudW0oY29uc3QgQ29kZVdyaXRlclB0ciYgY29kZV93cml0ZXIsIGNvbnN0IEFpZGxFbnVtRGVjbGFyYXRpb24qIGVudW1fZGVjbCwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMpIHsKLSAgY29kZV93cml0ZXItPldyaXRlKAotICAgICAgIi8qXG4iCi0gICAgICAiICogVGhpcyBmaWxlIGlzIGF1dG8tZ2VuZXJhdGVkLiAgRE8gTk9UIE1PRElGWS5cbiIKLSAgICAgICIgKi9cbiIpOwotCi0gIGNvZGVfd3JpdGVyLT5Xcml0ZSgicGFja2FnZSAlcztcbiIsIGVudW1fZGVjbC0+R2V0UGFja2FnZSgpLmNfc3RyKCkpOwotICAoKmNvZGVfd3JpdGVyKSA8PCBHZW5lcmF0ZUNvbW1lbnRzKCplbnVtX2RlY2wpOwotICAoKmNvZGVfd3JpdGVyKSA8PCBHZW5lcmF0ZUFubm90YXRpb25zKCplbnVtX2RlY2wpOwotICBjb2RlX3dyaXRlci0+V3JpdGUoInB1YmxpYyBAaW50ZXJmYWNlICVzIHtcbiIsIGVudW1fZGVjbC0+R2V0TmFtZSgpLmNfc3RyKCkpOwotICBjb2RlX3dyaXRlci0+SW5kZW50KCk7Ci0gIGZvciAoY29uc3QgYXV0byYgZW51bWVyYXRvciA6IGVudW1fZGVjbC0+R2V0RW51bWVyYXRvcnMoKSkgewotICAgICgqY29kZV93cml0ZXIpIDw8IEdlbmVyYXRlQ29tbWVudHMoKmVudW1lcmF0b3IpOwotICAgICgqY29kZV93cml0ZXIpIDw8IEdlbmVyYXRlQW5ub3RhdGlvbnMoKmVudW1lcmF0b3IpOwotICAgIGNvZGVfd3JpdGVyLT5Xcml0ZSgKLSAgICAgICAgInB1YmxpYyBzdGF0aWMgZmluYWwgJXMgJXMgPSAlcztcbiIsCi0gICAgICAgIEphdmFTaWduYXR1cmVPZihlbnVtX2RlY2wtPkdldEJhY2tpbmdUeXBlKCksIHR5cGVuYW1lcykuY19zdHIoKSwKLSAgICAgICAgZW51bWVyYXRvci0+R2V0TmFtZSgpLmNfc3RyKCksCi0gICAgICAgIGVudW1lcmF0b3ItPlZhbHVlU3RyaW5nKGVudW1fZGVjbC0+R2V0QmFja2luZ1R5cGUoKSwgQ29uc3RhbnRWYWx1ZURlY29yYXRvcikuY19zdHIoKSk7Cit2b2lkIEdlbmVyYXRlRW51bUNsYXNzKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbEVudW1EZWNsYXJhdGlvbiYgZW51bV9kZWNsKSB7CisgIGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiBiYWNraW5nX3R5cGUgPSBlbnVtX2RlY2wuR2V0QmFja2luZ1R5cGUoKTsKKyAgc3RkOjpzdHJpbmcgcmF3X3R5cGUgPSBKYXZhU2lnbmF0dXJlT2YoYmFja2luZ190eXBlKTsKKyAgc3RkOjpzdHJpbmcgYm94aW5nX3R5cGUgPSBKYXZhQm94aW5nVHlwZU9mKGJhY2tpbmdfdHlwZSk7CisgIG91dCA8PCBHZW5lcmF0ZUNvbW1lbnRzKGVudW1fZGVjbCk7CisgIG91dCA8PCBHZW5lcmF0ZUFubm90YXRpb25zKGVudW1fZGVjbCk7CisgIG91dCA8PCAicHVibGljICI7CisgIGlmIChlbnVtX2RlY2wuR2V0UGFyZW50VHlwZSgpKSB7CisgICAgb3V0IDw8ICJzdGF0aWMgIjsKICAgfQotICBjb2RlX3dyaXRlci0+RGVkZW50KCk7Ci0gIGNvZGVfd3JpdGVyLT5Xcml0ZSgifVxuIik7CisgIG91dCA8PCAiQGludGVyZmFjZSAiIDw8IGVudW1fZGVjbC5HZXROYW1lKCkgPDwgIiB7XG4iOworICBvdXQuSW5kZW50KCk7CisgIGZvciAoY29uc3QgYXV0byYgZW51bWVyYXRvciA6IGVudW1fZGVjbC5HZXRFbnVtZXJhdG9ycygpKSB7CisgICAgb3V0IDw8IEdlbmVyYXRlQ29tbWVudHMoKmVudW1lcmF0b3IpOworICAgIG91dCA8PCBHZW5lcmF0ZUFubm90YXRpb25zKCplbnVtZXJhdG9yKTsKKyAgICBvdXQgPDwgZm10Ojpmb3JtYXQoInB1YmxpYyBzdGF0aWMgZmluYWwge30ge30gPSB7fTtcbiIsIHJhd190eXBlLCBlbnVtZXJhdG9yLT5HZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmF0b3ItPlZhbHVlU3RyaW5nKGJhY2tpbmdfdHlwZSwgQ29uc3RhbnRWYWx1ZURlY29yYXRvcikpOworICB9CisgIGlmIChlbnVtX2RlY2wuSmF2YURlcml2ZSgidG9TdHJpbmciKSkgeworICAgIG91dCA8PCAiaW50ZXJmYWNlICQge1xuIjsKKyAgICBvdXQuSW5kZW50KCk7CisgICAgb3V0IDw8ICJzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKCIgPDwgcmF3X3R5cGUgPDwgIiBfYWlkbF92KSB7XG4iOworICAgIG91dC5JbmRlbnQoKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGVudW1lcmF0b3IgOiBlbnVtX2RlY2wuR2V0RW51bWVyYXRvcnMoKSkgeworICAgICAgb3V0IDw8ICJpZiAoX2FpZGxfdiA9PSAiIDw8IGVudW1lcmF0b3ItPkdldE5hbWUoKSA8PCAiKSByZXR1cm4gXCIiIDw8IGVudW1lcmF0b3ItPkdldE5hbWUoKQorICAgICAgICAgIDw8ICJcIjtcbiI7CisgICAgfQorICAgIG91dCA8PCAicmV0dXJuICIgPDwgYm94aW5nX3R5cGUgPDwgIi50b1N0cmluZyhfYWlkbF92KTtcbiI7CisgICAgb3V0LkRlZGVudCgpOworICAgIG91dCA8PCAifVxuIjsKKyAgICBvdXQgPDwgZm10Ojpmb3JtYXQoUiIoc3RhdGljIFN0cmluZyBhcnJheVRvU3RyaW5nKE9iamVjdCBfYWlkbF92KSB7eworICBpZiAoX2FpZGxfdiA9PSBudWxsKSByZXR1cm4gIm51bGwiOworICBDbGFzczw/PiBfYWlkbF9jbHMgPSBfYWlkbF92LmdldENsYXNzKCk7CisgIGlmICghX2FpZGxfY2xzLmlzQXJyYXkoKSkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibm90IGFuIGFycmF5OiAiICsgX2FpZGxfdik7CisgIENsYXNzPD8+IGNvbXAgPSBfYWlkbF9jbHMuZ2V0Q29tcG9uZW50VHlwZSgpOworICBqYXZhLnV0aWwuU3RyaW5nSm9pbmVyIF9haWRsX3NqID0gbmV3IGphdmEudXRpbC5TdHJpbmdKb2luZXIoIiwgIiwgIlsiLCAiXSIpOworICBpZiAoY29tcC5pc0FycmF5KCkpIHt7CisgICAgZm9yIChpbnQgX2FpZGxfaSA9IDA7IF9haWRsX2kgPCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheS5nZXRMZW5ndGgoX2FpZGxfdik7IF9haWRsX2krKykge3sKKyAgICAgIF9haWRsX3NqLmFkZChhcnJheVRvU3RyaW5nKGphdmEubGFuZy5yZWZsZWN0LkFycmF5LmdldChfYWlkbF92LCBfYWlkbF9pKSkpOworICAgIH19CisgIH19IGVsc2Uge3sKKyAgICBpZiAoX2FpZGxfY2xzICE9IHtyYXdfdHlwZX1bXS5jbGFzcykgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigid3JvbmcgdHlwZTogIiArIF9haWRsX2Nscyk7CisgICAgZm9yICh7cmF3X3R5cGV9IGUgOiAoe3Jhd190eXBlfVtdKSBfYWlkbF92KSB7eworICAgICAgX2FpZGxfc2ouYWRkKHRvU3RyaW5nKGUpKTsKKyAgICB9fQorICB9fQorICByZXR1cm4gX2FpZGxfc2oudG9TdHJpbmcoKTsKK319CispIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZm10OjphcmcoInJhd190eXBlIiwgcmF3X3R5cGUpKTsKKyAgICBvdXQuRGVkZW50KCk7CisgICAgb3V0IDw8ICJ9XG4iOworICB9CisgIG91dC5EZWRlbnQoKTsKKyAgb3V0IDw8ICJ9XG4iOwogfQogCi12b2lkIGdlbmVyYXRlX3VuaW9uKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbFVuaW9uRGVjbCogZGVjbCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzKSB7Cit2b2lkIEdlbmVyYXRlVW5pb25DbGFzcyhDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxVbmlvbkRlY2wqIGRlY2wsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKICAgY29uc3Qgc3RyaW5nIHRhZ190eXBlID0gImludCI7Ci0gIGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyIHRhZ190eXBlX3NwZWNpZmllcihBSURMX0xPQ0FUSU9OX0hFUkUsIHRhZ190eXBlLCBmYWxzZSAvKiBpc0FycmF5ICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciAvKiB0eXBlX3BhcmFtcyAqLywgQ29tbWVudHN7fSk7CisgIGF1dG8gdGFnX3R5cGVfc3BlY2lmaWVyID0KKyAgICAgIHR5cGVuYW1lcy5NYWtlUmVzb2x2ZWRUeXBlKEFJRExfTE9DQVRJT05fSEVSRSwgdGFnX3R5cGUsIC8qIGlzQXJyYXkgKi8gZmFsc2UpOwogICBjb25zdCBzdHJpbmcgY2xhenogPSBkZWNsLT5HZXROYW1lKCk7CiAKLSAgb3V0IDw8ICIvKlxuIjsKLSAgb3V0IDw8ICIgKiBUaGlzIGZpbGUgaXMgYXV0by1nZW5lcmF0ZWQuICBETyBOT1QgTU9ESUZZLlxuIjsKLSAgb3V0IDw8ICIgKi9cbiI7Ci0KLSAgb3V0IDw8ICJwYWNrYWdlICIgKyBkZWNsLT5HZXRQYWNrYWdlKCkgKyAiO1xuIjsKLSAgb3V0IDw8ICJcbiI7CiAgIG91dCA8PCBHZW5lcmF0ZUNvbW1lbnRzKCpkZWNsKTsKICAgb3V0IDw8IEdlbmVyYXRlQW5ub3RhdGlvbnMoKmRlY2wpOwogCi0gIG91dCA8PCAicHVibGljIGZpbmFsIGNsYXNzICIgKyBjbGF6eiArICIgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUge1xuIjsKKyAgb3V0IDw8ICJwdWJsaWMgIjsKKyAgaWYgKGRlY2wtPkdldFBhcmVudFR5cGUoKSkgeworICAgIG91dCA8PCAic3RhdGljICI7CisgIH0KKyAgb3V0IDw8ICJmaW5hbCBjbGFzcyAiICsgY2xhenogKyAiIGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlIHtcbiI7CiAgIG91dC5JbmRlbnQoKTsKIAogICBzaXplX3QgdGFnX2luZGV4ID0gMDsKQEAgLTcxMiwxMyArNjkyLDE0IEBACiAKICAgQUlETF9GQVRBTF9JRihkZWNsLT5HZXRGaWVsZHMoKS5lbXB0eSgpLCAqZGVjbCkgPDwgIlVuaW9uICciIDw8IGNsYXp6IDw8ICInIGlzIGVtcHR5LiI7CiAgIGNvbnN0IGF1dG8mIGZpcnN0X2ZpZWxkID0gZGVjbC0+R2V0RmllbGRzKClbMF07Ci0gIGNvbnN0IGF1dG8mIGZpcnN0X3R5cGUgPSBKYXZhU2lnbmF0dXJlT2YoZmlyc3RfZmllbGQtPkdldFR5cGUoKSwgdHlwZW5hbWVzKTsKKyAgY29uc3QgYXV0byYgZmlyc3RfdHlwZSA9IEphdmFTaWduYXR1cmVPZihmaXJzdF9maWVsZC0+R2V0VHlwZSgpKTsKICAgY29uc3QgYXV0byYgZmlyc3RfdmFsdWUgPSBmaXJzdF9maWVsZC0+VmFsdWVTdHJpbmcoQ29uc3RhbnRWYWx1ZURlY29yYXRvcik7CiAKICAgLy8gZGVmYXVsdCBjdG9yKCkgaW5pdHMgd2l0aCBmaXJzdCBtZW1iZXIncyBkZWZhdWx0IHZhbHVlCiAgIG91dCA8PCAicHVibGljICIgKyBjbGF6eiArICIoKSB7XG4iOwogICBvdXQuSW5kZW50KCk7Ci0gIG91dCA8PCBmaXJzdF90eXBlICsgIiBfdmFsdWUgPSAiIDw8IChmaXJzdF92YWx1ZS5lbXB0eSgpID8gIm51bGwiIDogZmlyc3RfdmFsdWUpIDw8ICI7XG4iOworICBvdXQgPDwgZmlyc3RfdHlwZSArICIgX3ZhbHVlID0gIgorICAgICAgPDwgKGZpcnN0X3ZhbHVlLmVtcHR5KCkgPyBEZWZhdWx0SmF2YVZhbHVlT2YoZmlyc3RfZmllbGQtPkdldFR5cGUoKSkgOiBmaXJzdF92YWx1ZSkgPDwgIjtcbiI7CiAgIG91dCA8PCAidGhpcy5fdGFnID0gIiA8PCBmaXJzdF9maWVsZC0+R2V0TmFtZSgpIDw8ICI7XG4iOwogICBvdXQgPDwgInRoaXMuX3ZhbHVlID0gX3ZhbHVlO1xuIjsKICAgb3V0LkRlZGVudCgpOwpAQCAtNzUxLDcgKzczMiw3IEBACiAgICAgb3V0IDw8ICIvLyAiICsgdmFyaWFibGUtPlNpZ25hdHVyZSgpICsgIjtcblxuIjsKIAogICAgIGF1dG8gdmFyX25hbWUgPSB2YXJpYWJsZS0+R2V0TmFtZSgpOwotICAgIGF1dG8gdmFyX3R5cGUgPSBKYXZhU2lnbmF0dXJlT2YodmFyaWFibGUtPkdldFR5cGUoKSwgdHlwZW5hbWVzKTsKKyAgICBhdXRvIHZhcl90eXBlID0gSmF2YVNpZ25hdHVyZU9mKHZhcmlhYmxlLT5HZXRUeXBlKCkpOwogCiAgICAgLy8gdmFsdWUgY3RvcgogICAgIG91dCA8PCBHZW5lcmF0ZUNvbW1lbnRzKCp2YXJpYWJsZSk7CkBAIC03NjYsNyArNzQ3LDcgQEAKICAgICBpZiAodmFyaWFibGUtPkdldFR5cGUoKS5Jc0dlbmVyaWMoKSkgewogICAgICAgb3V0IDw8ICJAU3VwcHJlc3NXYXJuaW5ncyhcInVuY2hlY2tlZFwiKVxuIjsKICAgICB9Ci0gICAgb3V0IDw8ICJwdWJsaWMgIiArIHZhcl90eXBlICsgIiAiICsgZ2V0dGVyX25hbWUoKnZhcmlhYmxlKSArICIoKSB7XG4iOworICAgIG91dCA8PCAicHVibGljICIgKyB2YXJfdHlwZSArICIgIiArIEdldHRlck5hbWUoKnZhcmlhYmxlKSArICIoKSB7XG4iOwogICAgIG91dC5JbmRlbnQoKTsKICAgICBvdXQgPDwgIl9hc3NlcnRUYWcoIiArIHZhcl9uYW1lICsgIik7XG4iOwogICAgIG91dCA8PCAicmV0dXJuICgiICsgdmFyX3R5cGUgKyAiKSBfdmFsdWU7XG4iOwpAQCAtNzc1LDcgKzc1Niw3IEBACiAKICAgICAvLyBzZXR0ZXIKICAgICBpZiAoIWRlY2wtPklzSmF2YU9ubHlJbW11dGFibGUoKSkgewotICAgICAgb3V0IDw8ICJwdWJsaWMgdm9pZCAiICsgc2V0dGVyX25hbWUoKnZhcmlhYmxlKSArICIoIiArIHZhcl90eXBlICsgIiBfdmFsdWUpIHtcbiI7CisgICAgICBvdXQgPDwgInB1YmxpYyB2b2lkICIgKyBTZXR0ZXJOYW1lKCp2YXJpYWJsZSkgKyAiKCIgKyB2YXJfdHlwZSArICIgX3ZhbHVlKSB7XG4iOwogICAgICAgb3V0LkluZGVudCgpOwogICAgICAgb3V0IDw8ICJfc2V0KCIgKyB2YXJfbmFtZSArICIsIF92YWx1ZSk7XG4iOwogICAgICAgb3V0LkRlZGVudCgpOwpAQCAtODE1LDcgKzc5Niw4IEBACiAgICAgICAgIC50eXBlID0gdHlwZSwKICAgICAgICAgLnBhcmNlbCA9IHBhcmNlbCwKICAgICAgICAgLnZhciA9IG5hbWUsCi0gICAgICAgIC5pc19yZXR1cm5fdmFsdWUgPSBmYWxzZSwKKyAgICAgICAgLm1pbl9zZGtfdmVyc2lvbiA9IG9wdGlvbnMuR2V0TWluU2RrVmVyc2lvbigpLAorICAgICAgICAud3JpdGVfdG9fcGFyY2VsX2ZsYWcgPSAiX2FpZGxfZmxhZyIsCiAgICAgfTsKICAgICBXcml0ZVRvUGFyY2VsRm9yKGNvbnRleHQpOwogICAgIHdyaXRlci0+Q2xvc2UoKTsKQEAgLTgyNSwxMiArODA3LDEyIEBACiAgIG91dCA8PCAiQE92ZXJyaWRlXG4iOwogICBvdXQgPDwgInB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlVG9QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgX2FpZGxfcGFyY2VsLCBpbnQgX2FpZGxfZmxhZykge1xuIjsKICAgb3V0LkluZGVudCgpOwotICBvdXQgPDwgd3JpdGVfdG9fcGFyY2VsKHRhZ190eXBlX3NwZWNpZmllciwgIl90YWciLCAiX2FpZGxfcGFyY2VsIik7CisgIG91dCA8PCB3cml0ZV90b19wYXJjZWwoKnRhZ190eXBlX3NwZWNpZmllciwgIl90YWciLCAiX2FpZGxfcGFyY2VsIik7CiAgIG91dCA8PCAic3dpdGNoIChfdGFnKSB7XG4iOwogICBmb3IgKGNvbnN0IGF1dG8mIHZhcmlhYmxlIDogZGVjbC0+R2V0RmllbGRzKCkpIHsKICAgICBvdXQgPDwgImNhc2UgIiArIHZhcmlhYmxlLT5HZXROYW1lKCkgKyAiOlxuIjsKICAgICBvdXQuSW5kZW50KCk7Ci0gICAgb3V0IDw8IHdyaXRlX3RvX3BhcmNlbCh2YXJpYWJsZS0+R2V0VHlwZSgpLCBnZXR0ZXJfbmFtZSgqdmFyaWFibGUpICsgIigpIiwgIl9haWRsX3BhcmNlbCIpOworICAgIG91dCA8PCB3cml0ZV90b19wYXJjZWwodmFyaWFibGUtPkdldFR5cGUoKSwgR2V0dGVyTmFtZSgqdmFyaWFibGUpICsgIigpIiwgIl9haWRsX3BhcmNlbCIpOwogICAgIG91dCA8PCAiYnJlYWs7XG4iOwogICAgIG91dC5EZWRlbnQoKTsKICAgfQpAQCAtODUwLDYgKzgzMiw3IEBACiAgICAgICAgIC50eXBlID0gdHlwZSwKICAgICAgICAgLnBhcmNlbCA9IHBhcmNlbCwKICAgICAgICAgLnZhciA9IG5hbWUsCisgICAgICAgIC5taW5fc2RrX3ZlcnNpb24gPSBvcHRpb25zLkdldE1pblNka1ZlcnNpb24oKSwKICAgICAgICAgLmlzX2NsYXNzbG9hZGVyX2NyZWF0ZWQgPSAmaXNfY2xhc3Nsb2FkZXJfY3JlYXRlZCwKICAgICB9OwogICAgIENyZWF0ZUZyb21QYXJjZWxGb3IoY29udGV4dCk7CkBAIC04NjcsMTEgKzg1MCwxMSBAQAogICB9CiAgIG91dC5JbmRlbnQoKTsKICAgb3V0IDw8IHRhZ190eXBlICsgIiBfYWlkbF90YWc7XG4iOwotICBvdXQgPDwgcmVhZF9mcm9tX3BhcmNlbCh0YWdfdHlwZV9zcGVjaWZpZXIsICJfYWlkbF90YWciLCAiX2FpZGxfcGFyY2VsIik7CisgIG91dCA8PCByZWFkX2Zyb21fcGFyY2VsKCp0YWdfdHlwZV9zcGVjaWZpZXIsICJfYWlkbF90YWciLCAiX2FpZGxfcGFyY2VsIik7CiAgIG91dCA8PCAic3dpdGNoIChfYWlkbF90YWcpIHtcbiI7CiAgIGZvciAoY29uc3QgYXV0byYgdmFyaWFibGUgOiBkZWNsLT5HZXRGaWVsZHMoKSkgewogICAgIGF1dG8gdmFyX25hbWUgPSB2YXJpYWJsZS0+R2V0TmFtZSgpOwotICAgIGF1dG8gdmFyX3R5cGUgPSBKYXZhU2lnbmF0dXJlT2YodmFyaWFibGUtPkdldFR5cGUoKSwgdHlwZW5hbWVzKTsKKyAgICBhdXRvIHZhcl90eXBlID0gSmF2YVNpZ25hdHVyZU9mKHZhcmlhYmxlLT5HZXRUeXBlKCkpOwogICAgIG91dCA8PCAiY2FzZSAiICsgdmFyX25hbWUgKyAiOiB7XG4iOwogICAgIG91dC5JbmRlbnQoKTsKICAgICBvdXQgPDwgdmFyX3R5cGUgKyAiIF9haWRsX3ZhbHVlO1xuIjsKQEAgLTg4OSwxMiArODcyLDEyIEBACiAgIG91dC5EZWRlbnQoKTsKICAgb3V0IDw8ICJ9XG5cbiI7CiAKLSAgZ2VuZXJhdGVfY29uc3RhbnRfZGVjbGFyYXRpb25zKG91dCwgKmRlY2wpOworICBHZW5lcmF0ZUNvbnN0YW50RGVjbGFyYXRpb25zKG91dCwgKmRlY2wpOwogCiAgIEdlbmVyYXRlUGFyY2VsYWJsZURlc2NyaWJlQ29udGVudHMob3V0LCAqZGVjbCwgdHlwZW5hbWVzKTsKICAgb3V0IDw8ICJcbiI7CiAgIGlmIChkZWNsLT5KYXZhRGVyaXZlKCJ0b1N0cmluZyIpKSB7Ci0gICAgR2VuZXJhdGVUb1N0cmluZyhvdXQsICpkZWNsLCB0eXBlbmFtZXMpOworICAgIEdlbmVyYXRlVG9TdHJpbmcob3V0LCAqZGVjbCwgdHlwZW5hbWVzLCBvcHRpb25zKTsKICAgfQogCiAgIGlmIChkZWNsLT5KYXZhRGVyaXZlKCJlcXVhbHMiKSkgewpAQCAtOTMwLDYgKzkxMywxMiBAQAogICAgIG91dCA8PCAifVxuIjsKICAgfQogCisgIC8vIGFsbCB0aGUgbmVzdGVkIHR5cGVzCisgIGZvciAoY29uc3QgYXV0byYgbmVzdGVkIDogZGVjbC0+R2V0TmVzdGVkVHlwZXMoKSkgeworICAgIEdlbmVyYXRlQ2xhc3Mob3V0LCAqbmVzdGVkLCB0eXBlbmFtZXMsIG9wdGlvbnMpOworICB9CisgIEdlbmVyYXRlUGFyY2VsSGVscGVycyhvdXQsICpkZWNsLCBvcHRpb25zKTsKKwogICBvdXQuRGVkZW50KCk7CiAgIG91dCA8PCAifVxuIjsKIH0KQEAgLTkzOCw3ICs5MjcsNyBAQAogICByZXR1cm4gbWV0aG9kLlByaW50TG9jYXRpb24oKTsKIH0KIAotc3RkOjpzdHJpbmcgZ2VuZXJhdGVfamF2YV91bnN1cHBvcnRlZGFwcHVzYWdlX3BhcmFtZXRlcnMoY29uc3QgQWlkbEFubm90YXRpb24mIGEpIHsKK3N0ZDo6c3RyaW5nIEdlbmVyYXRlSmF2YVVuc3VwcG9ydGVkQXBwVXNhZ2VQYXJhbWV0ZXJzKGNvbnN0IEFpZGxBbm5vdGF0aW9uJiBhKSB7CiAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gcGFyYW1zID0gYS5Bbm5vdGF0aW9uUGFyYW1zKENvbnN0YW50VmFsdWVEZWNvcmF0b3IpOwogICBzdGQ6OnZlY3RvcjxzdHJpbmc+IHBhcmFtZXRlcnNfZGVjbDsKICAgZm9yIChjb25zdCBhdXRvJiBuYW1lX2FuZF9wYXJhbSA6IHBhcmFtcykgewpAQCAtOTUwLDU2ICs5MzksNjUgQEAKICAgcmV0dXJuICIoIiArIEpvaW4ocGFyYW1ldGVyc19kZWNsLCAiLCAiKSArICIpIjsKIH0KIAotc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGdlbmVyYXRlX2phdmFfYW5ub3RhdGlvbnMoY29uc3QgQWlkbEFubm90YXRhYmxlJiBhKSB7CitzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gR2VuZXJhdGVKYXZhQW5ub3RhdGlvbnMoY29uc3QgQWlkbEFubm90YXRhYmxlJiBhKSB7CiAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiByZXN1bHQ7Ci0gIGlmIChhLklzSGlkZSgpKSB7Ci0gICAgcmVzdWx0LmVtcGxhY2VfYmFjaygiQGFuZHJvaWQuYW5ub3RhdGlvbi5IaWRlIik7Ci0gIH0KIAogICBjb25zdCBBaWRsQW5ub3RhdGlvbiogdW5zdXBwb3J0ZWRfYXBwX3VzYWdlID0gYS5VbnN1cHBvcnRlZEFwcFVzYWdlKCk7CiAgIGlmICh1bnN1cHBvcnRlZF9hcHBfdXNhZ2UgIT0gbnVsbHB0cikgewogICAgIHJlc3VsdC5lbXBsYWNlX2JhY2soIkBhbmRyb2lkLmNvbXBhdC5hbm5vdGF0aW9uLlVuc3VwcG9ydGVkQXBwVXNhZ2UiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlX2phdmFfdW5zdXBwb3J0ZWRhcHB1c2FnZV9wYXJhbWV0ZXJzKCp1bnN1cHBvcnRlZF9hcHBfdXNhZ2UpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlSmF2YVVuc3VwcG9ydGVkQXBwVXNhZ2VQYXJhbWV0ZXJzKCp1bnN1cHBvcnRlZF9hcHBfdXNhZ2UpKTsKICAgfQogCiAgIGZvciAoY29uc3QgYXV0byYgYW5ub3RhdGlvbiA6IGEuR2V0QW5ub3RhdGlvbnMoKSkgewotICAgIGlmIChhbm5vdGF0aW9uLkdldFR5cGUoKSA9PSBBaWRsQW5ub3RhdGlvbjo6VHlwZTo6SkFWQV9QQVNTVEhST1VHSCkgewotICAgICAgcmVzdWx0LmVtcGxhY2VfYmFjayhhbm5vdGF0aW9uLlBhcmFtVmFsdWU8c3RkOjpzdHJpbmc+KCJhbm5vdGF0aW9uIikudmFsdWUoKSk7CisgICAgaWYgKGFubm90YXRpb24tPkdldFR5cGUoKSA9PSBBaWRsQW5ub3RhdGlvbjo6VHlwZTo6SkFWQV9QQVNTVEhST1VHSCkgeworICAgICAgcmVzdWx0LmVtcGxhY2VfYmFjayhhbm5vdGF0aW9uLT5QYXJhbVZhbHVlPHN0ZDo6c3RyaW5nPigiYW5ub3RhdGlvbiIpLnZhbHVlKCkpOwogICAgIH0KLSAgICBpZiAoYW5ub3RhdGlvbi5HZXRUeXBlKCkgPT0gQWlkbEFubm90YXRpb246OlR5cGU6OkpBVkFfU1VQUFJFU1NfTElOVCkgeworICAgIGlmIChhbm5vdGF0aW9uLT5HZXRUeXBlKCkgPT0gQWlkbEFubm90YXRpb246OlR5cGU6OkpBVkFfU1VQUFJFU1NfTElOVCkgewogICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHZhbHVlczsKLSAgICAgIGZvciAoY29uc3QgYXV0byYgW25hbWUsIHZhbHVlXSA6IGFubm90YXRpb24uQW5ub3RhdGlvblBhcmFtcyhDb25zdGFudFZhbHVlRGVjb3JhdG9yKSkgeworICAgICAgZm9yIChjb25zdCBhdXRvJiBbbmFtZSwgdmFsdWVdIDogYW5ub3RhdGlvbi0+QW5ub3RhdGlvblBhcmFtcyhDb25zdGFudFZhbHVlRGVjb3JhdG9yKSkgewogICAgICAgICB2YWx1ZXMuZW1wbGFjZV9iYWNrKG5hbWUgKyAiID0gIiArIHZhbHVlKTsKICAgICAgIH0KICAgICAgIHJlc3VsdC5lbXBsYWNlX2JhY2soIkBhbmRyb2lkLmFubm90YXRpb24uU3VwcHJlc3NMaW50KCIgKyBKb2luKHZhbHVlcywgIiwgIikgKyAiKSIpOwogICAgIH0KICAgfQogCisgIGlmIChhdXRvIGVuZm9yY2VfZXhwciA9IGEuRW5mb3JjZUV4cHJlc3Npb24oKTsgZW5mb3JjZV9leHByKSB7CisgICAgcmVzdWx0LmVtcGxhY2VfYmFjaygiQGFuZHJvaWQuYW5ub3RhdGlvbi5FbmZvcmNlUGVybWlzc2lvbigiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmFpZGw6OnBlcm06OkFzSmF2YUFubm90YXRpb24oKmVuZm9yY2VfZXhwci5nZXQoKSkgKyAiKSIpOworICB9IGVsc2UgaWYgKGEuSXNQZXJtaXNzaW9uTm9uZSgpKSB7CisgICAgcmVzdWx0LmVtcGxhY2VfYmFjaygiQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc05vUGVybWlzc2lvbiIpOworICB9ICAvLyBUT0RPOiBBZGQgYW5ub2F0aW9uIGZvciBAUGVybWlzc2lvbk1hbnVhbGx5RW5mb3JjZWQKKwogICByZXR1cm4gcmVzdWx0OwogfQogCiBzdHJ1Y3QgSmF2YUFubm90YXRpb25zVmlzaXRvciA6IEFpZGxWaXNpdG9yIHsKICAgSmF2YUFubm90YXRpb25zVmlzaXRvcihzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHJlc3VsdCkgOiByZXN1bHQocmVzdWx0KSB7fQotICB2b2lkIFZpc2l0KGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiB0KSBvdmVycmlkZSB7IHJlc3VsdCA9IGdlbmVyYXRlX2phdmFfYW5ub3RhdGlvbnModCk7IH0KKyAgdm9pZCBWaXNpdChjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdCkgb3ZlcnJpZGUgeyByZXN1bHQgPSBHZW5lcmF0ZUphdmFBbm5vdGF0aW9ucyh0KTsgfQogICB2b2lkIFZpc2l0KGNvbnN0IEFpZGxJbnRlcmZhY2UmIHQpIG92ZXJyaWRlIHsgRm9yRGVmaW5lZFR5cGUodCk7IH0KICAgdm9pZCBWaXNpdChjb25zdCBBaWRsUGFyY2VsYWJsZSYgdCkgb3ZlcnJpZGUgeyBGb3JEZWZpbmVkVHlwZSh0KTsgfQogICB2b2lkIFZpc2l0KGNvbnN0IEFpZGxTdHJ1Y3R1cmVkUGFyY2VsYWJsZSYgdCkgb3ZlcnJpZGUgeyBGb3JEZWZpbmVkVHlwZSh0KTsgfQogICB2b2lkIFZpc2l0KGNvbnN0IEFpZGxVbmlvbkRlY2wmIHQpIG92ZXJyaWRlIHsgRm9yRGVmaW5lZFR5cGUodCk7IH0KICAgdm9pZCBWaXNpdChjb25zdCBBaWRsRW51bURlY2xhcmF0aW9uJiB0KSBvdmVycmlkZSB7IEZvckRlZmluZWRUeXBlKHQpOyB9CisgIHZvaWQgVmlzaXQoY29uc3QgQWlkbEVudW1lcmF0b3ImIGUpIG92ZXJyaWRlIHsKKyAgICBpZiAoZS5Jc0RlcHJlY2F0ZWQoKSkgeworICAgICAgcmVzdWx0LnB1c2hfYmFjaygiQERlcHJlY2F0ZWQiKTsKKyAgICB9CisgIH0KICAgdm9pZCBWaXNpdChjb25zdCBBaWRsTWV0aG9kJiBtKSBvdmVycmlkZSB7IEZvck1lbWJlcihtKTsgfQogICB2b2lkIFZpc2l0KGNvbnN0IEFpZGxDb25zdGFudERlY2xhcmF0aW9uJiBjKSBvdmVycmlkZSB7IEZvck1lbWJlcihjKTsgfQogICB2b2lkIFZpc2l0KGNvbnN0IEFpZGxWYXJpYWJsZURlY2xhcmF0aW9uJiB2KSBvdmVycmlkZSB7IEZvck1lbWJlcih2KTsgfQogICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHJlc3VsdDsKIAogICB2b2lkIEZvckRlZmluZWRUeXBlKGNvbnN0IEFpZGxEZWZpbmVkVHlwZSYgdCkgewotICAgIHJlc3VsdCA9IGdlbmVyYXRlX2phdmFfYW5ub3RhdGlvbnModCk7CisgICAgcmVzdWx0ID0gR2VuZXJhdGVKYXZhQW5ub3RhdGlvbnModCk7CiAgICAgaWYgKHQuSXNEZXByZWNhdGVkKCkpIHsKICAgICAgIHJlc3VsdC5wdXNoX2JhY2soIkBEZXByZWNhdGVkIik7CiAgICAgfQogICB9CiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBNZW1iZXI+CiAgIHZvaWQgRm9yTWVtYmVyKGNvbnN0IE1lbWJlciYgdCkgewotICAgIHJlc3VsdCA9IGdlbmVyYXRlX2phdmFfYW5ub3RhdGlvbnModC5HZXRUeXBlKCkpOworICAgIHJlc3VsdCA9IEdlbmVyYXRlSmF2YUFubm90YXRpb25zKHQuR2V0VHlwZSgpKTsKICAgICBpZiAodC5Jc0RlcHJlY2F0ZWQoKSkgewogICAgICAgcmVzdWx0LnB1c2hfYmFjaygiQERlcHJlY2F0ZWQiKTsKICAgICB9CkBAIC0xMDEzLDYgKzEwMTEsNDMgQEAKICAgcmV0dXJuIHJlc3VsdDsKIH0KIAordm9pZCBHZW5lcmF0ZUNsYXNzKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbERlZmluZWRUeXBlJiBkZWZpbmVkX3R5cGUsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgLy8gR2VuZXJhdGUgZmlsZSBoZWFkZXIgKGNvbW1lbnRzIGFuZCBwYWNrYWdlKSBvbmx5IGlmIGl0J3MgYSByb290IHR5cGUuCisgIGlmIChkZWZpbmVkX3R5cGUuR2V0UGFyZW50VHlwZSgpID09IG51bGxwdHIpIHsKKyAgICBvdXQgPDwgIi8qXG4iOworICAgIG91dCA8PCAiICogVGhpcyBmaWxlIGlzIGF1dG8tZ2VuZXJhdGVkLiAgRE8gTk9UIE1PRElGWS5cbiI7CisgICAgb3V0IDw8ICIgKi9cbiI7CisgICAgaWYgKGNvbnN0IGF1dG8gcGtnID0gZGVmaW5lZF90eXBlLkdldFBhY2thZ2UoKTsgIXBrZy5lbXB0eSgpKSB7CisgICAgICBvdXQgPDwgInBhY2thZ2UgIiA8PCBwa2cgPDwgIjtcbiI7CisgICAgfQorICB9CisKKyAgaWYgKGNvbnN0IEFpZGxTdHJ1Y3R1cmVkUGFyY2VsYWJsZSogcGFyY2VsYWJsZSA9IGRlZmluZWRfdHlwZS5Bc1N0cnVjdHVyZWRQYXJjZWxhYmxlKCk7CisgICAgICBwYXJjZWxhYmxlICE9IG51bGxwdHIpIHsKKyAgICBHZW5lcmF0ZVBhcmNlbGFibGVDbGFzcyhwYXJjZWxhYmxlLCB0eXBlcywgb3B0aW9ucyktPldyaXRlKCZvdXQpOworICB9IGVsc2UgaWYgKGNvbnN0IEFpZGxFbnVtRGVjbGFyYXRpb24qIGVudW1fZGVjbCA9IGRlZmluZWRfdHlwZS5Bc0VudW1EZWNsYXJhdGlvbigpOworICAgICAgICAgICAgIGVudW1fZGVjbCAhPSBudWxscHRyKSB7CisgICAgR2VuZXJhdGVFbnVtQ2xhc3Mob3V0LCAqZW51bV9kZWNsKTsKKyAgfSBlbHNlIGlmIChjb25zdCBBaWRsSW50ZXJmYWNlKiBpbnRlcmZhY2UgPSBkZWZpbmVkX3R5cGUuQXNJbnRlcmZhY2UoKTsgaW50ZXJmYWNlICE9IG51bGxwdHIpIHsKKyAgICBHZW5lcmF0ZUludGVyZmFjZUNsYXNzKGludGVyZmFjZSwgdHlwZXMsIG9wdGlvbnMpLT5Xcml0ZSgmb3V0KTsKKyAgfSBlbHNlIGlmIChjb25zdCBBaWRsVW5pb25EZWNsKiB1bmlvbl9kZWNsID0gZGVmaW5lZF90eXBlLkFzVW5pb25EZWNsYXJhdGlvbigpOworICAgICAgICAgICAgIHVuaW9uX2RlY2wgIT0gbnVsbHB0cikgeworICAgIEdlbmVyYXRlVW5pb25DbGFzcyhvdXQsIHVuaW9uX2RlY2wsIHR5cGVzLCBvcHRpb25zKTsKKyAgfSBlbHNlIHsKKyAgICBBSURMX0ZBVEFMKGRlZmluZWRfdHlwZSkgPDwgIlVucmVjb2duaXplZCB0eXBlIHNlbnQgZm9yIEphdmEgZ2VuZXJhdGlvbi4iOworICB9Cit9CisKKy8vIEluIEphdmEsIHRoZXJlJ3MgMToxIG1hcHBpbmcgYmV0d2VlbiBBSURMIHR5cGUgYW5kIEphdmEgdHlwZS4gU28gd2UgZ2VuZXJhdGUgYSBzaW5nbGUgZmlsZSBmb3IKKy8vIHRoZSB0eXBlLgordm9pZCBHZW5lcmF0ZUphdmEoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLCBjb25zdCBPcHRpb25zJiBvcHRpb25zLCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxEZWZpbmVkVHlwZSYgZGVmaW5lZF90eXBlLCBjb25zdCBJb0RlbGVnYXRlJiBpb19kZWxlZ2F0ZSkgeworICBDb2RlV3JpdGVyUHRyIGNvZGVfd3JpdGVyID0gaW9fZGVsZWdhdGUuR2V0Q29kZVdyaXRlcihmaWxlbmFtZSk7CisgIEdlbmVyYXRlQ2xhc3MoKmNvZGVfd3JpdGVyLCBkZWZpbmVkX3R5cGUsIHR5cGVzLCBvcHRpb25zKTsKKyAgQUlETF9GQVRBTF9JRighY29kZV93cml0ZXItPkNsb3NlKCksIGRlZmluZWRfdHlwZSkgPDwgIkkvTyBFcnJvciEiOworfQorCiB9ICAvLyBuYW1lc3BhY2UgamF2YQogfSAgLy8gbmFtZXNwYWNlIGFpZGwKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9nZW5lcmF0ZV9qYXZhLmggYi9nZW5lcmF0ZV9qYXZhLmgKaW5kZXggYjNjZmQ2Zi4uYmZhMjM3NiAxMDA2NDQKLS0tIGEvZ2VuZXJhdGVfamF2YS5oCisrKyBiL2dlbmVyYXRlX2phdmEuaApAQCAtMjcsMjIgKzI3LDE4IEBACiBuYW1lc3BhY2UgYWlkbCB7CiBuYW1lc3BhY2UgamF2YSB7CiAKLWJvb2wgZ2VuZXJhdGVfamF2YShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsIGNvbnN0IEFpZGxEZWZpbmVkVHlwZSogaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLCBjb25zdCBJb0RlbGVnYXRlJiBpb19kZWxlZ2F0ZSwKK3ZvaWQgR2VuZXJhdGVKYXZhKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywgY29uc3QgQWlkbERlZmluZWRUeXBlJiBkZWZpbmVkX3R5cGUsCisgICAgICAgICAgICAgICAgICBjb25zdCBJb0RlbGVnYXRlJiBpb19kZWxlZ2F0ZSk7CisKK3ZvaWQgR2VuZXJhdGVDbGFzcyhDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxEZWZpbmVkVHlwZSYgZGVmaW5lZF90eXBlLCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywKICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKIAotc3RkOjp1bmlxdWVfcHRyPGFuZHJvaWQ6OmFpZGw6OmphdmE6OkNsYXNzPiBnZW5lcmF0ZV9iaW5kZXJfaW50ZXJmYWNlX2NsYXNzKAotICAgIGNvbnN0IEFpZGxJbnRlcmZhY2UqIGlmYWNlLCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOworc3RkOjp1bmlxdWVfcHRyPGFuZHJvaWQ6OmFpZGw6OmphdmE6OkNsYXNzPiBHZW5lcmF0ZUludGVyZmFjZUNsYXNzKGNvbnN0IEFpZGxJbnRlcmZhY2UqIGlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKIAotc3RkOjp1bmlxdWVfcHRyPGFuZHJvaWQ6OmFpZGw6OmphdmE6OkNsYXNzPiBnZW5lcmF0ZV9wYXJjZWxfY2xhc3MoCi0gICAgY29uc3QgQWlkbFN0cnVjdHVyZWRQYXJjZWxhYmxlKiBwYXJjZWwsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcyk7Ci0KLXZvaWQgZ2VuZXJhdGVfZW51bShjb25zdCBDb2RlV3JpdGVyUHRyJiBjb2RlX3dyaXRlciwgY29uc3QgQWlkbEVudW1EZWNsYXJhdGlvbiogZW51bV9kZWNsLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcyk7Ci0KLXZvaWQgZ2VuZXJhdGVfdW5pb24oQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsVW5pb25EZWNsKiBkZWNsLCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMpOwotCi12b2lkIGdlbmVyYXRlX2NvbnN0YW50X2RlY2xhcmF0aW9ucyhDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxEZWZpbmVkVHlwZSYgdHlwZSk7Cit2b2lkIEdlbmVyYXRlQ29uc3RhbnREZWNsYXJhdGlvbnMoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsRGVmaW5lZFR5cGUmIHR5cGUpOwogCiBzdGQ6OnN0cmluZyBHZW5lcmF0ZUNvbW1lbnRzKGNvbnN0IEFpZGxDb21tZW50YWJsZSYgbm9kZSk7CiAKZGlmZiAtLWdpdCBhL2dlbmVyYXRlX2phdmFfYmluZGVyLmNwcCBiL2dlbmVyYXRlX2phdmFfYmluZGVyLmNwcAppbmRleCBmYTFjMTRhLi42ZjJlYWNjIDEwMDY0NAotLS0gYS9nZW5lcmF0ZV9qYXZhX2JpbmRlci5jcHAKKysrIGIvZ2VuZXJhdGVfamF2YV9iaW5kZXIuY3BwCkBAIC0xNiwxMCArMTYsMTIgQEAKIAogI2luY2x1ZGUgImFpZGwuaCIKICNpbmNsdWRlICJhaWRsX3RvX2phdmEuaCIKKyNpbmNsdWRlICJhaWRsX3R5cGVuYW1lcy5oIgogI2luY2x1ZGUgImFzdF9qYXZhLmgiCiAjaW5jbHVkZSAiZ2VuZXJhdGVfamF2YS5oIgogI2luY2x1ZGUgImxvZ2dpbmcuaCIKICNpbmNsdWRlICJvcHRpb25zLmgiCisjaW5jbHVkZSAicGFyc2VyLmgiCiAKICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgpAQCAtNDksOCArNTEsOCBAQAogICB1c2luZyBWYXJpYWJsZSA9IDo6YW5kcm9pZDo6YWlkbDo6amF2YTo6VmFyaWFibGU7CiAKICAgZXhwbGljaXQgVmFyaWFibGVGYWN0b3J5KGNvbnN0IHN0ZDo6c3RyaW5nJiBiYXNlKSA6IGJhc2VfKGJhc2UpLCBpbmRleF8oMCkge30KLSAgc3RkOjpzaGFyZWRfcHRyPFZhcmlhYmxlPiBHZXQoY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHR5cGUsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcykgewotICAgIGF1dG8gdiA9IHN0ZDo6bWFrZV9zaGFyZWQ8VmFyaWFibGU+KEphdmFTaWduYXR1cmVPZih0eXBlLCB0eXBlbmFtZXMpLAorICBzdGQ6OnNoYXJlZF9wdHI8VmFyaWFibGU+IEdldChjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSkgeworICAgIGF1dG8gdiA9IHN0ZDo6bWFrZV9zaGFyZWQ8VmFyaWFibGU+KEphdmFTaWduYXR1cmVPZih0eXBlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQcmludGYoIiVzJWQiLCBiYXNlXy5jX3N0cigpLCBpbmRleF8pKTsKICAgICB2YXJzXy5wdXNoX2JhY2sodik7CiAgICAgaW5kZXhfKys7CkBAIC05NCwxMiArOTYsMTIgQEAKICAgc2l6ZV90IGFsbF9tZXRob2RfY291bnQ7CiAKICAgLy8gRmluaXNoIGdlbmVyYXRpb24uIFRoaXMgd2lsbCBhZGQgYSBkZWZhdWx0IGNhc2UgdG8gdGhlIHN3aXRjaC4KLSAgdm9pZCBmaW5pc2goKTsKKyAgdm9pZCBGaW5pc2goKTsKIAotICBzdGQ6OnNoYXJlZF9wdHI8RXhwcmVzc2lvbj4gZ2V0X3RyYW5zYWN0X2Rlc2NyaXB0b3IoY29uc3QgQWlkbE1ldGhvZCogbWV0aG9kKTsKKyAgc3RkOjpzaGFyZWRfcHRyPEV4cHJlc3Npb24+IEdldFRyYW5zYWN0RGVzY3JpcHRvcihjb25zdCBBaWRsTWV0aG9kKiBtZXRob2QpOwogCiAgcHJpdmF0ZToKLSAgdm9pZCBtYWtlX2FzX2ludGVyZmFjZShjb25zdCBBaWRsSW50ZXJmYWNlKiBpbnRlcmZhY2VUeXBlKTsKKyAgdm9pZCBNYWtlQXNJbnRlcmZhY2UoY29uc3QgQWlkbEludGVyZmFjZSogaW50ZXJmYWNlVHlwZSk7CiAKICAgc3RkOjpzaGFyZWRfcHRyPFZhcmlhYmxlPiB0cmFuc2FjdF9kZXNjcmlwdG9yOwogICBjb25zdCBPcHRpb25zJiBvcHRpb25zXzsKQEAgLTEzOCw3ICsxNDAsNyBAQAogICB0aGlzLT5lbGVtZW50cy5wdXNoX2JhY2soY3Rvcik7CiAKICAgLy8gYXNJbnRlcmZhY2UKLSAgbWFrZV9hc19pbnRlcmZhY2UoaW50ZXJmYWNlVHlwZSk7CisgIE1ha2VBc0ludGVyZmFjZShpbnRlcmZhY2VUeXBlKTsKIAogICAvLyBhc0JpbmRlcgogICBhdXRvIGFzQmluZGVyID0gc3RkOjptYWtlX3NoYXJlZDxNZXRob2Q+KCk7CkBAIC0xOTksNyArMjAxLDcgQEAKICAgdGhpcy0+dHJhbnNhY3Rfc3dpdGNoX3VzZXIgPSBzdGQ6Om1ha2Vfc2hhcmVkPFN3aXRjaFN0YXRlbWVudD4odGhpcy0+dHJhbnNhY3RfY29kZSk7CiB9CiAKLXZvaWQgU3R1YkNsYXNzOjpmaW5pc2goKSB7Cit2b2lkIFN0dWJDbGFzczo6RmluaXNoKCkgewogICBhdXRvIGRlZmF1bHRfY2FzZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8Q2FzZT4oKTsKIAogICBhdXRvIHN1cGVyQ2FsbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8TWV0aG9kQ2FsbD4oCkBAIC0yMDcsOCArMjA5LDIzIEBACiAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8RXhwcmVzc2lvbj4+e3RoaXMtPnRyYW5zYWN0X2NvZGUsIHRoaXMtPnRyYW5zYWN0X2RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnRyYW5zYWN0X3JlcGx5LCB0aGlzLT50cmFuc2FjdF9mbGFnc30pOwogICBkZWZhdWx0X2Nhc2UtPnN0YXRlbWVudHMtPkFkZChzdGQ6Om1ha2Vfc2hhcmVkPFJldHVyblN0YXRlbWVudD4oc3VwZXJDYWxsKSk7CisKKyAgYXV0byBjYXNlX2NvdW50ID0gdHJhbnNhY3Rfc3dpdGNoX3VzZXItPmNhc2VzLnNpemUoKTsKICAgdHJhbnNhY3Rfc3dpdGNoX3VzZXItPmNhc2VzLnB1c2hfYmFjayhkZWZhdWx0X2Nhc2UpOwogCisgIC8vIEludGVyZmFjZSB0b2tlbiB2YWxpZGF0aW9uIGlzIGRvbmUgZm9yIHVzZXItZGVmaW5lZCB0cmFuc2FjdGlvbnMuCisgIGlmIChjYXNlX2NvdW50ID4gMCkgeworICAgIGF1dG8gaWZTdGF0ZW1lbnQgPSBzdGQ6Om1ha2Vfc2hhcmVkPElmU3RhdGVtZW50PigpOworICAgIGlmU3RhdGVtZW50LT5leHByZXNzaW9uID0gc3RkOjptYWtlX3NoYXJlZDxMaXRlcmFsRXhwcmVzc2lvbj4oCisgICAgICAgICJjb2RlID49IGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICYmICIKKyAgICAgICAgImNvZGUgPD0gYW5kcm9pZC5vcy5JQmluZGVyLkxBU1RfQ0FMTF9UUkFOU0FDVElPTiIpOworICAgIGlmU3RhdGVtZW50LT5zdGF0ZW1lbnRzID0gc3RkOjptYWtlX3NoYXJlZDxTdGF0ZW1lbnRCbG9jaz4oKTsKKyAgICBpZlN0YXRlbWVudC0+c3RhdGVtZW50cy0+QWRkKHN0ZDo6bWFrZV9zaGFyZWQ8TWV0aG9kQ2FsbD4oCisgICAgICAgIHRoaXMtPnRyYW5zYWN0X2RhdGEsICJlbmZvcmNlSW50ZXJmYWNlIiwKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEV4cHJlc3Npb24+Pnt0aGlzLT5HZXRUcmFuc2FjdERlc2NyaXB0b3IobnVsbHB0cil9KSk7CisgICAgdHJhbnNhY3Rfc3RhdGVtZW50cy0+QWRkKGlmU3RhdGVtZW50KTsKKyAgfQorCiAgIC8vIE1ldGEgdHJhbnNhY3Rpb25zIGFyZSBsb29rZWQgdXAgcHJpb3IgdG8gdXNlci1kZWZpbmVkIHRyYW5zYWN0aW9ucy4KICAgdHJhbnNhY3Rfc3RhdGVtZW50cy0+QWRkKHRoaXMtPnRyYW5zYWN0X3N3aXRjaF9tZXRhKTsKICAgdHJhbnNhY3Rfc3RhdGVtZW50cy0+QWRkKHRoaXMtPnRyYW5zYWN0X3N3aXRjaF91c2VyKTsKQEAgLTIyMiwxMiArMjM5LDE4IEBACiAgICAgY29kZV9zd2l0Y2hfZGVmYXVsdF9jYXNlLT5zdGF0ZW1lbnRzLT5BZGQoc3RkOjptYWtlX3NoYXJlZDxSZXR1cm5TdGF0ZW1lbnQ+KE5VTExfVkFMVUUpKTsKICAgICB0aGlzLT5jb2RlX3RvX21ldGhvZF9uYW1lX3N3aXRjaC0+Y2FzZXMucHVzaF9iYWNrKGNvZGVfc3dpdGNoX2RlZmF1bHRfY2FzZSk7CiAgIH0KKworICAvLyBUaGVyZSB3aWxsIGJlIGF0IGxlYXN0IG9uZSBzdGF0ZW1lbnQgZm9yIHRoZSBkZWZhdWx0LCBidXQgaWYgd2UgZW1pdCBhCisgIC8vIHJldHVybiB0cnVlIGFmdGVyIHRoYXQgZGVmYXVsdCwgaXQgd2lsbCBiZSB1bnJlYWNoYWJsZS4KKyAgaWYgKGNhc2VfY291bnQgPiAwKSB7CisgICAgdHJhbnNhY3Rfc3RhdGVtZW50cy0+QWRkKHN0ZDo6bWFrZV9zaGFyZWQ8UmV0dXJuU3RhdGVtZW50PihUUlVFX1ZBTFVFKSk7CisgIH0KIH0KIAogLy8gVGhlIHRoZSBleHByZXNzaW9uIGZvciB0aGUgaW50ZXJmYWNlJ3MgZGVzY3JpcHRvciB0byBiZSB1c2VkIHdoZW4KIC8vIGdlbmVyYXRpbmcgY29kZSBmb3IgdGhlIGdpdmVuIG1ldGhvZC4gTnVsbCBpcyBhY2NlcHRhYmxlIGZvciBtZXRob2QKIC8vIGFuZCBzdGFuZHMgZm9yIHN5bnRoZXRpYyBjYXNlcy4KLXN0ZDo6c2hhcmVkX3B0cjxFeHByZXNzaW9uPiBTdHViQ2xhc3M6OmdldF90cmFuc2FjdF9kZXNjcmlwdG9yKGNvbnN0IEFpZGxNZXRob2QqIG1ldGhvZCkgeworc3RkOjpzaGFyZWRfcHRyPEV4cHJlc3Npb24+IFN0dWJDbGFzczo6R2V0VHJhbnNhY3REZXNjcmlwdG9yKGNvbnN0IEFpZGxNZXRob2QqIG1ldGhvZCkgewogICBpZiAodHJhbnNhY3Rfb3V0bGluZSkgewogICAgIGlmIChtZXRob2QgIT0gbnVsbHB0cikgewogICAgICAgLy8gV2hlbiBvdXRsaW5pbmcsIGVhY2ggb3V0bGluZWQgbWV0aG9kIG5lZWRzIGl0cyBvd24gbGl0ZXJhbC4KQEAgLTI1Myw3ICsyNzYsNyBAQAogICByZXR1cm4gdHJhbnNhY3RfZGVzY3JpcHRvcjsKIH0KIAotdm9pZCBTdHViQ2xhc3M6Om1ha2VfYXNfaW50ZXJmYWNlKGNvbnN0IEFpZGxJbnRlcmZhY2UqIGludGVyZmFjZVR5cGUpIHsKK3ZvaWQgU3R1YkNsYXNzOjpNYWtlQXNJbnRlcmZhY2UoY29uc3QgQWlkbEludGVyZmFjZSogaW50ZXJmYWNlVHlwZSkgewogICBhdXRvIG9iaiA9IHN0ZDo6bWFrZV9zaGFyZWQ8VmFyaWFibGU+KCJhbmRyb2lkLm9zLklCaW5kZXIiLCAib2JqIik7CiAKICAgYXV0byBtID0gc3RkOjptYWtlX3NoYXJlZDxNZXRob2Q+KCk7CkBAIC0zNTUsNDIgKzM3OCwyOSBAQAogUHJveHlDbGFzczo6flByb3h5Q2xhc3MoKSB7fQogCiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1zdGF0aWMgdm9pZCBnZW5lcmF0ZV9uZXdfYXJyYXkoY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHR5cGUsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8U3RhdGVtZW50QmxvY2s+IGFkZFRvLCBzdGQ6OnNoYXJlZF9wdHI8VmFyaWFibGU+IHYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFZhcmlhYmxlPiBwYXJjZWwpIHsKLSAgYXV0byBsZW4gPSBzdGQ6Om1ha2Vfc2hhcmVkPFZhcmlhYmxlPigiaW50Iiwgdi0+bmFtZSArICJfbGVuZ3RoIik7Ci0gIGFkZFRvLT5BZGQoCi0gICAgICBzdGQ6Om1ha2Vfc2hhcmVkPFZhcmlhYmxlRGVjbGFyYXRpb24+KGxlbiwgc3RkOjptYWtlX3NoYXJlZDxNZXRob2RDYWxsPihwYXJjZWwsICJyZWFkSW50IikpKTsKLSAgYXV0byBsZW5jaGVjayA9IHN0ZDo6bWFrZV9zaGFyZWQ8SWZTdGF0ZW1lbnQ+KCk7Ci0gIGxlbmNoZWNrLT5leHByZXNzaW9uID0KLSAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8Q29tcGFyaXNvbj4obGVuLCAiPCIsIHN0ZDo6bWFrZV9zaGFyZWQ8TGl0ZXJhbEV4cHJlc3Npb24+KCIwIikpOwotICBsZW5jaGVjay0+c3RhdGVtZW50cy0+QWRkKHN0ZDo6bWFrZV9zaGFyZWQ8QXNzaWdubWVudD4odiwgTlVMTF9WQUxVRSkpOwotICBsZW5jaGVjay0+ZWxzZWlmID0gc3RkOjptYWtlX3NoYXJlZDxJZlN0YXRlbWVudD4oKTsKLSAgbGVuY2hlY2stPmVsc2VpZi0+c3RhdGVtZW50cy0+QWRkKHN0ZDo6bWFrZV9zaGFyZWQ8QXNzaWdubWVudD4oCi0gICAgICB2LCBzdGQ6Om1ha2Vfc2hhcmVkPE5ld0FycmF5RXhwcmVzc2lvbj4oSW5zdGFudGlhYmxlSmF2YVNpZ25hdHVyZU9mKHR5cGUsIHR5cGVuYW1lcyksIGxlbikpKTsKLSAgYWRkVG8tPkFkZChsZW5jaGVjayk7Ci19CiAKLXN0YXRpYyB2b2lkIGdlbmVyYXRlX3dyaXRlX3RvX3BhcmNlbChjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8U3RhdGVtZW50QmxvY2s+IGFkZFRvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxWYXJpYWJsZT4gdiwgc3RkOjpzaGFyZWRfcHRyPFZhcmlhYmxlPiBwYXJjZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXR1cm5fdmFsdWUsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcykgeworc3RhdGljIHZvaWQgR2VuZXJhdGVXcml0ZVRvUGFyY2VsKHN0ZDo6c2hhcmVkX3B0cjxTdGF0ZW1lbnRCbG9jaz4gYWRkVG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLCBjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGFyY2VsLCBjb25zdCBzdGQ6OnN0cmluZyYgdmFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1pbl9zZGtfdmVyc2lvbiwgYm9vbCBpc19yZXR1cm5fdmFsdWUpIHsKICAgc3RyaW5nIGNvZGU7CiAgIENvZGVXcml0ZXJQdHIgd3JpdGVyID0gQ29kZVdyaXRlcjo6Rm9yU3RyaW5nKCZjb2RlKTsKICAgQ29kZUdlbmVyYXRvckNvbnRleHQgY29udGV4dHsKICAgICAgIC53cml0ZXIgPSAqKHdyaXRlci5nZXQoKSksCiAgICAgICAudHlwZW5hbWVzID0gdHlwZW5hbWVzLAogICAgICAgLnR5cGUgPSB0eXBlLAotICAgICAgLnBhcmNlbCA9IHBhcmNlbC0+bmFtZSwKLSAgICAgIC52YXIgPSB2LT5uYW1lLAotICAgICAgLmlzX3JldHVybl92YWx1ZSA9IGlzX3JldHVybl92YWx1ZSwKKyAgICAgIC5wYXJjZWwgPSBwYXJjZWwsCisgICAgICAudmFyID0gdmFyLAorICAgICAgLm1pbl9zZGtfdmVyc2lvbiA9IG1pbl9zZGtfdmVyc2lvbiwKKyAgICAgIC53cml0ZV90b19wYXJjZWxfZmxhZyA9CisgICAgICAgICAgaXNfcmV0dXJuX3ZhbHVlID8gImFuZHJvaWQub3MuUGFyY2VsYWJsZS5QQVJDRUxBQkxFX1dSSVRFX1JFVFVSTl9WQUxVRSIgOiAiMCIsCiAgIH07CiAgIFdyaXRlVG9QYXJjZWxGb3IoY29udGV4dCk7CiAgIHdyaXRlci0+Q2xvc2UoKTsKICAgYWRkVG8tPkFkZChzdGQ6Om1ha2Vfc2hhcmVkPExpdGVyYWxTdGF0ZW1lbnQ+KGNvZGUpKTsKIH0KIAotdm9pZCBnZW5lcmF0ZV9jb25zdGFudF9kZWNsYXJhdGlvbnMoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsRGVmaW5lZFR5cGUmIHR5cGUpIHsKK3ZvaWQgR2VuZXJhdGVDb25zdGFudERlY2xhcmF0aW9ucyhDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxEZWZpbmVkVHlwZSYgdHlwZSkgewogICBmb3IgKGNvbnN0IGF1dG8mIGNvbnN0YW50IDogdHlwZS5HZXRDb25zdGFudERlY2xhcmF0aW9ucygpKSB7CiAgICAgY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHR5cGUgPSBjb25zdGFudC0+R2V0VHlwZSgpOwogICAgIG91dCA8PCBHZW5lcmF0ZUNvbW1lbnRzKCpjb25zdGFudCk7CkBAIC00MDAsMTcgKzQxMCwxNiBAQAogICB9CiB9CiAKLXN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8TWV0aG9kPiBnZW5lcmF0ZV9pbnRlcmZhY2VfbWV0aG9kKGNvbnN0IEFpZGxNZXRob2QmIG1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcykgeworc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxNZXRob2Q+IEdlbmVyYXRlSW50ZXJmYWNlTWV0aG9kKGNvbnN0IEFpZGxNZXRob2QmIG1ldGhvZCkgewogICBhdXRvIGRlY2wgPSBzdGQ6Om1ha2Vfc2hhcmVkPE1ldGhvZD4oKTsKICAgZGVjbC0+Y29tbWVudCA9IEdlbmVyYXRlQ29tbWVudHMobWV0aG9kKTsKICAgZGVjbC0+bW9kaWZpZXJzID0gUFVCTElDOwotICBkZWNsLT5yZXR1cm5UeXBlID0gSmF2YVNpZ25hdHVyZU9mKG1ldGhvZC5HZXRUeXBlKCksIHR5cGVuYW1lcyk7CisgIGRlY2wtPnJldHVyblR5cGUgPSBKYXZhU2lnbmF0dXJlT2YobWV0aG9kLkdldFR5cGUoKSk7CiAgIGRlY2wtPm5hbWUgPSBtZXRob2QuR2V0TmFtZSgpOwogICBkZWNsLT5hbm5vdGF0aW9ucyA9IEphdmFBbm5vdGF0aW9uc0ZvcihtZXRob2QpOwogCiAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEFpZGxBcmd1bWVudD4mIGFyZyA6IG1ldGhvZC5HZXRBcmd1bWVudHMoKSkgewotICAgIGF1dG8gdmFyID0gc3RkOjptYWtlX3NoYXJlZDxWYXJpYWJsZT4oSmF2YVNpZ25hdHVyZU9mKGFyZy0+R2V0VHlwZSgpLCB0eXBlbmFtZXMpLCBhcmctPkdldE5hbWUoKSk7CisgICAgYXV0byB2YXIgPSBzdGQ6Om1ha2Vfc2hhcmVkPFZhcmlhYmxlPihKYXZhU2lnbmF0dXJlT2YoYXJnLT5HZXRUeXBlKCkpLCBhcmctPkdldE5hbWUoKSk7CiAgICAgdmFyLT5hbm5vdGF0aW9ucyA9IEphdmFBbm5vdGF0aW9uc0ZvcihhcmctPkdldFR5cGUoKSk7CiAgICAgZGVjbC0+cGFyYW1ldGVycy5wdXNoX2JhY2sodmFyKTsKICAgfQpAQCAtNDIwLDEyICs0MjksMTAzIEBACiAgIHJldHVybiBkZWNsOwogfQogCi1zdGF0aWMgdm9pZCBnZW5lcmF0ZV9zdHViX2NvZGUoY29uc3QgQWlkbEludGVyZmFjZSYgaWZhY2UsIGNvbnN0IEFpZGxNZXRob2QmIG1ldGhvZCwgYm9vbCBvbmV3YXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFZhcmlhYmxlPiB0cmFuc2FjdF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxWYXJpYWJsZT4gdHJhbnNhY3RfcmVwbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxTdGF0ZW1lbnRCbG9jaz4gc3RhdGVtZW50X2Jsb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxTdHViQ2xhc3M+IHN0dWJDbGFzcywgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworLy8gVmlzaXRvciBmb3IgdGhlIHBlcm1pc3Npb24gZGVjbGFyZWQgaW4gdGhlIEBFbmZvcmNlUGVybWlzc2lvbiBhbm5vdGF0aW9uLgorc3RydWN0IFBlcm1pc3Npb25WaXNpdG9yIHsKKyAgc2hhcmVkX3B0cjxFeHByZXNzaW9uPiBvcGVyYXRvcigpKGNvbnN0IHBlcm06OkFsbE9mJiBxdWFudGlmaWVyKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEV4cHJlc3Npb24+IHJlc3VsdDsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIG9wZXJhbmQgOiBxdWFudGlmaWVyLm9wZXJhbmRzKSB7CisgICAgICBhdXRvIGV4cHIgPSAoKnRoaXMpKG9wZXJhbmQpOworICAgICAgaWYgKHJlc3VsdCkgeworICAgICAgICByZXN1bHQgPSBzdGQ6Om1ha2Vfc2hhcmVkPENvbXBhcmlzb24+KHJlc3VsdCwgIiYmIiwgZXhwcik7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQgPSBleHByOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgc2hhcmVkX3B0cjxFeHByZXNzaW9uPiBvcGVyYXRvcigpKGNvbnN0IHBlcm06OkFueU9mJiBxdWFudGlmaWVyKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEV4cHJlc3Npb24+IHJlc3VsdDsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIG9wZXJhbmQgOiBxdWFudGlmaWVyLm9wZXJhbmRzKSB7CisgICAgICBhdXRvIGV4cHIgPSAoKnRoaXMpKG9wZXJhbmQpOworICAgICAgaWYgKHJlc3VsdCkgeworICAgICAgICByZXN1bHQgPSBzdGQ6Om1ha2Vfc2hhcmVkPENvbXBhcmlzb24+KHJlc3VsdCwgInx8IiwgZXhwcik7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQgPSBleHByOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgc2hhcmVkX3B0cjxFeHByZXNzaW9uPiBvcGVyYXRvcigpKGNvbnN0IHN0ZDo6c3RyaW5nJiBwZXJtaXNzaW9uKSB7CisgICAgYXV0byBhdHRyaWJ1dGlvblNvdXJjZSA9CisgICAgICAgIHN0ZDo6c3RyaW5nKCJuZXcgYW5kcm9pZC5jb250ZW50LkF0dHJpYnV0aW9uU291cmNlKGdldENhbGxpbmdVaWQoKSwgbnVsbCwgbnVsbCkiKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1ldGhvZF8uR2V0QXJndW1lbnRzKCkuc2l6ZSgpOyBpKyspIHsKKyAgICAgIGNvbnN0IGF1dG8mIGFyZyA9IG1ldGhvZF8uR2V0QXJndW1lbnRzKClbaV07CisgICAgICBpZiAoYXJnLT5HZXRUeXBlKCkuR2V0TmFtZSgpID09ICJhbmRyb2lkLmNvbnRlbnQuQXR0cmlidXRpb25Tb3VyY2UiKSB7CisgICAgICAgIGF0dHJpYnV0aW9uU291cmNlID0gYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmKCJfYXJnJXp1IiwgaSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBhdXRvIHBlcm1pc3Npb25OYW1lID0gYW5kcm9pZDo6YWlkbDo6cGVybTo6SmF2YUZ1bGxOYW1lKHBlcm1pc3Npb24pOworICAgIGF1dG8gY2hlY2tQZXJtaXNzaW9uID0KKyAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxNZXRob2RDYWxsPihUSElTX1ZBTFVFLCAicGVybWlzc2lvbkNoZWNrZXJXcmFwcGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8RXhwcmVzc2lvbj4+eworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPExpdGVyYWxFeHByZXNzaW9uPihwZXJtaXNzaW9uTmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8TWV0aG9kQ2FsbD4oVEhJU19WQUxVRSwgImdldENhbGxpbmdQaWQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxMaXRlcmFsRXhwcmVzc2lvbj4oYXR0cmlidXRpb25Tb3VyY2UpfSk7CisgICAgcmV0dXJuIGNoZWNrUGVybWlzc2lvbjsKKyAgfQorCisgIGNvbnN0IEFpZGxNZXRob2QmIG1ldGhvZF87Cit9OworCitzdGF0aWMgdm9pZCBHZW5lcmF0ZVBlcm1pc3Npb25XcmFwcGVyKENsYXNzKiBzdHViQ2xhc3MpIHsKKyAgLy8gVE9ETyhiLzIwODcwNzQyMikgYXZvaWQgZ2VuZXJhdGluZyBwbGF0Zm9ybS1zcGVjaWZpYyBBUEkgY2FsbHMuCisgIHN0ZDo6c3RyaW5nIHBlcm1pc3Npb25DaGVja2VyV3JhcHBlckNvZGUgPQorICAgICAgInByaXZhdGUgYm9vbGVhbiBwZXJtaXNzaW9uQ2hlY2tlcldyYXBwZXIoXG4iCisgICAgICAiICAgIFN0cmluZyBwZXJtaXNzaW9uLCBpbnQgcGlkLCBhbmRyb2lkLmNvbnRlbnQuQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpIHtcbiIKKyAgICAgICIgIGFuZHJvaWQuY29udGVudC5Db250ZXh0IGN0eCA9XG4iCisgICAgICAiICAgICAgYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQuY3VycmVudEFjdGl2aXR5VGhyZWFkKCkuZ2V0U3lzdGVtQ29udGV4dCgpO1xuIgorICAgICAgIiAgcmV0dXJuIChhbmRyb2lkLmNvbnRlbnQuUGVybWlzc2lvbkNoZWNrZXIuY2hlY2tQZXJtaXNzaW9uRm9yRGF0YURlbGl2ZXJ5KFxuIgorICAgICAgIiAgICAgICAgICBjdHgsIHBlcm1pc3Npb24sIHBpZCwgYXR0cmlidXRpb25Tb3VyY2UsIFwiXCIgLyptZXNzYWdlKi8pID09XG4iCisgICAgICAiICAgICAgYW5kcm9pZC5jb250ZW50LlBlcm1pc3Npb25DaGVja2VyLlBFUk1JU1NJT05fR1JBTlRFRCk7XG4iCisgICAgICAifVxuIjsKKyAgYXV0byBwZXJtaXNzaW9uQ2hlY2tlcldyYXBwZXIgPQorICAgICAgc3RkOjptYWtlX3NoYXJlZDxMaXRlcmFsQ2xhc3NFbGVtZW50PihwZXJtaXNzaW9uQ2hlY2tlcldyYXBwZXJDb2RlKTsKKyAgc3R1YkNsYXNzLT5lbGVtZW50cy5wdXNoX2JhY2socGVybWlzc2lvbkNoZWNrZXJXcmFwcGVyKTsKK30KKworc3RhdGljIHZvaWQgR2VuZXJhdGVQZXJtaXNzaW9uQ2hlY2soY29uc3QgQWlkbE1ldGhvZCYgbWV0aG9kLCBjb25zdCBwZXJtOjpFeHByZXNzaW9uJiBleHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFN0YXRlbWVudEJsb2NrPiBhZGRUbykgeworICBhdXRvIGlmc3RhdGVtZW50ID0gc3RkOjptYWtlX3NoYXJlZDxJZlN0YXRlbWVudD4oKTsKKyAgYXV0byBjb21iaW5lZEV4cHIgPSBzdGQ6OnZpc2l0KFBlcm1pc3Npb25WaXNpdG9ye21ldGhvZH0sIGV4cHIpOworICBpZnN0YXRlbWVudC0+ZXhwcmVzc2lvbiA9IHN0ZDo6bWFrZV9zaGFyZWQ8Q29tcGFyaXNvbj4oY29tYmluZWRFeHByLCAiIT0iLCBUUlVFX1ZBTFVFKTsKKyAgaWZzdGF0ZW1lbnQtPnN0YXRlbWVudHMgPSBzdGQ6Om1ha2Vfc2hhcmVkPFN0YXRlbWVudEJsb2NrPigpOworICBpZnN0YXRlbWVudC0+c3RhdGVtZW50cy0+QWRkKHN0ZDo6bWFrZV9zaGFyZWQ8TGl0ZXJhbFN0YXRlbWVudD4oCisgICAgICBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGYoInRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbihcIkFjY2VzcyBkZW5pZWQsIHJlcXVpcmVzOiAlc1wiKTtcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVybTo6QXNKYXZhQW5ub3RhdGlvbihleHByKS5jX3N0cigpKSkpOworICBhZGRUby0+QWRkKGlmc3RhdGVtZW50KTsKK30KKworc3RhdGljIHZvaWQgR2VuZXJhdGVQZXJtaXNzaW9uQ2hlY2tzKGNvbnN0IEFpZGxJbnRlcmZhY2UmIGlmYWNlLCBjb25zdCBBaWRsTWV0aG9kJiBtZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFN0YXRlbWVudEJsb2NrPiBhZGRUbykgeworICBhdXRvIGlmYWNlUGVybUV4cHIgPSBpZmFjZS5FbmZvcmNlRXhwcmVzc2lvbigpOworICBpZiAoaWZhY2VQZXJtRXhwcikgeworICAgIEdlbmVyYXRlUGVybWlzc2lvbkNoZWNrKG1ldGhvZCwgKmlmYWNlUGVybUV4cHIuZ2V0KCksIGFkZFRvKTsKKyAgfQorICBhdXRvIG1ldGhvZFBlcm1FeHByID0gbWV0aG9kLkdldFR5cGUoKS5FbmZvcmNlRXhwcmVzc2lvbigpOworICBpZiAobWV0aG9kUGVybUV4cHIpIHsKKyAgICBHZW5lcmF0ZVBlcm1pc3Npb25DaGVjayhtZXRob2QsICptZXRob2RQZXJtRXhwci5nZXQoKSwgYWRkVG8pOworICB9Cit9CisKK3N0YXRpYyB2b2lkIEdlbmVyYXRlU3R1YkNvZGUoY29uc3QgQWlkbEludGVyZmFjZSYgaWZhY2UsIGNvbnN0IEFpZGxNZXRob2QmIG1ldGhvZCwgYm9vbCBvbmV3YXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxWYXJpYWJsZT4gdHJhbnNhY3RfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFZhcmlhYmxlPiB0cmFuc2FjdF9yZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8U3RhdGVtZW50QmxvY2s+IHN0YXRlbWVudF9ibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgewogICAvLyB0cnkgYW5kIGZpbmFsbHkKICAgYXV0byB0cnlTdGF0ZW1lbnQgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRyeVN0YXRlbWVudD4oKTsKICAgYXV0byBmaW5hbGx5U3RhdGVtZW50ID0gc3RkOjptYWtlX3NoYXJlZDxGaW5hbGx5U3RhdGVtZW50PigpOwpAQCAtNDQ5LDExICs1NDksNiBAQAogCiAgIGF1dG8gcmVhbENhbGwgPSBzdGQ6Om1ha2Vfc2hhcmVkPE1ldGhvZENhbGw+KFRISVNfVkFMVUUsIG1ldGhvZC5HZXROYW1lKCkpOwogCi0gIC8vIGludGVyZmFjZSB0b2tlbiB2YWxpZGF0aW9uIGlzIHRoZSB2ZXJ5IGZpcnN0IHRoaW5nIHdlIGRvCi0gIHN0YXRlbWVudHMtPkFkZChzdGQ6Om1ha2Vfc2hhcmVkPE1ldGhvZENhbGw+KAotICAgICAgdHJhbnNhY3RfZGF0YSwgImVuZm9yY2VJbnRlcmZhY2UiLAotICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEV4cHJlc3Npb24+PntzdHViQ2xhc3MtPmdldF90cmFuc2FjdF9kZXNjcmlwdG9yKCZtZXRob2QpfSkpOwotCiAgIC8vIGFyZ3MKICAgVmFyaWFibGVGYWN0b3J5IHN0dWJBcmdzKCJfYXJnIik7CiAgIHsKQEAgLTQ2MSwzNiArNTU2LDYxIEBACiAgICAgLy8gYXQgbW9zdCBvbmNlLgogICAgIGJvb2wgaXNfY2xhc3Nsb2FkZXJfY3JlYXRlZCA9IGZhbHNlOwogICAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEFpZGxBcmd1bWVudD4mIGFyZyA6IG1ldGhvZC5HZXRBcmd1bWVudHMoKSkgewotICAgICAgc3RkOjpzaGFyZWRfcHRyPFZhcmlhYmxlPiB2ID0gc3R1YkFyZ3MuR2V0KGFyZy0+R2V0VHlwZSgpLCB0eXBlbmFtZXMpOworICAgICAgc3RkOjpzaGFyZWRfcHRyPFZhcmlhYmxlPiB2ID0gc3R1YkFyZ3MuR2V0KGFyZy0+R2V0VHlwZSgpKTsKIAogICAgICAgc3RhdGVtZW50cy0+QWRkKHN0ZDo6bWFrZV9zaGFyZWQ8VmFyaWFibGVEZWNsYXJhdGlvbj4odikpOwogCisgICAgICBzdHJpbmcgY29kZTsKKyAgICAgIENvZGVXcml0ZXJQdHIgd3JpdGVyID0gQ29kZVdyaXRlcjo6Rm9yU3RyaW5nKCZjb2RlKTsKICAgICAgIGlmIChhcmctPkdldERpcmVjdGlvbigpICYgQWlkbEFyZ3VtZW50OjpJTl9ESVIpIHsKLSAgICAgICAgc3RyaW5nIGNvZGU7Ci0gICAgICAgIENvZGVXcml0ZXJQdHIgd3JpdGVyID0gQ29kZVdyaXRlcjo6Rm9yU3RyaW5nKCZjb2RlKTsKKyAgICAgICAgLy8gImluL2lub3V0IiBwYXJhbWV0ZXIgc2hvdWxkIGJlIGNyZWF0ZWQgZnJvbSBwYXJjZWwuCiAgICAgICAgIENvZGVHZW5lcmF0b3JDb250ZXh0IGNvbnRleHR7LndyaXRlciA9ICood3JpdGVyLmdldCgpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudHlwZW5hbWVzID0gdHlwZW5hbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50eXBlID0gYXJnLT5HZXRUeXBlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBhcmNlbCA9IHRyYW5zYWN0X2RhdGEtPm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnZhciA9IHYtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1pbl9zZGtfdmVyc2lvbiA9IG9wdGlvbnMuR2V0TWluU2RrVmVyc2lvbigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pc19jbGFzc2xvYWRlcl9jcmVhdGVkID0gJmlzX2NsYXNzbG9hZGVyX2NyZWF0ZWR9OwogICAgICAgICBDcmVhdGVGcm9tUGFyY2VsRm9yKGNvbnRleHQpOwotICAgICAgICB3cml0ZXItPkNsb3NlKCk7Ci0gICAgICAgIHN0YXRlbWVudHMtPkFkZChzdGQ6Om1ha2Vfc2hhcmVkPExpdGVyYWxTdGF0ZW1lbnQ+KGNvZGUpKTsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICghYXJnLT5HZXRUeXBlKCkuSXNBcnJheSgpKSB7Ci0gICAgICAgICAgc3RhdGVtZW50cy0+QWRkKHN0ZDo6bWFrZV9zaGFyZWQ8QXNzaWdubWVudD4oCi0gICAgICAgICAgICAgIHYsIHN0ZDo6bWFrZV9zaGFyZWQ8TmV3RXhwcmVzc2lvbj4oCi0gICAgICAgICAgICAgICAgICAgICBJbnN0YW50aWFibGVKYXZhU2lnbmF0dXJlT2YoYXJnLT5HZXRUeXBlKCksIHR5cGVuYW1lcykpKSk7CisgICAgICAgIC8vICJvdXQiIHBhcmFtZXRlciBzaG91bGQgYmUgaW5zdGFudGlhdGVkIGJlZm9yZSBjYWxsaW5nIHRoZSByZWFsIGltcGwuCisgICAgICAgIHN0cmluZyBqYXZhX3R5cGUgPSBJbnN0YW50aWFibGVKYXZhU2lnbmF0dXJlT2YoYXJnLT5HZXRUeXBlKCkpOworCisgICAgICAgIGlmIChhcmctPkdldFR5cGUoKS5Jc0R5bmFtaWNBcnJheSgpKSB7CisgICAgICAgICAgLy8gZHluYW1pYyBhcnJheSBzaG91bGQgYmUgY3JlYXRlZCB3aXRoIGEgcGFzc2VkIGxlbmd0aC4KKyAgICAgICAgICBzdHJpbmcgdmFyX2xlbmd0aCA9IHYtPm5hbWUgKyAiX2xlbmd0aCI7CisgICAgICAgICAgKCp3cml0ZXIpIDw8ICJpbnQgIiA8PCB2YXJfbGVuZ3RoIDw8ICIgPSBkYXRhLnJlYWRJbnQoKTtcbiI7CisgICAgICAgICAgKCp3cml0ZXIpIDw8ICJpZiAoIiA8PCB2YXJfbGVuZ3RoIDw8ICIgPCAwKSB7XG4iOworICAgICAgICAgICgqd3JpdGVyKSA8PCAiICAiIDw8IHYtPm5hbWUgPDwgIiA9IG51bGw7XG4iOworICAgICAgICAgICgqd3JpdGVyKSA8PCAifSBlbHNlIHtcbiI7CisgICAgICAgICAgKCp3cml0ZXIpIDw8ICIgICIgPDwgdi0+bmFtZSA8PCAiID0gbmV3ICIgPDwgamF2YV90eXBlIDw8ICJbIiA8PCB2YXJfbGVuZ3RoIDw8ICJdO1xuIjsKKyAgICAgICAgICAoKndyaXRlcikgPDwgIn1cbiI7CisgICAgICAgIH0gZWxzZSBpZiAoYXJnLT5HZXRUeXBlKCkuSXNGaXhlZFNpemVBcnJheSgpKSB7CisgICAgICAgICAgLy8gZml4ZWQtc2l6ZSBhcnJheSBjYW4gYmUgY3JlYXRlZCB3aXRoIGEga25vd24gc2l6ZQorICAgICAgICAgIHN0cmluZyBkaW1lbnNpb25zOworICAgICAgICAgIGZvciAoYXV0byBkaW0gOiBhcmctPkdldFR5cGUoKS5HZXRGaXhlZFNpemVBcnJheURpbWVuc2lvbnMoKSkgeworICAgICAgICAgICAgZGltZW5zaW9ucyArPSAiWyIgKyBzdGQ6OnRvX3N0cmluZyhkaW0pICsgIl0iOworICAgICAgICAgIH0KKyAgICAgICAgICAoKndyaXRlcikgPDwgdi0+bmFtZSA8PCAiID0gbmV3ICIgPDwgamF2YV90eXBlIDw8IGRpbWVuc2lvbnMgPDwgIjtcbiI7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ2VuZXJhdGVfbmV3X2FycmF5KGFyZy0+R2V0VHlwZSgpLCB0eXBlbmFtZXMsIHN0YXRlbWVudHMsIHYsIHRyYW5zYWN0X2RhdGEpOworICAgICAgICAgIC8vIG90aGVyd2lzZSwgY3JlYXRlIGEgbmV3IGluc3RhbmNlIHdpdGggYSBkZWZhdWx0IGNvbnN0cnVjdG9yCisgICAgICAgICAgKCp3cml0ZXIpIDw8IHYtPm5hbWUgPDwgIiA9IG5ldyAiIDw8IGphdmFfdHlwZSA8PCAiKCk7XG4iOwogICAgICAgICB9CiAgICAgICB9CisgICAgICB3cml0ZXItPkNsb3NlKCk7CisgICAgICBzdGF0ZW1lbnRzLT5BZGQoc3RkOjptYWtlX3NoYXJlZDxMaXRlcmFsU3RhdGVtZW50Pihjb2RlKSk7CiAKICAgICAgIHJlYWxDYWxsLT5hcmd1bWVudHMucHVzaF9iYWNrKHYpOwogICAgIH0KICAgfQogCisgIC8vIEVPRiBjaGVjaworICBpZiAoIW1ldGhvZC5HZXRBcmd1bWVudHMoKS5lbXB0eSgpICYmIG9wdGlvbnMuR2V0TWluU2RrVmVyc2lvbigpID49IDMydSkgeworICAgIHN0YXRlbWVudHMtPkFkZChzdGQ6Om1ha2Vfc2hhcmVkPE1ldGhvZENhbGw+KHRyYW5zYWN0X2RhdGEsICJlbmZvcmNlTm9EYXRhQXZhaWwiKSk7CisgIH0KKworICBHZW5lcmF0ZVBlcm1pc3Npb25DaGVja3MoaWZhY2UsIG1ldGhvZCwgc3RhdGVtZW50cyk7CisKICAgLy8gdGhlIHJlYWwgY2FsbAogICBpZiAobWV0aG9kLkdldFR5cGUoKS5HZXROYW1lKCkgPT0gInZvaWQiKSB7CiAgICAgc3RhdGVtZW50cy0+QWRkKHJlYWxDYWxsKTsKQEAgLTUwMSw5ICs2MjEsOCBAQAogICAgICAgc3RhdGVtZW50cy0+QWRkKGV4KTsKICAgICB9CiAgIH0gZWxzZSB7Ci0gICAgYXV0byBfcmVzdWx0ID0KLSAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxWYXJpYWJsZT4oSmF2YVNpZ25hdHVyZU9mKG1ldGhvZC5HZXRUeXBlKCksIHR5cGVuYW1lcyksICJfcmVzdWx0Iik7Ci0gICAgICBzdGF0ZW1lbnRzLT5BZGQoc3RkOjptYWtlX3NoYXJlZDxWYXJpYWJsZURlY2xhcmF0aW9uPihfcmVzdWx0LCByZWFsQ2FsbCkpOworICAgIGF1dG8gX3Jlc3VsdCA9IHN0ZDo6bWFrZV9zaGFyZWQ8VmFyaWFibGU+KEphdmFTaWduYXR1cmVPZihtZXRob2QuR2V0VHlwZSgpKSwgIl9yZXN1bHQiKTsKKyAgICBzdGF0ZW1lbnRzLT5BZGQoc3RkOjptYWtlX3NoYXJlZDxWYXJpYWJsZURlY2xhcmF0aW9uPihfcmVzdWx0LCByZWFsQ2FsbCkpOwogCiAgICAgaWYgKCFvbmV3YXkpIHsKICAgICAgIC8vIHJlcG9ydCB0aGF0IHRoZXJlIHdlcmUgbm8gZXhjZXB0aW9ucwpAQCAtNTEyLDQwICs2MzEsMzggQEAKICAgICB9CiAKICAgICAvLyBtYXJzaGFsbCB0aGUgcmV0dXJuIHZhbHVlCi0gICAgZ2VuZXJhdGVfd3JpdGVfdG9fcGFyY2VsKG1ldGhvZC5HZXRUeXBlKCksIHN0YXRlbWVudHMsIF9yZXN1bHQsIHRyYW5zYWN0X3JlcGx5LCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZXMpOworICAgIEdlbmVyYXRlV3JpdGVUb1BhcmNlbChzdGF0ZW1lbnRzLCB0eXBlbmFtZXMsIG1ldGhvZC5HZXRUeXBlKCksIHRyYW5zYWN0X3JlcGx5LT5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfcmVzdWx0LT5uYW1lLCBvcHRpb25zLkdldE1pblNka1ZlcnNpb24oKSwgLyppc19yZXR1cm5fdmFsdWU9Ki90cnVlKTsKICAgfQogCiAgIC8vIG91dCBwYXJhbWV0ZXJzCiAgIGludCBpID0gMDsKICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QWlkbEFyZ3VtZW50PiYgYXJnIDogbWV0aG9kLkdldEFyZ3VtZW50cygpKSB7CiAgICAgc3RkOjpzaGFyZWRfcHRyPFZhcmlhYmxlPiB2ID0gc3R1YkFyZ3MuR2V0KGkrKyk7Ci0KICAgICBpZiAoYXJnLT5HZXREaXJlY3Rpb24oKSAmIEFpZGxBcmd1bWVudDo6T1VUX0RJUikgewotICAgICAgZ2VuZXJhdGVfd3JpdGVfdG9fcGFyY2VsKGFyZy0+R2V0VHlwZSgpLCBzdGF0ZW1lbnRzLCB2LCB0cmFuc2FjdF9yZXBseSwgdHJ1ZSwgdHlwZW5hbWVzKTsKKyAgICAgIEdlbmVyYXRlV3JpdGVUb1BhcmNlbChzdGF0ZW1lbnRzLCB0eXBlbmFtZXMsIGFyZy0+R2V0VHlwZSgpLCB0cmFuc2FjdF9yZXBseS0+bmFtZSwgdi0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLkdldE1pblNka1ZlcnNpb24oKSwgLyppc19yZXR1cm5fdmFsdWU9Ki90cnVlKTsKICAgICB9CiAgIH0KLQotICAvLyByZXR1cm4gdHJ1ZQotICBzdGF0ZW1lbnRzLT5BZGQoc3RkOjptYWtlX3NoYXJlZDxSZXR1cm5TdGF0ZW1lbnQ+KFRSVUVfVkFMVUUpKTsKIH0KIAotc3RhdGljIHZvaWQgZ2VuZXJhdGVfc3R1Yl9jYXNlKGNvbnN0IEFpZGxJbnRlcmZhY2UmIGlmYWNlLCBjb25zdCBBaWRsTWV0aG9kJiBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHRyYW5zYWN0Q29kZU5hbWUsIGJvb2wgb25ld2F5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxTdHViQ2xhc3M+IHN0dWJDbGFzcywgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKK3N0YXRpYyB2b2lkIEdlbmVyYXRlU3R1YkNhc2UoY29uc3QgQWlkbEludGVyZmFjZSYgaWZhY2UsIGNvbnN0IEFpZGxNZXRob2QmIG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHRyYW5zYWN0Q29kZU5hbWUsIGJvb2wgb25ld2F5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8U3R1YkNsYXNzPiBzdHViQ2xhc3MsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgewogICBhdXRvIGMgPSBzdGQ6Om1ha2Vfc2hhcmVkPENhc2U+KHRyYW5zYWN0Q29kZU5hbWUpOwogCi0gIGdlbmVyYXRlX3N0dWJfY29kZShpZmFjZSwgbWV0aG9kLCBvbmV3YXksIHN0dWJDbGFzcy0+dHJhbnNhY3RfZGF0YSwgc3R1YkNsYXNzLT50cmFuc2FjdF9yZXBseSwKLSAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lcywgYy0+c3RhdGVtZW50cywgc3R1YkNsYXNzLCBvcHRpb25zKTsKKyAgR2VuZXJhdGVTdHViQ29kZShpZmFjZSwgbWV0aG9kLCBvbmV3YXksIHN0dWJDbGFzcy0+dHJhbnNhY3RfZGF0YSwgc3R1YkNsYXNzLT50cmFuc2FjdF9yZXBseSwKKyAgICAgICAgICAgICAgICAgICB0eXBlbmFtZXMsIGMtPnN0YXRlbWVudHMsIG9wdGlvbnMpOworICBjLT5zdGF0ZW1lbnRzLT5BZGQoc3RkOjptYWtlX3NoYXJlZDxCcmVha1N0YXRlbWVudD4oKSk7CiAKICAgc3R1YkNsYXNzLT50cmFuc2FjdF9zd2l0Y2hfdXNlci0+Y2FzZXMucHVzaF9iYWNrKGMpOwogfQogCi1zdGF0aWMgdm9pZCBnZW5lcmF0ZV9zdHViX2Nhc2Vfb3V0bGluZShjb25zdCBBaWRsSW50ZXJmYWNlJiBpZmFjZSwgY29uc3QgQWlkbE1ldGhvZCYgbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHRyYW5zYWN0Q29kZU5hbWUsIGJvb2wgb25ld2F5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFN0dWJDbGFzcz4gc3R1YkNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CitzdGF0aWMgdm9pZCBHZW5lcmF0ZVN0dWJDYXNlT3V0bGluZShjb25zdCBBaWRsSW50ZXJmYWNlJiBpZmFjZSwgY29uc3QgQWlkbE1ldGhvZCYgbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHRyYW5zYWN0Q29kZU5hbWUsIGJvb2wgb25ld2F5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFN0dWJDbGFzcz4gc3R1YkNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CiAgIHN0ZDo6c3RyaW5nIG91dGxpbmVfbmFtZSA9ICJvblRyYW5zYWN0JCIgKyBtZXRob2QuR2V0TmFtZSgpICsgIiQiOwogICAvLyBHZW5lcmF0ZSBhbiAib3V0bGluZWQiIG1ldGhvZCB3aXRoIHRoZSBhY3R1YWwgY29kZS4KICAgewpAQCAtNTYxLDggKzY3OCw5IEBACiAgICAgb25UcmFuc2FjdF9jYXNlLT5leGNlcHRpb25zLnB1c2hfYmFjaygiYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24iKTsKICAgICBzdHViQ2xhc3MtPmVsZW1lbnRzLnB1c2hfYmFjayhvblRyYW5zYWN0X2Nhc2UpOwogCi0gICAgZ2VuZXJhdGVfc3R1Yl9jb2RlKGlmYWNlLCBtZXRob2QsIG9uZXdheSwgdHJhbnNhY3RfZGF0YSwgdHJhbnNhY3RfcmVwbHksIHR5cGVuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgb25UcmFuc2FjdF9jYXNlLT5zdGF0ZW1lbnRzLCBzdHViQ2xhc3MsIG9wdGlvbnMpOworICAgIEdlbmVyYXRlU3R1YkNvZGUoaWZhY2UsIG1ldGhvZCwgb25ld2F5LCB0cmFuc2FjdF9kYXRhLCB0cmFuc2FjdF9yZXBseSwgdHlwZW5hbWVzLAorICAgICAgICAgICAgICAgICAgICAgb25UcmFuc2FjdF9jYXNlLT5zdGF0ZW1lbnRzLCBvcHRpb25zKTsKKyAgICBvblRyYW5zYWN0X2Nhc2UtPnN0YXRlbWVudHMtPkFkZChzdGQ6Om1ha2Vfc2hhcmVkPFJldHVyblN0YXRlbWVudD4oVFJVRV9WQUxVRSkpOwogICB9CiAKICAgLy8gR2VuZXJhdGUgdGhlIGNhc2UgZGlzcGF0Y2guCkBAIC01NzksMjkgKzY5NywzNiBAQAogICB9CiB9CiAKLXN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8TWV0aG9kPiBnZW5lcmF0ZV9wcm94eV9tZXRob2QoCi0gICAgY29uc3QgQWlkbEludGVyZmFjZSYgaWZhY2UsIGNvbnN0IEFpZGxNZXRob2QmIG1ldGhvZCwgY29uc3Qgc3RkOjpzdHJpbmcmIHRyYW5zYWN0Q29kZU5hbWUsCi0gICAgYm9vbCBvbmV3YXksIHN0ZDo6c2hhcmVkX3B0cjxQcm94eUNsYXNzPiBwcm94eUNsYXNzLCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsCi0gICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxNZXRob2Q+IEdlbmVyYXRlUHJveHlNZXRob2QoY29uc3QgQWlkbEludGVyZmFjZSYgaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsTWV0aG9kJiBtZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdHJhbnNhY3RDb2RlTmFtZSwgYm9vbCBvbmV3YXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UHJveHlDbGFzcz4gcHJveHlDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKICAgYXV0byBwcm94eSA9IHN0ZDo6bWFrZV9zaGFyZWQ8TWV0aG9kPigpOwogICBwcm94eS0+Y29tbWVudCA9IEdlbmVyYXRlQ29tbWVudHMobWV0aG9kKTsKICAgcHJveHktPm1vZGlmaWVycyA9IFBVQkxJQyB8IE9WRVJSSURFOwotICBwcm94eS0+cmV0dXJuVHlwZSA9IEphdmFTaWduYXR1cmVPZihtZXRob2QuR2V0VHlwZSgpLCB0eXBlbmFtZXMpOworICBwcm94eS0+cmV0dXJuVHlwZSA9IEphdmFTaWduYXR1cmVPZihtZXRob2QuR2V0VHlwZSgpKTsKICAgcHJveHktPm5hbWUgPSBtZXRob2QuR2V0TmFtZSgpOwogICBwcm94eS0+c3RhdGVtZW50cyA9IHN0ZDo6bWFrZV9zaGFyZWQ8U3RhdGVtZW50QmxvY2s+KCk7CiAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEFpZGxBcmd1bWVudD4mIGFyZyA6IG1ldGhvZC5HZXRBcmd1bWVudHMoKSkgewogICAgIHByb3h5LT5wYXJhbWV0ZXJzLnB1c2hfYmFjaygKLSAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxWYXJpYWJsZT4oSmF2YVNpZ25hdHVyZU9mKGFyZy0+R2V0VHlwZSgpLCB0eXBlbmFtZXMpLCBhcmctPkdldE5hbWUoKSkpOworICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPFZhcmlhYmxlPihKYXZhU2lnbmF0dXJlT2YoYXJnLT5HZXRUeXBlKCkpLCBhcmctPkdldE5hbWUoKSkpOwogICB9CiAgIHByb3h5LT5leGNlcHRpb25zLnB1c2hfYmFjaygiYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24iKTsKIAogICAvLyB0aGUgcGFyY2VscwogICBhdXRvIF9kYXRhID0gc3RkOjptYWtlX3NoYXJlZDxWYXJpYWJsZT4oImFuZHJvaWQub3MuUGFyY2VsIiwgIl9kYXRhIik7Ci0gIHByb3h5LT5zdGF0ZW1lbnRzLT5BZGQoc3RkOjptYWtlX3NoYXJlZDxWYXJpYWJsZURlY2xhcmF0aW9uPigKLSAgICAgIF9kYXRhLCBzdGQ6Om1ha2Vfc2hhcmVkPE1ldGhvZENhbGw+KCJhbmRyb2lkLm9zLlBhcmNlbCIsICJvYnRhaW4iKSkpOworICBpZiAob3B0aW9ucy5HZW5ScGMoKSkgeworICAgIHByb3h5LT5zdGF0ZW1lbnRzLT5BZGQoc3RkOjptYWtlX3NoYXJlZDxMaXRlcmFsU3RhdGVtZW50PigKKyAgICAgICAgImFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpO1xuIikpOworICB9IGVsc2UgeworICAgIHByb3h5LT5zdGF0ZW1lbnRzLT5BZGQoc3RkOjptYWtlX3NoYXJlZDxMaXRlcmFsU3RhdGVtZW50PigKKyAgICAgICAgImFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7XG4iKSk7CisgIH0KIAogICBpZiAoaWZhY2UuSXNTZW5zaXRpdmVEYXRhKCkpIHsKLSAgICBwcm94eS0+c3RhdGVtZW50cy0+QWRkKHN0ZDo6bWFrZV9zaGFyZWQ8TGl0ZXJhbFN0YXRlbWVudD4oIl9kYXRhLm1hcmtTZW5zaXRpdmUoKTsiKSk7CisgICAgcHJveHktPnN0YXRlbWVudHMtPkFkZChzdGQ6Om1ha2Vfc2hhcmVkPExpdGVyYWxTdGF0ZW1lbnQ+KCJfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7XG4iKSk7CiAgIH0KIAogICBzdGQ6OnNoYXJlZF9wdHI8VmFyaWFibGU+IF9yZXBseSA9IG51bGxwdHI7CkBAIC02NDEsOSArNzY2LDkgQEAKIAogICAvLyB0aGUgcGFyYW1ldGVycwogICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxBaWRsQXJndW1lbnQ+JiBhcmcgOiBtZXRob2QuR2V0QXJndW1lbnRzKCkpIHsKLSAgICBhdXRvIHYgPSBzdGQ6Om1ha2Vfc2hhcmVkPFZhcmlhYmxlPihKYXZhU2lnbmF0dXJlT2YoYXJnLT5HZXRUeXBlKCksIHR5cGVuYW1lcyksIGFyZy0+R2V0TmFtZSgpKTsKKyAgICBhdXRvIHYgPSBzdGQ6Om1ha2Vfc2hhcmVkPFZhcmlhYmxlPihKYXZhU2lnbmF0dXJlT2YoYXJnLT5HZXRUeXBlKCkpLCBhcmctPkdldE5hbWUoKSk7CiAgICAgQWlkbEFyZ3VtZW50OjpEaXJlY3Rpb24gZGlyID0gYXJnLT5HZXREaXJlY3Rpb24oKTsKLSAgICBpZiAoZGlyID09IEFpZGxBcmd1bWVudDo6T1VUX0RJUiAmJiBhcmctPkdldFR5cGUoKS5Jc0FycmF5KCkpIHsKKyAgICBpZiAoZGlyID09IEFpZGxBcmd1bWVudDo6T1VUX0RJUiAmJiBhcmctPkdldFR5cGUoKS5Jc0R5bmFtaWNBcnJheSgpKSB7CiAgICAgICBhdXRvIGNoZWNrbGVuID0gc3RkOjptYWtlX3NoYXJlZDxJZlN0YXRlbWVudD4oKTsKICAgICAgIGNoZWNrbGVuLT5leHByZXNzaW9uID0gc3RkOjptYWtlX3NoYXJlZDxDb21wYXJpc29uPih2LCAiPT0iLCBOVUxMX1ZBTFVFKTsKICAgICAgIGNoZWNrbGVuLT5zdGF0ZW1lbnRzLT5BZGQoc3RkOjptYWtlX3NoYXJlZDxNZXRob2RDYWxsPigKQEAgLTY1NSw4ICs3ODAsOCBAQAogICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxFeHByZXNzaW9uPj57c3RkOjptYWtlX3NoYXJlZDxGaWVsZFZhcmlhYmxlPih2LCAibGVuZ3RoIil9KSk7CiAgICAgICB0cnlTdGF0ZW1lbnQtPnN0YXRlbWVudHMtPkFkZChjaGVja2xlbik7CiAgICAgfSBlbHNlIGlmIChkaXIgJiBBaWRsQXJndW1lbnQ6OklOX0RJUikgewotICAgICAgZ2VuZXJhdGVfd3JpdGVfdG9fcGFyY2VsKGFyZy0+R2V0VHlwZSgpLCB0cnlTdGF0ZW1lbnQtPnN0YXRlbWVudHMsIHYsIF9kYXRhLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZXMpOworICAgICAgR2VuZXJhdGVXcml0ZVRvUGFyY2VsKHRyeVN0YXRlbWVudC0+c3RhdGVtZW50cywgdHlwZW5hbWVzLCBhcmctPkdldFR5cGUoKSwgX2RhdGEtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi0+bmFtZSwgb3B0aW9ucy5HZXRNaW5TZGtWZXJzaW9uKCksIC8qaXNfcmV0dXJuX3ZhbHVlPSovZmFsc2UpOwogICAgIH0KICAgfQogCkBAIC02NzQsNiArNzk5LDE4IEBACiAgIGF1dG8gX3N0YXR1cyA9IHN0ZDo6bWFrZV9zaGFyZWQ8VmFyaWFibGU+KCJib29sZWFuIiwgIl9zdGF0dXMiKTsKICAgdHJ5U3RhdGVtZW50LT5zdGF0ZW1lbnRzLT5BZGQoc3RkOjptYWtlX3NoYXJlZDxWYXJpYWJsZURlY2xhcmF0aW9uPihfc3RhdHVzLCBjYWxsKSk7CiAKKyAgLy8gVE9ETyhiLzE1MTEwMjQ5NCk6IGFubm90YXRpb24gaXMgYXBwbGllZCBvbiB0aGUgcmV0dXJuIHR5cGUKKyAgaWYgKG1ldGhvZC5HZXRUeXBlKCkuSXNQcm9wYWdhdGVBbGxvd0Jsb2NraW5nKCkpIHsKKyAgICBpZiAob3B0aW9ucy5HZXRNaW5TZGtWZXJzaW9uKCkgPCBKQVZBX1BST1BBR0FURV9WRVJTSU9OKSB7CisgICAgICB0cnlTdGF0ZW1lbnQtPnN0YXRlbWVudHMtPkFkZChzdGQ6Om1ha2Vfc2hhcmVkPExpdGVyYWxTdGF0ZW1lbnQ+KAorICAgICAgICAgICJpZiAoYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OLlNES19JTlQgPj0gIiArIHN0ZDo6dG9fc3RyaW5nKEpBVkFfUFJPUEFHQVRFX1ZFUlNJT04pICsKKyAgICAgICAgICAiKSB7IF9yZXBseS5zZXRQcm9wYWdhdGVBbGxvd0Jsb2NraW5nKCk7IH1cbiIpKTsKKyAgICB9IGVsc2UgeworICAgICAgdHJ5U3RhdGVtZW50LT5zdGF0ZW1lbnRzLT5BZGQoCisgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxMaXRlcmFsU3RhdGVtZW50PigiX3JlcGx5LnNldFByb3BhZ2F0ZUFsbG93QmxvY2tpbmcoKTtcbiIpKTsKKyAgICB9CisgIH0KKwogICAvLyBJZiB0aGUgdHJhbnNhY3Rpb24gcmV0dXJucyBmYWxzZSwgd2hpY2ggbWVhbnMgVU5LTk9XTl9UUkFOU0FDVElPTiwgZmFsbCBiYWNrIHRvIHRoZSBsb2NhbAogICAvLyBtZXRob2QgaW4gdGhlIGRlZmF1bHQgaW1wbCwgaWYgc2V0IGJlZm9yZS4gT3RoZXJ3aXNlLCB0aHJvdyBhIFJ1bnRpbWVFeGNlcHRpb24gaWYgdGhlIGludGVyZmFjZQogICAvLyBpcyB2ZXJzaW9uZWQuIFdlIGNhbid0IHRocm93IHRoZSBleGNlcHRpb24gZm9yIHVudmVyc2lvbmVkIGludGVyZmFjZSBiZWNhdXNlIHRoYXQgd291bGQgYmUgYW4KQEAgLTY5NiwxOSArODMzLDI0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKb2luKGFyZ19uYW1lcywgIiwgIikuY19zdHIoKSkpKTsKICAgICBjaGVja0RlZmF1bHRJbXBsLT5zdGF0ZW1lbnRzLT5BZGQoc3RkOjptYWtlX3NoYXJlZDxMaXRlcmFsU3RhdGVtZW50PigicmV0dXJuO1xuIikpOwogICB9CisKKyAgYXV0byBjaGVja1RyYW5zYWN0aW9uRXJyb3IgPSBzdGQ6Om1ha2Vfc2hhcmVkPElmU3RhdGVtZW50PigpOworICBjaGVja1RyYW5zYWN0aW9uRXJyb3ItPmV4cHJlc3Npb24gPSBzdGQ6Om1ha2Vfc2hhcmVkPExpdGVyYWxFeHByZXNzaW9uPigiIV9zdGF0dXMiKTsKKworICBpZiAoaWZhY2UuSXNKYXZhRGVmYXVsdCgpKSB7CisgICAgY2hlY2tUcmFuc2FjdGlvbkVycm9yLT5zdGF0ZW1lbnRzLT5BZGQoY2hlY2tEZWZhdWx0SW1wbCk7CisgIH0KKwogICBpZiAob3B0aW9ucy5WZXJzaW9uKCkgPiAwKSB7Ci0gICAgY2hlY2tEZWZhdWx0SW1wbC0+ZWxzZWlmID0gc3RkOjptYWtlX3NoYXJlZDxJZlN0YXRlbWVudD4oKTsKLSAgICBjaGVja0RlZmF1bHRJbXBsLT5lbHNlaWYtPnN0YXRlbWVudHMtPkFkZCgKKyAgICBjaGVja1RyYW5zYWN0aW9uRXJyb3ItPnN0YXRlbWVudHMtPkFkZCgKICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxMaXRlcmFsU3RhdGVtZW50PihhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGYoCiAgICAgICAgICAgICAidGhyb3cgbmV3IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uKFwiTWV0aG9kICVzIGlzIHVuaW1wbGVtZW50ZWQuXCIpO1xuIiwKICAgICAgICAgICAgIG1ldGhvZC5HZXROYW1lKCkuY19zdHIoKSkpKTsKICAgfQogCi0gIGF1dG8gY2hlY2tUcmFuc2FjdGlvbkVycm9yID0gc3RkOjptYWtlX3NoYXJlZDxJZlN0YXRlbWVudD4oKTsKLSAgY2hlY2tUcmFuc2FjdGlvbkVycm9yLT5leHByZXNzaW9uID0gc3RkOjptYWtlX3NoYXJlZDxMaXRlcmFsRXhwcmVzc2lvbj4oIiFfc3RhdHVzIik7Ci0gIGNoZWNrVHJhbnNhY3Rpb25FcnJvci0+c3RhdGVtZW50cy0+QWRkKGNoZWNrRGVmYXVsdEltcGwpOwotCi0gIHRyeVN0YXRlbWVudC0+c3RhdGVtZW50cy0+QWRkKGNoZWNrVHJhbnNhY3Rpb25FcnJvcik7CisgIGlmIChpZmFjZS5Jc0phdmFEZWZhdWx0KCkgfHwgb3B0aW9ucy5WZXJzaW9uKCkgPiAwKSB7CisgICAgdHJ5U3RhdGVtZW50LT5zdGF0ZW1lbnRzLT5BZGQoY2hlY2tUcmFuc2FjdGlvbkVycm9yKTsKKyAgfQogCiAgIC8vIHRocm93IGJhY2sgZXhjZXB0aW9ucy4KICAgaWYgKF9yZXBseSkgewpAQCAtNzI5LDYgKzg3MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50eXBlID0gbWV0aG9kLkdldFR5cGUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBhcmNlbCA9IF9yZXBseS0+bmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnZhciA9IF9yZXN1bHQtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5taW5fc2RrX3ZlcnNpb24gPSBvcHRpb25zLkdldE1pblNka1ZlcnNpb24oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmlzX2NsYXNzbG9hZGVyX2NyZWF0ZWQgPSAmaXNfY2xhc3Nsb2FkZXJfY3JlYXRlZH07CiAgICAgICBDcmVhdGVGcm9tUGFyY2VsRm9yKGNvbnRleHQpOwogICAgICAgd3JpdGVyLT5DbG9zZSgpOwpAQCAtNzQ1LDYgKzg4OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnR5cGUgPSBhcmctPkdldFR5cGUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGFyY2VsID0gX3JlcGx5LT5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC52YXIgPSBhcmctPkdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWluX3Nka192ZXJzaW9uID0gb3B0aW9ucy5HZXRNaW5TZGtWZXJzaW9uKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmlzX2NsYXNzbG9hZGVyX2NyZWF0ZWQgPSAmaXNfY2xhc3Nsb2FkZXJfY3JlYXRlZH07CiAgICAgICAgIFJlYWRGcm9tUGFyY2VsRm9yKGNvbnRleHQpOwogICAgICAgICB3cml0ZXItPkNsb3NlKCk7CkBAIC03NzAsMTAgKzkxNCwxMCBAQAogICByZXR1cm4gcHJveHk7CiB9CiAKLXN0YXRpYyB2b2lkIGdlbmVyYXRlX21ldGhvZHMoY29uc3QgQWlkbEludGVyZmFjZSYgaWZhY2UsIGNvbnN0IEFpZGxNZXRob2QmIG1ldGhvZCwgQ2xhc3MqIGludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFN0dWJDbGFzcz4gc3R1YkNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UHJveHlDbGFzcz4gcHJveHlDbGFzcywgaW50IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKK3N0YXRpYyB2b2lkIEdlbmVyYXRlTWV0aG9kcyhjb25zdCBBaWRsSW50ZXJmYWNlJiBpZmFjZSwgY29uc3QgQWlkbE1ldGhvZCYgbWV0aG9kLCBDbGFzcyogaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxTdHViQ2xhc3M+IHN0dWJDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UHJveHlDbGFzcz4gcHJveHlDbGFzcywgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgewogICBjb25zdCBib29sIG9uZXdheSA9IG1ldGhvZC5Jc09uZXdheSgpOwogCiAgIC8vID09IHRoZSBUUkFOU0FDVF8gY29uc3RhbnQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC03OTcsNyArOTQxLDcgQEAKICAgLy8gPT0gdGhlIGRlY2xhcmF0aW9uIGluIHRoZSBpbnRlcmZhY2UgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgc3RkOjpzaGFyZWRfcHRyPENsYXNzRWxlbWVudD4gZGVjbDsKICAgaWYgKG1ldGhvZC5Jc1VzZXJEZWZpbmVkKCkpIHsKLSAgICBkZWNsID0gZ2VuZXJhdGVfaW50ZXJmYWNlX21ldGhvZChtZXRob2QsIHR5cGVuYW1lcyk7CisgICAgZGVjbCA9IEdlbmVyYXRlSW50ZXJmYWNlTWV0aG9kKG1ldGhvZCk7CiAgIH0gZWxzZSB7CiAgICAgaWYgKG1ldGhvZC5HZXROYW1lKCkgPT0ga0dldEludGVyZmFjZVZlcnNpb24gJiYgb3B0aW9ucy5WZXJzaW9uKCkgPiAwKSB7CiAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gY29kZTsKQEAgLTgxOSwxNyArOTYzLDE2IEBACiAgICAgYm9vbCBvdXRsaW5lX3N0dWIgPQogICAgICAgICBzdHViQ2xhc3MtPnRyYW5zYWN0X291dGxpbmUgJiYgc3R1YkNsYXNzLT5vdXRsaW5lX21ldGhvZHMuY291bnQoJm1ldGhvZCkgIT0gMDsKICAgICBpZiAob3V0bGluZV9zdHViKSB7Ci0gICAgICBnZW5lcmF0ZV9zdHViX2Nhc2Vfb3V0bGluZShpZmFjZSwgbWV0aG9kLCB0cmFuc2FjdENvZGVOYW1lLCBvbmV3YXksIHN0dWJDbGFzcywgdHlwZW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyk7CisgICAgICBHZW5lcmF0ZVN0dWJDYXNlT3V0bGluZShpZmFjZSwgbWV0aG9kLCB0cmFuc2FjdENvZGVOYW1lLCBvbmV3YXksIHN0dWJDbGFzcywgdHlwZW5hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyk7CiAgICAgfSBlbHNlIHsKLSAgICAgIGdlbmVyYXRlX3N0dWJfY2FzZShpZmFjZSwgbWV0aG9kLCB0cmFuc2FjdENvZGVOYW1lLCBvbmV3YXksIHN0dWJDbGFzcywgdHlwZW5hbWVzLCBvcHRpb25zKTsKKyAgICAgIEdlbmVyYXRlU3R1YkNhc2UoaWZhY2UsIG1ldGhvZCwgdHJhbnNhY3RDb2RlTmFtZSwgb25ld2F5LCBzdHViQ2xhc3MsIHR5cGVuYW1lcywgb3B0aW9ucyk7CiAgICAgfQogICB9IGVsc2UgewogICAgIGlmIChtZXRob2QuR2V0TmFtZSgpID09IGtHZXRJbnRlcmZhY2VWZXJzaW9uICYmIG9wdGlvbnMuVmVyc2lvbigpID4gMCkgewogICAgICAgYXV0byBjID0gc3RkOjptYWtlX3NoYXJlZDxDYXNlPih0cmFuc2FjdENvZGVOYW1lKTsKICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBjb2RlOwotICAgICAgY29kZSA8PCAiZGF0YS5lbmZvcmNlSW50ZXJmYWNlKGRlc2NyaXB0b3IpO1xuIgotICAgICAgICAgICA8PCAicmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpO1xuIgorICAgICAgY29kZSA8PCAicmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpO1xuIgogICAgICAgICAgICA8PCAicmVwbHkud3JpdGVJbnQoIiA8PCBrR2V0SW50ZXJmYWNlVmVyc2lvbiA8PCAiKCkpO1xuIgogICAgICAgICAgICA8PCAicmV0dXJuIHRydWU7XG4iOwogICAgICAgYy0+c3RhdGVtZW50cy0+QWRkKHN0ZDo6bWFrZV9zaGFyZWQ8TGl0ZXJhbFN0YXRlbWVudD4oY29kZS5zdHIoKSkpOwpAQCAtODM4LDggKzk4MSw3IEBACiAgICAgaWYgKG1ldGhvZC5HZXROYW1lKCkgPT0ga0dldEludGVyZmFjZUhhc2ggJiYgIW9wdGlvbnMuSGFzaCgpLmVtcHR5KCkpIHsKICAgICAgIGF1dG8gYyA9IHN0ZDo6bWFrZV9zaGFyZWQ8Q2FzZT4odHJhbnNhY3RDb2RlTmFtZSk7CiAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gY29kZTsKLSAgICAgIGNvZGUgPDwgImRhdGEuZW5mb3JjZUludGVyZmFjZShkZXNjcmlwdG9yKTtcbiIKLSAgICAgICAgICAgPDwgInJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTtcbiIKKyAgICAgIGNvZGUgPDwgInJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTtcbiIKICAgICAgICAgICAgPDwgInJlcGx5LndyaXRlU3RyaW5nKCIgPDwga0dldEludGVyZmFjZUhhc2ggPDwgIigpKTtcbiIKICAgICAgICAgICAgPDwgInJldHVybiB0cnVlO1xuIjsKICAgICAgIGMtPnN0YXRlbWVudHMtPkFkZChzdGQ6Om1ha2Vfc2hhcmVkPExpdGVyYWxTdGF0ZW1lbnQ+KGNvZGUuc3RyKCkpKTsKQEAgLTg1MCw4ICs5OTIsOCBAQAogICAvLyA9PSB0aGUgcHJveHkgbWV0aG9kID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICBzdGQ6OnNoYXJlZF9wdHI8Q2xhc3NFbGVtZW50PiBwcm94eSA9IG51bGxwdHI7CiAgIGlmIChtZXRob2QuSXNVc2VyRGVmaW5lZCgpKSB7Ci0gICAgcHJveHkgPSBnZW5lcmF0ZV9wcm94eV9tZXRob2QoaWZhY2UsIG1ldGhvZCwgdHJhbnNhY3RDb2RlTmFtZSwgb25ld2F5LCBwcm94eUNsYXNzLCB0eXBlbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyk7CisgICAgcHJveHkgPSBHZW5lcmF0ZVByb3h5TWV0aG9kKGlmYWNlLCBtZXRob2QsIHRyYW5zYWN0Q29kZU5hbWUsIG9uZXdheSwgcHJveHlDbGFzcywgdHlwZW5hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zKTsKIAogICB9IGVsc2UgewogICAgIGlmIChtZXRob2QuR2V0TmFtZSgpID09IGtHZXRJbnRlcmZhY2VWZXJzaW9uICYmIG9wdGlvbnMuVmVyc2lvbigpID4gMCkgewpAQCAtODYwLDE5ICsxMDAyLDI1IEBACiAgICAgICAgICAgIDw8ICJwdWJsaWMgaW50ICIgPDwga0dldEludGVyZmFjZVZlcnNpb24gPDwgIigpIgogICAgICAgICAgICA8PCAiIHRocm93cyAiCiAgICAgICAgICAgIDw8ICJhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbiB7XG4iCi0gICAgICAgICAgIDw8ICIgIGlmIChtQ2FjaGVkVmVyc2lvbiA9PSAtMSkge1xuIgotICAgICAgICAgICA8PCAiICAgIGFuZHJvaWQub3MuUGFyY2VsIGRhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTtcbiIKLSAgICAgICAgICAgPDwgIiAgICBhbmRyb2lkLm9zLlBhcmNlbCByZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpO1xuIgorICAgICAgICAgICA8PCAiICBpZiAobUNhY2hlZFZlcnNpb24gPT0gLTEpIHtcbiI7CisgICAgICBpZiAob3B0aW9ucy5HZW5ScGMoKSkgeworICAgICAgICBjb2RlIDw8ICIgICAgYW5kcm9pZC5vcy5QYXJjZWwgZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbihhc0JpbmRlcigpKTtcbiI7CisgICAgICB9IGVsc2UgeworICAgICAgICBjb2RlIDw8ICIgICAgYW5kcm9pZC5vcy5QYXJjZWwgZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpO1xuIjsKKyAgICAgIH0KKyAgICAgIGNvZGUgPDwgIiAgICBhbmRyb2lkLm9zLlBhcmNlbCByZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpO1xuIgogICAgICAgICAgICA8PCAiICAgIHRyeSB7XG4iCiAgICAgICAgICAgIDw8ICIgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7XG4iCiAgICAgICAgICAgIDw8ICIgICAgICBib29sZWFuIF9zdGF0dXMgPSBtUmVtb3RlLnRyYW5zYWN0KFN0dWIuIiA8PCB0cmFuc2FjdENvZGVOYW1lIDw8ICIsICIKLSAgICAgICAgICAgPDwgImRhdGEsIHJlcGx5LCAwKTtcbiIKLSAgICAgICAgICAgPDwgIiAgICAgIGlmICghX3N0YXR1cykge1xuIgotICAgICAgICAgICA8PCAiICAgICAgICBpZiAoZ2V0RGVmYXVsdEltcGwoKSAhPSBudWxsKSB7XG4iCi0gICAgICAgICAgIDw8ICIgICAgICAgICAgcmV0dXJuIGdldERlZmF1bHRJbXBsKCkuZ2V0SW50ZXJmYWNlVmVyc2lvbigpO1xuIgotICAgICAgICAgICA8PCAiICAgICAgICB9XG4iCi0gICAgICAgICAgIDw8ICIgICAgICB9XG4iCi0gICAgICAgICAgIDw8ICIgICAgICByZXBseS5yZWFkRXhjZXB0aW9uKCk7XG4iCisgICAgICAgICAgIDw8ICJkYXRhLCByZXBseSwgMCk7XG4iOworICAgICAgaWYgKGlmYWNlLklzSmF2YURlZmF1bHQoKSkgeworICAgICAgICBjb2RlIDw8ICIgICAgICBpZiAoIV9zdGF0dXMpIHtcbiIKKyAgICAgICAgICAgICA8PCAiICAgICAgICBpZiAoZ2V0RGVmYXVsdEltcGwoKSAhPSBudWxsKSB7XG4iCisgICAgICAgICAgICAgPDwgIiAgICAgICAgICByZXR1cm4gZ2V0RGVmYXVsdEltcGwoKS5nZXRJbnRlcmZhY2VWZXJzaW9uKCk7XG4iCisgICAgICAgICAgICAgPDwgIiAgICAgICAgfVxuIgorICAgICAgICAgICAgIDw8ICIgICAgICB9XG4iOworICAgICAgfQorICAgICAgY29kZSA8PCAiICAgICAgcmVwbHkucmVhZEV4Y2VwdGlvbigpO1xuIgogICAgICAgICAgICA8PCAiICAgICAgbUNhY2hlZFZlcnNpb24gPSByZXBseS5yZWFkSW50KCk7XG4iCiAgICAgICAgICAgIDw8ICIgICAgfSBmaW5hbGx5IHtcbiIKICAgICAgICAgICAgPDwgIiAgICAgIHJlcGx5LnJlY3ljbGUoKTtcbiIKQEAgLTg4OSwxOSArMTAzNywyNSBAQAogICAgICAgICAgICA8PCAicHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgIiA8PCBrR2V0SW50ZXJmYWNlSGFzaCA8PCAiKCkiCiAgICAgICAgICAgIDw8ICIgdGhyb3dzICIKICAgICAgICAgICAgPDwgImFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uIHtcbiIKLSAgICAgICAgICAgPDwgIiAgaWYgKFwiLTFcIi5lcXVhbHMobUNhY2hlZEhhc2gpKSB7XG4iCi0gICAgICAgICAgIDw8ICIgICAgYW5kcm9pZC5vcy5QYXJjZWwgZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpO1xuIgotICAgICAgICAgICA8PCAiICAgIGFuZHJvaWQub3MuUGFyY2VsIHJlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7XG4iCisgICAgICAgICAgIDw8ICIgIGlmIChcIi0xXCIuZXF1YWxzKG1DYWNoZWRIYXNoKSkge1xuIjsKKyAgICAgIGlmIChvcHRpb25zLkdlblJwYygpKSB7CisgICAgICAgIGNvZGUgPDwgIiAgICBhbmRyb2lkLm9zLlBhcmNlbCBkYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpO1xuIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvZGUgPDwgIiAgICBhbmRyb2lkLm9zLlBhcmNlbCBkYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7XG4iOworICAgICAgfQorICAgICAgY29kZSA8PCAiICAgIGFuZHJvaWQub3MuUGFyY2VsIHJlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7XG4iCiAgICAgICAgICAgIDw8ICIgICAgdHJ5IHtcbiIKICAgICAgICAgICAgPDwgIiAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTtcbiIKICAgICAgICAgICAgPDwgIiAgICAgIGJvb2xlYW4gX3N0YXR1cyA9IG1SZW1vdGUudHJhbnNhY3QoU3R1Yi4iIDw8IHRyYW5zYWN0Q29kZU5hbWUgPDwgIiwgIgotICAgICAgICAgICA8PCAiZGF0YSwgcmVwbHksIDApO1xuIgotICAgICAgICAgICA8PCAiICAgICAgaWYgKCFfc3RhdHVzKSB7XG4iCi0gICAgICAgICAgIDw8ICIgICAgICAgIGlmIChnZXREZWZhdWx0SW1wbCgpICE9IG51bGwpIHtcbiIKLSAgICAgICAgICAgPDwgIiAgICAgICAgICByZXR1cm4gZ2V0RGVmYXVsdEltcGwoKS5nZXRJbnRlcmZhY2VIYXNoKCk7XG4iCi0gICAgICAgICAgIDw8ICIgICAgICAgIH1cbiIKLSAgICAgICAgICAgPDwgIiAgICAgIH1cbiIKLSAgICAgICAgICAgPDwgIiAgICAgIHJlcGx5LnJlYWRFeGNlcHRpb24oKTtcbiIKKyAgICAgICAgICAgPDwgImRhdGEsIHJlcGx5LCAwKTtcbiI7CisgICAgICBpZiAoaWZhY2UuSXNKYXZhRGVmYXVsdCgpKSB7CisgICAgICAgIGNvZGUgPDwgIiAgICAgIGlmICghX3N0YXR1cykge1xuIgorICAgICAgICAgICAgIDw8ICIgICAgICAgIGlmIChnZXREZWZhdWx0SW1wbCgpICE9IG51bGwpIHtcbiIKKyAgICAgICAgICAgICA8PCAiICAgICAgICAgIHJldHVybiBnZXREZWZhdWx0SW1wbCgpLmdldEludGVyZmFjZUhhc2goKTtcbiIKKyAgICAgICAgICAgICA8PCAiICAgICAgICB9XG4iCisgICAgICAgICAgICAgPDwgIiAgICAgIH1cbiI7CisgICAgICB9CisgICAgICBjb2RlIDw8ICIgICAgICByZXBseS5yZWFkRXhjZXB0aW9uKCk7XG4iCiAgICAgICAgICAgIDw8ICIgICAgICBtQ2FjaGVkSGFzaCA9IHJlcGx5LnJlYWRTdHJpbmcoKTtcbiIKICAgICAgICAgICAgPDwgIiAgICB9IGZpbmFsbHkge1xuIgogICAgICAgICAgICA8PCAiICAgICAgcmVwbHkucmVjeWNsZSgpO1xuIgpAQCAtOTE4LDE0ICsxMDcyLDE0IEBACiAgIH0KIH0KIAotc3RhdGljIHZvaWQgZ2VuZXJhdGVfaW50ZXJmYWNlX2Rlc2NyaXB0b3JzKGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsIGNvbnN0IEFpZGxJbnRlcmZhY2UqIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzKiBpbnRlcmZhY2UsIHN0ZDo6c2hhcmVkX3B0cjxTdHViQ2xhc3M+IHN0dWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFByb3h5Q2xhc3M+IHByb3h5KSB7CitzdGF0aWMgdm9pZCBHZW5lcmF0ZUludGVyZmFjZURlc2NyaXB0b3JzKGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsIGNvbnN0IEFpZGxJbnRlcmZhY2UqIGlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyogaW50ZXJmYWNlLCBzdGQ6OnNoYXJlZF9wdHI8U3R1YkNsYXNzPiBzdHViLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UHJveHlDbGFzcz4gcHJveHkpIHsKICAgLy8gdGhlIGludGVyZmFjZSBkZXNjcmlwdG9yIHRyYW5zYWN0aW9uIGhhbmRsZXIKICAgYXV0byBjID0gc3RkOjptYWtlX3NoYXJlZDxDYXNlPigiSU5URVJGQUNFX1RSQU5TQUNUSU9OIik7CiAgIGMtPnN0YXRlbWVudHMtPkFkZChzdGQ6Om1ha2Vfc2hhcmVkPE1ldGhvZENhbGw+KAogICAgICAgc3R1Yi0+dHJhbnNhY3RfcmVwbHksICJ3cml0ZVN0cmluZyIsCi0gICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8RXhwcmVzc2lvbj4+e3N0dWItPmdldF90cmFuc2FjdF9kZXNjcmlwdG9yKG51bGxwdHIpfSkpOworICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEV4cHJlc3Npb24+PntzdHViLT5HZXRUcmFuc2FjdERlc2NyaXB0b3IobnVsbHB0cil9KSk7CiAgIGMtPnN0YXRlbWVudHMtPkFkZChzdGQ6Om1ha2Vfc2hhcmVkPFJldHVyblN0YXRlbWVudD4oVFJVRV9WQUxVRSkpOwogICBzdHViLT50cmFuc2FjdF9zd2l0Y2hfbWV0YS0+Y2FzZXMucHVzaF9iYWNrKGMpOwogCkBAIC05NzMsOSArMTEyNyw4IEBACiAvLyBudW1iZXIgb2YgbWV0aG9kcyBub3Qgb3V0bGluZWQgKGFyZSBrZXB0IGluIHRoZSBvblRyYW5zYWN0KCkgbWV0aG9kKS4KIC8vCiAvLyBSZXF1aXJlbWVudHM6IG5vbl9vdXRsaW5lX2NvdW50IDw9IG91dGxpbmVfdGhyZXNob2xkLgotc3RhdGljIHZvaWQgY29tcHV0ZV9vdXRsaW5lX21ldGhvZHMoY29uc3QgQWlkbEludGVyZmFjZSogaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8U3R1YkNsYXNzPiBzdHViLCBzaXplX3Qgb3V0bGluZV90aHJlc2hvbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgbm9uX291dGxpbmVfY291bnQpIHsKK3N0YXRpYyB2b2lkIENvbXB1dGVPdXRsaW5lTWV0aG9kcyhjb25zdCBBaWRsSW50ZXJmYWNlKiBpZmFjZSwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFN0dWJDbGFzcz4gc3R1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgb3V0bGluZV90aHJlc2hvbGQsIHNpemVfdCBub25fb3V0bGluZV9jb3VudCkgewogICBBSURMX0ZBVEFMX0lGKG5vbl9vdXRsaW5lX2NvdW50ID4gb3V0bGluZV90aHJlc2hvbGQsIGlmYWNlKTsKICAgLy8gV2UnbGwgb3V0bGluZSAoY3JlYXRlIHN1YiBtZXRob2RzKSBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuIG1pbl9tZXRob2RzCiAgIC8vIGNhc2VzLgpAQCAtMTAwMCwzMSArMTE1MywyOSBAQAogICB9CiB9CiAKLXN0YXRpYyBzaGFyZWRfcHRyPENsYXNzRWxlbWVudD4gZ2VuZXJhdGVfZGVmYXVsdF9pbXBsX21ldGhvZChjb25zdCBBaWRsTWV0aG9kJiBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzKSB7CitzdGF0aWMgc2hhcmVkX3B0cjxDbGFzc0VsZW1lbnQ+IEdlbmVyYXRlRGVmYXVsdEltcGxNZXRob2QoY29uc3QgQWlkbE1ldGhvZCYgbWV0aG9kKSB7CiAgIGF1dG8gZGVmYXVsdF9tZXRob2QgPSBzdGQ6Om1ha2Vfc2hhcmVkPE1ldGhvZD4oKTsKICAgZGVmYXVsdF9tZXRob2QtPmNvbW1lbnQgPSBHZW5lcmF0ZUNvbW1lbnRzKG1ldGhvZCk7CiAgIGRlZmF1bHRfbWV0aG9kLT5tb2RpZmllcnMgPSBQVUJMSUMgfCBPVkVSUklERTsKLSAgZGVmYXVsdF9tZXRob2QtPnJldHVyblR5cGUgPSBKYXZhU2lnbmF0dXJlT2YobWV0aG9kLkdldFR5cGUoKSwgdHlwZW5hbWVzKTsKKyAgZGVmYXVsdF9tZXRob2QtPnJldHVyblR5cGUgPSBKYXZhU2lnbmF0dXJlT2YobWV0aG9kLkdldFR5cGUoKSk7CiAgIGRlZmF1bHRfbWV0aG9kLT5uYW1lID0gbWV0aG9kLkdldE5hbWUoKTsKICAgZGVmYXVsdF9tZXRob2QtPnN0YXRlbWVudHMgPSBzdGQ6Om1ha2Vfc2hhcmVkPFN0YXRlbWVudEJsb2NrPigpOwogICBmb3IgKGNvbnN0IGF1dG8mIGFyZyA6IG1ldGhvZC5HZXRBcmd1bWVudHMoKSkgewogICAgIGRlZmF1bHRfbWV0aG9kLT5wYXJhbWV0ZXJzLnB1c2hfYmFjaygKLSAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxWYXJpYWJsZT4oSmF2YVNpZ25hdHVyZU9mKGFyZy0+R2V0VHlwZSgpLCB0eXBlbmFtZXMpLCBhcmctPkdldE5hbWUoKSkpOworICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPFZhcmlhYmxlPihKYXZhU2lnbmF0dXJlT2YoYXJnLT5HZXRUeXBlKCkpLCBhcmctPkdldE5hbWUoKSkpOwogICB9CiAgIGRlZmF1bHRfbWV0aG9kLT5leGNlcHRpb25zLnB1c2hfYmFjaygiYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24iKTsKIAogICBpZiAobWV0aG9kLkdldFR5cGUoKS5HZXROYW1lKCkgIT0gInZvaWQiKSB7Ci0gICAgY29uc3Qgc3RyaW5nJiBkZWZhdWx0VmFsdWUgPSBEZWZhdWx0SmF2YVZhbHVlT2YobWV0aG9kLkdldFR5cGUoKSwgdHlwZW5hbWVzKTsKKyAgICBjb25zdCBzdHJpbmcmIGRlZmF1bHRWYWx1ZSA9IERlZmF1bHRKYXZhVmFsdWVPZihtZXRob2QuR2V0VHlwZSgpKTsKICAgICBkZWZhdWx0X21ldGhvZC0+c3RhdGVtZW50cy0+QWRkKAogICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPExpdGVyYWxTdGF0ZW1lbnQ+KFN0cmluZ1ByaW50ZigicmV0dXJuICVzO1xuIiwgZGVmYXVsdFZhbHVlLmNfc3RyKCkpKSk7CiAgIH0KICAgcmV0dXJuIGRlZmF1bHRfbWV0aG9kOwogfQogCi1zdGF0aWMgc2hhcmVkX3B0cjxDbGFzcz4gZ2VuZXJhdGVfZGVmYXVsdF9pbXBsX2NsYXNzKGNvbnN0IEFpZGxJbnRlcmZhY2UmIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKK3N0YXRpYyBzaGFyZWRfcHRyPENsYXNzPiBHZW5lcmF0ZURlZmF1bHRJbXBsQ2xhc3MoY29uc3QgQWlkbEludGVyZmFjZSYgaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKICAgYXV0byBkZWZhdWx0X2NsYXNzID0gc3RkOjptYWtlX3NoYXJlZDxDbGFzcz4oKTsKICAgZGVmYXVsdF9jbGFzcy0+Y29tbWVudCA9ICIvKiogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3IgIiArIGlmYWNlLkdldE5hbWUoKSArICIuICovIjsKICAgZGVmYXVsdF9jbGFzcy0+bW9kaWZpZXJzID0gUFVCTElDIHwgU1RBVElDOwpAQCAtMTAzNCw3ICsxMTg1LDcgQEAKIAogICBmb3IgKGNvbnN0IGF1dG8mIG0gOiBpZmFjZS5HZXRNZXRob2RzKCkpIHsKICAgICBpZiAobS0+SXNVc2VyRGVmaW5lZCgpKSB7Ci0gICAgICBkZWZhdWx0X2NsYXNzLT5lbGVtZW50cy5lbXBsYWNlX2JhY2soZ2VuZXJhdGVfZGVmYXVsdF9pbXBsX21ldGhvZCgqbSwgdHlwZW5hbWVzKSk7CisgICAgICBkZWZhdWx0X2NsYXNzLT5lbGVtZW50cy5lbXBsYWNlX2JhY2soR2VuZXJhdGVEZWZhdWx0SW1wbE1ldGhvZCgqbSkpOwogICAgIH0gZWxzZSB7CiAgICAgICAvLyBUaGVzZSBhcmUgY2FsbGVkIG9ubHkgd2hlbiB0aGUgcmVtb3RlIHNpZGUgZG9lcyBub3QgaW1wbGVtZW50IHRoZXNlCiAgICAgICAvLyBtZXRob2RzLCB3aGljaCBpcyBub3JtYWxseSBpbXBvc3NpYmxlLCBiZWNhdXNlIHRoZXNlIG1ldGhvZHMgYXJlCkBAIC0xMDcwLDkgKzEyMjEsOTkgQEAKICAgcmV0dXJuIGRlZmF1bHRfY2xhc3M7CiB9CiAKLXN0ZDo6dW5pcXVlX3B0cjxDbGFzcz4gZ2VuZXJhdGVfYmluZGVyX2ludGVyZmFjZV9jbGFzcyhjb25zdCBBaWRsSW50ZXJmYWNlKiBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworc3RhdGljIHNoYXJlZF9wdHI8Q2xhc3NFbGVtZW50PiBHZW5lcmF0ZURlbGVnYXRvck1ldGhvZChjb25zdCBBaWRsTWV0aG9kJiBtZXRob2QpIHsKKyAgYXV0byBkZWxlZ2F0b3JfbWV0aG9kID0gc3RkOjptYWtlX3NoYXJlZDxNZXRob2Q+KCk7CisgIGRlbGVnYXRvcl9tZXRob2QtPmNvbW1lbnQgPSBHZW5lcmF0ZUNvbW1lbnRzKG1ldGhvZCk7CisgIGRlbGVnYXRvcl9tZXRob2QtPm1vZGlmaWVycyA9IFBVQkxJQyB8IE9WRVJSSURFOworICBkZWxlZ2F0b3JfbWV0aG9kLT5yZXR1cm5UeXBlID0gSmF2YVNpZ25hdHVyZU9mKG1ldGhvZC5HZXRUeXBlKCkpOworICBkZWxlZ2F0b3JfbWV0aG9kLT5uYW1lID0gbWV0aG9kLkdldE5hbWUoKTsKKyAgZGVsZWdhdG9yX21ldGhvZC0+c3RhdGVtZW50cyA9IHN0ZDo6bWFrZV9zaGFyZWQ8U3RhdGVtZW50QmxvY2s+KCk7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBhcmdOYW1lczsKKyAgZm9yIChjb25zdCBhdXRvJiBhcmcgOiBtZXRob2QuR2V0QXJndW1lbnRzKCkpIHsKKyAgICBkZWxlZ2F0b3JfbWV0aG9kLT5wYXJhbWV0ZXJzLnB1c2hfYmFjaygKKyAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxWYXJpYWJsZT4oSmF2YVNpZ25hdHVyZU9mKGFyZy0+R2V0VHlwZSgpKSwgYXJnLT5HZXROYW1lKCkpKTsKKyAgICBhcmdOYW1lcy5wdXNoX2JhY2soYXJnLT5HZXROYW1lKCkpOworICB9CisgIGRlbGVnYXRvcl9tZXRob2QtPmV4Y2VwdGlvbnMucHVzaF9iYWNrKCJhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbiIpOworCisgIHN0ZDo6c3RyaW5nIHJldHVybl9zdHI7CisgIGlmIChtZXRob2QuR2V0VHlwZSgpLkdldE5hbWUoKSAhPSAidm9pZCIpIHsKKyAgICByZXR1cm5fc3RyID0gInJldHVybiAiOworICB9CisgIGRlbGVnYXRvcl9tZXRob2QtPnN0YXRlbWVudHMtPkFkZCgKKyAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8TGl0ZXJhbFN0YXRlbWVudD4ocmV0dXJuX3N0ciArICJtSW1wbC4iICsgbWV0aG9kLkdldE5hbWUoKSArICIoIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OkpvaW4oYXJnTmFtZXMsICIsIikgKyAiKTtcbiIpKTsKKyAgcmV0dXJuIGRlbGVnYXRvcl9tZXRob2Q7Cit9CisKK3N0YXRpYyBzaGFyZWRfcHRyPENsYXNzPiBHZW5lcmF0ZURlbGVnYXRvckNsYXNzKGNvbnN0IEFpZGxJbnRlcmZhY2UmIGlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICBhdXRvIGRlbGVnYXRvcl9jbGFzcyA9IHN0ZDo6bWFrZV9zaGFyZWQ8Q2xhc3M+KCk7CisgIGRlbGVnYXRvcl9jbGFzcy0+Y29tbWVudCA9ICIvKiogRGVsZWdhdG9yIGltcGxlbWVudGF0aW9uIGZvciAiICsgaWZhY2UuR2V0TmFtZSgpICsgIi4gKi8iOworICBkZWxlZ2F0b3JfY2xhc3MtPm1vZGlmaWVycyA9IFBVQkxJQyB8IFNUQVRJQzsKKyAgZGVsZWdhdG9yX2NsYXNzLT53aGF0ID0gQ2xhc3M6OkNMQVNTOworICBkZWxlZ2F0b3JfY2xhc3MtPnR5cGUgPSBpZmFjZS5HZXRDYW5vbmljYWxOYW1lKCkgKyAiLkRlbGVnYXRvciI7CisgIGRlbGVnYXRvcl9jbGFzcy0+ZXh0ZW5kcyA9IGlmYWNlLkdldENhbm9uaWNhbE5hbWUoKSArICIuU3R1YiI7CisKKyAgLy8gY29uc3RydWN0b3IKKyAgZGVsZWdhdG9yX2NsYXNzLT5lbGVtZW50cy5lbXBsYWNlX2JhY2soCisgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPExpdGVyYWxDbGFzc0VsZW1lbnQ+KCJwdWJsaWMgRGVsZWdhdG9yKCIgKyBpZmFjZS5HZXRDYW5vbmljYWxOYW1lKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGltcGwpIHtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgdGhpcy5tSW1wbCA9IGltcGw7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9XG4iKSk7CisgIC8vIG1ldGEgbWV0aG9kcworICBpZiAoIW9wdGlvbnMuSGFzaCgpLmVtcHR5KCkpIHsKKyAgICBkZWxlZ2F0b3JfY2xhc3MtPmVsZW1lbnRzLmVtcGxhY2VfYmFjaygKKyAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxMaXRlcmFsQ2xhc3NFbGVtZW50PigiQE92ZXJyaWRlXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInB1YmxpYyBTdHJpbmcgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0dldEludGVyZmFjZUhhc2ggKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24ge1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIHJldHVybiBtSW1wbC4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrR2V0SW50ZXJmYWNlSGFzaCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIigpO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9XG4iKSk7CisgIH0KKyAgaWYgKG9wdGlvbnMuVmVyc2lvbigpID4gMCkgeworICAgIGRlbGVnYXRvcl9jbGFzcy0+ZWxlbWVudHMuZW1wbGFjZV9iYWNrKAorICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPExpdGVyYWxDbGFzc0VsZW1lbnQ+KCJAT3ZlcnJpZGVcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHVibGljIGludCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrR2V0SW50ZXJmYWNlVmVyc2lvbiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIigpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbiB7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgaW50IGltcGxWZXIgPSBtSW1wbC4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrR2V0SW50ZXJmYWNlVmVyc2lvbiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIigpO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIHJldHVybiBWRVJTSU9OIDwgaW1wbFZlciA/IFZFUlNJT04gOiBpbXBsVmVyO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9XG4iKSk7CisgIH0KKworICAvLyB1c2VyIGRlZmluZWQgbWV0aG9kcworICBmb3IgKGNvbnN0IGF1dG8mIG0gOiBpZmFjZS5HZXRNZXRob2RzKCkpIHsKKyAgICBpZiAobS0+SXNVc2VyRGVmaW5lZCgpKSB7CisgICAgICBkZWxlZ2F0b3JfY2xhc3MtPmVsZW1lbnRzLmVtcGxhY2VfYmFjayhHZW5lcmF0ZURlbGVnYXRvck1ldGhvZCgqbSkpOworICAgIH0KKyAgfQorCisgIGRlbGVnYXRvcl9jbGFzcy0+ZWxlbWVudHMuZW1wbGFjZV9iYWNrKAorICAgICAgc3RkOjptYWtlX3NoYXJlZDxMaXRlcmFsQ2xhc3NFbGVtZW50PihpZmFjZS5HZXRDYW5vbmljYWxOYW1lKCkgKyAiIG1JbXBsO1xuIikpOworCisgIHJldHVybiBkZWxlZ2F0b3JfY2xhc3M7Cit9CisKK3N0YXRpYyBzaGFyZWRfcHRyPENsYXNzRWxlbWVudD4gR2VuZXJhdGVNYXhUcmFuc2FjdGlvbklkKGludCBtYXhfdHJhbnNhY3Rpb25faWQpIHsKKyAgYXV0byBnZXRNYXhUcmFuc2FjdGlvbklkID0gc3RkOjptYWtlX3NoYXJlZDxNZXRob2Q+KCk7CisgIGdldE1heFRyYW5zYWN0aW9uSWQtPmNvbW1lbnQgPSAiLyoqIEBoaWRlICovIjsKKyAgZ2V0TWF4VHJhbnNhY3Rpb25JZC0+bW9kaWZpZXJzID0gUFVCTElDOworICBnZXRNYXhUcmFuc2FjdGlvbklkLT5yZXR1cm5UeXBlID0gImludCI7CisgIGdldE1heFRyYW5zYWN0aW9uSWQtPm5hbWUgPSAiZ2V0TWF4VHJhbnNhY3Rpb25JZCI7CisgIGdldE1heFRyYW5zYWN0aW9uSWQtPnN0YXRlbWVudHMgPSBzdGQ6Om1ha2Vfc2hhcmVkPFN0YXRlbWVudEJsb2NrPigpOworICBnZXRNYXhUcmFuc2FjdGlvbklkLT5zdGF0ZW1lbnRzLT5BZGQoc3RkOjptYWtlX3NoYXJlZDxSZXR1cm5TdGF0ZW1lbnQ+KAorICAgICAgc3RkOjptYWtlX3NoYXJlZDxMaXRlcmFsRXhwcmVzc2lvbj4oc3RkOjp0b19zdHJpbmcobWF4X3RyYW5zYWN0aW9uX2lkKSkpKTsKKyAgcmV0dXJuIGdldE1heFRyYW5zYWN0aW9uSWQ7Cit9CisKK3N0ZDo6dW5pcXVlX3B0cjxDbGFzcz4gR2VuZXJhdGVJbnRlcmZhY2VDbGFzcyhjb25zdCBBaWRsSW50ZXJmYWNlKiBpZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgewogICAvLyB0aGUgaW50ZXJmYWNlIGNsYXNzCiAgIGF1dG8gaW50ZXJmYWNlID0gc3RkOjptYWtlX3VuaXF1ZTxDbGFzcz4oKTsKICAgaW50ZXJmYWNlLT5jb21tZW50ID0gR2VuZXJhdGVDb21tZW50cygqaWZhY2UpOwpAQCAtMTEwMCw3MSArMTM0MSw5OCBAQAogICB9CiAKICAgLy8gdGhlIGRlZmF1bHQgaW1wbCBjbGFzcwotICBhdXRvIGRlZmF1bHRfaW1wbCA9IGdlbmVyYXRlX2RlZmF1bHRfaW1wbF9jbGFzcygqaWZhY2UsIHR5cGVuYW1lcywgb3B0aW9ucyk7CisgIGF1dG8gZGVmYXVsdF9pbXBsID0gR2VuZXJhdGVEZWZhdWx0SW1wbENsYXNzKCppZmFjZSwgb3B0aW9ucyk7CiAgIGludGVyZmFjZS0+ZWxlbWVudHMuZW1wbGFjZV9iYWNrKGRlZmF1bHRfaW1wbCk7CiAKKyAgLy8gdGhlIGRlbGVnYXRvciBjbGFzcworICBpZiAoaWZhY2UtPklzSmF2YURlbGVnYXRvcigpKSB7CisgICAgYXV0byBkZWxlZ2F0b3IgPSBHZW5lcmF0ZURlbGVnYXRvckNsYXNzKCppZmFjZSwgb3B0aW9ucyk7CisgICAgaW50ZXJmYWNlLT5lbGVtZW50cy5lbXBsYWNlX2JhY2soZGVsZWdhdG9yKTsKKyAgfQorCiAgIC8vIHRoZSBzdHViIGlubmVyIGNsYXNzCiAgIGF1dG8gc3R1YiA9IHN0ZDo6bWFrZV9zaGFyZWQ8U3R1YkNsYXNzPihpZmFjZSwgb3B0aW9ucyk7CiAgIGludGVyZmFjZS0+ZWxlbWVudHMucHVzaF9iYWNrKHN0dWIpOwogCi0gIGNvbXB1dGVfb3V0bGluZV9tZXRob2RzKGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdHViLAotICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLm9uVHJhbnNhY3Rfb3V0bGluZV90aHJlc2hvbGRfLAotICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLm9uVHJhbnNhY3Rfbm9uX291dGxpbmVfY291bnRfKTsKKyAgQ29tcHV0ZU91dGxpbmVNZXRob2RzKGlmYWNlLCBzdHViLCBvcHRpb25zLm9uVHJhbnNhY3Rfb3V0bGluZV90aHJlc2hvbGRfLAorICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5vblRyYW5zYWN0X25vbl9vdXRsaW5lX2NvdW50Xyk7CiAKICAgLy8gdGhlIHByb3h5IGlubmVyIGNsYXNzCiAgIGF1dG8gcHJveHkgPSBzdGQ6Om1ha2Vfc2hhcmVkPFByb3h5Q2xhc3M+KGlmYWNlLCBvcHRpb25zKTsKICAgc3R1Yi0+ZWxlbWVudHMucHVzaF9iYWNrKHByb3h5KTsKIAogICAvLyBzdHViIGFuZCBwcm94eSBzdXBwb3J0IGZvciBnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkKLSAgZ2VuZXJhdGVfaW50ZXJmYWNlX2Rlc2NyaXB0b3JzKG9wdGlvbnMsIGlmYWNlLCBpbnRlcmZhY2UuZ2V0KCksIHN0dWIsIHByb3h5KTsKKyAgR2VuZXJhdGVJbnRlcmZhY2VEZXNjcmlwdG9ycyhvcHRpb25zLCBpZmFjZSwgaW50ZXJmYWNlLmdldCgpLCBzdHViLCBwcm94eSk7CiAKICAgLy8gYWxsIHRoZSBkZWNsYXJlZCBjb25zdGFudHMgb2YgdGhlIGludGVyZmFjZQogICBzdHJpbmcgY29uc3RhbnRzOwotICBnZW5lcmF0ZV9jb25zdGFudF9kZWNsYXJhdGlvbnMoKkNvZGVXcml0ZXI6OkZvclN0cmluZygmY29uc3RhbnRzKSwgKmlmYWNlKTsKKyAgR2VuZXJhdGVDb25zdGFudERlY2xhcmF0aW9ucygqQ29kZVdyaXRlcjo6Rm9yU3RyaW5nKCZjb25zdGFudHMpLCAqaWZhY2UpOwogICBpbnRlcmZhY2UtPmVsZW1lbnRzLnB1c2hfYmFjayhzdGQ6Om1ha2Vfc2hhcmVkPExpdGVyYWxDbGFzc0VsZW1lbnQ+KGNvbnN0YW50cykpOwogCiAgIC8vIGFsbCB0aGUgZGVjbGFyZWQgbWV0aG9kcyBvZiB0aGUgaW50ZXJmYWNlCi0KKyAgYm9vbCBwZXJtaXNzaW9uV3JhcHBlckdlbmVyYXRlZCA9IGZhbHNlOworICBpbnQgbWF4X3RyYW5zYWN0aW9uX2lkID0gMDsKICAgZm9yIChjb25zdCBhdXRvJiBpdGVtIDogaWZhY2UtPkdldE1ldGhvZHMoKSkgewotICAgIGdlbmVyYXRlX21ldGhvZHMoKmlmYWNlLCAqaXRlbSwgaW50ZXJmYWNlLmdldCgpLCBzdHViLCBwcm94eSwgaXRlbS0+R2V0SWQoKSwgdHlwZW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyk7CisgICAgaWYgKChpZmFjZS0+RW5mb3JjZUV4cHJlc3Npb24oKSB8fCBpdGVtLT5HZXRUeXBlKCkuRW5mb3JjZUV4cHJlc3Npb24oKSkgJiYKKyAgICAgICAgIXBlcm1pc3Npb25XcmFwcGVyR2VuZXJhdGVkKSB7CisgICAgICBHZW5lcmF0ZVBlcm1pc3Npb25XcmFwcGVyKHN0dWIuZ2V0KCkpOworICAgICAgcGVybWlzc2lvbldyYXBwZXJHZW5lcmF0ZWQgPSB0cnVlOworICAgIH0KKyAgICBHZW5lcmF0ZU1ldGhvZHMoKmlmYWNlLCAqaXRlbSwgaW50ZXJmYWNlLmdldCgpLCBzdHViLCBwcm94eSwgaXRlbS0+R2V0SWQoKSwgdHlwZW5hbWVzLCBvcHRpb25zKTsKKyAgICBtYXhfdHJhbnNhY3Rpb25faWQgPSBzdGQ6Om1heChtYXhfdHJhbnNhY3Rpb25faWQsIGl0ZW0tPkdldElkKCkpOwogICB9CiAKLSAgLy8gYWRkaXRpb25hbCBzdGF0aWMgbWV0aG9kcyBmb3IgdGhlIGRlZmF1bHQgaW1wbCBzZXQvZ2V0IHRvIHRoZQotICAvLyBzdHViIGNsYXNzLiBDYW4ndCBhZGQgdGhlbSB0byB0aGUgaW50ZXJmYWNlIGFzIHRoZSBnZW5lcmF0ZWQgamF2YSBmaWxlcwotICAvLyBtYXkgYmUgY29tcGlsZWQgd2l0aCBKYXZhIDwgMS43IHdoZXJlIHN0YXRpYyBpbnRlcmZhY2UgbWV0aG9kIGlzbid0Ci0gIC8vIHN1cHBvcnRlZC4KLSAgLy8gVE9ETyhiLzExMTQxNzE0NSkgbWFrZSB0aGlzIGNvbmRpdGlvbmFsIGRlcGVuZGluZyBvbiB0aGUgSmF2YSBsYW5ndWFnZQotICAvLyB2ZXJzaW9uIHJlcXVlc3RlZAotICBjb25zdCBzdHJpbmcgaV9uYW1lID0gaWZhY2UtPkdldENhbm9uaWNhbE5hbWUoKTsKLSAgc3R1Yi0+ZWxlbWVudHMuZW1wbGFjZV9iYWNrKHN0ZDo6bWFrZV9zaGFyZWQ8TGl0ZXJhbENsYXNzRWxlbWVudD4oCi0gICAgICBTdHJpbmdQcmludGYoInB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzZXREZWZhdWx0SW1wbCglcyBpbXBsKSB7XG4iCi0gICAgICAgICAgICAgICAgICAgIiAgLy8gT25seSBvbmUgdXNlciBvZiB0aGlzIGludGVyZmFjZSBjYW4gdXNlIHRoaXMgZnVuY3Rpb25cbiIKLSAgICAgICAgICAgICAgICAgICAiICAvLyBhdCBhIHRpbWUuIFRoaXMgaXMgYSBoZXVyaXN0aWMgdG8gZGV0ZWN0IGlmIHR3byBkaWZmZXJlbnRcbiIKLSAgICAgICAgICAgICAgICAgICAiICAvLyB1c2VycyBpbiB0aGUgc2FtZSBwcm9jZXNzIHVzZSB0aGlzIGZ1bmN0aW9uLlxuIgotICAgICAgICAgICAgICAgICAgICIgIGlmIChTdHViLlByb3h5LnNEZWZhdWx0SW1wbCAhPSBudWxsKSB7XG4iCi0gICAgICAgICAgICAgICAgICAgIiAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFwic2V0RGVmYXVsdEltcGwoKSBjYWxsZWQgdHdpY2VcIik7XG4iCi0gICAgICAgICAgICAgICAgICAgIiAgfVxuIgotICAgICAgICAgICAgICAgICAgICIgIGlmIChpbXBsICE9IG51bGwpIHtcbiIKLSAgICAgICAgICAgICAgICAgICAiICAgIFN0dWIuUHJveHkuc0RlZmF1bHRJbXBsID0gaW1wbDtcbiIKLSAgICAgICAgICAgICAgICAgICAiICAgIHJldHVybiB0cnVlO1xuIgotICAgICAgICAgICAgICAgICAgICIgIH1cbiIKLSAgICAgICAgICAgICAgICAgICAiICByZXR1cm4gZmFsc2U7XG4iCi0gICAgICAgICAgICAgICAgICAgIn1cbiIsCi0gICAgICAgICAgICAgICAgICAgaV9uYW1lLmNfc3RyKCkpKSk7Ci0gIHN0dWItPmVsZW1lbnRzLmVtcGxhY2VfYmFjaygKLSAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8TGl0ZXJhbENsYXNzRWxlbWVudD4oU3RyaW5nUHJpbnRmKCJwdWJsaWMgc3RhdGljICVzIGdldERlZmF1bHRJbXBsKCkge1xuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgcmV0dXJuIFN0dWIuUHJveHkuc0RlZmF1bHRJbXBsO1xuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn1cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpX25hbWUuY19zdHIoKSkpKTsKKyAgLy8gZ2V0TWF4VHJhbnNhY3Rpb25JZAorICBpZiAob3B0aW9ucy5HZW5UcmFuc2FjdGlvbk5hbWVzKCkpIHsKKyAgICBzdHViLT5lbGVtZW50cy5wdXNoX2JhY2soR2VuZXJhdGVNYXhUcmFuc2FjdGlvbklkKG1heF90cmFuc2FjdGlvbl9pZCkpOworICB9CiAKLSAgLy8gdGhlIHN0YXRpYyBmaWVsZCBpcyBkZWZpbmVkIGluIHRoZSBwcm94eSBjbGFzcywgbm90IGluIHRoZSBpbnRlcmZhY2UgY2xhc3MKLSAgLy8gYmVjYXVzZSBhbGwgZmllbGRzIGluIGFuIGludGVyZmFjZSBjbGFzcyBhcmUgYnkgZGVmYXVsdCBmaW5hbC4KLSAgcHJveHktPmVsZW1lbnRzLmVtcGxhY2VfYmFjayhzdGQ6Om1ha2Vfc2hhcmVkPExpdGVyYWxDbGFzc0VsZW1lbnQ+KAotICAgICAgU3RyaW5nUHJpbnRmKCJwdWJsaWMgc3RhdGljICVzIHNEZWZhdWx0SW1wbDtcbiIsIGlfbmFtZS5jX3N0cigpKSkpOworICAvLyBhbGwgdGhlIG5lc3RlZCB0eXBlcworICBzdHJpbmcgY29kZTsKKyAgYXV0byB3cml0ZXIgPSBDb2RlV3JpdGVyOjpGb3JTdHJpbmcoJmNvZGUpOworICBmb3IgKGNvbnN0IGF1dG8mIG5lc3RlZCA6IGlmYWNlLT5HZXROZXN0ZWRUeXBlcygpKSB7CisgICAgR2VuZXJhdGVDbGFzcygqd3JpdGVyLCAqbmVzdGVkLCB0eXBlbmFtZXMsIG9wdGlvbnMpOworICB9CisgIEdlbmVyYXRlUGFyY2VsSGVscGVycygqd3JpdGVyLCAqaWZhY2UsIG9wdGlvbnMpOworICB3cml0ZXItPkNsb3NlKCk7CisgIGludGVyZmFjZS0+ZWxlbWVudHMucHVzaF9iYWNrKHN0ZDo6bWFrZV9zaGFyZWQ8TGl0ZXJhbENsYXNzRWxlbWVudD4oY29kZSkpOwogCi0gIHN0dWItPmZpbmlzaCgpOworICBpZiAoaWZhY2UtPklzSmF2YURlZmF1bHQoKSkgeworICAgIC8vIGFkZGl0aW9uYWwgc3RhdGljIG1ldGhvZHMgZm9yIHRoZSBkZWZhdWx0IGltcGwgc2V0L2dldCB0byB0aGUKKyAgICAvLyBzdHViIGNsYXNzLiBDYW4ndCBhZGQgdGhlbSB0byB0aGUgaW50ZXJmYWNlIGFzIHRoZSBnZW5lcmF0ZWQgamF2YSBmaWxlcworICAgIC8vIG1heSBiZSBjb21waWxlZCB3aXRoIEphdmEgPCAxLjcgd2hlcmUgc3RhdGljIGludGVyZmFjZSBtZXRob2QgaXNuJ3QKKyAgICAvLyBzdXBwb3J0ZWQuCisgICAgLy8gVE9ETyhiLzExMTQxNzE0NSkgbWFrZSB0aGlzIGNvbmRpdGlvbmFsIGRlcGVuZGluZyBvbiB0aGUgSmF2YSBsYW5ndWFnZQorICAgIC8vIHZlcnNpb24gcmVxdWVzdGVkCisgICAgY29uc3Qgc3RyaW5nIGlfbmFtZSA9IGlmYWNlLT5HZXRDYW5vbmljYWxOYW1lKCk7CisgICAgc3R1Yi0+ZWxlbWVudHMuZW1wbGFjZV9iYWNrKHN0ZDo6bWFrZV9zaGFyZWQ8TGl0ZXJhbENsYXNzRWxlbWVudD4oCisgICAgICAgIFN0cmluZ1ByaW50ZigicHVibGljIHN0YXRpYyBib29sZWFuIHNldERlZmF1bHRJbXBsKCVzIGltcGwpIHtcbiIKKyAgICAgICAgICAgICAgICAgICAgICIgIC8vIE9ubHkgb25lIHVzZXIgb2YgdGhpcyBpbnRlcmZhY2UgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uXG4iCisgICAgICAgICAgICAgICAgICAgICAiICAvLyBhdCBhIHRpbWUuIFRoaXMgaXMgYSBoZXVyaXN0aWMgdG8gZGV0ZWN0IGlmIHR3byBkaWZmZXJlbnRcbiIKKyAgICAgICAgICAgICAgICAgICAgICIgIC8vIHVzZXJzIGluIHRoZSBzYW1lIHByb2Nlc3MgdXNlIHRoaXMgZnVuY3Rpb24uXG4iCisgICAgICAgICAgICAgICAgICAgICAiICBpZiAoU3R1Yi5Qcm94eS5zRGVmYXVsdEltcGwgIT0gbnVsbCkge1xuIgorICAgICAgICAgICAgICAgICAgICAgIiAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFwic2V0RGVmYXVsdEltcGwoKSBjYWxsZWQgdHdpY2VcIik7XG4iCisgICAgICAgICAgICAgICAgICAgICAiICB9XG4iCisgICAgICAgICAgICAgICAgICAgICAiICBpZiAoaW1wbCAhPSBudWxsKSB7XG4iCisgICAgICAgICAgICAgICAgICAgICAiICAgIFN0dWIuUHJveHkuc0RlZmF1bHRJbXBsID0gaW1wbDtcbiIKKyAgICAgICAgICAgICAgICAgICAgICIgICAgcmV0dXJuIHRydWU7XG4iCisgICAgICAgICAgICAgICAgICAgICAiICB9XG4iCisgICAgICAgICAgICAgICAgICAgICAiICByZXR1cm4gZmFsc2U7XG4iCisgICAgICAgICAgICAgICAgICAgICAifVxuIiwKKyAgICAgICAgICAgICAgICAgICAgIGlfbmFtZS5jX3N0cigpKSkpOworICAgIHN0dWItPmVsZW1lbnRzLmVtcGxhY2VfYmFjaygKKyAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxMaXRlcmFsQ2xhc3NFbGVtZW50PihTdHJpbmdQcmludGYoInB1YmxpYyBzdGF0aWMgJXMgZ2V0RGVmYXVsdEltcGwoKSB7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIHJldHVybiBTdHViLlByb3h5LnNEZWZhdWx0SW1wbDtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn1cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlfbmFtZS5jX3N0cigpKSkpOworCisgICAgLy8gdGhlIHN0YXRpYyBmaWVsZCBpcyBkZWZpbmVkIGluIHRoZSBwcm94eSBjbGFzcywgbm90IGluIHRoZSBpbnRlcmZhY2UgY2xhc3MKKyAgICAvLyBiZWNhdXNlIGFsbCBmaWVsZHMgaW4gYW4gaW50ZXJmYWNlIGNsYXNzIGFyZSBieSBkZWZhdWx0IGZpbmFsLgorICAgIHByb3h5LT5lbGVtZW50cy5lbXBsYWNlX2JhY2soc3RkOjptYWtlX3NoYXJlZDxMaXRlcmFsQ2xhc3NFbGVtZW50PigKKyAgICAgICAgU3RyaW5nUHJpbnRmKCJwdWJsaWMgc3RhdGljICVzIHNEZWZhdWx0SW1wbDtcbiIsIGlfbmFtZS5jX3N0cigpKSkpOworICB9CisKKyAgc3R1Yi0+RmluaXNoKCk7CiAKICAgcmV0dXJuIGludGVyZmFjZTsKIH0KZGlmZiAtLWdpdCBhL2dlbmVyYXRlX25kay5jcHAgYi9nZW5lcmF0ZV9uZGsuY3BwCmluZGV4IGNhOGQ2NmMuLjQzNDVhNzQgMTAwNjQ0Ci0tLSBhL2dlbmVyYXRlX25kay5jcHAKKysrIGIvZ2VuZXJhdGVfbmRrLmNwcApAQCAtMjgsNyArMjgsNiBAQAogbmFtZXNwYWNlIGFpZGwgewogbmFtZXNwYWNlIG5kayB7CiAKLXN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhcioga0NsYXp6ID0gIl9nX2FpZGxfY2xhenoiOwogc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyKiBrRGVzY3JpcHRvciA9ICJkZXNjcmlwdG9yIjsKIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhcioga1ZlcnNpb24gPSAidmVyc2lvbiI7CiBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIqIGtIYXNoID0gImhhc2giOwpAQCAtMzYsMTQ0ICszNSw4NyBAQAogc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyKiBrQ2FjaGVkSGFzaCA9ICJfYWlkbF9jYWNoZWRfaGFzaCI7CiBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIqIGtDYWNoZWRIYXNoTXV0ZXggPSAiX2FpZGxfY2FjaGVkX2hhc2hfbXV0ZXgiOwogCi11c2luZyBuYW1lc3BhY2UgaW50ZXJuYWxzOwogbmFtZXNwYWNlIGludGVybmFscyB7Ci12b2lkIEdlbmVyYXRlUGFyY2VsSGVhZGVyKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxTdHJ1Y3R1cmVkUGFyY2VsYWJsZSYgZGVmaW5lZF90eXBlLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKKy8vIDQgb3V0cHV0cyBmb3IgTkRLIGZvciBlYWNoIHR5cGU6IEhlYWRlciwgQnBIZWFkZXIsIEJuSGVhZGVyLCBTb3VyY2UKK3ZvaWQgR2VuZXJhdGVIZWFkZXIoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbERlZmluZWRUeXBlJiBkZWZpbmVkX3R5cGUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOwordm9pZCBHZW5lcmF0ZUNsaWVudEhlYWRlcihDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsRGVmaW5lZFR5cGUmIGRlZmluZWRfdHlwZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7Cit2b2lkIEdlbmVyYXRlU2VydmVySGVhZGVyKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxEZWZpbmVkVHlwZSYgZGVmaW5lZF90eXBlLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKK3ZvaWQgR2VuZXJhdGVTb3VyY2UoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbERlZmluZWRUeXBlJiBkZWZpbmVkX3R5cGUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOworCisvLyBIZWFkZXIgY29udGFpbnMgQ2xhc3NEZWNsIG9mIGEgcm9vdCB0eXBlCit2b2lkIEdlbmVyYXRlSW50ZXJmYWNlQ2xhc3NEZWNsKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxJbnRlcmZhY2UmIGlmYWNlLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKK3ZvaWQgR2VuZXJhdGVQYXJjZWxDbGFzc0RlY2woQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFN0cnVjdHVyZWRQYXJjZWxhYmxlJiBwYXJjZWxhYmxlLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKK3ZvaWQgR2VuZXJhdGVQYXJjZWxDbGFzc0RlY2woQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFVuaW9uRGVjbCYgdW5pb25fZGVjbCwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7Cit2b2lkIEdlbmVyYXRlRW51bUNsYXNzRGVjbChDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbEVudW1EZWNsYXJhdGlvbiYgZW51bV9kZWNsLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKKworLy8gQnBIZWFkZXIvQm5IZWFkZXIgZm9yIGludGVyZmFjZQordm9pZCBHZW5lcmF0ZUNsaWVudEhlYWRlcihDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsSW50ZXJmYWNlJiBkZWZpbmVkX3R5cGUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOwordm9pZCBHZW5lcmF0ZVNlcnZlckhlYWRlcihDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsSW50ZXJmYWNlJiBkZWZpbmVkX3R5cGUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOworCisvLyBTb3VyY2UgZm9yIGludGVyZmFjZQordm9pZCBHZW5lcmF0ZVNvdXJjZShDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLCBjb25zdCBBaWRsSW50ZXJmYWNlJiBpZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7Cit2b2lkIEdlbmVyYXRlQ2xhc3NTb3VyY2UoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsSW50ZXJmYWNlJiBkZWZpbmVkX3R5cGUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOwordm9pZCBHZW5lcmF0ZUNsaWVudFNvdXJjZShDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsSW50ZXJmYWNlJiBkZWZpbmVkX3R5cGUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOwordm9pZCBHZW5lcmF0ZVNlcnZlclNvdXJjZShDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsSW50ZXJmYWNlJiBkZWZpbmVkX3R5cGUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOwordm9pZCBHZW5lcmF0ZUludGVyZmFjZVNvdXJjZShDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsSW50ZXJmYWNlJiBkZWZpbmVkX3R5cGUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOworCisvLyBTb3VyY2UgZm9yIHN0cnVjdHVyZWQgcGFyY2VsYWJsZQogdm9pZCBHZW5lcmF0ZVBhcmNlbFNvdXJjZShDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsU3RydWN0dXJlZFBhcmNlbGFibGUmIGRlZmluZWRfdHlwZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7Ci12b2lkIEdlbmVyYXRlUGFyY2VsSGVhZGVyKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxVbmlvbkRlY2wmIGRlZmluZWRfdHlwZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7CisKKy8vIFNvdXJjZSBmb3IgdW5pb24KIHZvaWQgR2VuZXJhdGVQYXJjZWxTb3VyY2UoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFVuaW9uRGVjbCYgZGVmaW5lZF90eXBlLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKKworLy8gQ29tcGFyZSBoZWFkZXJzIHNvIHRoYXQgPGFuZHJvaWQvLi4+IGFuZCA8YWlkbC8uLj4gY29tZXMgYWZ0ZXIgb3RoZXIgKHByb2JhYmx5KSBzdGQgaGVhZGVycy4KK3N0cnVjdCBIZWFkZXJDb21wIHsKKyAgc3RhdGljIGludCByYW5rKGNvbnN0IHN0cmluZyYgYSkgeworICAgIHJldHVybiBiYXNlOjpTdGFydHNXaXRoKGEsICJhaWRsLyIpID8gMiA6IGJhc2U6OlN0YXJ0c1dpdGgoYSwgImFuZHJvaWQvIikgPyAxIDogMDsKKyAgfQorICBib29sIG9wZXJhdG9yKCkoY29uc3Qgc3RyaW5nJiBhLCBjb25zdCBzdHJpbmcmIGIpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjptYWtlX3R1cGxlKHJhbmsoYSksIGEpIDwgc3RkOjptYWtlX3R1cGxlKHJhbmsoYiksIGIpOworICB9Cit9OwogfSAgLy8gbmFtZXNwYWNlIGludGVybmFscwogCit1c2luZyBuYW1lc3BhY2UgaW50ZXJuYWxzOwogdXNpbmcgY3BwOjpDbGFzc05hbWVzOwotCi12b2lkIEdlbmVyYXRlTmRrSW50ZXJmYWNlKGNvbnN0IHN0cmluZyYgb3V0cHV0X2ZpbGUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLCBjb25zdCBBaWRsSW50ZXJmYWNlJiBkZWZpbmVkX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElvRGVsZWdhdGUmIGlvX2RlbGVnYXRlKSB7Ci0gIGNvbnN0IHN0cmluZyBpX2hlYWRlciA9IG9wdGlvbnMuT3V0cHV0SGVhZGVyRGlyKCkgKyBOZGtIZWFkZXJGaWxlKGRlZmluZWRfdHlwZSwgQ2xhc3NOYW1lczo6UkFXKTsKLSAgdW5pcXVlX3B0cjxDb2RlV3JpdGVyPiBpX3dyaXRlcihpb19kZWxlZ2F0ZS5HZXRDb2RlV3JpdGVyKGlfaGVhZGVyKSk7Ci0gIEdlbmVyYXRlSW50ZXJmYWNlSGVhZGVyKCppX3dyaXRlciwgdHlwZXMsIGRlZmluZWRfdHlwZSwgb3B0aW9ucyk7Ci0gIEFJRExfRkFUQUxfSUYoIWlfd3JpdGVyLT5DbG9zZSgpLCBpX2hlYWRlcik7Ci0KLSAgY29uc3Qgc3RyaW5nIGJwX2hlYWRlciA9Ci0gICAgICBvcHRpb25zLk91dHB1dEhlYWRlckRpcigpICsgTmRrSGVhZGVyRmlsZShkZWZpbmVkX3R5cGUsIENsYXNzTmFtZXM6OkNMSUVOVCk7Ci0gIHVuaXF1ZV9wdHI8Q29kZVdyaXRlcj4gYnBfd3JpdGVyKGlvX2RlbGVnYXRlLkdldENvZGVXcml0ZXIoYnBfaGVhZGVyKSk7Ci0gIEdlbmVyYXRlQ2xpZW50SGVhZGVyKCpicF93cml0ZXIsIHR5cGVzLCBkZWZpbmVkX3R5cGUsIG9wdGlvbnMpOwotICBBSURMX0ZBVEFMX0lGKCFicF93cml0ZXItPkNsb3NlKCksIGJwX2hlYWRlcik7Ci0KLSAgY29uc3Qgc3RyaW5nIGJuX2hlYWRlciA9Ci0gICAgICBvcHRpb25zLk91dHB1dEhlYWRlckRpcigpICsgTmRrSGVhZGVyRmlsZShkZWZpbmVkX3R5cGUsIENsYXNzTmFtZXM6OlNFUlZFUik7Ci0gIHVuaXF1ZV9wdHI8Q29kZVdyaXRlcj4gYm5fd3JpdGVyKGlvX2RlbGVnYXRlLkdldENvZGVXcml0ZXIoYm5faGVhZGVyKSk7Ci0gIEdlbmVyYXRlU2VydmVySGVhZGVyKCpibl93cml0ZXIsIHR5cGVzLCBkZWZpbmVkX3R5cGUsIG9wdGlvbnMpOwotICBBSURMX0ZBVEFMX0lGKCFibl93cml0ZXItPkNsb3NlKCksIGJuX2hlYWRlcik7Ci0KLSAgdW5pcXVlX3B0cjxDb2RlV3JpdGVyPiBzb3VyY2Vfd3JpdGVyID0gaW9fZGVsZWdhdGUuR2V0Q29kZVdyaXRlcihvdXRwdXRfZmlsZSk7Ci0gIEdlbmVyYXRlU291cmNlKCpzb3VyY2Vfd3JpdGVyLCB0eXBlcywgZGVmaW5lZF90eXBlLCBvcHRpb25zKTsKLSAgQUlETF9GQVRBTF9JRighc291cmNlX3dyaXRlci0+Q2xvc2UoKSwgb3V0cHV0X2ZpbGUpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUGFyY2VsYWJsZVR5cGU+Ci12b2lkIEdlbmVyYXRlTmRrUGFyY2VsKGNvbnN0IHN0cmluZyYgb3V0cHV0X2ZpbGUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLCBjb25zdCBQYXJjZWxhYmxlVHlwZSYgZGVmaW5lZF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJb0RlbGVnYXRlJiBpb19kZWxlZ2F0ZSkgewotICBjb25zdCBzdHJpbmcgaGVhZGVyX3BhdGggPQotICAgICAgb3B0aW9ucy5PdXRwdXRIZWFkZXJEaXIoKSArIE5ka0hlYWRlckZpbGUoZGVmaW5lZF90eXBlLCBDbGFzc05hbWVzOjpSQVcpOwotICB1bmlxdWVfcHRyPENvZGVXcml0ZXI+IGhlYWRlcl93cml0ZXIoaW9fZGVsZWdhdGUuR2V0Q29kZVdyaXRlcihoZWFkZXJfcGF0aCkpOwotICBHZW5lcmF0ZVBhcmNlbEhlYWRlcigqaGVhZGVyX3dyaXRlciwgdHlwZXMsIGRlZmluZWRfdHlwZSwgb3B0aW9ucyk7Ci0KLSAgdW5pcXVlX3B0cjxDb2RlV3JpdGVyPiBzb3VyY2Vfd3JpdGVyKGlvX2RlbGVnYXRlLkdldENvZGVXcml0ZXIob3V0cHV0X2ZpbGUpKTsKLSAgaWYgKGRlZmluZWRfdHlwZS5Jc0dlbmVyaWMoKSkgewotICAgIC8vIE5lZWQgdG8gd3JpdGUgc291cmNlIHRvIGhlYWRlciBpZiB0aGlzIGlzIGEgdGVtcGxhdGUKLSAgICBHZW5lcmF0ZVBhcmNlbFNvdXJjZSgqaGVhZGVyX3dyaXRlciwgdHlwZXMsIGRlZmluZWRfdHlwZSwgb3B0aW9ucyk7Ci0gIH0gZWxzZSB7Ci0gICAgR2VuZXJhdGVQYXJjZWxTb3VyY2UoKnNvdXJjZV93cml0ZXIsIHR5cGVzLCBkZWZpbmVkX3R5cGUsIG9wdGlvbnMpOwotICB9Ci0gIChzb3VyY2Vfd3JpdGVyLT5DbG9zZSgpKTsKLSAgQUlETF9GQVRBTF9JRighaGVhZGVyX3dyaXRlci0+Q2xvc2UoKSwgaGVhZGVyX3BhdGgpOwotCi0gIGNvbnN0IHN0cmluZyBicF9oZWFkZXIgPQotICAgICAgb3B0aW9ucy5PdXRwdXRIZWFkZXJEaXIoKSArIE5ka0hlYWRlckZpbGUoZGVmaW5lZF90eXBlLCBDbGFzc05hbWVzOjpDTElFTlQpOwotICB1bmlxdWVfcHRyPENvZGVXcml0ZXI+IGJwX3dyaXRlcihpb19kZWxlZ2F0ZS5HZXRDb2RlV3JpdGVyKGJwX2hlYWRlcikpOwotICAqYnBfd3JpdGVyIDw8ICIjZXJyb3IgVE9ETyhiLzExMTM2MjU5MykgZGVmaW5lZF90eXBlcyBkbyBub3QgaGF2ZSBicCBjbGFzc2VzXG4iOwotICBBSURMX0ZBVEFMX0lGKCFicF93cml0ZXItPkNsb3NlKCksIGJwX2hlYWRlcik7Ci0KLSAgY29uc3Qgc3RyaW5nIGJuX2hlYWRlciA9Ci0gICAgICBvcHRpb25zLk91dHB1dEhlYWRlckRpcigpICsgTmRrSGVhZGVyRmlsZShkZWZpbmVkX3R5cGUsIENsYXNzTmFtZXM6OlNFUlZFUik7Ci0gIHVuaXF1ZV9wdHI8Q29kZVdyaXRlcj4gYm5fd3JpdGVyKGlvX2RlbGVnYXRlLkdldENvZGVXcml0ZXIoYm5faGVhZGVyKSk7Ci0gICpibl93cml0ZXIgPDwgIiNlcnJvciBUT0RPKGIvMTExMzYyNTkzKSBkZWZpbmVkX3R5cGVzIGRvIG5vdCBoYXZlIGJuIGNsYXNzZXNcbiI7Ci0gIEFJRExfRkFUQUxfSUYoIWJuX3dyaXRlci0+Q2xvc2UoKSwgYm5faGVhZGVyKTsKLX0KLQotdm9pZCBHZW5lcmF0ZU5ka1BhcmNlbERlY2xhcmF0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwgY29uc3QgSW9EZWxlZ2F0ZSYgaW9fZGVsZWdhdGUpIHsKLSAgQ29kZVdyaXRlclB0ciBjb2RlX3dyaXRlciA9IGlvX2RlbGVnYXRlLkdldENvZGVXcml0ZXIoZmlsZW5hbWUpOwotICAqY29kZV93cml0ZXIKLSAgICAgIDw8ICIvLyBUaGlzIGZpbGUgaXMgaW50ZW50aW9uYWxseSBsZWZ0IGJsYW5rIGFzIHBsYWNlaG9sZGVyIGZvciBwYXJjZWwgZGVjbGFyYXRpb24uXG4iOwotICBBSURMX0ZBVEFMX0lGKCFjb2RlX3dyaXRlci0+Q2xvc2UoKSwgZmlsZW5hbWUpOwotfQotCi12b2lkIEdlbmVyYXRlTmRrRW51bURlY2xhcmF0aW9uKGNvbnN0IHN0cmluZyYgb3V0cHV0X2ZpbGUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLCBjb25zdCBBaWRsRW51bURlY2xhcmF0aW9uJiBkZWZpbmVkX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElvRGVsZWdhdGUmIGlvX2RlbGVnYXRlKSB7Ci0gIGNvbnN0IHN0cmluZyBoZWFkZXJfcGF0aCA9Ci0gICAgICBvcHRpb25zLk91dHB1dEhlYWRlckRpcigpICsgTmRrSGVhZGVyRmlsZShkZWZpbmVkX3R5cGUsIENsYXNzTmFtZXM6OlJBVyk7Ci0gIHVuaXF1ZV9wdHI8Q29kZVdyaXRlcj4gaGVhZGVyX3dyaXRlcihpb19kZWxlZ2F0ZS5HZXRDb2RlV3JpdGVyKGhlYWRlcl9wYXRoKSk7Ci0gIEdlbmVyYXRlRW51bUhlYWRlcigqaGVhZGVyX3dyaXRlciwgdHlwZXMsIGRlZmluZWRfdHlwZSwgb3B0aW9ucyk7Ci0gIEFJRExfRkFUQUxfSUYoIWhlYWRlcl93cml0ZXItPkNsb3NlKCksIGhlYWRlcl9wYXRoKTsKLQotICBjb25zdCBzdHJpbmcgYnBfaGVhZGVyID0KLSAgICAgIG9wdGlvbnMuT3V0cHV0SGVhZGVyRGlyKCkgKyBOZGtIZWFkZXJGaWxlKGRlZmluZWRfdHlwZSwgQ2xhc3NOYW1lczo6Q0xJRU5UKTsKLSAgdW5pcXVlX3B0cjxDb2RlV3JpdGVyPiBicF93cml0ZXIoaW9fZGVsZWdhdGUuR2V0Q29kZVdyaXRlcihicF9oZWFkZXIpKTsKLSAgKmJwX3dyaXRlciA8PCAiI2Vycm9yIFRPRE8oYi8xMTEzNjI1OTMpIGVudW1zIGRvIG5vdCBoYXZlIGJwIGNsYXNzZXNcbiI7Ci0gIEFJRExfRkFUQUxfSUYoIWJwX3dyaXRlci0+Q2xvc2UoKSwgYnBfaGVhZGVyKTsKLQotICBjb25zdCBzdHJpbmcgYm5faGVhZGVyID0KLSAgICAgIG9wdGlvbnMuT3V0cHV0SGVhZGVyRGlyKCkgKyBOZGtIZWFkZXJGaWxlKGRlZmluZWRfdHlwZSwgQ2xhc3NOYW1lczo6U0VSVkVSKTsKLSAgdW5pcXVlX3B0cjxDb2RlV3JpdGVyPiBibl93cml0ZXIoaW9fZGVsZWdhdGUuR2V0Q29kZVdyaXRlcihibl9oZWFkZXIpKTsKLSAgKmJuX3dyaXRlciA8PCAiI2Vycm9yIFRPRE8oYi8xMTEzNjI1OTMpIGVudW1zIGRvIG5vdCBoYXZlIGJuIGNsYXNzZXNcbiI7Ci0gIEFJRExfRkFUQUxfSUYoIWJuX3dyaXRlci0+Q2xvc2UoKSwgYm5faGVhZGVyKTsKLQotICB1bmlxdWVfcHRyPENvZGVXcml0ZXI+IHNvdXJjZV93cml0ZXIgPSBpb19kZWxlZ2F0ZS5HZXRDb2RlV3JpdGVyKG91dHB1dF9maWxlKTsKLSAgKnNvdXJjZV93cml0ZXIKLSAgICAgIDw8ICIvLyBUaGlzIGZpbGUgaXMgaW50ZW50aW9uYWxseSBsZWZ0IGJsYW5rIGFzIHBsYWNlaG9sZGVyIGZvciBlbnVtIGRlY2xhcmF0aW9uLlxuIjsKLSAgQUlETF9GQVRBTF9JRighc291cmNlX3dyaXRlci0+Q2xvc2UoKSwgb3V0cHV0X2ZpbGUpOwotfQordXNpbmcgY3BwOjpHZXRRdWFsaWZpZWROYW1lOwogCiB2b2lkIEdlbmVyYXRlTmRrKGNvbnN0IHN0cmluZyYgb3V0cHV0X2ZpbGUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLAogICAgICAgICAgICAgICAgICBjb25zdCBBaWRsRGVmaW5lZFR5cGUmIGRlZmluZWRfdHlwZSwgY29uc3QgSW9EZWxlZ2F0ZSYgaW9fZGVsZWdhdGUpIHsKLSAgaWYgKGNvbnN0IEFpZGxTdHJ1Y3R1cmVkUGFyY2VsYWJsZSogcGFyY2VsYWJsZSA9IGRlZmluZWRfdHlwZS5Bc1N0cnVjdHVyZWRQYXJjZWxhYmxlKCk7Ci0gICAgICBwYXJjZWxhYmxlICE9IG51bGxwdHIpIHsKLSAgICBHZW5lcmF0ZU5ka1BhcmNlbDxBaWRsU3RydWN0dXJlZFBhcmNlbGFibGU+KG91dHB1dF9maWxlLCBvcHRpb25zLCB0eXBlcywgKnBhcmNlbGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb19kZWxlZ2F0ZSk7Ci0gICAgcmV0dXJuOwotICB9CisgIHVzaW5nIEdlbkZuID0gdm9pZCAoKikoQ29kZVdyaXRlciAmIG91dCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbERlZmluZWRUeXBlJiBkZWZpbmVkX3R5cGUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOworICAvLyBXcmFwIEdlbmVyYXRlKiBmdW5jdGlvbiB0byBoYW5kbGUgQ29kZVdyaXRlciBmb3IgYSBmaWxlLgorICBhdXRvIGdlbiA9IFsmXShhdXRvIGZpbGUsIEdlbkZuIGZuKSB7CisgICAgdW5pcXVlX3B0cjxDb2RlV3JpdGVyPiB3cml0ZXIoaW9fZGVsZWdhdGUuR2V0Q29kZVdyaXRlcihmaWxlKSk7CisgICAgZm4oKndyaXRlciwgdHlwZXMsIGRlZmluZWRfdHlwZSwgb3B0aW9ucyk7CisgICAgQUlETF9GQVRBTF9JRighd3JpdGVyLT5DbG9zZSgpLCBkZWZpbmVkX3R5cGUpIDw8ICJJL08gRXJyb3IhIjsKKyAgfTsKIAotICBpZiAoY29uc3QgQWlkbFVuaW9uRGVjbCogdW5pb25fZGVjbCA9IGRlZmluZWRfdHlwZS5Bc1VuaW9uRGVjbGFyYXRpb24oKTsgdW5pb25fZGVjbCAhPSBudWxscHRyKSB7Ci0gICAgR2VuZXJhdGVOZGtQYXJjZWw8QWlkbFVuaW9uRGVjbD4ob3V0cHV0X2ZpbGUsIG9wdGlvbnMsIHR5cGVzLCAqdW5pb25fZGVjbCwgaW9fZGVsZWdhdGUpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChjb25zdCBBaWRsUGFyY2VsYWJsZSogcGFyY2VsYWJsZV9kZWNsID0gZGVmaW5lZF90eXBlLkFzUGFyY2VsYWJsZSgpOwotICAgICAgcGFyY2VsYWJsZV9kZWNsICE9IG51bGxwdHIpIHsKLSAgICBHZW5lcmF0ZU5ka1BhcmNlbERlY2xhcmF0aW9uKG91dHB1dF9maWxlLCBpb19kZWxlZ2F0ZSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKGNvbnN0IEFpZGxFbnVtRGVjbGFyYXRpb24qIGVudW1fZGVjbCA9IGRlZmluZWRfdHlwZS5Bc0VudW1EZWNsYXJhdGlvbigpOwotICAgICAgZW51bV9kZWNsICE9IG51bGxwdHIpIHsKLSAgICBHZW5lcmF0ZU5ka0VudW1EZWNsYXJhdGlvbihvdXRwdXRfZmlsZSwgb3B0aW9ucywgdHlwZXMsICplbnVtX2RlY2wsIGlvX2RlbGVnYXRlKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoY29uc3QgQWlkbEludGVyZmFjZSogaW50ZXJmYWNlID0gZGVmaW5lZF90eXBlLkFzSW50ZXJmYWNlKCk7IGludGVyZmFjZSAhPSBudWxscHRyKSB7Ci0gICAgR2VuZXJhdGVOZGtJbnRlcmZhY2Uob3V0cHV0X2ZpbGUsIG9wdGlvbnMsIHR5cGVzLCAqaW50ZXJmYWNlLCBpb19kZWxlZ2F0ZSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgQUlETF9GQVRBTChkZWZpbmVkX3R5cGUpIDw8ICJVbnJlY29nbml6ZWQgdHlwZSBzZW50IGZvciBOREsgY3BwIGdlbmVyYXRpb24uIjsKKyAgZ2VuKG9wdGlvbnMuT3V0cHV0SGVhZGVyRGlyKCkgKyBOZGtIZWFkZXJGaWxlKGRlZmluZWRfdHlwZSwgQ2xhc3NOYW1lczo6UkFXKSwgJkdlbmVyYXRlSGVhZGVyKTsKKyAgZ2VuKG9wdGlvbnMuT3V0cHV0SGVhZGVyRGlyKCkgKyBOZGtIZWFkZXJGaWxlKGRlZmluZWRfdHlwZSwgQ2xhc3NOYW1lczo6Q0xJRU5UKSwKKyAgICAgICZHZW5lcmF0ZUNsaWVudEhlYWRlcik7CisgIGdlbihvcHRpb25zLk91dHB1dEhlYWRlckRpcigpICsgTmRrSGVhZGVyRmlsZShkZWZpbmVkX3R5cGUsIENsYXNzTmFtZXM6OlNFUlZFUiksCisgICAgICAmR2VuZXJhdGVTZXJ2ZXJIZWFkZXIpOworICBnZW4ob3V0cHV0X2ZpbGUsICZHZW5lcmF0ZVNvdXJjZSk7CiB9CisKIG5hbWVzcGFjZSBpbnRlcm5hbHMgewogCiB2b2lkIEVudGVyTmRrTmFtZXNwYWNlKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbERlZmluZWRUeXBlJiBkZWZpbmVkX3R5cGUpIHsKQEAgLTE5NSwxMjEgKzEzNywyODYgQEAKICAgb3V0IDw8ICJpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzO1xuXG4iOwogfQogCi1zdGF0aWMgdm9pZCBHZW5lcmF0ZUhlYWRlckluY2x1ZGVzKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxEZWZpbmVkVHlwZSYgZGVmaW5lZF90eXBlKSB7Ci0gIG91dCA8PCAiI2luY2x1ZGUgPGNzdGRpbnQ+XG4iOwotICBvdXQgPDwgIiNpbmNsdWRlIDxtZW1vcnk+XG4iOwotICBvdXQgPDwgIiNpbmNsdWRlIDxvcHRpb25hbD5cbiI7Ci0gIG91dCA8PCAiI2luY2x1ZGUgPHN0cmluZz5cbiI7Ci0gIG91dCA8PCAiI2luY2x1ZGUgPHZlY3Rvcj5cbiI7Ci0gIG91dCA8PCAiI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVFxuIjsKLSAgb3V0IDw8ICIjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfc3RhYmlsaXR5Lmg+XG4iOwotICBvdXQgPDwgIiNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUXG4iOwordm9pZCBHZW5lcmF0ZUhlYWRlckluY2x1ZGVzKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbERlZmluZWRUeXBlJiBkZWZpbmVkX3R5cGUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOwogCi0gIGlmIChkZWZpbmVkX3R5cGUuSXNTZW5zaXRpdmVEYXRhKCkpIHsKLSAgICBvdXQgPDwgIiNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wYXJjZWxfcGxhdGZvcm0uaD5cbiI7Ci0gICAgb3V0IDw8ICIjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaWJpbmRlcl9wbGF0Zm9ybS5oPlxuIjsKLSAgfQordm9pZCBHZW5lcmF0ZUNsYXNzRGVjbChDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsRGVmaW5lZFR5cGUmIGRlZmluZWRfdHlwZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7CiAKLSAgYXV0byBoZWFkZXJGaWxlUGF0aCA9IFsmdHlwZXNdKGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiB0eXBlc3BlYykgLT4gc3RkOjpzdHJpbmcgewotICAgIGNvbnN0IEFpZGxEZWZpbmVkVHlwZSogdHlwZSA9IHR5cGVzLlRyeUdldERlZmluZWRUeXBlKHR5cGVzcGVjLkdldE5hbWUoKSk7Ci0gICAgaWYgKHR5cGUgPT0gbnVsbHB0cikgewotICAgICAgLy8gY291bGQgYmUgYSBwcmltaXRpdmUgdHlwZS4KLSAgICAgIHJldHVybiAiIjsKK3ZvaWQgR2VuZXJhdGVOZXN0ZWRUeXBlRGVjbHMoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbERlZmluZWRUeXBlJiBkZWZpbmVkX3R5cGUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgYXV0byB2aXNpdCA9IFsmXShjb25zdCBhdXRvJiBuZXN0ZWQpIHsgR2VuZXJhdGVDbGFzc0RlY2wob3V0LCB0eXBlcywgbmVzdGVkLCBvcHRpb25zKTsgfTsKKyAgQUlETF9GQVRBTF9JRighVG9wb2xvZ2ljYWxWaXNpdChkZWZpbmVkX3R5cGUuR2V0TmVzdGVkVHlwZXMoKSwgdmlzaXQpLCBkZWZpbmVkX3R5cGUpCisgICAgICA8PCAiQ3ljbGUgZGV0ZWN0ZWQuIjsKK30KKwordm9pZCBHZW5lcmF0ZUhlYWRlckRlZmluaXRpb25zKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbERlZmluZWRUeXBlJiBkZWZpbmVkX3R5cGUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgc3RydWN0IFZpc2l0b3IgOiBBaWRsVmlzaXRvciB7CisgICAgQ29kZVdyaXRlciYgb3V0OworICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzOworICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnM7CisgICAgVmlzaXRvcihDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKQorICAgICAgICA6IG91dChvdXQpLCB0eXBlcyh0eXBlcyksIG9wdGlvbnMob3B0aW9ucykge30KKworICAgIHZvaWQgVmlzaXQoY29uc3QgQWlkbEVudW1EZWNsYXJhdGlvbiYgZW51bV9kZWNsKSBvdmVycmlkZSB7CisgICAgICBjb25zdCBhdXRvIGJhY2tpbmdfdHlwZSA9IE5ka05hbWVPZih0eXBlcywgZW51bV9kZWNsLkdldEJhY2tpbmdUeXBlKCksIFN0b3JhZ2VNb2RlOjpTVEFDSyk7CisgICAgICBFbnRlck5ka05hbWVzcGFjZShvdXQsIGVudW1fZGVjbCk7CisgICAgICBvdXQgPDwgY3BwOjpHZW5lcmF0ZUVudW1Ub1N0cmluZyhlbnVtX2RlY2wsIGJhY2tpbmdfdHlwZSk7CisgICAgICBMZWF2ZU5ka05hbWVzcGFjZShvdXQsIGVudW1fZGVjbCk7CisKKyAgICAgIG91dCA8PCAibmFtZXNwYWNlIG5kayB7XG4iOworICAgICAgb3V0IDw8ICJuYW1lc3BhY2UgaW50ZXJuYWwge1xuIjsKKyAgICAgIG91dCA8PCBjcHA6OkdlbmVyYXRlRW51bVZhbHVlcyhlbnVtX2RlY2wsIHsiYWlkbCJ9KTsKKyAgICAgIG91dCA8PCAifSAgLy8gbmFtZXNwYWNlIGludGVybmFsXG4iOworICAgICAgb3V0IDw8ICJ9ICAvLyBuYW1lc3BhY2UgbmRrXG4iOwogICAgIH0KIAotICAgIGlmICh0eXBlLT5Bc0ludGVyZmFjZSgpICE9IG51bGxwdHIpIHsKLSAgICAgIHJldHVybiBOZGtIZWFkZXJGaWxlKCp0eXBlLCBDbGFzc05hbWVzOjpSQVcsIGZhbHNlIC8qdXNlX29zX3NlcCovKTsKLSAgICB9IGVsc2UgaWYgKHR5cGUtPkFzU3RydWN0dXJlZFBhcmNlbGFibGUoKSAhPSBudWxscHRyKSB7Ci0gICAgICByZXR1cm4gTmRrSGVhZGVyRmlsZSgqdHlwZSwgQ2xhc3NOYW1lczo6UkFXLCBmYWxzZSAvKnVzZV9vc19zZXAqLyk7Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5Bc1VuaW9uRGVjbGFyYXRpb24oKSAhPSBudWxscHRyKSB7Ci0gICAgICByZXR1cm4gTmRrSGVhZGVyRmlsZSgqdHlwZSwgQ2xhc3NOYW1lczo6UkFXLCBmYWxzZSAvKnVzZV9vc19zZXAqLyk7Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5Bc1BhcmNlbGFibGUoKSAhPSBudWxscHRyKSB7Ci0gICAgICByZXR1cm4gdHlwZS0+QXNQYXJjZWxhYmxlKCktPkdldENwcEhlYWRlcigpOwotICAgIH0gZWxzZSBpZiAodHlwZS0+QXNFbnVtRGVjbGFyYXRpb24oKSAhPSBudWxscHRyKSB7Ci0gICAgICByZXR1cm4gTmRrSGVhZGVyRmlsZSgqdHlwZSwgQ2xhc3NOYW1lczo6UkFXLCBmYWxzZSAvKnVzZV9vc19zZXAqLyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEFJRExfRkFUQUwoKnR5cGUpIDw8ICJVbnJlY29nbml6ZWQgdHlwZS4iOwotICAgICAgcmV0dXJuICIiOwotICAgIH0KLSAgfTsKLQotICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gaW5jbHVkZXM7Ci0KLSAgLy8gdmlzaXQgYSB0eXBlIGFuZCBjb2xsZWN0IGFsbCByZWZlcmVuY2UgdHlwZXMnIGhlYWRlcnMKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiB0eXBlKT4gdmlzaXQgPSBbJl0oY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHR5cGUpIHsKLSAgICBpbmNsdWRlcy5pbnNlcnQoaGVhZGVyRmlsZVBhdGgodHlwZSkpOwotICAgIGlmICh0eXBlLklzR2VuZXJpYygpKSB7Ci0gICAgICBmb3IgKGNvbnN0IGF1dG8mIHBhcmFtIDogdHlwZS5HZXRUeXBlUGFyYW1ldGVycygpKSB7Ci0gICAgICAgIHZpc2l0KCpwYXJhbSk7CisgICAgdm9pZCBWaXNpdChjb25zdCBBaWRsU3RydWN0dXJlZFBhcmNlbGFibGUmIHBhcmNlbGFibGUpIG92ZXJyaWRlIHsKKyAgICAgIGlmIChwYXJjZWxhYmxlLklzR2VuZXJpYygpKSB7CisgICAgICAgIEdlbmVyYXRlUGFyY2VsU291cmNlKG91dCwgdHlwZXMsIHBhcmNlbGFibGUsIG9wdGlvbnMpOwogICAgICAgfQogICAgIH0KLSAgfTsKIAotICBjb25zdCBBaWRsSW50ZXJmYWNlKiBpbnRlcmZhY2UgPSBkZWZpbmVkX3R5cGUuQXNJbnRlcmZhY2UoKTsKLSAgaWYgKGludGVyZmFjZSAhPSBudWxscHRyKSB7Ci0gICAgZm9yIChjb25zdCBhdXRvJiBtZXRob2QgOiBpbnRlcmZhY2UtPkdldE1ldGhvZHMoKSkgewotICAgICAgdmlzaXQobWV0aG9kLT5HZXRUeXBlKCkpOwotICAgICAgZm9yIChjb25zdCBhdXRvJiBhcmd1bWVudCA6IG1ldGhvZC0+R2V0QXJndW1lbnRzKCkpIHsKLSAgICAgICAgdmlzaXQoYXJndW1lbnQtPkdldFR5cGUoKSk7CisgICAgdm9pZCBWaXNpdChjb25zdCBBaWRsVW5pb25EZWNsJiB1bmlvbl9kZWNsKSBvdmVycmlkZSB7CisgICAgICBpZiAodW5pb25fZGVjbC5Jc0dlbmVyaWMoKSkgeworICAgICAgICBHZW5lcmF0ZVBhcmNlbFNvdXJjZShvdXQsIHR5cGVzLCB1bmlvbl9kZWNsLCBvcHRpb25zKTsKICAgICAgIH0KICAgICB9Ci0gIH0KIAotICBhdXRvIHZpc2l0X3BhcmNlbGFibGUgPSBbJl0oY29uc3QgYXV0byYgcGFyY2VsYWJsZSkgewotICAgIGZvciAoY29uc3QgYXV0byYgZmllbGQgOiBwYXJjZWxhYmxlLkdldEZpZWxkcygpKSB7Ci0gICAgICB2aXNpdChmaWVsZC0+R2V0VHlwZSgpKTsKLSAgICAgIC8vIENoZWNrIHRoZSBmaWVsZHMgZm9yIGdlbmVyaWMgdHlwZSBhcmd1bWVudHMKLSAgICAgIGlmIChmaWVsZC0+R2V0VHlwZSgpLklzR2VuZXJpYygpKSB7Ci0gICAgICAgIGZvciAoY29uc3QgYXV0byYgdHlwZV9hcmd1bWVudCA6IGZpZWxkLT5HZXRUeXBlKCkuR2V0VHlwZVBhcmFtZXRlcnMoKSkgewotICAgICAgICAgIHZpc2l0KCp0eXBlX2FyZ3VtZW50KTsKKyAgfSB2KG91dCwgdHlwZXMsIG9wdGlvbnMpOworICBWaXNpdFRvcERvd24odiwgZGVmaW5lZF90eXBlKTsKK30KKwordm9pZCBHZW5lcmF0ZUhlYWRlcihDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsRGVmaW5lZFR5cGUmIGRlZmluZWRfdHlwZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICBvdXQgPDwgIiNwcmFnbWEgb25jZVxuXG4iOworICBHZW5lcmF0ZUhlYWRlckluY2x1ZGVzKG91dCwgdHlwZXMsIGRlZmluZWRfdHlwZSwgb3B0aW9ucyk7CisgIEVudGVyTmRrTmFtZXNwYWNlKG91dCwgZGVmaW5lZF90eXBlKTsKKyAgR2VuZXJhdGVDbGFzc0RlY2wob3V0LCB0eXBlcywgZGVmaW5lZF90eXBlLCBvcHRpb25zKTsKKyAgTGVhdmVOZGtOYW1lc3BhY2Uob3V0LCBkZWZpbmVkX3R5cGUpOworICBHZW5lcmF0ZUhlYWRlckRlZmluaXRpb25zKG91dCwgdHlwZXMsIGRlZmluZWRfdHlwZSwgb3B0aW9ucyk7Cit9CisKK3ZvaWQgR2VuZXJhdGVDbGllbnRIZWFkZXIoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbERlZmluZWRUeXBlJiBkZWZpbmVkX3R5cGUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgaWYgKGF1dG8gaWZhY2UgPSBBaWRsQ2FzdDxBaWRsSW50ZXJmYWNlPihkZWZpbmVkX3R5cGUpOyBpZmFjZSkgeworICAgIEdlbmVyYXRlQ2xpZW50SGVhZGVyKG91dCwgdHlwZXMsICppZmFjZSwgb3B0aW9ucyk7CisgIH0gZWxzZSBpZiAoYXV0byBwYXJjZWxhYmxlID0gQWlkbENhc3Q8QWlkbFN0cnVjdHVyZWRQYXJjZWxhYmxlPihkZWZpbmVkX3R5cGUpOyBwYXJjZWxhYmxlKSB7CisgICAgb3V0IDw8ICIjZXJyb3IgVE9ETyhiLzExMTM2MjU5MykgZGVmaW5lZF90eXBlcyBkbyBub3QgaGF2ZSBicCBjbGFzc2VzXG4iOworICB9IGVsc2UgaWYgKGF1dG8gdW5pb25fZGVjbCA9IEFpZGxDYXN0PEFpZGxVbmlvbkRlY2w+KGRlZmluZWRfdHlwZSk7IHVuaW9uX2RlY2wpIHsKKyAgICBvdXQgPDwgIiNlcnJvciBUT0RPKGIvMTExMzYyNTkzKSBkZWZpbmVkX3R5cGVzIGRvIG5vdCBoYXZlIGJwIGNsYXNzZXNcbiI7CisgIH0gZWxzZSBpZiAoYXV0byBlbnVtX2RlY2wgPSBBaWRsQ2FzdDxBaWRsRW51bURlY2xhcmF0aW9uPihkZWZpbmVkX3R5cGUpOyBlbnVtX2RlY2wpIHsKKyAgICBvdXQgPDwgIiNlcnJvciBUT0RPKGIvMTExMzYyNTkzKSBlbnVtcyBkbyBub3QgaGF2ZSBicCBjbGFzc2VzXG4iOworICB9IGVsc2UgeworICAgIEFJRExfRkFUQUwoZGVmaW5lZF90eXBlKSA8PCAiVW5yZWNvZ25pemVkIHR5cGUgc2VudCBmb3IgTkRLIGdlbmVyYXRpb24uIjsKKyAgfQorfQorCit2b2lkIEdlbmVyYXRlU2VydmVySGVhZGVyKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxEZWZpbmVkVHlwZSYgZGVmaW5lZF90eXBlLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIGlmIChhdXRvIGlmYWNlID0gQWlkbENhc3Q8QWlkbEludGVyZmFjZT4oZGVmaW5lZF90eXBlKTsgaWZhY2UpIHsKKyAgICBHZW5lcmF0ZVNlcnZlckhlYWRlcihvdXQsIHR5cGVzLCAqaWZhY2UsIG9wdGlvbnMpOworICB9IGVsc2UgaWYgKGF1dG8gcGFyY2VsYWJsZSA9IEFpZGxDYXN0PEFpZGxTdHJ1Y3R1cmVkUGFyY2VsYWJsZT4oZGVmaW5lZF90eXBlKTsgcGFyY2VsYWJsZSkgeworICAgIG91dCA8PCAiI2Vycm9yIFRPRE8oYi8xMTEzNjI1OTMpIGRlZmluZWRfdHlwZXMgZG8gbm90IGhhdmUgYm4gY2xhc3Nlc1xuIjsKKyAgfSBlbHNlIGlmIChhdXRvIHVuaW9uX2RlY2wgPSBBaWRsQ2FzdDxBaWRsVW5pb25EZWNsPihkZWZpbmVkX3R5cGUpOyB1bmlvbl9kZWNsKSB7CisgICAgb3V0IDw8ICIjZXJyb3IgVE9ETyhiLzExMTM2MjU5MykgZGVmaW5lZF90eXBlcyBkbyBub3QgaGF2ZSBibiBjbGFzc2VzXG4iOworICB9IGVsc2UgaWYgKGF1dG8gZW51bV9kZWNsID0gQWlkbENhc3Q8QWlkbEVudW1EZWNsYXJhdGlvbj4oZGVmaW5lZF90eXBlKTsgZW51bV9kZWNsKSB7CisgICAgb3V0IDw8ICIjZXJyb3IgVE9ETyhiLzExMTM2MjU5MykgZW51bXMgZG8gbm90IGhhdmUgYm4gY2xhc3Nlc1xuIjsKKyAgfSBlbHNlIHsKKyAgICBBSURMX0ZBVEFMKGRlZmluZWRfdHlwZSkgPDwgIlVucmVjb2duaXplZCB0eXBlIHNlbnQgZm9yIENQUCBnZW5lcmF0aW9uLiI7CisgIH0KK30KKwordm9pZCBHZW5lcmF0ZVNvdXJjZShDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsRGVmaW5lZFR5cGUmIGRlZmluZWRfdHlwZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICBzdHJ1Y3QgVmlzaXRvciA6IEFpZGxWaXNpdG9yIHsKKyAgICBDb2RlV3JpdGVyJiBvdXQ7CisgICAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZXM7CisgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9uczsKKyAgICBWaXNpdG9yKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZXMsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpCisgICAgICAgIDogb3V0KG91dCksIHR5cGVzKHR5cGVzKSwgb3B0aW9ucyhvcHRpb25zKSB7fQorCisgICAgdm9pZCBWaXNpdChjb25zdCBBaWRsSW50ZXJmYWNlJiBpbnRlcmZhY2UpIG92ZXJyaWRlIHsKKyAgICAgIEdlbmVyYXRlU291cmNlKG91dCwgdHlwZXMsIGludGVyZmFjZSwgb3B0aW9ucyk7CisgICAgfQorCisgICAgdm9pZCBWaXNpdChjb25zdCBBaWRsU3RydWN0dXJlZFBhcmNlbGFibGUmIHBhcmNlbGFibGUpIG92ZXJyaWRlIHsKKyAgICAgIGlmICghcGFyY2VsYWJsZS5Jc0dlbmVyaWMoKSkgeworICAgICAgICBHZW5lcmF0ZVBhcmNlbFNvdXJjZShvdXQsIHR5cGVzLCBwYXJjZWxhYmxlLCBvcHRpb25zKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIFZpc2l0KGNvbnN0IEFpZGxVbmlvbkRlY2wmIHVuaW9uX2RlY2wpIG92ZXJyaWRlIHsKKyAgICAgIGlmICghdW5pb25fZGVjbC5Jc0dlbmVyaWMoKSkgeworICAgICAgICBHZW5lcmF0ZVBhcmNlbFNvdXJjZShvdXQsIHR5cGVzLCB1bmlvbl9kZWNsLCBvcHRpb25zKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIFZpc2l0KGNvbnN0IEFpZGxFbnVtRGVjbGFyYXRpb24mIGVudW1fZGVjbCkgb3ZlcnJpZGUgeworICAgICAgaWYgKCFlbnVtX2RlY2wuR2V0UGFyZW50VHlwZSgpKSB7CisgICAgICAgIG91dCA8PCAiLy8gVGhpcyBmaWxlIGlzIGludGVudGlvbmFsbHkgbGVmdCBibGFuayBhcyBwbGFjZWhvbGRlciBmb3IgZW51bSBkZWNsYXJhdGlvbi5cbiI7CisgICAgICB9CisgICAgfQorICB9IHYob3V0LCB0eXBlcywgb3B0aW9ucyk7CisgIFZpc2l0VG9wRG93bih2LCBkZWZpbmVkX3R5cGUpOworfQorCit2b2lkIEdlbmVyYXRlSGVhZGVySW5jbHVkZXMoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsRGVmaW5lZFR5cGUmIGRlZmluZWRfdHlwZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICAvLyBDb2xsZWN0IGltcGxlbWVudGF0aW9uIHJlbGF0ZWQgaGVhZGVycyBhbmQgcmVmZXJlbmNlZCBkZWZpbmVkIHR5cGVzIGJ5IHJlY3Vyc2l2bHkgdmlzaXRpbmcKKyAgLy8gbmVzdGVkIHR5cGVzCisgIHN0cnVjdCBWaXNpdG9yIDogQWlkbFZpc2l0b3IgeworICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzOworICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnM7CisgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmcsIEhlYWRlckNvbXA+IGluY2x1ZGVzOworICAgIFZpc2l0b3IoY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZXMsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIDogdHlwZXModHlwZXMpLCBvcHRpb25zKG9wdGlvbnMpIHt9CisKKyAgICAvLyBDb2xsZWN0IGluY2x1ZGVzIGZvciBlYWNoIHR5cGUgcmVmZXJlbmNlCisgICAgdm9pZCBWaXNpdChjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSkgb3ZlcnJpZGUgeworICAgICAgYXV0byBkZWZpbmVkID0gdHlwZS5HZXREZWZpbmVkVHlwZSgpOworICAgICAgaWYgKCFkZWZpbmVkKSByZXR1cm47CisgICAgICBpbmNsdWRlcy5pbnNlcnQoTmRrSGVhZGVyRmlsZSgqZGVmaW5lZCwgQ2xhc3NOYW1lczo6UkFXLCBmYWxzZSAvKnVzZV9vc19zZXAqLykpOworICAgIH0KKworICAgIC8vIENvbGxlY3QgaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgaW5jbHVkZXMgZm9yIGVhY2ggdHlwZSBkZWZpbml0aW9uCisgICAgdm9pZCBWaXNpdChjb25zdCBBaWRsSW50ZXJmYWNlJiBpbnRlcmZhY2UpIG92ZXJyaWRlIHsKKyAgICAgIEFkZENvbW1vbkhlYWRlcnMoaW50ZXJmYWNlKTsKKyAgICAgIGluY2x1ZGVzLmluc2VydCgiYW5kcm9pZC9iaW5kZXJfaW50ZXJmYWNlX3V0aWxzLmgiKTsKKyAgICAgIGlmIChvcHRpb25zLkdlbkxvZygpKSB7CisgICAgICAgIGluY2x1ZGVzLmluc2VydCgiZnVuY3Rpb25hbCIpOworICAgICAgICBpbmNsdWRlcy5pbnNlcnQoImNocm9ubyIpOworICAgICAgICBpbmNsdWRlcy5pbnNlcnQoInNzdHJlYW0iKTsKKyAgICAgIH0KKyAgICAgIC8vIEZvciBuZXN0ZWQgaW50ZXJmYWNlcyBjbGllbnQvc2VydmVyIGNsYXNzZXMgYXJlIGRlZmluZWQgaW4gdGhlIHNhbWUgaGVhZGVyLgorICAgICAgLy8gU28gd2UgbmVlZCBpbmNsdWRlcyBmb3IgY2xpZW50L3NlcnZlciBjbGFzcyBhcyB3ZWxsLgorICAgICAgaWYgKGludGVyZmFjZS5HZXRQYXJlbnRUeXBlKCkpIHsKKyAgICAgICAgaW5jbHVkZXMuaW5zZXJ0KCJhbmRyb2lkL2JpbmRlcl9pYmluZGVyLmgiKTsKKyAgICAgICAgaWYgKG9wdGlvbnMuR2VuVHJhY2VzKCkpIHsKKyAgICAgICAgICBpbmNsdWRlcy5pbnNlcnQoImFuZHJvaWQvdHJhY2UuaCIpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQotICB9OwogCi0gIGNvbnN0IEFpZGxTdHJ1Y3R1cmVkUGFyY2VsYWJsZSogcGFyY2VsYWJsZSA9IGRlZmluZWRfdHlwZS5Bc1N0cnVjdHVyZWRQYXJjZWxhYmxlKCk7Ci0gIGlmIChwYXJjZWxhYmxlICE9IG51bGxwdHIpIHsKLSAgICB2aXNpdF9wYXJjZWxhYmxlKCpwYXJjZWxhYmxlKTsKLSAgfQotCi0gIGNvbnN0IEFpZGxVbmlvbkRlY2wqIHVuaW9uX2RlY2wgPSBkZWZpbmVkX3R5cGUuQXNVbmlvbkRlY2xhcmF0aW9uKCk7Ci0gIGlmICh1bmlvbl9kZWNsICE9IG51bGxwdHIpIHsKLSAgICB2aXNpdF9wYXJjZWxhYmxlKCp1bmlvbl9kZWNsKTsKLSAgfQotCi0gIGNvbnN0IEFpZGxFbnVtRGVjbGFyYXRpb24qIGVudW1fZGVjbCA9IGRlZmluZWRfdHlwZS5Bc0VudW1EZWNsYXJhdGlvbigpOwotICBpZiAoZW51bV9kZWNsICE9IG51bGxwdHIpIHsKLSAgICB2aXNpdChlbnVtX2RlY2wtPkdldEJhY2tpbmdUeXBlKCkpOwotICB9Ci0KLSAgZm9yIChjb25zdCBhdXRvJiBwYXRoIDogaW5jbHVkZXMpIHsKLSAgICBpZiAocGF0aCA9PSAiIikgewotICAgICAgY29udGludWU7CisgICAgdm9pZCBWaXNpdChjb25zdCBBaWRsU3RydWN0dXJlZFBhcmNlbGFibGUmIHBhcmNlbGFibGUpIG92ZXJyaWRlIHsKKyAgICAgIEFkZENvbW1vbkhlYWRlcnMocGFyY2VsYWJsZSk7CisgICAgICBpbmNsdWRlcy5pbnNlcnQoImFuZHJvaWQvYmluZGVyX2ludGVyZmFjZV91dGlscy5oIik7CisgICAgICBpbmNsdWRlcy5pbnNlcnQoImFuZHJvaWQvYmluZGVyX3BhcmNlbGFibGVfdXRpbHMuaCIpOworICAgICAgaW5jbHVkZXMuaW5zZXJ0KCJhbmRyb2lkL2JpbmRlcl90b19zdHJpbmcuaCIpOyAgLy8gdXNlZCBieSB0b1N0cmluZygpCiAgICAgfQorCisgICAgdm9pZCBWaXNpdChjb25zdCBBaWRsVW5pb25EZWNsJiB1bmlvbl9kZWNsKSBvdmVycmlkZSB7CisgICAgICBBZGRDb21tb25IZWFkZXJzKHVuaW9uX2RlY2wpOworICAgICAgaW5jbHVkZXMuaW5zZXJ0KCJhbmRyb2lkL2JpbmRlcl9pbnRlcmZhY2VfdXRpbHMuaCIpOworICAgICAgaW5jbHVkZXMuaW5zZXJ0KCJhbmRyb2lkL2JpbmRlcl9wYXJjZWxhYmxlX3V0aWxzLmgiKTsKKyAgICAgIGluY2x1ZGVzLmluc2VydCgiYW5kcm9pZC9iaW5kZXJfdG9fc3RyaW5nLmgiKTsgIC8vIHVzZWQgYnkgdG9TdHJpbmcoKQorICAgICAgYXV0byB1bmlvbl9oZWFkZXJzID0gY3BwOjpVbmlvbldyaXRlcjo6R2V0SGVhZGVycyh1bmlvbl9kZWNsKTsKKyAgICAgIGluY2x1ZGVzLmluc2VydChzdGQ6OmJlZ2luKHVuaW9uX2hlYWRlcnMpLCBzdGQ6OmVuZCh1bmlvbl9oZWFkZXJzKSk7CisgICAgfQorCisgICAgdm9pZCBWaXNpdChjb25zdCBBaWRsRW51bURlY2xhcmF0aW9uJiBlbnVtX2RlY2wpIG92ZXJyaWRlIHsKKyAgICAgIEFkZENvbW1vbkhlYWRlcnMoZW51bV9kZWNsKTsKKyAgICAgIGluY2x1ZGVzLmluc2VydCgiYXJyYXkiKTsKKyAgICAgIGluY2x1ZGVzLmluc2VydCgiYW5kcm9pZC9iaW5kZXJfZW51bXMuaCIpOworICAgIH0KKworICAgIHZvaWQgQWRkQ29tbW9uSGVhZGVycyhjb25zdCBBaWRsRGVmaW5lZFR5cGUmIGRlZmluZWRfdHlwZSkgeworICAgICAgaW5jbHVkZXMuaW5zZXJ0KCJjc3RkaW50Iik7CisgICAgICBpbmNsdWRlcy5pbnNlcnQoIm1lbW9yeSIpOworICAgICAgaW5jbHVkZXMuaW5zZXJ0KCJvcHRpb25hbCIpOworICAgICAgaW5jbHVkZXMuaW5zZXJ0KCJzdHJpbmciKTsKKyAgICAgIGluY2x1ZGVzLmluc2VydCgidmVjdG9yIik7CisgICAgICBpZiAoZGVmaW5lZF90eXBlLklzU2Vuc2l0aXZlRGF0YSgpKSB7CisgICAgICAgIGluY2x1ZGVzLmluc2VydCgiYW5kcm9pZC9iaW5kZXJfcGFyY2VsX3BsYXRmb3JtLmgiKTsKKyAgICAgICAgaW5jbHVkZXMuaW5zZXJ0KCJhbmRyb2lkL2JpbmRlcl9pYmluZGVyX3BsYXRmb3JtLmgiKTsKKyAgICAgIH0KKyAgICB9CisgIH0gdih0eXBlcywgb3B0aW9ucyk7CisgIFZpc2l0VG9wRG93bih2LCBkZWZpbmVkX3R5cGUpOworCisgIGZvciAoY29uc3QgYXV0byYgcGF0aCA6IHYuaW5jbHVkZXMpIHsKICAgICBvdXQgPDwgIiNpbmNsdWRlIDwiIDw8IHBhdGggPDwgIj5cbiI7CiAgIH0KKyAgb3V0IDw8ICIjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUXG4iOworICBvdXQgPDwgIiNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9zdGFiaWxpdHkuaD5cbiI7CisgIG91dCA8PCAiI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlRcbiI7CisgIG91dCA8PCAiXG4iOworCisgIGlmICh2LmluY2x1ZGVzLmNvdW50KCJjYXNzZXJ0IikpIHsKKyAgICAvLyBUT0RPKGIvMzE1NTkwOTUpIGJpb25pYyBvbiBob3N0IHNob3VsZCBkZWZpbmUgX19hc3NlcnQyCisgICAgb3V0IDw8ICIjaWZuZGVmIF9fQklPTklDX19cbiNkZWZpbmUgX19hc3NlcnQyKGEsYixjLGQpICgodm9pZCkwKVxuI2VuZGlmXG5cbiI7CisgIH0KK30KKwordm9pZCBHZW5lcmF0ZUNsYXNzRGVjbChDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsRGVmaW5lZFR5cGUmIGRlZmluZWRfdHlwZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICBpZiAoYXV0byBpZmFjZSA9IEFpZGxDYXN0PEFpZGxJbnRlcmZhY2U+KGRlZmluZWRfdHlwZSk7IGlmYWNlKSB7CisgICAgR2VuZXJhdGVJbnRlcmZhY2VDbGFzc0RlY2wob3V0LCB0eXBlcywgKmlmYWNlLCBvcHRpb25zKTsKKyAgfSBlbHNlIGlmIChhdXRvIHBhcmNlbGFibGUgPSBBaWRsQ2FzdDxBaWRsU3RydWN0dXJlZFBhcmNlbGFibGU+KGRlZmluZWRfdHlwZSk7IHBhcmNlbGFibGUpIHsKKyAgICBHZW5lcmF0ZVBhcmNlbENsYXNzRGVjbChvdXQsIHR5cGVzLCAqcGFyY2VsYWJsZSwgb3B0aW9ucyk7CisgIH0gZWxzZSBpZiAoYXV0byB1bmlvbl9kZWNsID0gQWlkbENhc3Q8QWlkbFVuaW9uRGVjbD4oZGVmaW5lZF90eXBlKTsgdW5pb25fZGVjbCkgeworICAgIEdlbmVyYXRlUGFyY2VsQ2xhc3NEZWNsKG91dCwgdHlwZXMsICp1bmlvbl9kZWNsLCBvcHRpb25zKTsKKyAgfSBlbHNlIGlmIChhdXRvIGVudW1fZGVjbCA9IEFpZGxDYXN0PEFpZGxFbnVtRGVjbGFyYXRpb24+KGRlZmluZWRfdHlwZSk7IGVudW1fZGVjbCkgeworICAgIEdlbmVyYXRlRW51bUNsYXNzRGVjbChvdXQsIHR5cGVzLCAqZW51bV9kZWNsLCBvcHRpb25zKTsKKyAgfSBlbHNlIHsKKyAgICBBSURMX0ZBVEFMKGRlZmluZWRfdHlwZSkgPDwgIlVucmVjb2duaXplZCB0eXBlIHNlbnQgZm9yIE5ESyBnZW5lcmF0aW9uLiI7CisgIH0KIH0KIAogc3RhdGljIHZvaWQgR2VuZXJhdGVTb3VyY2VJbmNsdWRlcyhDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsRGVmaW5lZFR5cGUmIC8qZGVmaW5lZF90eXBlKi8pIHsKLSAgb3V0IDw8ICIjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcGFyY2VsX3V0aWxzLmg+XG4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsRGVmaW5lZFR5cGUmIGRlZmluZWRfdHlwZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICAvLyBPbmNlIGluIGEgLmNwcCBmaWxlCisgIGlmIChkZWZpbmVkX3R5cGUuR2V0UGFyZW50VHlwZSgpICE9IG51bGxwdHIpIHsKKyAgICByZXR1cm47CisgIH0KIAorICBjb25zdCBzdHJpbmcgc2VsZl9oZWFkZXIgPSBOZGtIZWFkZXJGaWxlKGRlZmluZWRfdHlwZSwgQ2xhc3NOYW1lczo6UkFXLCBmYWxzZSAvKnVzZV9vc19zZXAqLyk7CisgIG91dCA8PCAiI2luY2x1ZGUgXCIiIDw8IHNlbGZfaGVhZGVyIDw8ICJcIlxuIjsKKyAgb3V0IDw8ICJcbiI7CisKKyAgc3RkOjpzZXQ8c3RkOjpzdHJpbmcsIEhlYWRlckNvbXA+IGluY2x1ZGVzID0ge3NlbGZfaGVhZGVyfTsKKyAgaW5jbHVkZXMuaW5zZXJ0KCJhbmRyb2lkL2JpbmRlcl9wYXJjZWxfdXRpbHMuaCIpOwogICB0eXBlcy5JdGVyYXRlVHlwZXMoWyZdKGNvbnN0IEFpZGxEZWZpbmVkVHlwZSYgYV9kZWZpbmVkX3R5cGUpIHsKICAgICBpZiAoYV9kZWZpbmVkX3R5cGUuQXNJbnRlcmZhY2UoKSAhPSBudWxscHRyKSB7Ci0gICAgICBvdXQgPDwgIiNpbmNsdWRlIDwiIDw8IE5ka0hlYWRlckZpbGUoYV9kZWZpbmVkX3R5cGUsIENsYXNzTmFtZXM6OkNMSUVOVCwgZmFsc2UgLyp1c2Vfb3Nfc2VwKi8pCi0gICAgICAgICAgPDwgIj5cbiI7Ci0gICAgICBvdXQgPDwgIiNpbmNsdWRlIDwiIDw8IE5ka0hlYWRlckZpbGUoYV9kZWZpbmVkX3R5cGUsIENsYXNzTmFtZXM6OlNFUlZFUiwgZmFsc2UgLyp1c2Vfb3Nfc2VwKi8pCi0gICAgICAgICAgPDwgIj5cbiI7Ci0gICAgICBvdXQgPDwgIiNpbmNsdWRlIDwiIDw8IE5ka0hlYWRlckZpbGUoYV9kZWZpbmVkX3R5cGUsIENsYXNzTmFtZXM6OlJBVywgZmFsc2UgLyp1c2Vfb3Nfc2VwKi8pCi0gICAgICAgICAgPDwgIj5cbiI7CisgICAgICBpbmNsdWRlcy5pbnNlcnQoTmRrSGVhZGVyRmlsZShhX2RlZmluZWRfdHlwZSwgQ2xhc3NOYW1lczo6Q0xJRU5ULCBmYWxzZSAvKnVzZV9vc19zZXAqLykpOworICAgICAgaW5jbHVkZXMuaW5zZXJ0KE5ka0hlYWRlckZpbGUoYV9kZWZpbmVkX3R5cGUsIENsYXNzTmFtZXM6OlNFUlZFUiwgZmFsc2UgLyp1c2Vfb3Nfc2VwKi8pKTsKKyAgICAgIGluY2x1ZGVzLmluc2VydChOZGtIZWFkZXJGaWxlKGFfZGVmaW5lZF90eXBlLCBDbGFzc05hbWVzOjpSQVcsIGZhbHNlIC8qdXNlX29zX3NlcCovKSk7CiAgICAgfQogICB9KTsKKworICBzdHJ1Y3QgVmlzaXRvciA6IEFpZGxWaXNpdG9yIHsKKyAgICBib29sIGhhc19pbnRlcmZhY2UgPSBmYWxzZTsKKyAgICB2b2lkIFZpc2l0KGNvbnN0IEFpZGxJbnRlcmZhY2UmKSBvdmVycmlkZSB7IGhhc19pbnRlcmZhY2UgPSB0cnVlOyB9CisgIH0gdjsKKyAgVmlzaXRUb3BEb3duKHYsIGRlZmluZWRfdHlwZSk7CisKKyAgaWYgKHYuaGFzX2ludGVyZmFjZSAmJiBvcHRpb25zLkdlbkxvZygpKSB7CisgICAgaW5jbHVkZXMuaW5zZXJ0KCJhbmRyb2lkL2JpbmRlcl90b19zdHJpbmcuaCIpOworICB9CisKKyAgLy8gRW1pdCBpbmNsdWRlcyBleGNlcHQgc2VsZl9oZWFkZXIKKyAgaW5jbHVkZXMuZXJhc2UoaW5jbHVkZXMuZmluZChzZWxmX2hlYWRlcikpOworICBmb3IgKGNvbnN0IGF1dG8mIGluYyA6IGluY2x1ZGVzKSB7CisgICAgb3V0IDw8ICIjaW5jbHVkZSA8IiA8PCBpbmMgPDwgIj5cbiI7CisgIH0KKyAgb3V0IDw8ICJcbiI7CisKKyAgLy8gRW1pdCBhZGRpdGlvbmFsIGRlZmluaXRpb24gZm9yIGdlbl90cmFjZXMKKyAgaWYgKHYuaGFzX2ludGVyZmFjZSAmJiBvcHRpb25zLkdlblRyYWNlcygpKSB7CisgICAgb3V0IDw8ICJuYW1lc3BhY2Uge1xuIjsKKyAgICBvdXQgPDwgInN0cnVjdCBTY29wZWRUcmFjZSB7XG4iOworICAgIG91dC5JbmRlbnQoKTsKKyAgICBvdXQgPDwgImlubGluZSBleHBsaWNpdCBTY29wZWRUcmFjZShjb25zdCBjaGFyKiBuYW1lKSB7IEFUcmFjZV9iZWdpblNlY3Rpb24obmFtZSk7IH1cbiI7CisgICAgb3V0IDw8ICJpbmxpbmUgflNjb3BlZFRyYWNlKCkgeyBBVHJhY2VfZW5kU2VjdGlvbigpOyB9XG4iOworICAgIG91dC5EZWRlbnQoKTsKKyAgICBvdXQgPDwgIn07XG4iOworICAgIG91dCA8PCAifSAgLy8gbmFtZXNwYWNlXG4iOworICAgIG91dCA8PCAiXG4iOworICB9CiB9CiAKLXRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlV2l0aENvbnN0YW50cz4KIHN0YXRpYyB2b2lkIEdlbmVyYXRlQ29uc3RhbnREZWNsYXJhdGlvbnMoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHlwZVdpdGhDb25zdGFudHMmIHR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbERlZmluZWRUeXBlJiB0eXBlKSB7CiAgIGZvciAoY29uc3QgYXV0byYgY29uc3RhbnQgOiB0eXBlLkdldENvbnN0YW50RGVjbGFyYXRpb25zKCkpIHsKICAgICBjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSA9IGNvbnN0YW50LT5HZXRUeXBlKCk7CiAKQEAgLTMyNiw4ICs0MzMsNyBAQAogICB9CiB9CiAKLXRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlV2l0aENvbnN0YW50cz4KLXN0YXRpYyB2b2lkIEdlbmVyYXRlQ29uc3RhbnREZWZpbml0aW9ucyhDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IFR5cGVXaXRoQ29uc3RhbnRzJiBpbnRlcmZhY2UsCitzdGF0aWMgdm9pZCBHZW5lcmF0ZUNvbnN0YW50RGVmaW5pdGlvbnMoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsRGVmaW5lZFR5cGUmIGludGVyZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY2xhenosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHRtcGxfZGVjbCA9ICIiKSB7CiAgIGZvciAoY29uc3QgYXV0byYgY29uc3RhbnQgOiBpbnRlcmZhY2UuR2V0Q29uc3RhbnREZWNsYXJhdGlvbnMoKSkgewpAQCAtMzQ1LDEyICs0NTEsNyBAQAogCiB2b2lkIEdlbmVyYXRlU291cmNlKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZXMsIGNvbnN0IEFpZGxJbnRlcmZhY2UmIGRlZmluZWRfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgewotICBHZW5lcmF0ZVNvdXJjZUluY2x1ZGVzKG91dCwgdHlwZXMsIGRlZmluZWRfdHlwZSk7Ci0gIGlmIChvcHRpb25zLkdlbkxvZygpKSB7Ci0gICAgb3V0IDw8ICIjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfdG9fc3RyaW5nLmg+XG4iOwotICB9Ci0gIG91dCA8PCAiXG4iOwotCisgIEdlbmVyYXRlU291cmNlSW5jbHVkZXMob3V0LCB0eXBlcywgZGVmaW5lZF90eXBlLCBvcHRpb25zKTsKICAgRW50ZXJOZGtOYW1lc3BhY2Uob3V0LCBkZWZpbmVkX3R5cGUpOwogICBHZW5lcmF0ZUNsYXNzU291cmNlKG91dCwgdHlwZXMsIGRlZmluZWRfdHlwZSwgb3B0aW9ucyk7CiAgIEdlbmVyYXRlQ2xpZW50U291cmNlKG91dCwgdHlwZXMsIGRlZmluZWRfdHlwZSwgb3B0aW9ucyk7CkBAIC0zNjUsMTEgKzQ2NiwxMSBAQAogCiBzdGF0aWMgdm9pZCBHZW5lcmF0ZUNsaWVudE1ldGhvZERlZmluaXRpb24oQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsSW50ZXJmYWNlJiBkZWZpbmVkX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbE1ldGhvZCYgbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsTWV0aG9kJiBtZXRob2QsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgcV9uYW1lID0gR2V0UXVhbGlmaWVkTmFtZShkZWZpbmVkX3R5cGUsIENsYXNzTmFtZXM6OkNMSUVOVCk7CiAgIGNvbnN0IHN0ZDo6c3RyaW5nIGNsYXp6ID0gQ2xhc3NOYW1lKGRlZmluZWRfdHlwZSwgQ2xhc3NOYW1lczo6Q0xJRU5UKTsKIAotICBvdXQgPDwgTmRrTWV0aG9kRGVjbCh0eXBlcywgbWV0aG9kLCBjbGF6eikgPDwgIiB7XG4iOworICBvdXQgPDwgTmRrTWV0aG9kRGVjbCh0eXBlcywgbWV0aG9kLCBxX25hbWUpIDw8ICIge1xuIjsKICAgb3V0LkluZGVudCgpOwogICBvdXQgPDwgImJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX09LO1xuIjsKICAgb3V0IDw8ICI6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7XG4iOwpAQCAtMzk3LDggKzQ5OCw3IEBACiAgIG91dCA8PCAiXG4iOwogCiAgIGlmIChvcHRpb25zLkdlbkxvZygpKSB7Ci0gICAgb3V0IDw8IGNwcDo6R2VuTG9nQmVmb3JlRXhlY3V0ZShDbGFzc05hbWUoZGVmaW5lZF90eXBlLCBDbGFzc05hbWVzOjpDTElFTlQpLCBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBpc1NlcnZlciAqLywgdHJ1ZSAvKiBpc05kayAqLyk7CisgICAgb3V0IDw8IGNwcDo6R2VuTG9nQmVmb3JlRXhlY3V0ZShxX25hbWUsIG1ldGhvZCwgZmFsc2UgLyogaXNTZXJ2ZXIgKi8sIHRydWUgLyogaXNOZGsgKi8pOwogICB9CiAgIGlmIChvcHRpb25zLkdlblRyYWNlcygpKSB7CiAgICAgb3V0IDw8ICJTY29wZWRUcmFjZSBfYWlkbF90cmFjZShcIkFJREw6OiIgPDwgdG9fc3RyaW5nKG9wdGlvbnMuVGFyZ2V0TGFuZ3VhZ2UoKSkKQEAgLTQyMSw3ICs1MjEsNyBAQAogICAgICAgV3JpdGVUb1BhcmNlbEZvcih7b3V0LCB0eXBlcywgYXJnLT5HZXRUeXBlKCksICJfYWlkbF9pbi5nZXQoKSIsIHByZWZpeCArIHZhcl9uYW1lfSk7CiAgICAgICBvdXQgPDwgIjtcbiI7CiAgICAgICBTdGF0dXNDaGVja0dvdG8ob3V0KTsKLSAgICB9IGVsc2UgaWYgKGFyZy0+SXNPdXQoKSAmJiBhcmctPkdldFR5cGUoKS5Jc0FycmF5KCkpIHsKKyAgICB9IGVsc2UgaWYgKGFyZy0+SXNPdXQoKSAmJiBhcmctPkdldFR5cGUoKS5Jc0R5bmFtaWNBcnJheSgpKSB7CiAgICAgICBvdXQgPDwgIl9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvclNpemUoX2FpZGxfaW4uZ2V0KCksICoiIDw8IHZhcl9uYW1lCiAgICAgICAgICAgPDwgIik7XG4iOwogICAgICAgU3RhdHVzQ2hlY2tHb3RvKG91dCk7CkBAIC00ODgsOSArNTg4LDggQEAKICAgb3V0IDw8ICJfYWlkbF9zdGF0dXMuc2V0KEFTdGF0dXNfZnJvbVN0YXR1cyhfYWlkbF9yZXRfc3RhdHVzKSk7XG4iOwogICBvdXQgPDwgIl9haWRsX3N0YXR1c19yZXR1cm46XG4iOwogICBpZiAob3B0aW9ucy5HZW5Mb2coKSkgewotICAgIG91dCA8PCBjcHA6OkdlbkxvZ0FmdGVyRXhlY3V0ZShDbGFzc05hbWUoZGVmaW5lZF90eXBlLCBDbGFzc05hbWVzOjpDTElFTlQpLCBkZWZpbmVkX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCwgIl9haWRsX3N0YXR1cyIsICJfYWlkbF9yZXR1cm4iLCBmYWxzZSAvKiBpc1NlcnZlciAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBpc05kayAqLyk7CisgICAgb3V0IDw8IGNwcDo6R2VuTG9nQWZ0ZXJFeGVjdXRlKHFfbmFtZSwgZGVmaW5lZF90eXBlLCBtZXRob2QsICJfYWlkbF9zdGF0dXMiLCAiX2FpZGxfcmV0dXJuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogaXNTZXJ2ZXIgKi8sIHRydWUgLyogaXNOZGsgKi8pOwogICB9CiAKICAgb3V0IDw8ICJyZXR1cm4gX2FpZGxfc3RhdHVzO1xuIjsKQEAgLTUwMSw4ICs2MDAsMTUgQEAKIHN0YXRpYyB2b2lkIEdlbmVyYXRlU2VydmVyQ2FzZURlZmluaXRpb24oQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbEludGVyZmFjZSYgZGVmaW5lZF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsTWV0aG9kJiBtZXRob2QsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgY29uc3Qgc3RyaW5nIHFfbmFtZSA9IEdldFF1YWxpZmllZE5hbWUoZGVmaW5lZF90eXBlLCBDbGFzc05hbWVzOjpTRVJWRVIpOworCiAgIG91dCA8PCAiY2FzZSAiIDw8IE1ldGhvZElkKG1ldGhvZCkgPDwgIjoge1xuIjsKICAgb3V0LkluZGVudCgpOworCisgIGlmIChkZWZpbmVkX3R5cGUuRW5mb3JjZUV4cHJlc3Npb24oKSB8fCBtZXRob2QuR2V0VHlwZSgpLkVuZm9yY2VFeHByZXNzaW9uKCkpIHsKKyAgICBvdXQuV3JpdGUoIiNlcnJvciBQZXJtaXNzaW9uIGNoZWNrcyBub3QgaW1wbGVtZW50ZWQgZm9yIHRoZSBuZGsgYmFja2VuZFxuIik7CisgIH0KKwogICBmb3IgKGNvbnN0IGF1dG8mIGFyZyA6IG1ldGhvZC5HZXRBcmd1bWVudHMoKSkgewogICAgIG91dCA8PCBOZGtOYW1lT2YodHlwZXMsIGFyZy0+R2V0VHlwZSgpLCBTdG9yYWdlTW9kZTo6U1RBQ0spIDw8ICIgIiA8PCBjcHA6OkJ1aWxkVmFyTmFtZSgqYXJnKQogICAgICAgICA8PCAiO1xuIjsKQEAgLTUyNSwyMiArNjMxLDIwIEBACiAgICAgICBSZWFkRnJvbVBhcmNlbEZvcih7b3V0LCB0eXBlcywgYXJnLT5HZXRUeXBlKCksICJfYWlkbF9pbiIsICImIiArIHZhcl9uYW1lfSk7CiAgICAgICBvdXQgPDwgIjtcbiI7CiAgICAgICBTdGF0dXNDaGVja0JyZWFrKG91dCk7Ci0gICAgfSBlbHNlIGlmIChhcmctPklzT3V0KCkgJiYgYXJnLT5HZXRUeXBlKCkuSXNBcnJheSgpKSB7CisgICAgfSBlbHNlIGlmIChhcmctPklzT3V0KCkgJiYgYXJnLT5HZXRUeXBlKCkuSXNEeW5hbWljQXJyYXkoKSkgewogICAgICAgb3V0IDw8ICJfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVzaXplVmVjdG9yKF9haWRsX2luLCAmIiA8PCB2YXJfbmFtZSA8PCAiKTtcbiI7CiAgICAgICBTdGF0dXNDaGVja0JyZWFrKG91dCk7CiAgICAgfQogICB9CiAgIGlmIChvcHRpb25zLkdlbkxvZygpKSB7Ci0gICAgb3V0IDw8IGNwcDo6R2VuTG9nQmVmb3JlRXhlY3V0ZShDbGFzc05hbWUoZGVmaW5lZF90eXBlLCBDbGFzc05hbWVzOjpTRVJWRVIpLCBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGlzU2VydmVyICovLCB0cnVlIC8qIGlzTmRrICovKTsKKyAgICBvdXQgPDwgY3BwOjpHZW5Mb2dCZWZvcmVFeGVjdXRlKHFfbmFtZSwgbWV0aG9kLCB0cnVlIC8qIGlzU2VydmVyICovLCB0cnVlIC8qIGlzTmRrICovKTsKICAgfQogICBvdXQgPDwgIjo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1cyA9IF9haWRsX2ltcGwtPiIgPDwgbWV0aG9kLkdldE5hbWUoKSA8PCAiKCIKICAgICAgIDw8IE5ka0FyZ0xpc3QodHlwZXMsIG1ldGhvZCwgRm9ybWF0QXJnRm9yQ2FsbCkgPDwgIik7XG4iOwogCiAgIGlmIChvcHRpb25zLkdlbkxvZygpKSB7Ci0gICAgb3V0IDw8IGNwcDo6R2VuTG9nQWZ0ZXJFeGVjdXRlKENsYXNzTmFtZShkZWZpbmVkX3R5cGUsIENsYXNzTmFtZXM6OlNFUlZFUiksIGRlZmluZWRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLCAiX2FpZGxfc3RhdHVzIiwgIl9haWRsX3JldHVybiIsIHRydWUgLyogaXNTZXJ2ZXIgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogaXNOZGsgKi8pOworICAgIG91dCA8PCBjcHA6OkdlbkxvZ0FmdGVyRXhlY3V0ZShxX25hbWUsIGRlZmluZWRfdHlwZSwgbWV0aG9kLCAiX2FpZGxfc3RhdHVzIiwgIl9haWRsX3JldHVybiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogaXNTZXJ2ZXIgKi8sIHRydWUgLyogaXNOZGsgKi8pOwogICB9CiAgIGlmIChtZXRob2QuSXNPbmV3YXkoKSkgewogICAgIC8vIEZvciBhIG9uZXdheSB0cmFuc2FjdGlvbiwgdGhlIGtlcm5lbCB3aWxsIGhhdmUgYWxyZWFkeSByZXR1cm5lZCBhIHJlc3VsdC4gVGhpcyBpcyBmb3IgdGhlCkBAIC01NzAsMjMgKzY3NCwyNCBAQAogICBvdXQgPDwgIn1cbiI7CiB9CiAKK3N0YXRpYyBzdHJpbmcgT25UcmFuc2FjdEZ1bmNOYW1lKGNvbnN0IEFpZGxJbnRlcmZhY2UmIGludGVyZmFjZSkgeworICBzdHJpbmcgbmFtZSA9IGludGVyZmFjZS5HZXRDYW5vbmljYWxOYW1lKCk7CisgIHN0ZDo6cmVwbGFjZShuYW1lLmJlZ2luKCksIG5hbWUuZW5kKCksICcuJywgJ18nKTsKKyAgcmV0dXJuICJfYWlkbF8iICsgbmFtZSArICJfb25UcmFuc2FjdCI7Cit9CisKK3N0YXRpYyBzdHJpbmcgR2xvYmFsQ2xhc3NWYXJOYW1lKGNvbnN0IEFpZGxJbnRlcmZhY2UmIGludGVyZmFjZSkgeworICBzdHJpbmcgbmFtZSA9IGludGVyZmFjZS5HZXRDYW5vbmljYWxOYW1lKCk7CisgIHN0ZDo6cmVwbGFjZShuYW1lLmJlZ2luKCksIG5hbWUuZW5kKCksICcuJywgJ18nKTsKKyAgcmV0dXJuICJfZ19haWRsXyIgKyBuYW1lICsgIl9jbGF6eiI7Cit9CisKIHZvaWQgR2VuZXJhdGVDbGFzc1NvdXJjZShDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxJbnRlcmZhY2UmIGRlZmluZWRfdHlwZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgewotICBjb25zdCBzdGQ6OnN0cmluZyBjbGF6eiA9IENsYXNzTmFtZShkZWZpbmVkX3R5cGUsIENsYXNzTmFtZXM6OklOVEVSRkFDRSk7Ci0gIGNvbnN0IHN0ZDo6c3RyaW5nIGJuX2NsYXp6ID0gQ2xhc3NOYW1lKGRlZmluZWRfdHlwZSwgQ2xhc3NOYW1lczo6U0VSVkVSKTsKLSAgaWYgKG9wdGlvbnMuR2VuVHJhY2VzKCkpIHsKLSAgICBvdXQgPDwgImNsYXNzIFNjb3BlZFRyYWNlIHtcbiI7Ci0gICAgb3V0LkluZGVudCgpOwotICAgIG91dCA8PCAicHVibGljOlxuIgotICAgICAgICA8PCAiaW5saW5lIGV4cGxpY2l0IFNjb3BlZFRyYWNlKGNvbnN0IGNoYXIqIG5hbWUpIHtcbiIKLSAgICAgICAgPDwgIkFUcmFjZV9iZWdpblNlY3Rpb24obmFtZSk7XG4iCi0gICAgICAgIDw8ICJ9XG4iCi0gICAgICAgIDw8ICJpbmxpbmUgflNjb3BlZFRyYWNlKCkge1xuIgotICAgICAgICA8PCAiQVRyYWNlX2VuZFNlY3Rpb24oKTtcbiIKLSAgICAgICAgPDwgIn1cbiI7Ci0gICAgb3V0LkRlZGVudCgpOwotICAgIG91dCA8PCAifTtcbiI7Ci0gIH0KKyAgY29uc3Qgc3RkOjpzdHJpbmcgaV9uYW1lID0gR2V0UXVhbGlmaWVkTmFtZShkZWZpbmVkX3R5cGUsIENsYXNzTmFtZXM6OklOVEVSRkFDRSk7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIHFfbmFtZSA9IEdldFF1YWxpZmllZE5hbWUoZGVmaW5lZF90eXBlLCBDbGFzc05hbWVzOjpTRVJWRVIpOworCisgIGNvbnN0IHN0cmluZyBvbl90cmFuc2FjdCA9IE9uVHJhbnNhY3RGdW5jTmFtZShkZWZpbmVkX3R5cGUpOwogICBib29sIGRlcHJlY2F0ZWQgPSBkZWZpbmVkX3R5cGUuSXNEZXByZWNhdGVkKCkgfHwKICAgICAgICAgICAgICAgICAgICAgc3RkOjphbnlfb2YoZGVmaW5lZF90eXBlLkdldE1ldGhvZHMoKS5iZWdpbigpLCBkZWZpbmVkX3R5cGUuR2V0TWV0aG9kcygpLmVuZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXShjb25zdCBhdXRvJiBtKSB7IHJldHVybiBtLT5Jc0RlcHJlY2F0ZWQoKTsgfSk7CkBAIC01OTQsOCArNjk5LDcgQEAKICAgICBvdXQgPDwgIiNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoXG4iOwogICAgIG91dCA8PCAiI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgXCItV2RlcHJlY2F0ZWRcIlxuIjsKICAgfQotICBvdXQgPDwgInN0YXRpYyBiaW5kZXJfc3RhdHVzX3QgIgotICAgICAgPDwgIl9haWRsX29uVHJhbnNhY3QiCisgIG91dCA8PCAic3RhdGljIGJpbmRlcl9zdGF0dXNfdCAiIDw8IG9uX3RyYW5zYWN0CiAgICAgICA8PCAiKEFJQmluZGVyKiBfYWlkbF9iaW5kZXIsIHRyYW5zYWN0aW9uX2NvZGVfdCBfYWlkbF9jb2RlLCBjb25zdCBBUGFyY2VsKiBfYWlkbF9pbiwgIgogICAgICAgICAgIkFQYXJjZWwqIF9haWRsX291dCkge1xuIjsKICAgb3V0LkluZGVudCgpOwpAQCAtNjA1LDcgKzcwOSw3IEBACiAgIGlmICghZGVmaW5lZF90eXBlLkdldE1ldGhvZHMoKS5lbXB0eSgpKSB7CiAgICAgLy8gd2Uga25vdyB0aGlzIGNhc3QgaXMgdmFsaWQgYmVjYXVzZSB0aGlzIG1ldGhvZCBpcyBvbmx5IGNhbGxlZCBieSB0aGUgSUNJbnRlcmZhY2UKICAgICAvLyBBSUJpbmRlcl9DbGFzcyBvYmplY3Qgd2hpY2ggaXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY2xhc3MuCi0gICAgb3V0IDw8ICJzdGQ6OnNoYXJlZF9wdHI8IiA8PCBibl9jbGF6eiA8PCAiPiBfYWlkbF9pbXBsID0gc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PCIgPDwgYm5fY2xhenoKKyAgICBvdXQgPDwgInN0ZDo6c2hhcmVkX3B0cjwiIDw8IHFfbmFtZSA8PCAiPiBfYWlkbF9pbXBsID0gc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PCIgPDwgcV9uYW1lCiAgICAgICAgIDw8ICI+KDo6bmRrOjpJQ0ludGVyZmFjZTo6YXNJbnRlcmZhY2UoX2FpZGxfYmluZGVyKSk7XG4iOwogICAgIG91dCA8PCAic3dpdGNoIChfYWlkbF9jb2RlKSB7XG4iOwogICAgIG91dC5JbmRlbnQoKTsKQEAgLTYyMiw4ICs3MjYsOSBAQAogICBvdXQuRGVkZW50KCk7CiAgIG91dCA8PCAifVxuXG4iOwogCi0gIG91dCA8PCAic3RhdGljIEFJQmluZGVyX0NsYXNzKiAiIDw8IGtDbGF6eiA8PCAiID0gOjpuZGs6OklDSW50ZXJmYWNlOjpkZWZpbmVDbGFzcygiIDw8IGNsYXp6Ci0gICAgICA8PCAiOjoiIDw8IGtEZXNjcmlwdG9yIDw8ICIsIF9haWRsX29uVHJhbnNhY3QpO1xuXG4iOworICBvdXQgPDwgInN0YXRpYyBBSUJpbmRlcl9DbGFzcyogIiA8PCBHbG9iYWxDbGFzc1Zhck5hbWUoZGVmaW5lZF90eXBlKQorICAgICAgPDwgIiA9IDo6bmRrOjpJQ0ludGVyZmFjZTo6ZGVmaW5lQ2xhc3MoIiA8PCBpX25hbWUgPDwgIjo6IiA8PCBrRGVzY3JpcHRvciA8PCAiLCAiCisgICAgICA8PCBvbl90cmFuc2FjdCA8PCAiKTtcblxuIjsKICAgaWYgKGRlcHJlY2F0ZWQpIHsKICAgICBvdXQgPDwgIiNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3BcbiI7CiAgIH0KQEAgLTYzMSwzMiArNzM2LDM4IEBACiAKIHZvaWQgR2VuZXJhdGVDbGllbnRTb3VyY2UoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbEludGVyZmFjZSYgZGVmaW5lZF90eXBlLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIHFfbmFtZSA9IEdldFF1YWxpZmllZE5hbWUoZGVmaW5lZF90eXBlLCBDbGFzc05hbWVzOjpDTElFTlQpOwogICBjb25zdCBzdGQ6OnN0cmluZyBjbGF6eiA9IENsYXNzTmFtZShkZWZpbmVkX3R5cGUsIENsYXNzTmFtZXM6OkNMSUVOVCk7CiAKLSAgb3V0IDw8IGNsYXp6IDw8ICI6OiIgPDwgY2xhenogPDwgIihjb25zdCA6Om5kazo6U3BBSUJpbmRlciYgYmluZGVyKSA6IEJwQ0ludGVyZmFjZShiaW5kZXIpIHt9XG4iOwotICBvdXQgPDwgY2xhenogPDwgIjo6fiIgPDwgY2xhenogPDwgIigpIHt9XG4iOworICBvdXQgPDwgcV9uYW1lIDw8ICI6OiIgPDwgY2xhenogPDwgIihjb25zdCA6Om5kazo6U3BBSUJpbmRlciYgYmluZGVyKSA6IEJwQ0ludGVyZmFjZShiaW5kZXIpIHt9XG4iOworICBvdXQgPDwgcV9uYW1lIDw8ICI6On4iIDw8IGNsYXp6IDw8ICIoKSB7fVxuIjsKICAgaWYgKG9wdGlvbnMuR2VuTG9nKCkpIHsKLSAgICBvdXQgPDwgInN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCAiICsgY2xhenogKyAiOjpUcmFuc2FjdGlvbkxvZyYpPiAiIDw8IGNsYXp6IDw8ICI6OmxvZ0Z1bmM7XG4iOworICAgIG91dCA8PCAic3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0ICIgPDwgcV9uYW1lIDw8ICI6OlRyYW5zYWN0aW9uTG9nJik+ICIgPDwgcV9uYW1lCisgICAgICAgIDw8ICI6OmxvZ0Z1bmM7XG4iOwogICB9CiAgIG91dCA8PCAiXG4iOwogICBmb3IgKGNvbnN0IGF1dG8mIG1ldGhvZCA6IGRlZmluZWRfdHlwZS5HZXRNZXRob2RzKCkpIHsKICAgICBHZW5lcmF0ZUNsaWVudE1ldGhvZERlZmluaXRpb24ob3V0LCB0eXBlcywgZGVmaW5lZF90eXBlLCAqbWV0aG9kLCBvcHRpb25zKTsKICAgfQogfQorCiB2b2lkIEdlbmVyYXRlU2VydmVyU291cmNlKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxJbnRlcmZhY2UmIGRlZmluZWRfdHlwZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICBjb25zdCBzdGQ6OnN0cmluZyBxX25hbWUgPSBHZXRRdWFsaWZpZWROYW1lKGRlZmluZWRfdHlwZSwgQ2xhc3NOYW1lczo6U0VSVkVSKTsKICAgY29uc3Qgc3RkOjpzdHJpbmcgY2xhenogPSBDbGFzc05hbWUoZGVmaW5lZF90eXBlLCBDbGFzc05hbWVzOjpTRVJWRVIpOwogICBjb25zdCBzdGQ6OnN0cmluZyBpZmFjZSA9IENsYXNzTmFtZShkZWZpbmVkX3R5cGUsIENsYXNzTmFtZXM6OklOVEVSRkFDRSk7CiAKICAgb3V0IDw8ICIvLyBTb3VyY2UgZm9yICIgPDwgY2xhenogPDwgIlxuIjsKLSAgb3V0IDw8IGNsYXp6IDw8ICI6OiIgPDwgY2xhenogPDwgIigpIHt9XG4iOwotICBvdXQgPDwgY2xhenogPDwgIjo6fiIgPDwgY2xhenogPDwgIigpIHt9XG4iOworICBvdXQgPDwgcV9uYW1lIDw8ICI6OiIgPDwgY2xhenogPDwgIigpIHt9XG4iOworICBvdXQgPDwgcV9uYW1lIDw8ICI6On4iIDw8IGNsYXp6IDw8ICIoKSB7fVxuIjsKICAgaWYgKG9wdGlvbnMuR2VuTG9nKCkpIHsKLSAgICBvdXQgPDwgInN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCAiICsgY2xhenogKyAiOjpUcmFuc2FjdGlvbkxvZyYpPiAiIDw8IGNsYXp6IDw8ICI6OmxvZ0Z1bmM7XG4iOworICAgIG91dCA8PCAic3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0ICIgPDwgcV9uYW1lIDw8ICI6OlRyYW5zYWN0aW9uTG9nJik+ICIgPDwgcV9uYW1lCisgICAgICAgIDw8ICI6OmxvZ0Z1bmM7XG4iOwogICB9Ci0gIG91dCA8PCAiOjpuZGs6OlNwQUlCaW5kZXIgIiA8PCBjbGF6eiA8PCAiOjpjcmVhdGVCaW5kZXIoKSB7XG4iOworICBvdXQgPDwgIjo6bmRrOjpTcEFJQmluZGVyICIgPDwgcV9uYW1lIDw8ICI6OmNyZWF0ZUJpbmRlcigpIHtcbiI7CiAgIG91dC5JbmRlbnQoKTsKLSAgb3V0IDw8ICJBSUJpbmRlciogYmluZGVyID0gQUlCaW5kZXJfbmV3KCIgPDwga0NsYXp6IDw8ICIsIHN0YXRpY19jYXN0PHZvaWQqPih0aGlzKSk7XG4iOworICBvdXQgPDwgIkFJQmluZGVyKiBiaW5kZXIgPSBBSUJpbmRlcl9uZXcoIiA8PCBHbG9iYWxDbGFzc1Zhck5hbWUoZGVmaW5lZF90eXBlKQorICAgICAgPDwgIiwgc3RhdGljX2Nhc3Q8dm9pZCo+KHRoaXMpKTtcbiI7CiAKICAgb3V0IDw8ICIjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUXG4iOwogICBpZiAoZGVmaW5lZF90eXBlLklzVmludGZTdGFiaWxpdHkoKSkgewpAQCAtNjc2LDcgKzc4Nyw3IEBACiAgICAgICBjb250aW51ZTsKICAgICB9CiAgICAgaWYgKG1ldGhvZC0+R2V0TmFtZSgpID09IGtHZXRJbnRlcmZhY2VWZXJzaW9uICYmIG9wdGlvbnMuVmVyc2lvbigpID4gMCkgewotICAgICAgb3V0IDw8IE5ka01ldGhvZERlY2wodHlwZXMsICptZXRob2QsIGNsYXp6KSA8PCAiIHtcbiI7CisgICAgICBvdXQgPDwgTmRrTWV0aG9kRGVjbCh0eXBlcywgKm1ldGhvZCwgcV9uYW1lKSA8PCAiIHtcbiI7CiAgICAgICBvdXQuSW5kZW50KCk7CiAgICAgICBvdXQgPDwgIipfYWlkbF9yZXR1cm4gPSAiIDw8IGlmYWNlIDw8ICI6OiIgPDwga1ZlcnNpb24gPDwgIjtcbiI7CiAgICAgICBvdXQgPDwgInJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1cyhBU3RhdHVzX25ld09rKCkpO1xuIjsKQEAgLTY4NCw3ICs3OTUsNyBAQAogICAgICAgb3V0IDw8ICJ9XG4iOwogICAgIH0KICAgICBpZiAobWV0aG9kLT5HZXROYW1lKCkgPT0ga0dldEludGVyZmFjZUhhc2ggJiYgIW9wdGlvbnMuSGFzaCgpLmVtcHR5KCkpIHsKLSAgICAgIG91dCA8PCBOZGtNZXRob2REZWNsKHR5cGVzLCAqbWV0aG9kLCBjbGF6eikgPDwgIiB7XG4iOworICAgICAgb3V0IDw8IE5ka01ldGhvZERlY2wodHlwZXMsICptZXRob2QsIHFfbmFtZSkgPDwgIiB7XG4iOwogICAgICAgb3V0LkluZGVudCgpOwogICAgICAgb3V0IDw8ICIqX2FpZGxfcmV0dXJuID0gIiA8PCBpZmFjZSA8PCAiOjoiIDw8IGtIYXNoIDw8ICI7XG4iOwogICAgICAgb3V0IDw8ICJyZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXMoQVN0YXR1c19uZXdPaygpKTtcbiI7CkBAIC02OTUsMjIgKzgwNiwyNCBAQAogfQogdm9pZCBHZW5lcmF0ZUludGVyZmFjZVNvdXJjZShDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsSW50ZXJmYWNlJiBkZWZpbmVkX3R5cGUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgcV9uYW1lID0gR2V0UXVhbGlmaWVkTmFtZShkZWZpbmVkX3R5cGUsIENsYXNzTmFtZXM6OklOVEVSRkFDRSk7CiAgIGNvbnN0IHN0ZDo6c3RyaW5nIGNsYXp6ID0gQ2xhc3NOYW1lKGRlZmluZWRfdHlwZSwgQ2xhc3NOYW1lczo6SU5URVJGQUNFKTsKICAgY29uc3Qgc3RkOjpzdHJpbmcgYnBfY2xhenogPSBDbGFzc05hbWUoZGVmaW5lZF90eXBlLCBDbGFzc05hbWVzOjpDTElFTlQpOwogCiAgIG91dCA8PCAiLy8gU291cmNlIGZvciAiIDw8IGNsYXp6IDw8ICJcbiI7Ci0gIG91dCA8PCAiY29uc3QgY2hhciogIiA8PCBjbGF6eiA8PCAiOjoiIDw8IGtEZXNjcmlwdG9yIDw8ICIgPSBcIiIgPDwgZGVmaW5lZF90eXBlLkdldERlc2NyaXB0b3IoKQorICBvdXQgPDwgImNvbnN0IGNoYXIqICIgPDwgcV9uYW1lIDw8ICI6OiIgPDwga0Rlc2NyaXB0b3IgPDwgIiA9IFwiIiA8PCBkZWZpbmVkX3R5cGUuR2V0RGVzY3JpcHRvcigpCiAgICAgICA8PCAiXCI7XG4iOwotICBvdXQgPDwgY2xhenogPDwgIjo6IiA8PCBjbGF6eiA8PCAiKCkge31cbiI7Ci0gIG91dCA8PCBjbGF6eiA8PCAiOjp+IiA8PCBjbGF6eiA8PCAiKCkge31cbiI7CisgIG91dCA8PCBxX25hbWUgPDwgIjo6IiA8PCBjbGF6eiA8PCAiKCkge31cbiI7CisgIG91dCA8PCBxX25hbWUgPDwgIjo6fiIgPDwgY2xhenogPDwgIigpIHt9XG4iOwogICBvdXQgPDwgIlxuIjsKLSAgR2VuZXJhdGVDb25zdGFudERlZmluaXRpb25zKG91dCwgZGVmaW5lZF90eXBlLCBjbGF6eik7CisgIEdlbmVyYXRlQ29uc3RhbnREZWZpbml0aW9ucyhvdXQsIGRlZmluZWRfdHlwZSwgcV9uYW1lKTsKICAgb3V0IDw8ICJcbiI7CiAKLSAgb3V0IDw8ICJzdGQ6OnNoYXJlZF9wdHI8IiA8PCBjbGF6eiA8PCAiPiAiIDw8IGNsYXp6CisgIG91dCA8PCAic3RkOjpzaGFyZWRfcHRyPCIgPDwgcV9uYW1lIDw8ICI+ICIgPDwgcV9uYW1lCiAgICAgICA8PCAiOjpmcm9tQmluZGVyKGNvbnN0IDo6bmRrOjpTcEFJQmluZGVyJiBiaW5kZXIpIHtcbiI7CiAgIG91dC5JbmRlbnQoKTsKLSAgb3V0IDw8ICJpZiAoIUFJQmluZGVyX2Fzc29jaWF0ZUNsYXNzKGJpbmRlci5nZXQoKSwgIiA8PCBrQ2xhenogPDwgIikpIHsgcmV0dXJuIG51bGxwdHI7IH1cbiI7CisgIG91dCA8PCAiaWYgKCFBSUJpbmRlcl9hc3NvY2lhdGVDbGFzcyhiaW5kZXIuZ2V0KCksICIgPDwgR2xvYmFsQ2xhc3NWYXJOYW1lKGRlZmluZWRfdHlwZSkKKyAgICAgIDw8ICIpKSB7IHJldHVybiBudWxscHRyOyB9XG4iOwogICBvdXQgPDwgInN0ZDo6c2hhcmVkX3B0cjw6Om5kazo6SUNJbnRlcmZhY2U+IGludGVyZmFjZSA9ICIKICAgICAgICAgICI6Om5kazo6SUNJbnRlcmZhY2U6OmFzSW50ZXJmYWNlKGJpbmRlci5nZXQoKSk7XG4iOwogICBvdXQgPDwgImlmIChpbnRlcmZhY2UpIHtcbiI7CkBAIC03MTgsMTEgKzgzMSwxMiBAQAogICBvdXQgPDwgInJldHVybiBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8IiA8PCBjbGF6eiA8PCAiPihpbnRlcmZhY2UpO1xuIjsKICAgb3V0LkRlZGVudCgpOwogICBvdXQgPDwgIn1cbiI7Ci0gIG91dCA8PCAicmV0dXJuIDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPCIgPDwgYnBfY2xhenogPDwgIj4oYmluZGVyKTtcbiI7CisgIG91dCA8PCAicmV0dXJuIDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPCIgPDwgR2V0UXVhbGlmaWVkTmFtZShkZWZpbmVkX3R5cGUsIENsYXNzTmFtZXM6OkNMSUVOVCkKKyAgICAgIDw8ICI+KGJpbmRlcik7XG4iOwogICBvdXQuRGVkZW50KCk7CiAgIG91dCA8PCAifVxuXG4iOwogCi0gIG91dCA8PCAiYmluZGVyX3N0YXR1c190ICIgPDwgY2xhenogPDwgIjo6d3JpdGVUb1BhcmNlbChBUGFyY2VsKiBwYXJjZWwsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjwiCisgIG91dCA8PCAiYmluZGVyX3N0YXR1c190ICIgPDwgcV9uYW1lIDw8ICI6OndyaXRlVG9QYXJjZWwoQVBhcmNlbCogcGFyY2VsLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8IgogICAgICAgPDwgY2xhenogPDwgIj4mIGluc3RhbmNlKSB7XG4iOwogICBvdXQuSW5kZW50KCk7CiAgIG91dCA8PCAicmV0dXJuIEFQYXJjZWxfd3JpdGVTdHJvbmdCaW5kZXIocGFyY2VsLCBpbnN0YW5jZSA/IGluc3RhbmNlLT5hc0JpbmRlcigpLmdldCgpIDogIgpAQCAtNzMwLDcgKzg0NCw3IEBACiAgIG91dC5EZWRlbnQoKTsKICAgb3V0IDw8ICJ9XG4iOwogCi0gIG91dCA8PCAiYmluZGVyX3N0YXR1c190ICIgPDwgY2xhenogPDwgIjo6cmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogcGFyY2VsLCBzdGQ6OnNoYXJlZF9wdHI8IgorICBvdXQgPDwgImJpbmRlcl9zdGF0dXNfdCAiIDw8IHFfbmFtZSA8PCAiOjpyZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBwYXJjZWwsIHN0ZDo6c2hhcmVkX3B0cjwiCiAgICAgICA8PCBjbGF6eiA8PCAiPiogaW5zdGFuY2UpIHtcbiI7CiAgIG91dC5JbmRlbnQoKTsKICAgb3V0IDw8ICI6Om5kazo6U3BBSUJpbmRlciBiaW5kZXI7XG4iOwpAQCAtNzQyLDcgKzg1Niw3IEBACiAgIG91dCA8PCAifVxuIjsKIAogICAvLyBkZWZpbnRpb24gZm9yIHN0YXRpYyBtZW1iZXIgc2V0RGVmYXVsdEltcGwKLSAgb3V0IDw8ICJib29sICIgPDwgY2xhenogPDwgIjo6c2V0RGVmYXVsdEltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPCIgPDwgY2xhenogPDwgIj4mIGltcGwpIHtcbiI7CisgIG91dCA8PCAiYm9vbCAiIDw8IHFfbmFtZSA8PCAiOjpzZXREZWZhdWx0SW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8IiA8PCBjbGF6eiA8PCAiPiYgaW1wbCkge1xuIjsKICAgb3V0LkluZGVudCgpOwogICBvdXQgPDwgIi8vIE9ubHkgb25lIHVzZXIgb2YgdGhpcyBpbnRlcmZhY2UgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uXG4iOwogICBvdXQgPDwgIi8vIGF0IGEgdGltZS4gVGhpcyBpcyBhIGhldXJpc3RpYyB0byBkZXRlY3QgaWYgdHdvIGRpZmZlcmVudFxuIjsKQEAgLTc1OSwxNyArODczLDE3IEBACiAgIG91dCA8PCAifVxuIjsKIAogICAvLyBkZWZpbml0aW9uIGZvciBzdGF0aWMgbWVtYmVyIGdldERlZmF1bHRJbXBsCi0gIG91dCA8PCAiY29uc3Qgc3RkOjpzaGFyZWRfcHRyPCIgPDwgY2xhenogPDwgIj4mICIgPDwgY2xhenogPDwgIjo6Z2V0RGVmYXVsdEltcGwoKSB7XG4iOworICBvdXQgPDwgImNvbnN0IHN0ZDo6c2hhcmVkX3B0cjwiIDw8IHFfbmFtZSA8PCAiPiYgIiA8PCBxX25hbWUgPDwgIjo6Z2V0RGVmYXVsdEltcGwoKSB7XG4iOwogICBvdXQuSW5kZW50KCk7CiAgIG91dCA8PCAicmV0dXJuICIgPDwgY2xhenogPDwgIjo6ZGVmYXVsdF9pbXBsO1xuIjsKICAgb3V0LkRlZGVudCgpOwogICBvdXQgPDwgIn1cbiI7CiAKICAgLy8gZGVmaW5pdGlvbiBmb3IgdGhlIHN0YXRpYyBmaWVsZCBkZWZhdWx0X2ltcGwKLSAgb3V0IDw8ICJzdGQ6OnNoYXJlZF9wdHI8IiA8PCBjbGF6eiA8PCAiPiAiIDw8IGNsYXp6IDw8ICI6OmRlZmF1bHRfaW1wbCA9IG51bGxwdHI7XG4iOworICBvdXQgPDwgInN0ZDo6c2hhcmVkX3B0cjwiIDw8IHFfbmFtZSA8PCAiPiAiIDw8IHFfbmFtZSA8PCAiOjpkZWZhdWx0X2ltcGwgPSBudWxscHRyO1xuIjsKIAogICAvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciB0aGUgPE5hbWU+RGVmYXVsdCBjbGFzcyBtZW1iZXJzCi0gIGNvbnN0IHN0ZDo6c3RyaW5nIGRlZmF1bHRDbGF6eiA9IGNsYXp6ICsgIkRlZmF1bHQiOworICBjb25zdCBzdGQ6OnN0cmluZyBkZWZhdWx0Q2xhenogPSBxX25hbWUgKyAiRGVmYXVsdCI7CiAgIGZvciAoY29uc3QgYXV0byYgbWV0aG9kIDogZGVmaW5lZF90eXBlLkdldE1ldGhvZHMoKSkgewogICAgIGlmIChtZXRob2QtPklzVXNlckRlZmluZWQoKSkgewogICAgICAgb3V0IDw8ICI6Om5kazo6U2NvcGVkQVN0YXR1cyAiIDw8IGRlZmF1bHRDbGF6eiA8PCAiOjoiIDw8IG1ldGhvZC0+R2V0TmFtZSgpIDw8ICIoIgpAQCAtODE1LDI1ICs5MjksMTAgQEAKICAgb3V0IDw8ICJ9XG4iOwogfQogCi12b2lkIEdlbmVyYXRlQ2xpZW50SGVhZGVyKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxJbnRlcmZhY2UmIGRlZmluZWRfdHlwZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgewordm9pZCBHZW5lcmF0ZUNsaWVudENsYXNzRGVjbChDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsSW50ZXJmYWNlJiBkZWZpbmVkX3R5cGUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKICAgY29uc3Qgc3RkOjpzdHJpbmcgY2xhenogPSBDbGFzc05hbWUoZGVmaW5lZF90eXBlLCBDbGFzc05hbWVzOjpDTElFTlQpOwogCi0gIG91dCA8PCAiI3ByYWdtYSBvbmNlXG5cbiI7Ci0gIG91dCA8PCAiI2luY2x1ZGUgXCIiIDw8IE5ka0hlYWRlckZpbGUoZGVmaW5lZF90eXBlLCBDbGFzc05hbWVzOjpSQVcsIGZhbHNlIC8qdXNlX29zX3NlcCovKQotICAgICAgPDwgIlwiXG4iOwotICBvdXQgPDwgIlxuIjsKLSAgb3V0IDw8ICIjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaWJpbmRlci5oPlxuIjsKLSAgaWYgKG9wdGlvbnMuR2VuTG9nKCkpIHsKLSAgICBvdXQgPDwgIiNpbmNsdWRlIDxmdW5jdGlvbmFsPlxuIjsKLSAgICBvdXQgPDwgIiNpbmNsdWRlIDxjaHJvbm8+XG4iOwotICAgIG91dCA8PCAiI2luY2x1ZGUgPHNzdHJlYW0+XG4iOwotICB9Ci0gIGlmIChvcHRpb25zLkdlblRyYWNlcygpKSB7Ci0gICAgb3V0IDw8ICIjaW5jbHVkZSA8YW5kcm9pZC90cmFjZS5oPlxuIjsKLSAgfQotICBvdXQgPDwgIlxuIjsKLSAgRW50ZXJOZGtOYW1lc3BhY2Uob3V0LCBkZWZpbmVkX3R5cGUpOwogICBvdXQgPDwgImNsYXNzIjsKICAgY3BwOjpHZW5lcmF0ZURlcHJlY2F0ZWQob3V0LCBkZWZpbmVkX3R5cGUpOwogICBvdXQgPDwgIiAiIDw8IGNsYXp6IDw8ICIgOiBwdWJsaWMgOjpuZGs6OkJwQ0ludGVyZmFjZTwiCkBAIC04NjMsMjAgKzk2Miw4NyBAQAogICB9CiAgIG91dC5EZWRlbnQoKTsKICAgb3V0IDw8ICJ9O1xuIjsKLSAgTGVhdmVOZGtOYW1lc3BhY2Uob3V0LCBkZWZpbmVkX3R5cGUpOwogfQotdm9pZCBHZW5lcmF0ZVNlcnZlckhlYWRlcihDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsSW50ZXJmYWNlJiBkZWZpbmVkX3R5cGUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKLSAgY29uc3Qgc3RkOjpzdHJpbmcgY2xhenogPSBDbGFzc05hbWUoZGVmaW5lZF90eXBlLCBDbGFzc05hbWVzOjpTRVJWRVIpOwotICBjb25zdCBzdGQ6OnN0cmluZyBpZmFjZSA9IENsYXNzTmFtZShkZWZpbmVkX3R5cGUsIENsYXNzTmFtZXM6OklOVEVSRkFDRSk7CiAKK3ZvaWQgR2VuZXJhdGVDbGllbnRIZWFkZXIoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbEludGVyZmFjZSYgZGVmaW5lZF90eXBlLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CiAgIG91dCA8PCAiI3ByYWdtYSBvbmNlXG5cbiI7CiAgIG91dCA8PCAiI2luY2x1ZGUgXCIiIDw8IE5ka0hlYWRlckZpbGUoZGVmaW5lZF90eXBlLCBDbGFzc05hbWVzOjpSQVcsIGZhbHNlIC8qdXNlX29zX3NlcCovKQogICAgICAgPDwgIlwiXG4iOwogICBvdXQgPDwgIlxuIjsKICAgb3V0IDw8ICIjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaWJpbmRlci5oPlxuIjsKKyAgaWYgKG9wdGlvbnMuR2VuTG9nKCkpIHsKKyAgICBvdXQgPDwgIiNpbmNsdWRlIDxmdW5jdGlvbmFsPlxuIjsKKyAgICBvdXQgPDwgIiNpbmNsdWRlIDxjaHJvbm8+XG4iOworICAgIG91dCA8PCAiI2luY2x1ZGUgPHNzdHJlYW0+XG4iOworICB9CisgIGlmIChvcHRpb25zLkdlblRyYWNlcygpKSB7CisgICAgb3V0IDw8ICIjaW5jbHVkZSA8YW5kcm9pZC90cmFjZS5oPlxuIjsKKyAgfQogICBvdXQgPDwgIlxuIjsKICAgRW50ZXJOZGtOYW1lc3BhY2Uob3V0LCBkZWZpbmVkX3R5cGUpOworICBHZW5lcmF0ZUNsaWVudENsYXNzRGVjbChvdXQsIHR5cGVzLCBkZWZpbmVkX3R5cGUsIG9wdGlvbnMpOworICBMZWF2ZU5ka05hbWVzcGFjZShvdXQsIGRlZmluZWRfdHlwZSk7Cit9CisKK3ZvaWQgR2VuZXJhdGVEZWxlZ2F0b3JDbGFzc0RlY2woQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbEludGVyZmFjZSYgZGVmaW5lZF90eXBlLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIGNsYXp6ID0gQ2xhc3NOYW1lKGRlZmluZWRfdHlwZSwgQ2xhc3NOYW1lczo6REVMRUdBVE9SX0lNUEwpOworICBjb25zdCBzdGQ6OnN0cmluZyBpZmFjZSA9IENsYXNzTmFtZShkZWZpbmVkX3R5cGUsIENsYXNzTmFtZXM6OklOVEVSRkFDRSk7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIGJuX25hbWUgPSBDbGFzc05hbWUoZGVmaW5lZF90eXBlLCBDbGFzc05hbWVzOjpTRVJWRVIpOworICBjb25zdCBzdGQ6OnN0cmluZyBrRGVsZWdhdGVJbXBsVmFyTmFtZSA9ICJfaW1wbCI7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIGtTdGF0dXNUeXBlID0gIjo6bmRrOjpTY29wZWRBU3RhdHVzIjsKKworICBvdXQgPDwgImNsYXNzIjsKKyAgY3BwOjpHZW5lcmF0ZURlcHJlY2F0ZWQob3V0LCBkZWZpbmVkX3R5cGUpOworICBvdXQgPDwgIiAiIDw8IGNsYXp6IDw8ICIgOiBwdWJsaWMgIiA8PCBibl9uYW1lIDw8ICIge1xuIjsKKyAgb3V0IDw8ICJwdWJsaWM6XG4iOworICBvdXQuSW5kZW50KCk7CisgIG91dCA8PCAiZXhwbGljaXQgIiA8PCBjbGF6eiA8PCAiKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjwiIDw8IGlmYWNlIDw8ICI+ICZpbXBsKSIKKyAgICAgIDw8ICIgOiAiIDw8IGtEZWxlZ2F0ZUltcGxWYXJOYW1lIDw8ICIoaW1wbCkge1xuIjsKKyAgaWYgKG9wdGlvbnMuVmVyc2lvbigpID4gMCkgeworICAgIC8vIFRPRE8oYi8yMjIzNDc1MDIpIElmIHdlIG5lZWQgdG8gc3VwcG9ydCBtaXNtYXRjaGVkIHZlcnNpb25zIG9mIGRlbGVnYXRvciBhbmQKKyAgICAvLyBpbXBsLCB0aGlzIGNoZWNrIHdpbGwgYmUgcmVtb3ZlZC4gVGhlIE5ESyBiYWNrZW5kIGNhbid0IG92ZXJyaWRlIHRoZQorICAgIC8vIGdldEludGVyZmFjZSogbWV0YSBtZXRob2RzIGJlY2F1c2UgdGhleSBhcmUgbWFya2VkICJmaW5hbCIuIFJlbW92aW5nCisgICAgLy8gImZpbmFsIiBjaGFuZ2VzIHRoZSBBQkkgYW5kIGJyZWFrcyBwcmVidWlsdHMuCisgICAgb3V0IDw8ICIgICBpbnQzMl90IF9pbXBsX3ZlciA9IDA7XG4iOworICAgIG91dCA8PCAiICAgaWYgKCFpbXBsLT4iIDw8IGtHZXRJbnRlcmZhY2VWZXJzaW9uIDw8ICIoJl9pbXBsX3ZlcikuaXNPaygpKSB7O1xuIjsKKyAgICBvdXQgPDwgIiAgICAgIF9fYXNzZXJ0MihfX0ZJTEVfXywgX19MSU5FX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18sIFwiRGVsZWdhdG9yIGZhaWxlZCB0byBnZXQgIgorICAgICAgICAgICAidmVyc2lvbiBvZiB0aGUgaW1wbGVtZW50YXRpb24uXCIpO1xuIjsKKyAgICBvdXQgPDwgIiAgIH1cbiI7CisgICAgb3V0IDw8ICIgICBpZiAoX2ltcGxfdmVyICE9ICIgPDwgaWZhY2UgPDwgIjo6IiA8PCBrVmVyc2lvbiA8PCAiKSB7XG4iOworICAgIG91dCA8PCAiICAgICAgX19hc3NlcnQyKF9fRklMRV9fLCBfX0xJTkVfXywgX19QUkVUVFlfRlVOQ1RJT05fXywgXCJNaXNtYXRjaGVkIHZlcnNpb25zIG9mICIKKyAgICAgICAgICAgImRlbGVnYXRvciBhbmQgaW1wbGVtZW50YXRpb24gaXMgbm90IGFsbG93ZWQuXCIpO1xuIjsKKyAgICBvdXQgPDwgIiAgIH1cbiI7CisgIH0KKyAgb3V0IDw8ICJ9XG5cbiI7CisgIGZvciAoY29uc3QgYXV0byYgbWV0aG9kIDogZGVmaW5lZF90eXBlLkdldE1ldGhvZHMoKSkgeworICAgIGlmIChtZXRob2QtPklzVXNlckRlZmluZWQoKSkgeworICAgICAgb3V0IDw8IGtTdGF0dXNUeXBlIDw8ICIgIiA8PCBtZXRob2QtPkdldE5hbWUoKSA8PCAiKCIKKyAgICAgICAgICA8PCBOZGtBcmdMaXN0KHR5cGVzLCAqbWV0aG9kLCBGb3JtYXRBcmdGb3JEZWNsKSA8PCAiKSBvdmVycmlkZSI7CisgICAgICBjcHA6OkdlbmVyYXRlRGVwcmVjYXRlZChvdXQsICptZXRob2QpOworICAgICAgb3V0IDw8ICIge1xuIgorICAgICAgICAgIDw8ICIgIHJldHVybiAiIDw8IGtEZWxlZ2F0ZUltcGxWYXJOYW1lIDw8ICItPiIgPDwgbWV0aG9kLT5HZXROYW1lKCkgPDwgIigiCisgICAgICAgICAgPDwgTmRrQXJnTGlzdCh0eXBlcywgKm1ldGhvZCwgRm9ybWF0QXJnTmFtZU9ubHkpIDw8ICIpO1xuIjsKKyAgICAgIG91dCA8PCAifVxuIjsKKyAgICB9CisgIH0KKyAgb3V0LkRlZGVudCgpOworICBvdXQgPDwgInByb3RlY3RlZDpcbiI7CisgIG91dC5JbmRlbnQoKTsKKyAgb3V0LkRlZGVudCgpOworICBvdXQgPDwgInByaXZhdGU6XG4iOworICBvdXQuSW5kZW50KCk7CisgIG91dCA8PCAic3RkOjpzaGFyZWRfcHRyPCIgPDwgaWZhY2UgPDwgIj4gIiA8PCBrRGVsZWdhdGVJbXBsVmFyTmFtZSA8PCAiO1xuIjsKKyAgb3V0LkRlZGVudCgpOworICBvdXQgPDwgIn07XG5cbiI7Cit9CisKK3ZvaWQgR2VuZXJhdGVTZXJ2ZXJDbGFzc0RlY2woQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbEludGVyZmFjZSYgZGVmaW5lZF90eXBlLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIGNsYXp6ID0gQ2xhc3NOYW1lKGRlZmluZWRfdHlwZSwgQ2xhc3NOYW1lczo6U0VSVkVSKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgaWZhY2UgPSBDbGFzc05hbWUoZGVmaW5lZF90eXBlLCBDbGFzc05hbWVzOjpJTlRFUkZBQ0UpOworCiAgIG91dCA8PCAiY2xhc3MiOwogICBjcHA6OkdlbmVyYXRlRGVwcmVjYXRlZChvdXQsIGRlZmluZWRfdHlwZSk7CiAgIG91dCA8PCAiICIgPDwgY2xhenogPDwgIiA6IHB1YmxpYyA6Om5kazo6Qm5DSW50ZXJmYWNlPCIgPDwgaWZhY2UgPDwgIj4ge1xuIjsKQEAgLTkxMSwyNSArMTA3NywzNCBAQAogICBvdXQuSW5kZW50KCk7CiAgIG91dC5EZWRlbnQoKTsKICAgb3V0IDw8ICJ9O1xuIjsKK30KKwordm9pZCBHZW5lcmF0ZVNlcnZlckhlYWRlcihDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsSW50ZXJmYWNlJiBkZWZpbmVkX3R5cGUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgb3V0IDw8ICIjcHJhZ21hIG9uY2VcblxuIjsKKyAgb3V0IDw8ICIjaW5jbHVkZSBcIiIgPDwgTmRrSGVhZGVyRmlsZShkZWZpbmVkX3R5cGUsIENsYXNzTmFtZXM6OlJBVywgZmFsc2UgLyp1c2Vfb3Nfc2VwKi8pCisgICAgICA8PCAiXCJcbiI7CisgIG91dCA8PCAiXG4iOworICBvdXQgPDwgIiNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pYmluZGVyLmg+XG4iOworICAvLyBOZWVkZWQgZm9yICpEZWxlZ2F0b3IgY2xhc3NlcyB3aGlsZSBkZWxlZ2F0b3IgdmVyc2lvbiBpcyByZXF1aXJlZCB0byBiZQorICAvLyB0aGUgc2FtZSBhcyB0aGUgaW1wbGVtZW50YXRpb24gdmVyc2lvbgorICAvLyBUT0RPKGIvMjIyMzQ3NTAyKSBJZiB3ZSBldmVyIG5lZWQgdG8gc3VwcG9ydCBtaXNtYXRjaGVkIHZlcnNpb25zIG9mIGRlbGVnYXRvciBhbmQKKyAgLy8gaW1wbCwgdGhpcyBpbmNsdWRlIGNhbiBiZSByZW1vdmVkLgorICBvdXQgPDwgIiNpbmNsdWRlIDxjYXNzZXJ0PlxuXG4iOworICAvLyBUT0RPKGIvMzE1NTkwOTUpIGJpb25pYyBvbiBob3N0IHNob3VsZCBkZWZpbmUgX19hc3NlcnQyCisgIG91dCA8PCAiI2lmbmRlZiBfX0JJT05JQ19fXG4jaWZuZGVmIF9fYXNzZXJ0MlxuI2RlZmluZSBfX2Fzc2VydDIoYSxiLGMsZCkgIgorICAgICAgICAgIigodm9pZCkwKVxuI2VuZGlmXG4jZW5kaWZcbiI7CisgIG91dCA8PCAiXG4iOworICBFbnRlck5ka05hbWVzcGFjZShvdXQsIGRlZmluZWRfdHlwZSk7CisgIEdlbmVyYXRlU2VydmVyQ2xhc3NEZWNsKG91dCwgdHlwZXMsIGRlZmluZWRfdHlwZSwgb3B0aW9ucyk7CisgIEdlbmVyYXRlRGVsZWdhdG9yQ2xhc3NEZWNsKG91dCwgdHlwZXMsIGRlZmluZWRfdHlwZSwgb3B0aW9ucyk7CiAgIExlYXZlTmRrTmFtZXNwYWNlKG91dCwgZGVmaW5lZF90eXBlKTsKIH0KLXZvaWQgR2VuZXJhdGVJbnRlcmZhY2VIZWFkZXIoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbEludGVyZmFjZSYgZGVmaW5lZF90eXBlLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisKK3ZvaWQgR2VuZXJhdGVJbnRlcmZhY2VDbGFzc0RlY2woQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbEludGVyZmFjZSYgZGVmaW5lZF90eXBlLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CiAgIGNvbnN0IHN0ZDo6c3RyaW5nIGNsYXp6ID0gQ2xhc3NOYW1lKGRlZmluZWRfdHlwZSwgQ2xhc3NOYW1lczo6SU5URVJGQUNFKTsKIAotICBvdXQgPDwgIiNwcmFnbWEgb25jZVxuXG4iOwotICBvdXQgPDwgIiNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pbnRlcmZhY2VfdXRpbHMuaD5cbiI7Ci0gIGlmIChvcHRpb25zLkdlbkxvZygpKSB7Ci0gICAgb3V0IDw8ICIjaW5jbHVkZSA8ZnVuY3Rpb25hbD5cbiI7Ci0gICAgb3V0IDw8ICIjaW5jbHVkZSA8Y2hyb25vPlxuIjsKLSAgICBvdXQgPDwgIiNpbmNsdWRlIDxzc3RyZWFtPlxuIjsKLSAgfQotICBvdXQgPDwgIlxuIjsKLQotICBHZW5lcmF0ZUhlYWRlckluY2x1ZGVzKG91dCwgdHlwZXMsIGRlZmluZWRfdHlwZSk7Ci0gIG91dCA8PCAiXG4iOwotCi0gIEVudGVyTmRrTmFtZXNwYWNlKG91dCwgZGVmaW5lZF90eXBlKTsKICAgb3V0IDw8ICJjbGFzcyI7CiAgIGNwcDo6R2VuZXJhdGVEZXByZWNhdGVkKG91dCwgZGVmaW5lZF90eXBlKTsKICAgb3V0IDw8ICIgIiA8PCBjbGF6eiA8PCAiIDogcHVibGljIDo6bmRrOjpJQ0ludGVyZmFjZSB7XG4iOwpAQCAtOTM5LDYgKzExMTQsNyBAQAogICBvdXQgPDwgY2xhenogPDwgIigpO1xuIjsKICAgb3V0IDw8ICJ2aXJ0dWFsIH4iIDw8IGNsYXp6IDw8ICIoKTtcbiI7CiAgIG91dCA8PCAiXG4iOworICBHZW5lcmF0ZU5lc3RlZFR5cGVEZWNscyhvdXQsIHR5cGVzLCBkZWZpbmVkX3R5cGUsIG9wdGlvbnMpOwogICBHZW5lcmF0ZUNvbnN0YW50RGVjbGFyYXRpb25zKG91dCwgdHlwZXMsIGRlZmluZWRfdHlwZSk7CiAgIGlmIChvcHRpb25zLlZlcnNpb24oKSA+IDApIHsKICAgICBvdXQgPDwgInN0YXRpYyBjb25zdCBpbnQzMl90ICIgPDwga1ZlcnNpb24gPDwgIiA9ICIgPDwgc3RkOjp0b19zdHJpbmcob3B0aW9ucy5WZXJzaW9uKCkpCkBAIC0xMDAwLDIzICsxMTc2LDE4IEBACiAgIG91dC5EZWRlbnQoKTsKICAgb3V0IDw8ICJ9O1xuIjsKIAotICBMZWF2ZU5ka05hbWVzcGFjZShvdXQsIGRlZmluZWRfdHlwZSk7CisgIC8vIFdoZW4gYW4gaW50ZXJmYWNlIGlzIG5lc3RlZCwgZXZlcnkgY2xhc3Mgc2hvdWxkIGJlIGRlZmluZWQgdG9nZXRoZXIgaGVyZQorICAvLyBiZWNhdXNlIHdlIGRvbid0IGhhdmUgc2VwYXJhdGUgaGVhZGVycyBmb3IgdGhlbS4KKyAgLy8gKGUuZy4gSUZvbywgSUZvb0RlZmF1bHQsIEJwRm9vLCBCbkZvbywgSUZvb0RlbGVnYXRvcikKKyAgaWYgKGRlZmluZWRfdHlwZS5HZXRQYXJlbnRUeXBlKCkpIHsKKyAgICBHZW5lcmF0ZUNsaWVudENsYXNzRGVjbChvdXQsIHR5cGVzLCBkZWZpbmVkX3R5cGUsIG9wdGlvbnMpOworICAgIEdlbmVyYXRlU2VydmVyQ2xhc3NEZWNsKG91dCwgdHlwZXMsIGRlZmluZWRfdHlwZSwgb3B0aW9ucyk7CisgIH0KIH0KLXZvaWQgR2VuZXJhdGVQYXJjZWxIZWFkZXIoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFN0cnVjdHVyZWRQYXJjZWxhYmxlJiBkZWZpbmVkX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIC8qb3B0aW9ucyovKSB7CisKK3ZvaWQgR2VuZXJhdGVQYXJjZWxDbGFzc0RlY2woQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFN0cnVjdHVyZWRQYXJjZWxhYmxlJiBkZWZpbmVkX3R5cGUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKICAgY29uc3Qgc3RkOjpzdHJpbmcgY2xhenogPSBDbGFzc05hbWUoZGVmaW5lZF90eXBlLCBDbGFzc05hbWVzOjpSQVcpOwotCi0gIG91dCA8PCAiI3ByYWdtYSBvbmNlXG4iOwotICBvdXQgPDwgIiNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pbnRlcmZhY2VfdXRpbHMuaD5cbiI7Ci0gIG91dCA8PCAiI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3BhcmNlbGFibGVfdXRpbHMuaD5cbiI7Ci0KLSAgLy8gdXNlZCBieSB0b1N0cmluZygpCi0gIG91dCA8PCAiI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3RvX3N0cmluZy5oPlxuIjsKLQotICBHZW5lcmF0ZUhlYWRlckluY2x1ZGVzKG91dCwgdHlwZXMsIGRlZmluZWRfdHlwZSk7Ci0KLSAgRW50ZXJOZGtOYW1lc3BhY2Uob3V0LCBkZWZpbmVkX3R5cGUpOwogICBvdXQgPDwgY3BwOjpUZW1wbGF0ZURlY2woZGVmaW5lZF90eXBlKTsKICAgb3V0IDw8ICJjbGFzcyI7CiAgIGNwcDo6R2VuZXJhdGVEZXByZWNhdGVkKG91dCwgZGVmaW5lZF90eXBlKTsKQEAgLTEwMzAsMjggKzEyMDEsMzYgQEAKICAgfQogICBvdXQgPDwgInN0YXRpYyBjb25zdCBjaGFyKiBkZXNjcmlwdG9yO1xuIjsKICAgb3V0IDw8ICJcbiI7CisgIEdlbmVyYXRlTmVzdGVkVHlwZURlY2xzKG91dCwgdHlwZXMsIGRlZmluZWRfdHlwZSwgb3B0aW9ucyk7CiAgIGZvciAoY29uc3QgYXV0byYgdmFyaWFibGUgOiBkZWZpbmVkX3R5cGUuR2V0RmllbGRzKCkpIHsKLSAgICBvdXQgPDwgTmRrTmFtZU9mKHR5cGVzLCB2YXJpYWJsZS0+R2V0VHlwZSgpLCBTdG9yYWdlTW9kZTo6U1RBQ0spOworICAgIGNvbnN0IGF1dG8mIHR5cGUgPSB2YXJpYWJsZS0+R2V0VHlwZSgpOworICAgIHN0ZDo6c3RyaW5nIGNwcF90eXBlID0gTmRrTmFtZU9mKHR5cGVzLCB0eXBlLCBTdG9yYWdlTW9kZTo6U1RBQ0spOworICAgIG91dCA8PCBjcHBfdHlwZTsKICAgICBjcHA6OkdlbmVyYXRlRGVwcmVjYXRlZChvdXQsICp2YXJpYWJsZSk7CiAgICAgb3V0IDw8ICIgIiA8PCB2YXJpYWJsZS0+R2V0TmFtZSgpOwotICAgIGlmICh2YXJpYWJsZS0+R2V0VHlwZSgpLkdldE5hbWUoKSA9PSAiUGFyY2VsYWJsZUhvbGRlciIpIHsKLSAgICAgIG91dCA8PCAiezo6bmRrOjoiIDw8IChkZWZpbmVkX3R5cGUuSXNWaW50ZlN0YWJpbGl0eSgpID8gIlNUQUJJTElUWV9WSU5URiIgOiAiU1RBQklMSVRZX0xPQ0FMIikKLSAgICAgICAgICA8PCAifSI7Ci0gICAgfQogICAgIGlmIChkZWZpbmVkX3R5cGUuSXNGaXhlZFNpemUoKSkgewotICAgICAgaW50IGFsaWdubWVudCA9IE5ka0FsaWdubWVudE9mKHR5cGVzLCB2YXJpYWJsZS0+R2V0VHlwZSgpKTsKKyAgICAgIGludCBhbGlnbm1lbnQgPSBjcHA6OkFsaWdubWVudE9mKHR5cGUsIHR5cGVzKTsKICAgICAgIGlmIChhbGlnbm1lbnQgPiAwKSB7CiAgICAgICAgIG91dCA8PCAiIF9fYXR0cmlidXRlX18oKGFsaWduZWQgKCIgPDwgc3RkOjp0b19zdHJpbmcoYWxpZ25tZW50KSA8PCAiKSkpIjsKICAgICAgIH0KICAgICB9CiAgICAgaWYgKHZhcmlhYmxlLT5HZXREZWZhdWx0VmFsdWUoKSkgewogICAgICAgb3V0IDw8ICIgPSAiIDw8IHZhcmlhYmxlLT5WYWx1ZVN0cmluZyhDb25zdGFudFZhbHVlRGVjb3JhdG9yKTsKLSAgICB9IGVsc2UgaWYgKGF1dG8gdHlwZSA9IHZhcmlhYmxlLT5HZXRUeXBlKCkuR2V0RGVmaW5lZFR5cGUoKTsgdHlwZSkgewotICAgICAgaWYgKGF1dG8gZW51bV90eXBlID0gdHlwZS0+QXNFbnVtRGVjbGFyYXRpb24oKTsgZW51bV90eXBlKSB7Ci0gICAgICAgIGlmICghdmFyaWFibGUtPkdldFR5cGUoKS5Jc0FycmF5KCkpIHsKLSAgICAgICAgICAvLyBpZiBhbiBlbnVtIGRvZXNuJ3QgaGF2ZSBleHBsaWNpdCBkZWZhdWx0IHZhbHVlLCBkbyB6ZXJvLWluaXRpYWxpemF0aW9uCi0gICAgICAgICAgb3V0IDw8ICIgPSAiIDw8IE5ka05hbWVPZih0eXBlcywgdmFyaWFibGUtPkdldFR5cGUoKSwgU3RvcmFnZU1vZGU6OlNUQUNLKSA8PCAiKDApIjsKKyAgICB9IGVsc2UgeworICAgICAgLy8gU29tZSB0eXBlcyBuZWVkcyB0byBiZSBleHBsaWNpdGx5IGluaXRpYWxpemVkIGV2ZW4gd2hlbiBubyBkZWZhdWx0IHZhbHVlIGlzIHNldC4KKyAgICAgIC8vIC0gUGFyY2VsYWJsZUhvbGRlciBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgd2l0aCBzdGFiaWxpdHkuCisgICAgICAvLyAtIGVudW0gc2hvdWxkIGJlIHplcm8gaW5pdGlhbGl6ZWQsIG90aGVyd2lzZSB0aGUgdmFsdWUgd2lsbCBiZSBpbmRldGVybWluYXRlCisgICAgICAvLyAtIGZpeGVkLXNpemUgYXJyYXlzIHNob3VsZCBiZSBpbml0aWFsaXplZCwgb3RoZXJ3aXNlIHRoZSB2YWx1ZSB3aWxsIGJlIGluZGV0ZXJtaW5hdGUKKyAgICAgIGlmICh0eXBlLkdldE5hbWUoKSA9PSAiUGFyY2VsYWJsZUhvbGRlciIpIHsKKyAgICAgICAgaWYgKGRlZmluZWRfdHlwZS5Jc1ZpbnRmU3RhYmlsaXR5KCkpIHsKKyAgICAgICAgICBvdXQgPDwgIns6Om5kazo6U1RBQklMSVRZX1ZJTlRGfSI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8ICJ7OjpuZGs6OlNUQUJJTElUWV9MT0NBTH0iOwogICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKHR5cGVzLkdldEVudW1EZWNsYXJhdGlvbih0eXBlKSAmJiAhdHlwZS5Jc0FycmF5KCkpIHsKKyAgICAgICAgb3V0IDw8ICIgPSAiIDw8IGNwcF90eXBlIDw8ICIoMCkiOworICAgICAgfSBlbHNlIGlmICh0eXBlLklzRml4ZWRTaXplQXJyYXkoKSAmJiAhdHlwZS5Jc051bGxhYmxlKCkpIHsKKyAgICAgICAgb3V0IDw8ICIgPSB7e319IjsKICAgICAgIH0KICAgICB9CiAgICAgb3V0IDw8ICI7XG4iOwpAQCAtMTA3MSwxMiArMTI1MCwxMCBAQAogCiAgIG91dC5EZWRlbnQoKTsKICAgb3V0IDw8ICJ9O1xuIjsKLSAgTGVhdmVOZGtOYW1lc3BhY2Uob3V0LCBkZWZpbmVkX3R5cGUpOwogfQogdm9pZCBHZW5lcmF0ZVBhcmNlbFNvdXJjZShDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsU3RydWN0dXJlZFBhcmNlbGFibGUmIGRlZmluZWRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgLypvcHRpb25zKi8pIHsKLSAgc3RkOjpzdHJpbmcgY2xhenogPSBDbGFzc05hbWUoZGVmaW5lZF90eXBlLCBDbGFzc05hbWVzOjpSQVcpOworICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsU3RydWN0dXJlZFBhcmNlbGFibGUmIGRlZmluZWRfdHlwZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICBzdGQ6OnN0cmluZyBjbGF6eiA9IEdldFF1YWxpZmllZE5hbWUoZGVmaW5lZF90eXBlKTsKICAgaWYgKGRlZmluZWRfdHlwZS5Jc0dlbmVyaWMoKSkgewogICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB0ZW1wbGF0ZV9wYXJhbXM7CiAgICAgZm9yIChjb25zdCBhdXRvJiBwYXJhbWV0ZXIgOiBkZWZpbmVkX3R5cGUuR2V0VHlwZVBhcmFtZXRlcnMoKSkgewpAQCAtMTA4NSwxMSArMTI2Miw3IEBACiAgICAgY2xhenogKz0gYmFzZTo6U3RyaW5nUHJpbnRmKCI8JXM+IiwgYmFzZTo6Sm9pbih0ZW1wbGF0ZV9wYXJhbXMsICIsICIpLmNfc3RyKCkpOwogICB9CiAKLSAgb3V0IDw8ICIjaW5jbHVkZSBcIiIgPDwgTmRrSGVhZGVyRmlsZShkZWZpbmVkX3R5cGUsIENsYXNzTmFtZXM6OlJBVywgZmFsc2UgLyp1c2Vfb3Nfc2VwKi8pCi0gICAgICA8PCAiXCJcbiI7Ci0gIG91dCA8PCAiXG4iOwotICBHZW5lcmF0ZVNvdXJjZUluY2x1ZGVzKG91dCwgdHlwZXMsIGRlZmluZWRfdHlwZSk7Ci0gIG91dCA8PCAiXG4iOworICBHZW5lcmF0ZVNvdXJjZUluY2x1ZGVzKG91dCwgdHlwZXMsIGRlZmluZWRfdHlwZSwgb3B0aW9ucyk7CiAgIEVudGVyTmRrTmFtZXNwYWNlKG91dCwgZGVmaW5lZF90eXBlKTsKICAgb3V0IDw8IGNwcDo6VGVtcGxhdGVEZWNsKGRlZmluZWRfdHlwZSk7CiAgIG91dCA8PCAiY29uc3QgY2hhciogIiA8PCBjbGF6eiA8PCAiOjoiIDw8IGtEZXNjcmlwdG9yIDw8ICIgPSBcIiIKQEAgLTEwOTksNDkgKzEyNzIsNTAgQEAKICAgR2VuZXJhdGVDb25zdGFudERlZmluaXRpb25zKG91dCwgZGVmaW5lZF90eXBlLCBjbGF6eiwgY3BwOjpUZW1wbGF0ZURlY2woZGVmaW5lZF90eXBlKSk7CiAKICAgb3V0IDw8IGNwcDo6VGVtcGxhdGVEZWNsKGRlZmluZWRfdHlwZSk7Ci0gIG91dCA8PCAiYmluZGVyX3N0YXR1c190ICIgPDwgY2xhenogPDwgIjo6cmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogcGFyY2VsKSB7XG4iOworICBvdXQgPDwgImJpbmRlcl9zdGF0dXNfdCAiIDw8IGNsYXp6IDw8ICI6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIF9haWRsX3BhcmNlbCkge1xuIjsKICAgb3V0LkluZGVudCgpOwotICBvdXQgPDwgImludDMyX3QgX2FpZGxfcGFyY2VsYWJsZV9zaXplO1xuIjsKLSAgb3V0IDw8ICJpbnQzMl90IF9haWRsX3N0YXJ0X3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCk7XG4iOwotICBvdXQgPDwgImJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzIocGFyY2VsLCAmX2FpZGxfcGFyY2VsYWJsZV9zaXplKTtcbiI7Ci0gIG91dCA8PCAiaWYgKF9haWRsX3N0YXJ0X3BvcyA+IElOVDMyX01BWCAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuIFNUQVRVU19CQURfVkFMVUU7XG4iOwotICBvdXQgPDwgImlmIChfYWlkbF9wYXJjZWxhYmxlX3NpemUgPCAwKSByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTtcbiI7CisgIG91dCA8PCAiYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBTVEFUVVNfT0s7XG4iOworICBvdXQgPDwgImludDMyX3QgX2FpZGxfc3RhcnRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKTtcbiI7CisgIG91dCA8PCAiaW50MzJfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSAwO1xuIjsKKyAgb3V0IDw8ICJfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzIoX2FpZGxfcGFyY2VsLCAmX2FpZGxfcGFyY2VsYWJsZV9zaXplKTtcbiI7CiAgIFN0YXR1c0NoZWNrUmV0dXJuKG91dCk7Ci0KKyAgb3V0IDw8ICJpZiAoX2FpZGxfcGFyY2VsYWJsZV9zaXplIDwgNCkgcmV0dXJuIFNUQVRVU19CQURfVkFMVUU7XG4iOworICBvdXQgPDwgImlmIChfYWlkbF9zdGFydF9wb3MgPiBJTlQzMl9NQVggLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybiBTVEFUVVNfQkFEX1ZBTFVFO1xuIjsKICAgZm9yIChjb25zdCBhdXRvJiB2YXJpYWJsZSA6IGRlZmluZWRfdHlwZS5HZXRGaWVsZHMoKSkgewotICAgIG91dCA8PCAiaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7XG4iCi0gICAgICAgIDw8ICIgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTtcbiIKKyAgICBvdXQgPDwgImlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgIgorICAgICAgICAgICAie1xuIgorICAgICAgICA8PCAiICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7XG4iCiAgICAgICAgIDw8ICIgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzO1xuIgogICAgICAgICA8PCAifVxuIjsKICAgICBvdXQgPDwgIl9haWRsX3JldF9zdGF0dXMgPSAiOwotICAgIFJlYWRGcm9tUGFyY2VsRm9yKHtvdXQsIHR5cGVzLCB2YXJpYWJsZS0+R2V0VHlwZSgpLCAicGFyY2VsIiwgIiYiICsgdmFyaWFibGUtPkdldE5hbWUoKX0pOworICAgIFJlYWRGcm9tUGFyY2VsRm9yKHtvdXQsIHR5cGVzLCB2YXJpYWJsZS0+R2V0VHlwZSgpLCAiX2FpZGxfcGFyY2VsIiwgIiYiICsgdmFyaWFibGUtPkdldE5hbWUoKX0pOwogICAgIG91dCA8PCAiO1xuIjsKICAgICBTdGF0dXNDaGVja1JldHVybihvdXQpOwogICB9Ci0gIG91dCA8PCAiQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpO1xuIgorICBvdXQgPDwgIkFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTtcbiIKICAgICAgIDw8ICJyZXR1cm4gX2FpZGxfcmV0X3N0YXR1cztcbiI7CiAgIG91dC5EZWRlbnQoKTsKICAgb3V0IDw8ICJ9XG4iOwogCiAgIG91dCA8PCBjcHA6OlRlbXBsYXRlRGVjbChkZWZpbmVkX3R5cGUpOwotICBvdXQgPDwgImJpbmRlcl9zdGF0dXNfdCAiIDw8IGNsYXp6IDw8ICI6OndyaXRlVG9QYXJjZWwoQVBhcmNlbCogcGFyY2VsKSBjb25zdCB7XG4iOworICBvdXQgPDwgImJpbmRlcl9zdGF0dXNfdCAiIDw8IGNsYXp6IDw8ICI6OndyaXRlVG9QYXJjZWwoQVBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCB7XG4iOwogICBvdXQuSW5kZW50KCk7CiAgIG91dCA8PCAiYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXM7XG4iOwogCi0gIG91dCA8PCAic2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCk7XG4iOwotICBvdXQgPDwgIl9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIocGFyY2VsLCAwKTtcbiI7CisgIG91dCA8PCAic2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7XG4iOworICBvdXQgPDwgIl9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIoX2FpZGxfcGFyY2VsLCAwKTtcbiI7CiAgIFN0YXR1c0NoZWNrUmV0dXJuKG91dCk7CiAKICAgZm9yIChjb25zdCBhdXRvJiB2YXJpYWJsZSA6IGRlZmluZWRfdHlwZS5HZXRGaWVsZHMoKSkgewogICAgIG91dCA8PCAiX2FpZGxfcmV0X3N0YXR1cyA9ICI7Ci0gICAgV3JpdGVUb1BhcmNlbEZvcih7b3V0LCB0eXBlcywgdmFyaWFibGUtPkdldFR5cGUoKSwgInBhcmNlbCIsIHZhcmlhYmxlLT5HZXROYW1lKCl9KTsKKyAgICBXcml0ZVRvUGFyY2VsRm9yKHtvdXQsIHR5cGVzLCB2YXJpYWJsZS0+R2V0VHlwZSgpLCAiX2FpZGxfcGFyY2VsIiwgdmFyaWFibGUtPkdldE5hbWUoKX0pOwogICAgIG91dCA8PCAiO1xuIjsKICAgICBTdGF0dXNDaGVja1JldHVybihvdXQpOwogICB9Ci0gIG91dCA8PCAic2l6ZV90IF9haWRsX2VuZF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpO1xuIjsKLSAgb3V0IDw8ICJBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3Bvcyk7XG4iOwotICBvdXQgPDwgIkFQYXJjZWxfd3JpdGVJbnQzMihwYXJjZWwsIF9haWRsX2VuZF9wb3MgLSBfYWlkbF9zdGFydF9wb3MpO1xuIjsKLSAgb3V0IDw8ICJBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX2VuZF9wb3MpO1xuIjsKKyAgb3V0IDw8ICJzaXplX3QgX2FpZGxfZW5kX3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7XG4iOworICBvdXQgPDwgIkFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zKTtcbiI7CisgIG91dCA8PCAiQVBhcmNlbF93cml0ZUludDMyKF9haWRsX3BhcmNlbCwgX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7XG4iOworICBvdXQgPDwgIkFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfZW5kX3Bvcyk7XG4iOwogCiAgIG91dCA8PCAicmV0dXJuIF9haWRsX3JldF9zdGF0dXM7XG4iOwogICBvdXQuRGVkZW50KCk7CkBAIC0xMTUwLDggKzEzMjQsOCBAQAogICBMZWF2ZU5ka05hbWVzcGFjZShvdXQsIGRlZmluZWRfdHlwZSk7CiB9CiAKLXZvaWQgR2VuZXJhdGVQYXJjZWxIZWFkZXIoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFVuaW9uRGVjbCYgZGVmaW5lZF90eXBlLCBjb25zdCBPcHRpb25zJiAvKm9wdGlvbnMqLykgewordm9pZCBHZW5lcmF0ZVBhcmNlbENsYXNzRGVjbChDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsVW5pb25EZWNsJiBkZWZpbmVkX3R5cGUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKICAgY29uc3Qgc3RkOjpzdHJpbmcgY2xhenogPSBDbGFzc05hbWUoZGVmaW5lZF90eXBlLCBDbGFzc05hbWVzOjpSQVcpOwogICBjcHA6OlVuaW9uV3JpdGVyIHV3e2RlZmluZWRfdHlwZSwgdHlwZXMsCiAgICAgICAgICAgICAgICAgICAgICAgWyZdKGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiB0eXBlLCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcykgewpAQCAtMTE1OSwyOCArMTMzMyw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAmQ29uc3RhbnRWYWx1ZURlY29yYXRvcn07CiAKLSAgb3V0IDw8ICIjcHJhZ21hIG9uY2VcbiI7Ci0gIG91dCA8PCAiI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2ludGVyZmFjZV91dGlscy5oPlxuIjsKLSAgb3V0IDw8ICIjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcGFyY2VsYWJsZV91dGlscy5oPlxuIjsKLQotICAvLyB1c2VkIGJ5IHRvU3RyaW5nKCkKLSAgb3V0IDw8ICIjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfdG9fc3RyaW5nLmg+XG4iOwotCi0gIG91dCA8PCAiXG4iOwotCi0gIGZvciAoY29uc3QgYXV0byYgaGVhZGVyIDogY3BwOjpVbmlvbldyaXRlcjo6aGVhZGVycykgewotICAgIG91dCA8PCAiI2luY2x1ZGUgPCIgPDwgaGVhZGVyIDw8ICI+XG4iOwotICB9Ci0gIEdlbmVyYXRlSGVhZGVySW5jbHVkZXMob3V0LCB0eXBlcywgZGVmaW5lZF90eXBlKTsKLQotICAvLyBUT0RPKGIvMzE1NTkwOTUpIGJpb25pYyBvbiBob3N0IHNob3VsZCBkZWZpbmUgdGhpcwotICBvdXQgPDwgIlxuIjsKLSAgb3V0IDw8ICIjaWZuZGVmIF9fQklPTklDX19cbiI7Ci0gIG91dCA8PCAiI2RlZmluZSBfX2Fzc2VydDIoYSxiLGMsZCkgKCh2b2lkKTApXG4iOwotICBvdXQgPDwgIiNlbmRpZlxuIjsKLSAgb3V0IDw8ICJcbiI7Ci0KLSAgRW50ZXJOZGtOYW1lc3BhY2Uob3V0LCBkZWZpbmVkX3R5cGUpOwogICBvdXQgPDwgY3BwOjpUZW1wbGF0ZURlY2woZGVmaW5lZF90eXBlKTsKICAgb3V0IDw8ICJjbGFzcyI7CiAgIGNwcDo6R2VuZXJhdGVEZXByZWNhdGVkKG91dCwgZGVmaW5lZF90eXBlKTsKQEAgLTExOTQsNiArMTM0Niw3IEBACiAgIH0KICAgb3V0IDw8ICJzdGF0aWMgY29uc3QgY2hhciogZGVzY3JpcHRvcjtcbiI7CiAgIG91dCA8PCAiXG4iOworICBHZW5lcmF0ZU5lc3RlZFR5cGVEZWNscyhvdXQsIHR5cGVzLCBkZWZpbmVkX3R5cGUsIG9wdGlvbnMpOwogICB1dy5QdWJsaWNGaWVsZHMob3V0KTsKIAogICBvdXQgPDwgImJpbmRlcl9zdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBfcGFyY2VsKTtcbiI7CkBAIC0xMjEyLDExICsxMzY1LDEwIEBACiAgIHV3LlByaXZhdGVGaWVsZHMob3V0KTsKICAgb3V0LkRlZGVudCgpOwogICBvdXQgPDwgIn07XG4iOwotICBMZWF2ZU5ka05hbWVzcGFjZShvdXQsIGRlZmluZWRfdHlwZSk7CiB9CiB2b2lkIEdlbmVyYXRlUGFyY2VsU291cmNlKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxVbmlvbkRlY2wmIGRlZmluZWRfdHlwZSwgY29uc3QgT3B0aW9ucyYgLypvcHRpb25zKi8pIHsKLSAgc3RkOjpzdHJpbmcgY2xhenogPSBDbGFzc05hbWUoZGVmaW5lZF90eXBlLCBDbGFzc05hbWVzOjpSQVcpOworICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsVW5pb25EZWNsJiBkZWZpbmVkX3R5cGUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgc3RkOjpzdHJpbmcgY2xhenogPSBHZXRRdWFsaWZpZWROYW1lKGRlZmluZWRfdHlwZSk7CiAgIGlmIChkZWZpbmVkX3R5cGUuSXNHZW5lcmljKCkpIHsKICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdGVtcGxhdGVfcGFyYW1zOwogICAgIGZvciAoY29uc3QgYXV0byYgcGFyYW1ldGVyIDogZGVmaW5lZF90eXBlLkdldFR5cGVQYXJhbWV0ZXJzKCkpIHsKQEAgLTEyNDQsMTEgKzEzOTYsNyBAQAogICAgICAgICAgIH0sCiAgIH07CiAKLSAgb3V0IDw8ICIjaW5jbHVkZSBcIiIgPDwgTmRrSGVhZGVyRmlsZShkZWZpbmVkX3R5cGUsIENsYXNzTmFtZXM6OlJBVywgZmFsc2UgLyp1c2Vfb3Nfc2VwKi8pCi0gICAgICA8PCAiXCJcbiI7Ci0gIG91dCA8PCAiXG4iOwotICBHZW5lcmF0ZVNvdXJjZUluY2x1ZGVzKG91dCwgdHlwZXMsIGRlZmluZWRfdHlwZSk7Ci0gIG91dCA8PCAiXG4iOworICBHZW5lcmF0ZVNvdXJjZUluY2x1ZGVzKG91dCwgdHlwZXMsIGRlZmluZWRfdHlwZSwgb3B0aW9ucyk7CiAgIEVudGVyTmRrTmFtZXNwYWNlKG91dCwgZGVmaW5lZF90eXBlKTsKICAgb3V0IDw8IGNwcDo6VGVtcGxhdGVEZWNsKGRlZmluZWRfdHlwZSk7CiAgIG91dCA8PCAiY29uc3QgY2hhciogIiA8PCBjbGF6eiA8PCAiOjoiIDw8IGtEZXNjcmlwdG9yIDw8ICIgPSBcIiIKQEAgLTEyNzQsNzAgKzE0MjIsMTIgQEAKICAgTGVhdmVOZGtOYW1lc3BhY2Uob3V0LCBkZWZpbmVkX3R5cGUpOwogfQogCi1zdGQ6OnN0cmluZyBHZW5lcmF0ZUVudW1Ub1N0cmluZyhjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsRW51bURlY2xhcmF0aW9uJiBlbnVtX2RlY2wpIHsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIGNvZGU7Ci0gIGNvbnN0IHN0ZDo6c3RyaW5nIHNpZ25hdHVyZSA9Ci0gICAgICAiW1tub2Rpc2NhcmRdXSBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCIgKyBlbnVtX2RlY2wuR2V0TmFtZSgpICsgIiB2YWwpIjsKLSAgaWYgKGVudW1fZGVjbC5Jc0RlcHJlY2F0ZWQoKSkgewotICAgIGNvZGUgPDwgc2lnbmF0dXJlOwotICAgIGNwcDo6R2VuZXJhdGVEZXByZWNhdGVkKGNvZGUsIGVudW1fZGVjbCk7Ci0gICAgY29kZSA8PCAiO1xuIjsKLSAgfQotICBjb2RlIDw8IHNpZ25hdHVyZSA8PCAiIHtcbiI7Ci0gIGNvZGUgPDwgIiAgc3dpdGNoKHZhbCkge1xuIjsKLSAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IHVuaXF1ZV9jYXNlczsKLSAgZm9yIChjb25zdCBhdXRvJiBlbnVtZXJhdG9yIDogZW51bV9kZWNsLkdldEVudW1lcmF0b3JzKCkpIHsKLSAgICBzdGQ6OnN0cmluZyBjID0gZW51bWVyYXRvci0+VmFsdWVTdHJpbmcoZW51bV9kZWNsLkdldEJhY2tpbmdUeXBlKCksIENvbnN0YW50VmFsdWVEZWNvcmF0b3IpOwotICAgIC8vIE9ubHkgYWRkIGEgY2FzZSBpZiBpdHMgdmFsdWUgaGFzIG5vdCB5ZXQgYmVlbiB1c2VkIGluIHRoZSBzd2l0Y2gKLSAgICAvLyBzdGF0ZW1lbnQuIEMrKyBkb2VzIG5vdCBhbGxvdyBtdWx0aXBsZSBjYXNlcyB3aXRoIHRoZSBzYW1lIHZhbHVlLCBidXQKLSAgICAvLyBlbnVtcyBkb2VzIGFsbG93IHRoaXMuIEluIHRoaXMgc2NlbmFyaW8sIHRoZSBmaXJzdCBkZWNsYXJlZAotICAgIC8vIGVudW1lcmF0b3Igd2l0aCB0aGUgZ2l2ZW4gdmFsdWUgaXMgcHJpbnRlZC4KLSAgICBpZiAodW5pcXVlX2Nhc2VzLmNvdW50KGMpID09IDApIHsKLSAgICAgIHVuaXF1ZV9jYXNlcy5pbnNlcnQoYyk7Ci0gICAgICBjb2RlIDw8ICIgIGNhc2UgIiA8PCBlbnVtX2RlY2wuR2V0TmFtZSgpIDw8ICI6OiIgPDwgZW51bWVyYXRvci0+R2V0TmFtZSgpIDw8ICI6XG4iOwotICAgICAgY29kZSA8PCAiICAgIHJldHVybiBcIiIgPDwgZW51bWVyYXRvci0+R2V0TmFtZSgpIDw8ICJcIjtcbiI7Ci0gICAgfQotICB9Ci0gIGNvZGUgPDwgIiAgZGVmYXVsdDpcbiI7Ci0gIGNvZGUgPDwgIiAgICByZXR1cm4gc3RkOjp0b19zdHJpbmcoc3RhdGljX2Nhc3Q8IgotICAgICAgIDw8IE5ka05hbWVPZih0eXBlbmFtZXMsIGVudW1fZGVjbC5HZXRCYWNraW5nVHlwZSgpLCBTdG9yYWdlTW9kZTo6U1RBQ0spIDw8ICI+KHZhbCkpO1xuIjsKLSAgY29kZSA8PCAiICB9XG4iOwotICBjb2RlIDw8ICJ9XG4iOwotICByZXR1cm4gY29kZS5zdHIoKTsKLX0KLQotdm9pZCBHZW5lcmF0ZUVudW1IZWFkZXIoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxFbnVtRGVjbGFyYXRpb24mIGVudW1fZGVjbCwgY29uc3QgT3B0aW9ucyYgLypvcHRpb25zKi8pIHsKLSAgb3V0IDw8ICIjcHJhZ21hIG9uY2VcbiI7Cit2b2lkIEdlbmVyYXRlRW51bUNsYXNzRGVjbChDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbEVudW1EZWNsYXJhdGlvbiYgZW51bV9kZWNsLCBjb25zdCBPcHRpb25zJikgeworICBjcHA6OkdlbmVyYXRlRW51bUNsYXNzRGVjbChvdXQsIGVudW1fZGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmRrTmFtZU9mKHR5cGVzLCBlbnVtX2RlY2wuR2V0QmFja2luZ1R5cGUoKSwgU3RvcmFnZU1vZGU6OlNUQUNLKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRWYWx1ZURlY29yYXRvcik7CiAgIG91dCA8PCAiXG4iOwotCi0gIEdlbmVyYXRlSGVhZGVySW5jbHVkZXMob3V0LCB0eXBlcywgZW51bV9kZWNsKTsKLSAgLy8gZW51bSBzcGVjaWZpYyBoZWFkZXJzCi0gIG91dCA8PCAiI2luY2x1ZGUgPGFycmF5PlxuIjsKLSAgb3V0IDw8ICIjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfZW51bXMuaD5cbiI7Ci0KLSAgRW50ZXJOZGtOYW1lc3BhY2Uob3V0LCBlbnVtX2RlY2wpOwotICBvdXQgPDwgImVudW0gY2xhc3MiOwotICBjcHA6OkdlbmVyYXRlRGVwcmVjYXRlZChvdXQsIGVudW1fZGVjbCk7Ci0gIG91dCA8PCAiICIgPDwgZW51bV9kZWNsLkdldE5hbWUoKSA8PCAiIDogIgotICAgICAgPDwgTmRrTmFtZU9mKHR5cGVzLCBlbnVtX2RlY2wuR2V0QmFja2luZ1R5cGUoKSwgU3RvcmFnZU1vZGU6OlNUQUNLKSA8PCAiIHtcbiI7Ci0gIG91dC5JbmRlbnQoKTsKLSAgZm9yIChjb25zdCBhdXRvJiBlbnVtZXJhdG9yIDogZW51bV9kZWNsLkdldEVudW1lcmF0b3JzKCkpIHsKLSAgICBvdXQgPDwgZW51bWVyYXRvci0+R2V0TmFtZSgpIDw8ICIgPSAiCi0gICAgICAgIDw8IGVudW1lcmF0b3ItPlZhbHVlU3RyaW5nKGVudW1fZGVjbC5HZXRCYWNraW5nVHlwZSgpLCBDb25zdGFudFZhbHVlRGVjb3JhdG9yKSA8PCAiLFxuIjsKLSAgfQotICBvdXQuRGVkZW50KCk7Ci0gIG91dCA8PCAifTtcbiI7Ci0gIG91dCA8PCAiXG4iOwotICBvdXQgPDwgR2VuZXJhdGVFbnVtVG9TdHJpbmcodHlwZXMsIGVudW1fZGVjbCk7Ci0gIExlYXZlTmRrTmFtZXNwYWNlKG91dCwgZW51bV9kZWNsKTsKLQotICBvdXQgPDwgIm5hbWVzcGFjZSBuZGsge1xuIjsKLSAgb3V0IDw8ICJuYW1lc3BhY2UgaW50ZXJuYWwge1xuIjsKLSAgb3V0IDw8IGNwcDo6R2VuZXJhdGVFbnVtVmFsdWVzKGVudW1fZGVjbCwgeyJhaWRsIn0pOwotICBvdXQgPDwgIn0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbFxuIjsKLSAgb3V0IDw8ICJ9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZFxuIjsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIGludGVybmFscwpkaWZmIC0tZ2l0IGEvZ2VuZXJhdGVfbmRrLmggYi9nZW5lcmF0ZV9uZGsuaAppbmRleCA2Yjg5M2EzLi5kOWJjOTEwIDEwMDY0NAotLS0gYS9nZW5lcmF0ZV9uZGsuaAorKysgYi9nZW5lcmF0ZV9uZGsuaApAQCAtMjksMjggKzI5LDYgQEAKIHZvaWQgR2VuZXJhdGVOZGsoY29uc3Qgc3RyaW5nJiBvdXRwdXRfZmlsZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucywgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZXMsCiAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxEZWZpbmVkVHlwZSYgZGVmaW5lZF90eXBlLCBjb25zdCBJb0RlbGVnYXRlJiBpb19kZWxlZ2F0ZSk7CiAKLW5hbWVzcGFjZSBpbnRlcm5hbHMgewotdm9pZCBHZW5lcmF0ZVNvdXJjZShDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLCBjb25zdCBBaWRsSW50ZXJmYWNlJiBkZWZpbmVkX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOwotdm9pZCBHZW5lcmF0ZUNsYXNzU291cmNlKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbEludGVyZmFjZSYgZGVmaW5lZF90eXBlLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKLXZvaWQgR2VuZXJhdGVDbGllbnRTb3VyY2UoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbEludGVyZmFjZSYgZGVmaW5lZF90eXBlLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKLXZvaWQgR2VuZXJhdGVTZXJ2ZXJTb3VyY2UoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbEludGVyZmFjZSYgZGVmaW5lZF90eXBlLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKLXZvaWQgR2VuZXJhdGVJbnRlcmZhY2VTb3VyY2UoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbEludGVyZmFjZSYgZGVmaW5lZF90eXBlLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKLXZvaWQgR2VuZXJhdGVDbGllbnRIZWFkZXIoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbEludGVyZmFjZSYgZGVmaW5lZF90eXBlLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKLXZvaWQgR2VuZXJhdGVTZXJ2ZXJIZWFkZXIoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbEludGVyZmFjZSYgZGVmaW5lZF90eXBlLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKLXZvaWQgR2VuZXJhdGVJbnRlcmZhY2VIZWFkZXIoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbEludGVyZmFjZSYgZGVmaW5lZF90eXBlLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKLQotdm9pZCBHZW5lcmF0ZUVudW1IZWFkZXIoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxFbnVtRGVjbGFyYXRpb24mIGVudW1fZGVjbCwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbHMKIH0gIC8vIG5hbWVzcGFjZSBuZGsKIH0gIC8vIG5hbWVzcGFjZSBhaWRsCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZ2VuZXJhdGVfcnVzdC5jcHAgYi9nZW5lcmF0ZV9ydXN0LmNwcAppbmRleCAzODE3ZjY0Li41MzE2YzQ1IDEwMDY0NAotLS0gYS9nZW5lcmF0ZV9ydXN0LmNwcAorKysgYi9nZW5lcmF0ZV9ydXN0LmNwcApAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgImxvZ2dpbmcuaCIKIAogdXNpbmcgYW5kcm9pZDo6YmFzZTo6Sm9pbjsKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlNwbGl0OwogdXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwogdXNpbmcgc3RkOjpzaGFyZWRfcHRyOwogdXNpbmcgc3RkOjpzdHJpbmc7CkBAIC00Nyw3MyArNDgsMTI4IEBACiBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIga0dldEludGVyZmFjZVZlcnNpb25bXSA9ICJnZXRJbnRlcmZhY2VWZXJzaW9uIjsKIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciBrR2V0SW50ZXJmYWNlSGFzaFtdID0gImdldEludGVyZmFjZUhhc2giOwogCi12b2lkIEdlbmVyYXRlTWFuZ2xlZEFsaWFzKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbERlZmluZWRUeXBlKiB0eXBlKSB7Ci0gIG9zdHJpbmdzdHJlYW0gYWxpYXM7Ci0gIGZvciAoY29uc3QgYXV0byYgY29tcG9uZW50IDogdHlwZS0+R2V0U3BsaXRQYWNrYWdlKCkpIHsKLSAgICBhbGlhcyA8PCAiXyIgPDwgY29tcG9uZW50LnNpemUoKSA8PCAiXyIgPDwgY29tcG9uZW50OwotICB9Ci0gIGFsaWFzIDw8ICJfIiA8PCB0eXBlLT5HZXROYW1lKCkuc2l6ZSgpIDw8ICJfIiA8PCB0eXBlLT5HZXROYW1lKCk7Ci0gIG91dCA8PCAicHViKGNyYXRlKSBtb2QgbWFuZ2xlZCB7IHB1YiB1c2Ugc3VwZXI6OiIgPDwgdHlwZS0+R2V0TmFtZSgpIDw8ICIgYXMgIiA8PCBhbGlhcy5zdHIoKQotICAgICAgPDwgIjsgfVxuIjsKK3ZvaWQgR2VuZXJhdGVNYW5nbGVkQWxpYXNlcyhDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxEZWZpbmVkVHlwZSYgdHlwZSkgeworICBzdHJ1Y3QgVmlzaXRvciA6IEFpZGxWaXNpdG9yIHsKKyAgICBDb2RlV3JpdGVyJiBvdXQ7CisgICAgVmlzaXRvcihDb2RlV3JpdGVyJiBvdXQpIDogb3V0KG91dCkge30KKyAgICB2b2lkIFZpc2l0KGNvbnN0IEFpZGxTdHJ1Y3R1cmVkUGFyY2VsYWJsZSYgdHlwZSkgb3ZlcnJpZGUgeyBWaXNpdFR5cGUodHlwZSk7IH0KKyAgICB2b2lkIFZpc2l0KGNvbnN0IEFpZGxJbnRlcmZhY2UmIHR5cGUpIG92ZXJyaWRlIHsgVmlzaXRUeXBlKHR5cGUpOyB9CisgICAgdm9pZCBWaXNpdChjb25zdCBBaWRsRW51bURlY2xhcmF0aW9uJiB0eXBlKSBvdmVycmlkZSB7IFZpc2l0VHlwZSh0eXBlKTsgfQorICAgIHZvaWQgVmlzaXQoY29uc3QgQWlkbFVuaW9uRGVjbCYgdHlwZSkgb3ZlcnJpZGUgeyBWaXNpdFR5cGUodHlwZSk7IH0KKyAgICB2b2lkIFZpc2l0VHlwZShjb25zdCBBaWRsRGVmaW5lZFR5cGUmIHR5cGUpIHsKKyAgICAgIG91dCA8PCAiIHB1YiB1c2UgIiA8PCBRbmFtZSh0eXBlKSA8PCAiIGFzICIgPDwgTWFuZ2xlZCh0eXBlKSA8PCAiO1xuIjsKKyAgICB9CisgICAgLy8gUmV0dXJuIGEgbWFuZ2xlZCBuYW1lIGZvciBhIHR5cGUgKGluY2x1ZGluZyBBSURMIHBhY2thZ2UpCisgICAgc3RyaW5nIE1hbmdsZWQoY29uc3QgQWlkbERlZmluZWRUeXBlJiB0eXBlKSBjb25zdCB7CisgICAgICBvc3RyaW5nc3RyZWFtIGFsaWFzOworICAgICAgZm9yIChjb25zdCBhdXRvJiBjb21wb25lbnQgOiBTcGxpdCh0eXBlLkdldENhbm9uaWNhbE5hbWUoKSwgIi4iKSkgeworICAgICAgICBhbGlhcyA8PCAiXyIgPDwgY29tcG9uZW50LnNpemUoKSA8PCAiXyIgPDwgY29tcG9uZW50OworICAgICAgfQorICAgICAgcmV0dXJuIGFsaWFzLnN0cigpOworICAgIH0KKyAgICAvLyBSZXR1cm4gYSBmdWxseSBxdWFsaWZpZWQgbmFtZSBmb3IgYSB0eXBlIGluIHRoZSBjdXJyZW50IGZpbGUgKGV4Y2x1ZGluZyBBSURMIHBhY2thZ2UpCisgICAgc3RyaW5nIFFuYW1lKGNvbnN0IEFpZGxEZWZpbmVkVHlwZSYgdHlwZSkgY29uc3QgeyByZXR1cm4gTW9kdWxlKHR5cGUpICsgIjo6IiArIHR5cGUuR2V0TmFtZSgpOyB9CisgICAgLy8gUmV0dXJuIGEgbW9kdWxlIG5hbWUgZm9yIGEgdHlwZSAocmVsYXRpdmUgdG8gdGhlIGZpbGUpCisgICAgc3RyaW5nIE1vZHVsZShjb25zdCBBaWRsRGVmaW5lZFR5cGUmIHR5cGUpIGNvbnN0IHsKKyAgICAgIGlmICh0eXBlLkdldFBhcmVudFR5cGUoKSkgeworICAgICAgICByZXR1cm4gTW9kdWxlKCp0eXBlLkdldFBhcmVudFR5cGUoKSkgKyAiOjoiICsgdHlwZS5HZXROYW1lKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gInN1cGVyIjsKKyAgICAgIH0KKyAgICB9CisgIH0gdihvdXQpOworICBvdXQgPDwgInB1YihjcmF0ZSkgbW9kIG1hbmdsZWQge1xuIjsKKyAgVmlzaXRUb3BEb3duKHYsIHR5cGUpOworICBvdXQgPDwgIn1cbiI7CiB9CiAKLXN0cmluZyBCdWlsZEFyZyhjb25zdCBBaWRsQXJndW1lbnQmIGFyZywgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzKSB7CitzdHJpbmcgQnVpbGRBcmcoY29uc3QgQWlkbEFyZ3VtZW50JiBhcmcsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywgTGlmZXRpbWUgbGlmZXRpbWUpIHsKICAgLy8gV2UgcGFzcyBpbiBwYXJhbWV0ZXJzIHRoYXQgYXJlIG5vdCBwcmltaXRpdmVzIGJ5IGNvbnN0IHJlZmVyZW5jZS4KICAgLy8gQXJyYXlzIGdldCBwYXNzZWQgaW4gYXMgc2xpY2VzLCB3aGljaCBpcyBoYW5kbGVkIGluIFJ1c3ROYW1lT2YuCiAgIGF1dG8gYXJnX21vZGUgPSBBcmd1bWVudFN0b3JhZ2VNb2RlKGFyZywgdHlwZW5hbWVzKTsKLSAgYXV0byBhcmdfdHlwZSA9IFJ1c3ROYW1lT2YoYXJnLkdldFR5cGUoKSwgdHlwZW5hbWVzLCBhcmdfbW9kZSk7CisgIGF1dG8gYXJnX3R5cGUgPSBSdXN0TmFtZU9mKGFyZy5HZXRUeXBlKCksIHR5cGVuYW1lcywgYXJnX21vZGUsIGxpZmV0aW1lKTsKICAgcmV0dXJuIGtBcmd1bWVudFByZWZpeCArIGFyZy5HZXROYW1lKCkgKyAiOiAiICsgYXJnX3R5cGU7CiB9CiAKLXN0cmluZyBCdWlsZE1ldGhvZChjb25zdCBBaWRsTWV0aG9kJiBtZXRob2QsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcykgewotICBhdXRvIG1ldGhvZF90eXBlID0gUnVzdE5hbWVPZihtZXRob2QuR2V0VHlwZSgpLCB0eXBlbmFtZXMsIFN0b3JhZ2VNb2RlOjpWQUxVRSk7Ci0gIGF1dG8gcmV0dXJuX3R5cGUgPSBzdHJpbmd7ImJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PCJ9ICsgbWV0aG9kX3R5cGUgKyAiPiI7CitlbnVtIGNsYXNzIE1ldGhvZEtpbmQgeworICAvLyBUaGlzIGlzIGEgbm9ybWFsIG5vbi1hc3luYyBtZXRob2QuCisgIE5PUk1BTCwKKyAgLy8gVGhpcyBpcyBhbiBhc3luYyBtZXRob2QuIElkZW50aWNhbCB0byBOT1JNQUwgZXhjZXB0IHRoYXQgYXN5bmMgaXMgYWRkZWQKKyAgLy8gaW4gZnJvbnQgb2YgYGZuYC4KKyAgQVNZTkMsCisgIC8vIFRoaXMgaXMgYW4gYXN5bmMgZnVuY3Rpb24sIGJ1dCB1c2luZyBhIGJveGVkIGZ1dHVyZSBpbnN0ZWFkIG9mIHRoZSBhc3luYworICAvLyBrZXl3b3JkLgorICBCT1hFRF9GVVRVUkUsCisgIC8vIFRoaXMgY291bGQgaGF2ZSBiZWVuIGEgbm9uLWFzeW5jIG1ldGhvZCwgYnV0IGl0IHJldHVybnMgYSBGdXR1cmUgc28gdGhhdAorICAvLyBpdCB3b3VsZCBub3QgYmUgYnJlYWtpbmcgdG8gbWFrZSB0aGUgZnVuY3Rpb24gZG8gYXN5bmMgc3R1ZmYgaW4gdGhlIGZ1dHVyZS4KKyAgUkVBRFlfRlVUVVJFLAorfTsKKworc3RyaW5nIEJ1aWxkTWV0aG9kKGNvbnN0IEFpZGxNZXRob2QmIG1ldGhvZCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IE1ldGhvZEtpbmQga2luZCA9IE1ldGhvZEtpbmQ6Ok5PUk1BTCkgeworICAvLyBXZSBuZWVkIHRvIG1hcmsgdGhlIGFyZ3VtZW50cyB3aXRoIGEgbGlmZXRpbWUgb25seSB3aGVuIHJldHVybmluZyBhIGZ1dHVyZSB0aGF0CisgIC8vIGFjdHVhbGx5IGNhcHR1cmVzIHRoZSBhcmd1bWVudHMuCisgIExpZmV0aW1lIGxpZmV0aW1lOworICBzd2l0Y2ggKGtpbmQpIHsKKyAgICBjYXNlIE1ldGhvZEtpbmQ6Ok5PUk1BTDoKKyAgICBjYXNlIE1ldGhvZEtpbmQ6OkFTWU5DOgorICAgIGNhc2UgTWV0aG9kS2luZDo6UkVBRFlfRlVUVVJFOgorICAgICAgbGlmZXRpbWUgPSBMaWZldGltZTo6Tk9ORTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTWV0aG9kS2luZDo6Qk9YRURfRlVUVVJFOgorICAgICAgbGlmZXRpbWUgPSBMaWZldGltZTo6QTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgYXV0byBtZXRob2RfdHlwZSA9IFJ1c3ROYW1lT2YobWV0aG9kLkdldFR5cGUoKSwgdHlwZW5hbWVzLCBTdG9yYWdlTW9kZTo6VkFMVUUsIGxpZmV0aW1lKTsKKyAgYXV0byByZXR1cm5fdHlwZSA9IHN0cmluZ3siYmluZGVyOjpSZXN1bHQ8In0gKyBtZXRob2RfdHlwZSArICI+IjsKKyAgYXV0byBmbl9wcmVmaXggPSBzdHJpbmd7IiJ9OworCisgIHN3aXRjaCAoa2luZCkgeworICAgIGNhc2UgTWV0aG9kS2luZDo6Tk9STUFMOgorICAgICAgLy8gRG9uJ3Qgd3JhcCB0aGUgcmV0dXJuIHR5cGUgaW4gYW55dGhpbmcuCisgICAgICBicmVhazsKKyAgICBjYXNlIE1ldGhvZEtpbmQ6OkFTWU5DOgorICAgICAgZm5fcHJlZml4ID0gImFzeW5jICI7CisgICAgICBicmVhazsKKyAgICBjYXNlIE1ldGhvZEtpbmQ6OkJPWEVEX0ZVVFVSRToKKyAgICAgIHJldHVybl90eXBlID0gImJpbmRlcjo6Qm94RnV0dXJlPCdhLCAiICsgcmV0dXJuX3R5cGUgKyAiPiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIE1ldGhvZEtpbmQ6OlJFQURZX0ZVVFVSRToKKyAgICAgIHJldHVybl90eXBlID0gInN0ZDo6ZnV0dXJlOjpSZWFkeTwiICsgcmV0dXJuX3R5cGUgKyAiPiI7CisgICAgICBicmVhazsKKyAgfQorCisgIHN0cmluZyBwYXJhbWV0ZXJzID0gIiYiICsgUnVzdExpZmV0aW1lTmFtZShsaWZldGltZSkgKyAic2VsZiI7CisgIHN0cmluZyBsaWZldGltZV9zdHIgPSBSdXN0TGlmZXRpbWVHZW5lcmljKGxpZmV0aW1lKTsKKworICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxBaWRsQXJndW1lbnQ+JiBhcmcgOiBtZXRob2QuR2V0QXJndW1lbnRzKCkpIHsKKyAgICBwYXJhbWV0ZXJzICs9ICIsICI7CisgICAgcGFyYW1ldGVycyArPSBCdWlsZEFyZygqYXJnLCB0eXBlbmFtZXMsIGxpZmV0aW1lKTsKKyAgfQorCisgIHJldHVybiBmbl9wcmVmaXggKyAiZm4gIiArIG1ldGhvZC5HZXROYW1lKCkgKyBsaWZldGltZV9zdHIgKyAiKCIgKyBwYXJhbWV0ZXJzICsgIikgLT4gIiArCisgICAgICAgICByZXR1cm5fdHlwZTsKK30KKwordm9pZCBHZW5lcmF0ZUNsaWVudE1ldGhvZEhlbHBlcnMoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsSW50ZXJmYWNlJiBpZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxNZXRob2QmIG1ldGhvZCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucywgY29uc3Qgc3RkOjpzdHJpbmcmIGRlZmF1bHRfdHJhaXRfbmFtZSkgewogICBzdHJpbmcgcGFyYW1ldGVycyA9ICImc2VsZiI7CiAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEFpZGxBcmd1bWVudD4mIGFyZyA6IG1ldGhvZC5HZXRBcmd1bWVudHMoKSkgewogICAgIHBhcmFtZXRlcnMgKz0gIiwgIjsKLSAgICBwYXJhbWV0ZXJzICs9IEJ1aWxkQXJnKCphcmcsIHR5cGVuYW1lcyk7Ci0gIH0KLSAgcmV0dXJuICJmbiAiICsgbWV0aG9kLkdldE5hbWUoKSArICIoIiArIHBhcmFtZXRlcnMgKyAiKSAtPiAiICsgcmV0dXJuX3R5cGU7Ci19Ci0KLXZvaWQgR2VuZXJhdGVDbGllbnRNZXRob2QoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsSW50ZXJmYWNlJiBpZmFjZSwgY29uc3QgQWlkbE1ldGhvZCYgbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0cmFpdF9uYW1lKSB7Ci0gIC8vIEdlbmVyYXRlIHRoZSBtZXRob2QKLSAgb3V0IDw8IEJ1aWxkTWV0aG9kKG1ldGhvZCwgdHlwZW5hbWVzKSA8PCAiIHtcbiI7Ci0gIG91dC5JbmRlbnQoKTsKLQotICBpZiAoIW1ldGhvZC5Jc1VzZXJEZWZpbmVkKCkpIHsKLSAgICBpZiAobWV0aG9kLkdldE5hbWUoKSA9PSBrR2V0SW50ZXJmYWNlVmVyc2lvbiAmJiBvcHRpb25zLlZlcnNpb24oKSA+IDApIHsKLSAgICAgIC8vIENoZWNrIGlmIHRoZSB2ZXJzaW9uIGlzIGluIHRoZSBjYWNoZQotICAgICAgb3V0IDw8ICJsZXQgX2FpZGxfdmVyc2lvbiA9ICIKLSAgICAgICAgICAgICAic2VsZi5jYWNoZWRfdmVyc2lvbi5sb2FkKHN0ZDo6c3luYzo6YXRvbWljOjpPcmRlcmluZzo6UmVsYXhlZCk7XG4iOwotICAgICAgb3V0IDw8ICJpZiBfYWlkbF92ZXJzaW9uICE9IC0xIHsgcmV0dXJuIE9rKF9haWRsX3ZlcnNpb24pOyB9XG4iOwotICAgIH0KLQotICAgIGlmIChtZXRob2QuR2V0TmFtZSgpID09IGtHZXRJbnRlcmZhY2VIYXNoICYmICFvcHRpb25zLkhhc2goKS5lbXB0eSgpKSB7Ci0gICAgICBvdXQgPDwgIntcbiI7Ci0gICAgICBvdXQgPDwgIiAgbGV0IF9haWRsX2hhc2hfbG9jayA9IHNlbGYuY2FjaGVkX2hhc2gubG9jaygpLnVud3JhcCgpO1xuIjsKLSAgICAgIG91dCA8PCAiICBpZiBsZXQgU29tZShyZWYgX2FpZGxfaGFzaCkgPSAqX2FpZGxfaGFzaF9sb2NrIHtcbiI7Ci0gICAgICBvdXQgPDwgIiAgICByZXR1cm4gT2soX2FpZGxfaGFzaC5jbG9uZSgpKTtcbiI7Ci0gICAgICBvdXQgPDwgIiAgfVxuIjsKLSAgICAgIG91dCA8PCAifVxuIjsKLSAgICB9CisgICAgcGFyYW1ldGVycyArPSBCdWlsZEFyZygqYXJnLCB0eXBlbmFtZXMsIExpZmV0aW1lOjpOT05FKTsKICAgfQogCi0gIC8vIENhbGwgdHJhbnNhY3QoKQotICB2ZWN0b3I8c3RyaW5nPiBmbGFnczsKLSAgaWYgKG1ldGhvZC5Jc09uZXdheSgpKSBmbGFncy5wdXNoX2JhY2soImJpbmRlcjo6RkxBR19PTkVXQVkiKTsKLSAgaWYgKGlmYWNlLklzU2Vuc2l0aXZlRGF0YSgpKSBmbGFncy5wdXNoX2JhY2soImJpbmRlcjo6RkxBR19DTEVBUl9CVUYiKTsKLSAgZmxhZ3MucHVzaF9iYWNrKCJiaW5kZXI6OkZMQUdfUFJJVkFURV9MT0NBTCIpOwotCi0gIHN0cmluZyB0cmFuc2FjdF9mbGFncyA9IGZsYWdzLmVtcHR5KCkgPyAiMCIgOiBKb2luKGZsYWdzLCAiIHwgIik7Ci0gIG91dCA8PCAibGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIudHJhbnNhY3QoIgotICAgICAgPDwgInRyYW5zYWN0aW9uczo6IiA8PCBtZXRob2QuR2V0TmFtZSgpIDw8ICIsICIgPDwgdHJhbnNhY3RfZmxhZ3MgPDwgIiwgfF9haWRsX2RhdGF8IHtcbiI7CisgIC8vIEdlbmVyYXRlIGJ1aWxkX3BhcmNlbCBoZWxwZXIuCisgIG91dCA8PCAiZm4gYnVpbGRfcGFyY2VsXyIgKyBtZXRob2QuR2V0TmFtZSgpICsgIigiICsgcGFyYW1ldGVycyArCisgICAgICAgICAgICAgIikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsPiB7XG4iOwogICBvdXQuSW5kZW50KCk7CiAKKyAgb3V0IDw8ICJsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87XG4iOworCiAgIGlmIChpZmFjZS5Jc1NlbnNpdGl2ZURhdGEoKSkgewotICAgIG91dCA8PCAiX2FpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpO1xuIjsKKyAgICBvdXQgPDwgImFpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpO1xuIjsKICAgfQogCiAgIC8vIEFyZ3VtZW50cwpAQCAtMTI0LDI0ICsxODAsMzEgQEAKICAgICAgIC8vICh1bmxlc3Mgd2UgdHVybmVkIGl0IGludG8gYW4gT3B0aW9uPCZUPikKICAgICAgIGF1dG8gcmVmX21vZGUgPSBBcmd1bWVudFJlZmVyZW5jZU1vZGUoKmFyZywgdHlwZW5hbWVzKTsKICAgICAgIGlmIChJc1JlZmVyZW5jZShyZWZfbW9kZSkpIHsKLSAgICAgICAgb3V0IDw8ICJfYWlkbF9kYXRhLndyaXRlKCIgPDwgYXJnX25hbWUgPDwgIik/O1xuIjsKKyAgICAgICAgb3V0IDw8ICJhaWRsX2RhdGEud3JpdGUoIiA8PCBhcmdfbmFtZSA8PCAiKT87XG4iOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8ICJfYWlkbF9kYXRhLndyaXRlKCYiIDw8IGFyZ19uYW1lIDw8ICIpPztcbiI7CisgICAgICAgIG91dCA8PCAiYWlkbF9kYXRhLndyaXRlKCYiIDw8IGFyZ19uYW1lIDw8ICIpPztcbiI7CiAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChhcmctPkdldFR5cGUoKS5Jc0FycmF5KCkpIHsKKyAgICB9IGVsc2UgaWYgKGFyZy0+R2V0VHlwZSgpLklzRHluYW1pY0FycmF5KCkpIHsKICAgICAgIC8vIEZvciBvdXQtb25seSBhcnJheXMsIHNlbmQgdGhlIGFycmF5IHNpemUKICAgICAgIGlmIChhcmctPkdldFR5cGUoKS5Jc051bGxhYmxlKCkpIHsKLSAgICAgICAgb3V0IDw8ICJfYWlkbF9kYXRhLndyaXRlX3NsaWNlX3NpemUoIiA8PCBhcmdfbmFtZSA8PCAiLmFzX2RlcmVmKCkpPztcbiI7CisgICAgICAgIG91dCA8PCAiYWlkbF9kYXRhLndyaXRlX3NsaWNlX3NpemUoIiA8PCBhcmdfbmFtZSA8PCAiLmFzX2RlcmVmKCkpPztcbiI7CiAgICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgIl9haWRsX2RhdGEud3JpdGVfc2xpY2Vfc2l6ZShTb21lKCIgPDwgYXJnX25hbWUgPDwgIikpPztcbiI7CisgICAgICAgIG91dCA8PCAiYWlkbF9kYXRhLndyaXRlX3NsaWNlX3NpemUoU29tZSgiIDw8IGFyZ19uYW1lIDw8ICIpKT87XG4iOwogICAgICAgfQogICAgIH0KICAgfQogCi0gIC8vIFJldHVybiBPaygoKSkgaWYgYWxsIHRoZSBgX2FpZGxfZGF0YS53cml0ZSguLi4pPztgIGNhbGxzIHBhc3MKLSAgb3V0IDw8ICJPaygoKSlcbiI7CisgIG91dCA8PCAiT2soYWlkbF9kYXRhKVxuIjsKICAgb3V0LkRlZGVudCgpOwotICBvdXQgPDwgIn0pO1xuIjsKKyAgb3V0IDw8ICJ9XG4iOworCisgIC8vIEdlbmVyYXRlIHJlYWRfcmVzcG9uc2UgaGVscGVyLgorICBhdXRvIHJldHVybl90eXBlID0gUnVzdE5hbWVPZihtZXRob2QuR2V0VHlwZSgpLCB0eXBlbmFtZXMsIFN0b3JhZ2VNb2RlOjpWQUxVRSwgTGlmZXRpbWU6Ok5PTkUpOworICBvdXQgPDwgImZuIHJlYWRfcmVzcG9uc2VfIiArIG1ldGhvZC5HZXROYW1lKCkgKyAiKCIgKyBwYXJhbWV0ZXJzICsKKyAgICAgICAgICAgICAiLCBfYWlkbF9yZXBseTogc3RkOjpyZXN1bHQ6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWwsICIKKyAgICAgICAgICAgICAiYmluZGVyOjpTdGF0dXNDb2RlPikgLT4gYmluZGVyOjpSZXN1bHQ8IiArCisgICAgICAgICAgICAgcmV0dXJuX3R5cGUgKyAiPiB7XG4iOworICBvdXQuSW5kZW50KCk7CiAKICAgLy8gQ2hlY2sgZm9yIFVOS05PV05fVFJBTlNBQ1RJT04gYW5kIGNhbGwgdGhlIGRlZmF1bHQgaW1wbAogICBpZiAobWV0aG9kLklzVXNlckRlZmluZWQoKSkgewpAQCAtMTU0LDcgKzIxNyw3IEBACiAgICAgICBkZWZhdWx0X2FyZ3MgKz0gYXJnLT5HZXROYW1lKCk7CiAgICAgfQogICAgIG91dCA8PCAiaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkge1xuIjsKLSAgICBvdXQgPDwgIiAgaWYgbGV0IFNvbWUoX2FpZGxfZGVmYXVsdF9pbXBsKSA9IDxTZWxmIGFzICIgPDwgdHJhaXRfbmFtZQorICAgIG91dCA8PCAiICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgIiA8PCBkZWZhdWx0X3RyYWl0X25hbWUKICAgICAgICAgPDwgIj46OmdldERlZmF1bHRJbXBsKCkge1xuIjsKICAgICBvdXQgPDwgIiAgICByZXR1cm4gX2FpZGxfZGVmYXVsdF9pbXBsLiIgPDwgbWV0aG9kLkdldE5hbWUoKSA8PCAiKCIgPDwgZGVmYXVsdF9hcmdzIDw8ICIpO1xuIjsKICAgICBvdXQgPDwgIiAgfVxuIjsKQEAgLTE3Miw3ICsyMzUsOCBAQAogCiAgICAgLy8gUmV0dXJuIHJlcGx5IHZhbHVlCiAgICAgaWYgKG1ldGhvZC5HZXRUeXBlKCkuR2V0TmFtZSgpICE9ICJ2b2lkIikgewotICAgICAgYXV0byByZXR1cm5fdHlwZSA9IFJ1c3ROYW1lT2YobWV0aG9kLkdldFR5cGUoKSwgdHlwZW5hbWVzLCBTdG9yYWdlTW9kZTo6VkFMVUUpOworICAgICAgYXV0byByZXR1cm5fdHlwZSA9CisgICAgICAgICAgUnVzdE5hbWVPZihtZXRob2QuR2V0VHlwZSgpLCB0eXBlbmFtZXMsIFN0b3JhZ2VNb2RlOjpWQUxVRSwgTGlmZXRpbWU6Ok5PTkUpOwogICAgICAgb3V0IDw8ICJsZXQgX2FpZGxfcmV0dXJuOiAiIDw8IHJldHVybl90eXBlIDw8ICIgPSBfYWlkbF9yZXBseS5yZWFkKCk/O1xuIjsKICAgICAgIHJldHVybl92YWwgPSAiX2FpZGxfcmV0dXJuIjsKIApAQCAtMTg3LDIxICsyNTEsMTUxIEBACiAgICAgfQogCiAgICAgZm9yIChjb25zdCBBaWRsQXJndW1lbnQqIGFyZyA6IG1ldGhvZC5HZXRPdXRBcmd1bWVudHMoKSkgewotICAgICAgb3V0IDw8ICIqIiA8PCBrQXJndW1lbnRQcmVmaXggPDwgYXJnLT5HZXROYW1lKCkgPDwgIiA9IF9haWRsX3JlcGx5LnJlYWQoKT87XG4iOworICAgICAgb3V0IDw8ICJfYWlkbF9yZXBseS5yZWFkX29udG8oIiA8PCBrQXJndW1lbnRQcmVmaXggPDwgYXJnLT5HZXROYW1lKCkgPDwgIik/O1xuIjsKICAgICB9CiAgIH0KIAogICAvLyBSZXR1cm4gdGhlIHJlc3VsdAogICBvdXQgPDwgIk9rKCIgPDwgcmV0dXJuX3ZhbCA8PCAiKVxuIjsKKwogICBvdXQuRGVkZW50KCk7CiAgIG91dCA8PCAifVxuIjsKIH0KIAotdm9pZCBHZW5lcmF0ZVNlcnZlclRyYW5zYWN0aW9uKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbE1ldGhvZCYgbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcykgewordm9pZCBHZW5lcmF0ZUNsaWVudE1ldGhvZChDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxJbnRlcmZhY2UmIGlmYWNlLCBjb25zdCBBaWRsTWV0aG9kJiBtZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywgY29uc3QgT3B0aW9ucyYgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWV0aG9kS2luZCBraW5kKSB7CisgIC8vIEdlbmVyYXRlIHRoZSBtZXRob2QKKyAgb3V0IDw8IEJ1aWxkTWV0aG9kKG1ldGhvZCwgdHlwZW5hbWVzLCBraW5kKSA8PCAiIHtcbiI7CisgIG91dC5JbmRlbnQoKTsKKworICBpZiAoIW1ldGhvZC5Jc1VzZXJEZWZpbmVkKCkpIHsKKyAgICBpZiAobWV0aG9kLkdldE5hbWUoKSA9PSBrR2V0SW50ZXJmYWNlVmVyc2lvbiAmJiBvcHRpb25zLlZlcnNpb24oKSA+IDApIHsKKyAgICAgIC8vIENoZWNrIGlmIHRoZSB2ZXJzaW9uIGlzIGluIHRoZSBjYWNoZQorICAgICAgb3V0IDw8ICJsZXQgX2FpZGxfdmVyc2lvbiA9ICIKKyAgICAgICAgICAgICAic2VsZi5jYWNoZWRfdmVyc2lvbi5sb2FkKHN0ZDo6c3luYzo6YXRvbWljOjpPcmRlcmluZzo6UmVsYXhlZCk7XG4iOworICAgICAgc3dpdGNoIChraW5kKSB7CisgICAgICAgIGNhc2UgTWV0aG9kS2luZDo6Tk9STUFMOgorICAgICAgICBjYXNlIE1ldGhvZEtpbmQ6OkFTWU5DOgorICAgICAgICAgIG91dCA8PCAiaWYgX2FpZGxfdmVyc2lvbiAhPSAtMSB7IHJldHVybiBPayhfYWlkbF92ZXJzaW9uKTsgfVxuIjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNZXRob2RLaW5kOjpCT1hFRF9GVVRVUkU6CisgICAgICAgICAgb3V0IDw8ICJpZiBfYWlkbF92ZXJzaW9uICE9IC0xIHsgcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShPayhfYWlkbF92ZXJzaW9uKSkpOyAiCisgICAgICAgICAgICAgICAgICJ9XG4iOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1ldGhvZEtpbmQ6OlJFQURZX0ZVVFVSRToKKyAgICAgICAgICBvdXQgPDwgImlmIF9haWRsX3ZlcnNpb24gIT0gLTEgeyByZXR1cm4gc3RkOjpmdXR1cmU6OnJlYWR5KE9rKF9haWRsX3ZlcnNpb24pKTsgfVxuIjsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobWV0aG9kLkdldE5hbWUoKSA9PSBrR2V0SW50ZXJmYWNlSGFzaCAmJiAhb3B0aW9ucy5IYXNoKCkuZW1wdHkoKSkgeworICAgICAgb3V0IDw8ICJ7XG4iOworICAgICAgb3V0IDw8ICIgIGxldCBfYWlkbF9oYXNoX2xvY2sgPSBzZWxmLmNhY2hlZF9oYXNoLmxvY2soKS51bndyYXAoKTtcbiI7CisgICAgICBvdXQgPDwgIiAgaWYgbGV0IFNvbWUocmVmIF9haWRsX2hhc2gpID0gKl9haWRsX2hhc2hfbG9jayB7XG4iOworICAgICAgc3dpdGNoIChraW5kKSB7CisgICAgICAgIGNhc2UgTWV0aG9kS2luZDo6Tk9STUFMOgorICAgICAgICBjYXNlIE1ldGhvZEtpbmQ6OkFTWU5DOgorICAgICAgICAgIG91dCA8PCAiICAgIHJldHVybiBPayhfYWlkbF9oYXNoLmNsb25lKCkpO1xuIjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNZXRob2RLaW5kOjpCT1hFRF9GVVRVUkU6CisgICAgICAgICAgb3V0IDw8ICIgICAgcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShPayhfYWlkbF9oYXNoLmNsb25lKCkpKSk7XG4iOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1ldGhvZEtpbmQ6OlJFQURZX0ZVVFVSRToKKyAgICAgICAgICBvdXQgPDwgIiAgICByZXR1cm4gc3RkOjpmdXR1cmU6OnJlYWR5KE9rKF9haWRsX2hhc2guY2xvbmUoKSkpO1xuIjsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIG91dCA8PCAiICB9XG4iOworICAgICAgb3V0IDw8ICJ9XG4iOworICAgIH0KKyAgfQorCisgIHN0cmluZyBidWlsZF9wYXJjZWxfYXJnczsKKyAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QWlkbEFyZ3VtZW50PiYgYXJnIDogbWV0aG9kLkdldEFyZ3VtZW50cygpKSB7CisgICAgaWYgKCFidWlsZF9wYXJjZWxfYXJncy5lbXB0eSgpKSB7CisgICAgICBidWlsZF9wYXJjZWxfYXJncyArPSAiLCAiOworICAgIH0KKyAgICBidWlsZF9wYXJjZWxfYXJncyArPSBrQXJndW1lbnRQcmVmaXg7CisgICAgYnVpbGRfcGFyY2VsX2FyZ3MgKz0gYXJnLT5HZXROYW1lKCk7CisgIH0KKworICBzdHJpbmcgcmVhZF9yZXNwb25zZV9hcmdzID0KKyAgICAgIGJ1aWxkX3BhcmNlbF9hcmdzLmVtcHR5KCkgPyAiX2FpZGxfcmVwbHkiIDogYnVpbGRfcGFyY2VsX2FyZ3MgKyAiLCBfYWlkbF9yZXBseSI7CisKKyAgdmVjdG9yPHN0cmluZz4gZmxhZ3M7CisgIGlmIChtZXRob2QuSXNPbmV3YXkoKSkgZmxhZ3MucHVzaF9iYWNrKCJiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX09ORVdBWSIpOworICBpZiAoaWZhY2UuSXNTZW5zaXRpdmVEYXRhKCkpIGZsYWdzLnB1c2hfYmFjaygiYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYiKTsKKyAgZmxhZ3MucHVzaF9iYWNrKCJiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwiKTsKKworICBzdHJpbmcgdHJhbnNhY3RfZmxhZ3MgPSBmbGFncy5lbXB0eSgpID8gIjAiIDogSm9pbihmbGFncywgIiB8ICIpOworCisgIHN3aXRjaCAoa2luZCkgeworICAgIGNhc2UgTWV0aG9kS2luZDo6Tk9STUFMOgorICAgIGNhc2UgTWV0aG9kS2luZDo6QVNZTkM6CisgICAgICAvLyBQcmVwYXJlIHRyYW5zYWN0aW9uLgorICAgICAgb3V0IDw8ICJsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsXyIgKyBtZXRob2QuR2V0TmFtZSgpICsgIigiICsgYnVpbGRfcGFyY2VsX2FyZ3MgKworICAgICAgICAgICAgICAgICAiKT87XG4iOworICAgICAgLy8gU3VibWl0IHRyYW5zYWN0aW9uLgorICAgICAgb3V0IDw8ICJsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjoiIDw8IG1ldGhvZC5HZXROYW1lKCkKKyAgICAgICAgICA8PCAiLCBfYWlkbF9kYXRhLCAiIDw8IHRyYW5zYWN0X2ZsYWdzIDw8ICIpO1xuIjsKKyAgICAgIC8vIERlc2VyaWFsaXplIHJlc3BvbnNlLgorICAgICAgb3V0IDw8ICJzZWxmLnJlYWRfcmVzcG9uc2VfIiArIG1ldGhvZC5HZXROYW1lKCkgKyAiKCIgKyByZWFkX3Jlc3BvbnNlX2FyZ3MgKyAiKVxuIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTWV0aG9kS2luZDo6UkVBRFlfRlVUVVJFOgorICAgICAgLy8gUHJlcGFyZSB0cmFuc2FjdGlvbi4KKyAgICAgIG91dCA8PCAibGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF8iICsgbWV0aG9kLkdldE5hbWUoKSArICIoIiArCisgICAgICAgICAgICAgICAgIGJ1aWxkX3BhcmNlbF9hcmdzICsgIikge1xuIjsKKyAgICAgIG91dC5JbmRlbnQoKTsKKyAgICAgIG91dCA8PCAiT2soX2FpZGxfZGF0YSkgPT4gX2FpZGxfZGF0YSxcbiI7CisgICAgICBvdXQgPDwgIkVycihlcnIpID0+IHJldHVybiBzdGQ6OmZ1dHVyZTo6cmVhZHkoRXJyKGVycikpLFxuIjsKKyAgICAgIG91dC5EZWRlbnQoKTsKKyAgICAgIG91dCA8PCAifTtcbiI7CisgICAgICAvLyBTdWJtaXQgdHJhbnNhY3Rpb24uCisgICAgICBvdXQgPDwgImxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OiIgPDwgbWV0aG9kLkdldE5hbWUoKQorICAgICAgICAgIDw8ICIsIF9haWRsX2RhdGEsICIgPDwgdHJhbnNhY3RfZmxhZ3MgPDwgIik7XG4iOworICAgICAgLy8gRGVzZXJpYWxpemUgcmVzcG9uc2UuCisgICAgICBvdXQgPDwgInN0ZDo6ZnV0dXJlOjpyZWFkeShzZWxmLnJlYWRfcmVzcG9uc2VfIiArIG1ldGhvZC5HZXROYW1lKCkgKyAiKCIgKworICAgICAgICAgICAgICAgICByZWFkX3Jlc3BvbnNlX2FyZ3MgKyAiKSlcbiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIE1ldGhvZEtpbmQ6OkJPWEVEX0ZVVFVSRToKKyAgICAgIC8vIFByZXBhcmUgdHJhbnNhY3Rpb24uCisgICAgICBvdXQgPDwgImxldCBfYWlkbF9kYXRhID0gbWF0Y2ggc2VsZi5idWlsZF9wYXJjZWxfIiArIG1ldGhvZC5HZXROYW1lKCkgKyAiKCIgKworICAgICAgICAgICAgICAgICBidWlsZF9wYXJjZWxfYXJncyArICIpIHtcbiI7CisgICAgICBvdXQuSW5kZW50KCk7CisgICAgICBvdXQgPDwgIk9rKF9haWRsX2RhdGEpID0+IF9haWRsX2RhdGEsXG4iOworICAgICAgb3V0IDw8ICJFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksXG4iOworICAgICAgb3V0LkRlZGVudCgpOworICAgICAgb3V0IDw8ICJ9O1xuIjsKKyAgICAgIC8vIFN1Ym1pdCB0cmFuc2FjdGlvbi4KKyAgICAgIG91dCA8PCAibGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7XG4iOworICAgICAgb3V0IDw8ICJQOjpzcGF3bihcbiI7CisgICAgICBvdXQuSW5kZW50KCk7CisgICAgICBvdXQgPDwgIm1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OiIgPDwgbWV0aG9kLkdldE5hbWUoKSA8PCAiLCBfYWlkbF9kYXRhLCAiCisgICAgICAgICAgPDwgdHJhbnNhY3RfZmxhZ3MgPDwgIiksXG4iOworICAgICAgb3V0IDw8ICJtb3ZlIHxfYWlkbF9yZXBseXwgYXN5bmMgbW92ZSB7XG4iOworICAgICAgb3V0LkluZGVudCgpOworICAgICAgLy8gRGVzZXJpYWxpemUgcmVzcG9uc2UuCisgICAgICBvdXQgPDwgInNlbGYucmVhZF9yZXNwb25zZV8iICsgbWV0aG9kLkdldE5hbWUoKSArICIoIiArIHJlYWRfcmVzcG9uc2VfYXJncyArICIpXG4iOworICAgICAgb3V0LkRlZGVudCgpOworICAgICAgb3V0IDw8ICJ9XG4iOworICAgICAgb3V0LkRlZGVudCgpOworICAgICAgb3V0IDw8ICIpXG4iOworICAgICAgYnJlYWs7CisgIH0KKworICBvdXQuRGVkZW50KCk7CisgIG91dCA8PCAifVxuIjsKK30KKwordm9pZCBHZW5lcmF0ZVNlcnZlclRyYW5zYWN0aW9uKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbEludGVyZmFjZSYgaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxNZXRob2QmIG1ldGhvZCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzKSB7CiAgIG91dCA8PCAidHJhbnNhY3Rpb25zOjoiIDw8IG1ldGhvZC5HZXROYW1lKCkgPDwgIiA9PiB7XG4iOwogICBvdXQuSW5kZW50KCk7CiAKKyAgaWYgKGludGVyZmFjZS5FbmZvcmNlRXhwcmVzc2lvbigpIHx8IG1ldGhvZC5HZXRUeXBlKCkuRW5mb3JjZUV4cHJlc3Npb24oKSkgeworICAgIG91dCA8PCAiY29tcGlsZV9lcnJvciEoXCJQZXJtaXNzaW9uIGNoZWNrcyBub3Qgc3VwcG9ydCBmb3IgdGhlIFJ1c3QgYmFja2VuZFwiKTtcbiI7CisgIH0KKwogICBzdHJpbmcgYXJnczsKICAgZm9yIChjb25zdCBhdXRvJiBhcmcgOiBtZXRob2QuR2V0QXJndW1lbnRzKCkpIHsKICAgICBzdHJpbmcgYXJnX25hbWUgPSBrQXJndW1lbnRQcmVmaXggKyBhcmctPkdldE5hbWUoKTsKQEAgLTIxMiwxMiArNDA2LDEyIEBACiAgICAgICAvLyBXZSBuZWVkIGEgdmFsdWUgd2UgY2FuIGNhbGwgRGVmYXVsdDo6ZGVmYXVsdCgpIG9uCiAgICAgICBhcmdfbW9kZSA9IFN0b3JhZ2VNb2RlOjpERUZBVUxUX1ZBTFVFOwogICAgIH0KLSAgICBhdXRvIGFyZ190eXBlID0gUnVzdE5hbWVPZihhcmctPkdldFR5cGUoKSwgdHlwZW5hbWVzLCBhcmdfbW9kZSk7CisgICAgYXV0byBhcmdfdHlwZSA9IFJ1c3ROYW1lT2YoYXJnLT5HZXRUeXBlKCksIHR5cGVuYW1lcywgYXJnX21vZGUsIExpZmV0aW1lOjpOT05FKTsKIAogICAgIHN0cmluZyBhcmdfbXV0ID0gYXJnLT5Jc091dCgpID8gIm11dCAiIDogIiI7CiAgICAgc3RyaW5nIGFyZ19pbml0ID0gYXJnLT5Jc0luKCkgPyAiX2FpZGxfZGF0YS5yZWFkKCk/IiA6ICJEZWZhdWx0OjpkZWZhdWx0KCkiOwogICAgIG91dCA8PCAibGV0ICIgPDwgYXJnX211dCA8PCBhcmdfbmFtZSA8PCAiOiAiIDw8IGFyZ190eXBlIDw8ICIgPSAiIDw8IGFyZ19pbml0IDw8ICI7XG4iOwotICAgIGlmICghYXJnLT5Jc0luKCkgJiYgYXJnLT5HZXRUeXBlKCkuSXNBcnJheSgpKSB7CisgICAgaWYgKCFhcmctPklzSW4oKSAmJiBhcmctPkdldFR5cGUoKS5Jc0R5bmFtaWNBcnJheSgpKSB7CiAgICAgICAvLyBfYWlkbF9kYXRhLnJlc2l6ZV9bbnVsbGFibGVfXW91dF92ZWMoJm11dCBfYXJnX2Zvbyk/OwogICAgICAgYXV0byByZXNpemVfbmFtZSA9IGFyZy0+R2V0VHlwZSgpLklzTnVsbGFibGUoKSA/ICJyZXNpemVfbnVsbGFibGVfb3V0X3ZlYyIgOiAicmVzaXplX291dF92ZWMiOwogICAgICAgb3V0IDw8ICJfYWlkbF9kYXRhLiIgPDwgcmVzaXplX25hbWUgPDwgIigmbXV0ICIgPDwgYXJnX25hbWUgPDwgIik/O1xuIjsKQEAgLTI1Myw3ICs0NDcsNyBAQAogICAgICAgICAvLyBhbnkgTm9uZSwgcmV0dXJuIFVORVhQRUNURURfTlVMTCAodGhpcyBpcyB3aGF0IGxpYmJpbmRlcl9uZGsgZG9lcykKICAgICAgICAgb3V0IDw8ICJpZiAiIDw8IGFyZ19uYW1lIDw8ICIuaXRlcigpLmFueShPcHRpb246OmlzX25vbmUpIHsgIgogICAgICAgICAgICAgPDwgInJldHVybiBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTkVYUEVDVEVEX05VTEwpOyB9XG4iOwotICAgICAgfSBlbHNlIGlmICghYXJnLT5Jc0luKCkgJiYgIVR5cGVIYXNEZWZhdWx0KGFyZ190eXBlLCB0eXBlbmFtZXMpKSB7CisgICAgICB9IGVsc2UgaWYgKCFhcmctPklzSW4oKSAmJiBUeXBlTmVlZHNPcHRpb24oYXJnX3R5cGUsIHR5cGVuYW1lcykpIHsKICAgICAgICAgLy8gVW53cmFwIG91dC1vbmx5IGFyZ3VtZW50cyB0aGF0IHdlIHdyYXBwZWQgaW4gT3B0aW9uPFQ+CiAgICAgICAgIG91dCA8PCAibGV0ICIgPDwgYXJnX25hbWUgPDwgIiA9ICIgPDwgYXJnX25hbWUKICAgICAgICAgICAgIDw8ICIub2tfb3IoYmluZGVyOjpTdGF0dXNDb2RlOjpVTkVYUEVDVEVEX05VTEwpPztcbiI7CkBAIC0yNzgsNyArNDcyLDcgQEAKICAgYXV0byBzZXJ2ZXJfbmFtZSA9IENsYXNzTmFtZSgqaWZhY2UsIGNwcDo6Q2xhc3NOYW1lczo6U0VSVkVSKTsKIAogICAvLyBGb3J3YXJkIGFsbCBJRm9vIGZ1bmN0aW9ucyBmcm9tIEJpbmRlciB0byB0aGUgaW5uZXIgb2JqZWN0Ci0gIG91dCA8PCAiaW1wbCAiIDw8IHRyYWl0X25hbWUgPDwgIiBmb3IgYmluZGVyOjpCaW5kZXI8IiA8PCBzZXJ2ZXJfbmFtZSA8PCAiPiB7XG4iOworICBvdXQgPDwgImltcGwgIiA8PCB0cmFpdF9uYW1lIDw8ICIgZm9yIGJpbmRlcjo6YmluZGVyX2ltcGw6OkJpbmRlcjwiIDw8IHNlcnZlcl9uYW1lIDw8ICI+IHtcbiI7CiAgIG91dC5JbmRlbnQoKTsKICAgZm9yIChjb25zdCBhdXRvJiBtZXRob2QgOiBpZmFjZS0+R2V0TWV0aG9kcygpKSB7CiAgICAgc3RyaW5nIGFyZ3M7CkBAIC0yOTksMTQgKzQ5MywxNiBAQAogICAgICAgICAgIl9haWRsX3NlcnZpY2U6ICZkeW4gIgogICAgICAgPDwgdHJhaXRfbmFtZQogICAgICAgPDwgIiwgIgotICAgICAgICAgIl9haWRsX2NvZGU6IGJpbmRlcjo6VHJhbnNhY3Rpb25Db2RlLCAiCi0gICAgICAgICAiX2FpZGxfZGF0YTogJmJpbmRlcjo6cGFyY2VsOjpQYXJjZWwsICIKLSAgICAgICAgICJfYWlkbF9yZXBseTogJm11dCBiaW5kZXI6OnBhcmNlbDo6UGFyY2VsKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4ge1xuIjsKKyAgICAgICAgICJfYWlkbF9jb2RlOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUsICIKKyAgICAgICAgICJfYWlkbF9kYXRhOiAmYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWw8J18+LCAiCisgICAgICAgICAiX2FpZGxfcmVwbHk6ICZtdXQgYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWw8J18+KSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCAiCisgICAgICAgICAiYmluZGVyOjpTdGF0dXNDb2RlPiAiCisgICAgICAgICAie1xuIjsKICAgb3V0LkluZGVudCgpOwogICBvdXQgPDwgIm1hdGNoIF9haWRsX2NvZGUge1xuIjsKICAgb3V0LkluZGVudCgpOwogICBmb3IgKGNvbnN0IGF1dG8mIG1ldGhvZCA6IGlmYWNlLT5HZXRNZXRob2RzKCkpIHsKLSAgICBHZW5lcmF0ZVNlcnZlclRyYW5zYWN0aW9uKG91dCwgKm1ldGhvZCwgdHlwZW5hbWVzKTsKKyAgICBHZW5lcmF0ZVNlcnZlclRyYW5zYWN0aW9uKG91dCwgKmlmYWNlLCAqbWV0aG9kLCB0eXBlbmFtZXMpOwogICB9CiAgIG91dCA8PCAiXyA9PiBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKVxuIjsKICAgb3V0LkRlZGVudCgpOwpAQCAtMzM3LDcgKzUzMyw3IEBACiAgICAgICBjb25zdF90eXBlID0gIiZzdHIiOwogICAgIH0gZWxzZSBpZiAodHlwZS5TaWduYXR1cmUoKSA9PSAiYnl0ZSIgfHwgdHlwZS5TaWduYXR1cmUoKSA9PSAiaW50IiB8fAogICAgICAgICAgICAgICAgdHlwZS5TaWduYXR1cmUoKSA9PSAibG9uZyIpIHsKLSAgICAgIGNvbnN0X3R5cGUgPSBSdXN0TmFtZU9mKHR5cGUsIHR5cGVuYW1lcywgU3RvcmFnZU1vZGU6OlZBTFVFKTsKKyAgICAgIGNvbnN0X3R5cGUgPSBSdXN0TmFtZU9mKHR5cGUsIHR5cGVuYW1lcywgU3RvcmFnZU1vZGU6OlZBTFVFLCBMaWZldGltZTo6Tk9ORSk7CiAgICAgfSBlbHNlIHsKICAgICAgIEFJRExfRkFUQUwodmFsdWUpIDw8ICJVbnJlY29nbml6ZWQgY29uc3RhbnQgdHlwZTogIiA8PCB0eXBlLlNpZ25hdHVyZSgpOwogICAgIH0KQEAgLTM0OCwxNyArNTQ0LDE2IEBACiAgIH0KIH0KIAotYm9vbCBHZW5lcmF0ZVJ1c3RJbnRlcmZhY2UoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwgY29uc3QgQWlkbEludGVyZmFjZSogaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsIGNvbnN0IElvRGVsZWdhdGUmIGlvX2RlbGVnYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgewotICBDb2RlV3JpdGVyUHRyIGNvZGVfd3JpdGVyID0gaW9fZGVsZWdhdGUuR2V0Q29kZVdyaXRlcihmaWxlbmFtZSk7Ci0KK3ZvaWQgR2VuZXJhdGVSdXN0SW50ZXJmYWNlKENvZGVXcml0ZXIqIGNvZGVfd3JpdGVyLCBjb25zdCBBaWRsSW50ZXJmYWNlKiBpZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgewogICAqY29kZV93cml0ZXIgPDwgIiMhW2FsbG93KG5vbl91cHBlcl9jYXNlX2dsb2JhbHMpXVxuIjsKICAgKmNvZGVfd3JpdGVyIDw8ICIjIVthbGxvdyhub25fc25ha2VfY2FzZSldXG4iOwogICAvLyBJbXBvcnQgSUJpbmRlckludGVybmFsIGZvciB0cmFuc2FjdCgpCi0gICpjb2RlX3dyaXRlciA8PCAiI1thbGxvdyh1bnVzZWRfaW1wb3J0cyldIHVzZSBiaW5kZXI6OklCaW5kZXJJbnRlcm5hbDtcbiI7CisgICpjb2RlX3dyaXRlciA8PCAiI1thbGxvdyh1bnVzZWRfaW1wb3J0cyldIHVzZSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpJQmluZGVySW50ZXJuYWw7XG4iOwogCiAgIGF1dG8gdHJhaXRfbmFtZSA9IENsYXNzTmFtZSgqaWZhY2UsIGNwcDo6Q2xhc3NOYW1lczo6SU5URVJGQUNFKTsKKyAgYXV0byB0cmFpdF9uYW1lX2FzeW5jID0gdHJhaXRfbmFtZSArICJBc3luYyI7CisgIGF1dG8gdHJhaXRfbmFtZV9hc3luY19zZXJ2ZXIgPSB0cmFpdF9uYW1lICsgIkFzeW5jU2VydmVyIjsKICAgYXV0byBjbGllbnRfbmFtZSA9IENsYXNzTmFtZSgqaWZhY2UsIGNwcDo6Q2xhc3NOYW1lczo6Q0xJRU5UKTsKICAgYXV0byBzZXJ2ZXJfbmFtZSA9IENsYXNzTmFtZSgqaWZhY2UsIGNwcDo6Q2xhc3NOYW1lczo6U0VSVkVSKTsKICAgKmNvZGVfd3JpdGVyIDw8ICJ1c2UgYmluZGVyOjpkZWNsYXJlX2JpbmRlcl9pbnRlcmZhY2U7XG4iOwpAQCAtMzgzLDE0ICs1NzgsMTYgQEAKICAgfQogICBjb2RlX3dyaXRlci0+RGVkZW50KCk7CiAgICpjb2RlX3dyaXRlciA8PCAifSxcbiI7Ci0gIGNvZGVfd3JpdGVyLT5EZWRlbnQoKTsKKyAgKmNvZGVfd3JpdGVyIDw8ICJhc3luYzogIiA8PCB0cmFpdF9uYW1lX2FzeW5jIDw8ICIsXG4iOwogICBpZiAoaWZhY2UtPklzVmludGZTdGFiaWxpdHkoKSkgewotICAgICpjb2RlX3dyaXRlciA8PCAic3RhYmlsaXR5OiBiaW5kZXI6OlN0YWJpbGl0eTo6VmludGYsXG4iOworICAgICpjb2RlX3dyaXRlciA8PCAic3RhYmlsaXR5OiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpTdGFiaWxpdHk6OlZpbnRmLFxuIjsKICAgfQorICBjb2RlX3dyaXRlci0+RGVkZW50KCk7CiAgICpjb2RlX3dyaXRlciA8PCAifVxuIjsKICAgY29kZV93cml0ZXItPkRlZGVudCgpOwogICAqY29kZV93cml0ZXIgPDwgIn1cbiI7CiAKKyAgLy8gRW1pdCB0aGUgdHJhaXQuCiAgIEdlbmVyYXRlRGVwcmVjYXRlZCgqY29kZV93cml0ZXIsICppZmFjZSk7CiAgICpjb2RlX3dyaXRlciA8PCAicHViIHRyYWl0ICIgPDwgdHJhaXRfbmFtZSA8PCAiOiBiaW5kZXI6OkludGVyZmFjZSArIFNlbmQge1xuIjsKICAgY29kZV93cml0ZXItPkluZGVudCgpOwpAQCAtNDMwLDYgKzYyNywxMjUgQEAKICAgY29kZV93cml0ZXItPkRlZGVudCgpOwogICAqY29kZV93cml0ZXIgPDwgIn1cbiI7CiAKKyAgLy8gRW1pdCB0aGUgYXN5bmMgdHJhaXQuCisgIEdlbmVyYXRlRGVwcmVjYXRlZCgqY29kZV93cml0ZXIsICppZmFjZSk7CisgICpjb2RlX3dyaXRlciA8PCAicHViIHRyYWl0ICIgPDwgdHJhaXRfbmFtZV9hc3luYyA8PCAiPFA+OiBiaW5kZXI6OkludGVyZmFjZSArIFNlbmQge1xuIjsKKyAgY29kZV93cml0ZXItPkluZGVudCgpOworICAqY29kZV93cml0ZXIgPDwgImZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHdoZXJlIFNlbGY6IFNpemVkIHsgXCIiCisgICAgICAgICAgICAgICA8PCBpZmFjZS0+R2V0RGVzY3JpcHRvcigpIDw8ICJcIiB9XG4iOworCisgIGZvciAoY29uc3QgYXV0byYgbWV0aG9kIDogaWZhY2UtPkdldE1ldGhvZHMoKSkgeworICAgIC8vIEdlbmVyYXRlIHRoZSBtZXRob2QKKyAgICBHZW5lcmF0ZURlcHJlY2F0ZWQoKmNvZGVfd3JpdGVyLCAqbWV0aG9kKTsKKworICAgIE1ldGhvZEtpbmQga2luZCA9IG1ldGhvZC0+SXNPbmV3YXkoKSA/IE1ldGhvZEtpbmQ6OlJFQURZX0ZVVFVSRSA6IE1ldGhvZEtpbmQ6OkJPWEVEX0ZVVFVSRTsKKworICAgIGlmIChtZXRob2QtPklzVXNlckRlZmluZWQoKSkgeworICAgICAgKmNvZGVfd3JpdGVyIDw8IEJ1aWxkTWV0aG9kKCptZXRob2QsIHR5cGVuYW1lcywga2luZCkgPDwgIjtcbiI7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIEdlbmVyYXRlIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIGZvciBtZXRhIG1ldGhvZHMKKyAgICAgICpjb2RlX3dyaXRlciA8PCBCdWlsZE1ldGhvZCgqbWV0aG9kLCB0eXBlbmFtZXMsIGtpbmQpIDw8ICIge1xuIjsKKyAgICAgIGNvZGVfd3JpdGVyLT5JbmRlbnQoKTsKKyAgICAgIGlmIChtZXRob2QtPkdldE5hbWUoKSA9PSBrR2V0SW50ZXJmYWNlVmVyc2lvbiAmJiBvcHRpb25zLlZlcnNpb24oKSA+IDApIHsKKyAgICAgICAgKmNvZGVfd3JpdGVyIDw8ICJCb3g6OnBpbihhc3luYyBtb3ZlIHsgT2soVkVSU0lPTikgfSlcbiI7CisgICAgICB9IGVsc2UgaWYgKG1ldGhvZC0+R2V0TmFtZSgpID09IGtHZXRJbnRlcmZhY2VIYXNoICYmICFvcHRpb25zLkhhc2goKS5lbXB0eSgpKSB7CisgICAgICAgICpjb2RlX3dyaXRlciA8PCAiQm94OjpwaW4oYXN5bmMgbW92ZSB7IE9rKEhBU0guaW50bygpKSB9KVxuIjsKKyAgICAgIH0KKyAgICAgIGNvZGVfd3JpdGVyLT5EZWRlbnQoKTsKKyAgICAgICpjb2RlX3dyaXRlciA8PCAifVxuIjsKKyAgICB9CisgIH0KKyAgY29kZV93cml0ZXItPkRlZGVudCgpOworICAqY29kZV93cml0ZXIgPDwgIn1cbiI7CisKKyAgLy8gRW1pdCB0aGUgYXN5bmMgc2VydmVyIHRyYWl0LgorICBHZW5lcmF0ZURlcHJlY2F0ZWQoKmNvZGVfd3JpdGVyLCAqaWZhY2UpOworICAqY29kZV93cml0ZXIgPDwgIiNbOjphc3luY190cmFpdDo6YXN5bmNfdHJhaXRdXG4iOworICAqY29kZV93cml0ZXIgPDwgInB1YiB0cmFpdCAiIDw8IHRyYWl0X25hbWVfYXN5bmNfc2VydmVyIDw8ICI6IGJpbmRlcjo6SW50ZXJmYWNlICsgU2VuZCB7XG4iOworICBjb2RlX3dyaXRlci0+SW5kZW50KCk7CisgICpjb2RlX3dyaXRlciA8PCAiZm4gZ2V0X2Rlc2NyaXB0b3IoKSAtPiAmJ3N0YXRpYyBzdHIgd2hlcmUgU2VsZjogU2l6ZWQgeyBcIiIKKyAgICAgICAgICAgICAgIDw8IGlmYWNlLT5HZXREZXNjcmlwdG9yKCkgPDwgIlwiIH1cbiI7CisKKyAgZm9yIChjb25zdCBhdXRvJiBtZXRob2QgOiBpZmFjZS0+R2V0TWV0aG9kcygpKSB7CisgICAgLy8gR2VuZXJhdGUgdGhlIG1ldGhvZAorICAgIGlmIChtZXRob2QtPklzVXNlckRlZmluZWQoKSkgeworICAgICAgR2VuZXJhdGVEZXByZWNhdGVkKCpjb2RlX3dyaXRlciwgKm1ldGhvZCk7CisgICAgICAqY29kZV93cml0ZXIgPDwgQnVpbGRNZXRob2QoKm1ldGhvZCwgdHlwZW5hbWVzLCBNZXRob2RLaW5kOjpBU1lOQykgPDwgIjtcbiI7CisgICAgfQorICB9CisgIGNvZGVfd3JpdGVyLT5EZWRlbnQoKTsKKyAgKmNvZGVfd3JpdGVyIDw8ICJ9XG4iOworCisgIC8vIEVtaXQgYSBuZXdfYXN5bmNfYmluZGVyIG1ldGhvZCBmb3IgYmluZGluZyBhbiBhc3luYyBzZXJ2ZXIuCisgICpjb2RlX3dyaXRlciA8PCAiaW1wbCAiIDw8IHNlcnZlcl9uYW1lIDw8ICIge1xuIjsKKyAgY29kZV93cml0ZXItPkluZGVudCgpOworICAqY29kZV93cml0ZXIgPDwgIi8vLyBDcmVhdGUgYSBuZXcgYXN5bmMgYmluZGVyIHNlcnZpY2UuXG4iOworICAqY29kZV93cml0ZXIgPDwgInB1YiBmbiBuZXdfYXN5bmNfYmluZGVyPFQsIFI+KGlubmVyOiBULCBydDogUiwgZmVhdHVyZXM6ICIKKyAgICAgICAgICAgICAgICAgICJiaW5kZXI6OkJpbmRlckZlYXR1cmVzKSAtPiBiaW5kZXI6OlN0cm9uZzxkeW4gIgorICAgICAgICAgICAgICAgPDwgdHJhaXRfbmFtZSA8PCAiPlxuIjsKKyAgKmNvZGVfd3JpdGVyIDw8ICJ3aGVyZVxuIjsKKyAgY29kZV93cml0ZXItPkluZGVudCgpOworICAqY29kZV93cml0ZXIgPDwgIlQ6ICIgPDwgdHJhaXRfbmFtZV9hc3luY19zZXJ2ZXIKKyAgICAgICAgICAgICAgIDw8ICIgKyBiaW5kZXI6OkludGVyZmFjZSArIFNlbmQgKyBTeW5jICsgJ3N0YXRpYyxcbiI7CisgICpjb2RlX3dyaXRlciA8PCAiUjogYmluZGVyOjpiaW5kZXJfaW1wbDo6QmluZGVyQXN5bmNSdW50aW1lICsgU2VuZCArIFN5bmMgKyAnc3RhdGljLFxuIjsKKyAgY29kZV93cml0ZXItPkRlZGVudCgpOworICAqY29kZV93cml0ZXIgPDwgIntcbiI7CisgIGNvZGVfd3JpdGVyLT5JbmRlbnQoKTsKKyAgLy8gRGVmaW5lIGEgd3JhcHBlciBzdHJ1Y3QgdGhhdCBpbXBsZW1lbnRzIHRoZSBub24tYXN5bmMgdHJhaXQgYnkgY2FsbGluZyBibG9ja19vbi4KKyAgKmNvZGVfd3JpdGVyIDw8ICJzdHJ1Y3QgV3JhcHBlcjxULCBSPiB7XG4iOworICBjb2RlX3dyaXRlci0+SW5kZW50KCk7CisgICpjb2RlX3dyaXRlciA8PCAiX2lubmVyOiBULFxuIjsKKyAgKmNvZGVfd3JpdGVyIDw8ICJfcnQ6IFIsXG4iOworICBjb2RlX3dyaXRlci0+RGVkZW50KCk7CisgICpjb2RlX3dyaXRlciA8PCAifVxuIjsKKyAgKmNvZGVfd3JpdGVyIDw8ICJpbXBsPFQsIFI+IGJpbmRlcjo6SW50ZXJmYWNlIGZvciBXcmFwcGVyPFQsIFI+IHdoZXJlIFQ6IGJpbmRlcjo6SW50ZXJmYWNlLCBSOiAiCisgICAgICAgICAgICAgICAgICAiU2VuZCArIFN5bmMge1xuIjsKKyAgY29kZV93cml0ZXItPkluZGVudCgpOworICAqY29kZV93cml0ZXIgPDwgImZuIGFzX2JpbmRlcigmc2VsZikgLT4gYmluZGVyOjpTcElCaW5kZXIgeyBzZWxmLl9pbm5lci5hc19iaW5kZXIoKSB9XG4iOworICAqY29kZV93cml0ZXIKKyAgICAgIDw8ICJmbiBkdW1wKCZzZWxmLCBfZmlsZTogJnN0ZDo6ZnM6OkZpbGUsIF9hcmdzOiAmWyZzdGQ6OmZmaTo6Q1N0cl0pIC0+ICIKKyAgICAgICAgICJzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsgc2VsZi5faW5uZXIuZHVtcChfZmlsZSwgX2FyZ3MpIH1cbiI7CisgIGNvZGVfd3JpdGVyLT5EZWRlbnQoKTsKKyAgKmNvZGVfd3JpdGVyIDw8ICJ9XG4iOworICAqY29kZV93cml0ZXIgPDwgImltcGw8VCwgUj4gIiA8PCB0cmFpdF9uYW1lIDw8ICIgZm9yIFdyYXBwZXI8VCwgUj5cbiI7CisgICpjb2RlX3dyaXRlciA8PCAid2hlcmVcbiI7CisgIGNvZGVfd3JpdGVyLT5JbmRlbnQoKTsKKyAgKmNvZGVfd3JpdGVyIDw8ICJUOiAiIDw8IHRyYWl0X25hbWVfYXN5bmNfc2VydmVyIDw8ICIgKyBTZW5kICsgU3luYyArICdzdGF0aWMsXG4iOworICAqY29kZV93cml0ZXIgPDwgIlI6IGJpbmRlcjo6YmluZGVyX2ltcGw6OkJpbmRlckFzeW5jUnVudGltZSArIFNlbmQgKyBTeW5jICsgJ3N0YXRpYyxcbiI7CisgIGNvZGVfd3JpdGVyLT5EZWRlbnQoKTsKKyAgKmNvZGVfd3JpdGVyIDw8ICJ7XG4iOworICBjb2RlX3dyaXRlci0+SW5kZW50KCk7CisgIGZvciAoY29uc3QgYXV0byYgbWV0aG9kIDogaWZhY2UtPkdldE1ldGhvZHMoKSkgeworICAgIC8vIEdlbmVyYXRlIHRoZSBtZXRob2QKKyAgICBpZiAobWV0aG9kLT5Jc1VzZXJEZWZpbmVkKCkpIHsKKyAgICAgIHN0cmluZyBhcmdzID0gIiI7CisgICAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxBaWRsQXJndW1lbnQ+JiBhcmcgOiBtZXRob2QtPkdldEFyZ3VtZW50cygpKSB7CisgICAgICAgIGlmICghYXJncy5lbXB0eSgpKSB7CisgICAgICAgICAgYXJncyArPSAiLCAiOworICAgICAgICB9CisgICAgICAgIGFyZ3MgKz0ga0FyZ3VtZW50UHJlZml4OworICAgICAgICBhcmdzICs9IGFyZy0+R2V0TmFtZSgpOworICAgICAgfQorCisgICAgICAqY29kZV93cml0ZXIgPDwgQnVpbGRNZXRob2QoKm1ldGhvZCwgdHlwZW5hbWVzKSA8PCAiIHtcbiI7CisgICAgICBjb2RlX3dyaXRlci0+SW5kZW50KCk7CisgICAgICAqY29kZV93cml0ZXIgPDwgInNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLiIgPDwgbWV0aG9kLT5HZXROYW1lKCkgPDwgIigiIDw8IGFyZ3MKKyAgICAgICAgICAgICAgICAgICA8PCAiKSlcbiI7CisgICAgICBjb2RlX3dyaXRlci0+RGVkZW50KCk7CisgICAgICAqY29kZV93cml0ZXIgPDwgIn1cbiI7CisgICAgfQorICB9CisgIGNvZGVfd3JpdGVyLT5EZWRlbnQoKTsKKyAgKmNvZGVfd3JpdGVyIDw8ICJ9XG4iOworCisgICpjb2RlX3dyaXRlciA8PCAibGV0IHdyYXBwZWQgPSBXcmFwcGVyIHsgX2lubmVyOiBpbm5lciwgX3J0OiBydCB9O1xuIjsKKyAgKmNvZGVfd3JpdGVyIDw8ICJTZWxmOjpuZXdfYmluZGVyKHdyYXBwZWQsIGZlYXR1cmVzKVxuIjsKKworICBjb2RlX3dyaXRlci0+RGVkZW50KCk7CisgICpjb2RlX3dyaXRlciA8PCAifVxuIjsKKyAgY29kZV93cml0ZXItPkRlZGVudCgpOworICAqY29kZV93cml0ZXIgPDwgIn1cbiI7CisKICAgLy8gRW1pdCB0aGUgZGVmYXVsdCB0cmFpdAogICAqY29kZV93cml0ZXIgPDwgInB1YiB0cmFpdCAiIDw8IGRlZmF1bHRfdHJhaXRfbmFtZSA8PCAiOiBTZW5kICsgU3luYyB7XG4iOwogICBjb2RlX3dyaXRlci0+SW5kZW50KCk7CkBAIC00NTUsOCArNzcxLDggQEAKICAgZm9yIChjb25zdCBhdXRvJiBtZXRob2QgOiBpZmFjZS0+R2V0TWV0aG9kcygpKSB7CiAgICAgLy8gR2VuZXJhdGUgdGhlIHRyYW5zYWN0aW9uIGNvZGUgY29uc3RhbnQKICAgICAqY29kZV93cml0ZXIgPDwgInB1YiBjb25zdCAiIDw8IG1ldGhvZC0+R2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgIDw8ICI6IGJpbmRlcjo6VHJhbnNhY3Rpb25Db2RlID0gIgotICAgICAgICAgICAgICAgICAgICAiYmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgIiArCisgICAgICAgICAgICAgICAgIDw8ICI6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9ICIKKyAgICAgICAgICAgICAgICAgICAgImJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAiICsKICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dG9fc3RyaW5nKG1ldGhvZC0+R2V0SWQoKSkgKyAiO1xuIjsKICAgfQogICBjb2RlX3dyaXRlci0+RGVkZW50KCk7CkBAIC00NzQsOCArNzkwLDYgQEAKICAgLy8gRW1pdCB0aGUgaW50ZXJmYWNlIGNvbnN0YW50cwogICBHZW5lcmF0ZUNvbnN0YW50RGVjbGFyYXRpb25zKCpjb2RlX3dyaXRlciwgKmlmYWNlLCB0eXBlbmFtZXMpOwogCi0gIEdlbmVyYXRlTWFuZ2xlZEFsaWFzKCpjb2RlX3dyaXRlciwgaWZhY2UpOwotCiAgIC8vIEVtaXQgVkVSU0lPTiBhbmQgSEFTSAogICAvLyBUaGVzZSBuZWVkIHRvIGJlIHRvcC1sZXZlbCBpdGVtIGNvbnN0YW50cyBpbnN0ZWFkIG9mIGFzc29jaWF0ZWQgY29uc3RzCiAgIC8vIGJlY2F1c2UgdGhlIGxhdHRlciBhcmUgaW5jb21wYXRpYmxlIHdpdGggdHJhaXQgb2JqZWN0cywgc2VlCkBAIC00ODcsMTkgKzgwMSw0MCBAQAogICAgICpjb2RlX3dyaXRlciA8PCAicHViIGNvbnN0IEhBU0g6ICZzdHIgPSBcIiIgPDwgb3B0aW9ucy5IYXNoKCkgPDwgIlwiO1xuIjsKICAgfQogCisgIC8vIEdlbmVyYXRlIHRoZSBjbGllbnQtc2lkZSBtZXRob2QgaGVscGVycworICAvLworICAvLyBUaGUgbWV0aG9kcyBpbiB0aGlzIGJsb2NrIGFyZSBub3QgbWFya2VkIHB1Yiwgc28gdGhleSBhcmUgbm90IGFjY2Vzc2libGUgZnJvbSBvdXRzaWRlIHRoZQorICAvLyBBSURMIGdlbmVyYXRlZCBjb2RlLgorICAqY29kZV93cml0ZXIgPDwgImltcGwgIiA8PCBjbGllbnRfbmFtZSA8PCAiIHtcbiI7CisgIGNvZGVfd3JpdGVyLT5JbmRlbnQoKTsKKyAgZm9yIChjb25zdCBhdXRvJiBtZXRob2QgOiBpZmFjZS0+R2V0TWV0aG9kcygpKSB7CisgICAgR2VuZXJhdGVDbGllbnRNZXRob2RIZWxwZXJzKCpjb2RlX3dyaXRlciwgKmlmYWNlLCAqbWV0aG9kLCB0eXBlbmFtZXMsIG9wdGlvbnMsIHRyYWl0X25hbWUpOworICB9CisgIGNvZGVfd3JpdGVyLT5EZWRlbnQoKTsKKyAgKmNvZGVfd3JpdGVyIDw8ICJ9XG4iOworCiAgIC8vIEdlbmVyYXRlIHRoZSBjbGllbnQtc2lkZSBtZXRob2RzCiAgICpjb2RlX3dyaXRlciA8PCAiaW1wbCAiIDw8IHRyYWl0X25hbWUgPDwgIiBmb3IgIiA8PCBjbGllbnRfbmFtZSA8PCAiIHtcbiI7CiAgIGNvZGVfd3JpdGVyLT5JbmRlbnQoKTsKICAgZm9yIChjb25zdCBhdXRvJiBtZXRob2QgOiBpZmFjZS0+R2V0TWV0aG9kcygpKSB7Ci0gICAgR2VuZXJhdGVDbGllbnRNZXRob2QoKmNvZGVfd3JpdGVyLCAqaWZhY2UsICptZXRob2QsIHR5cGVuYW1lcywgb3B0aW9ucywgdHJhaXRfbmFtZSk7CisgICAgR2VuZXJhdGVDbGllbnRNZXRob2QoKmNvZGVfd3JpdGVyLCAqaWZhY2UsICptZXRob2QsIHR5cGVuYW1lcywgb3B0aW9ucywgTWV0aG9kS2luZDo6Tk9STUFMKTsKKyAgfQorICBjb2RlX3dyaXRlci0+RGVkZW50KCk7CisgICpjb2RlX3dyaXRlciA8PCAifVxuIjsKKworICAvLyBHZW5lcmF0ZSB0aGUgYXN5bmMgY2xpZW50LXNpZGUgbWV0aG9kcworICAqY29kZV93cml0ZXIgPDwgImltcGw8UDogYmluZGVyOjpCaW5kZXJBc3luY1Bvb2w+ICIgPDwgdHJhaXRfbmFtZV9hc3luYyA8PCAiPFA+IGZvciAiCisgICAgICAgICAgICAgICA8PCBjbGllbnRfbmFtZSA8PCAiIHtcbiI7CisgIGNvZGVfd3JpdGVyLT5JbmRlbnQoKTsKKyAgZm9yIChjb25zdCBhdXRvJiBtZXRob2QgOiBpZmFjZS0+R2V0TWV0aG9kcygpKSB7CisgICAgTWV0aG9kS2luZCBraW5kID0gbWV0aG9kLT5Jc09uZXdheSgpID8gTWV0aG9kS2luZDo6UkVBRFlfRlVUVVJFIDogTWV0aG9kS2luZDo6Qk9YRURfRlVUVVJFOworICAgIEdlbmVyYXRlQ2xpZW50TWV0aG9kKCpjb2RlX3dyaXRlciwgKmlmYWNlLCAqbWV0aG9kLCB0eXBlbmFtZXMsIG9wdGlvbnMsIGtpbmQpOwogICB9CiAgIGNvZGVfd3JpdGVyLT5EZWRlbnQoKTsKICAgKmNvZGVfd3JpdGVyIDw8ICJ9XG4iOwogCiAgIC8vIEdlbmVyYXRlIHRoZSBzZXJ2ZXItc2lkZSBtZXRob2RzCiAgIEdlbmVyYXRlU2VydmVySXRlbXMoKmNvZGVfd3JpdGVyLCBpZmFjZSwgdHlwZW5hbWVzKTsKLQotICByZXR1cm4gdHJ1ZTsKIH0KIAogdm9pZCBHZW5lcmF0ZVBhcmNlbEJvZHkoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsU3RydWN0dXJlZFBhcmNlbGFibGUqIHBhcmNlbCwKQEAgLTUwOSw3ICs4NDQsOCBAQAogICBvdXQuSW5kZW50KCk7CiAgIGZvciAoY29uc3QgYXV0byYgdmFyaWFibGUgOiBwYXJjZWwtPkdldEZpZWxkcygpKSB7CiAgICAgR2VuZXJhdGVEZXByZWNhdGVkKG91dCwgKnZhcmlhYmxlKTsKLSAgICBhdXRvIGZpZWxkX3R5cGUgPSBSdXN0TmFtZU9mKHZhcmlhYmxlLT5HZXRUeXBlKCksIHR5cGVuYW1lcywgU3RvcmFnZU1vZGU6OlBBUkNFTEFCTEVfRklFTEQpOworICAgIGF1dG8gZmllbGRfdHlwZSA9CisgICAgICAgIFJ1c3ROYW1lT2YodmFyaWFibGUtPkdldFR5cGUoKSwgdHlwZW5hbWVzLCBTdG9yYWdlTW9kZTo6UEFSQ0VMQUJMRV9GSUVMRCwgTGlmZXRpbWU6Ok5PTkUpOwogICAgIG91dCA8PCAicHViICIgPDwgdmFyaWFibGUtPkdldE5hbWUoKSA8PCAiOiAiIDw8IGZpZWxkX3R5cGUgPDwgIixcbiI7CiAgIH0KICAgb3V0LkRlZGVudCgpOwpAQCAtNTI0LDExICs4NjAsMjggQEAKICAgb3V0IDw8ICJTZWxmIHtcbiI7CiAgIG91dC5JbmRlbnQoKTsKICAgZm9yIChjb25zdCBhdXRvJiB2YXJpYWJsZSA6IHBhcmNlbC0+R2V0RmllbGRzKCkpIHsKKyAgICBvdXQgPDwgdmFyaWFibGUtPkdldE5hbWUoKSA8PCAiOiAiOwogICAgIGlmICh2YXJpYWJsZS0+R2V0RGVmYXVsdFZhbHVlKCkpIHsKLSAgICAgIG91dCA8PCB2YXJpYWJsZS0+R2V0TmFtZSgpIDw8ICI6ICIgPDwgdmFyaWFibGUtPlZhbHVlU3RyaW5nKENvbnN0YW50VmFsdWVEZWNvcmF0b3IpIDw8ICIsXG4iOworICAgICAgb3V0IDw8IHZhcmlhYmxlLT5WYWx1ZVN0cmluZyhDb25zdGFudFZhbHVlRGVjb3JhdG9yKTsKICAgICB9IGVsc2UgewotICAgICAgb3V0IDw8IHZhcmlhYmxlLT5HZXROYW1lKCkgPDwgIjogRGVmYXVsdDo6ZGVmYXVsdCgpLFxuIjsKKyAgICAgIC8vIFNvbWUgdHlwZXMgZG9uJ3QgaW1wbGVtZW50ICJEZWZhdWx0Ii4KKyAgICAgIC8vIC0gUGFyY2VsYWJsZUhvbGRlcgorICAgICAgLy8gLSBBcnJheXMKKyAgICAgIGlmICh2YXJpYWJsZS0+R2V0VHlwZSgpLkdldE5hbWUoKSA9PSAiUGFyY2VsYWJsZUhvbGRlciIpIHsKKyAgICAgICAgb3V0IDw8ICJiaW5kZXI6OlBhcmNlbGFibGVIb2xkZXI6Om5ldygiOworICAgICAgICBpZiAocGFyY2VsLT5Jc1ZpbnRmU3RhYmlsaXR5KCkpIHsKKyAgICAgICAgICBvdXQgPDwgImJpbmRlcjo6YmluZGVyX2ltcGw6OlN0YWJpbGl0eTo6VmludGYiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAiYmluZGVyOjpiaW5kZXJfaW1wbDo6U3RhYmlsaXR5OjpMb2NhbCI7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8ICIpIjsKKyAgICAgIH0gZWxzZSBpZiAodmFyaWFibGUtPkdldFR5cGUoKS5Jc0ZpeGVkU2l6ZUFycmF5KCkgJiYgIXZhcmlhYmxlLT5HZXRUeXBlKCkuSXNOdWxsYWJsZSgpKSB7CisgICAgICAgIG91dCA8PCBBcnJheURlZmF1bHRWYWx1ZSh2YXJpYWJsZS0+R2V0VHlwZSgpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCAiRGVmYXVsdDo6ZGVmYXVsdCgpIjsKKyAgICAgIH0KICAgICB9CisgICAgb3V0IDw8ICIsXG4iOwogICB9CiAgIG91dC5EZWRlbnQoKTsKICAgb3V0IDw8ICJ9XG4iOwpAQCAtNTQzLDEyICs4OTYsMTIgQEAKICAgb3V0IDw8ICJwYXJjZWwuc2l6ZWRfd3JpdGUofHN1YnBhcmNlbHwge1xuIjsKICAgb3V0LkluZGVudCgpOwogICBmb3IgKGNvbnN0IGF1dG8mIHZhcmlhYmxlIDogcGFyY2VsLT5HZXRGaWVsZHMoKSkgewotICAgIGlmICghVHlwZUhhc0RlZmF1bHQodmFyaWFibGUtPkdldFR5cGUoKSwgdHlwZW5hbWVzKSkgewotICAgICAgb3V0IDw8ICJsZXQgX19maWVsZF9yZWYgPSB0aGlzLiIgPDwgdmFyaWFibGUtPkdldE5hbWUoKQorICAgIGlmIChUeXBlTmVlZHNPcHRpb24odmFyaWFibGUtPkdldFR5cGUoKSwgdHlwZW5hbWVzKSkgeworICAgICAgb3V0IDw8ICJsZXQgX19maWVsZF9yZWYgPSBzZWxmLiIgPDwgdmFyaWFibGUtPkdldE5hbWUoKQogICAgICAgICAgIDw8ICIuYXNfcmVmKCkub2tfb3IoYmluZGVyOjpTdGF0dXNDb2RlOjpVTkVYUEVDVEVEX05VTEwpPztcbiI7CiAgICAgICBvdXQgPDwgInN1YnBhcmNlbC53cml0ZShfX2ZpZWxkX3JlZik/O1xuIjsKICAgICB9IGVsc2UgewotICAgICAgb3V0IDw8ICJzdWJwYXJjZWwud3JpdGUoJnRoaXMuIiA8PCB2YXJpYWJsZS0+R2V0TmFtZSgpIDw8ICIpPztcbiI7CisgICAgICBvdXQgPDwgInN1YnBhcmNlbC53cml0ZSgmc2VsZi4iIDw8IHZhcmlhYmxlLT5HZXROYW1lKCkgPDwgIik/O1xuIjsKICAgICB9CiAgIH0KICAgb3V0IDw8ICJPaygoKSlcbiI7CkBAIC01NTgsMzcgKzkxMSwyMyBAQAogCiB2b2lkIEdlbmVyYXRlUGFyY2VsRGVzZXJpYWxpemVCb2R5KENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbFN0cnVjdHVyZWRQYXJjZWxhYmxlKiBwYXJjZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcykgewotICBvdXQgPDwgImxldCBzdGFydF9wb3MgPSBwYXJjZWwuZ2V0X2RhdGFfcG9zaXRpb24oKTtcbiI7Ci0gIG91dCA8PCAibGV0IHBhcmNlbGFibGVfc2l6ZTogaTMyID0gcGFyY2VsLnJlYWQoKT87XG4iOwotICBvdXQgPDwgImlmIHBhcmNlbGFibGVfc2l6ZSA8IDAgeyByZXR1cm4gRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6QkFEX1ZBTFVFKTsgfVxuIjsKLSAgb3V0IDw8ICJpZiBzdGFydF9wb3MuY2hlY2tlZF9hZGQocGFyY2VsYWJsZV9zaXplKS5pc19ub25lKCkge1xuIjsKLSAgb3V0IDw8ICIgIHJldHVybiBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpCQURfVkFMVUUpO1xuIjsKLSAgb3V0IDw8ICJ9XG4iOworICBvdXQgPDwgInBhcmNlbC5zaXplZF9yZWFkKHxzdWJwYXJjZWx8IHtcbiI7CisgIG91dC5JbmRlbnQoKTsKIAotICAvLyBQcmUtZW1pdCB0aGUgY29tbW9uIGZpZWxkIHByb2xvZ3VlIGNvZGUsIHNoYXJlZCBiZXR3ZWVuIGFsbCBmaWVsZHM6Ci0gIG9zdHJpbmdzdHJlYW0gcHJvbG9ndWU7Ci0gIHByb2xvZ3VlIDw8ICJpZiAocGFyY2VsLmdldF9kYXRhX3Bvc2l0aW9uKCkgLSBzdGFydF9wb3MpID09IHBhcmNlbGFibGVfc2l6ZSB7XG4iOwotICAvLyBXZSBhc3N1bWUgdGhlIGxocyBjYW4gbmV2ZXIgYmUgPiBwYXJjZWxhYmxlX3NpemUsIGJlY2F1c2UgdGhlbiB0aGUgcmVhZAotICAvLyBpbW1lZGlhdGVseSBwcmVjZWRpbmcgdGhpcyBjaGVjayB3b3VsZCBoYXZlIHJldHVybmVkIE5PVF9FTk9VR0hfREFUQQotICBwcm9sb2d1ZSA8PCAiICByZXR1cm4gT2soU29tZShyZXN1bHQpKTtcbiI7Ci0gIHByb2xvZ3VlIDw8ICJ9XG4iOwotICBzdHJpbmcgcHJvbG9ndWVfc3RyID0gcHJvbG9ndWUuc3RyKCk7Ci0KLSAgb3V0IDw8ICJsZXQgbXV0IHJlc3VsdCA9IFNlbGY6OmRlZmF1bHQoKTtcbiI7CiAgIGZvciAoY29uc3QgYXV0byYgdmFyaWFibGUgOiBwYXJjZWwtPkdldEZpZWxkcygpKSB7Ci0gICAgb3V0IDw8IHByb2xvZ3VlX3N0cjsKLSAgICBpZiAoIVR5cGVIYXNEZWZhdWx0KHZhcmlhYmxlLT5HZXRUeXBlKCksIHR5cGVuYW1lcykpIHsKLSAgICAgIG91dCA8PCAicmVzdWx0LiIgPDwgdmFyaWFibGUtPkdldE5hbWUoKSA8PCAiID0gU29tZShwYXJjZWwucmVhZCgpPyk7XG4iOworICAgIG91dCA8PCAiaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7XG4iOworICAgIG91dC5JbmRlbnQoKTsKKyAgICBpZiAoVHlwZU5lZWRzT3B0aW9uKHZhcmlhYmxlLT5HZXRUeXBlKCksIHR5cGVuYW1lcykpIHsKKyAgICAgIG91dCA8PCAic2VsZi4iIDw8IHZhcmlhYmxlLT5HZXROYW1lKCkgPDwgIiA9IFNvbWUoc3VicGFyY2VsLnJlYWQoKT8pO1xuIjsKICAgICB9IGVsc2UgewotICAgICAgb3V0IDw8ICJyZXN1bHQuIiA8PCB2YXJpYWJsZS0+R2V0TmFtZSgpIDw8ICIgPSBwYXJjZWwucmVhZCgpPztcbiI7CisgICAgICBvdXQgPDwgInNlbGYuIiA8PCB2YXJpYWJsZS0+R2V0TmFtZSgpIDw8ICIgPSBzdWJwYXJjZWwucmVhZCgpPztcbiI7CiAgICAgfQorICAgIG91dC5EZWRlbnQoKTsKKyAgICBvdXQgPDwgIn1cbiI7CiAgIH0KLSAgLy8gTm93IHdlIHJlYWQgYWxsIGZpZWxkcy4KLSAgLy8gU2tpcCByZW1haW5pbmcgZGF0YSBpbiBjYXNlIHdlJ3JlIHJlYWRpbmcgZnJvbSBhIG5ld2VyIHZlcnNpb24KLSAgb3V0IDw8ICJ1bnNhZmUge1xuIjsKLSAgb3V0IDw8ICIgIHBhcmNlbC5zZXRfZGF0YV9wb3NpdGlvbihzdGFydF9wb3MgKyBwYXJjZWxhYmxlX3NpemUpPztcbiI7Ci0gIG91dCA8PCAifVxuIjsKLSAgb3V0IDw8ICJPayhTb21lKHJlc3VsdCkpXG4iOworICBvdXQgPDwgIk9rKCgpKVxuIjsKKyAgb3V0LkRlZGVudCgpOworICBvdXQgPDwgIn0pXG4iOwogfQogCiB2b2lkIEdlbmVyYXRlUGFyY2VsQm9keShDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxVbmlvbkRlY2wqIHBhcmNlbCwKQEAgLTU5OCw3ICs5MzcsOCBAQAogICBvdXQuSW5kZW50KCk7CiAgIGZvciAoY29uc3QgYXV0byYgdmFyaWFibGUgOiBwYXJjZWwtPkdldEZpZWxkcygpKSB7CiAgICAgR2VuZXJhdGVEZXByZWNhdGVkKG91dCwgKnZhcmlhYmxlKTsKLSAgICBhdXRvIGZpZWxkX3R5cGUgPSBSdXN0TmFtZU9mKHZhcmlhYmxlLT5HZXRUeXBlKCksIHR5cGVuYW1lcywgU3RvcmFnZU1vZGU6OlBBUkNFTEFCTEVfRklFTEQpOworICAgIGF1dG8gZmllbGRfdHlwZSA9CisgICAgICAgIFJ1c3ROYW1lT2YodmFyaWFibGUtPkdldFR5cGUoKSwgdHlwZW5hbWVzLCBTdG9yYWdlTW9kZTo6UEFSQ0VMQUJMRV9GSUVMRCwgTGlmZXRpbWU6Ok5PTkUpOwogICAgIG91dCA8PCB2YXJpYWJsZS0+R2V0Q2FwaXRhbGl6ZWROYW1lKCkgPDwgIigiIDw8IGZpZWxkX3R5cGUgPDwgIiksXG4iOwogICB9CiAgIG91dC5EZWRlbnQoKTsKQEAgLTYzMSwxNCArOTcxLDE0IEBACiAKIHZvaWQgR2VuZXJhdGVQYXJjZWxTZXJpYWxpemVCb2R5KENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbFVuaW9uRGVjbCogcGFyY2VsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzKSB7Ci0gIG91dCA8PCAibWF0Y2ggdGhpcyB7XG4iOworICBvdXQgPDwgIm1hdGNoIHNlbGYge1xuIjsKICAgb3V0LkluZGVudCgpOwogICBpbnQgdGFnID0gMDsKICAgZm9yIChjb25zdCBhdXRvJiB2YXJpYWJsZSA6IHBhcmNlbC0+R2V0RmllbGRzKCkpIHsKICAgICBvdXQgPDwgIlNlbGY6OiIgPDwgdmFyaWFibGUtPkdldENhcGl0YWxpemVkTmFtZSgpIDw8ICIodikgPT4ge1xuIjsKICAgICBvdXQuSW5kZW50KCk7CiAgICAgb3V0IDw8ICJwYXJjZWwud3JpdGUoJiIgPDwgc3RkOjp0b19zdHJpbmcodGFnKyspIDw8ICJpMzIpPztcbiI7Ci0gICAgaWYgKCFUeXBlSGFzRGVmYXVsdCh2YXJpYWJsZS0+R2V0VHlwZSgpLCB0eXBlbmFtZXMpKSB7CisgICAgaWYgKFR5cGVOZWVkc09wdGlvbih2YXJpYWJsZS0+R2V0VHlwZSgpLCB0eXBlbmFtZXMpKSB7CiAgICAgICBvdXQgPDwgImxldCBfX2ZpZWxkX3JlZiA9IHYuYXNfcmVmKCkub2tfb3IoYmluZGVyOjpTdGF0dXNDb2RlOjpVTkVYUEVDVEVEX05VTEwpPztcbiI7CiAgICAgICBvdXQgPDwgInBhcmNlbC53cml0ZShfX2ZpZWxkX3JlZilcbiI7CiAgICAgfSBlbHNlIHsKQEAgLTY1OCwxNyArOTk4LDE5IEBACiAgIG91dC5JbmRlbnQoKTsKICAgaW50IHRhZyA9IDA7CiAgIGZvciAoY29uc3QgYXV0byYgdmFyaWFibGUgOiBwYXJjZWwtPkdldEZpZWxkcygpKSB7Ci0gICAgYXV0byBmaWVsZF90eXBlID0gUnVzdE5hbWVPZih2YXJpYWJsZS0+R2V0VHlwZSgpLCB0eXBlbmFtZXMsIFN0b3JhZ2VNb2RlOjpQQVJDRUxBQkxFX0ZJRUxEKTsKKyAgICBhdXRvIGZpZWxkX3R5cGUgPQorICAgICAgICBSdXN0TmFtZU9mKHZhcmlhYmxlLT5HZXRUeXBlKCksIHR5cGVuYW1lcywgU3RvcmFnZU1vZGU6OlBBUkNFTEFCTEVfRklFTEQsIExpZmV0aW1lOjpOT05FKTsKIAogICAgIG91dCA8PCBzdGQ6OnRvX3N0cmluZyh0YWcrKykgPDwgIiA9PiB7XG4iOwogICAgIG91dC5JbmRlbnQoKTsKICAgICBvdXQgPDwgImxldCB2YWx1ZTogIiA8PCBmaWVsZF90eXBlIDw8ICIgPSAiOwotICAgIGlmICghVHlwZUhhc0RlZmF1bHQodmFyaWFibGUtPkdldFR5cGUoKSwgdHlwZW5hbWVzKSkgeworICAgIGlmIChUeXBlTmVlZHNPcHRpb24odmFyaWFibGUtPkdldFR5cGUoKSwgdHlwZW5hbWVzKSkgewogICAgICAgb3V0IDw8ICJTb21lKHBhcmNlbC5yZWFkKCk/KTtcbiI7CiAgICAgfSBlbHNlIHsKICAgICAgIG91dCA8PCAicGFyY2VsLnJlYWQoKT87XG4iOwogICAgIH0KLSAgICBvdXQgPDwgIk9rKFNvbWUoU2VsZjo6IiA8PCB2YXJpYWJsZS0+R2V0Q2FwaXRhbGl6ZWROYW1lKCkgPDwgIih2YWx1ZSkpKVxuIjsKKyAgICBvdXQgPDwgIipzZWxmID0gU2VsZjo6IiA8PCB2YXJpYWJsZS0+R2V0Q2FwaXRhbGl6ZWROYW1lKCkgPDwgIih2YWx1ZSk7XG4iOworICAgIG91dCA8PCAiT2soKCkpXG4iOwogICAgIG91dC5EZWRlbnQoKTsKICAgICBvdXQgPDwgIn1cbiI7CiAgIH0KQEAgLTY4MCw3MCArMTAyMiw1NSBAQAogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgUGFyY2VsYWJsZVR5cGU+Ci12b2lkIEdlbmVyYXRlUGFyY2VsU2VyaWFsaXplKENvZGVXcml0ZXImIG91dCwgY29uc3QgUGFyY2VsYWJsZVR5cGUqIHBhcmNlbCwKK3ZvaWQgR2VuZXJhdGVQYXJjZWxhYmxlVHJhaXQoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBQYXJjZWxhYmxlVHlwZSogcGFyY2VsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMpIHsKLSAgb3V0IDw8ICJpbXBsIGJpbmRlcjo6cGFyY2VsOjpTZXJpYWxpemUgZm9yICIgPDwgcGFyY2VsLT5HZXROYW1lKCkgPDwgIiB7XG4iOwotICBvdXQgPDwgIiAgZm4gc2VyaWFsaXplKCZzZWxmLCBwYXJjZWw6ICZtdXQgYmluZGVyOjpwYXJjZWw6OlBhcmNlbCkgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHtcbiI7Ci0gIG91dCA8PCAiICAgIDxTZWxmIGFzIGJpbmRlcjo6cGFyY2VsOjpTZXJpYWxpemVPcHRpb24+OjpzZXJpYWxpemVfb3B0aW9uKFNvbWUoc2VsZiksIHBhcmNlbClcbiI7Ci0gIG91dCA8PCAiICB9XG4iOwotICBvdXQgPDwgIn1cbiI7Ci0KLSAgb3V0IDw8ICJpbXBsIGJpbmRlcjo6cGFyY2VsOjpTZXJpYWxpemVBcnJheSBmb3IgIiA8PCBwYXJjZWwtPkdldE5hbWUoKSA8PCAiIHt9XG4iOwotCi0gIG91dCA8PCAiaW1wbCBiaW5kZXI6OnBhcmNlbDo6U2VyaWFsaXplT3B0aW9uIGZvciAiIDw8IHBhcmNlbC0+R2V0TmFtZSgpIDw8ICIge1xuIjsKKyAgb3V0IDw8ICJpbXBsIGJpbmRlcjo6UGFyY2VsYWJsZSBmb3IgIiA8PCBwYXJjZWwtPkdldE5hbWUoKSA8PCAiIHtcbiI7CiAgIG91dC5JbmRlbnQoKTsKLSAgb3V0IDw8ICJmbiBzZXJpYWxpemVfb3B0aW9uKHRoaXM6IE9wdGlvbjwmU2VsZj4sIHBhcmNlbDogJm11dCBiaW5kZXI6OnBhcmNlbDo6UGFyY2VsKSAtPiAiCi0gICAgICAgICAiYmluZGVyOjpSZXN1bHQ8KCk+IHtcbiI7Ci0gIG91dC5JbmRlbnQoKTsKLSAgb3V0IDw8ICJsZXQgdGhpcyA9IGlmIGxldCBTb21lKHRoaXMpID0gdGhpcyB7XG4iOwotICBvdXQgPDwgIiAgcGFyY2VsLndyaXRlKCYxaTMyKT87XG4iOwotICBvdXQgPDwgIiAgdGhpc1xuIjsKLSAgb3V0IDw8ICJ9IGVsc2Uge1xuIjsKLSAgb3V0IDw8ICIgIHJldHVybiBwYXJjZWwud3JpdGUoJjBpMzIpO1xuIjsKLSAgb3V0IDw8ICJ9O1xuIjsKIAotICBHZW5lcmF0ZVBhcmNlbFNlcmlhbGl6ZUJvZHkob3V0LCBwYXJjZWwsIHR5cGVuYW1lcyk7Ci0KLSAgb3V0LkRlZGVudCgpOwotICBvdXQgPDwgIn1cbiI7Ci0gIG91dC5EZWRlbnQoKTsKLSAgb3V0IDw8ICJ9XG4iOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUGFyY2VsYWJsZVR5cGU+Ci12b2lkIEdlbmVyYXRlUGFyY2VsRGVzZXJpYWxpemUoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBQYXJjZWxhYmxlVHlwZSogcGFyY2VsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcykgewotICBvdXQgPDwgImltcGwgYmluZGVyOjpwYXJjZWw6OkRlc2VyaWFsaXplIGZvciAiIDw8IHBhcmNlbC0+R2V0TmFtZSgpIDw8ICIge1xuIjsKLSAgb3V0IDw8ICIgIGZuIGRlc2VyaWFsaXplKHBhcmNlbDogJmJpbmRlcjo6cGFyY2VsOjpQYXJjZWwpIC0+IGJpbmRlcjo6UmVzdWx0PFNlbGY+IHtcbiI7Ci0gIG91dCA8PCAiICAgIDxTZWxmIGFzIGJpbmRlcjo6cGFyY2VsOjpEZXNlcmlhbGl6ZU9wdGlvbj46OmRlc2VyaWFsaXplX29wdGlvbihwYXJjZWwpXG4iOwotICBvdXQgPDwgIiAgICAgICAudHJhbnNwb3NlKClcbiI7Ci0gIG91dCA8PCAiICAgICAgIC51bndyYXBfb3IoRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5FWFBFQ1RFRF9OVUxMKSlcbiI7Ci0gIG91dCA8PCAiICB9XG4iOwotICBvdXQgPDwgIn1cbiI7Ci0KLSAgb3V0IDw8ICJpbXBsIGJpbmRlcjo6cGFyY2VsOjpEZXNlcmlhbGl6ZUFycmF5IGZvciAiIDw8IHBhcmNlbC0+R2V0TmFtZSgpIDw8ICIge31cbiI7Ci0KLSAgb3V0IDw8ICJpbXBsIGJpbmRlcjo6cGFyY2VsOjpEZXNlcmlhbGl6ZU9wdGlvbiBmb3IgIiA8PCBwYXJjZWwtPkdldE5hbWUoKSA8PCAiIHtcbiI7Ci0gIG91dC5JbmRlbnQoKTsKLSAgb3V0IDw8ICJmbiBkZXNlcmlhbGl6ZV9vcHRpb24ocGFyY2VsOiAmYmluZGVyOjpwYXJjZWw6OlBhcmNlbCkgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFNlbGY+PiAiCisgIG91dCA8PCAiZm4gd3JpdGVfdG9fcGFyY2VsKCZzZWxmLCAiCisgICAgICAgICAicGFyY2VsOiAmbXV0IGJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsKSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCAiCisgICAgICAgICAiYmluZGVyOjpTdGF0dXNDb2RlPiAiCiAgICAgICAgICAie1xuIjsKICAgb3V0LkluZGVudCgpOwotICBvdXQgPDwgImxldCBzdGF0dXM6IGkzMiA9IHBhcmNlbC5yZWFkKCk/O1xuIjsKLSAgb3V0IDw8ICJpZiBzdGF0dXMgPT0gMCB7IHJldHVybiBPayhOb25lKTsgfVxuIjsKKyAgR2VuZXJhdGVQYXJjZWxTZXJpYWxpemVCb2R5KG91dCwgcGFyY2VsLCB0eXBlbmFtZXMpOworICBvdXQuRGVkZW50KCk7CisgIG91dCA8PCAifVxuIjsKIAorICBvdXQgPDwgImZuIHJlYWRfZnJvbV9wYXJjZWwoJm11dCBzZWxmLCAiCisgICAgICAgICAicGFyY2VsOiAmYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWwpIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksICIKKyAgICAgICAgICJiaW5kZXI6OlN0YXR1c0NvZGU+IHtcbiI7CisgIG91dC5JbmRlbnQoKTsKICAgR2VuZXJhdGVQYXJjZWxEZXNlcmlhbGl6ZUJvZHkob3V0LCBwYXJjZWwsIHR5cGVuYW1lcyk7CisgIG91dC5EZWRlbnQoKTsKKyAgb3V0IDw8ICJ9XG4iOwogCiAgIG91dC5EZWRlbnQoKTsKICAgb3V0IDw8ICJ9XG4iOworCisgIC8vIEVtaXQgdGhlIG91dGVyIChkZSlzZXJpYWxpemF0aW9uIHRyYWl0cworICBvdXQgPDwgImJpbmRlcjo6aW1wbF9zZXJpYWxpemVfZm9yX3BhcmNlbGFibGUhKCIgPDwgcGFyY2VsLT5HZXROYW1lKCkgPDwgIik7XG4iOworICBvdXQgPDwgImJpbmRlcjo6aW1wbF9kZXNlcmlhbGl6ZV9mb3JfcGFyY2VsYWJsZSEoIiA8PCBwYXJjZWwtPkdldE5hbWUoKSA8PCAiKTtcbiI7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBQYXJjZWxhYmxlVHlwZT4KK3ZvaWQgR2VuZXJhdGVNZXRhZGF0YVRyYWl0KENvZGVXcml0ZXImIG91dCwgY29uc3QgUGFyY2VsYWJsZVR5cGUqIHBhcmNlbCkgeworICBvdXQgPDwgImltcGwgYmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsYWJsZU1ldGFkYXRhIGZvciAiIDw8IHBhcmNlbC0+R2V0TmFtZSgpIDw8ICIge1xuIjsKKyAgb3V0LkluZGVudCgpOworCisgIG91dCA8PCAiZm4gZ2V0X2Rlc2NyaXB0b3IoKSAtPiAmJ3N0YXRpYyBzdHIgeyBcIiIgPDwgcGFyY2VsLT5HZXRDYW5vbmljYWxOYW1lKCkgPDwgIlwiIH1cbiI7CisKKyAgaWYgKHBhcmNlbC0+SXNWaW50ZlN0YWJpbGl0eSgpKSB7CisgICAgb3V0IDw8ICJmbiBnZXRfc3RhYmlsaXR5KCZzZWxmKSAtPiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpTdGFiaWxpdHkgeyAiCisgICAgICAgICAgICJiaW5kZXI6OmJpbmRlcl9pbXBsOjpTdGFiaWxpdHk6OlZpbnRmIH1cbiI7CisgIH0KKwogICBvdXQuRGVkZW50KCk7CiAgIG91dCA8PCAifVxuIjsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFBhcmNlbGFibGVUeXBlPgotYm9vbCBHZW5lcmF0ZVJ1c3RQYXJjZWwoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwgY29uc3QgUGFyY2VsYWJsZVR5cGUqIHBhcmNlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywgY29uc3QgSW9EZWxlZ2F0ZSYgaW9fZGVsZWdhdGUpIHsKLSAgQ29kZVdyaXRlclB0ciBjb2RlX3dyaXRlciA9IGlvX2RlbGVnYXRlLkdldENvZGVXcml0ZXIoZmlsZW5hbWUpOwotCit2b2lkIEdlbmVyYXRlUnVzdFBhcmNlbChDb2RlV3JpdGVyKiBjb2RlX3dyaXRlciwgY29uc3QgUGFyY2VsYWJsZVR5cGUqIHBhcmNlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcykgewogICAvLyBEZWJ1ZyBpcyBhbHdheXMgZGVyaXZlZCBiZWNhdXNlIGFsbCBSdXN0IEFJREwgdHlwZXMgaW1wbGVtZW50IGl0CiAgIC8vIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGRvZXNuJ3Qgc3VwcG9ydCBhbnkgb2YgdGhlIG90aGVycyBiZWNhdXNlCiAgIC8vIGl0J3MgYSBuZXd0eXBlIG92ZXIgc3RkOjpmczo6RmlsZSB3aGljaCBvbmx5IGltcGxlbWVudHMgRGVidWcKQEAgLTc2MCw2MSArMTA4Nyw3NiBAQAogICAqY29kZV93cml0ZXIgPDwgIiNbZGVyaXZlKCIgPDwgSm9pbihkZXJpdmVzLCAiLCAiKSA8PCAiKV1cbiI7CiAgIEdlbmVyYXRlUGFyY2VsQm9keSgqY29kZV93cml0ZXIsIHBhcmNlbCwgdHlwZW5hbWVzKTsKICAgR2VuZXJhdGVDb25zdGFudERlY2xhcmF0aW9ucygqY29kZV93cml0ZXIsICpwYXJjZWwsIHR5cGVuYW1lcyk7Ci0gIEdlbmVyYXRlTWFuZ2xlZEFsaWFzKCpjb2RlX3dyaXRlciwgcGFyY2VsKTsKICAgR2VuZXJhdGVQYXJjZWxEZWZhdWx0KCpjb2RlX3dyaXRlciwgcGFyY2VsKTsKLSAgR2VuZXJhdGVQYXJjZWxTZXJpYWxpemUoKmNvZGVfd3JpdGVyLCBwYXJjZWwsIHR5cGVuYW1lcyk7Ci0gIEdlbmVyYXRlUGFyY2VsRGVzZXJpYWxpemUoKmNvZGVfd3JpdGVyLCBwYXJjZWwsIHR5cGVuYW1lcyk7Ci0gIHJldHVybiB0cnVlOworICBHZW5lcmF0ZVBhcmNlbGFibGVUcmFpdCgqY29kZV93cml0ZXIsIHBhcmNlbCwgdHlwZW5hbWVzKTsKKyAgR2VuZXJhdGVNZXRhZGF0YVRyYWl0KCpjb2RlX3dyaXRlciwgcGFyY2VsKTsKIH0KIAotYm9vbCBHZW5lcmF0ZVJ1c3RFbnVtRGVjbGFyYXRpb24oY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwgY29uc3QgQWlkbEVudW1EZWNsYXJhdGlvbiogZW51bV9kZWNsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLCBjb25zdCBJb0RlbGVnYXRlJiBpb19kZWxlZ2F0ZSkgewotICBDb2RlV3JpdGVyUHRyIGNvZGVfd3JpdGVyID0gaW9fZGVsZWdhdGUuR2V0Q29kZVdyaXRlcihmaWxlbmFtZSk7Ci0KK3ZvaWQgR2VuZXJhdGVSdXN0RW51bURlY2xhcmF0aW9uKENvZGVXcml0ZXIqIGNvZGVfd3JpdGVyLCBjb25zdCBBaWRsRW51bURlY2xhcmF0aW9uKiBlbnVtX2RlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMpIHsKICAgY29uc3QgYXV0byYgYWlkbF9iYWNraW5nX3R5cGUgPSBlbnVtX2RlY2wtPkdldEJhY2tpbmdUeXBlKCk7Ci0gIGF1dG8gYmFja2luZ190eXBlID0gUnVzdE5hbWVPZihhaWRsX2JhY2tpbmdfdHlwZSwgdHlwZW5hbWVzLCBTdG9yYWdlTW9kZTo6VkFMVUUpOworICBhdXRvIGJhY2tpbmdfdHlwZSA9IFJ1c3ROYW1lT2YoYWlkbF9iYWNraW5nX3R5cGUsIHR5cGVuYW1lcywgU3RvcmFnZU1vZGU6OlZBTFVFLCBMaWZldGltZTo6Tk9ORSk7CiAKLSAgLy8gVE9ETyhiLzE3Nzg2MDQyMykgc3VwcG9ydCAiZGVwcmVjYXRlZCIgZm9yIGVudW0gdHlwZXMKICAgKmNvZGVfd3JpdGVyIDw8ICIjIVthbGxvdyhub25fdXBwZXJfY2FzZV9nbG9iYWxzKV1cbiI7CiAgICpjb2RlX3dyaXRlciA8PCAidXNlIGJpbmRlcjo6ZGVjbGFyZV9iaW5kZXJfZW51bTtcbiI7Ci0gICpjb2RlX3dyaXRlciA8PCAiZGVjbGFyZV9iaW5kZXJfZW51bSEgeyAiIDw8IGVudW1fZGVjbC0+R2V0TmFtZSgpIDw8ICIgOiAiIDw8IGJhY2tpbmdfdHlwZQotICAgICAgICAgICAgICAgPDwgIiB7XG4iOworICAqY29kZV93cml0ZXIgPDwgImRlY2xhcmVfYmluZGVyX2VudW0hIHtcbiI7CisgIGNvZGVfd3JpdGVyLT5JbmRlbnQoKTsKKworICBHZW5lcmF0ZURlcHJlY2F0ZWQoKmNvZGVfd3JpdGVyLCAqZW51bV9kZWNsKTsKKyAgKmNvZGVfd3JpdGVyIDw8IGVudW1fZGVjbC0+R2V0TmFtZSgpIDw8ICIgOiBbIiA8PCBiYWNraW5nX3R5cGUgPDwgIjsgIgorICAgICAgICAgICAgICAgPDwgc3RkOjp0b19zdHJpbmcoZW51bV9kZWNsLT5HZXRFbnVtZXJhdG9ycygpLnNpemUoKSkgPDwgIl0ge1xuIjsKICAgY29kZV93cml0ZXItPkluZGVudCgpOwogICBmb3IgKGNvbnN0IGF1dG8mIGVudW1lcmF0b3IgOiBlbnVtX2RlY2wtPkdldEVudW1lcmF0b3JzKCkpIHsKICAgICBhdXRvIHZhbHVlID0gZW51bWVyYXRvci0+R2V0VmFsdWUoKS0+VmFsdWVTdHJpbmcoYWlkbF9iYWNraW5nX3R5cGUsIENvbnN0YW50VmFsdWVEZWNvcmF0b3IpOworICAgIEdlbmVyYXRlRGVwcmVjYXRlZCgqY29kZV93cml0ZXIsICplbnVtZXJhdG9yKTsKICAgICAqY29kZV93cml0ZXIgPDwgZW51bWVyYXRvci0+R2V0TmFtZSgpIDw8ICIgPSAiIDw8IHZhbHVlIDw8ICIsXG4iOwogICB9CiAgIGNvZGVfd3JpdGVyLT5EZWRlbnQoKTsKLSAgKmNvZGVfd3JpdGVyIDw8ICJ9IH1cbiI7CisgICpjb2RlX3dyaXRlciA8PCAifVxuIjsKIAotICBHZW5lcmF0ZU1hbmdsZWRBbGlhcygqY29kZV93cml0ZXIsIGVudW1fZGVjbCk7Ci0KLSAgcmV0dXJuIHRydWU7CisgIGNvZGVfd3JpdGVyLT5EZWRlbnQoKTsKKyAgKmNvZGVfd3JpdGVyIDw8ICJ9XG4iOwogfQogCi1ib29sIEdlbmVyYXRlUnVzdChjb25zdCBzdHJpbmcmIGZpbGVuYW1lLCBjb25zdCBBaWRsRGVmaW5lZFR5cGUqIGRlZmluZWRfdHlwZSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywgY29uc3QgSW9EZWxlZ2F0ZSYgaW9fZGVsZWdhdGUsCi0gICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7Ci0gIGlmIChjb25zdCBBaWRsU3RydWN0dXJlZFBhcmNlbGFibGUqIHBhcmNlbGFibGUgPSBkZWZpbmVkX3R5cGUtPkFzU3RydWN0dXJlZFBhcmNlbGFibGUoKTsKK3ZvaWQgR2VuZXJhdGVDbGFzcyhDb2RlV3JpdGVyKiBjb2RlX3dyaXRlciwgY29uc3QgQWlkbERlZmluZWRUeXBlJiBkZWZpbmVkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZXMsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgaWYgKGNvbnN0IEFpZGxTdHJ1Y3R1cmVkUGFyY2VsYWJsZSogcGFyY2VsYWJsZSA9IGRlZmluZWRfdHlwZS5Bc1N0cnVjdHVyZWRQYXJjZWxhYmxlKCk7CiAgICAgICBwYXJjZWxhYmxlICE9IG51bGxwdHIpIHsKLSAgICByZXR1cm4gR2VuZXJhdGVSdXN0UGFyY2VsKGZpbGVuYW1lLCBwYXJjZWxhYmxlLCB0eXBlbmFtZXMsIGlvX2RlbGVnYXRlKTsKKyAgICBHZW5lcmF0ZVJ1c3RQYXJjZWwoY29kZV93cml0ZXIsIHBhcmNlbGFibGUsIHR5cGVzKTsKKyAgfSBlbHNlIGlmIChjb25zdCBBaWRsRW51bURlY2xhcmF0aW9uKiBlbnVtX2RlY2wgPSBkZWZpbmVkX3R5cGUuQXNFbnVtRGVjbGFyYXRpb24oKTsKKyAgICAgICAgICAgICBlbnVtX2RlY2wgIT0gbnVsbHB0cikgeworICAgIEdlbmVyYXRlUnVzdEVudW1EZWNsYXJhdGlvbihjb2RlX3dyaXRlciwgZW51bV9kZWNsLCB0eXBlcyk7CisgIH0gZWxzZSBpZiAoY29uc3QgQWlkbEludGVyZmFjZSogaW50ZXJmYWNlID0gZGVmaW5lZF90eXBlLkFzSW50ZXJmYWNlKCk7IGludGVyZmFjZSAhPSBudWxscHRyKSB7CisgICAgR2VuZXJhdGVSdXN0SW50ZXJmYWNlKGNvZGVfd3JpdGVyLCBpbnRlcmZhY2UsIHR5cGVzLCBvcHRpb25zKTsKKyAgfSBlbHNlIGlmIChjb25zdCBBaWRsVW5pb25EZWNsKiB1bmlvbl9kZWNsID0gZGVmaW5lZF90eXBlLkFzVW5pb25EZWNsYXJhdGlvbigpOworICAgICAgICAgICAgIHVuaW9uX2RlY2wgIT0gbnVsbHB0cikgeworICAgIEdlbmVyYXRlUnVzdFBhcmNlbChjb2RlX3dyaXRlciwgdW5pb25fZGVjbCwgdHlwZXMpOworICB9IGVsc2UgeworICAgIEFJRExfRkFUQUwoZGVmaW5lZF90eXBlKSA8PCAiVW5yZWNvZ25pemVkIHR5cGUgc2VudCBmb3IgUnVzdCBnZW5lcmF0aW9uLiI7CiAgIH0KIAotICBpZiAoY29uc3QgQWlkbFVuaW9uRGVjbCogcGFyY2VsYWJsZSA9IGRlZmluZWRfdHlwZS0+QXNVbmlvbkRlY2xhcmF0aW9uKCk7IHBhcmNlbGFibGUgIT0gbnVsbHB0cikgewotICAgIHJldHVybiBHZW5lcmF0ZVJ1c3RQYXJjZWwoZmlsZW5hbWUsIHBhcmNlbGFibGUsIHR5cGVuYW1lcywgaW9fZGVsZWdhdGUpOworICBmb3IgKGNvbnN0IGF1dG8mIG5lc3RlZCA6IGRlZmluZWRfdHlwZS5HZXROZXN0ZWRUeXBlcygpKSB7CisgICAgKCpjb2RlX3dyaXRlcikgPDwgInB1YiBtb2QgIiA8PCBuZXN0ZWQtPkdldE5hbWUoKSA8PCAiIHtcbiI7CisgICAgY29kZV93cml0ZXItPkluZGVudCgpOworICAgIEdlbmVyYXRlQ2xhc3MoY29kZV93cml0ZXIsICpuZXN0ZWQsIHR5cGVzLCBvcHRpb25zKTsKKyAgICBjb2RlX3dyaXRlci0+RGVkZW50KCk7CisgICAgKCpjb2RlX3dyaXRlcikgPDwgIn1cbiI7CiAgIH0KK30KIAotICBpZiAoY29uc3QgQWlkbEVudW1EZWNsYXJhdGlvbiogZW51bV9kZWNsID0gZGVmaW5lZF90eXBlLT5Bc0VudW1EZWNsYXJhdGlvbigpOwotICAgICAgZW51bV9kZWNsICE9IG51bGxwdHIpIHsKLSAgICByZXR1cm4gR2VuZXJhdGVSdXN0RW51bURlY2xhcmF0aW9uKGZpbGVuYW1lLCBlbnVtX2RlY2wsIHR5cGVuYW1lcywgaW9fZGVsZWdhdGUpOwotICB9Cit2b2lkIEdlbmVyYXRlUnVzdChjb25zdCBzdHJpbmcmIGZpbGVuYW1lLCBjb25zdCBPcHRpb25zJiBvcHRpb25zLCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxEZWZpbmVkVHlwZSYgZGVmaW5lZF90eXBlLCBjb25zdCBJb0RlbGVnYXRlJiBpb19kZWxlZ2F0ZSkgeworICBDb2RlV3JpdGVyUHRyIGNvZGVfd3JpdGVyID0gaW9fZGVsZWdhdGUuR2V0Q29kZVdyaXRlcihmaWxlbmFtZSk7CiAKLSAgaWYgKGNvbnN0IEFpZGxJbnRlcmZhY2UqIGludGVyZmFjZSA9IGRlZmluZWRfdHlwZS0+QXNJbnRlcmZhY2UoKTsgaW50ZXJmYWNlICE9IG51bGxwdHIpIHsKLSAgICByZXR1cm4gR2VuZXJhdGVSdXN0SW50ZXJmYWNlKGZpbGVuYW1lLCBpbnRlcmZhY2UsIHR5cGVuYW1lcywgaW9fZGVsZWdhdGUsIG9wdGlvbnMpOwotICB9CisgIC8vIEZvcmJpZCB0aGUgdXNlIG9mIHVuc2FmZSBpbiBhdXRvLWdlbmVyYXRlZCBjb2RlLgorICAvLyBVbnNhZmUgY29kZSBzaG91bGQgb25seSBiZSBhbGxvd2VkIGluIGxpYmJpbmRlcl9ycy4KKyAgKmNvZGVfd3JpdGVyIDw8ICIjIVtmb3JiaWQodW5zYWZlX2NvZGUpXVxuIjsKKyAgLy8gRGlzYWJsZSBydXN0Zm10IG9uIGF1dG8tZ2VuZXJhdGVkIGZpbGVzLCBpbmNsdWRpbmcgdGhlIGdvbGRlbiBvdXRwdXRzCisgICpjb2RlX3dyaXRlciA8PCAiIyFbcnVzdGZtdDo6c2tpcF1cbiI7CisgIEdlbmVyYXRlQ2xhc3MoY29kZV93cml0ZXIuZ2V0KCksIGRlZmluZWRfdHlwZSwgdHlwZXMsIG9wdGlvbnMpOworICBHZW5lcmF0ZU1hbmdsZWRBbGlhc2VzKCpjb2RlX3dyaXRlciwgZGVmaW5lZF90eXBlKTsKIAotICBBSURMX0ZBVEFMKGZpbGVuYW1lKSA8PCAiVW5yZWNvZ25pemVkIHR5cGUgc2VudCBmb3IgUnVzdCBnZW5lcmF0aW9uLiI7Ci0gIHJldHVybiBmYWxzZTsKKyAgQUlETF9GQVRBTF9JRighY29kZV93cml0ZXItPkNsb3NlKCksIGRlZmluZWRfdHlwZSkgPDwgIkkvTyBFcnJvciEiOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgcnVzdApkaWZmIC0tZ2l0IGEvZ2VuZXJhdGVfcnVzdC5oIGIvZ2VuZXJhdGVfcnVzdC5oCmluZGV4IDM1ZGFmOWIuLjlkZThlNTYgMTAwNjQ0Ci0tLSBhL2dlbmVyYXRlX3J1c3QuaAorKysgYi9nZW5lcmF0ZV9ydXN0LmgKQEAgLTI2LDkgKzI2LDggQEAKIG5hbWVzcGFjZSBhaWRsIHsKIG5hbWVzcGFjZSBydXN0IHsKIAotYm9vbCBHZW5lcmF0ZVJ1c3QoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLCBjb25zdCBBaWRsRGVmaW5lZFR5cGUqIGlmYWNlLAotICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLCBjb25zdCBJb0RlbGVnYXRlJiBpb19kZWxlZ2F0ZSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOwordm9pZCBHZW5lcmF0ZVJ1c3QoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucywgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZXMsCisgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsRGVmaW5lZFR5cGUmIGRlZmluZWRfdHlwZSwgY29uc3QgSW9EZWxlZ2F0ZSYgaW9fZGVsZWdhdGUpOwogCiB9ICAvLyBuYW1lc3BhY2UgcnVzdAogfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL2ltcG9ydF9yZXNvbHZlci5jcHAgYi9pbXBvcnRfcmVzb2x2ZXIuY3BwCmluZGV4IDFiZjI3OTQuLjQ4ZmJhM2MgMTAwNjQ0Ci0tLSBhL2ltcG9ydF9yZXNvbHZlci5jcHAKKysrIGIvaW1wb3J0X3Jlc29sdmVyLmNwcApAQCAtMzAsNiArMzAsNyBAQAogCiAjaW5jbHVkZSAib3MuaCIKIAordXNpbmcgc3RkOjpzZXQ7CiB1c2luZyBzdGQ6OnN0cmluZzsKIHVzaW5nIHN0ZDo6dmVjdG9yOwogCkBAIC0zNyw4ICszOCw4IEBACiBuYW1lc3BhY2UgYWlkbCB7CiAKIEltcG9ydFJlc29sdmVyOjpJbXBvcnRSZXNvbHZlcihjb25zdCBJb0RlbGVnYXRlJiBpb19kZWxlZ2F0ZSwgY29uc3Qgc3RyaW5nJiBpbnB1dF9maWxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2V0PHN0cmluZz4mIGltcG9ydF9wYXRocywgY29uc3QgdmVjdG9yPHN0cmluZz4mIGlucHV0X2ZpbGVzKQotICAgIDogaW9fZGVsZWdhdGVfKGlvX2RlbGVnYXRlKSwgaW5wdXRfZmlsZV9uYW1lXyhpbnB1dF9maWxlX25hbWUpLCBpbnB1dF9maWxlc18oaW5wdXRfZmlsZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXQ8c3RyaW5nPiYgaW1wb3J0X3BhdGhzKQorICAgIDogaW9fZGVsZWdhdGVfKGlvX2RlbGVnYXRlKSwgaW5wdXRfZmlsZV9uYW1lXyhpbnB1dF9maWxlX25hbWUpIHsKICAgZm9yIChzdHJpbmcgcGF0aCA6IGltcG9ydF9wYXRocykgewogICAgIGlmIChwYXRoLmVtcHR5KCkpIHsKICAgICAgIHBhdGggPSAiLiI7CkBAIC00Niw0MyArNDcsNDIgQEAKICAgICBpZiAocGF0aFtwYXRoLnNpemUoKSAtIDFdICE9IE9TX1BBVEhfU0VQQVJBVE9SKSB7CiAgICAgICBwYXRoICs9IE9TX1BBVEhfU0VQQVJBVE9SOwogICAgIH0KLSAgICBpbXBvcnRfcGF0aHNfLnB1c2hfYmFjayhzdGQ6Om1vdmUocGF0aCkpOworICAgIGltcG9ydF9wYXRoc18uZW1wbGFjZShzdGQ6Om1vdmUocGF0aCkpOwogICB9CiB9CiAKIHN0cmluZyBJbXBvcnRSZXNvbHZlcjo6RmluZEltcG9ydEZpbGUoY29uc3Qgc3RyaW5nJiBjYW5vbmljYWxfbmFtZSkgY29uc3QgewotICAvLyBDb252ZXJ0IHRoZSBjYW5vbmljYWwgbmFtZSB0byBhIHJlbGF0aXZlIGZpbGUgcGF0aC4KLSAgc3RyaW5nIHJlbGF0aXZlX3BhdGggPSBjYW5vbmljYWxfbmFtZTsKLSAgZm9yIChjaGFyJiBjIDogcmVsYXRpdmVfcGF0aCkgewotICAgIGlmIChjID09ICcuJykgewotICAgICAgYyA9IE9TX1BBVEhfU0VQQVJBVE9SOworICBhdXRvIHBhcnRzID0gYmFzZTo6U3BsaXQoY2Fub25pY2FsX25hbWUsICIuIik7CisgIHdoaWxlICghcGFydHMuZW1wdHkoKSkgeworICAgIHN0cmluZyByZWxhdGl2ZV9wYXRoID0gYmFzZTo6Sm9pbihwYXJ0cywgT1NfUEFUSF9TRVBBUkFUT1IpICsgIi5haWRsIjsKKyAgICBhdXRvIGNhbmRpZGF0ZXMgPSBTY2FuSW1wb3J0UGF0aHMocmVsYXRpdmVfcGF0aCk7CisgICAgaWYgKGNhbmRpZGF0ZXMuc2l6ZSgpID09IDApIHsKKyAgICAgIC8vIHJlbW92ZSB0aGUgbGFzdCBwYXJ0ICYga2VlcCBzZWFyY2hpbmcKKyAgICAgIHBhcnRzLnBvcF9iYWNrKCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKGNhbmRpZGF0ZXMuc2l6ZSgpID09IDEpIHsKKyAgICAgIC8vIGZvdW5kIQorICAgICAgcmV0dXJuICpjYW5kaWRhdGVzLmJlZ2luKCk7CisgICAgfQorICAgIGlmIChjYW5kaWRhdGVzLnNpemUoKSA+IDEpIHsKKyAgICAgIEFJRExfRVJST1IoaW5wdXRfZmlsZV9uYW1lXykgPDwgIkR1cGxpY2F0ZSBmaWxlcyBmb3VuZCBmb3IgIiA8PCBjYW5vbmljYWxfbmFtZSA8PCAiIGZyb206XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGJhc2U6OkpvaW4oY2FuZGlkYXRlcywgIlxuIik7CisgICAgICBicmVhazsKICAgICB9CiAgIH0KLSAgcmVsYXRpdmVfcGF0aCArPSAiLmFpZGwiOworICByZXR1cm4gIiI7Cit9CiAKK3NldDxzdHJpbmc+IEltcG9ydFJlc29sdmVyOjpTY2FuSW1wb3J0UGF0aHMoY29uc3Qgc3RyaW5nJiByZWxhdGl2ZV9wYXRoKSBjb25zdCB7CiAgIC8vIExvb2sgZm9yIHRoYXQgcmVsYXRpdmUgcGF0aCBhdCBlYWNoIG9mIG91ciBpbXBvcnQgcm9vdHMuCi0gIHZlY3RvcjxzdHJpbmc+IGZvdW5kX3BhdGhzOwotICBmb3IgKHN0cmluZyBwYXRoIDogaW1wb3J0X3BhdGhzXykgewotICAgIHBhdGggPSBwYXRoICsgcmVsYXRpdmVfcGF0aDsKLSAgICBpZiAoaW9fZGVsZWdhdGVfLkZpbGVJc1JlYWRhYmxlKHBhdGgpKSB7Ci0gICAgICBmb3VuZF9wYXRocy5lbXBsYWNlX2JhY2socGF0aCk7CisgIHNldDxzdHJpbmc+IGZvdW5kOworICBmb3IgKGNvbnN0IGF1dG8mIHBhdGggOiBpbXBvcnRfcGF0aHNfKSB7CisgICAgaWYgKGlvX2RlbGVnYXRlXy5GaWxlSXNSZWFkYWJsZShwYXRoICsgcmVsYXRpdmVfcGF0aCkpIHsKKyAgICAgIGZvdW5kLmVtcGxhY2UocGF0aCArIHJlbGF0aXZlX3BhdGgpOwogICAgIH0KICAgfQotICAvLyByZW1vdmUgZHVwbGljYXRlcwotICBzdGQ6OnNvcnQoZm91bmRfcGF0aHMuYmVnaW4oKSwgZm91bmRfcGF0aHMuZW5kKCkpOwotICBhdXRvIGxhc3QgPSBzdGQ6OnVuaXF1ZShmb3VuZF9wYXRocy5iZWdpbigpLCBmb3VuZF9wYXRocy5lbmQoKSk7Ci0gIGZvdW5kX3BhdGhzLmVyYXNlKGxhc3QsIGZvdW5kX3BhdGhzLmVuZCgpKTsKLQotICBpbnQgbnVtX2ZvdW5kID0gZm91bmRfcGF0aHMuc2l6ZSgpOwotICBpZiAobnVtX2ZvdW5kID09IDApIHsKLSAgICByZXR1cm4gIiI7Ci0gIH0gZWxzZSBpZiAobnVtX2ZvdW5kID09IDEpIHsKLSAgICByZXR1cm4gZm91bmRfcGF0aHMuZnJvbnQoKTsKLSAgfSBlbHNlIHsKLSAgICBBSURMX0VSUk9SKGlucHV0X2ZpbGVfbmFtZV8pIDw8ICJEdXBsaWNhdGUgZmlsZXMgZm91bmQgZm9yICIgPDwgY2Fub25pY2FsX25hbWUgPDwgIiBmcm9tOlxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgYW5kcm9pZDo6YmFzZTo6Sm9pbihmb3VuZF9wYXRocywgIlxuIik7Ci0gICAgcmV0dXJuICIiOwotICB9CisgIHJldHVybiBmb3VuZDsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL2ltcG9ydF9yZXNvbHZlci5oIGIvaW1wb3J0X3Jlc29sdmVyLmgKaW5kZXggZTUyODQzZS4uYTlmMzhmZCAxMDA2NDQKLS0tIGEvaW1wb3J0X3Jlc29sdmVyLmgKKysrIGIvaW1wb3J0X3Jlc29sdmVyLmgKQEAgLTE4LDcgKzE4LDYgQEAKIAogI2luY2x1ZGUgPHNldD4KICNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgogCiAjaW5jbHVkZSAiaW9fZGVsZWdhdGUuaCIKIApAQCAtMjgsOCArMjcsNyBAQAogY2xhc3MgSW1wb3J0UmVzb2x2ZXIgewogIHB1YmxpYzoKICAgSW1wb3J0UmVzb2x2ZXIoY29uc3QgSW9EZWxlZ2F0ZSYgaW9fZGVsZWdhdGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbnB1dF9maWxlX25hbWUsCi0gICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiYgaW1wb3J0X3BhdGhzLAotICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGlucHV0X2ZpbGVzKTsKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+JiBpbXBvcnRfcGF0aHMpOwogICB2aXJ0dWFsIH5JbXBvcnRSZXNvbHZlcigpID0gZGVmYXVsdDsKIAogICAvLyBub24tY29weWFibGUsIG5vbi1tb3ZhYmxlCkBAIC00MywxMCArNDEsMTEgQEAKICAgc3RkOjpzdHJpbmcgRmluZEltcG9ydEZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIGNhbm9uaWNhbF9uYW1lKSBjb25zdDsKIAogIHByaXZhdGU6CisgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBTY2FuSW1wb3J0UGF0aHMoY29uc3Qgc3RkOjpzdHJpbmcmIHJlbGF0aXZlX3BhdGgpIGNvbnN0OworCiAgIGNvbnN0IElvRGVsZWdhdGUmIGlvX2RlbGVnYXRlXzsKICAgY29uc3Qgc3RkOjpzdHJpbmcmIGlucHV0X2ZpbGVfbmFtZV87Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBpbXBvcnRfcGF0aHNfOwotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gaW5wdXRfZmlsZXNfOworICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gaW1wb3J0X3BhdGhzXzsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS9pb19kZWxlZ2F0ZS5jcHAgYi9pb19kZWxlZ2F0ZS5jcHAKaW5kZXggNDVlZjY1YS4uZDQwYmYxZCAxMDA2NDQKLS0tIGEvaW9fZGVsZWdhdGUuY3BwCisrKyBiL2lvX2RlbGVnYXRlLmNwcApAQCAtNDMsNiArNDMsNyBAQAogdXNpbmcgYW5kcm9pZDo6YmFzZTo6RXJyb3I7CiB1c2luZyBhbmRyb2lkOjpiYXNlOjpSZXN1bHQ7CiB1c2luZyBhbmRyb2lkOjpiYXNlOjpTcGxpdDsKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlN0YXJ0c1dpdGg7CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBhaWRsIHsKQEAgLTEwNywxMSArMTA4LDYgQEAKICAgcmV0dXJuIGNvbnRlbnRzOwogfQogCi11bmlxdWVfcHRyPExpbmVSZWFkZXI+IElvRGVsZWdhdGU6OkdldExpbmVSZWFkZXIoCi0gICAgY29uc3Qgc3RyaW5nJiBmaWxlX3BhdGgpIGNvbnN0IHsKLSAgcmV0dXJuIExpbmVSZWFkZXI6OlJlYWRGcm9tRmlsZShmaWxlX3BhdGgpOwotfQotCiBib29sIElvRGVsZWdhdGU6OkZpbGVJc1JlYWRhYmxlKGNvbnN0IHN0cmluZyYgcGF0aCkgY29uc3QgewogI2lmZGVmIF9XSU4zMgogICAvLyBjaGVjayB0aGF0IHRoZSBmaWxlIGV4aXN0cyBhbmQgaXMgbm90IHdyaXRlLW9ubHkKQEAgLTE4NywxNCArMTgzLDYgQEAKICAgfQogfQogCi12b2lkIElvRGVsZWdhdGU6OlJlbW92ZVBhdGgoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVfcGF0aCkgY29uc3QgewotI2lmZGVmIF9XSU4zMgotICBfdW5saW5rKGZpbGVfcGF0aC5jX3N0cigpKTsKLSNlbHNlCi0gIHVubGluayhmaWxlX3BhdGguY19zdHIoKSk7Ci0jZW5kaWYKLX0KLQogI2lmZGVmIF9XSU4zMgogUmVzdWx0PHZlY3RvcjxzdHJpbmc+PiBJb0RlbGVnYXRlOjpMaXN0RmlsZXMoY29uc3Qgc3RyaW5nJikgY29uc3QgewogICByZXR1cm4gRXJyb3IoKSA8PCAiRmlsZSBsaXN0aW5nIG5vdCBpbXBsZW1lbnRlZCBvbiBXaW5kb3dzIjsKQEAgLTI0NCw1ICsyMzIsMTIgQEAKIH0KICNlbmRpZgogCitzdHJpbmcgSW9EZWxlZ2F0ZTo6Q2xlYW5QYXRoKGNvbnN0IHN0cmluZyYgcGF0aCkgeworICBpZiAoYmFzZTo6U3RhcnRzV2l0aChwYXRoLCBzdHJpbmd7Jy4nLCBPU19QQVRIX1NFUEFSQVRPUn0pKSB7CisgICAgcmV0dXJuIHBhdGguc3Vic3RyKDIpOworICB9CisgIHJldHVybiBwYXRoOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL2lvX2RlbGVnYXRlLmggYi9pb19kZWxlZ2F0ZS5oCmluZGV4IDZjMWVmOTYuLmE5MmE5YjkgMTAwNjQ0Ci0tLSBhL2lvX2RlbGVnYXRlLmgKKysrIGIvaW9fZGVsZWdhdGUuaApAQCAtMjMsNyArMjMsNiBAQAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9yZXN1bHQuaD4KIAogI2luY2x1ZGUgImNvZGVfd3JpdGVyLmgiCi0jaW5jbHVkZSAibGluZV9yZWFkZXIuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGFpZGwgewpAQCAtNDQsMjIgKzQzLDIwIEBACiAgIHN0YXRpYyBib29sIEdldEFic29sdXRlUGF0aChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBhYnNvbHV0ZV9wYXRoKTsKIAorICAvLyBSZW1vdmUgbGVhZGluZyAiLi8iIGZyb20gfHBhdGh8LgorICBzdGF0aWMgc3RkOjpzdHJpbmcgQ2xlYW5QYXRoKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKTsKKwogICAvLyBSZXR1cm5zIGEgdW5pcXVlX3B0ciB0byB0aGUgY29udGVudHMgb2YgfGZpbGVuYW1lfC4KICAgLy8gV2lsbCBhcHBlbmQgdGhlIG9wdGlvbmFsIHxjb250ZW50X3N1ZmZpeHwgdG8gdGhlIHJldHVybmVkIGNvbnRlbnRzLgogICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnN0cmluZz4gR2V0RmlsZUNvbnRlbnRzKAogICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLAogICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNvbnRlbnRfc3VmZml4ID0gIiIpIGNvbnN0OwogCi0gIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPExpbmVSZWFkZXI+IEdldExpbmVSZWFkZXIoCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZV9wYXRoKSBjb25zdDsKLQogICB2aXJ0dWFsIGJvb2wgRmlsZUlzUmVhZGFibGUoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpIGNvbnN0OwogCiAgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPENvZGVXcml0ZXI+IEdldENvZGVXcml0ZXIoCiAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZV9wYXRoKSBjb25zdDsKIAotICB2aXJ0dWFsIHZvaWQgUmVtb3ZlUGF0aChjb25zdCBzdGQ6OnN0cmluZyYgZmlsZV9wYXRoKSBjb25zdDsKLQogICB2aXJ0dWFsIGFuZHJvaWQ6OmJhc2U6OlJlc3VsdDxzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4+IExpc3RGaWxlcyhjb25zdCBzdGQ6OnN0cmluZyYgZGlyKSBjb25zdDsKIAogIHByaXZhdGU6CmRpZmYgLS1naXQgYS9saW5lX3JlYWRlci5jcHAgYi9saW5lX3JlYWRlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlZGNhMjAuLjAwMDAwMDAKLS0tIGEvbGluZV9yZWFkZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJsaW5lX3JlYWRlci5oIgotCi0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxzc3RyZWFtPgotCi11c2luZyBzdGQ6OmlzdHJpbmdzdHJlYW07Ci11c2luZyBzdGQ6Omlmc3RyZWFtOwotdXNpbmcgc3RkOjpzdHJpbmc7Ci11c2luZyBzdGQ6OnVuaXF1ZV9wdHI7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBhaWRsIHsKLQotY2xhc3MgRmlsZUxpbmVSZWFkZXIgOiBwdWJsaWMgTGluZVJlYWRlciB7Ci0gcHVibGljOgotICBGaWxlTGluZVJlYWRlcigpID0gZGVmYXVsdDsKLSAgfkZpbGVMaW5lUmVhZGVyKCkgb3ZlcnJpZGUgewotICAgIGlucHV0X3N0cmVhbV8uY2xvc2UoKTsKLSAgfQotCi0gIC8vIG5vbi1jb3B5YWJsZSwgbm9uLW1vdmFibGUKLSAgRmlsZUxpbmVSZWFkZXIoY29uc3QgRmlsZUxpbmVSZWFkZXImKSA9IGRlbGV0ZTsKLSAgRmlsZUxpbmVSZWFkZXIoRmlsZUxpbmVSZWFkZXImJikgPSBkZWxldGU7Ci0gIEZpbGVMaW5lUmVhZGVyJiBvcGVyYXRvcj0oY29uc3QgRmlsZUxpbmVSZWFkZXImKSA9IGRlbGV0ZTsKLSAgRmlsZUxpbmVSZWFkZXImIG9wZXJhdG9yPShGaWxlTGluZVJlYWRlciYmKSA9IGRlbGV0ZTsKLQotICBib29sIEluaXQoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVfcGF0aCkgewotICAgIGlucHV0X3N0cmVhbV8ub3BlbihmaWxlX3BhdGgsIGlmc3RyZWFtOjppbiB8IGlmc3RyZWFtOjpiaW5hcnkpOwotICAgIHJldHVybiBpbnB1dF9zdHJlYW1fLmlzX29wZW4oKSAmJiBpbnB1dF9zdHJlYW1fLmdvb2QoKTsKLSAgfQotCi0gIGJvb2wgUmVhZExpbmUoc3RyaW5nKiBsaW5lKSBvdmVycmlkZSB7Ci0gICAgaWYgKCFpbnB1dF9zdHJlYW1fLmdvb2QoKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBsaW5lLT5jbGVhcigpOwotICAgIHN0ZDo6Z2V0bGluZShpbnB1dF9zdHJlYW1fLCAqbGluZSk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGlmc3RyZWFtIGlucHV0X3N0cmVhbV87Ci19OyAgLy8gY2xhc3MgRmlsZUxpbmVSZWFkZXIKLQotY2xhc3MgTWVtb3J5TGluZVJlYWRlciA6IHB1YmxpYyBMaW5lUmVhZGVyIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IE1lbW9yeUxpbmVSZWFkZXIoY29uc3Qgc3RyaW5nJiBjb250ZW50cykgOiBpbnB1dF9zdHJlYW1fKGNvbnRlbnRzKSB7fQotICB+TWVtb3J5TGluZVJlYWRlcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKLQotICAvLyBub24tY29weWFibGUsIG5vbi1tb3ZhYmxlCi0gIE1lbW9yeUxpbmVSZWFkZXIoY29uc3QgTWVtb3J5TGluZVJlYWRlciYpID0gZGVsZXRlOwotICBNZW1vcnlMaW5lUmVhZGVyKE1lbW9yeUxpbmVSZWFkZXImJikgPSBkZWxldGU7Ci0gIE1lbW9yeUxpbmVSZWFkZXImIG9wZXJhdG9yPShjb25zdCBNZW1vcnlMaW5lUmVhZGVyJikgPSBkZWxldGU7Ci0gIE1lbW9yeUxpbmVSZWFkZXImIG9wZXJhdG9yPShNZW1vcnlMaW5lUmVhZGVyJiYpID0gZGVsZXRlOwotCi0gIGJvb2wgUmVhZExpbmUoc3RyaW5nKiBsaW5lKSBvdmVycmlkZSB7Ci0gICAgaWYgKCFpbnB1dF9zdHJlYW1fLmdvb2QoKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBsaW5lLT5jbGVhcigpOwotICAgIHN0ZDo6Z2V0bGluZShpbnB1dF9zdHJlYW1fLCAqbGluZSk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGlzdHJpbmdzdHJlYW0gaW5wdXRfc3RyZWFtXzsKLX07ICAvLyBjbGFzcyBNZW1vcnlMaW5lUmVhZGVyCi0KLXVuaXF1ZV9wdHI8TGluZVJlYWRlcj4gTGluZVJlYWRlcjo6UmVhZEZyb21GaWxlKGNvbnN0IHN0cmluZyYgZmlsZV9wYXRoKSB7Ci0gIHVuaXF1ZV9wdHI8RmlsZUxpbmVSZWFkZXI+IGZpbGVfcmVhZGVyKG5ldyBGaWxlTGluZVJlYWRlcigpKTsKLSAgdW5pcXVlX3B0cjxMaW5lUmVhZGVyPiByZXQ7Ci0gIGlmIChmaWxlX3JlYWRlci0+SW5pdChmaWxlX3BhdGgpKSB7Ci0gICAgcmV0LnJlc2V0KGZpbGVfcmVhZGVyLnJlbGVhc2UoKSk7Ci0gIH0KLSAgcmV0dXJuIHJldDsKLX0KLQotdW5pcXVlX3B0cjxMaW5lUmVhZGVyPiBMaW5lUmVhZGVyOjpSZWFkRnJvbU1lbW9yeShjb25zdCBzdHJpbmcmIGNvbnRlbnRzKSB7Ci0gIHJldHVybiB1bmlxdWVfcHRyPExpbmVSZWFkZXI+KG5ldyBNZW1vcnlMaW5lUmVhZGVyKGNvbnRlbnRzKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhaWRsCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGluZV9yZWFkZXIuaCBiL2xpbmVfcmVhZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiODFhNjAuLjAwMDAwMDAKLS0tIGEvbGluZV9yZWFkZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBhaWRsIHsKLQotY2xhc3MgTGluZVJlYWRlciB7Ci0gcHVibGljOgotICBMaW5lUmVhZGVyKCkgPSBkZWZhdWx0OwotICB2aXJ0dWFsIH5MaW5lUmVhZGVyKCkgPSBkZWZhdWx0OwotCi0gIExpbmVSZWFkZXIoY29uc3QgTGluZVJlYWRlciYpID0gZGVsZXRlOwotICBMaW5lUmVhZGVyKExpbmVSZWFkZXImJikgPSBkZWxldGU7Ci0gIExpbmVSZWFkZXImIG9wZXJhdG9yPShjb25zdCBMaW5lUmVhZGVyJikgPSBkZWxldGU7Ci0gIExpbmVSZWFkZXImIG9wZXJhdG9yPShMaW5lUmVhZGVyJiYpID0gZGVsZXRlOwotCi0gIHZpcnR1YWwgYm9vbCBSZWFkTGluZShzdGQ6OnN0cmluZyogbGluZSkgPSAwOwotCi0gIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8TGluZVJlYWRlcj4gUmVhZEZyb21GaWxlKAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVfcGF0aCk7Ci0gIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8TGluZVJlYWRlcj4gUmVhZEZyb21NZW1vcnkoCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY29udGVudHMpOwotfTsgIC8vIGNsYXNzIExpbmVSZWFkZXIKLQotfSAgLy8gbmFtZXNwYWNlIGFpZGwKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tYWluLmNwcCBiL21haW4uY3BwCmluZGV4IDY5YmEwNjAuLmMwMDc4YmEgMTAwNjQ0Ci0tLSBhL21haW4uY3BwCisrKyBiL21haW4uY3BwCkBAIC0zMSwxMCArMzEsNiBAQAogCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKSB7CiAgIE9wdGlvbnMgb3B0aW9ucyhhcmdjLCBhcmd2LCBrRGVmYXVsdExhbmcpOwotICBpZiAoIW9wdGlvbnMuT2soKSkgewotICAgIEFJRExfRVJST1Iob3B0aW9ucy5HZXRFcnJvck1lc3NhZ2UoKSkgPDwgb3B0aW9ucy5HZXRVc2FnZSgpOwotICAgIHJldHVybiAxOwotICB9CiAKICAgLy8gT25seSBtaW5pbWFsIGZ1bmN0aW9uYWxpdHkgc2hvdWxkIGdvIGhlcmUsIHNvIHRoYXQgYXMgbXVjaCBvZiBwb3NzaWJsZSBvZgogICAvLyB0aGUgYWlkbCBjb21waWxlciBpcyBtb2NrZWQgd2l0aCB0aGUgc2luZ2xlIGZ1bmN0aW9uIGBhaWRsX2VudHJ5YApkaWZmIC0tZ2l0IGEvbWV0YWRhdGEvaW5jbHVkZS9haWRsL21ldGFkYXRhLmggYi9tZXRhZGF0YS9pbmNsdWRlL2FpZGwvbWV0YWRhdGEuaAppbmRleCBhOWY5ZjQzLi4wOWM2MGJhIDEwMDY0NAotLS0gYS9tZXRhZGF0YS9pbmNsdWRlL2FpZGwvbWV0YWRhdGEuaAorKysgYi9tZXRhZGF0YS9pbmNsdWRlL2FpZGwvbWV0YWRhdGEuaApAQCAtMzQsNiArMzQsMTIgQEAKICAgLy8gbGlzdCBvZiBhbGwgaGFzaGVzCiAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBoYXNoZXM7CiAKKyAgLy8gdHJ1ZSBpZiB0aGUgaW50ZXJmYWNlIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBsYXN0IGZyb3plbiB2ZXJzaW9uCisgIGJvb2wgaGFzX2RldmVsb3BtZW50OworCisgIC8vIGxpc3Qgb2YgYWxsIGZyb3plbiB2ZXJzaW9ucworICBzdGQ6OnZlY3RvcjxzaXplX3Q+IHZlcnNpb25zOworCiAgIHN0YXRpYyBzdGQ6OnZlY3RvcjxBaWRsSW50ZXJmYWNlTWV0YWRhdGE+IGFsbCgpOwogfTsKIApkaWZmIC0tZ2l0IGEvbWV0YWRhdGEvcGFyc2VyLmNwcCBiL21ldGFkYXRhL3BhcnNlci5jcHAKaW5kZXggNzMzNDU1NC4uNjQ2YTc3YiAxMDA2NDQKLS0tIGEvbWV0YWRhdGEvcGFyc2VyLmNwcAorKysgYi9tZXRhZGF0YS9wYXJzZXIuY3BwCkBAIC01Niw2ICs1NiwxMiBAQAogICAgICAgc3RkOjpjb3V0IDw8ICJzdGQ6OnN0cmluZyhcIiIgPDwgaW50Zi5hc1N0cmluZygpIDw8ICJcIiksIiA8PCBzdGQ6OmVuZGw7CiAgICAgfQogICAgIHN0ZDo6Y291dCA8PCAifSwiIDw8IHN0ZDo6ZW5kbDsKKyAgICBzdGQ6OmNvdXQgPDwgZW50cnlbImhhc19kZXZlbG9wbWVudCJdLmFzU3RyaW5nKCkgPDwgIiwiIDw8IHN0ZDo6ZW5kbDsKKyAgICBzdGQ6OmNvdXQgPDwgInN0ZDo6dmVjdG9yPHNpemVfdD57IiA8PCBzdGQ6OmVuZGw7CisgICAgZm9yIChjb25zdCBKc29uOjpWYWx1ZSYgaW50ZiA6IGVudHJ5WyJ2ZXJzaW9ucyJdKSB7CisgICAgICBzdGQ6OmNvdXQgPDwgaW50Zi5hc1N0cmluZygpIDw8ICIsIiA8PCBzdGQ6OmVuZGw7CisgICAgfQorICAgIHN0ZDo6Y291dCA8PCAifSwiIDw8IHN0ZDo6ZW5kbDsKICAgICBzdGQ6OmNvdXQgPDwgIn0sIiA8PCBzdGQ6OmVuZGw7CiAgIH0KICAgc3RkOjpjb3V0IDw8ICJ9OyIgPDwgc3RkOjplbmRsOwpkaWZmIC0tZ2l0IGEvbWV0YWRhdGEvdGVzdC5jcHAgYi9tZXRhZGF0YS90ZXN0LmNwcAppbmRleCA2N2QwOGIyLi43ZDdkMzMxIDEwMDY0NAotLS0gYS9tZXRhZGF0YS90ZXN0LmNwcAorKysgYi9tZXRhZGF0YS90ZXN0LmNwcApAQCAtMzksNSArMzksMTkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvbWVfcGFja2FnZS5zdWJfcGFja2FnZS5JRm9vIiwgInNvbWVfcGFja2FnZS5zdWJfcGFja2FnZS5TdWJUaGluZyIpKTsKICAgRVhQRUNUX1RIQVQoaW5mby0+aGFzaGVzLCBFbGVtZW50c0FyZSgiMTNlMjRiMmZhYzZhOTc5OTcxODE5ZmJhMmFiMGQ2ZDdjNDE4MjEyMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRjMmE5MjkyODQ3ZTQzYjQzNjBiYjE4M2Y3NDkxZjBlOTg5NWVhYTkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI1NGY5MzU5MjBhYjA5MzRjMjQyMTQ1Y2YwMGY5ODUyYWUzZjVhNjNlIikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI1NGY5MzU5MjBhYjA5MzRjMjQyMTQ1Y2YwMGY5ODUyYWUzZjVhNjNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmU1ZGQ2YmY5YzkwMDBlZTA1MzYyMWYxMThiN2Q2YTdjZmQxZTc5ZSIpKTsKKyAgRVhQRUNUX1RIQVQoaW5mby0+dmVyc2lvbnMsIEVsZW1lbnRzQXJlKDEsIDIsIDMsIDQpKTsKKyAgRVhQRUNUX0VRKGluZm8tPmhhc19kZXZlbG9wbWVudCwgZmFsc2UpOworfQorCitURVNUKEFpZGxNZXRhZGF0YSwgSGFzVGVzdEluc3RhbmNlc05vRGV2ZWxvcG1lbnQpIHsKKyAgY29uc3QgYXV0byYgaW5mbyA9IG1ldGFkYXRhRm9yTW9kdWxlKCJ0ZXN0LXBpZWNlLTIiKTsKKyAgQVNTRVJUX05FKGluZm8sIHN0ZDo6bnVsbG9wdCk7CisgIEVYUEVDVF9FUShpbmZvLT5zdGFiaWxpdHksICIiKTsKKyAgRVhQRUNUX1RIQVQoaW5mby0+dHlwZXMsIEVsZW1lbnRzQXJlKCJJTm9QYWNrYWdlIiwgInNvbWVfcGFja2FnZS5JQmFyIikpOworICBFWFBFQ1RfVEhBVChpbmZvLT5oYXNoZXMsIEVsZW1lbnRzQXJlKCJjNTQ0OTAyYWI4YTFkMmU3MmFlOTM5NjAzMmJhMTEzZTliOTY5OGM0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmNkMzZkYjQ1MWNkYmVlYjA0OTgzM2ZkN2Y0OTlhOTg3YWNmMzkzMCIpKTsKKyAgRVhQRUNUX1RIQVQoaW5mby0+dmVyc2lvbnMsIEVsZW1lbnRzQXJlKDEpKTsKKyAgRVhQRUNUX0VRKGluZm8tPmhhc19kZXZlbG9wbWVudCwgZmFsc2UpOwogfQpkaWZmIC0tZ2l0IGEvb3B0aW9ucy5jcHAgYi9vcHRpb25zLmNwcAppbmRleCBiMzgzMDUyLi5iOTg3OGI4IDEwMDY0NAotLS0gYS9vcHRpb25zLmNwcAorKysgYi9vcHRpb25zLmNwcApAQCAtMTUsMjAgKzE1LDI1IEBACiAgKi8KIAogI2luY2x1ZGUgIm9wdGlvbnMuaCIKLSNpbmNsdWRlICJsb2dnaW5nLmgiCi0jaW5jbHVkZSAib3MuaCIKIAorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3BhcnNlaW50Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Jlc3VsdC5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdzLmg+CiAjaW5jbHVkZSA8Z2V0b3B0Lmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CisKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAjaW5jbHVkZSA8aW9zdHJlYW0+CiAjaW5jbHVkZSA8c3N0cmVhbT4KICNpbmNsdWRlIDxzdHJpbmc+CiAKLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncy5oPgogI2luY2x1ZGUgImFpZGxfbGFuZ3VhZ2UuaCIKKyNpbmNsdWRlICJsb2dnaW5nLmgiCisjaW5jbHVkZSAib3MuaCIKIAordXNpbmcgYW5kcm9pZDo6YmFzZTo6UmVzdWx0OwogdXNpbmcgYW5kcm9pZDo6YmFzZTo6U3BsaXQ7CiB1c2luZyBhbmRyb2lkOjpiYXNlOjpUcmltOwogdXNpbmcgc3RkOjplbmRsOwpAQCAtNTksNiArNjQsMTUgQEAKICAgICAgICA8PCAiICAgQ2hlY2sgd2hldGhlciBORVdfRElSIEFQSSBkdW1wIGlzIHtjb21wYXRpYmxlfGVxdWFsfSBleHRlbnNpb24gIiA8PCBlbmRsCiAgICAgICAgPDwgIiAgIG9mIHRoZSBBUEkgZHVtcCBPTERfRElSLiBEZWZhdWx0OiBjb21wYXRpYmxlIiA8PCBlbmRsCiAjZW5kaWYKKyAgICAgICA8PCBlbmRsCisgICAgICAgPDwgbXluYW1lXyA8PCAiIC0tYXBpbWFwcGluZyBPVVRQVVQgSU5QVVQuLi4iIDw8IGVuZGwKKyAgICAgICA8PCAiICAgR2VuZXJhdGUgYSBtYXBwaW5nIG9mIGRlY2xhcmVkIGFpZGwgbWV0aG9kIHNpZ25hdHVyZXMgdG8iIDw8IGVuZGwKKyAgICAgICA8PCAiICAgdGhlIG9yaWdpbmFsIGxpbmUgbnVtYmVyLiBlLmcuOiAiIDw8IGVuZGwKKyAgICAgICA8PCAiICAgICAgIElmIGxpbmUgMzkgb2YgZm9vL2Jhci9JRm9vLmFpZGwgY29udGFpbnM6IgorICAgICAgIDw8ICIgICAgICAgICB2b2lkIGRvRm9vKGludCBiYXIsIFN0cmluZyBiYXopOyIgPDwgZW5kbAorICAgICAgIDw8ICIgICAgICAgVGhlbiB0aGUgcmVzdWx0IHdvdWxkIGJlOiIgPDwgZW5kbAorICAgICAgIDw8ICIgICAgICAgICBmb28uYmFyLkJhenxkb0Zvb3xpbnQsU3RyaW5nLHx2b2lkIiA8PCBlbmRsCisgICAgICAgPDwgIiAgICAgICAgIGZvby9iYXIvSUZvby5haWRsOjM5IiA8PCBlbmRsCiAgICAgICAgPDwgZW5kbDsKIAogICAvLyBMZWdhY3kgb3B0aW9uIGZvcm1hdHMKQEAgLTc5LDggKzkzLDYgQEAKICAgc3N0ciA8PCAiT1BUSU9OOiIgPDwgZW5kbAogICAgICAgIDw8ICIgIC1JIERJUiwgLS1pbmNsdWRlPURJUiIgPDwgZW5kbAogICAgICAgIDw8ICIgICAgICAgICAgVXNlIERJUiBhcyBhIHNlYXJjaCBwYXRoIGZvciBpbXBvcnQgc3RhdGVtZW50cy4iIDw8IGVuZGwKLSAgICAgICA8PCAiICAtbSBGSUxFLCAtLWltcG9ydD1GSUxFIiA8PCBlbmRsCi0gICAgICAgPDwgIiAgICAgICAgICBJbXBvcnQgRklMRSBkaXJlY3RseSB3aXRob3V0IHNlYXJjaGluZyBpbiB0aGUgc2VhcmNoIHBhdGhzLiIgPDwgZW5kbAogICAgICAgIDw8ICIgIC1wIEZJTEUsIC0tcHJlcHJvY2Vzc2VkPUZJTEUiIDw8IGVuZGwKICAgICAgICA8PCAiICAgICAgICAgIEluY2x1ZGUgRklMRSB3aGljaCBpcyBjcmVhdGVkIGJ5IC0tcHJlcHJvY2Vzcy4iIDw8IGVuZGwKICAgICAgICA8PCAiICAtZCBGSUxFLCAtLWRlcD1GSUxFIiA8PCBlbmRsCkBAIC05NywyNSArMTA5LDI1IEBACiAgICAgICAgPDwgIiAgICAgICAgICBUcmlnZ2VyIGZhaWwgd2hlbiB0cnlpbmcgdG8gY29tcGlsZSBhIHBhcmNlbGFibGUuIiA8PCBlbmRsCiAgICAgICAgPDwgIiAgLS1uaW5qYSIgPDwgZW5kbAogICAgICAgIDw8ICIgICAgICAgICAgR2VuZXJhdGUgZGVwZW5kZW5jeSBmaWxlIGluIGEgZm9ybWF0IG5pbmphIHVuZGVyc3RhbmRzLiIgPDwgZW5kbAorICAgICAgIDw8ICIgIC0tcnBjIiA8PCBlbmRsCisgICAgICAgPDwgIiAgICAgICAgICAoZm9yIEphdmEpIHdoZXRoZXIgdG8gZ2VuZXJhdGUgc3VwcG9ydCBmb3IgUlBDIHRyYW5zYWN0aW9ucy4iIDw8IGVuZGwKICAgICAgICA8PCAiICAtLXN0cnVjdHVyZWQiIDw8IGVuZGwKICAgICAgICA8PCAiICAgICAgICAgIFdoZXRoZXIgdGhpcyBpbnRlcmZhY2UgaXMgZGVmaW5lZCBleGNsdXNpdmVseSBpbiBBSURMLiIgPDwgZW5kbAogICAgICAgIDw8ICIgICAgICAgICAgSXQgaXMgdGhlcmVmb3JlIGEgY2FuZGlkYXRlIGZvciBzdGFiaWxpemF0aW9uLiIgPDwgZW5kbAogICAgICAgIDw8ICIgIC0tc3RhYmlsaXR5PTxsZXZlbD4iIDw8IGVuZGwKICAgICAgICA8PCAiICAgICAgICAgIFRoZSBzdGFiaWxpdHkgcmVxdWlyZW1lbnQgb2YgdGhpcyBpbnRlcmZhY2UuIiA8PCBlbmRsCisgICAgICAgPDwgIiAgLS1taW5fc2RrX3ZlcnNpb249PHZlcnNpb24+IiA8PCBlbmRsCisgICAgICAgPDwgIiAgICAgICAgICBNaW5pbXVtIFNESyB2ZXJzaW9uIHRoYXQgdGhlIGdlbmVyYXRlZCBjb2RlIHNob3VsZCBzdXBwb3J0LiIgPDwgZW5kbAorICAgICAgIDw8ICIgICAgICAgICAgRGVmYXVsdHMgdG8gIiA8PCBERUZBVUxUX1NES19WRVJTSU9OX0pBVkEgPDwgIiBmb3IgLS1sYW5nPWphdmEsICIgPDwgZW5kbAorICAgICAgIDw8ICIgICAgICAgICAgICAiIDw8IERFRkFVTFRfU0RLX1ZFUlNJT05fQ1BQIDw8ICIgZm9yIC0tbGFuZz1jcHAsICIgPDwgZW5kbAorICAgICAgIDw8ICIgICAgICAgICAgICAiIDw8IERFRkFVTFRfU0RLX1ZFUlNJT05fTkRLIDw8ICIgZm9yIC0tbGFuZz1uZGssICIgPDwgZW5kbAorICAgICAgIDw8ICIgICAgICAgICAgICAiIDw8IERFRkFVTFRfU0RLX1ZFUlNJT05fUlVTVCA8PCAiIGZvciAtLWxhbmc9cnVzdCwgIiA8PCBlbmRsCiAgICAgICAgPDwgIiAgLXQsIC0tdHJhY2UiIDw8IGVuZGwKICAgICAgICA8PCAiICAgICAgICAgIEluY2x1ZGUgdHJhY2luZyBjb2RlIGZvciBzeXN0cmFjZS4gTm90ZSB0aGF0IGlmIGVpdGhlciIgPDwgZW5kbAogICAgICAgIDw8ICIgICAgICAgICAgdGhlIGNsaWVudCBvciBzZXJ2aWNlIGNvZGUgaXMgbm90IGF1dG8tZ2VuZXJhdGVkIGJ5IHRoaXMiIDw8IGVuZGwKICAgICAgICA8PCAiICAgICAgICAgIHRvb2wsIHRoYXQgcGFydCB3aWxsIG5vdCBiZSB0cmFjZWQuIiA8PCBlbmRsCiAgICAgICAgPDwgIiAgLS10cmFuc2FjdGlvbl9uYW1lcyIgPDwgZW5kbAogICAgICAgIDw8ICIgICAgICAgICAgR2VuZXJhdGUgdHJhbnNhY3Rpb24gbmFtZXMuIiA8PCBlbmRsCi0gICAgICAgPDwgIiAgLS1hcGltYXBwaW5nIiA8PCBlbmRsCi0gICAgICAgPDwgIiAgICAgICAgICBHZW5lcmF0ZXMgYSBtYXBwaW5nIG9mIGRlY2xhcmVkIGFpZGwgbWV0aG9kIHNpZ25hdHVyZXMgdG8iIDw8IGVuZGwKLSAgICAgICA8PCAiICAgICAgICAgIHRoZSBvcmlnaW5hbCBsaW5lIG51bWJlci4gZS5nLjogIiA8PCBlbmRsCi0gICAgICAgPDwgIiAgICAgICAgICAgICAgSWYgbGluZSAzOSBvZiBmb28vYmFyL0lGb28uYWlkbCBjb250YWluczoiCi0gICAgICAgPDwgIiAgICAgICAgICAgICAgdm9pZCBkb0ZvbyhpbnQgYmFyLCBTdHJpbmcgYmF6KTsiIDw8IGVuZGwKLSAgICAgICA8PCAiICAgICAgICAgICAgICBUaGVuIHRoZSByZXN1bHQgd291bGQgYmU6IiA8PCBlbmRsCi0gICAgICAgPDwgIiAgICAgICAgICAgICAgZm9vLmJhci5CYXp8ZG9Gb298aW50LFN0cmluZyx8dm9pZCIgPDwgZW5kbAotICAgICAgIDw8ICIgICAgICAgICAgICAgIGZvby9iYXIvSUZvby5haWRsOjM5IiA8PCBlbmRsCiAgICAgICAgPDwgIiAgLXYgVkVSLCAtLXZlcnNpb249VkVSIiA8PCBlbmRsCiAgICAgICAgPDwgIiAgICAgICAgICBTZXQgdGhlIHZlcnNpb24gb2YgdGhlIGludGVyZmFjZSBhbmQgcGFyY2VsYWJsZSB0byBWRVIuIiA8PCBlbmRsCiAgICAgICAgPDwgIiAgICAgICAgICBWRVIgbXVzdCBiZSBhbiBpbnRlcmdlciBncmVhdGVyIHRoYW4gMC4iIDw8IGVuZGwKQEAgLTE4MSw2ICsxOTMsNDQgQEAKICAgcmV0dXJuIGZhbHNlOwogfQogCitzdGF0aWMgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHVpbnQzMl90PiBjb2RlTmFtZVRvVmVyc2lvbiA9IHsKKyAgICB7IlMiLCAzMX0sCisgICAgeyJUaXJhbWlzdSIsIFNES19WRVJTSU9OX1RpcmFtaXN1fSwKKyAgICAvLyB0aGlzIGlzIGFuIGFsaWFzIGZvciB0aGUgbGF0ZXN0IGluLWRldmVsb3BtZW50IHBsYXRmb3JtIHZlcnNpb24KKyAgICB7ImN1cnJlbnQiLCBTREtfVkVSU0lPTl9jdXJyZW50fSwKKyAgICAvLyB0aGlzIGlzIGFuIGFsaWFzIGZvciB1c2Ugb2YgYWxsIEFQSXMsIGluY2x1ZGluZyB0aG9zZSBub3QgaW4gYW55IEFQSSBzdXJmYWNlCisgICAgeyJwbGF0Zm9ybV9hcGlzIiwgMTAwMDF9LAorfTsKKworUmVzdWx0PHVpbnQzMl90PiBNaW5TZGtWZXJzaW9uRnJvbVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7CisgIHVpbnQzMl90IG51bTsKKyAgaWYgKCFhbmRyb2lkOjpiYXNlOjpQYXJzZVVpbnQoc3RyLCAmbnVtLCAxMDAwMHUgLyogbWF4ICovKSkgeworICAgIGlmIChhdXRvIGZvdW5kID0gY29kZU5hbWVUb1ZlcnNpb24uZmluZChzdHIpOyBmb3VuZCAhPSBjb2RlTmFtZVRvVmVyc2lvbi5lbmQoKSkgeworICAgICAgcmV0dXJuIGZvdW5kLT5zZWNvbmQ7CisgICAgfQorICAgIHJldHVybiBFcnJvcmYoIkludmFsaWQgU0RLIHZlcnNpb246IHt9Iiwgc3RyKTsKKyAgfQorICByZXR1cm4gbnVtOworfQorCitzdGF0aWMgdWludDMyX3QgRGVmYXVsdE1pblNka1ZlcnNpb25Gb3JMYW5nKGNvbnN0IE9wdGlvbnM6Okxhbmd1YWdlIGxhbmcpIHsKKyAgc3dpdGNoIChsYW5nKSB7CisgICAgY2FzZSBPcHRpb25zOjpMYW5ndWFnZTo6Q1BQOgorICAgICAgcmV0dXJuIERFRkFVTFRfU0RLX1ZFUlNJT05fQ1BQOworICAgIGNhc2UgT3B0aW9uczo6TGFuZ3VhZ2U6OkpBVkE6CisgICAgICByZXR1cm4gREVGQVVMVF9TREtfVkVSU0lPTl9KQVZBOworICAgIGNhc2UgT3B0aW9uczo6TGFuZ3VhZ2U6Ok5ESzoKKyAgICAgIHJldHVybiBERUZBVUxUX1NES19WRVJTSU9OX05ESzsKKyAgICBjYXNlIE9wdGlvbnM6Okxhbmd1YWdlOjpSVVNUOgorICAgICAgcmV0dXJuIERFRkFVTFRfU0RLX1ZFUlNJT05fUlVTVDsKKyAgICBjYXNlIE9wdGlvbnM6Okxhbmd1YWdlOjpVTlNQRUNJRklFRDoKKyAgICAgIHJldHVybiBERUZBVUxUX1NES19WRVJTSU9OX0pBVkE7ICAvLyBUaGUgc2FmZXN0IG9wdGlvbgorICAgIGRlZmF1bHQ6CisgICAgICBBSURMX0ZBVEFMKEFJRExfTE9DQVRJT05fSEVSRSkKKyAgICAgICAgICA8PCAiVW5leHBlY3RlZCBPcHRpb25zOjpMYW5ndWFnZSBlbnVtZXJhdG9yOiAiIDw8IHN0YXRpY19jYXN0PHNpemVfdD4obGFuZyk7CisgIH0KK30KKwogT3B0aW9ucyBPcHRpb25zOjpGcm9tKGNvbnN0IHN0cmluZyYgY21kbGluZSkgewogICB2ZWN0b3I8c3RyaW5nPiBhcmdzID0gU3BsaXQoY21kbGluZSwgIiAiKTsKICAgcmV0dXJuIEZyb20oYXJncyk7CkBAIC0yMDIsNyArMjUyLDcgQEAKIH0KIAogT3B0aW9uczo6T3B0aW9ucyhpbnQgYXJnYywgY29uc3QgY2hhciogY29uc3QgcmF3X2FyZ3ZbXSwgT3B0aW9uczo6TGFuZ3VhZ2UgZGVmYXVsdF9sYW5nKQotICAgIDogbXluYW1lXyhyYXdfYXJndlswXSksIGxhbmd1YWdlXyhkZWZhdWx0X2xhbmcpIHsKKyAgICA6IG15bmFtZV8oYXJnYyA+PSAxID8gcmF3X2FyZ3ZbMF0gOiAiYWlkbCIpLCBsYW5ndWFnZV8oZGVmYXVsdF9sYW5nKSB7CiAgIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIqPiBhcmd2ID0gd2FybmluZ19vcHRpb25zXy5QYXJzZShhcmdjLCByYXdfYXJndiwgZXJyb3JfbWVzc2FnZV8pOwogICBpZiAoIU9rKCkpIHJldHVybjsKICAgYXJnYyA9IGFyZ3Yuc2l6ZSgpOwpAQCAtMjIwLDEzICsyNzAsMTQgQEAKICNlbmRpZgogICAgICAgICB7ImFwaW1hcHBpbmciLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ2knfSwKICAgICAgICAgeyJpbmNsdWRlIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdJJ30sCi0gICAgICAgIHsiaW1wb3J0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdtJ30sCiAgICAgICAgIHsicHJlcHJvY2Vzc2VkIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdwJ30sCiAgICAgICAgIHsiZGVwIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdkJ30sCiAgICAgICAgIHsib3V0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdvJ30sCiAgICAgICAgIHsiaGVhZGVyX291dCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnaCd9LAogICAgICAgICB7Im5pbmphIiwgbm9fYXJndW1lbnQsIDAsICduJ30sCisgICAgICAgIHsicnBjIiwgbm9fYXJndW1lbnQsIDAsICdyJ30sCiAgICAgICAgIHsic3RhYmlsaXR5IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdZJ30sCisgICAgICAgIHsibWluX3Nka192ZXJzaW9uIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdtJ30sCiAgICAgICAgIHsic3RydWN0dXJlZCIsIG5vX2FyZ3VtZW50LCAwLCAnUyd9LAogICAgICAgICB7InRyYWNlIiwgbm9fYXJndW1lbnQsIDAsICd0J30sCiAgICAgICAgIHsidHJhbnNhY3Rpb25fbmFtZXMiLCBub19hcmd1bWVudCwgMCwgJ2MnfSwKQEAgLTIzNyw3ICsyODgsNyBAQAogICAgICAgICB7MCwgMCwgMCwgMH0sCiAgICAgfTsKICAgICBjb25zdCBpbnQgYyA9IGdldG9wdF9sb25nKGFyZ2MsIGNvbnN0X2Nhc3Q8Y2hhciogY29uc3QqPihhcmd2LmRhdGEoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSTptOnA6ZDpvOmg6YWJ0djoiLCBsb25nX29wdGlvbnMsIG51bGxwdHIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkk6cDpkOm86aDphYnR2Omk6IiwgbG9uZ19vcHRpb25zLCBudWxscHRyKTsKICAgICBpZiAoYyA9PSAtMSkgewogICAgICAgLy8gbm8gbW9yZSBvcHRpb25zCiAgICAgICBicmVhazsKQEAgLTI3MSwzMyArMzIyLDI3IEBACiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgICBjYXNlICdzJzoKLSAgICAgICAgaWYgKHRhc2tfICE9IE9wdGlvbnM6OlRhc2s6OlVOU1BFQ0lGSUVEKSB7Ci0gICAgICAgICAgdGFza18gPSBPcHRpb25zOjpUYXNrOjpQUkVQUk9DRVNTOwotICAgICAgICB9CisgICAgICAgIHRhc2tfID0gT3B0aW9uczo6VGFzazo6UFJFUFJPQ0VTUzsKICAgICAgICAgYnJlYWs7CiAjaWZuZGVmIF9XSU4zMgogICAgICAgY2FzZSAndSc6Ci0gICAgICAgIGlmICh0YXNrXyAhPSBPcHRpb25zOjpUYXNrOjpVTlNQRUNJRklFRCkgewotICAgICAgICAgIHRhc2tfID0gT3B0aW9uczo6VGFzazo6RFVNUF9BUEk7Ci0gICAgICAgIH0KKyAgICAgICAgdGFza18gPSBPcHRpb25zOjpUYXNrOjpEVU1QX0FQSTsKICAgICAgICAgYnJlYWs7CiAgICAgICBjYXNlICd4JzoKICAgICAgICAgZHVtcF9ub19saWNlbnNlXyA9IHRydWU7CiAgICAgICAgIGJyZWFrOwogICAgICAgY2FzZSAnQSc6Ci0gICAgICAgIGlmICh0YXNrXyAhPSBPcHRpb25zOjpUYXNrOjpVTlNQRUNJRklFRCkgewotICAgICAgICAgIHRhc2tfID0gT3B0aW9uczo6VGFzazo6Q0hFQ0tfQVBJOwotICAgICAgICAgIC8vIHRvIGVuc3VyZSB0aGF0IGFsbCBwYXJjZWxhYmxlcyBpbiB0aGUgYXBpIGR1bXBlcyBhcmUgc3RydWN0dXJlZAotICAgICAgICAgIHN0cnVjdHVyZWRfID0gdHJ1ZTsKLSAgICAgICAgICBpZiAob3B0YXJnKSB7Ci0gICAgICAgICAgICBpZiAoc3RyY21wKG9wdGFyZywgImNvbXBhdGlibGUiKSA9PSAwKQotICAgICAgICAgICAgICBjaGVja19hcGlfbGV2ZWxfID0gQ2hlY2tBcGlMZXZlbDo6Q09NUEFUSUJMRTsKLSAgICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcChvcHRhcmcsICJlcXVhbCIpID09IDApCi0gICAgICAgICAgICAgIGNoZWNrX2FwaV9sZXZlbF8gPSBDaGVja0FwaUxldmVsOjpFUVVBTDsKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlXyA8PCAiVW5zdXBwb3J0ZWQgLS1jaGVja2FwaSBsZXZlbDogJyIgPDwgb3B0YXJnIDw8ICInIiA8PCBlbmRsOwotICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9CisgICAgICAgIHRhc2tfID0gT3B0aW9uczo6VGFzazo6Q0hFQ0tfQVBJOworICAgICAgICAvLyB0byBlbnN1cmUgdGhhdCBhbGwgcGFyY2VsYWJsZXMgaW4gdGhlIGFwaSBkdW1wZXMgYXJlIHN0cnVjdHVyZWQKKyAgICAgICAgc3RydWN0dXJlZF8gPSB0cnVlOworICAgICAgICBpZiAob3B0YXJnKSB7CisgICAgICAgICAgaWYgKHN0cmNtcChvcHRhcmcsICJjb21wYXRpYmxlIikgPT0gMCkKKyAgICAgICAgICAgIGNoZWNrX2FwaV9sZXZlbF8gPSBDaGVja0FwaUxldmVsOjpDT01QQVRJQkxFOworICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcChvcHRhcmcsICJlcXVhbCIpID09IDApCisgICAgICAgICAgICBjaGVja19hcGlfbGV2ZWxfID0gQ2hlY2tBcGlMZXZlbDo6RVFVQUw7CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBlcnJvcl9tZXNzYWdlXyA8PCAiVW5zdXBwb3J0ZWQgLS1jaGVja2FwaSBsZXZlbDogJyIgPDwgb3B0YXJnIDw8ICInIiA8PCBlbmRsOworICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBicmVhazsKQEAgLTMwNiwxMCArMzUxLDYgQEAKICAgICAgICAgaW1wb3J0X2RpcnNfLmVtcGxhY2UoVHJpbShvcHRhcmcpKTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9Ci0gICAgICBjYXNlICdtJzogewotICAgICAgICBpbXBvcnRfZmlsZXNfLmVtcGxhY2UoVHJpbShvcHRhcmcpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9CiAgICAgICBjYXNlICdwJzoKICAgICAgICAgcHJlcHJvY2Vzc2VkX2ZpbGVzXy5lbXBsYWNlX2JhY2soVHJpbShvcHRhcmcpKTsKICAgICAgICAgYnJlYWs7CkBAIC0zNDMsNiArMzg0LDE3IEBACiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgICB9CisgICAgICBjYXNlICdtJzoKKyAgICAgICAgaWYgKGF1dG8gcmV0ID0gTWluU2RrVmVyc2lvbkZyb21TdHJpbmcoVHJpbShvcHRhcmcpKTsgcmV0Lm9rKCkpIHsKKyAgICAgICAgICBtaW5fc2RrX3ZlcnNpb25fID0gKnJldDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBlcnJvcl9tZXNzYWdlXyA8PCByZXQuZXJyb3IoKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdyJzoKKyAgICAgICAgZ2VuX3JwY18gPSB0cnVlOworICAgICAgICBicmVhazsKICAgICAgIGNhc2UgJ3QnOgogICAgICAgICBnZW5fdHJhY2VzXyA9IHRydWU7CiAgICAgICAgIGJyZWFrOwpAQCAtMzc1LDE0ICs0MjcsMTcgQEAKICAgICAgICAgYnJlYWs7CiAgICAgICBjYXNlICdlJzoKICAgICAgICAgc3RkOjpjZXJyIDw8IEdldFVzYWdlKCk7Ci0gICAgICAgIGV4aXQoMCk7CisgICAgICAgIHRhc2tfID0gVGFzazo6SEVMUDsKKyAgICAgICAgQ0hFQ0soT2soKSk7CisgICAgICAgIHJldHVybjsKICAgICAgIGNhc2UgJ2knOgogICAgICAgICBvdXRwdXRfZmlsZV8gPSBUcmltKG9wdGFyZyk7CiAgICAgICAgIHRhc2tfID0gVGFzazo6RFVNUF9NQVBQSU5HUzsKICAgICAgICAgYnJlYWs7CiAgICAgICBkZWZhdWx0OgotICAgICAgICBzdGQ6OmNlcnIgPDwgR2V0VXNhZ2UoKTsKLSAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgZXJyb3JfbWVzc2FnZV8gPDwgR2V0VXNhZ2UoKTsKKyAgICAgICAgQ0hFQ0soIU9rKCkpOworICAgICAgICByZXR1cm47CiAgICAgfQogICB9ICAvLyB3aGlsZQogCkBAIC00MzAsNyArNDg1LDggQEAKICAgICB9CiAgIH0gZWxzZSB7CiAgICAgLy8gdGhlIG5ldyBhcmd1bWVudHMgZm9ybWF0Ci0gICAgaWYgKHRhc2tfID09IE9wdGlvbnM6OlRhc2s6OkNPTVBJTEUgfHwgdGFza18gPT0gT3B0aW9uczo6VGFzazo6RFVNUF9BUEkpIHsKKyAgICBpZiAodGFza18gPT0gT3B0aW9uczo6VGFzazo6Q09NUElMRSB8fCB0YXNrXyA9PSBPcHRpb25zOjpUYXNrOjpEVU1QX0FQSSB8fAorICAgICAgICB0YXNrXyA9PSBPcHRpb25zOjpUYXNrOjpEVU1QX01BUFBJTkdTKSB7CiAgICAgICBpZiAoYXJnYyAtIG9wdGluZCA8IDEpIHsKICAgICAgICAgZXJyb3JfbWVzc2FnZV8gPDwgIk5vIGlucHV0IGZpbGUuIiA8PCBlbmRsOwogICAgICAgICByZXR1cm47CkBAIC00NDEsNyArNDk3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgPDwgImdvdCAiIDw8IChhcmdjIC0gb3B0aW5kKSA8PCAiLiIgPDwgZW5kbDsKICAgICAgICAgcmV0dXJuOwogICAgICAgfQotICAgICAgaWYgKHRhc2tfICE9IE9wdGlvbnM6OlRhc2s6OkNIRUNLX0FQSSAmJiB0YXNrXyAhPSBPcHRpb25zOjpUYXNrOjpEVU1QX01BUFBJTkdTKSB7CisgICAgICBpZiAodGFza18gIT0gT3B0aW9uczo6VGFzazo6Q0hFQ0tfQVBJKSB7CiAgICAgICAgIG91dHB1dF9maWxlXyA9IGFyZ3Zbb3B0aW5kKytdOwogICAgICAgfQogICAgIH0KQEAgLTUzMCw2ICs1ODYsMzEgQEAKICAgICAgIHJldHVybjsKICAgICB9CiAgIH0KKyAgaWYgKHRhc2tfICE9IE9wdGlvbnM6OlRhc2s6OkNPTVBJTEUpIHsKKyAgICBpZiAobWluX3Nka192ZXJzaW9uXyAhPSAwKSB7CisgICAgICBlcnJvcl9tZXNzYWdlXyA8PCAiLS1taW5fc2RrX3ZlcnNpb24gaXMgYXZhaWxhYmxlIG9ubHkgZm9yIGNvbXBpbGF0aW9uLiIgPDwgZW5kbDsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gRm9yIG90aGVyIHRhc2tzLCB1c2UgImN1cnJlbnQiCisgICAgbWluX3Nka192ZXJzaW9uXyA9IE1pblNka1ZlcnNpb25Gcm9tU3RyaW5nKCJjdXJyZW50IikudmFsdWUoKTsKKyAgfQorCisgIHVpbnQzMl90IGRlZmF1bHRfdmVyID0gRGVmYXVsdE1pblNka1ZlcnNpb25Gb3JMYW5nKGxhbmd1YWdlXyk7CisgIGlmIChtaW5fc2RrX3ZlcnNpb25fID09IDApIHsgIC8vIC0tbWluX3Nka192ZXJzaW9uIGZsYWcgbm90IHNwZWNpZmllZAorICAgIG1pbl9zZGtfdmVyc2lvbl8gPSBkZWZhdWx0X3ZlcjsKKyAgfSBlbHNlIGlmIChtaW5fc2RrX3ZlcnNpb25fIDwgZGVmYXVsdF92ZXIpIHsKKyAgICBlcnJvcl9tZXNzYWdlXyA8PCAiTWluIFNESyB2ZXJzaW9uIHNob3VsZCBhdCBsZWFzdCBiZSAiIDw8IGRlZmF1bHRfdmVyIDw8ICIuIiA8PCBlbmRsOworICAgIHJldHVybjsKKyAgfQorCisgIHVpbnQzMl90IHJwY192ZXJzaW9uID0gTWluU2RrVmVyc2lvbkZyb21TdHJpbmcoIlRpcmFtaXN1IikudmFsdWUoKTsKKyAgLy8gbm90ZTogd2Ugd291bGQgbGlrZSB0byBhbHdheXMgZ2VuZXJhdGUgKEphdmEpIGNvZGUgdG8gc3VwcG9ydCBSUEMgb3V0IG9mCisgIC8vIHRoZSBib3gsIGJ1dCBkb2luZyBzbyBjYXVzZXMgYW4gdW5jbGVhciBlcnJvciBmb3IgcGVvcGxlIHRyeWluZyB0byB1c2UgUlBDCisgIC8vIC0gbm93IHdlIHJlcXVpcmUgdGhlbSB0byBhZGQgdGhlIGdlbl9ycGMgYnVpbGQgcnVsZSBhbmQgZ2V0IHRoaXMgY2xlYXIgbWVzc2FnZS4KKyAgaWYgKGdlbl9ycGNfICYmIG1pbl9zZGtfdmVyc2lvbl8gPCBycGNfdmVyc2lvbikgeworICAgIGVycm9yX21lc3NhZ2VfIDw8ICJSUEMgY29kZSByZXF1aXJlcyBtaW5pbXVtIFNESyB2ZXJzaW9uIG9mIGF0IGxlYXN0ICIgPDwgcnBjX3ZlcnNpb24gPDwgZW5kbDsKKyAgICByZXR1cm47CisgIH0KIAogICBBSURMX0ZBVEFMX0lGKCFvdXRwdXRfZGlyXy5lbXB0eSgpICYmIG91dHB1dF9kaXJfLmJhY2soKSAhPSBPU19QQVRIX1NFUEFSQVRPUiwgb3V0cHV0X2Rpcl8pOwogICBBSURMX0ZBVEFMX0lGKCFvdXRwdXRfaGVhZGVyX2Rpcl8uZW1wdHkoKSAmJiBvdXRwdXRfaGVhZGVyX2Rpcl8uYmFjaygpICE9IE9TX1BBVEhfU0VQQVJBVE9SLApkaWZmIC0tZ2l0IGEvb3B0aW9ucy5oIGIvb3B0aW9ucy5oCmluZGV4IDExYTVlNTkuLjUyMDg0MjQgMTAwNjQ0Ci0tLSBhL29wdGlvbnMuaAorKysgYi9vcHRpb25zLmgKQEAgLTE5LDYgKzE5LDggQEAKICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dmVjdG9yPgogCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Jlc3VsdC5oPgorCiAjaW5jbHVkZSAiZGlhZ25vc3RpY3MuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtMjgsNiArMzAsMTkgQEAKIHVzaW5nIHN0ZDo6c3RyaW5nOwogdXNpbmcgc3RkOjp2ZWN0b3I7CiAKKy8vIFRoZSBvbGRlc3QgU0RLIHZlcnNpb24gdGhhdCBpcyBzdXBwb3J0ZWQgZm9yIGVhY2ggYmFja2VuZC4gRm9yIG5vbi1KYXZhIGJhY2tlbmRzLCB0aGVzZSBhcmUgdGhlCisvLyBwbGF0Zm9ybSBTREsgdmVyc2lvbiB3aGVyZSB0aGUgc3VwcG9ydCBmb3IgdGhlIGJhY2tlbmQgd2FzIGFkZGVkLiBGb3IgSmF2YSBiYWNrZW5kLCB0aGlzIGlzIDEuCisvLyBUT0RPKGIvMjA1MDY1NzAzKSBzd2l0Y2ggYmFjayB0byBERUZBVUxUX1NES19WRVJTSU9OX0pBVkEgPSAyMworY29uc3RleHByIHVpbnQzMl90IERFRkFVTFRfU0RLX1ZFUlNJT05fSkFWQSA9IDE7Citjb25zdGV4cHIgdWludDMyX3QgREVGQVVMVF9TREtfVkVSU0lPTl9DUFAgPSAyMzsKK2NvbnN0ZXhwciB1aW50MzJfdCBERUZBVUxUX1NES19WRVJTSU9OX05ESyA9IDI5OworY29uc3RleHByIHVpbnQzMl90IERFRkFVTFRfU0RLX1ZFUlNJT05fUlVTVCA9IDMxOworCitjb25zdGV4cHIgdWludDMyX3QgU0RLX1ZFUlNJT05fY3VycmVudCA9IDEwMDAwOworY29uc3RleHByIHVpbnQzMl90IFNES19WRVJTSU9OX1RpcmFtaXN1ID0gMzM7CisKK2NvbnN0ZXhwciB1aW50MzJfdCBKQVZBX1BST1BBR0FURV9WRVJTSU9OID0gU0RLX1ZFUlNJT05fVGlyYW1pc3U7CisKIC8vIEEgc2ltcGxlIHdyYXBwZXIgYXJvdW5kIG9zdHJpbmdzdHJlYW0uIFRoaXMgaXMganVzdCB0byBtYWtlIE9wdGlvbnMgY2xhc3MKIC8vIGNvcGlhYmxlIGJ5IHRoZSBpbXBsaWNpdCBjb3B5IGNvbnN0cnVjdG9yLiBJZiBvc3RpbmdzdHJlYW0gaXMgbm90IHdyYXBwZWQsCiAvLyB0aGUgaW1wbGNpdCBjb3B5IGNvbnN0cnVjdG9yIGlzIG5vdCBnZW5lcmF0ZWQgYmVjYXVzZSBvc3RyaW5nc3RyZWFtIGlzbid0CkBAIC03Nyw3ICs5Miw3IEBACiAgcHVibGljOgogICBlbnVtIGNsYXNzIExhbmd1YWdlIHsgVU5TUEVDSUZJRUQsIEpBVkEsIENQUCwgTkRLLCBSVVNUIH07CiAKLSAgZW51bSBjbGFzcyBUYXNrIHsgVU5TUEVDSUZJRUQsIENPTVBJTEUsIFBSRVBST0NFU1MsIERVTVBfQVBJLCBDSEVDS19BUEksIERVTVBfTUFQUElOR1MgfTsKKyAgZW51bSBjbGFzcyBUYXNrIHsgSEVMUCwgQ09NUElMRSwgUFJFUFJPQ0VTUywgRFVNUF9BUEksIENIRUNLX0FQSSwgRFVNUF9NQVBQSU5HUyB9OwogCiAgIGVudW0gY2xhc3MgQ2hlY2tBcGlMZXZlbCB7IENPTVBBVElCTEUsIEVRVUFMIH07CiAKQEAgLTg2LDYgKzEwMSwxMiBAQAogCiAgIE9wdGlvbnMoaW50IGFyZ2MsIGNvbnN0IGNoYXIqIGNvbnN0IGFyZ3ZbXSwgTGFuZ3VhZ2UgZGVmYXVsdF9sYW5nID0gTGFuZ3VhZ2U6OlVOU1BFQ0lGSUVEKTsKIAorICBPcHRpb25zIFBsdXNJbXBvcnREaXIoY29uc3Qgc3RkOjpzdHJpbmcmIGltcG9ydF9kaXIpIGNvbnN0IHsKKyAgICBPcHRpb25zIGNvcHkoKnRoaXMpOworICAgIGNvcHkuaW1wb3J0X2RpcnNfLmluc2VydChpbXBvcnRfZGlyKTsKKyAgICByZXR1cm4gY29weTsKKyAgfQorCiAgIHN0YXRpYyBPcHRpb25zIEZyb20oY29uc3Qgc3RyaW5nJiBjbWRsaW5lKTsKIAogICBzdGF0aWMgT3B0aW9ucyBGcm9tKGNvbnN0IHZlY3RvcjxzdHJpbmc+JiBhcmdzKTsKQEAgLTk3LDYgKzExOCw4IEBACiAKICAgU3RhYmlsaXR5IEdldFN0YWJpbGl0eSgpIGNvbnN0IHsgcmV0dXJuIHN0YWJpbGl0eV87IH0KIAorICB1aW50MzJfdCBHZXRNaW5TZGtWZXJzaW9uKCkgY29uc3QgeyByZXR1cm4gbWluX3Nka192ZXJzaW9uXzsgfQorCiAgIExhbmd1YWdlIFRhcmdldExhbmd1YWdlKCkgY29uc3QgeyByZXR1cm4gbGFuZ3VhZ2VfOyB9CiAgIGJvb2wgSXNDcHBPdXRwdXQoKSBjb25zdCB7IHJldHVybiBsYW5ndWFnZV8gPT0gTGFuZ3VhZ2U6OkNQUCB8fCBsYW5ndWFnZV8gPT0gTGFuZ3VhZ2U6Ok5ESzsgfQogCkBAIC0xMDYsOCArMTI5LDYgQEAKIAogICBjb25zdCBzZXQ8c3RyaW5nPiYgSW1wb3J0RGlycygpIGNvbnN0IHsgcmV0dXJuIGltcG9ydF9kaXJzXzsgfQogCi0gIGNvbnN0IHNldDxzdHJpbmc+JiBJbXBvcnRGaWxlcygpIGNvbnN0IHsgcmV0dXJuIGltcG9ydF9maWxlc187IH0KLQogICBjb25zdCB2ZWN0b3I8c3RyaW5nPiYgUHJlcHJvY2Vzc2VkRmlsZXMoKSBjb25zdCB7IHJldHVybiBwcmVwcm9jZXNzZWRfZmlsZXNfOyB9CiAKICAgc3RyaW5nIERlcGVuZGVuY3lGaWxlKCkgY29uc3QgewpAQCAtMTE2LDYgKzEzNyw4IEBACiAKICAgYm9vbCBBdXRvRGVwRmlsZSgpIGNvbnN0IHsgcmV0dXJuIGF1dG9fZGVwX2ZpbGVfOyB9CiAKKyAgYm9vbCBHZW5ScGMoKSBjb25zdCB7IHJldHVybiBnZW5fcnBjXzsgfQorCiAgIGJvb2wgR2VuVHJhY2VzKCkgY29uc3QgeyByZXR1cm4gZ2VuX3RyYWNlc187IH0KIAogICBib29sIEdlblRyYW5zYWN0aW9uTmFtZXMoKSBjb25zdCB7IHJldHVybiBnZW5fdHJhbnNhY3Rpb25fbmFtZXNfOyB9CkBAIC0xNzEsMTQgKzE5NCwxNSBAQAogICBUYXNrIHRhc2tfID0gVGFzazo6Q09NUElMRTsKICAgQ2hlY2tBcGlMZXZlbCBjaGVja19hcGlfbGV2ZWxfID0gQ2hlY2tBcGlMZXZlbDo6Q09NUEFUSUJMRTsKICAgc2V0PHN0cmluZz4gaW1wb3J0X2RpcnNfOwotICBzZXQ8c3RyaW5nPiBpbXBvcnRfZmlsZXNfOwogICB2ZWN0b3I8c3RyaW5nPiBwcmVwcm9jZXNzZWRfZmlsZXNfOwogICBzdHJpbmcgZGVwZW5kZW5jeV9maWxlXzsKKyAgYm9vbCBnZW5fcnBjXyA9IGZhbHNlOwogICBib29sIGdlbl90cmFjZXNfID0gZmFsc2U7CiAgIGJvb2wgZ2VuX3RyYW5zYWN0aW9uX25hbWVzXyA9IGZhbHNlOwogICBib29sIGRlcGVuZGVuY3lfZmlsZV9uaW5qYV8gPSBmYWxzZTsKICAgYm9vbCBzdHJ1Y3R1cmVkXyA9IGZhbHNlOwogICBTdGFiaWxpdHkgc3RhYmlsaXR5XyA9IFN0YWJpbGl0eTo6VU5TUEVDSUZJRUQ7CisgIHVpbnQzMl90IG1pbl9zZGtfdmVyc2lvbl8gPSAwOyAgLy8gaW52YWxpZCB2ZXJzaW9uCiAgIHN0cmluZyBvdXRwdXRfZGlyXzsKICAgc3RyaW5nIG91dHB1dF9oZWFkZXJfZGlyXzsKICAgYm9vbCBmYWlsX29uX3BhcmNlbGFibGVfID0gZmFsc2U7CkBAIC0xOTQsNiArMjE4LDcgQEAKIH07CiAKIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyhPcHRpb25zOjpMYW5ndWFnZSBsYW5ndWFnZSk7CithbmRyb2lkOjpiYXNlOjpSZXN1bHQ8dWludDMyX3Q+IE1pblNka1ZlcnNpb25Gcm9tU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOwogCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL29wdGlvbnNfdW5pdHRlc3QuY3BwIGIvb3B0aW9uc191bml0dGVzdC5jcHAKaW5kZXggOWYwNzQwMC4uMjkzMWJjNiAxMDA2NDQKLS0tIGEvb3B0aW9uc191bml0dGVzdC5jcHAKKysrIGIvb3B0aW9uc191bml0dGVzdC5jcHAKQEAgLTQ0NSw1ICs0NDUsNjQgQEAKICAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRlcnIoKSwgdGVzdGluZzo6SGFzU3Vic3RyKCJVbnN1cHBvcnRlZCAtLWNoZWNrYXBpIGxldmVsOiAndW5rbm93biciKSk7CiB9CiAKK1RFU1QoT3B0aW9uc1Rlc3QsIEFjY2VwdFZhbGlkTWluU2RrVmVyc2lvbikgeworICBjb25zdCBjaGFyKiBhcmdzW10gPSB7CisgICAgICAiYWlkbCIsICItLWxhbmc9amF2YSIsICItLW1pbl9zZGtfdmVyc2lvbj0zMCIsICItLW91dD1vdXQiLCAiaW5wdXQuYWlkbCIsIG51bGxwdHIsCisgIH07CisgIGF1dG8gb3B0aW9ucyA9IEdldE9wdGlvbnMoYXJncyk7CisgIEVYUEVDVF9UUlVFKG9wdGlvbnMtPk9rKCkpOworICBFWFBFQ1RfRVEoMzB1LCBvcHRpb25zLT5HZXRNaW5TZGtWZXJzaW9uKCkpOworfQorCitURVNUKE9wdGlvbnNUZXN0cywgQWNjZXB0Q29kZU5hbWVBc01pblNka1ZlcnNpb24pIHsKKyAgY29uc3QgY2hhciogYXJnc1tdID0geworICAgICAgImFpZGwiLCAiLS1sYW5nPWphdmEiLCAiLS1taW5fc2RrX3ZlcnNpb249VGlyYW1pc3UiLCAiLS1vdXQ9b3V0IiwgImlucHV0LmFpZGwiLCBudWxscHRyLAorICB9OworICBhdXRvIG9wdGlvbnMgPSBHZXRPcHRpb25zKGFyZ3MpOworICBFWFBFQ1RfVFJVRShvcHRpb25zLT5PaygpKTsKKyAgRVhQRUNUX0VRKDMzdSwgb3B0aW9ucy0+R2V0TWluU2RrVmVyc2lvbigpKTsKK30KKworVEVTVChPcHRpb25zVGVzdCwgRGVmYXVsdE1pblNka1ZlcnNpb24pIHsKKyAgY29uc3QgY2hhciogYXJnc1tdID0geworICAgICAgImFpZGwiLCAiLS1sYW5nPWphdmEiLCAiLS1vdXQ9b3V0IiwgImlucHV0LmFpZGwiLCBudWxscHRyLAorICB9OworICBhdXRvIG9wdGlvbnMgPSBHZXRPcHRpb25zKGFyZ3MpOworICBFWFBFQ1RfVFJVRShvcHRpb25zLT5PaygpKTsKKyAgRVhQRUNUX0VRKERFRkFVTFRfU0RLX1ZFUlNJT05fSkFWQSwgb3B0aW9ucy0+R2V0TWluU2RrVmVyc2lvbigpKTsKK30KKworVEVTVChPcHRpb25zVGVzdCwgUmVqZWN0SW52YWxpZE1pblNka1ZlcnNpb24pIHsKKyAgY29uc3QgY2hhciogYXJnc1tdID0geworICAgICAgImFpZGwiLCAiLS1sYW5nPWphdmEiLCAiLS1taW5fc2RrX3ZlcnNpb249Tk9UX0FfVkVSU0lPTiIsICItLW91dD1vdXQiLCAiaW5wdXQuYWlkbCIsIG51bGxwdHIsCisgIH07CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgYXV0byBvcHRpb25zID0gR2V0T3B0aW9ucyhhcmdzKTsKKyAgRVhQRUNUX0ZBTFNFKG9wdGlvbnMtPk9rKCkpOworICBFWFBFQ1RfVEhBVChHZXRDYXB0dXJlZFN0ZGVycigpLCB0ZXN0aW5nOjpIYXNTdWJzdHIoIkludmFsaWQgU0RLIHZlcnNpb246IE5PVF9BX1ZFUlNJT04iKSk7Cit9CisKK1RFU1QoT3B0aW9uc1Rlc3QsIFJlamVjdE9sZE1pblNka1ZlcnNpb24pIHsKKyAgY29uc3QgY2hhciogYXJnc1tdID0geworICAgICAgImFpZGwiLCAgICAgICAiLS1sYW5nPWNwcCIsICItLW1pbl9zZGtfdmVyc2lvbj0yMiIsICItLW91dD1vdXQiLCAiLS1oZWFkZXJfb3V0PW91dCIsCisgICAgICAiaW5wdXQuYWlkbCIsIG51bGxwdHIsCisgIH07CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgYXV0byBvcHRpb25zID0gR2V0T3B0aW9ucyhhcmdzKTsKKyAgRVhQRUNUX0ZBTFNFKG9wdGlvbnMtPk9rKCkpOworICBFWFBFQ1RfVEhBVChHZXRDYXB0dXJlZFN0ZGVycigpLCB0ZXN0aW5nOjpIYXNTdWJzdHIoIk1pbiBTREsgdmVyc2lvbiBzaG91bGQgYXQgbGVhc3QgYmUgMjMiKSk7Cit9CisKK1RFU1QoT3B0aW9uc1Rlc3QsIFJlamVjdFJwY09uT2xkU2RrVmVyc2lvbikgeworICBjb25zdCBjaGFyKiBhcmdzW10gPSB7CisgICAgICAiYWlkbCIsICItLWxhbmc9amF2YSIsICItLXJwYyIsICItLW1pbl9zZGtfdmVyc2lvbj0yMyIsICItLW91dD1vdXQiLCAiaW5wdXQuYWlkbCIsIG51bGxwdHIsCisgIH07CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgYXV0byBvcHRpb25zID0gR2V0T3B0aW9ucyhhcmdzKTsKKyAgRVhQRUNUX0ZBTFNFKG9wdGlvbnMtPk9rKCkpOworICBFWFBFQ1RfVEhBVChHZXRDYXB0dXJlZFN0ZGVycigpLAorICAgICAgICAgICAgICB0ZXN0aW5nOjpIYXNTdWJzdHIoIlJQQyBjb2RlIHJlcXVpcmVzIG1pbmltdW0gU0RLIHZlcnNpb24gb2YgYXQgbGVhc3QiKSk7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhaWRsCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvcGFyc2VyLmNwcCBiL3BhcnNlci5jcHAKaW5kZXggNzIxOTc5Zi4uZWRiMTEwYiAxMDA2NDQKLS0tIGEvcGFyc2VyLmNwcAorKysgYi9wYXJzZXIuY3BwCkBAIC0xNSw2ICsxNSw5IEBACiAgKi8KIAogI2luY2x1ZGUgInBhcnNlci5oIgorCisjaW5jbHVkZSA8cXVldWU+CisKICNpbmNsdWRlICJhaWRsX2xhbmd1YWdlX3kuaCIKICNpbmNsdWRlICJsb2dnaW5nLmgiCiAKQEAgLTI1LDEzICsyOCw0MyBAQAogWVlfQlVGRkVSX1NUQVRFIHl5X3NjYW5fYnVmZmVyKGNoYXIqLCBzaXplX3QsIHZvaWQqKTsKIHZvaWQgeXlfZGVsZXRlX2J1ZmZlcihZWV9CVUZGRVJfU1RBVEUsIHZvaWQqKTsKIAotc3RkOjp1bmlxdWVfcHRyPFBhcnNlcj4gUGFyc2VyOjpQYXJzZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OmFpZGw6OklvRGVsZWdhdGUmIGlvX2RlbGVnYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMpIHsKKy8vIEZvciBlYWNoIHVuaW9uLCBnZW5lcmF0ZSBuZXN0ZWQgIlRhZyIgZW51bSB0eXBlIHNvIHRoYXQgIlRhZyIgY2FuIGJlIHVzZWQgYXMgYSB2YWxpZCB0eXBlLgorLy8gICAgdW5pb24gRm9vIHsgaW50IGE7IGludCBiOyB9ID0+IHVuaW9uIEZvbyB7IC4uLiBlbnVtIFRhZyB7IGEsIGIgfX0KK3N0cnVjdCBVbmlvblRhZ0dlbmVyYXRlciA6IEFpZGxWaXNpdG9yIHsKKyAgdm9pZCBWaXNpdChjb25zdCBBaWRsVW5pb25EZWNsJiBkZWNsKSBvdmVycmlkZSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFpZGxFbnVtZXJhdG9yPj4gZW51bWVyYXRvcnM7CisgICAgZm9yIChjb25zdCBhdXRvJiBmaWVsZCA6IGRlY2wuR2V0RmllbGRzKCkpIHsKKyAgICAgIGVudW1lcmF0b3JzLnB1c2hfYmFjayhzdGQ6Om1ha2VfdW5pcXVlPEFpZGxFbnVtZXJhdG9yPihBSURMX0xPQ0FUSU9OX0hFUkUsIGZpZWxkLT5HZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgZmllbGQtPkdldENvbW1lbnRzKCkpKTsKKyAgICB9CisgICAgYXV0byB0YWdfZW51bSA9IHN0ZDo6bWFrZV91bmlxdWU8QWlkbEVudW1EZWNsYXJhdGlvbj4oQUlETF9MT0NBVElPTl9IRVJFLCAiVGFnIiwgJmVudW1lcmF0b3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2wuR2V0UGFja2FnZSgpLCBDb21tZW50c3t9KTsKKyAgICAvLyBUYWcgZm9yIEBGaXhlZFNpemUgdW5pb24gaXMgbGltaXRlZCB0byAiYnl0ZSIgdHlwZSBzbyB0aGF0IGl0IGNhbiBiZSBwYXNzZWQgdmlhIEZNUSB3aXRoCisgICAgLy8gd2l0aCBsb3dlciBvdmVyaGVhZC4KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QWlkbENvbnN0YW50VmFsdWU+IGJhY2tpbmdfdHlwZXsKKyAgICAgICAgQWlkbENvbnN0YW50VmFsdWU6OlN0cmluZyhBSURMX0xPQ0FUSU9OX0hFUkUsIGRlY2wuSXNGaXhlZFNpemUoKSA/ICJcImJ5dGVcIiIgOiAiXCJpbnRcIiIpfTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QWlkbEFubm90YXRpb24+PiBhbm5vdGF0aW9uczsKKyAgICBhbm5vdGF0aW9ucy5wdXNoX2JhY2soCisgICAgICAgIEFpZGxBbm5vdGF0aW9uOjpQYXJzZShBSURMX0xPQ0FUSU9OX0hFUkUsICJCYWNraW5nIiwge3sidHlwZSIsIGJhY2tpbmdfdHlwZX19LCBDb21tZW50c3t9KSk7CisgICAgdGFnX2VudW0tPkFubm90YXRlKHN0ZDo6bW92ZShhbm5vdGF0aW9ucykpOworICAgIGNvbnN0X2Nhc3Q8QWlkbFVuaW9uRGVjbCY+KGRlY2wpLkFkZFR5cGUoc3RkOjptb3ZlKHRhZ19lbnVtKSk7CisgIH0KK307CisKK2NvbnN0IEFpZGxEb2N1bWVudCogUGFyc2VyOjpQYXJzZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6YWlkbDo6SW9EZWxlZ2F0ZSYgaW9fZGVsZWdhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLCBib29sIGlzX3ByZXByb2Nlc3NlZCkgeworICBhdXRvIGNsZWFuX3BhdGggPSBhbmRyb2lkOjphaWRsOjpJb0RlbGVnYXRlOjpDbGVhblBhdGgoZmlsZW5hbWUpOworICAvLyByZXVzZSBwcmUtcGFyc2VkIGRvY3VtZW50IGZyb20gdHlwZW5hbWVzCisgIGZvciAoYXV0byYgZG9jIDogdHlwZW5hbWVzLkFsbERvY3VtZW50cygpKSB7CisgICAgaWYgKGRvYy0+R2V0TG9jYXRpb24oKS5HZXRGaWxlKCkgPT0gY2xlYW5fcGF0aCkgeworICAgICAgcmV0dXJuIGRvYy5nZXQoKTsKKyAgICB9CisgIH0KICAgLy8gTWFrZSBzdXJlIHdlIGNhbiByZWFkIHRoZSBmaWxlIGZpcnN0LCBiZWZvcmUgdHJhc2hpbmcgcHJldmlvdXMgc3RhdGUuCi0gIHVuaXF1ZV9wdHI8c3RyaW5nPiByYXdfYnVmZmVyID0gaW9fZGVsZWdhdGUuR2V0RmlsZUNvbnRlbnRzKGZpbGVuYW1lKTsKKyAgdW5pcXVlX3B0cjxzdHJpbmc+IHJhd19idWZmZXIgPSBpb19kZWxlZ2F0ZS5HZXRGaWxlQ29udGVudHMoY2xlYW5fcGF0aCk7CiAgIGlmIChyYXdfYnVmZmVyID09IG51bGxwdHIpIHsKLSAgICBBSURMX0VSUk9SKGZpbGVuYW1lKSA8PCAiRXJyb3Igd2hpbGUgb3BlbmluZyBmaWxlIGZvciBwYXJzaW5nIjsKKyAgICBBSURMX0VSUk9SKGNsZWFuX3BhdGgpIDw8ICJFcnJvciB3aGlsZSBvcGVuaW5nIGZpbGUgZm9yIHBhcnNpbmciOwogICAgIHJldHVybiBudWxscHRyOwogICB9CiAKQEAgLTM5LDEzICs3MiwyMiBAQAogICAvLyBudWxscyBhdCB0aGUgZW5kLgogICByYXdfYnVmZmVyLT5hcHBlbmQoMnUsICdcMCcpOwogCi0gIHN0ZDo6dW5pcXVlX3B0cjxQYXJzZXI+IHBhcnNlcihuZXcgUGFyc2VyKGZpbGVuYW1lLCAqcmF3X2J1ZmZlciwgdHlwZW5hbWVzKSk7CisgIFBhcnNlciBwYXJzZXIoY2xlYW5fcGF0aCwgKnJhd19idWZmZXIsIGlzX3ByZXByb2Nlc3NlZCk7CiAKLSAgaWYgKHl5OjpwYXJzZXIocGFyc2VyLmdldCgpKS5wYXJzZSgpICE9IDAgfHwgcGFyc2VyLT5IYXNFcnJvcigpKSB7CisgIGlmICh5eTo6cGFyc2VyKCZwYXJzZXIpLnBhcnNlKCkgIT0gMCB8fCBwYXJzZXIuSGFzRXJyb3IoKSkgewogICAgIHJldHVybiBudWxscHRyOwogICB9CiAKLSAgcmV0dXJuIHBhcnNlcjsKKyAgLy8gUHJlcHJvY2VzcyBwYXJzZWQgZG9jdW1lbnQgYmVmb3JlIGFkZGluZyB0byB0eXBlbmFtZXMuCisgIFVuaW9uVGFnR2VuZXJhdGVyIHY7CisgIFZpc2l0VG9wRG93bih2LCAqcGFyc2VyLmRvY3VtZW50Xyk7CisKKyAgLy8gdHJhbnNmZXIgb3duZXJzaGlwIHRvIEFpZGxUeXBlbmFtZXMgYW5kIHJldHVybiB0aGUgcmF3IHBvaW50ZXIKKyAgY29uc3QgQWlkbERvY3VtZW50KiByZXN1bHQgPSBwYXJzZXIuZG9jdW1lbnRfLmdldCgpOworICBpZiAoIXR5cGVuYW1lcy5BZGREb2N1bWVudChzdGQ6Om1vdmUocGFyc2VyLmRvY3VtZW50XykpKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKIH0KIAogdm9pZCBQYXJzZXI6OlNldFR5cGVQYXJhbWV0ZXJzKEFpZGxUeXBlU3BlY2lmaWVyKiB0eXBlLApAQCAtNjEsNjQgKzEwMywyMDEgQEAKICAgfQogfQogCi1jbGFzcyBDb25zdGFudFJlZmVyZW5jZVJlc29sdmVyIDogcHVibGljIEFpZGxWaXNpdG9yIHsKLSBwdWJsaWM6Ci0gIENvbnN0YW50UmVmZXJlbmNlUmVzb2x2ZXIoY29uc3QgQWlkbERlZmluZWRUeXBlKiBzY29wZSwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVSZXNvbHZlciYgcmVzb2x2ZXIsIGJvb2wqIHN1Y2Nlc3MpCi0gICAgICA6IHNjb3BlXyhzY29wZSksIHR5cGVuYW1lc18odHlwZW5hbWVzKSwgcmVzb2x2ZXJfKHJlc29sdmVyKSwgc3VjY2Vzc18oc3VjY2Vzcykge30KLSAgdm9pZCBWaXNpdChjb25zdCBBaWRsQ29uc3RhbnRSZWZlcmVuY2UmIHYpIG92ZXJyaWRlIHsKLSAgICBpZiAoSXNDaXJjdWxhclJlZmVyZW5jZSgmdikpIHsKLSAgICAgICpzdWNjZXNzXyA9IGZhbHNlOwotICAgICAgcmV0dXJuOwotICAgIH0KK3ZvaWQgUGFyc2VyOjpDaGVja1ZhbGlkVHlwZU5hbWUoY29uc3QgQWlkbFRva2VuJiB0b2tlbiwgY29uc3QgQWlkbExvY2F0aW9uJiBsb2MpIHsKKyAgaWYgKCFpc19wcmVwcm9jZXNzZWRfICYmIHRva2VuLkdldFRleHQoKS5maW5kKCcuJykgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICBBSURMX0VSUk9SKGxvYykgPDwgIlR5cGUgbmFtZSBjYW4ndCBiZSBxdWFsaWZpZWQuIFVzZSBgcGFja2FnZWAuIjsKKyAgICBBZGRFcnJvcigpOworICB9Cit9CiAKLSAgICBpZiAodi5HZXRSZWZUeXBlKCkgJiYgIXYuR2V0UmVmVHlwZSgpLT5Jc1Jlc29sdmVkKCkpIHsKLSAgICAgIGlmICghcmVzb2x2ZXJfKHR5cGVuYW1lc18uR2V0RG9jdW1lbnRGb3Ioc2NvcGVfKSwgdi5HZXRSZWZUeXBlKCkuZ2V0KCkpKSB7Ci0gICAgICAgIEFJRExfRVJST1Iodi5HZXRSZWZUeXBlKCkpIDw8ICJVbmtub3duIHR5cGUgJyIgPDwgdi5HZXRSZWZUeXBlKCktPkdldE5hbWUoKSA8PCAiJyI7Ci0gICAgICAgICpzdWNjZXNzXyA9IGZhbHNlOwotICAgICAgICByZXR1cm47Cit2b2lkIFBhcnNlcjo6U2V0UGFja2FnZShjb25zdCBzdGQ6OnN0cmluZyYgcGFja2FnZSkgeworICBpZiAoaXNfcHJlcHJvY2Vzc2VkXykgeworICAgIEFJRExfRVJST1IocGFja2FnZSkgPDwgIlByZXByb2Nlc3NlZCBmaWxlIGNhbid0IGRlY2xhcmUgcGFja2FnZS4iOworICAgIEFkZEVycm9yKCk7CisgIH0KKyAgcGFja2FnZV8gPSBwYWNrYWdlOworfQorCitib29sIENoZWNrTm9SZWN1cnNpdmVEZWZpbml0aW9uKGNvbnN0IEFpZGxOb2RlJiBub2RlKSB7CisgIHN0cnVjdCBWaXNpdG9yIDogQWlkbFZpc2l0b3IgeworICAgIGVudW0geworICAgICAgTk9UX1NUQVJURUQgPSAwLAorICAgICAgU1RBUlRFRCA9IDEsCisgICAgICBGSU5JU0hFRCA9IDIsCisgICAgfTsKKyAgICBzdGQ6Om1hcDxjb25zdCBBaWRsUGFyY2VsYWJsZSosIGludD4gdmlzaXRlZDsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGF0aDsKKyAgICBib29sIGZvdW5kX2N5Y2xlID0gZmFsc2U7CisKKyAgICB2b2lkIFZpc2l0KGNvbnN0IEFpZGxTdHJ1Y3R1cmVkUGFyY2VsYWJsZSYgdCkgb3ZlcnJpZGUgeyBGaW5kQ3ljbGUoJnQpOyB9CisgICAgdm9pZCBWaXNpdChjb25zdCBBaWRsVW5pb25EZWNsJiB0KSBvdmVycmlkZSB7IEZpbmRDeWNsZSgmdCk7IH0KKyAgICB2b2lkIFZpc2l0KGNvbnN0IEFpZGxQYXJjZWxhYmxlJiB0KSBvdmVycmlkZSB7IEZpbmRDeWNsZSgmdCk7IH0KKworICAgIGJvb2wgRmluZEN5Y2xlKGNvbnN0IEFpZGxQYXJjZWxhYmxlKiBwKSB7CisgICAgICAvLyBubyBuZWVkIHRvIHNlYXJjaCBmdXJ0aGVyCisgICAgICBpZiAoZm91bmRfY3ljbGUpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICB9CisgICAgICAvLyB3ZSBqdXN0IGZvdW5kIGEgY3ljbGUKKyAgICAgIGlmICh2aXNpdGVkW3BdID09IFNUQVJURUQpIHsKKyAgICAgICAgcGF0aC5wdXNoX2JhY2socC0+R2V0TmFtZSgpKTsKKyAgICAgICAgQUlETF9FUlJPUihwKSA8PCBwLT5HZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiIGlzIGEgcmVjdXJzaXZlIHBhcmNlbGFibGU6ICIgPDwgYW5kcm9pZDo6YmFzZTo6Sm9pbihwYXRoLCAiLT4iKTsKKyAgICAgICAgcmV0dXJuIChmb3VuZF9jeWNsZSA9IHRydWUpOworICAgICAgfQorICAgICAgLy8gd2UgYXJyaXZlZCBoZXJlIHdpdGggYSBkaWZmZXJlbnQgcm91dGUuCisgICAgICBpZiAodmlzaXRlZFtwXSA9PSBGSU5JU0hFRCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICAvLyBzdGFydCBERlMKKyAgICAgIHZpc2l0ZWRbcF0gPSBTVEFSVEVEOworICAgICAgcGF0aC5wdXNoX2JhY2socC0+R2V0TmFtZSgpKTsKKyAgICAgIGZvciAoY29uc3QgYXV0byYgZiA6IHAtPkdldEZpZWxkcygpKSB7CisgICAgICAgIGNvbnN0IGF1dG8mIHJlZiA9IGYtPkdldFR5cGUoKTsKKyAgICAgICAgaWYgKCFyZWYuSXNBcnJheSgpICYmICFyZWYuSXNIZWFwTnVsbGFibGUoKSkgeworICAgICAgICAgIGNvbnN0IGF1dG8mIHR5cGUgPSByZWYuR2V0RGVmaW5lZFR5cGUoKTsKKyAgICAgICAgICBpZiAodHlwZSAmJiB0eXBlLT5Bc1BhcmNlbGFibGUoKSkgeworICAgICAgICAgICAgaWYgKEZpbmRDeWNsZSh0eXBlLT5Bc1BhcmNlbGFibGUoKSkpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBwYXRoLnBvcF9iYWNrKCk7CisgICAgICB2aXNpdGVkW3BdID0gRklOSVNIRUQ7CisgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIGNvbnN0IEFpZGxDb25zdGFudFZhbHVlKiByZXNvbHZlZCA9IHYuUmVzb2x2ZShzY29wZV8pOwotICAgIGlmICghcmVzb2x2ZWQpIHsKLSAgICAgIEFJRExfRVJST1IodikgPDwgIlVua25vd24gcmVmZXJlbmNlICciIDw8IHYuTGl0ZXJhbCgpIDw8ICInIjsKLSAgICAgICpzdWNjZXNzXyA9IGZhbHNlOwotICAgICAgcmV0dXJuOwotICAgIH0KKyAgfSB2OworICBWaXNpdFRvcERvd24odiwgbm9kZSk7CisgIHJldHVybiAhdi5mb3VuZF9jeWNsZTsKK30KIAotICAgIC8vIHJlc29sdmUgcmVjdXJzaXZlIHJlZmVyZW5jZXMKLSAgICBQdXNoKCZ2KTsKLSAgICBWaXNpdFRvcERvd24oKnRoaXMsICpyZXNvbHZlZCk7Ci0gICAgUG9wKCk7CisvLyBFYWNoIFZpc2l0KigpIG1ldGhvZCBjYW4gdXNlIFNjb3BlKCkgdG8gZ2V0IGl0cyBzY29wZShBaWRsRGVmaW5lZFR5cGUpCitjbGFzcyBTY29wZWRWaXNpdG9yIDogcHVibGljIEFpZGxWaXNpdG9yIHsKKyBwcm90ZWN0ZWQ6CisgIGNvbnN0IEFpZGxEZWZpbmVkVHlwZSogU2NvcGUoKSBjb25zdCB7CisgICAgQUlETF9GQVRBTF9JRihzY29wZV8uZW1wdHkoKSwgQUlETF9MT0NBVElPTl9IRVJFKSA8PCAiU2NvcGUgaXMgZW1wdHkiOworICAgIHJldHVybiBzY29wZV8uYmFjaygpOworICB9CisgIHZvaWQgUHVzaFNjb3BlKGNvbnN0IEFpZGxEZWZpbmVkVHlwZSogc2NvcGUpIHsgc2NvcGVfLnB1c2hfYmFjayhzY29wZSk7IH0KKyAgdm9pZCBQb3BTY29wZSgpIHsgc2NvcGVfLnBvcF9iYWNrKCk7IH0KKyAgLy8gS2VlcCB1c2VyIGRlZmluZWQgdHlwZSBhcyBhIGRlZmluaW5nIHNjb3BlCisgIHZvaWQgVmlzaXRTY29wZWRUb3BEb3duKGNvbnN0IEFpZGxOb2RlJiBub2RlKSB7CisgICAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IEFpZGxOb2RlJik+IHRvcF9kb3duID0gWyZdKGNvbnN0IEFpZGxOb2RlJiBhKSB7CisgICAgICBhLkRpc3BhdGNoVmlzaXQoKnRoaXMpOworICAgICAgYXV0byBkZWZpbmVkX3R5cGUgPSBBaWRsQ2FzdDxBaWRsRGVmaW5lZFR5cGU+KGEpOworICAgICAgaWYgKGRlZmluZWRfdHlwZSkgUHVzaFNjb3BlKGRlZmluZWRfdHlwZSk7CisgICAgICBhLlRyYXZlcnNlQ2hpbGRyZW4odG9wX2Rvd24pOworICAgICAgaWYgKGRlZmluZWRfdHlwZSkgUG9wU2NvcGUoKTsKKyAgICB9OworICAgIHRvcF9kb3duKG5vZGUpOwogICB9CiAKICBwcml2YXRlOgotICBzdHJ1Y3QgU3RhY2tFbGVtIHsKLSAgICBjb25zdCBBaWRsRGVmaW5lZFR5cGUqIHNjb3BlOwotICAgIGNvbnN0IEFpZGxDb25zdGFudFJlZmVyZW5jZSogcmVmOwotICB9OworICBzdGQ6OnZlY3Rvcjxjb25zdCBBaWRsRGVmaW5lZFR5cGUqPiBzY29wZV8gPSB7fTsKK307CiAKLSAgdm9pZCBQdXNoKGNvbnN0IEFpZGxDb25zdGFudFJlZmVyZW5jZSogcmVmKSB7Ci0gICAgc3RhY2tfLnB1c2hfYmFjayh7c2NvcGVfLCByZWZ9KTsKLSAgICBpZiAocmVmLT5HZXRSZWZUeXBlKCkpIHsKLSAgICAgIHNjb3BlXyA9IHJlZi0+R2V0UmVmVHlwZSgpLT5HZXREZWZpbmVkVHlwZSgpOworY2xhc3MgVHlwZVJlZmVyZW5jZVJlc29sdmVyIDogcHVibGljIFNjb3BlZFZpc2l0b3IgeworIHB1YmxpYzoKKyAgVHlwZVJlZmVyZW5jZVJlc29sdmVyKFR5cGVSZXNvbHZlciYgcmVzb2x2ZXIpIDogcmVzb2x2ZXJfKHJlc29sdmVyKSB7fQorCisgIHZvaWQgVmlzaXQoY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHQpIG92ZXJyaWRlIHsKKyAgICAvLyBXZSdyZSB2aXNpdGluZyB0aGUgc2FtZSBub2RlIGFnYWluLiBUaGlzIGNhbiBoYXBwZW4gd2hlbiB0d28gY29uc3RhbnQgcmVmZXJlbmNlcworICAgIC8vIHBvaW50IHRvIGFuIGFuY2VzdG9yIG9mIHRoaXMgbm9kZS4KKyAgICBpZiAodC5Jc1Jlc29sdmVkKCkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgQWlkbFR5cGVTcGVjaWZpZXImIHR5cGUgPSBjb25zdF9jYXN0PEFpZGxUeXBlU3BlY2lmaWVyJj4odCk7CisgICAgaWYgKCFyZXNvbHZlcl8oU2NvcGUoKSwgJnR5cGUpKSB7CisgICAgICBBSURMX0VSUk9SKHR5cGUpIDw8ICJGYWlsZWQgdG8gcmVzb2x2ZSAnIiA8PCB0eXBlLkdldFVucmVzb2x2ZWROYW1lKCkgPDwgIiciOworICAgICAgc3VjY2Vzc18gPSBmYWxzZTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBJbiBjYXNlIGEgbmV3IGRvY3VtZW50IGlzIGltcG9ydGVkIGZvciB0aGUgdHlwZSByZWZlcmVuY2UsIGVucXVldWUgaXQgZm9yIHR5cGUgcmVzb2x1dGlvbi4KKyAgICBhdXRvIHJlc29sdmVkID0gdC5HZXREZWZpbmVkVHlwZSgpOworICAgIGlmIChyZXNvbHZlZCkgeworICAgICAgcXVldWVfLnB1c2goJnJlc29sdmVkLT5HZXREb2N1bWVudCgpKTsKICAgICB9CiAgIH0KIAotICB2b2lkIFBvcCgpIHsKLSAgICBzY29wZV8gPSBzdGFja18uYmFjaygpLnNjb3BlOworICBib29sIFJlc29sdmUoY29uc3QgQWlkbERvY3VtZW50JiBkb2N1bWVudCkgeworICAgIHF1ZXVlXy5wdXNoKCZkb2N1bWVudCk7CisgICAgd2hpbGUgKCFxdWV1ZV8uZW1wdHkoKSkgeworICAgICAgYXV0byBkb2MgPSBxdWV1ZV8uZnJvbnQoKTsKKyAgICAgIHF1ZXVlXy5wb3AoKTsKKyAgICAgIC8vIFNraXAgdGhlIGRvYyBpZiBpdCdzIHZpc2l0ZWQgYWxyZWFkeS4KKyAgICAgIGlmICghdmlzaXRlZF8uaW5zZXJ0KGRvYykuc2Vjb25kKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgVmlzaXRTY29wZWRUb3BEb3duKCpkb2MpOworICAgIH0KKyAgICByZXR1cm4gc3VjY2Vzc187CisgIH0KKworIHByaXZhdGU6CisgIFR5cGVSZXNvbHZlciYgcmVzb2x2ZXJfOworICBib29sIHN1Y2Nlc3NfID0gdHJ1ZTsKKyAgc3RkOjpxdWV1ZTxjb25zdCBBaWRsRG9jdW1lbnQqPiBxdWV1ZV8gPSB7fTsKKyAgc3RkOjpzZXQ8Y29uc3QgQWlkbERvY3VtZW50Kj4gdmlzaXRlZF8gPSB7fTsKK307CisKK2NsYXNzIENvbnN0YW50UmVmZXJlbmNlUmVzb2x2ZXIgOiBwdWJsaWMgU2NvcGVkVmlzaXRvciB7CisgcHVibGljOgorICBDb25zdGFudFJlZmVyZW5jZVJlc29sdmVyKCkgPSBkZWZhdWx0OworCisgIHZvaWQgVmlzaXQoY29uc3QgQWlkbENvbnN0YW50UmVmZXJlbmNlJiB2KSBvdmVycmlkZSB7CisgICAgaWYgKElzQ2lyY3VsYXJSZWZlcmVuY2UoJnYpKSB7CisgICAgICBzdWNjZXNzXyA9IGZhbHNlOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IEFpZGxDb25zdGFudFZhbHVlKiByZXNvbHZlZCA9IHYuUmVzb2x2ZShTY29wZSgpKTsKKyAgICBpZiAoIXJlc29sdmVkKSB7CisgICAgICBBSURMX0VSUk9SKHYpIDw8ICJVbmtub3duIHJlZmVyZW5jZSAnIiA8PCB2LkxpdGVyYWwoKSA8PCAiJyI7CisgICAgICBzdWNjZXNzXyA9IGZhbHNlOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIE9uIGVycm9yLCBza2lwIHJlY3Vyc2l2ZSB2aXNpdGluZyB0byBhdm9pZCByZWR1bmRhbnQgbWVzc2FnZXMKKyAgICBpZiAoIXN1Y2Nlc3NfKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIHJlc29sdmUgcmVjdXJzaXZlIHJlZmVyZW5jZXMKKyAgICBQdXNoQ29uc3RSZWYoJnYpOworICAgIFZpc2l0U2NvcGVkVG9wRG93bigqcmVzb2x2ZWQpOworICAgIFBvcENvbnN0UmVmKCk7CisgIH0KKworICBib29sIFJlc29sdmUoY29uc3QgQWlkbERvY3VtZW50JiBkb2N1bWVudCkgeworICAgIFZpc2l0U2NvcGVkVG9wRG93bihkb2N1bWVudCk7CisgICAgcmV0dXJuIHN1Y2Nlc3NfOworICB9CisKKyBwcml2YXRlOgorICB2b2lkIFB1c2hDb25zdFJlZihjb25zdCBBaWRsQ29uc3RhbnRSZWZlcmVuY2UqIHJlZikgeworICAgIHN0YWNrXy5wdXNoX2JhY2socmVmKTsKKyAgICBpZiAocmVmLT5HZXRSZWZUeXBlKCkpIHsKKyAgICAgIFB1c2hTY29wZShyZWYtPkdldFJlZlR5cGUoKS0+R2V0RGVmaW5lZFR5cGUoKSk7CisgICAgfQorICB9CisKKyAgdm9pZCBQb3BDb25zdFJlZigpIHsKKyAgICBpZiAoc3RhY2tfLmJhY2soKS0+R2V0UmVmVHlwZSgpKSB7CisgICAgICBQb3BTY29wZSgpOworICAgIH0KICAgICBzdGFja18ucG9wX2JhY2soKTsKICAgfQogCiAgIGJvb2wgSXNDaXJjdWxhclJlZmVyZW5jZShjb25zdCBBaWRsQ29uc3RhbnRSZWZlcmVuY2UqIHJlZikgewotICAgIGF1dG8gaXQgPSBzdGQ6OmZpbmRfaWYoc3RhY2tfLmJlZ2luKCksIHN0YWNrXy5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmXShjb25zdCBhdXRvJiBlbGVtKSB7IHJldHVybiBlbGVtLnJlZiA9PSByZWY7IH0pOworICAgIGF1dG8gaXQgPQorICAgICAgICBzdGQ6OmZpbmRfaWYoc3RhY2tfLmJlZ2luKCksIHN0YWNrXy5lbmQoKSwgWyZdKGNvbnN0IGF1dG8mIGVsZW0pIHsgcmV0dXJuIGVsZW0gPT0gcmVmOyB9KTsKICAgICBpZiAoaXQgPT0gc3RhY2tfLmVuZCgpKSB7CiAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwYXRoOwogICAgIHdoaWxlIChpdCAhPSBzdGFja18uZW5kKCkpIHsKLSAgICAgIHBhdGgucHVzaF9iYWNrKGl0LT5yZWYtPkxpdGVyYWwoKSk7CisgICAgICBwYXRoLnB1c2hfYmFjaygoKml0KS0+TGl0ZXJhbCgpKTsKICAgICAgICsraXQ7CiAgICAgfQogICAgIHBhdGgucHVzaF9iYWNrKHJlZi0+TGl0ZXJhbCgpKTsKQEAgLTEyNiwzNSArMzA1LDI4IEBACiAgICAgcmV0dXJuIHRydWU7CiAgIH0KIAotICBjb25zdCBBaWRsRGVmaW5lZFR5cGUqIHNjb3BlXzsKLSAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzXzsKLSAgVHlwZVJlc29sdmVyJiByZXNvbHZlcl87Ci0gIGJvb2wqIHN1Y2Nlc3NfOwotICBzdGQ6OnZlY3RvcjxTdGFja0VsZW0+IHN0YWNrXyA9IHt9OworICBib29sIHN1Y2Nlc3NfID0gdHJ1ZTsKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgQWlkbENvbnN0YW50UmVmZXJlbmNlKj4gc3RhY2tfID0ge307CiB9OwogCi1ib29sIFBhcnNlcjo6UmVzb2x2ZShUeXBlUmVzb2x2ZXImIHR5cGVfcmVzb2x2ZXIpIHsKLSAgYm9vbCBzdWNjZXNzID0gdHJ1ZTsKLSAgZm9yIChBaWRsVHlwZVNwZWNpZmllciogdHlwZXNwZWMgOiB1bnJlc29sdmVkX3R5cGVzcGVjc18pIHsKLSAgICBpZiAoIXR5cGVfcmVzb2x2ZXIoZG9jdW1lbnRfLCB0eXBlc3BlYykpIHsKLSAgICAgIEFJRExfRVJST1IodHlwZXNwZWMpIDw8ICJGYWlsZWQgdG8gcmVzb2x2ZSAnIiA8PCB0eXBlc3BlYy0+R2V0VW5yZXNvbHZlZE5hbWUoKSA8PCAiJyI7Ci0gICAgICBzdWNjZXNzID0gZmFsc2U7Ci0gICAgICAvLyBkb24ndCBzdG9wIHRvIHNob3cgbW9yZSBlcnJvcnMgaWYgYW55Ci0gICAgfQorLy8gUmVzb2x2ZSByZWZlcmVuY2VzKHR5cGVzL2NvbnN0YW50cykgaW4gdGhlICJtYWluIiBkb2N1bWVudC4KK2Jvb2wgUmVzb2x2ZVJlZmVyZW5jZXMoY29uc3QgQWlkbERvY3VtZW50JiBkb2N1bWVudCwgVHlwZVJlc29sdmVyJiB0eXBlX3Jlc29sdmVyKSB7CisgIC8vIFR5cGVzIGFyZSByZXNvbHZlZCBmaXJzdCBiZWZvcmUgcmVzb2x2aW5nIGNvbnN0YW50IHJlZmVyZW5jZXMgc28gdGhhdCBldmVyeSByZWZlcmVuY2VkIGRvY3VtZW50CisgIC8vIGdldHMgaW1wb3J0ZWQuCisgIGlmICghVHlwZVJlZmVyZW5jZVJlc29sdmVyKHR5cGVfcmVzb2x2ZXIpLlJlc29sdmUoZG9jdW1lbnQpKSB7CisgICAgcmV0dXJuIGZhbHNlOwogICB9Ci0KLSAgLy8gcmVzb2x2ZSAiZmllbGQgcmVmZXJlbmNlcyIgYXMgd2VsbC4KLSAgZm9yIChjb25zdCBhdXRvJiB0eXBlIDogZG9jdW1lbnRfLT5EZWZpbmVkVHlwZXMoKSkgewotICAgIENvbnN0YW50UmVmZXJlbmNlUmVzb2x2ZXIgcmVmX3Jlc29sdmVye3R5cGUuZ2V0KCksIHR5cGVuYW1lc18sIHR5cGVfcmVzb2x2ZXIsICZzdWNjZXNzfTsKLSAgICBWaXNpdFRvcERvd24ocmVmX3Jlc29sdmVyLCAqdHlwZSk7CisgIGlmICghQ29uc3RhbnRSZWZlcmVuY2VSZXNvbHZlcigpLlJlc29sdmUoZG9jdW1lbnQpKSB7CisgICAgcmV0dXJuIGZhbHNlOwogICB9Ci0KLSAgcmV0dXJuIHN1Y2Nlc3M7CisgIGlmICghQ2hlY2tOb1JlY3Vyc2l2ZURlZmluaXRpb24oZG9jdW1lbnQpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOwogfQogCi1QYXJzZXI6OlBhcnNlcihjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsIHN0ZDo6c3RyaW5nJiByYXdfYnVmZmVyLAotICAgICAgICAgICAgICAgYW5kcm9pZDo6YWlkbDo6QWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzKQotICAgIDogZmlsZW5hbWVfKGZpbGVuYW1lKSwgdHlwZW5hbWVzXyh0eXBlbmFtZXMpIHsKK1BhcnNlcjo6UGFyc2VyKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwgc3RkOjpzdHJpbmcmIHJhd19idWZmZXIsIGJvb2wgaXNfcHJlcHJvY2Vzc2VkKQorICAgIDogZmlsZW5hbWVfKGZpbGVuYW1lKSwgaXNfcHJlcHJvY2Vzc2VkXyhpc19wcmVwcm9jZXNzZWQpIHsKICAgeXlsZXhfaW5pdCgmc2Nhbm5lcl8pOwogICBidWZmZXJfID0geXlfc2Nhbl9idWZmZXIoJnJhd19idWZmZXJbMF0sIHJhd19idWZmZXIubGVuZ3RoKCksIHNjYW5uZXJfKTsKIH0KQEAgLTE2MywzICszMzUsMTEgQEAKICAgeXlfZGVsZXRlX2J1ZmZlcihidWZmZXJfLCBzY2FubmVyXyk7CiAgIHl5bGV4X2Rlc3Ryb3koc2Nhbm5lcl8pOwogfQorCit2b2lkIFBhcnNlcjo6TWFrZURvY3VtZW50KGNvbnN0IEFpZGxMb2NhdGlvbiYgbG9jYXRpb24sIGNvbnN0IENvbW1lbnRzJiBjb21tZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGltcG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxBaWRsRGVmaW5lZFR5cGU+PiBkZWZpbmVkX3R5cGVzKSB7CisgIEFJRExfRkFUQUxfSUYoZG9jdW1lbnRfLmdldCgpLCBsb2NhdGlvbik7CisgIGRvY3VtZW50XyA9IHN0ZDo6bWFrZV91bmlxdWU8QWlkbERvY3VtZW50Pihsb2NhdGlvbiwgY29tbWVudHMsIHN0ZDo6bW92ZShpbXBvcnRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShkZWZpbmVkX3R5cGVzKSwgaXNfcHJlcHJvY2Vzc2VkXyk7Cit9CmRpZmYgLS1naXQgYS9wYXJzZXIuaCBiL3BhcnNlci5oCmluZGV4IGUyZGVhMDguLjA3NGQ2ZDUgMTAwNjQ0Ci0tLSBhL3BhcnNlci5oCisrKyBiL3BhcnNlci5oCkBAIC01NCw3ICs1NCw4IEBACiAgIGFuZHJvaWQ6OmFpZGw6OkNvbW1lbnRzIGNvbW1lbnRzXzsKIH07CiAKLXVzaW5nIFR5cGVSZXNvbHZlciA9IHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCBBaWRsRG9jdW1lbnQqLCBBaWRsVHlwZVNwZWNpZmllciopPjsKK3VzaW5nIFR5cGVSZXNvbHZlciA9IHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCBBaWRsRGVmaW5lZFR5cGUqLCBBaWRsVHlwZVNwZWNpZmllciopPjsKK2Jvb2wgUmVzb2x2ZVJlZmVyZW5jZXMoY29uc3QgQWlkbERvY3VtZW50JiBkb2N1bWVudCwgVHlwZVJlc29sdmVyJiByZXNvbHZlcik7CiAKIGNsYXNzIFBhcnNlciB7CiAgcHVibGljOgpAQCAtNjUsOSArNjYsOSBAQAogICB+UGFyc2VyKCk7CiAKICAgLy8gUGFyc2UgY29udGVudHMgb2YgZmlsZSB8ZmlsZW5hbWV8LiBTaG91bGQgb25seSBiZSBjYWxsZWQgb25jZS4KLSAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxQYXJzZXI+IFBhcnNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OmFpZGw6OklvRGVsZWdhdGUmIGlvX2RlbGVnYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzKTsKKyAgc3RhdGljIGNvbnN0IEFpZGxEb2N1bWVudCogUGFyc2UoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjphaWRsOjpJb0RlbGVnYXRlJiBpb19kZWxlZ2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLCBib29sIGlzX3ByZXByb2Nlc3NlZCA9IGZhbHNlKTsKIAogICB2b2lkIEFkZEVycm9yKCkgeyBlcnJvcl8rKzsgfQogICBib29sIEhhc0Vycm9yKCkgY29uc3QgeyByZXR1cm4gZXJyb3JfICE9IDA7IH0KQEAgLTg0LDQzICs4NSwyNSBAQAogICB2b2lkIFNldFR5cGVQYXJhbWV0ZXJzKEFpZGxUeXBlU3BlY2lmaWVyKiB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxBaWRsVHlwZVNwZWNpZmllcj4+KiB0eXBlX2FyZ3MpOwogCi0gIHZvaWQgU2V0UGFja2FnZShjb25zdCBzdGQ6OnN0cmluZyYgcGFja2FnZSkgeyBwYWNrYWdlXyA9IHBhY2thZ2U7IH0KKyAgLy8gZnVsbHktcXVhbGlmaWVkIHR5cGUgbmFtZXMgYXJlIGFsbG93ZWQgb25seSBpbiBwcmVwcm9jZXNzZWQgZmlsZXMKKyAgdm9pZCBDaGVja1ZhbGlkVHlwZU5hbWUoY29uc3QgQWlkbFRva2VuJiB0b2tlbiwgY29uc3QgQWlkbExvY2F0aW9uJiBsb2MpOworCisgIHZvaWQgU2V0UGFja2FnZShjb25zdCBzdGQ6OnN0cmluZyYgcGFja2FnZSk7CiAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBQYWNrYWdlKCkgY29uc3QgeyByZXR1cm4gcGFja2FnZV87IH0KIAotICB2b2lkIERlZmVyUmVzb2x1dGlvbihBaWRsVHlwZVNwZWNpZmllciogdHlwZXNwZWMpIHsKLSAgICB1bnJlc29sdmVkX3R5cGVzcGVjc18uZW1wbGFjZV9iYWNrKHR5cGVzcGVjKTsKLSAgfQotCi0gIGNvbnN0IHZlY3RvcjxBaWRsVHlwZVNwZWNpZmllcio+JiBHZXRVbnJlc29sdmVkVHlwZXNwZWNzKCkgY29uc3QgeyByZXR1cm4gdW5yZXNvbHZlZF90eXBlc3BlY3NfOyB9Ci0KLSAgYm9vbCBSZXNvbHZlKFR5cGVSZXNvbHZlciYgdHlwZV9yZXNvbHZlcik7Ci0gIHZvaWQgU2V0RG9jdW1lbnQoc3RkOjp1bmlxdWVfcHRyPEFpZGxEb2N1bWVudD4mJiBkb2N1bWVudCkgewotICAgIC8vIFRoZSBwYXJzZWQgZG9jdW1lbnQgaXMgb3duZWQgYnkgdHlwZW5hbWVzXy4gVGhpcyBwYXJzZXIgb2JqZWN0IG9ubHkgaGFzCi0gICAgLy8gYSByZWZlcmVuY2UgdG8gaXQuCi0gICAgZG9jdW1lbnRfID0gZG9jdW1lbnQuZ2V0KCk7Ci0gICAgaWYgKCF0eXBlbmFtZXNfLkFkZERvY3VtZW50KHN0ZDo6bW92ZShkb2N1bWVudCkpKSB7Ci0gICAgICBkb2N1bWVudF8gPSBudWxscHRyOwotICAgICAgQWRkRXJyb3IoKTsKLSAgICB9Ci0gIH0KLQotICBjb25zdCBBaWRsRG9jdW1lbnQmIFBhcnNlZERvY3VtZW50KCkgY29uc3QgewotICAgIEFJRExfRkFUQUxfSUYoSGFzRXJyb3IoKSwgRmlsZU5hbWUoKSk7Ci0gICAgcmV0dXJuICpkb2N1bWVudF87Ci0gIH0KKyAgdm9pZCBNYWtlRG9jdW1lbnQoY29uc3QgQWlkbExvY2F0aW9uJiBsb2NhdGlvbiwgY29uc3QgQ29tbWVudHMmIGNvbW1lbnRzLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gaW1wb3J0cywKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFpZGxEZWZpbmVkVHlwZT4+IGRlZmluZWRfdHlwZXMpOwogCiAgcHJpdmF0ZToKLSAgZXhwbGljaXQgUGFyc2VyKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwgc3RkOjpzdHJpbmcmIHJhd19idWZmZXIsCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOjphaWRsOjpBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMpOworICBleHBsaWNpdCBQYXJzZXIoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLCBzdGQ6OnN0cmluZyYgcmF3X2J1ZmZlciwgYm9vbCBpc19wcmVwcm9jZXNzZWQpOwogCiAgIHN0ZDo6c3RyaW5nIGZpbGVuYW1lXzsKKyAgYm9vbCBpc19wcmVwcm9jZXNzZWRfOwogICBzdGQ6OnN0cmluZyBwYWNrYWdlXzsKLSAgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzXzsKLQogICB2b2lkKiBzY2FubmVyXyA9IG51bGxwdHI7CiAgIFlZX0JVRkZFUl9TVEFURSBidWZmZXJfOwogICBpbnQgZXJyb3JfID0gMDsKIAotICB2ZWN0b3I8QWlkbFR5cGVTcGVjaWZpZXIqPiB1bnJlc29sdmVkX3R5cGVzcGVjc187Ci0gIGNvbnN0IEFpZGxEb2N1bWVudCogZG9jdW1lbnRfOworICBzdGQ6OnVuaXF1ZV9wdHI8QWlkbERvY3VtZW50PiBkb2N1bWVudF87CiB9OwpkaWZmIC0tZ2l0IGEvcGVybWlzc2lvbi5jcHAgYi9wZXJtaXNzaW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjczMGRhCi0tLSAvZGV2L251bGwKKysrIGIvcGVybWlzc2lvbi5jcHAKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJwZXJtaXNzaW9uLmgiCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2YXJpYW50PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBwZXJtIHsKKworc3RkOjpzdHJpbmcgQXNKYXZhQW5ub3RhdGlvbihjb25zdCBFeHByZXNzaW9uJiBleHByKSB7CisgIGlmIChjb25zdCBhdXRvJiBzID0gc3RkOjpnZXRfaWY8c3RkOjpzdHJpbmc+KCZleHByKTsgcykgeworICAgIHJldHVybiBKYXZhRnVsbE5hbWUoKnMpOworICB9CisgIGlmIChjb25zdCBhdXRvJiBhbGwgPSBzdGQ6OmdldF9pZjxBbGxPZj4oJmV4cHIpOyBhbGwpIHsKKyAgICByZXR1cm4gYWxsLT5KYXZhQW5ub3RhdGlvbigpOworICB9CisgIGlmIChjb25zdCBhdXRvJiBhbnkgPSBzdGQ6OmdldF9pZjxBbnlPZj4oJmV4cHIpOyBhbnkpIHsKKyAgICByZXR1cm4gYW55LT5KYXZhQW5ub3RhdGlvbigpOworICB9CisgIHJldHVybiAiIjsKK30KKworc3RkOjpzdHJpbmcgSmF2YUZ1bGxOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBwZXJtaXNzaW9uKSB7CisgIGlmIChwZXJtaXNzaW9uLmZpbmQoJy4nKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgIHJldHVybiAiYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLiIgKyBwZXJtaXNzaW9uOworICB9CisgIHJldHVybiBwZXJtaXNzaW9uOworfQorCit9ICAvLyBuYW1lc3BhY2UgcGVybQorfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9wZXJtaXNzaW9uLmggYi9wZXJtaXNzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkwYTAwYwotLS0gL2Rldi9udWxsCisrKyBiL3Blcm1pc3Npb24uaApAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZhcmlhbnQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3MuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHBlcm0geworCitzdHJ1Y3QgQW55T2Y7CitzdHJ1Y3QgQWxsT2Y7CisKK3R5cGVkZWYgc3RkOjp2YXJpYW50PHN0ZDo6c3RyaW5nLCBBbnlPZiwgQWxsT2Y+IEV4cHJlc3Npb247CitzdGQ6OnN0cmluZyBBc0phdmFBbm5vdGF0aW9uKGNvbnN0IEV4cHJlc3Npb24mIGV4cHIpOworc3RkOjpzdHJpbmcgSmF2YUZ1bGxOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBwZXJtaXNzaW9uKTsKKworc3RydWN0IEFueU9mIHsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG9wZXJhbmRzOworCisgIHN0ZDo6c3RyaW5nIEphdmFBbm5vdGF0aW9uKCkgY29uc3QgeworICAgIHN0ZDo6c3RyaW5nIHJldCgiYW55T2YgPSB7Iik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvcGVyYW5kcy5zaXplKCk7IGkrKykgeworICAgICAgcmV0ICs9IGFuZHJvaWQ6OmFpZGw6OnBlcm06OkphdmFGdWxsTmFtZShvcGVyYW5kc1tpXSk7CisgICAgICBpZiAoaSAhPSBvcGVyYW5kcy5zaXplKCkgLSAxKSB7CisgICAgICAgIHJldCArPSAiLCAiOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0ICsgIn0iOworICB9Cit9OworCitzdHJ1Y3QgQWxsT2YgeworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gb3BlcmFuZHM7CisKKyAgc3RkOjpzdHJpbmcgSmF2YUFubm90YXRpb24oKSBjb25zdCB7CisgICAgc3RkOjpzdHJpbmcgcmV0KCJhbGxPZiA9IHsiKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG9wZXJhbmRzLnNpemUoKTsgaSsrKSB7CisgICAgICByZXQgKz0gYW5kcm9pZDo6YWlkbDo6cGVybTo6SmF2YUZ1bGxOYW1lKG9wZXJhbmRzW2ldKTsKKyAgICAgIGlmIChpICE9IG9wZXJhbmRzLnNpemUoKSAtIDEpIHsKKyAgICAgICAgcmV0ICs9ICIsICI7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXQgKyAifSI7CisgIH0KK307CisKKworCit9ICAvLyBuYW1lc3BhY2UgcGVybQorfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9wcmVwcm9jZXNzLmNwcCBiL3ByZXByb2Nlc3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMzJmMmUKLS0tIC9kZXYvbnVsbAorKysgYi9wcmVwcm9jZXNzLmNwcApAQCAtMCwwICsxLDE1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJwcmVwcm9jZXNzLmgiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncy5oPgorCisjaW5jbHVkZSAiYWlkbC5oIgorCit1c2luZyBhbmRyb2lkOjpiYXNlOjpKb2luOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CisKK25hbWVzcGFjZSB7CisvLyBQcmVwcm9jZXNzVmlzaXRvciBlbWl0cworLy8gLSB0eXBlcyBpbmNsdWRpbmcgY29tbWVudHMoaGlkZS9kZXByZWNhdGVkKSBhbmQgYW5ub3RhdGlvbnMKKy8vIC0gY29uc3RhbnQgZGVsY2FyYXRpb25zIGZvciBpbnRlcmZhY2UvcGFyY2VsYWJsZS91bmlvbnMKKy8vIC0gZW51bWVyYXRvcnMgZm9yIGVudW1zCitzdHJ1Y3QgUHJlcHJvY2Vzc1Zpc2l0b3IgOiBBaWRsVmlzaXRvciB7CisgIENvZGVXcml0ZXImIG91dDsKKyAgUHJlcHJvY2Vzc1Zpc2l0b3IoQ29kZVdyaXRlciYgb3V0KSA6IG91dChvdXQpIHt9CisKKyAgdm9pZCBEdW1wVHlwZShjb25zdCBBaWRsRGVmaW5lZFR5cGUmIGR0LCBjb25zdCBzdHJpbmcmIHR5cGUpIHsKKyAgICBEdW1wQ29tbWVudHMoZHQpOworICAgIER1bXBBbm5vdGF0aW9ucyhkdCk7CisgICAgLy8gVG9wLWxldmVsIGRlZmluaXRpb24gZW1pdHMgY2Fub25pY2FsIG5hbWUgd2hpbGUgbmVzdGVkIHR5cGUgZW1pdHMgIm5hbWUiIG9ubHkuCisgICAgaWYgKGR0LkdldFBhcmVudFR5cGUoKSkgeworICAgICAgb3V0IDw8IHR5cGUgPDwgIiAiIDw8IGR0LkdldE5hbWUoKTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IHR5cGUgPDwgIiAiIDw8IGR0LkdldENhbm9uaWNhbE5hbWUoKTsKKyAgICB9CisgICAgaWYgKGF1dG8gZ2VuZXJpY190eXBlID0gZHQuQXNQYXJhbWV0ZXJpemFibGUoKTsgZ2VuZXJpY190eXBlICYmIGdlbmVyaWNfdHlwZS0+SXNHZW5lcmljKCkpIHsKKyAgICAgIG91dCA8PCAiPCIgPDwgSm9pbihnZW5lcmljX3R5cGUtPkdldFR5cGVQYXJhbWV0ZXJzKCksICIsICIpIDw8ICI+IjsKKyAgICB9CisgIH0KKyAgdm9pZCBEdW1wTWVtYmVycyhjb25zdCBBaWRsRGVmaW5lZFR5cGUmIGR0KSB7CisgICAgb3V0IDw8ICIge1xuIjsKKyAgICBvdXQuSW5kZW50KCk7CisgICAgZm9yIChjb25zdCBhdXRvJiBjb25zdGRlY2wgOiBkdC5HZXRDb25zdGFudERlY2xhcmF0aW9ucygpKSB7CisgICAgICBjb25zdGRlY2wtPkRpc3BhdGNoVmlzaXQoKnRoaXMpOworICAgIH0KKyAgICBmb3IgKGNvbnN0IGF1dG8mIG5lc3RlZCA6IGR0LkdldE5lc3RlZFR5cGVzKCkpIHsKKyAgICAgIG5lc3RlZC0+RGlzcGF0Y2hWaXNpdCgqdGhpcyk7CisgICAgfQorICAgIG91dC5EZWRlbnQoKTsKKyAgICBvdXQgPDwgIn1cbiI7CisgIH0KKyAgdm9pZCBEdW1wQ29tbWVudHMoY29uc3QgQWlkbENvbW1lbnRhYmxlJiBjKSB7CisgICAgY29uc3QgYXV0byBoaWRkZW4gPSBjLklzSGlkZGVuKCk7CisgICAgY29uc3QgYXV0byBkZXByZWNhdGVkID0gRmluZERlcHJlY2F0ZWQoYy5HZXRDb21tZW50cygpKTsKKyAgICBpZiAoaGlkZGVuIHx8IGRlcHJlY2F0ZWQpIHsKKyAgICAgIG91dCA8PCAiLyoqXG4iOworICAgICAgaWYgKGhpZGRlbikgeworICAgICAgICBvdXQgPDwgIiAqIEBoaWRlXG4iOworICAgICAgfQorICAgICAgaWYgKGRlcHJlY2F0ZWQpIHsKKyAgICAgICAgb3V0IDw8ICIgKiBAZGVwcmVjYXRlZCAiIDw8IGRlcHJlY2F0ZWQtPm5vdGUgPDwgIlxuIjsKKyAgICAgIH0KKyAgICAgIG91dCA8PCAiICovXG4iOworICAgIH0KKyAgfQorICB2b2lkIER1bXBBbm5vdGF0aW9ucyhjb25zdCBBaWRsQW5ub3RhdGFibGUmIGEpIHsKKyAgICBhdXRvIGFubm90YXRpb25zID0gYS5Ub1N0cmluZygpOworICAgIGlmICghYW5ub3RhdGlvbnMuZW1wdHkoKSkgeworICAgICAgb3V0IDw8IGFubm90YXRpb25zIDw8ICJcbiI7CisgICAgfQorICB9CisgIHZvaWQgRHVtcENvbnN0YW50VmFsdWUoY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHR5cGUsIGNvbnN0IEFpZGxDb25zdGFudFZhbHVlJiBjKSB7CisgICAgb3V0IDw8IGMuVmFsdWVTdHJpbmcodHlwZSwgQWlkbENvbnN0YW50VmFsdWVEZWNvcmF0b3IpOworICB9CisgIHZvaWQgVmlzaXQoY29uc3QgQWlkbEludGVyZmFjZSYgdCkgb3ZlcnJpZGUgeworICAgIER1bXBUeXBlKHQsICJpbnRlcmZhY2UiKTsKKyAgICBEdW1wTWVtYmVycyh0KTsKKyAgfQorICB2b2lkIFZpc2l0KGNvbnN0IEFpZGxQYXJjZWxhYmxlJiB0KSBvdmVycmlkZSB7CisgICAgRHVtcFR5cGUodCwgInBhcmNlbGFibGUiKTsKKyAgICBpZiAoY29uc3QgYXV0byYgY3BwX2hlYWRlciA9IHQuR2V0Q3BwSGVhZGVyKCk7ICFjcHBfaGVhZGVyLmVtcHR5KCkpIHsKKyAgICAgIG91dCA8PCAiIGNwcF9oZWFkZXIgIiA8PCBjcHBfaGVhZGVyOworICAgIH0KKyAgICBvdXQgPDwgIjtcbiI7CisgIH0KKyAgdm9pZCBWaXNpdChjb25zdCBBaWRsU3RydWN0dXJlZFBhcmNlbGFibGUmIHQpIG92ZXJyaWRlIHsKKyAgICBEdW1wVHlwZSh0LCAicGFyY2VsYWJsZSIpOworICAgIER1bXBNZW1iZXJzKHQpOworICB9CisgIHZvaWQgVmlzaXQoY29uc3QgQWlkbFVuaW9uRGVjbCYgdCkgb3ZlcnJpZGUgeworICAgIER1bXBUeXBlKHQsICJ1bmlvbiIpOworICAgIER1bXBNZW1iZXJzKHQpOworICB9CisgIHZvaWQgVmlzaXQoY29uc3QgQWlkbEVudW1EZWNsYXJhdGlvbiYgdCkgb3ZlcnJpZGUgeworICAgIER1bXBUeXBlKHQsICJlbnVtIik7CisgICAgb3V0IDw8ICIge1xuIjsKKyAgICBvdXQuSW5kZW50KCk7CisgICAgZm9yIChjb25zdCBhdXRvJiBlIDogdC5HZXRFbnVtZXJhdG9ycygpKSB7CisgICAgICBvdXQgPDwgZS0+R2V0TmFtZSgpIDw8ICIgPSAiOworICAgICAgRHVtcENvbnN0YW50VmFsdWUodC5HZXRCYWNraW5nVHlwZSgpLCAqZS0+R2V0VmFsdWUoKSk7CisgICAgICBvdXQgPDwgIixcbiI7CisgICAgfQorICAgIG91dC5EZWRlbnQoKTsKKyAgICBvdXQgPDwgIn1cbiI7CisgIH0KKyAgdm9pZCBWaXNpdChjb25zdCBBaWRsQ29uc3RhbnREZWNsYXJhdGlvbiYgYykgb3ZlcnJpZGUgeworICAgIER1bXBDb21tZW50cyhjKTsKKyAgICBvdXQgPDwgImNvbnN0ICI7CisgICAgVmlzaXQoYy5HZXRUeXBlKCkpOworICAgIG91dCA8PCAiICIgPDwgYy5HZXROYW1lKCkgPDwgIiA9ICI7CisgICAgRHVtcENvbnN0YW50VmFsdWUoYy5HZXRUeXBlKCksIGMuR2V0VmFsdWUoKSk7CisgICAgb3V0IDw8ICI7XG4iOworICB9CisgIHZvaWQgVmlzaXQoY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHQpIG92ZXJyaWRlIHsgb3V0IDw8IHQuVG9TdHJpbmcoKTsgfQorfTsKKworfSAgLy8gbmFtZXNwYWNlCisKK2Jvb2wgUHJlcHJvY2Vzcyhjb25zdCBPcHRpb25zJiBvcHRpb25zLCBjb25zdCBJb0RlbGVnYXRlJiBpb19kZWxlZ2F0ZSkgeworICB1bmlxdWVfcHRyPENvZGVXcml0ZXI+IHdyaXRlciA9IGlvX2RlbGVnYXRlLkdldENvZGVXcml0ZXIob3B0aW9ucy5PdXRwdXRGaWxlKCkpOworICBQcmVwcm9jZXNzVmlzaXRvciB2aXNpdG9yKCp3cml0ZXIpOworCisgIGZvciAoY29uc3QgYXV0byYgZmlsZSA6IG9wdGlvbnMuSW5wdXRGaWxlcygpKSB7CisgICAgQWlkbFR5cGVuYW1lcyB0eXBlbmFtZXM7CisgICAgYXV0byByZXN1bHQgPQorICAgICAgICBpbnRlcm5hbHM6OmxvYWRfYW5kX3ZhbGlkYXRlX2FpZGwoZmlsZSwgb3B0aW9ucywgaW9fZGVsZWdhdGUsICZ0eXBlbmFtZXMsIG51bGxwdHIpOworICAgIGlmIChyZXN1bHQgPT0gQWlkbEVycm9yOjpPSykgeworICAgICAgY29uc3QgYXV0byYgZG9jID0gdHlwZW5hbWVzLk1haW5Eb2N1bWVudCgpOworICAgICAgZm9yIChjb25zdCBhdXRvJiB0IDogZG9jLkRlZmluZWRUeXBlcygpKSB7CisgICAgICAgIHQtPkRpc3BhdGNoVmlzaXQodmlzaXRvcik7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICByZXR1cm4gd3JpdGVyLT5DbG9zZSgpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwcm9jZXNzLmggYi9wcmVwcm9jZXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDczNGE2OAotLS0gL2Rldi9udWxsCisrKyBiL3ByZXByb2Nlc3MuaApAQCAtMCwwICsxLDI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhaWRsX2xhbmd1YWdlLmgiCisjaW5jbHVkZSAiY29kZV93cml0ZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworCitib29sIFByZXByb2Nlc3MoY29uc3QgT3B0aW9ucyYgb3B0aW9ucywgY29uc3QgSW9EZWxlZ2F0ZSYgaW9fZGVsZWdhdGUpOworCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3J1bl9pbnRlZ3JhdGlvbl90ZXN0cy5zaCBiL3J1bl9pbnRlZ3JhdGlvbl90ZXN0cy5zaAppbmRleCAxY2ZkMWMxLi5hNDIzYTNlIDEwMDc1NQotLS0gYS9ydW5faW50ZWdyYXRpb25fdGVzdHMuc2gKKysrIGIvcnVuX2ludGVncmF0aW9uX3Rlc3RzLnNoCkBAIC0zMyw1ICszMywxNyBAQAogYWRiIHB1c2ggXAogICAgICR7QU5EUk9JRF9QUk9EVUNUX09VVH0vdGVzdGNhc2VzL2FpZGxfdGVzdF9qYXZhX2NsaWVudC8qL2FpZGxfdGVzdF9qYXZhX2NsaWVudC5qYXIgXAogICAgIC9kYXRhL2ZyYW1ld29yay9haWRsX3Rlc3RfamF2YV9jbGllbnQuamFyCithZGIgcHVzaCBcCisgICAgJHtBTkRST0lEX1BST0RVQ1RfT1VUfS90ZXN0Y2FzZXMvYWlkbF90ZXN0X2phdmFfc2VydmljZV9zZGsyOS8qL2FpZGxfdGVzdF9qYXZhX3NlcnZpY2Vfc2RrMjkuamFyIFwKKyAgICAvZGF0YS9mcmFtZXdvcmsvYWlkbF90ZXN0X2phdmFfc2VydmljZV9zZGsyOS5qYXIKK2FkYiBwdXNoIFwKKyAgICAke0FORFJPSURfUFJPRFVDVF9PVVR9L3Rlc3RjYXNlcy9haWRsX3Rlc3RfamF2YV9jbGllbnRfc2RrMjkvKi9haWRsX3Rlc3RfamF2YV9jbGllbnRfc2RrMjkuamFyIFwKKyAgICAvZGF0YS9mcmFtZXdvcmsvYWlkbF90ZXN0X2phdmFfY2xpZW50X3NkazI5LmphcgorYWRiIHB1c2ggXAorICAgICR7QU5EUk9JRF9QUk9EVUNUX09VVH0vdGVzdGNhc2VzL2FpZGxfdGVzdF9qYXZhX3NlcnZpY2Vfc2RrMS8qL2FpZGxfdGVzdF9qYXZhX3NlcnZpY2Vfc2RrMS5qYXIgXAorICAgIC9kYXRhL2ZyYW1ld29yay9haWRsX3Rlc3RfamF2YV9zZXJ2aWNlX3NkazEuamFyCithZGIgcHVzaCBcCisgICAgJHtBTkRST0lEX1BST0RVQ1RfT1VUfS90ZXN0Y2FzZXMvYWlkbF90ZXN0X2phdmFfY2xpZW50X3NkazEvKi9haWRsX3Rlc3RfamF2YV9jbGllbnRfc2RrMS5qYXIgXAorICAgIC9kYXRhL2ZyYW1ld29yay9haWRsX3Rlc3RfamF2YV9jbGllbnRfc2RrMS5qYXIKIAogJHtBTkRST0lEX0JVSUxEX1RPUH0vc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYWlkbF9pbnRlZ3JhdGlvbl90ZXN0LnB5CmRpZmYgLS1naXQgYS9ydXN0Zm10LnRvbWwgYi9ydXN0Zm10LnRvbWwKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNDc1YmE4ZgotLS0gL2Rldi9udWxsCisrKyBiL3J1c3RmbXQudG9tbApAQCAtMCwwICsxIEBACisuLi8uLi8uLi9idWlsZC9zb29uZy9zY3JpcHRzL3J1c3RmbXQudG9tbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2FpZGxfaW50ZWdyYXRpb25fdGVzdC5weSBiL3Rlc3RzL2FpZGxfaW50ZWdyYXRpb25fdGVzdC5weQppbmRleCBjYTc2N2Y0Li41ZjA4NmRhIDEwMDc1NQotLS0gYS90ZXN0cy9haWRsX2ludGVncmF0aW9uX3Rlc3QucHkKKysrIGIvdGVzdHMvYWlkbF9pbnRlZ3JhdGlvbl90ZXN0LnB5CkBAIC0xLDUgKzEsNiBAQAogIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwogCitmcm9tIGl0ZXJ0b29scyBpbXBvcnQgcHJvZHVjdAogaW1wb3J0IHBpcGVzCiBpbXBvcnQgcmUKIGltcG9ydCBzdWJwcm9jZXNzCkBAIC0xNTksNiArMTYwLDM4IEBACiAgICAgICAgIGlmIHJlLnNlYXJjaChJTlNUUlVNRU5UQVRJT05fU1VDQ0VTU19QQVRURVJOLCByZXN1bHQuc3Rkb3V0KSBpcyBOb25lOgogICAgICAgICAgICAgcmFpc2UgVGVzdEZhaWwocmVzdWx0LnN0ZG91dCkKIAorY2xhc3MgSmF2YVZlcnNpb25UZXN0Q2xpZW50OgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0LCBiaXRuZXNzLCB2ZXIpOgorICAgICAgICBzZWxmLm5hbWUgPSAiamF2YV9jbGllbnRfc2RrJWRfJXMiICUgKHZlciwgcHJldHR5X2JpdG5lc3MoYml0bmVzcykpCisgICAgICAgIHNlbGYuaG9zdCA9IGhvc3QKKyAgICAgICAgc2VsZi5iaXRuZXNzID0gYml0bmVzcworICAgICAgICBzZWxmLnZlciA9IHZlcgorICAgIGRlZiBjbGVhbnVwKHNlbGYpOgorICAgICAgICBzZWxmLmhvc3QucnVuKCdraWxsYWxsICcgKyBBUFBfUFJPQ0VTU19GT1JfUFJFVFRZX0JJVE5FU1MgJSBwcmV0dHlfYml0bmVzcyhzZWxmLmJpdG5lc3MpLAorICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZV9zdGF0dXM9VHJ1ZSkKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICByZXN1bHQgPSBzZWxmLmhvc3QucnVuKCdDTEFTU1BBVEg9L2RhdGEvZnJhbWV3b3JrL2FpZGxfdGVzdF9qYXZhX2NsaWVudF9zZGslZC5qYXIgJyAlIHNlbGYudmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBBUFBfUFJPQ0VTU19GT1JfUFJFVFRZX0JJVE5FU1MgJSBwcmV0dHlfYml0bmVzcyhzZWxmLmJpdG5lc3MpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIC9kYXRhL2ZyYW1ld29yayBhbmRyb2lkLmFpZGwuc2RrdmVyc2lvbi50ZXN0cy5BaWRsSmF2YVZlcnNpb25UZXN0cycpCisgICAgICAgIHByaW50KHJlc3VsdC5wcmludGFibGVfc3RyaW5nKCkpCisgICAgICAgIGlmIHJlLnNlYXJjaChJTlNUUlVNRU5UQVRJT05fU1VDQ0VTU19QQVRURVJOLCByZXN1bHQuc3Rkb3V0KSBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgVGVzdEZhaWwocmVzdWx0LnN0ZG91dCkKKworY2xhc3MgSmF2YVZlcnNpb25UZXN0U2VydmVyOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0LCBiaXRuZXNzLCB2ZXIpOgorICAgICAgICBzZWxmLm5hbWUgPSAiamF2YV9zZXJ2ZXJfc2RrJXNfJXMiICUgKHZlciwgcHJldHR5X2JpdG5lc3MoYml0bmVzcykpCisgICAgICAgIHNlbGYuaG9zdCA9IGhvc3QKKyAgICAgICAgc2VsZi5iaXRuZXNzID0gYml0bmVzcworICAgICAgICBzZWxmLnZlciA9IHZlcgorICAgIGRlZiBjbGVhbnVwKHNlbGYpOgorICAgICAgICBzZWxmLmhvc3QucnVuKCdraWxsYWxsICcgKyBBUFBfUFJPQ0VTU19GT1JfUFJFVFRZX0JJVE5FU1MgJSBwcmV0dHlfYml0bmVzcyhzZWxmLmJpdG5lc3MpLAorICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZV9zdGF0dXM9VHJ1ZSkKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5ob3N0LnJ1bignQ0xBU1NQQVRIPS9kYXRhL2ZyYW1ld29yay9haWRsX3Rlc3RfamF2YV9zZXJ2aWNlX3NkayVkLmphciAnICUgc2VsZi52ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBBUFBfUFJPQ0VTU19GT1JfUFJFVFRZX0JJVE5FU1MgJSBwcmV0dHlfYml0bmVzcyhzZWxmLmJpdG5lc3MpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAvZGF0YS9mcmFtZXdvcmsgYW5kcm9pZC5haWRsLnNka3ZlcnNpb24uc2VydmljZS5BaWRsSmF2YVZlcnNpb25UZXN0U2VydmljZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ9VHJ1ZSkKKwogZGVmIGdldHByb3AoaG9zdCwgcHJvcCk6CiAgICAgcmV0dXJuIGhvc3QucnVuKCdnZXRwcm9wICIlcyInICUgcHJvcCkuc3Rkb3V0LnN0cmlwKCkKIApAQCAtMTg1LDYgKzIxOCwxNiBAQAogICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgIHJldHVybiBzZWxmLmhvc3QucnVuKHNlbGYuYmluYXJ5LCBiYWNrZ3JvdW5kPVRydWUpCiAKK2NsYXNzIFJ1c3RBc3luY1NlcnZlcjoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaG9zdCwgYml0bmVzcyk6CisgICAgICAgIHNlbGYubmFtZSA9ICIlc19iaXRfcnVzdF9zZXJ2ZXJfYXN5bmMiICUgcHJldHR5X2JpdG5lc3MoYml0bmVzcykKKyAgICAgICAgc2VsZi5ob3N0ID0gaG9zdAorICAgICAgICBzZWxmLmJpbmFyeSA9IFJVU1RfVEVTVF9TRVJWSUNFX0ZPUl9CSVRORVNTICUgYml0bmVzcworICAgIGRlZiBjbGVhbnVwKHNlbGYpOgorICAgICAgICBzZWxmLmhvc3QucnVuKCdraWxsYWxsICVzJyAlIHNlbGYuYmluYXJ5LCBpZ25vcmVfc3RhdHVzPVRydWUpCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuaG9zdC5ydW4oc2VsZi5iaW5hcnksIGJhY2tncm91bmQ9VHJ1ZSkKKwogZGVmIHN1cHBvcnRlZF9iaXRuZXNzZXMoaG9zdCk6CiAgICAgYml0bmVzc2VzID0gW10KICAgICBpZiBnZXRwcm9wKGhvc3QsICJyby5wcm9kdWN0LmNwdS5hYmlsaXN0MzIiKSAhPSAiIjoKQEAgLTIwOSw2ICsyNTIsMTEgQEAKICAgICAgICAgICAgIHNlcnZlci5jbGVhbnVwKCkKICAgICByZXR1cm4gdGVzdAogCitkZWYgYWRkX3Rlc3QoY2xpZW50LCBzZXJ2ZXIpOgorICAgIHRlc3RfbmFtZSA9ICd0ZXN0XyVzX3RvXyVzJyAlIChjbGllbnQubmFtZSwgc2VydmVyLm5hbWUpCisgICAgdGVzdCA9IG1ha2VfdGVzdChjbGllbnQsIHNlcnZlcikKKyAgICBzZXRhdHRyKFRlc3RBaWRsLCB0ZXN0X25hbWUsIHRlc3QpCisKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgaG9zdCA9IEFkYkhvc3QoKQogICAgIGJpdG5lc3NlcyA9IHN1cHBvcnRlZF9iaXRuZXNzZXMoaG9zdCkKQEAgLTIzMCwxMiArMjc4LDE5IEBACiAKICAgICAgICAgY2xpZW50cyArPSBbUnVzdENsaWVudChob3N0LCBiaXRuZXNzKV0KICAgICAgICAgc2VydmVycyArPSBbUnVzdFNlcnZlcihob3N0LCBiaXRuZXNzKV0KKyAgICAgICAgc2VydmVycyArPSBbUnVzdEFzeW5jU2VydmVyKGhvc3QsIGJpdG5lc3MpXQogCiAgICAgZm9yIGNsaWVudCBpbiBjbGllbnRzOgogICAgICAgICBmb3Igc2VydmVyIGluIHNlcnZlcnM6Ci0gICAgICAgICAgICB0ZXN0X25hbWUgPSAndGVzdF8lc190b18lcycgJSAoY2xpZW50Lm5hbWUsIHNlcnZlci5uYW1lKQotICAgICAgICAgICAgdGVzdCA9IG1ha2VfdGVzdChjbGllbnQsIHNlcnZlcikKLSAgICAgICAgICAgIHNldGF0dHIoVGVzdEFpZGwsIHRlc3RfbmFtZSwgdGVzdCkKKyAgICAgICAgICAgIGFkZF90ZXN0KGNsaWVudCwgc2VydmVyKQorCisgICAgIyBib29sZWFuOiA+PSAyOQorICAgICMgdHlwZWQ6ICAgPj0gMjMKKyAgICB2ZXJzaW9ucyA9IFsxLCAyOV0KKyAgICBmb3IgY192ZXJzaW9uLCBjX2JpdG5lc3MsIHNfdmVyc2lvbiwgc19iaXRuZXNzIGluIHByb2R1Y3QodmVyc2lvbnMsIGJpdG5lc3NlcywgcmVwZWF0PTIpOgorICAgICAgICBjbGllbnQgPSBKYXZhVmVyc2lvblRlc3RDbGllbnQoaG9zdCwgY19iaXRuZXNzLCBjX3ZlcnNpb24pCisgICAgICAgIHNlcnZlciA9IEphdmFWZXJzaW9uVGVzdFNlcnZlcihob3N0LCBzX2JpdG5lc3MsIHNfdmVyc2lvbikKKyAgICAgICAgYWRkX3Rlc3QoY2xpZW50LCBzZXJ2ZXIpCiAKICAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKS5sb2FkVGVzdHNGcm9tVGVzdENhc2UoVGVzdEFpZGwpCiAgICAgc3lzLmV4aXQobm90IHVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKHZlcmJvc2l0eT0yKS5ydW4oc3VpdGUpLndhc1N1Y2Nlc3NmdWwoKSkKZGlmZiAtLWdpdCBhL3Rlc3RzL2FpZGxfaW50ZWdyYXRpb25fdGVzdC54bWwgYi90ZXN0cy9haWRsX2ludGVncmF0aW9uX3Rlc3QueG1sCmluZGV4IDZmNGY2ODYuLjRlNTZlMzAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2FpZGxfaW50ZWdyYXRpb25fdGVzdC54bWwKKysrIGIvdGVzdHMvYWlkbF9pbnRlZ3JhdGlvbl90ZXN0LnhtbApAQCAtNDEsNiArNDEsMTIgQEAKICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9ImFpZGxfdGVzdF9qYXZhX2NsaWVudC5qYXItPi9kYXRhL2ZyYW1ld29yay9haWRsX3Rlc3RfamF2YV9jbGllbnQuamFyIiAvPgogICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iYWlkbF90ZXN0X2phdmFfc2VydmljZS5qYXItPi9kYXRhL2ZyYW1ld29yay9haWRsX3Rlc3RfamF2YV9zZXJ2aWNlLmphciIgLz4KIAorICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iYWlkbF90ZXN0X2phdmFfY2xpZW50X3NkazI5Lmphci0+L2RhdGEvZnJhbWV3b3JrL2FpZGxfdGVzdF9qYXZhX2NsaWVudF9zZGsyOS5qYXIiIC8+CisgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJhaWRsX3Rlc3RfamF2YV9zZXJ2aWNlX3NkazI5Lmphci0+L2RhdGEvZnJhbWV3b3JrL2FpZGxfdGVzdF9qYXZhX3NlcnZpY2Vfc2RrMjkuamFyIiAvPgorCisgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJhaWRsX3Rlc3RfamF2YV9jbGllbnRfc2RrMS5qYXItPi9kYXRhL2ZyYW1ld29yay9haWRsX3Rlc3RfamF2YV9jbGllbnRfc2RrMS5qYXIiIC8+CisgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJhaWRsX3Rlc3RfamF2YV9zZXJ2aWNlX3NkazEuamFyLT4vZGF0YS9mcmFtZXdvcmsvYWlkbF90ZXN0X2phdmFfc2VydmljZV9zZGsxLmphciIgLz4KKwogICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwIiB2YWx1ZT0idHJ1ZSIgLz4KICAgICA8L3RhcmdldF9wcmVwYXJlcj4KIApkaWZmIC0tZ2l0IGEvdGVzdHMvYWlkbF9wYXJzZXJfZnV6emVyLmNwcCBiL3Rlc3RzL2FpZGxfcGFyc2VyX2Z1enplci5jcHAKaW5kZXggY2JhZTE4NC4uNGUzN2IzMSAxMDA2NDQKLS0tIGEvdGVzdHMvYWlkbF9wYXJzZXJfZnV6emVyLmNwcAorKysgYi90ZXN0cy9haWRsX3BhcnNlcl9mdXp6ZXIuY3BwCkBAIC0yOSw3ICsyOSwzMCBAQAogCiB1c2luZyBhbmRyb2lkOjphaWRsOjp0ZXN0OjpGYWtlSW9EZWxlZ2F0ZTsKIAotdm9pZCBmdXp6KGNvbnN0IEZha2VJb0RlbGVnYXRlJiBpbywgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBhcmdzKSB7CitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgIGlmIChzaXplIDw9IDEpIHJldHVybiAwOyAgLy8gbm8gdXNlCisKKyAgLy8gYi8xNDU0NDc1NDAsIGxhcmdlIG5lc3RlZCBleHByZXNzaW9ucyBzb21ldGltZXMgaGl0IHRoZSBzdGFjayBkZXB0aCBsaW1pdC4KKyAgLy8gRnV6emluZyB0aGluZ3Mgb2YgdGhpcyBzaXplIGRvbid0IHByb3ZpZGUgYW55IGFkZGl0aW9uYWwgbWVhbmluZ2Z1bAorICAvLyBjb3ZlcmFnZS4gVGhpcyBpcyBhbiBhcHByb3hpbWF0ZSB2YWx1ZSB3aGljaCBzaG91bGQgYWxsb3cgdXMgdG8gZXhwbG9yZSBhbGwKKyAgLy8gb2YgdGhlIGxhbmd1YWdlIHcvbyBoaXR0aW5nIGEgc3RhY2sgb3ZlcmZsb3cuCisgIGlmIChzaXplID4gMjAwMCkgcmV0dXJuIDA7CisKKyAgRnV6emVkRGF0YVByb3ZpZGVyIHByb3ZpZGVyID0gRnV6emVkRGF0YVByb3ZpZGVyKGRhdGEsIHNpemUpOworICBGYWtlSW9EZWxlZ2F0ZSBpbzsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGFyZ3M7CisKKyAgc2l6ZV90IG51bUFyZ3MgPSBwcm92aWRlci5Db25zdW1lSW50ZWdyYWxJblJhbmdlKDAsIDIwKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1BcmdzOyBpKyspIHsKKyAgICBhcmdzLmVtcGxhY2VfYmFjayhwcm92aWRlci5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKCkpOworICB9CisKKyAgd2hpbGUgKHByb3ZpZGVyLnJlbWFpbmluZ19ieXRlcygpID4gMCkgeworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG5hbWUgPSBwcm92aWRlci5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKCk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgY29udGVudHMgPSBwcm92aWRlci5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKCk7CisgICAgaW8uU2V0RmlsZUNvbnRlbnRzKG5hbWUsIGNvbnRlbnRzKTsKKyAgfQorCiAgIGlmIChrRnV6ekxvZykgewogICAgIHN0ZDo6Y291dCA8PCAiY21kOiAiOwogICAgIGZvciAoY29uc3Qgc3RkOjpzdHJpbmcmIGFyZyA6IGFyZ3MpIHsKQEAgLTQzLDcxICs2NiwxNiBAQAogICB9CiAKICAgaW50IHJldCA9IGFuZHJvaWQ6OmFpZGw6OmFpZGxfZW50cnkoT3B0aW9uczo6RnJvbShhcmdzKSwgaW8pOwotICBpZiAocmV0ICE9IDApIHJldHVybjsKIAogICBpZiAoa0Z1enpMb2cpIHsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIFtmLCBvdXRwdXRdIDogaW8uT3V0cHV0RmlsZXMoKSkgewotICAgICAgc3RkOjpjb3V0IDw8ICJPVVRQVVQgIiA8PCBmIDw8ICI6ICIgPDwgc3RkOjplbmRsOwotICAgICAgc3RkOjpjb3V0IDw8IG91dHB1dCA8PCBzdGQ6OmVuZGw7CisgICAgc3RkOjpjb3V0IDw8ICJSRVQ6ICIgPDwgcmV0IDw8IHN0ZDo6ZW5kbDsKKyAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgIGZvciAoY29uc3QgYXV0byYgW2YsIG91dHB1dF0gOiBpby5PdXRwdXRGaWxlcygpKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiT1VUUFVUICIgPDwgZiA8PCAiOiAiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgc3RkOjpjb3V0IDw8IG91dHB1dCA8PCBzdGQ6OmVuZGw7CisgICAgICB9CiAgICAgfQogICB9Ci19Ci0KLXZvaWQgZnV6ekxhbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGxhbmdPcHQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBjb250ZW50KSB7Ci0gIEZha2VJb0RlbGVnYXRlIGlvOwotICBpby5TZXRGaWxlQ29udGVudHMoImEvcGF0aC9Gb28uYWlkbCIsIGNvbnRlbnQpOwotCi0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBhcmdzOwotICBhcmdzLmVtcGxhY2VfYmFjaygiYWlkbCIpOwotICBhcmdzLmVtcGxhY2VfYmFjaygiLS1sYW5nPSIgKyBsYW5nT3B0KTsKLSAgYXJncy5lbXBsYWNlX2JhY2soIi1iIik7Ci0gIGFyZ3MuZW1wbGFjZV9iYWNrKCItSSAuIik7Ci0gIGFyZ3MuZW1wbGFjZV9iYWNrKCItbyBvdXQiKTsKLSAgLy8gY29ycmVzcG9uZGluZyBwYWNrYWdlIGFsc28gaW4gYWlkbF9wYXJzZXJfZnV6emVyLmRpY3QKLSAgYXJncy5lbXBsYWNlX2JhY2soImEvcGF0aC9Gb28uYWlkbCIpOwotCi0gIGZ1enooaW8sIGFyZ3MpOwotfQotCi12b2lkIGZ1enpDaGVja0FwaShjb25zdCBzdGQ6OnN0cmluZyYgYSwgY29uc3Qgc3RkOjpzdHJpbmcmIGIpIHsKLSAgRmFrZUlvRGVsZWdhdGUgaW87Ci0gIGlvLlNldEZpbGVDb250ZW50cygiYS9wYXRoL0Zvby5haWRsIiwgYSk7Ci0gIGlvLlNldEZpbGVDb250ZW50cygiYi9wYXRoL0Zvby5haWRsIiwgYik7Ci0KLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGFyZ3M7Ci0gIGFyZ3MuZW1wbGFjZV9iYWNrKCJhaWRsIik7Ci0gIGFyZ3MuZW1wbGFjZV9iYWNrKCItLWNoZWNrYXBpIik7Ci0gIC8vIGNvcnJlc3BvbmRpbmcgcGFja2FnZSBhbHNvIGluIGFpZGxfcGFyc2VyX2Z1enplci5kaWN0Ci0gIGFyZ3MuZW1wbGFjZV9iYWNrKCJhL3BhdGgvIik7Ci0gIGFyZ3MuZW1wbGFjZV9iYWNrKCJiL3BhdGgvIik7Ci0KLSAgZnV6eihpbywgYXJncyk7Ci19Ci0KLWV4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgaWYgKHNpemUgPD0gMSkgcmV0dXJuIDA7ICAvLyBubyB1c2UKLQotICAvLyBiLzE0NTQ0NzU0MCwgbGFyZ2UgbmVzdGVkIGV4cHJlc3Npb25zIHNvbWV0aW1lcyBoaXQgdGhlIHN0YWNrIGRlcHRoIGxpbWl0LgotICAvLyBGdXp6aW5nIHRoaW5ncyBvZiB0aGlzIHNpemUgZG9uJ3QgcHJvdmlkZSBhbnkgYWRkaXRpb25hbCBtZWFuaW5nZnVsCi0gIC8vIGNvdmVyYWdlLiBUaGlzIGlzIGFuIGFwcHJveGltYXRlIHZhbHVlIHdoaWNoIHNob3VsZCBhbGxvdyB1cyB0byBleHBsb3JlIGFsbAotICAvLyBvZiB0aGUgbGFuZ3VhZ2Ugdy9vIGhpdHRpbmcgYSBzdGFjayBvdmVyZmxvdy4KLSAgaWYgKHNpemUgPiAyMDAwKSByZXR1cm4gMDsKLQotICBGdXp6ZWREYXRhUHJvdmlkZXIgcHJvdmlkZXIgPSBGdXp6ZWREYXRhUHJvdmlkZXIoZGF0YSwgc2l6ZSk7Ci0KLSAgaWYgKHByb3ZpZGVyLkNvbnN1bWVCb29sKCkpIHsKLSAgICBzdGQ6OnN0cmluZyBjb250ZW50ID0gcHJvdmlkZXIuQ29uc3VtZVJlbWFpbmluZ0J5dGVzQXNTdHJpbmcoKTsKLQotICAgIGZ1enpMYW5nKCJuZGsiLCBjb250ZW50KTsKLSAgICBmdXp6TGFuZygiY3BwIiwgY29udGVudCk7Ci0gICAgZnV6ekxhbmcoImphdmEiLCBjb250ZW50KTsKLSAgICBmdXp6TGFuZygicnVzdCIsIGNvbnRlbnQpOwotICB9IGVsc2UgewotICAgIHN0ZDo6c3RyaW5nIGNvbnRlbnRBID0gcHJvdmlkZXIuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZygpOwotICAgIHN0ZDo6c3RyaW5nIGNvbnRlbnRCID0gcHJvdmlkZXIuQ29uc3VtZVJlbWFpbmluZ0J5dGVzQXNTdHJpbmcoKTsKLQotICAgIGZ1enpDaGVja0FwaShjb250ZW50QSwgY29udGVudEIpOwotICB9CiAKICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS90ZXN0cy9haWRsX3BhcnNlcl9mdXp6ZXIuZGljdCBiL3Rlc3RzL2FpZGxfcGFyc2VyX2Z1enplci5kaWN0CmluZGV4IGVmNWZhOGIuLjIwYTI3MGEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2FpZGxfcGFyc2VyX2Z1enplci5kaWN0CisrKyBiL3Rlc3RzL2FpZGxfcGFyc2VyX2Z1enplci5kaWN0CkBAIC00OSwxMiArNDksMTMgQEAKICIgQFN5c3RlbUFwaSAiCiAiIEBKYXZhUGFzc3Rocm91Z2ggIgogIiBASmF2YU9ubHlTdGFibGVQYXJjZWxhYmxlICIKLSIgQEhpZGUgIgogIiBAQmFja2luZyAiCiAiIEBGaXhlZFNpemUgIgogIiBARGVzY3JpcHRvciAiCiAiIEBKYXZhRGVydmllICIKICIgQFJ1c3REZXJpdmUgIgorIiAvKiogQGhpZGUgKi8gIgorIiAvKiogQGRlcHJlY2F0ZWQgcmVhc29uICovICIKIAogIyBhbm5vdGF0aW9uIGFyZ3VtZW50cwogIiB2YWx1ZSAiCkBAIC04Niw0ICs4Nyw0MSBAQAogIiBhLnBhdGggIgogIiBiLnBhdGggIgogIiBGb28gIgorIiBhL3BhdGgvRm9vLmFpZGwgIgorIiBiL3BhdGgvRm9vLmFpZGwgIgorIiBwYXRoL0Zvby5haWRsICIKIAorI2FyZ3VtZW50cworIiBhaWRsICIKKyIgLS1hcGltYXBwaW5nICIKKyIgLS1jaGVja2FwaT1jb21wYXRpYmxlICIKKyIgLS1jaGVja2FwaT1lcXVhbCAiCisiIC0taGFzaCAiCisiIC0taGVscCAiCisiIC0tbGFuZz1qYXZhICIKKyIgLS1sYW5nPW5kayAiCisiIC0tbGFuZz1uZGsgIgorIiAtLWxhbmc9cnVzdCAiCisiIC0tbG9nICIKKyIgLS1uaW5qYSAiCisiIC0tcHJlcHJvY2VzcyAiCisiIC0tc3RhYmlsaXR5ICIKKyIgLS1zdGFiaWxpdHk9dmludGYgIgorIiAtLXN0cnVjdHVyZWQgIgorIiAtLXRyYWNlICIKKyIgLS10cmFuc2FjdGlvbl9uYW1lcyAiCisiIC1JICIKKyIgLVcgIgorIiAtV2Vycm9yICIKKyIgLVdldmVyeXRoaW5nICIKKyIgLVduby0gIgorIiAtV25vLWVycm9yICIKKyIgLWEgIgorIiAtYiAiCisiIC1kICIKKyIgLWggIgorIiAtbyAiCisiIC1wICIKKyIgLXQgIgorIiAtdiAiCisiIC13ICIKZGlmZiAtLWdpdCBhL3Rlc3RzL2FpZGxfdGVzdF9jbGllbnRfYnVpbHRpbl90cmFuc2FjdGlvbnMuY3BwIGIvdGVzdHMvYWlkbF90ZXN0X2NsaWVudF9idWlsdGluX3RyYW5zYWN0aW9ucy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI1Mjg3NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2FpZGxfdGVzdF9jbGllbnRfYnVpbHRpbl90cmFuc2FjdGlvbnMuY3BwCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiYWlkbF90ZXN0X2NsaWVudC5oIgorCisjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KKwordXNpbmcgYW5kcm9pZDo6SUludGVyZmFjZTsKK3VzaW5nIGFuZHJvaWQ6Ok9LOwordXNpbmcgYW5kcm9pZDo6U3RyaW5nMTY7CisKK1RFU1RfRihBaWRsVGVzdCwgUGluZykgeworICBFWFBFQ1RfRVEoT0ssIElJbnRlcmZhY2U6OmFzQmluZGVyKHNlcnZpY2UpLT5waW5nQmluZGVyKCkpOworfQorCitURVNUX0YoQWlkbFRlc3QsIEdldEludGVyZmFjZURlc2NyaXB0b3IpIHsKKyAgRVhQRUNUX0VRKFN0cmluZzE2KCJhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlIiksCisgICAgICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihzZXJ2aWNlKS0+Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2FpZGxfdGVzdF9jbGllbnRfZGVmYXVsdGltcGwuY3BwIGIvdGVzdHMvYWlkbF90ZXN0X2NsaWVudF9kZWZhdWx0aW1wbC5jcHAKaW5kZXggMzJlMzVkOC4uZGY1N2QyYyAxMDA2NDQKLS0tIGEvdGVzdHMvYWlkbF90ZXN0X2NsaWVudF9kZWZhdWx0aW1wbC5jcHAKKysrIGIvdGVzdHMvYWlkbF90ZXN0X2NsaWVudF9kZWZhdWx0aW1wbC5jcHAKQEAgLTM4LDggKzM4LDE5IEBACiAgIH0KIH07CiAKKy8qIE1ha2Ugc3VyZSB0aGUgdW5pbXBsZW1lbnRlZE1ldGhvZCBiZWhhdmVzIGFzIGV4cGVjdGVkIGJlZm9yZSB0ZXN0aW5nIHRoZQorICogZGVmYXVsdCBpbXBsCisgKi8KK1RFU1RfRihBaWRsVGVzdCwgdW5pbXBsZW1lbnRlZE1ldGhvZEltcGwpIHsKKyAgaW50MzJfdCByZXR1cm5lZF92YWx1ZTsKKyAgYXV0byBzdGF0dXMgPSBzZXJ2aWNlLT5VbmltcGxlbWVudGVkTWV0aG9kKGtFeHBlY3RlZEFyZ1ZhbHVlLCAmcmV0dXJuZWRfdmFsdWUpOworICBBU1NFUlRfRkFMU0Uoc3RhdHVzLmlzT2soKSkgPDwgc3RhdHVzOworICBBU1NFUlRfRVEoc3RhdHVzLmV4Y2VwdGlvbkNvZGUoKSwgYW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OkVYX1RSQU5TQUNUSU9OX0ZBSUxFRCk7CisgIEVYUEVDVF9FUShzdGF0dXMudHJhbnNhY3Rpb25FcnJvcigpLCBhbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTsKK30KKwogVEVTVF9GKEFpZGxUZXN0LCBkZWZhdWx0SW1wbCkgewotICBzdGQ6OnVuaXF1ZV9wdHI8SVRlc3RTZXJ2aWNlPiBkZWZJbXBsID0gc3RkOjptYWtlX3VuaXF1ZTxEZWY+KCk7CisgIGFuZHJvaWQ6OnNwPElUZXN0U2VydmljZT4gZGVmSW1wbCA9IGFuZHJvaWQ6OnNwPERlZj46Om1ha2UoKTsKICAgYXV0byByZXQgPSBJVGVzdFNlcnZpY2U6OnNldERlZmF1bHRJbXBsKHN0ZDo6bW92ZShkZWZJbXBsKSk7CiAgIEFTU0VSVF9UUlVFKHJldCk7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL2FpZGxfdGVzdF9jbGllbnRfZGVsZWdhdGUuY3BwIGIvdGVzdHMvYWlkbF90ZXN0X2NsaWVudF9kZWxlZ2F0ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE3MTE3OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2FpZGxfdGVzdF9jbGllbnRfZGVsZWdhdGUuY3BwCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgImFpZGxfdGVzdF9jbGllbnQuaCIKKyNpbmNsdWRlICJnbW9jay9nbW9jay5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9haWRsL3Rlc3RzL0JuVGVzdFNlcnZpY2UuaCIKKwordXNpbmcgYW5kcm9pZDo6YmluZGVyOjpTdGF0dXM7CisKK3VzaW5nIGFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U7Cit1c2luZyBhbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlRGVsZWdhdG9yOworCitzdGF0aWMgY29uc3RleHByIGludDhfdCBrQ3VzdG9tQnl0ZSA9IDg7CisKK3N0cnVjdCBDdXN0b21EZWxlZ2F0b3IgOiBwdWJsaWMgSVRlc3RTZXJ2aWNlRGVsZWdhdG9yIHsKKyBwdWJsaWM6CisgIEN1c3RvbURlbGVnYXRvcihzcDxJVGVzdFNlcnZpY2U+JiBpbXBsKSA6IElUZXN0U2VydmljZURlbGVnYXRvcihpbXBsKSB7fQorCisgIC8vIENoYW5nZSBSZXBlYXRCeXRlIHRvIGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgYnl0ZS4KKyAgU3RhdHVzIFJlcGVhdEJ5dGUoaW50OF90IC8qIHRva2VuICovLCBpbnQ4X3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgICpfYWlkbF9yZXR1cm4gPSBrQ3VzdG9tQnl0ZTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICB9Cit9OworCitURVNUX0YoQWlkbFRlc3QsIERlbGVnYXRvcikgeworICBzdGQ6OnVuaXF1ZV9wdHI8SVRlc3RTZXJ2aWNlRGVsZWdhdG9yPiBkZWxlZ2F0b3IgPQorICAgICAgc3RkOjptYWtlX3VuaXF1ZTxJVGVzdFNlcnZpY2VEZWxlZ2F0b3I+KHNlcnZpY2UpOworCisgIGludDhfdCByZXR1cm5lZF92YWx1ZTsKKyAgYXV0byBzdGF0dXMgPSBkZWxlZ2F0b3ItPlJlcGVhdEJ5dGUoMTIsICZyZXR1cm5lZF92YWx1ZSk7CisgIEFTU0VSVF9UUlVFKHN0YXR1cy5pc09rKCkpIDw8IHN0YXR1czsKKyAgRVhQRUNUX0VRKDEyLCByZXR1cm5lZF92YWx1ZSk7Cit9CisKK1RFU1RfRihBaWRsVGVzdCwgQ3VzdG9tRGVsZWdhdG9yKSB7CisgIHN0ZDo6dW5pcXVlX3B0cjxDdXN0b21EZWxlZ2F0b3I+IGRlbGVnYXRvciA9IHN0ZDo6bWFrZV91bmlxdWU8Q3VzdG9tRGVsZWdhdG9yPihzZXJ2aWNlKTsKKworICBpbnQ4X3QgcmV0dXJuZWRfdmFsdWU7CisgIGF1dG8gc3RhdHVzID0gZGVsZWdhdG9yLT5SZXBlYXRCeXRlKDEyLCAmcmV0dXJuZWRfdmFsdWUpOworICBBU1NFUlRfVFJVRShzdGF0dXMuaXNPaygpKSA8PCBzdGF0dXM7CisgIEVYUEVDVF9FUShrQ3VzdG9tQnl0ZSwgcmV0dXJuZWRfdmFsdWUpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYWlkbF90ZXN0X2NsaWVudF9uZGtfZGVsZWdhdGUuY3BwIGIvdGVzdHMvYWlkbF90ZXN0X2NsaWVudF9uZGtfZGVsZWdhdGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiZWMwMWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9haWRsX3Rlc3RfY2xpZW50X25ka19kZWxlZ2F0ZS5jcHAKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfYXV0b191dGlscy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX21hbmFnZXIuaD4KKyNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CblRlc3RTZXJ2aWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKwordXNpbmcgYWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJhY2tlbmRUeXBlOwordXNpbmcgYWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTsKK3VzaW5nIGFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2VEZWxlZ2F0b3I7CisKK3N0YXRpYyBjb25zdGV4cHIgaW50OF90IGtDdXN0b21CeXRlID0gODsKKworc3RydWN0IEN1c3RvbURlbGVnYXRvciA6IHB1YmxpYyBJVGVzdFNlcnZpY2VEZWxlZ2F0b3IgeworIHB1YmxpYzoKKyAgQ3VzdG9tRGVsZWdhdG9yKHN0ZDo6c2hhcmVkX3B0cjxJVGVzdFNlcnZpY2U+JiBpbXBsKSA6IElUZXN0U2VydmljZURlbGVnYXRvcihpbXBsKSB7fQorCisgIC8vIENoYW5nZSBSZXBlYXRCeXRlIHRvIGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgYnl0ZS4KKyAgbmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdEJ5dGUoaW50OF90IC8qIHRva2VuICovLCBpbnQ4X3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgICpfYWlkbF9yZXR1cm4gPSBrQ3VzdG9tQnl0ZTsKKyAgICByZXR1cm4gbmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworICB9Cit9OworCitzdHJ1Y3QgQWlkbERlbGVnYXRvclRlc3QgOiB0ZXN0aW5nOjpUZXN0IHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHN0ZDo6c2hhcmVkX3B0cjxUPiBnZXRTZXJ2aWNlKCkgeworICAgIG5kazo6U3BBSUJpbmRlciBiaW5kZXIgPSBuZGs6OlNwQUlCaW5kZXIoQVNlcnZpY2VNYW5hZ2VyX2dldFNlcnZpY2UoVDo6ZGVzY3JpcHRvcikpOworICAgIHJldHVybiBUOjpmcm9tQmluZGVyKGJpbmRlcik7CisgIH0KKyAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsgc2VydmljZSA9IGdldFNlcnZpY2U8SVRlc3RTZXJ2aWNlPigpOyB9CisgIHN0ZDo6c2hhcmVkX3B0cjxJVGVzdFNlcnZpY2U+IHNlcnZpY2U7Cit9OworCitURVNUX0YoQWlkbERlbGVnYXRvclRlc3QsIFNpbXBsZURlbGVnYXRvcikgeworICBhdXRvIGRlbGVnYXRvciA9IG5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxJVGVzdFNlcnZpY2VEZWxlZ2F0b3I+KHNlcnZpY2UpOworICBpbnQ4X3QgcmV0dXJuZWRfdmFsdWU7CisgIGF1dG8gc3RhdHVzID0gZGVsZWdhdG9yLT5SZXBlYXRCeXRlKDEyLCAmcmV0dXJuZWRfdmFsdWUpOworICBBU1NFUlRfVFJVRShzdGF0dXMuaXNPaygpKSA8PCBzdGF0dXMuZ2V0TWVzc2FnZSgpOworICBFWFBFQ1RfRVEoMTIsIHJldHVybmVkX3ZhbHVlKTsKK30KKworVEVTVF9GKEFpZGxEZWxlZ2F0b3JUZXN0LCBDdXN0b21EZWxlZ2F0b3IpIHsKKyAgYXV0byBkZWxlZ2F0b3IgPSBuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8Q3VzdG9tRGVsZWdhdG9yPihzZXJ2aWNlKTsKKyAgaW50OF90IHJldHVybmVkX3ZhbHVlOworICBhdXRvIHN0YXR1cyA9IGRlbGVnYXRvci0+UmVwZWF0Qnl0ZSgxMiwgJnJldHVybmVkX3ZhbHVlKTsKKyAgQVNTRVJUX1RSVUUoc3RhdHVzLmlzT2soKSkgPDwgc3RhdHVzLmdldE1lc3NhZ2UoKTsKKyAgRVhQRUNUX0VRKGtDdXN0b21CeXRlLCByZXR1cm5lZF92YWx1ZSk7Cit9CisKK1RFU1RfRihBaWRsRGVsZWdhdG9yVGVzdCwgU2VuZERlbGVnYXRvcikgeworICBhdXRvIGRlbGVnYXRvciA9IG5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxJVGVzdFNlcnZpY2VEZWxlZ2F0b3I+KHNlcnZpY2UpOworICBhdXRvIGZyb21Bc0JpbmRlciA9IElUZXN0U2VydmljZURlbGVnYXRvcjo6ZnJvbUJpbmRlcihkZWxlZ2F0b3ItPmFzQmluZGVyKCkpOworICAvLyBNYWtlIHN1cmUgdGhlIGRlbGVnYXRvciB3b3JrcyBhZnRlciBhc0JpbmRlciAtPiBmcm9tQmluZGVyIGNvbnZlcnNpb25zCisgIGludDhfdCByZXR1cm5lZF92YWx1ZSA9IDA7CisgIGF1dG8gc3RhdHVzID0gZnJvbUFzQmluZGVyLT5SZXBlYXRCeXRlKDEyLCAmcmV0dXJuZWRfdmFsdWUpOworICBBU1NFUlRfVFJVRShzdGF0dXMuaXNPaygpKSA8PCBzdGF0dXMuZ2V0RGVzY3JpcHRpb24oKTsKKyAgRVhQRUNUX0VRKDEyLCByZXR1cm5lZF92YWx1ZSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9haWRsX3Rlc3RfY2xpZW50X25ka19uZXN0ZWQuY3BwIGIvdGVzdHMvYWlkbF90ZXN0X2NsaWVudF9uZGtfbmVzdGVkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzJlNWJlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYWlkbF90ZXN0X2NsaWVudF9uZGtfbmVzdGVkLmNwcApAQCAtMCwwICsxLDc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2F1dG9fdXRpbHMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9tYW5hZ2VyLmg+CisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgorCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0lOZXN0ZWRTZXJ2aWNlLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL1BhcmNlbGFibGVXaXRoTmVzdGVkLmg+CisKKyNpbmNsdWRlIDxvcHRpb25hbD4KKwordXNpbmcgYWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6SU5lc3RlZFNlcnZpY2U7Cit1c2luZyBhaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpQYXJjZWxhYmxlV2l0aE5lc3RlZDsKK3VzaW5nIE5lc3RlZFJlc3VsdCA9IGFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OklOZXN0ZWRTZXJ2aWNlOjpSZXN1bHQ7Cit1c2luZyBOZXN0ZWRTdGF0dXMgPSBhaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpQYXJjZWxhYmxlV2l0aE5lc3RlZDo6U3RhdHVzOwordXNpbmcgc3RkOjpvcHRpb25hbDsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKK3VzaW5nIHN0ZDo6dmVjdG9yOwordXNpbmcgdGVzdGluZzo6RXE7Cit1c2luZyB0ZXN0aW5nOjpPcHRpb25hbDsKKworc3RydWN0IEFpZGxUZXN0IDogdGVzdGluZzo6VGVzdCB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBzdGQ6OnNoYXJlZF9wdHI8VD4gZ2V0U2VydmljZSgpIHsKKyAgICBuZGs6OlNwQUlCaW5kZXIgYmluZGVyID0gbmRrOjpTcEFJQmluZGVyKEFTZXJ2aWNlTWFuYWdlcl9nZXRTZXJ2aWNlKFQ6OmRlc2NyaXB0b3IpKTsKKyAgICByZXR1cm4gVDo6ZnJvbUJpbmRlcihiaW5kZXIpOworICB9Cit9OworCitURVNUX0YoQWlkbFRlc3QsIE5lc3RlZFNlcnZpY2UpIHsKKyAgYXV0byBuZXN0ZWRTZXJ2aWNlID0gZ2V0U2VydmljZTxJTmVzdGVkU2VydmljZT4oKTsKKyAgQVNTRVJUX05FKG51bGxwdHIsIG5lc3RlZFNlcnZpY2UpOworCisgIFBhcmNlbGFibGVXaXRoTmVzdGVkIHA7CisgIHAuc3RhdHVzID0gTmVzdGVkU3RhdHVzOjpPSzsKKyAgTmVzdGVkUmVzdWx0IHI7CisgIC8vIE9LIC0+IE5PVF9PSworICBhdXRvIHN0YXR1cyA9IG5lc3RlZFNlcnZpY2UtPmZsaXBTdGF0dXMocCwgJnIpOworICBFWFBFQ1RfVFJVRShzdGF0dXMuaXNPaygpKTsKKyAgRVhQRUNUX0VRKHIuc3RhdHVzLCBOZXN0ZWRTdGF0dXM6Ok5PVF9PSyk7CisKKyAgLy8gTk9UX09LIC0+IE9LIHdpdGggY2FsbGJhY2sgKG5lc3RlZCBpbnRlcmZhY2UpCisgIHN0cnVjdCBDYWxsYmFjayA6IElOZXN0ZWRTZXJ2aWNlOjpCbkNhbGxiYWNrIHsKKyAgICBvcHRpb25hbDxQYXJjZWxhYmxlV2l0aE5lc3RlZDo6U3RhdHVzPiByZXN1bHQ7CisgICAgbmRrOjpTY29wZWRBU3RhdHVzIGRvbmUoUGFyY2VsYWJsZVdpdGhOZXN0ZWQ6OlN0YXR1cyBzdCkgb3ZlcnJpZGUgeworICAgICAgcmVzdWx0ID0gc3Q7CisgICAgICByZXR1cm4gbmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworICAgIH0KKyAgfTsKKyAgYXV0byBjYiA9IG5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxDYWxsYmFjaz4oKTsKKyAgc3RhdHVzID0gbmVzdGVkU2VydmljZS0+ZmxpcFN0YXR1c1dpdGhDYWxsYmFjayhyLnN0YXR1cywgY2IpOworICBFWFBFQ1RfVFJVRShzdGF0dXMuaXNPaygpKTsKKyAgRVhQRUNUX1RIQVQoY2ItPnJlc3VsdCwgT3B0aW9uYWwoTmVzdGVkU3RhdHVzOjpPSykpOworCisgIC8vIGFuZHJvaWQ6OmVudW1fcmFuZ2VzPD4KKyAgdmVjdG9yPE5lc3RlZFN0YXR1cz4gdmFsdWVze25kazo6ZW51bV9yYW5nZTxOZXN0ZWRTdGF0dXM+KCkuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5kazo6ZW51bV9yYW5nZTxOZXN0ZWRTdGF0dXM+KCkuZW5kKCl9OworICBFWFBFQ1RfRVEodmFsdWVzLCB2ZWN0b3I8TmVzdGVkU3RhdHVzPih7TmVzdGVkU3RhdHVzOjpPSywgTmVzdGVkU3RhdHVzOjpOT1RfT0t9KSk7CisKKyAgLy8gdG9TdHJpbmcoKQorICBFWFBFQ1RfRVEodG9TdHJpbmcoTmVzdGVkU3RhdHVzOjpOT1RfT0spLCAiTk9UX09LIik7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9haWRsX3Rlc3RfY2xpZW50X25ka19udWxsYWJsZXMuY3BwIGIvdGVzdHMvYWlkbF90ZXN0X2NsaWVudF9uZGtfbnVsbGFibGVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjU2Y2Y5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYWlkbF90ZXN0X2NsaWVudF9uZGtfbnVsbGFibGVzLmNwcApAQCAtMCwwICsxLDE0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9hdXRvX3V0aWxzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfbWFuYWdlci5oPgorI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0lUZXN0U2VydmljZS5oPgorCit1c2luZyBhaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QmFja2VuZFR5cGU7Cit1c2luZyBhaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s7Cit1c2luZyBhaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOwordXNpbmcgdGVzdGluZzo6RXE7CisKK3N0cnVjdCBBaWRsVGVzdCA6IHRlc3Rpbmc6OlRlc3QgeworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgc3RkOjpzaGFyZWRfcHRyPFQ+IGdldFNlcnZpY2UoKSB7CisgICAgbmRrOjpTcEFJQmluZGVyIGJpbmRlciA9IG5kazo6U3BBSUJpbmRlcihBU2VydmljZU1hbmFnZXJfZ2V0U2VydmljZShUOjpkZXNjcmlwdG9yKSk7CisgICAgcmV0dXJuIFQ6OmZyb21CaW5kZXIoYmluZGVyKTsKKyAgfQorICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgIHNlcnZpY2UgPSBnZXRTZXJ2aWNlPElUZXN0U2VydmljZT4oKTsKKyAgICBhdXRvIHN0YXR1cyA9IHNlcnZpY2UtPmdldEJhY2tlbmRUeXBlKCZiYWNrZW5kKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMuaXNPaygpKSA8PCBzdGF0dXMuZ2V0RGVzY3JpcHRpb24oKTsKKyAgfQorICBzdGQ6OnNoYXJlZF9wdHI8SVRlc3RTZXJ2aWNlPiBzZXJ2aWNlOworICBCYWNrZW5kVHlwZSBiYWNrZW5kOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICB2b2lkIERvVGVzdChuZGs6OlNjb3BlZEFTdGF0dXMgKElUZXN0U2VydmljZTo6KmZ1bmMpKGNvbnN0IHN0ZDo6b3B0aW9uYWw8VD4mLCBzdGQ6Om9wdGlvbmFsPFQ+KiksCisgICAgICAgICAgICAgIHN0ZDo6b3B0aW9uYWw8VD4gaW5wdXQpIHsKKyAgICBzdGQ6Om9wdGlvbmFsPFQ+IG91dHB1dDsKKyAgICBhdXRvIHN0YXR1cyA9ICgqc2VydmljZS4qZnVuYykoaW5wdXQsICZvdXRwdXQpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cy5pc09rKCkpOworICAgIEFTU0VSVF9UUlVFKG91dHB1dC5oYXNfdmFsdWUoKSk7CisgICAgQVNTRVJUX1RIQVQoKm91dHB1dCwgRXEoKmlucHV0KSk7CisKKyAgICBpbnB1dC5yZXNldCgpOworICAgIHN0YXR1cyA9ICgqc2VydmljZS4qZnVuYykoaW5wdXQsICZvdXRwdXQpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cy5pc09rKCkpOworICAgIEFTU0VSVF9GQUxTRShvdXRwdXQuaGFzX3ZhbHVlKCkpOworICB9Cit9OworCitURVNUX0YoQWlkbFRlc3QsIHBhcmNlbGFibGVBcnJheSkgeworICBzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPElUZXN0U2VydmljZTo6RW1wdHk+PiBpbnB1dDsKKyAgaW5wdXQucHVzaF9iYWNrKElUZXN0U2VydmljZTo6RW1wdHkoKSk7CisgIGlucHV0LnB1c2hfYmFjayhzdGQ6Om51bGxvcHQpOworICBEb1Rlc3QoJklUZXN0U2VydmljZTo6UmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlQXJyYXksIHN0ZDo6bWFrZV9vcHRpb25hbChpbnB1dCkpOworfQorCitURVNUX0YoQWlkbFRlc3QsIHBhcmNlbGFibGVMaXN0KSB7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8SVRlc3RTZXJ2aWNlOjpFbXB0eT4+IGlucHV0OworICBpbnB1dC5wdXNoX2JhY2soSVRlc3RTZXJ2aWNlOjpFbXB0eSgpKTsKKyAgaW5wdXQucHVzaF9iYWNrKHN0ZDo6bnVsbG9wdCk7CisgIERvVGVzdCgmSVRlc3RTZXJ2aWNlOjpSZXBlYXROdWxsYWJsZVBhcmNlbGFibGVMaXN0LCBzdGQ6Om1ha2Vfb3B0aW9uYWwoaW5wdXQpKTsKK30KKworVEVTVF9GKEFpZGxUZXN0LCBudWxsQmluZGVyKSB7CisgIGF1dG8gc3RhdHVzID0gc2VydmljZS0+VGFrZXNBbklCaW5kZXIobnVsbHB0cik7CisgIEFTU0VSVF9USEFUKHN0YXR1cy5nZXRTdGF0dXMoKSwgRXEoU1RBVFVTX1VORVhQRUNURURfTlVMTCkpIDw8IHN0YXR1cy5nZXREZXNjcmlwdGlvbigpOworICAvLyBOb3RlIHRoYXQgTkRLIGJhY2tlbmQgY2hlY2tzIG51bGwgYmVmb3JlIHRyYW5zYWN0aW9uIHdoaWxlIEMrKyBiYWNrZW5kcyBkb2Vzbid0LgorfQorCitURVNUX0YoQWlkbFRlc3QsIGJpbmRlckxpc3RXaXRoTnVsbCkgeworICBzdGQ6OnZlY3RvcjxuZGs6OlNwQUlCaW5kZXI+IGlucHV0e3NlcnZpY2UtPmFzQmluZGVyKCksIG51bGxwdHJ9OworICBhdXRvIHN0YXR1cyA9IHNlcnZpY2UtPlRha2VzQW5JQmluZGVyTGlzdChpbnB1dCk7CisgIEFTU0VSVF9USEFUKHN0YXR1cy5nZXRTdGF0dXMoKSwgRXEoU1RBVFVTX1VORVhQRUNURURfTlVMTCkpOworICAvLyBOb3RlIHRoYXQgTkRLIGJhY2tlbmQgY2hlY2tzIG51bGwgYmVmb3JlIHRyYW5zYWN0aW9uIHdoaWxlIEMrKyBiYWNrZW5kcyBkb2Vzbid0LgorfQorCitURVNUX0YoQWlkbFRlc3QsIG5vbk51bGxCaW5kZXIpIHsKKyAgYXV0byBzdGF0dXMgPSBzZXJ2aWNlLT5UYWtlc0FuSUJpbmRlcihzZXJ2aWNlLT5hc0JpbmRlcigpKTsKKyAgQVNTRVJUX1RSVUUoc3RhdHVzLmlzT2soKSk7Cit9CisKK1RFU1RfRihBaWRsVGVzdCwgYmluZGVyTGlzdFdpdGhvdXROdWxsKSB7CisgIHN0ZDo6dmVjdG9yPG5kazo6U3BBSUJpbmRlcj4gaW5wdXR7c2VydmljZS0+YXNCaW5kZXIoKX07CisgIGF1dG8gc3RhdHVzID0gc2VydmljZS0+VGFrZXNBbklCaW5kZXJMaXN0KGlucHV0KTsKKyAgQVNTRVJUX1RSVUUoc3RhdHVzLmlzT2soKSk7Cit9CisKK1RFU1RfRihBaWRsVGVzdCwgbnVsbEJpbmRlclRvQW5ub3RhdGVkTWV0aG9kKSB7CisgIGF1dG8gc3RhdHVzID0gc2VydmljZS0+VGFrZXNBTnVsbGFibGVJQmluZGVyKG51bGxwdHIpOworICBBU1NFUlRfVFJVRShzdGF0dXMuaXNPaygpKTsKK30KKworVEVTVF9GKEFpZGxUZXN0LCBiaW5kZXJMaXN0V2l0aE51bGxUb0Fubm90YXRlZE1ldGhvZCkgeworICBzdGQ6OnZlY3RvcjxuZGs6OlNwQUlCaW5kZXI+IGlucHV0e3NlcnZpY2UtPmFzQmluZGVyKCksIG51bGxwdHJ9OworICBhdXRvIHN0YXR1cyA9IHNlcnZpY2UtPlRha2VzQU51bGxhYmxlSUJpbmRlckxpc3QoaW5wdXQpOworICBBU1NFUlRfVFJVRShzdGF0dXMuaXNPaygpKTsKK30KKworVEVTVF9GKEFpZGxUZXN0LCBiaW5kZXJBcnJheSkgeworICBzdGQ6OnZlY3RvcjxuZGs6OlNwQUlCaW5kZXI+IHJlcGVhdGVkOworICBpZiAoYmFja2VuZCA9PSBCYWNrZW5kVHlwZTo6SkFWQSkgeworICAgIC8vIEphdmEgY2FuIG9ubHkgbW9kaWZ5IG91dC1hcmd1bWVudCBhcnJheXMgaW4tcGxhY2UKKyAgICByZXBlYXRlZC5yZXNpemUoMik7CisgIH0KKyAgLy8gZ2V0IElOYW1lZENhbGxiYWNrIGZvciAiU3BBSUJpbmRlciIgb2JqZWN0CisgIHN0ZDo6c2hhcmVkX3B0cjxJTmFtZWRDYWxsYmFjaz4gY2FsbGJhY2s7CisgIGF1dG8gc3RhdHVzID0gc2VydmljZS0+R2V0Q2FsbGJhY2soZmFsc2UsICZjYWxsYmFjayk7CisgIEFTU0VSVF9UUlVFKHN0YXR1cy5pc09rKCkpIDw8IHN0YXR1cy5nZXREZXNjcmlwdGlvbigpOworCisgIHN0ZDo6dmVjdG9yPG5kazo6U3BBSUJpbmRlcj4gcmV2ZXJzZWQ7CisgIHN0ZDo6dmVjdG9yPG5kazo6U3BBSUJpbmRlcj4gaW5wdXR7c2VydmljZS0+YXNCaW5kZXIoKSwgY2FsbGJhY2stPmFzQmluZGVyKCl9OworICBzdGF0dXMgPSBzZXJ2aWNlLT5SZXZlcnNlSUJpbmRlckFycmF5KGlucHV0LCAmcmVwZWF0ZWQsICZyZXZlcnNlZCk7CisgIEFTU0VSVF9UUlVFKHN0YXR1cy5pc09rKCkpIDw8IHN0YXR1cy5nZXREZXNjcmlwdGlvbigpOworCisgIEVYUEVDVF9USEFUKGlucHV0LCBFcShyZXBlYXRlZCkpOworICBzdGQ6OnJldmVyc2Uoc3RkOjpiZWdpbihyZXZlcnNlZCksIHN0ZDo6ZW5kKHJldmVyc2VkKSk7CisgIEVYUEVDVF9USEFUKGlucHV0LCBFcShyZXZlcnNlZCkpOworfQorCitURVNUX0YoQWlkbFRlc3QsIG51bGxhYmxlQmluZGVyQXJyYXkpIHsKKyAgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxuZGs6OlNwQUlCaW5kZXI+PiByZXBlYXRlZDsKKyAgaWYgKGJhY2tlbmQgPT0gQmFja2VuZFR5cGU6OkpBVkEpIHsKKyAgICAvLyBKYXZhIGNhbiBvbmx5IG1vZGlmeSBvdXQtYXJndW1lbnQgYXJyYXlzIGluLXBsYWNlCisgICAgcmVwZWF0ZWQgPSBzdGQ6OnZlY3RvcjxuZGs6OlNwQUlCaW5kZXI+KDIpOworICB9CisKKyAgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxuZGs6OlNwQUlCaW5kZXI+PiByZXZlcnNlZDsKKyAgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxuZGs6OlNwQUlCaW5kZXI+PiBpbnB1dCA9CisgICAgICBzdGQ6OnZlY3RvcjxuZGs6OlNwQUlCaW5kZXI+e3NlcnZpY2UtPmFzQmluZGVyKCksIHNlcnZpY2UtPmFzQmluZGVyKCl9OworICBhdXRvIHN0YXR1cyA9IHNlcnZpY2UtPlJldmVyc2VOdWxsYWJsZUlCaW5kZXJBcnJheShpbnB1dCwgJnJlcGVhdGVkLCAmcmV2ZXJzZWQpOworICBBU1NFUlRfVFJVRShzdGF0dXMuaXNPaygpKSA8PCBzdGF0dXMuZ2V0RGVzY3JpcHRpb24oKTsKKworICBFWFBFQ1RfVEhBVChpbnB1dCwgRXEocmVwZWF0ZWQpKTsKKyAgQVNTRVJUX1RSVUUocmV2ZXJzZWQpOworICBzdGQ6OnJldmVyc2Uoc3RkOjpiZWdpbigqcmV2ZXJzZWQpLCBzdGQ6OmVuZCgqcmV2ZXJzZWQpKTsKKyAgRVhQRUNUX1RIQVQoaW5wdXQsIEVxKHJldmVyc2VkKSk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvYWlkbF90ZXN0X2NsaWVudF9uZGtfcGFyY2VsYWJsZXMuY3BwIGIvdGVzdHMvYWlkbF90ZXN0X2NsaWVudF9uZGtfcGFyY2VsYWJsZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiOWNkMTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9haWRsX3Rlc3RfY2xpZW50X25ka19wYXJjZWxhYmxlcy5jcHAKQEAgLTAsMCArMSwyMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvSUxvZ2dhYmxlSW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfYXV0b191dGlscy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX21hbmFnZXIuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvZml4ZWRzaXplYXJyYXkvRml4ZWRTaXplQXJyYXlFeGFtcGxlLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvSVRlc3RTZXJ2aWNlLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvUmVjdXJzaXZlTGlzdC5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL1VuaW9uLmg+CisKK3VzaW5nIGFpZGw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU7Cit1c2luZyBCblJlcGVhdEZpeGVkU2l6ZUFycmF5ID0KKyAgICBhaWRsOjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpCblJlcGVhdEZpeGVkU2l6ZUFycmF5OwordXNpbmcgQnBSZXBlYXRGaXhlZFNpemVBcnJheSA9CisgICAgYWlkbDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6QnBSZXBlYXRGaXhlZFNpemVBcnJheTsKK3VzaW5nIEludFBhcmNlbGFibGUgPSBhaWRsOjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlOwordXNpbmcgSVJlcGVhdEZpeGVkU2l6ZUFycmF5ID0KKyAgICBhaWRsOjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJUmVwZWF0Rml4ZWRTaXplQXJyYXk7Cit1c2luZyBCbkVtcHR5SW50ZXJmYWNlID0KKyAgICBhaWRsOjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpCbkVtcHR5SW50ZXJmYWNlOwordXNpbmcgYWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJhY2tlbmRUeXBlOwordXNpbmcgYWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTsKK3VzaW5nIGFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpSZWN1cnNpdmVMaXN0OwordXNpbmcgYWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlVuaW9uOwordXNpbmcgYW5kcm9pZDo6T0s7Cit1c2luZyBuZGs6OkFQYXJjZWxfcmVhZERhdGE7Cit1c2luZyBuZGs6OkFQYXJjZWxfd3JpdGVEYXRhOwordXNpbmcgbmRrOjpTY29wZWRBU3RhdHVzOwordXNpbmcgbmRrOjpTaGFyZWRSZWZCYXNlOwordXNpbmcgbmRrOjpTcEFJQmluZGVyOworCitzdHJ1Y3QgQWlkbFRlc3QgOiB0ZXN0aW5nOjpUZXN0IHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHN0ZDo6c2hhcmVkX3B0cjxUPiBnZXRTZXJ2aWNlKCkgeworICAgIG5kazo6U3BBSUJpbmRlciBiaW5kZXIgPSBuZGs6OlNwQUlCaW5kZXIoQVNlcnZpY2VNYW5hZ2VyX2dldFNlcnZpY2UoVDo6ZGVzY3JpcHRvcikpOworICAgIHJldHVybiBUOjpmcm9tQmluZGVyKGJpbmRlcik7CisgIH0KK307CisKKy8vIFRPRE8oYi8xOTY0NTQ4OTcpOiBjb3B5IG1vcmUgdGVzdHMgZnJvbSBhaWRsX3Rlc3RfY2xpZW50CisKK1RFU1RfRihBaWRsVGVzdCwgUmV2ZXJzZVJlY3Vyc2l2ZUxpc3QpIHsKKyAgc3RkOjp1bmlxdWVfcHRyPFJlY3Vyc2l2ZUxpc3Q+IGhlYWQ7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgIGF1dG8gbm9kZSA9IHN0ZDo6bWFrZV91bmlxdWU8UmVjdXJzaXZlTGlzdD4oKTsKKyAgICBub2RlLT52YWx1ZSA9IGk7CisgICAgbm9kZS0+bmV4dCA9IHN0ZDo6bW92ZShoZWFkKTsKKyAgICBoZWFkID0gc3RkOjptb3ZlKG5vZGUpOworICB9CisgIC8vIGhlYWQ6IFs5LCA4LCAuLi4gMF0KKworICBSZWN1cnNpdmVMaXN0IHJldmVyc2VkOworICBhdXRvIHN0YXR1cyA9IGdldFNlcnZpY2U8SVRlc3RTZXJ2aWNlPigpLT5SZXZlcnNlTGlzdCgqaGVhZCwgJnJldmVyc2VkKTsKKyAgQVNTRVJUX1RSVUUoc3RhdHVzLmlzT2soKSk7CisKKyAgLy8gcmV2ZXJzZWQgc2hvdWxkIGJlIFswLCAxLCAuLiA5XQorICBSZWN1cnNpdmVMaXN0KiBjdXIgPSAmcmV2ZXJzZWQ7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgIEVYUEVDVF9FUShpLCBjdXItPnZhbHVlKTsKKyAgICBjdXIgPSBjdXItPm5leHQuZ2V0KCk7CisgIH0KKyAgRVhQRUNUX0VRKG51bGxwdHIsIGN1cik7Cit9CisKK1RFU1RfRihBaWRsVGVzdCwgR2V0VW5pb25UYWdzKSB7CisgIHN0ZDo6dmVjdG9yPFVuaW9uPiB1bmlvbnM7CisgIHN0ZDo6dmVjdG9yPFVuaW9uOjpUYWc+IHRhZ3M7CisgIC8vIHRlc3QgZW1wdHkKKyAgYXV0byBzdGF0dXMgPSBnZXRTZXJ2aWNlPElUZXN0U2VydmljZT4oKS0+R2V0VW5pb25UYWdzKHVuaW9ucywgJnRhZ3MpOworICBBU1NFUlRfVFJVRShzdGF0dXMuaXNPaygpKTsKKyAgRVhQRUNUX0VRKHRhZ3MsIChzdGQ6OnZlY3RvcjxVbmlvbjo6VGFnPnt9KSk7CisgIC8vIHRlc3Qgbm9uLWVtcHR5CisgIHVuaW9ucy5wdXNoX2JhY2soVW5pb246Om1ha2U8VW5pb246Om4+KCkpOworICB1bmlvbnMucHVzaF9iYWNrKFVuaW9uOjptYWtlPFVuaW9uOjpucz4oKSk7CisgIHN0YXR1cyA9IGdldFNlcnZpY2U8SVRlc3RTZXJ2aWNlPigpLT5HZXRVbmlvblRhZ3ModW5pb25zLCAmdGFncyk7CisgIEFTU0VSVF9UUlVFKHN0YXR1cy5pc09rKCkpOworICBFWFBFQ1RfRVEodGFncywgKHN0ZDo6dmVjdG9yPFVuaW9uOjpUYWc+e1VuaW9uOjpuLCBVbmlvbjo6bnN9KSk7Cit9CisKK1RFU1RfRihBaWRsVGVzdCwgRml4ZWRTaXplQXJyYXkpIHsKKyAgYXV0byBwYXJjZWwgPSBBUGFyY2VsX2NyZWF0ZSgpOworCisgIEZpeGVkU2l6ZUFycmF5RXhhbXBsZSBwOworICBwLmJ5dGVNYXRyaXhbMF1bMF0gPSAwOworICBwLmJ5dGVNYXRyaXhbMF1bMV0gPSAxOworICBwLmJ5dGVNYXRyaXhbMV1bMF0gPSAyOworICBwLmJ5dGVNYXRyaXhbMV1bMV0gPSAzOworICBwLmZsb2F0TWF0cml4WzBdWzBdID0gMC5mOworICBwLmZsb2F0TWF0cml4WzBdWzFdID0gMS5mOworICBwLmZsb2F0TWF0cml4WzFdWzBdID0gMi5mOworICBwLmZsb2F0TWF0cml4WzFdWzFdID0gMy5mOworICBFWFBFQ1RfRVEoT0ssIHAud3JpdGVUb1BhcmNlbChwYXJjZWwpKTsKKworICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIDApOworCisgIEZpeGVkU2l6ZUFycmF5RXhhbXBsZSBxOworICBFWFBFQ1RfRVEoT0ssIHEucmVhZEZyb21QYXJjZWwocGFyY2VsKSk7CisgIEVYUEVDVF9FUShwLCBxKTsKKworICBBUGFyY2VsX2RlbGV0ZShwYXJjZWwpOworfQorCitURVNUX0YoQWlkbFRlc3QsIEZpeGVkU2l6ZUFycmF5V2l0aFZhbHVlc0F0TnVsbGFibGVGaWVsZHMpIHsKKyAgYXV0byBwYXJjZWwgPSBBUGFyY2VsX2NyZWF0ZSgpOworCisgIEZpeGVkU2l6ZUFycmF5RXhhbXBsZSBwOworICBwLmJvb2xOdWxsYWJsZUFycmF5ID0gc3RkOjphcnJheTxib29sLCAyPnt0cnVlLCBmYWxzZX07CisgIHAuYnl0ZU51bGxhYmxlQXJyYXkgPSBzdGQ6OmFycmF5PHVpbnQ4X3QsIDI+ezQyLCAwfTsKKyAgcC5zdHJpbmdOdWxsYWJsZUFycmF5ID0gc3RkOjphcnJheTxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiwgMj57ImhlbGxvIiwgIndvcmxkIn07CisKKyAgcC5ib29sTnVsbGFibGVNYXRyaXguZW1wbGFjZSgpOworICBwLmJvb2xOdWxsYWJsZU1hdHJpeC0+YXQoMCkgPSBzdGQ6OmFycmF5PGJvb2wsIDI+e3RydWUsIGZhbHNlfTsKKyAgcC5ieXRlTnVsbGFibGVNYXRyaXguZW1wbGFjZSgpOworICBwLmJ5dGVOdWxsYWJsZU1hdHJpeC0+YXQoMCkgPSBzdGQ6OmFycmF5PHVpbnQ4X3QsIDI+ezQyLCAwfTsKKyAgcC5zdHJpbmdOdWxsYWJsZU1hdHJpeC5lbXBsYWNlKCk7CisgIHAuc3RyaW5nTnVsbGFibGVNYXRyaXgtPmF0KDApID0gc3RkOjphcnJheTxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiwgMj57ImhlbGxvIiwgIndvcmxkIn07CisKKyAgRVhQRUNUX0VRKE9LLCBwLndyaXRlVG9QYXJjZWwocGFyY2VsKSk7CisKKyAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCAwKTsKKworICBGaXhlZFNpemVBcnJheUV4YW1wbGUgcTsKKyAgRVhQRUNUX0VRKE9LLCBxLnJlYWRGcm9tUGFyY2VsKHBhcmNlbCkpOworICBFWFBFQ1RfRVEocCwgcSk7CisKKyAgQVBhcmNlbF9kZWxldGUocGFyY2VsKTsKK30KKworVEVTVF9GKEFpZGxUZXN0LCBGaXhlZFNpemVBcnJheU9mQnl0ZXNTaG91bGRCZVBhY2tlZCkgeworICBhdXRvIHBhcmNlbCA9IEFQYXJjZWxfY3JlYXRlKCk7CisKKyAgc3RkOjphcnJheTxzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+LCAyPiBieXRlX2FycmF5OworICBieXRlX2FycmF5WzBdID0gezEsIDIsIDN9OworICBieXRlX2FycmF5WzFdID0gezQsIDUsIDZ9OworICBFWFBFQ1RfRVEoT0ssIEFQYXJjZWxfd3JpdGVEYXRhKHBhcmNlbCwgYnl0ZV9hcnJheSkpOworCisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgMCk7CisKKyAgaW50MzJfdCBsZW47CisgIEVYUEVDVF9FUShPSywgQVBhcmNlbF9yZWFkRGF0YShwYXJjZWwsICZsZW4pKTsKKyAgRVhQRUNUX0VRKDIsIGxlbik7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGJ5dGVfdmVjdG9yOworICBFWFBFQ1RfRVEoT0ssIEFQYXJjZWxfcmVhZERhdGEocGFyY2VsLCAmYnl0ZV92ZWN0b3IpKTsKKyAgRVhQRUNUX0VRKGJ5dGVfdmVjdG9yLCAoc3RkOjp2ZWN0b3I8dWludDhfdD57MSwgMiwgM30pKTsKKyAgRVhQRUNUX0VRKE9LLCBBUGFyY2VsX3JlYWREYXRhKHBhcmNlbCwgJmJ5dGVfdmVjdG9yKSk7CisgIEVYUEVDVF9FUShieXRlX3ZlY3RvciwgKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ezQsIDUsIDZ9KSk7CisKKyAgQVBhcmNlbF9kZWxldGUocGFyY2VsKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFNlcnZpY2UsIHR5cGVuYW1lIE1lbUZuLCB0eXBlbmFtZSBJbnB1dD4KK3ZvaWQgQ2hlY2tSZXBlYXQoU2VydmljZSBzZXJ2aWNlLCBNZW1GbiBmbiwgSW5wdXQgaW5wdXQpIHsKKyAgSW5wdXQgb3V0MSwgb3V0MjsKKyAgRVhQRUNUX1RSVUUoc3RkOjppbnZva2UoZm4sIHNlcnZpY2UsIGlucHV0LCAmb3V0MSwgJm91dDIpLmlzT2soKSk7CisgIEVYUEVDVF9FUShpbnB1dCwgb3V0MSk7CisgIEVYUEVDVF9FUShpbnB1dCwgb3V0Mik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RkOjphcnJheTxzdGQ6OmFycmF5PFQsIDM+LCAyPiBNYWtlMmRBcnJheShzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gdmFsdWVzKSB7CisgIHN0ZDo6YXJyYXk8c3RkOjphcnJheTxULCAzPiwgMj4gYXJyID0ge307CisgIGF1dG8gaXQgPSBzdGQ6OmJlZ2luKHZhbHVlcyk7CisgIGZvciAoYXV0byYgcm93IDogYXJyKSB7CisgICAgZm9yIChhdXRvJiBlbCA6IHJvdykgeworICAgICAgaWYgKGl0ID09IHN0ZDo6ZW5kKHZhbHVlcykpIGJyZWFrOworICAgICAgZWwgPSAqaXQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGFycjsKK30KKworVEVTVF9GKEFpZGxUZXN0LCBGaXhlZFNpemVBcnJheU92ZXJCaW5kZXIpIHsKKyAgYXV0byBzZXJ2aWNlID0gZ2V0U2VydmljZTxJUmVwZWF0Rml4ZWRTaXplQXJyYXk+KCk7CisKKyAgQ2hlY2tSZXBlYXQoc2VydmljZSwgJklSZXBlYXRGaXhlZFNpemVBcnJheTo6UmVwZWF0Qnl0ZXMsIChzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+ezEsIDIsIDN9KSk7CisKKyAgQ2hlY2tSZXBlYXQoc2VydmljZSwgJklSZXBlYXRGaXhlZFNpemVBcnJheTo6UmVwZWF0SW50cywgKHN0ZDo6YXJyYXk8aW50MzJfdCwgMz57MSwgMiwgM30pKTsKKworICBhdXRvIGJpbmRlcjEgPSBTaGFyZWRSZWZCYXNlOjptYWtlPEJuRW1wdHlJbnRlcmZhY2U+KCktPmFzQmluZGVyKCk7CisgIGF1dG8gYmluZGVyMiA9IFNoYXJlZFJlZkJhc2U6Om1ha2U8Qm5FbXB0eUludGVyZmFjZT4oKS0+YXNCaW5kZXIoKTsKKyAgYXV0byBiaW5kZXIzID0gU2hhcmVkUmVmQmFzZTo6bWFrZTxCbkVtcHR5SW50ZXJmYWNlPigpLT5hc0JpbmRlcigpOworICBDaGVja1JlcGVhdChzZXJ2aWNlLCAmSVJlcGVhdEZpeGVkU2l6ZUFycmF5OjpSZXBlYXRCaW5kZXJzLAorICAgICAgICAgICAgICAoc3RkOjphcnJheTxTcEFJQmluZGVyLCAzPntiaW5kZXIxLCBiaW5kZXIyLCBiaW5kZXIzfSkpOworCisgIEludFBhcmNlbGFibGUgcDEsIHAyLCBwMzsKKyAgcDEudmFsdWUgPSAxOworICBwMi52YWx1ZSA9IDI7CisgIHAzLnZhbHVlID0gMzsKKyAgQ2hlY2tSZXBlYXQoc2VydmljZSwgJklSZXBlYXRGaXhlZFNpemVBcnJheTo6UmVwZWF0UGFyY2VsYWJsZXMsCisgICAgICAgICAgICAgIChzdGQ6OmFycmF5PEludFBhcmNlbGFibGUsIDM+e3AxLCBwMiwgcDN9KSk7CisKKyAgQ2hlY2tSZXBlYXQoc2VydmljZSwgJklSZXBlYXRGaXhlZFNpemVBcnJheTo6UmVwZWF0MmRCeXRlcywgTWFrZTJkQXJyYXk8dWludDhfdD4oezEsIDIsIDN9KSk7CisKKyAgQ2hlY2tSZXBlYXQoc2VydmljZSwgJklSZXBlYXRGaXhlZFNpemVBcnJheTo6UmVwZWF0MmRJbnRzLCBNYWtlMmRBcnJheTxpbnQzMl90Pih7MSwgMiwgM30pKTsKKworICAvLyBOb3QtbnVsbGFibGUKKyAgQ2hlY2tSZXBlYXQoc2VydmljZSwgJklSZXBlYXRGaXhlZFNpemVBcnJheTo6UmVwZWF0MmRCaW5kZXJzLAorICAgICAgICAgICAgICBNYWtlMmRBcnJheTxTcEFJQmluZGVyPih7YmluZGVyMSwgYmluZGVyMiwgYmluZGVyMywgYmluZGVyMSwgYmluZGVyMiwgYmluZGVyM30pKTsKKworICBDaGVja1JlcGVhdChzZXJ2aWNlLCAmSVJlcGVhdEZpeGVkU2l6ZUFycmF5OjpSZXBlYXQyZFBhcmNlbGFibGVzLAorICAgICAgICAgICAgICBNYWtlMmRBcnJheTxJbnRQYXJjZWxhYmxlPih7cDEsIHAyLCBwM30pKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2FpZGxfdGVzdF9jbGllbnRfbmRrX3ByaW1pdGl2ZXNfdGVzdC5jcHAgYi90ZXN0cy9haWRsX3Rlc3RfY2xpZW50X25ka19wcmltaXRpdmVzX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MjM1NGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9haWRsX3Rlc3RfY2xpZW50X25ka19wcmltaXRpdmVzX3Rlc3QuY3BwCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfYXV0b191dGlscy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX21hbmFnZXIuaD4KKyNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9JVGVzdFNlcnZpY2UuaD4KKwordXNpbmcgYWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrOwordXNpbmcgYWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTsKK3VzaW5nIHRlc3Rpbmc6OkVxOworCitzdHJ1Y3QgQWlkbFRlc3QgOiB0ZXN0aW5nOjpUZXN0IHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHN0ZDo6c2hhcmVkX3B0cjxUPiBnZXRTZXJ2aWNlKCkgeworICAgIG5kazo6U3BBSUJpbmRlciBiaW5kZXIgPSBuZGs6OlNwQUlCaW5kZXIoQVNlcnZpY2VNYW5hZ2VyX2dldFNlcnZpY2UoVDo6ZGVzY3JpcHRvcikpOworICAgIHJldHVybiBUOjpmcm9tQmluZGVyKGJpbmRlcik7CisgIH0KK307CisKK1RFU1RfRihBaWRsVGVzdCwgSW50ZXJmYWNlRXhjaGFuZ2UpIHsKKyAgYXV0byBzZXJ2aWNlID0gZ2V0U2VydmljZTxJVGVzdFNlcnZpY2U+KCk7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBuYW1lcyA9IHsiTGFycnkiLCAiQ3VybHkiLCAiTW9lIn07CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuYW1lcy5zaXplKCk7IGkrKykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxJTmFtZWRDYWxsYmFjaz4gZ290OworICAgIEFTU0VSVF9UUlVFKHNlcnZpY2UtPkdldE90aGVyVGVzdFNlcnZpY2UobmFtZXNbaV0sICZnb3QpLmlzT2soKSk7CisgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICBBU1NFUlRfVFJVRShnb3QtPkdldE5hbWUoJm5hbWUpLmlzT2soKSk7CisgICAgQVNTRVJUX1RIQVQobmFtZSwgRXEobmFtZXNbaV0pKTsKKyAgfQorICB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPElOYW1lZENhbGxiYWNrPj4gZ290OworICAgIEFTU0VSVF9UUlVFKHNlcnZpY2UtPkdldEludGVyZmFjZUFycmF5KG5hbWVzLCAmZ290KS5pc09rKCkpOworCisgICAgYm9vbCB2ZXJpZmllZCA9IGZhbHNlOworICAgIEFTU0VSVF9UUlVFKHNlcnZpY2UtPlZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUFycmF5KGdvdCwgbmFtZXMsICZ2ZXJpZmllZCkuaXNPaygpKTsKKyAgICBBU1NFUlRfVFJVRSh2ZXJpZmllZCk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5hbWVzLnNpemUoKTsgaSsrKSB7CisgICAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgICAgQVNTRVJUX1RSVUUoZ290W2ldLT5HZXROYW1lKCZuYW1lKS5pc09rKCkpOworICAgICAgQVNTRVJUX1RIQVQobmFtZSwgRXEobmFtZXNbaV0pKTsKKyAgICB9CisgIH0KKyAgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+PiBuYW1lcyA9IHsiTGFycnkiLCBzdGQ6Om51bGxvcHQsICJNb2UifTsKKyAgICBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxJTmFtZWRDYWxsYmFjaz4+PiBnb3Q7CisgICAgQVNTRVJUX1RSVUUoc2VydmljZS0+R2V0TnVsbGFibGVJbnRlcmZhY2VBcnJheShuYW1lcywgJmdvdCkuaXNPaygpKTsKKyAgICBib29sIHZlcmlmaWVkID0gZmFsc2U7CisgICAgQVNTRVJUX1RSVUUoc2VydmljZS0+VmVyaWZ5TmFtZXNXaXRoTnVsbGFibGVJbnRlcmZhY2VBcnJheShnb3QsIG5hbWVzLCAmdmVyaWZpZWQpLmlzT2soKSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZpZWQpOworICAgIEFTU0VSVF9UUlVFKGdvdC5oYXNfdmFsdWUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuYW1lcy5zaXplKCk7IGkrKykgeworICAgICAgaWYgKG5hbWVzW2ldLmhhc192YWx1ZSgpKSB7CisgICAgICAgIEFTU0VSVF9ORShnb3QtPmF0KGkpLmdldCgpLCBudWxscHRyKTsKKyAgICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICAgICAgQVNTRVJUX1RSVUUoZ290LT5hdChpKS0+R2V0TmFtZSgmbmFtZSkuaXNPaygpKTsKKyAgICAgICAgQVNTRVJUX1RIQVQobmFtZSwgRXEobmFtZXNbaV0udmFsdWUoKSkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgQVNTRVJUX0VRKGdvdC0+YXQoaSkuZ2V0KCksIG51bGxwdHIpOworICAgICAgfQorICAgIH0KKyAgfQorICB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4+IG5hbWVzID0geyJMYXJyeSIsIHN0ZDo6bnVsbG9wdCwgIk1vZSJ9OworICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPElOYW1lZENhbGxiYWNrPj4+IGdvdDsKKyAgICBBU1NFUlRfVFJVRShzZXJ2aWNlLT5HZXRJbnRlcmZhY2VMaXN0KG5hbWVzLCAmZ290KS5pc09rKCkpOworICAgIGJvb2wgdmVyaWZpZWQgPSBmYWxzZTsKKyAgICBBU1NFUlRfVFJVRShzZXJ2aWNlLT5WZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VMaXN0KGdvdCwgbmFtZXMsICZ2ZXJpZmllZCkuaXNPaygpKTsKKyAgICBBU1NFUlRfVFJVRSh2ZXJpZmllZCk7CisgICAgQVNTRVJUX1RSVUUoZ290Lmhhc192YWx1ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5hbWVzLnNpemUoKTsgaSsrKSB7CisgICAgICBpZiAobmFtZXNbaV0uaGFzX3ZhbHVlKCkpIHsKKyAgICAgICAgQVNTRVJUX05FKGdvdC0+YXQoaSkuZ2V0KCksIG51bGxwdHIpOworICAgICAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgICAgICBBU1NFUlRfVFJVRShnb3QtPmF0KGkpLT5HZXROYW1lKCZuYW1lKS5pc09rKCkpOworICAgICAgICBBU1NFUlRfVEhBVChuYW1lLCBFcShuYW1lc1tpXS52YWx1ZSgpKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBBU1NFUlRfRVEoZ290LT5hdChpKS5nZXQoKSwgbnVsbHB0cik7CisgICAgICB9CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9haWRsX3Rlc3RfY2xpZW50X25ka19zdHJpbmdzX3Rlc3QuY3BwIGIvdGVzdHMvYWlkbF90ZXN0X2NsaWVudF9uZGtfc3RyaW5nc190ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjIzZDdlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYWlkbF90ZXN0X2NsaWVudF9uZGtfc3RyaW5nc190ZXN0LmNwcApAQCAtMCwwICsxLDE1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9hdXRvX3V0aWxzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfbWFuYWdlci5oPgorI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0lUZXN0U2VydmljZS5oPgorCit1c2luZyBhaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QmFja2VuZFR5cGU7Cit1c2luZyBhaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOwordXNpbmcgdGVzdGluZzo6RXE7CisKK3N0cnVjdCBBaWRsVGVzdCA6IHRlc3Rpbmc6OlRlc3QgeworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgc3RkOjpzaGFyZWRfcHRyPFQ+IGdldFNlcnZpY2UoKSB7CisgICAgbmRrOjpTcEFJQmluZGVyIGJpbmRlciA9IG5kazo6U3BBSUJpbmRlcihBU2VydmljZU1hbmFnZXJfZ2V0U2VydmljZShUOjpkZXNjcmlwdG9yKSk7CisgICAgcmV0dXJuIFQ6OmZyb21CaW5kZXIoYmluZGVyKTsKKyAgfQorICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgIHNlcnZpY2UgPSBnZXRTZXJ2aWNlPElUZXN0U2VydmljZT4oKTsKKyAgICBhdXRvIHN0YXR1cyA9IHNlcnZpY2UtPmdldEJhY2tlbmRUeXBlKCZiYWNrZW5kKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMuaXNPaygpKSA8PCBzdGF0dXMuZ2V0RGVzY3JpcHRpb24oKTsKKyAgfQorICBzdGQ6OnNoYXJlZF9wdHI8SVRlc3RTZXJ2aWNlPiBzZXJ2aWNlOworICBCYWNrZW5kVHlwZSBiYWNrZW5kOworfTsKKworVEVTVF9GKEFpZGxUZXN0LCByZXBlYXRVdGY4U3RyaW5nKSB7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB1dGY4X2lucHV0cyA9IHsKKyAgICAgIHN0ZDo6c3RyaW5nKCJEZWxpdmVyIHVzIGZyb20gZXZpbC4iKSwKKyAgICAgIHN0ZDo6c3RyaW5nKCksCisgICAgICBzdGQ6OnN0cmluZygiXDBcMCIsIDIpLAorICAgICAgLy8gU2ltaWxhcmx5LCB0aGUgdXRmOCBlbmNvZGluZ3Mgb2YgdGhlIHNtYWxsIGxldHRlciB5ZWUgYW5kIGV1cm8gc2lnbi4KKyAgICAgIHN0ZDo6c3RyaW5nKCJceEYwXHg5MFx4OTBceEI3XHhFMlx4ODJceEFDIiksCisgICAgICBJVGVzdFNlcnZpY2U6OlNUUklOR19URVNUX0NPTlNUQU5UX1VURjgsCisgIH07CisKKyAgZm9yIChjb25zdCBhdXRvJiBpbnB1dCA6IHV0ZjhfaW5wdXRzKSB7CisgICAgc3RkOjpzdHJpbmcgcmVwbHk7CisgICAgYXV0byBzdGF0dXMgPSBzZXJ2aWNlLT5SZXBlYXRVdGY4Q3BwU3RyaW5nKGlucHV0LCAmcmVwbHkpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cy5pc09rKCkpOworICAgIEFTU0VSVF9USEFUKHJlcGx5LCBFcShpbnB1dCkpOworICB9CisKKyAgc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4gcmVwbHk7CisgIGF1dG8gc3RhdHVzID0gc2VydmljZS0+UmVwZWF0TnVsbGFibGVVdGY4Q3BwU3RyaW5nKHN0ZDo6bnVsbG9wdCwgJnJlcGx5KTsKKyAgQVNTRVJUX1RSVUUoc3RhdHVzLmlzT2soKSk7CisgIEFTU0VSVF9GQUxTRShyZXBseS5oYXNfdmFsdWUoKSk7CisKKyAgZm9yIChjb25zdCBhdXRvJiBpbnB1dCA6IHV0ZjhfaW5wdXRzKSB7CisgICAgc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4gcmVwbHk7CisgICAgYXV0byBzdGF0dXMgPSBzZXJ2aWNlLT5SZXBlYXROdWxsYWJsZVV0ZjhDcHBTdHJpbmcoaW5wdXQsICZyZXBseSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzLmlzT2soKSk7CisgICAgQVNTRVJUX1RSVUUocmVwbHkuaGFzX3ZhbHVlKCkpOworICAgIEFTU0VSVF9USEFUKCpyZXBseSwgRXEoaW5wdXQpKTsKKyAgfQorfQorCitURVNUX0YoQWlkbFRlc3QsIHJldmVyc2VVdGY4U3RyaW5nQXJyYXkpIHsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGlucHV0ID0geyJhIiwgIiIsICJceGMzXHhiOCJ9OworICBkZWNsdHlwZShpbnB1dCkgcmVwZWF0ZWQ7CisgIGlmIChiYWNrZW5kID09IEJhY2tlbmRUeXBlOjpKQVZBKSB7CisgICAgcmVwZWF0ZWQgPSBkZWNsdHlwZShpbnB1dCkoaW5wdXQuc2l6ZSgpKTsKKyAgfQorICBkZWNsdHlwZShpbnB1dCkgcmV2ZXJzZWQ7CisKKyAgYXV0byBzdGF0dXMgPSBzZXJ2aWNlLT5SZXZlcnNlVXRmOENwcFN0cmluZyhpbnB1dCwgJnJlcGVhdGVkLCAmcmV2ZXJzZWQpOworICBBU1NFUlRfVFJVRShzdGF0dXMuaXNPaygpKSA8PCBzdGF0dXMuZ2V0RGVzY3JpcHRpb24oKTsKKyAgQVNTRVJUX1RIQVQocmVwZWF0ZWQsIEVxKGlucHV0KSk7CisKKyAgZGVjbHR5cGUoaW5wdXQpIHJldmVyc2VkX2lucHV0KGlucHV0KTsKKyAgc3RkOjpyZXZlcnNlKHJldmVyc2VkX2lucHV0LmJlZ2luKCksIHJldmVyc2VkX2lucHV0LmVuZCgpKTsKKyAgQVNTRVJUX1RIQVQocmV2ZXJzZWQsIEVxKHJldmVyc2VkX2lucHV0KSk7Cit9CisKK3N0cnVjdCBBaWRsU3RyaW5nQXJyYXlUZXN0IDogcHVibGljIEFpZGxUZXN0IHsKKyAgdm9pZCBEb1Rlc3QoOjpuZGs6OlNjb3BlZEFTdGF0dXMgKElUZXN0U2VydmljZTo6KmZ1bmMpKAorICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPj4+JiwKKyAgICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4+PiosCisgICAgICBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+Pj4qKSkgeworICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4+PiBpbnB1dDsKKyAgICBkZWNsdHlwZShpbnB1dCkgcmVwZWF0ZWQ7CisgICAgZGVjbHR5cGUoaW5wdXQpIHJldmVyc2VkOworCisgICAgYXV0byBzdGF0dXMgPSAoKnNlcnZpY2UuKmZ1bmMpKGlucHV0LCAmcmVwZWF0ZWQsICZyZXZlcnNlZCk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzLmlzT2soKSkgPDwgc3RhdHVzLmdldERlc2NyaXB0aW9uKCk7CisKKyAgICBpZiAoZnVuYyA9PSAmSVRlc3RTZXJ2aWNlOjpSZXZlcnNlVXRmOENwcFN0cmluZ0xpc3QgJiYgYmFja2VuZCA9PSBCYWNrZW5kVHlwZTo6SkFWQSkgeworICAgICAgLy8gSmF2YSBjYW5ub3QgY2xlYXIgdGhlIGlucHV0IHZhcmlhYmxlIHRvIHJldHVybiBhIG51bGwgdmFsdWUuIEl0IGNhbgorICAgICAgLy8gb25seSBldmVyIGZpbGwgb3V0IGEgbGlzdC4KKyAgICAgIEFTU0VSVF9UUlVFKHJlcGVhdGVkLmhhc192YWx1ZSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgQVNTRVJUX0ZBTFNFKHJlcGVhdGVkLmhhc192YWx1ZSgpKTsKKyAgICB9CisKKyAgICBBU1NFUlRfRkFMU0UocmV2ZXJzZWQuaGFzX3ZhbHVlKCkpOworCisgICAgaW5wdXQgPSBzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPj4oKTsKKyAgICBpbnB1dC0+cHVzaF9iYWNrKCJEZWxpdmVyIHVzIGZyb20gZXZpbC4iKTsKKyAgICBpbnB1dC0+cHVzaF9iYWNrKHN0ZDo6bnVsbG9wdCk7CisgICAgaW5wdXQtPnB1c2hfYmFjaygiXHhGMFx4OTBceDkwXHhCN1x4RTJceDgyXHhBQyIpOworCisgICAgLy8gdXNhYmxlIHNpemUgbmVlZHMgdG8gYmUgaW5pdGlhbGl6ZWQgZm9yIEphdmEKKyAgICByZXBlYXRlZCA9IHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+PihpbnB1dC0+c2l6ZSgpKTsKKworICAgIHN0YXR1cyA9ICgqc2VydmljZS4qZnVuYykoaW5wdXQsICZyZXBlYXRlZCwgJnJldmVyc2VkKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMuaXNPaygpKSA8PCBzdGF0dXMuZ2V0RGVzY3JpcHRpb24oKTsKKyAgICBBU1NFUlRfVFJVRShyZXZlcnNlZC5oYXNfdmFsdWUoKSk7CisgICAgQVNTRVJUX1RSVUUocmVwZWF0ZWQuaGFzX3ZhbHVlKCkpOworICAgIEFTU0VSVF9USEFUKHJldmVyc2VkLT5zaXplKCksIEVxKGlucHV0LT5zaXplKCkpKTsKKyAgICBBU1NFUlRfVEhBVChyZXBlYXRlZC0+c2l6ZSgpLCBFcShpbnB1dC0+c2l6ZSgpKSk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGlucHV0LT5zaXplKCk7IGkrKykgeworICAgICAgYXV0byBpbnB1dF9zdHIgPSAoKmlucHV0KVtpXTsKKyAgICAgIGF1dG8gcmVwZWF0ZWRfc3RyID0gKCpyZXBlYXRlZClbaV07CisgICAgICBhdXRvIHJldmVyc2VkX3N0ciA9ICgqcmV2ZXJzZWQpWyhyZXZlcnNlZC0+c2l6ZSgpIC0gMSkgLSBpXTsKKyAgICAgIGlmICghaW5wdXRfc3RyKSB7CisgICAgICAgIEFTU0VSVF9GQUxTRShyZXBlYXRlZF9zdHIuaGFzX3ZhbHVlKCkpOworICAgICAgICBBU1NFUlRfRkFMU0UocmV2ZXJzZWRfc3RyLmhhc192YWx1ZSgpKTsKKyAgICAgICAgLy8gMyBudWxscHRycyB0byBzdHJpbmdzLiAgTm8gbmVlZCB0byBjb21wYXJlIHZhbHVlcy4KKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBBU1NFUlRfVFJVRShyZXBlYXRlZF9zdHIuaGFzX3ZhbHVlKCkpOworICAgICAgQVNTRVJUX1RSVUUocmV2ZXJzZWRfc3RyLmhhc192YWx1ZSgpKTsKKworICAgICAgQVNTRVJUX1RIQVQoKnJlcGVhdGVkX3N0ciwgRXEoKmlucHV0X3N0cikpOworICAgICAgQVNTRVJUX1RIQVQoKnJldmVyc2VkX3N0ciwgRXEoKmlucHV0X3N0cikpOworICAgIH0KKyAgfQorfTsKKworVEVTVF9GKEFpZGxTdHJpbmdBcnJheVRlc3QsIG51bGxhYmxlTGlzdCkgeworICBEb1Rlc3QoJklUZXN0U2VydmljZTo6UmV2ZXJzZVV0ZjhDcHBTdHJpbmdMaXN0KTsKK30KKworVEVTVF9GKEFpZGxTdHJpbmdBcnJheVRlc3QsIG51bGxhYmxlQXJyYXkpIHsKKyAgRG9UZXN0KCZJVGVzdFNlcnZpY2U6OlJldmVyc2VOdWxsYWJsZVV0ZjhDcHBTdHJpbmcpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYWlkbF90ZXN0X2NsaWVudF9uZGtfdmVyc2lvbmVkX2ludGVyZmFjZS5jcHAgYi90ZXN0cy9haWRsX3Rlc3RfY2xpZW50X25ka192ZXJzaW9uZWRfaW50ZXJmYWNlLmNwcAppbmRleCA5ZDM0YjhjLi5mMWQwMjA3IDEwMDY0NAotLS0gYS90ZXN0cy9haWRsX3Rlc3RfY2xpZW50X25ka192ZXJzaW9uZWRfaW50ZXJmYWNlLmNwcAorKysgYi90ZXN0cy9haWRsX3Rlc3RfY2xpZW50X25ka192ZXJzaW9uZWRfaW50ZXJmYWNlLmNwcApAQCAtNjQsOCArNjQsMTIgQEAKIAogVEVTVF9GKFZlcnNpb25lZEludGVyZmFjZVRlc3QsIHJlYWREYXRhQ29ycmVjdGx5QWZ0ZXJQYXJjZWxhYmxlV2l0aE5ld0ZpZWxkKSB7CiAgIEZvbyBpbkZvbywgaW5vdXRGb28sIG91dEZvbzsKKyAgaW5vdXRGb28uaW50RGVmYXVsdDQyID0gMDsKKyAgb3V0Rm9vLmludERlZmF1bHQ0MiA9IDA7CiAgIGludDMyX3QgcmV0OwogICBhdXRvIHN0YXR1cyA9IHZlcnNpb25lZC0+aWdub3JlUGFyY2VsYWJsZXNBbmRSZXBlYXRJbnQoaW5Gb28sICZpbm91dEZvbywgJm91dEZvbywgNDMsICZyZXQpOwogICBFWFBFQ1RfVFJVRShzdGF0dXMuaXNPaygpKSA8PCBzdGF0dXMuZ2V0RGVzY3JpcHRpb24oKTsKICAgRVhQRUNUX0VRKDQzLCByZXQpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyAgRVhQRUNUX0VRKDAsIGlub3V0Rm9vLmludERlZmF1bHQ0Mik7CisgIEVYUEVDVF9FUSgwLCBvdXRGb28uaW50RGVmYXVsdDQyKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2FpZGxfdGVzdF9jbGllbnRfbmVzdGVkLmNwcCBiL3Rlc3RzL2FpZGxfdGVzdF9jbGllbnRfbmVzdGVkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjYzN2IxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYWlkbF90ZXN0X2NsaWVudF9uZXN0ZWQuY3BwCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiYWlkbF90ZXN0X2NsaWVudC5oIgorCisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9JTmVzdGVkU2VydmljZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KKwordXNpbmcgYW5kcm9pZDo6SUJpbmRlcjsKK3VzaW5nIGFuZHJvaWQ6OnNwOwordXNpbmcgYW5kcm9pZDo6U3RyaW5nMTY7Cit1c2luZyBhbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpJTmVzdGVkU2VydmljZTsKK3VzaW5nIGFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OlBhcmNlbGFibGVXaXRoTmVzdGVkOwordXNpbmcgYW5kcm9pZDo6YmluZGVyOjpTdGF0dXM7Cit1c2luZyBOZXN0ZWRSZXN1bHQgPSBhbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpJTmVzdGVkU2VydmljZTo6UmVzdWx0OwordXNpbmcgTmVzdGVkU3RhdHVzID0gYW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6UGFyY2VsYWJsZVdpdGhOZXN0ZWQ6OlN0YXR1czsKK3VzaW5nIHN0ZDo6b3B0aW9uYWw7Cit1c2luZyBzdGQ6OnBhaXI7Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6dmVjdG9yOwordXNpbmcgdGVzdGluZzo6RXE7Cit1c2luZyB0ZXN0aW5nOjpPcHRpb25hbDsKKworVEVTVF9GKEFpZGxUZXN0LCBOZXN0ZWRTZXJ2aWNlKSB7CisgIHNwPElOZXN0ZWRTZXJ2aWNlPiBuZXN0ZWRTZXJ2aWNlOworICBFWFBFQ1RfRVEoYW5kcm9pZDo6T0ssIGFuZHJvaWQ6OmdldFNlcnZpY2UoSU5lc3RlZFNlcnZpY2U6OmRlc2NyaXB0b3IsICZuZXN0ZWRTZXJ2aWNlKSk7CisgIEFTU0VSVF9ORShudWxscHRyLCBuZXN0ZWRTZXJ2aWNlKTsKKworICBQYXJjZWxhYmxlV2l0aE5lc3RlZCBwOworICBwLnN0YXR1cyA9IE5lc3RlZFN0YXR1czo6T0s7CisgIE5lc3RlZFJlc3VsdCByOworICAvLyBPSyAtPiBOT1RfT0sKKyAgRVhQRUNUX1RSVUUobmVzdGVkU2VydmljZS0+ZmxpcFN0YXR1cyhwLCAmcikuaXNPaygpKTsKKyAgRVhQRUNUX0VRKHIuc3RhdHVzLCBOZXN0ZWRTdGF0dXM6Ok5PVF9PSyk7CisKKyAgLy8gTk9UX09LIC0+IE9LIHdpdGggY2FsbGJhY2sgbmVzdGVkIGludGVyZmFjZQorICBzdHJ1Y3QgQ2FsbGJhY2sgOiBJTmVzdGVkU2VydmljZTo6Qm5DYWxsYmFjayB7CisgICAgb3B0aW9uYWw8TmVzdGVkU3RhdHVzPiByZXN1bHQ7CisgICAgU3RhdHVzIGRvbmUoTmVzdGVkU3RhdHVzIHN0KSBvdmVycmlkZSB7CisgICAgICByZXN1bHQgPSBzdDsKKyAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgfQorICB9OworICBzcDxDYWxsYmFjaz4gY2IgPSBuZXcgQ2FsbGJhY2s7CisgIEVYUEVDVF9UUlVFKG5lc3RlZFNlcnZpY2UtPmZsaXBTdGF0dXNXaXRoQ2FsbGJhY2soci5zdGF0dXMsIGNiKS5pc09rKCkpOworICBFWFBFQ1RfVEhBVChjYi0+cmVzdWx0LCBPcHRpb25hbChOZXN0ZWRTdGF0dXM6Ok9LKSk7CisKKyAgLy8gYW5kcm9pZDo6ZW51bV9yYW5nZXM8PgorICB2ZWN0b3I8TmVzdGVkU3RhdHVzPiB2YWx1ZXN7YW5kcm9pZDo6ZW51bV9yYW5nZTxOZXN0ZWRTdGF0dXM+KCkuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmVudW1fcmFuZ2U8TmVzdGVkU3RhdHVzPigpLmVuZCgpfTsKKyAgRVhQRUNUX0VRKHZhbHVlcywgdmVjdG9yPE5lc3RlZFN0YXR1cz4oe05lc3RlZFN0YXR1czo6T0ssIE5lc3RlZFN0YXR1czo6Tk9UX09LfSkpOworCisgIC8vIHRvU3RyaW5nKCkKKyAgRVhQRUNUX0VRKHRvU3RyaW5nKE5lc3RlZFN0YXR1czo6Tk9UX09LKSwgIk5PVF9PSyIpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYWlkbF90ZXN0X2NsaWVudF9udWxsYWJsZXMuY3BwIGIvdGVzdHMvYWlkbF90ZXN0X2NsaWVudF9udWxsYWJsZXMuY3BwCmluZGV4IDlhOTMxZjguLjZjZWRmNjMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2FpZGxfdGVzdF9jbGllbnRfbnVsbGFibGVzLmNwcAorKysgYi90ZXN0cy9haWRsX3Rlc3RfY2xpZW50X251bGxhYmxlcy5jcHAKQEAgLTk1LDEwICs5NSw4IEBACiB9CiAKIFRFU1RfRihSZXBlYXROdWxsYWJsZVRlc3QsIHBhcmNlbGFibGUpIHsKLSAgYXV0byBpbnB1dCA9IHN0ZDo6bWFrZV9vcHRpb25hbDxTdHJ1Y3R1cmVkUGFyY2VsYWJsZT4oKTsKLSAgaW5wdXQtPmYgPSA0MjsKLQotICBzdGQ6Om9wdGlvbmFsPFN0cnVjdHVyZWRQYXJjZWxhYmxlPiBvdXRwdXQ7CisgIGF1dG8gaW5wdXQgPSBzdGQ6Om1ha2Vfb3B0aW9uYWw8SVRlc3RTZXJ2aWNlOjpFbXB0eT4oKTsKKyAgc3RkOjpvcHRpb25hbDxJVGVzdFNlcnZpY2U6OkVtcHR5PiBvdXRwdXQ7CiAgIGF1dG8gc3RhdHVzID0gc2VydmljZS0+UmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlKGlucHV0LCAmb3V0cHV0KTsKICAgQVNTRVJUX1RSVUUoc3RhdHVzLmlzT2soKSk7CiAgIEFTU0VSVF9UUlVFKG91dHB1dC5oYXNfdmFsdWUoKSk7CkBAIC0xMTAsNiArMTA4LDIwIEBACiAgIEFTU0VSVF9GQUxTRShvdXRwdXQuaGFzX3ZhbHVlKCkpOwogfQogCitURVNUX0YoUmVwZWF0TnVsbGFibGVUZXN0LCBwYXJjZWxhYmxlQXJyYXkpIHsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxJVGVzdFNlcnZpY2U6OkVtcHR5Pj4gaW5wdXQ7CisgIGlucHV0LnB1c2hfYmFjayhJVGVzdFNlcnZpY2U6OkVtcHR5KCkpOworICBpbnB1dC5wdXNoX2JhY2soc3RkOjpudWxsb3B0KTsKKyAgRG9UZXN0KCZJVGVzdFNlcnZpY2U6OlJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUFycmF5LCBzdGQ6Om1ha2Vfb3B0aW9uYWwoaW5wdXQpKTsKK30KKworVEVTVF9GKFJlcGVhdE51bGxhYmxlVGVzdCwgcGFyY2VsYWJsZUxpc3QpIHsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxJVGVzdFNlcnZpY2U6OkVtcHR5Pj4gaW5wdXQ7CisgIGlucHV0LnB1c2hfYmFjayhJVGVzdFNlcnZpY2U6OkVtcHR5KCkpOworICBpbnB1dC5wdXNoX2JhY2soc3RkOjpudWxsb3B0KTsKKyAgRG9UZXN0KCZJVGVzdFNlcnZpY2U6OlJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUxpc3QsIHN0ZDo6bWFrZV9vcHRpb25hbChpbnB1dCkpOworfQorCiBURVNUX0YoQWlkbFRlc3QsIG51bGxCaW5kZXIpIHsKICAgYXV0byBzdGF0dXMgPSBzZXJ2aWNlLT5UYWtlc0FuSUJpbmRlcihudWxscHRyKTsKIApAQCAtMTIxLDEwICsxMzMsOCBAQAogfQogCiBURVNUX0YoQWlkbFRlc3QsIGJpbmRlckxpc3RXaXRoTnVsbCkgewotICBpZiAoIWNwcF9qYXZhX3Rlc3RzKSBHVEVTVF9TS0lQKCkgPDwgIlNlcnZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGUgQ1BQL0phdmEtb25seSB0ZXN0cy4iOwotCiAgIHN0ZDo6dmVjdG9yPHNwPElCaW5kZXI+PiBpbnB1dHtuZXcgQkJpbmRlcigpLCBudWxscHRyfTsKLSAgYXV0byBzdGF0dXMgPSBjcHBfamF2YV90ZXN0cy0+VGFrZXNBbklCaW5kZXJMaXN0KGlucHV0KTsKKyAgYXV0byBzdGF0dXMgPSBzZXJ2aWNlLT5UYWtlc0FuSUJpbmRlckxpc3QoaW5wdXQpOwogCiAgIGlmIChiYWNrZW5kID09IEJhY2tlbmRUeXBlOjpKQVZBKSB7CiAgICAgQVNTRVJUX1RSVUUoc3RhdHVzLmlzT2soKSkgPDwgc3RhdHVzOwpAQCAtMTQwLDEwICsxNTAsOCBAQAogfQogCiBURVNUX0YoQWlkbFRlc3QsIGJpbmRlckxpc3RXaXRob3V0TnVsbCkgewotICBpZiAoIWNwcF9qYXZhX3Rlc3RzKSBHVEVTVF9TS0lQKCkgPDwgIlNlcnZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGUgQ1BQL0phdmEtb25seSB0ZXN0cy4iOwotCiAgIHN0ZDo6dmVjdG9yPHNwPElCaW5kZXI+PiBpbnB1dHtuZXcgQkJpbmRlcigpLCBuZXcgQkJpbmRlcigpfTsKLSAgYXV0byBzdGF0dXMgPSBjcHBfamF2YV90ZXN0cy0+VGFrZXNBbklCaW5kZXJMaXN0KGlucHV0KTsKKyAgYXV0byBzdGF0dXMgPSBzZXJ2aWNlLT5UYWtlc0FuSUJpbmRlckxpc3QoaW5wdXQpOwogICBBU1NFUlRfVFJVRShzdGF0dXMuaXNPaygpKTsKIH0KIApAQCAtMTUzLDEzICsxNjEsNDcgQEAKIH0KIAogVEVTVF9GKEFpZGxUZXN0LCBiaW5kZXJMaXN0V2l0aE51bGxUb0Fubm90YXRlZE1ldGhvZCkgewotICBpZiAoIWNwcF9qYXZhX3Rlc3RzKSBHVEVTVF9TS0lQKCkgPDwgIlNlcnZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGUgQ1BQL0phdmEtb25seSB0ZXN0cy4iOwotCiAgIHN0ZDo6dmVjdG9yPHNwPElCaW5kZXI+PiBpbnB1dHtuZXcgQkJpbmRlcigpLCBudWxscHRyfTsKLSAgYXV0byBzdGF0dXMgPSBjcHBfamF2YV90ZXN0cy0+VGFrZXNBTnVsbGFibGVJQmluZGVyTGlzdChpbnB1dCk7CisgIGF1dG8gc3RhdHVzID0gc2VydmljZS0+VGFrZXNBTnVsbGFibGVJQmluZGVyTGlzdChpbnB1dCk7CiAgIEFTU0VSVF9UUlVFKHN0YXR1cy5pc09rKCkpOwogfQogCitURVNUX0YoQWlkbFRlc3QsIGJpbmRlckFycmF5KSB7CisgIHN0ZDo6dmVjdG9yPHNwPElCaW5kZXI+PiByZXBlYXRlZDsKKyAgaWYgKGJhY2tlbmQgPT0gQmFja2VuZFR5cGU6OkpBVkEpIHsKKyAgICAvLyBKYXZhIGNhbiBvbmx5IG1vZGlmeSBvdXQtYXJndW1lbnQgYXJyYXlzIGluLXBsYWNlCisgICAgcmVwZWF0ZWQucmVzaXplKDIpOworICB9CisKKyAgc3RkOjp2ZWN0b3I8c3A8SUJpbmRlcj4+IHJldmVyc2VkOworICBzdGQ6OnZlY3RvcjxzcDxJQmluZGVyPj4gaW5wdXR7bmV3IEJCaW5kZXIoKSwgbmV3IEJCaW5kZXIoKX07CisgIGF1dG8gc3RhdHVzID0gc2VydmljZS0+UmV2ZXJzZUlCaW5kZXJBcnJheShpbnB1dCwgJnJlcGVhdGVkLCAmcmV2ZXJzZWQpOworICBBU1NFUlRfVFJVRShzdGF0dXMuaXNPaygpKSA8PCBzdGF0dXM7CisKKyAgRVhQRUNUX1RIQVQoaW5wdXQsIEVxKHJlcGVhdGVkKSk7CisgIHN0ZDo6cmV2ZXJzZShzdGQ6OmJlZ2luKHJldmVyc2VkKSwgc3RkOjplbmQocmV2ZXJzZWQpKTsKKyAgRVhQRUNUX1RIQVQoaW5wdXQsIEVxKHJldmVyc2VkKSk7Cit9CisKK1RFU1RfRihBaWRsVGVzdCwgbnVsbGFibGVCaW5kZXJBcnJheSkgeworICBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHNwPElCaW5kZXI+Pj4gcmVwZWF0ZWQ7CisgIGlmIChiYWNrZW5kID09IEJhY2tlbmRUeXBlOjpKQVZBKSB7CisgICAgLy8gSmF2YSBjYW4gb25seSBtb2RpZnkgb3V0LWFyZ3VtZW50IGFycmF5cyBpbi1wbGFjZQorICAgIHJlcGVhdGVkID0gc3RkOjp2ZWN0b3I8c3A8SUJpbmRlcj4+KCk7CisgICAgcmVwZWF0ZWQtPnJlc2l6ZSgyKTsKKyAgfQorCisgIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3A8SUJpbmRlcj4+PiByZXZlcnNlZDsKKyAgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzcDxJQmluZGVyPj4+IGlucHV0ID0gc3RkOjp2ZWN0b3I8c3A8SUJpbmRlcj4+e25ldyBCQmluZGVyKCksIG51bGxwdHJ9OworICBhdXRvIHN0YXR1cyA9IHNlcnZpY2UtPlJldmVyc2VOdWxsYWJsZUlCaW5kZXJBcnJheShpbnB1dCwgJnJlcGVhdGVkLCAmcmV2ZXJzZWQpOworICBBU1NFUlRfVFJVRShzdGF0dXMuaXNPaygpKSA8PCBzdGF0dXM7CisKKyAgRVhQRUNUX1RIQVQoaW5wdXQsIEVxKHJlcGVhdGVkKSk7CisgIEFTU0VSVF9UUlVFKHJldmVyc2VkKTsKKyAgc3RkOjpyZXZlcnNlKHN0ZDo6YmVnaW4oKnJldmVyc2VkKSwgc3RkOjplbmQoKnJldmVyc2VkKSk7CisgIEVYUEVDVF9USEFUKGlucHV0LCBFcShyZXZlcnNlZCkpOworfQorCiBURVNUX0YoQWlkbFRlc3QsIG5vbk51bGxCaW5kZXJUb0Fubm90YXRlZE1ldGhvZCkgewogICBzcDxJQmluZGVyPiBpbnB1dCA9IG5ldyBCQmluZGVyKCk7CiAgIGF1dG8gc3RhdHVzID0gc2VydmljZS0+VGFrZXNBTnVsbGFibGVJQmluZGVyKGlucHV0KTsKQEAgLTE2NywxMCArMjA5LDggQEAKIH0KIAogVEVTVF9GKEFpZGxUZXN0LCBiaW5kZXJMaXN0V2l0aG91dE51bGxUb0Fubm90YXRlZE1ldGhvZCkgewotICBpZiAoIWNwcF9qYXZhX3Rlc3RzKSBHVEVTVF9TS0lQKCkgPDwgIlNlcnZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGUgQ1BQL0phdmEtb25seSB0ZXN0cy4iOwotCiAgIHN0ZDo6dmVjdG9yPHNwPElCaW5kZXI+PiBpbnB1dHtuZXcgQkJpbmRlcigpLCBuZXcgQkJpbmRlcigpfTsKLSAgYXV0byBzdGF0dXMgPSBjcHBfamF2YV90ZXN0cy0+VGFrZXNBTnVsbGFibGVJQmluZGVyTGlzdChpbnB1dCk7CisgIGF1dG8gc3RhdHVzID0gc2VydmljZS0+VGFrZXNBTnVsbGFibGVJQmluZGVyTGlzdChpbnB1dCk7CiAgIEFTU0VSVF9UUlVFKHN0YXR1cy5pc09rKCkpOwogfQogCmRpZmYgLS1naXQgYS90ZXN0cy9haWRsX3Rlc3RfY2xpZW50X3BhcmNlbGFibGVzLmNwcCBiL3Rlc3RzL2FpZGxfdGVzdF9jbGllbnRfcGFyY2VsYWJsZXMuY3BwCmluZGV4IDVkMDBhYTguLjExOWY1MTMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2FpZGxfdGVzdF9jbGllbnRfcGFyY2VsYWJsZXMuY3BwCisrKyBiL3Rlc3RzL2FpZGxfdGVzdF9jbGllbnRfcGFyY2VsYWJsZXMuY3BwCkBAIC0xNCwxMSArMTQsMTMgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvZml4ZWRzaXplYXJyYXkvRml4ZWRTaXplQXJyYXlFeGFtcGxlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL1BhcmNlbGFibGVGb3JUb1N0cmluZy5oPgogI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0Mi5oPgogI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHRMaWtlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9FbnVtVW5pb24uaD4KKyNpbmNsdWRlIDxiaW5kZXIvQmluZGVyLmg+CiAjaW5jbHVkZSAiYWlkbF90ZXN0X2NsaWVudC5oIgogCiAjaW5jbHVkZSA8c3RyaW5nPgpAQCAtMjcsNiArMjksOSBAQAogdXNpbmcgYW5kcm9pZDo6SUludGVyZmFjZTsKIHVzaW5nIGFuZHJvaWQ6OnNwOwogdXNpbmcgYW5kcm9pZDo6U3RyaW5nMTY7Cit1c2luZyBhbmRyb2lkOjpTdHJpbmc4OwordXNpbmcgYW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTsKK3VzaW5nIGFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCYWRQYXJjZWxhYmxlOwogdXNpbmcgYW5kcm9pZDo6YWlkbDo6dGVzdHM6OkNvbnN0YW50RXhwcmVzc2lvbkVudW07CiB1c2luZyBhbmRyb2lkOjphaWRsOjp0ZXN0czo6R2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxlOwogdXNpbmcgYW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrOwpAQCAtMzQsNiArMzksNyBAQAogdXNpbmcgYW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTsKIHVzaW5nIGFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpPdGhlclBhcmNlbGFibGVGb3JUb1N0cmluZzsKIHVzaW5nIGFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpQYXJjZWxhYmxlRm9yVG9TdHJpbmc7Cit1c2luZyBhbmRyb2lkOjphaWRsOjp0ZXN0czo6UmVjdXJzaXZlTGlzdDsKIHVzaW5nIGFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpTaW1wbGVQYXJjZWxhYmxlOwogdXNpbmcgYW5kcm9pZDo6YWlkbDo6dGVzdHM6OlN0cnVjdHVyZWRQYXJjZWxhYmxlOwogdXNpbmcgYW5kcm9pZDo6YWlkbDo6dGVzdHM6OlVuaW9uOwpAQCAtNDIsMTEgKzQ4LDM1IEBACiB1c2luZyBhbmRyb2lkOjphaWRsOjp0ZXN0czo6ZXh0ZW5zaW9uOjpNeUV4dDI7CiB1c2luZyBhbmRyb2lkOjphaWRsOjp0ZXN0czo6ZXh0ZW5zaW9uOjpNeUV4dExpa2U7CiB1c2luZyBhbmRyb2lkOjphaWRsOjp0ZXN0czo6dW5pb25zOjpFbnVtVW5pb247Cit1c2luZyBJbnRQYXJjZWxhYmxlID0gYW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZTsKK3VzaW5nIElSZXBlYXRGaXhlZFNpemVBcnJheSA9CisgICAgYW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SVJlcGVhdEZpeGVkU2l6ZUFycmF5OwordXNpbmcgYW5kcm9pZDo6QkJpbmRlcjsKK3VzaW5nIGFuZHJvaWQ6OklCaW5kZXI7Cit1c2luZyBhbmRyb2lkOjpPSzsKIHVzaW5nIGFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOwogdXNpbmcgYW5kcm9pZDo6b3M6OlBlcnNpc3RhYmxlQnVuZGxlOwogdXNpbmcgc3RkOjpzdHJpbmc7CiB1c2luZyBzdGQ6OnZlY3RvcjsKIAorVEVTVF9GKEFpZGxUZXN0LCBCYWRQYXJjZWxhYmxlKSB7CisgIGlmICghY3BwX2phdmFfdGVzdHMpIEdURVNUX1NLSVAoKSA8PCAiU2VydmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBDUFAvSmF2YS1vbmx5IHRlc3RzLiI7CisKKyAgQmFkUGFyY2VsYWJsZSBvdXRwdXQ7CisgIHsKKyAgICBCYWRQYXJjZWxhYmxlIGJhZCgvKmJhZD0qL3RydWUsICJCb295YSIsIDQyKTsKKyAgICBTdGF0dXMgc3RhdHVzID0gY3BwX2phdmFfdGVzdHMtPlJlcGVhdEJhZFBhcmNlbGFibGUoYmFkLCAmb3V0cHV0KTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzLmlzT2soKSk7CisgICAgRVhQRUNUX0VRKHN0YXR1cy5leGNlcHRpb25Db2RlKCksIFN0YXR1czo6RXhjZXB0aW9uOjpFWF9CQURfUEFSQ0VMQUJMRSk7CisgIH0KKyAgeworICAgIEJhZFBhcmNlbGFibGUgbm90X2JhZCgvKmJhZD0qL2ZhbHNlLCAiQm9veWEiLCA0Mik7CisgICAgU3RhdHVzIHN0YXR1cyA9IGNwcF9qYXZhX3Rlc3RzLT5SZXBlYXRCYWRQYXJjZWxhYmxlKG5vdF9iYWQsICZvdXRwdXQpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cy5pc09rKCkpOworICAgIEVYUEVDVF9FUShub3RfYmFkLCBvdXRwdXQpOworICB9Cit9CisKIFRFU1RfRihBaWRsVGVzdCwgUmVwZWF0U2ltcGxlUGFyY2VsYWJsZSkgewogICBpZiAoIWNwcF9qYXZhX3Rlc3RzKSBHVEVTVF9TS0lQKCkgPDwgIlNlcnZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGUgQ1BQL0phdmEtb25seSB0ZXN0cy4iOwogCkBAIC0xODEsNyArMjExLDggQEAKIAogICAvLyBVc2Ugc3RkOjppbl9wbGFjZV9pbmRleDx0YWc+IHRvIGF2b2lkICJtb3ZlIgogICAvLyBOb3RlIHRoYXQgbWFrZTx0YWc+KC4uLikgaW52b2x2ZXMgIm1vdmUiIG9mIHRoZSBjb250ZW50IHZhbHVlCi0gIEVYUEVDVF9FUShVbmlvbjo6bWFrZTxVbmlvbjo6bnM+KDMsIDApLCBVbmlvbihzdGQ6OmluX3BsYWNlX2luZGV4PFVuaW9uOjpucz4sIDMsIDApKTsKKyAgRVhQRUNUX0VRKFVuaW9uOjptYWtlPFVuaW9uOjpucz4oMywgMCksCisgICAgICAgICAgICBVbmlvbihzdGQ6OmluX3BsYWNlX2luZGV4PHN0YXRpY19jYXN0PHNpemVfdD4oVW5pb246Om5zKT4sIDMsIDApKTsKIAogICBVbmlvbiBvbmVfdHdvID0gb25lX3R3b190aHJlZTsKICAgLy8gZ2V0PHRhZz4gY2FuIGJlIHVzZWQgdG8gbW9kaWZ5IHRoZSBjb250ZW50CkBAIC0yOTUsNiArMzI2LDEwIEBACiAgIEVYUEVDVF9FUShwYXJjZWxhYmxlLmludDY0X21heCwgSU5UNjRfTUFYKTsKICAgRVhQRUNUX0VRKHBhcmNlbGFibGUuaGV4SW50MzJfbmVnXzEsIC0xKTsKIAorICBmb3IgKHNpemVfdCBuZHggPSAwOyBuZHggPCBwYXJjZWxhYmxlLmludDhfMS5zaXplKCk7IG5keCsrKSB7CisgICAgRVhQRUNUX0VRKHBhcmNlbGFibGUuaW50OF8xW25keF0sIDEpIDw8IG5keDsKKyAgfQorCiAgIGZvciAoc2l6ZV90IG5keCA9IDA7IG5keCA8IHBhcmNlbGFibGUuaW50MzJfMS5zaXplKCk7IG5keCsrKSB7CiAgICAgRVhQRUNUX0VRKHBhcmNlbGFibGUuaW50MzJfMVtuZHhdLCAxKSA8PCBuZHg7CiAgIH0KQEAgLTUxNiwzICs1NTEsMTYwIEBACiAKICAgRVhQRUNUX0VRKGV4cGVjdGVkLCBwLnRvU3RyaW5nKCkpOwogfQorCitURVNUX0YoQWlkbFRlc3QsIFJldmVyc2VSZWN1cnNpdmVMaXN0KSB7CisgIHN0ZDo6dW5pcXVlX3B0cjxSZWN1cnNpdmVMaXN0PiBoZWFkOworICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKKyAgICBhdXRvIG5vZGUgPSBzdGQ6Om1ha2VfdW5pcXVlPFJlY3Vyc2l2ZUxpc3Q+KCk7CisgICAgbm9kZS0+dmFsdWUgPSBpOworICAgIG5vZGUtPm5leHQgPSBzdGQ6Om1vdmUoaGVhZCk7CisgICAgaGVhZCA9IHN0ZDo6bW92ZShub2RlKTsKKyAgfQorICAvLyBoZWFkOiBbOSwgOCwgLi4uIDBdCisKKyAgUmVjdXJzaXZlTGlzdCByZXZlcnNlZDsKKyAgYXV0byBzdGF0dXMgPSBzZXJ2aWNlLT5SZXZlcnNlTGlzdCgqaGVhZCwgJnJldmVyc2VkKTsKKyAgQVNTRVJUX1RSVUUoc3RhdHVzLmlzT2soKSkgPDwgc3RhdHVzLnRvU3RyaW5nOCgpOworCisgIC8vIHJldmVyc2VkIHNob3VsZCBiZSBbMCwgMSwgLi4gOV0KKyAgUmVjdXJzaXZlTGlzdCogY3VyID0gJnJldmVyc2VkOworICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKKyAgICBFWFBFQ1RfRVEoaSwgY3VyLT52YWx1ZSk7CisgICAgY3VyID0gY3VyLT5uZXh0LmdldCgpOworICB9CisgIEVYUEVDVF9FUShudWxscHRyLCBjdXIpOworfQorCitURVNUX0YoQWlkbFRlc3QsIEdldFVuaW9uVGFncykgeworICBzdGQ6OnZlY3RvcjxVbmlvbj4gdW5pb25zOworICBzdGQ6OnZlY3RvcjxVbmlvbjo6VGFnPiB0YWdzOworICAvLyB0ZXN0IGVtcHR5CisgIGF1dG8gc3RhdHVzID0gc2VydmljZS0+R2V0VW5pb25UYWdzKHVuaW9ucywgJnRhZ3MpOworICBBU1NFUlRfVFJVRShzdGF0dXMuaXNPaygpKSA8PCBzdGF0dXMudG9TdHJpbmc4KCk7CisgIEVYUEVDVF9FUSh0YWdzLCAoc3RkOjp2ZWN0b3I8VW5pb246OlRhZz57fSkpOworICAvLyB0ZXN0IG5vbi1lbXB0eQorICB1bmlvbnMucHVzaF9iYWNrKFVuaW9uOjptYWtlPFVuaW9uOjpuPigpKTsKKyAgdW5pb25zLnB1c2hfYmFjayhVbmlvbjo6bWFrZTxVbmlvbjo6bnM+KCkpOworICBzdGF0dXMgPSBzZXJ2aWNlLT5HZXRVbmlvblRhZ3ModW5pb25zLCAmdGFncyk7CisgIEFTU0VSVF9UUlVFKHN0YXR1cy5pc09rKCkpIDw8IHN0YXR1cy50b1N0cmluZzgoKTsKKyAgRVhQRUNUX0VRKHRhZ3MsIChzdGQ6OnZlY3RvcjxVbmlvbjo6VGFnPntVbmlvbjo6biwgVW5pb246Om5zfSkpOworfQorCitURVNUX0YoQWlkbFRlc3QsIEZpeGVkU2l6ZUFycmF5KSB7CisgIGFuZHJvaWQ6OlBhcmNlbCBwYXJjZWw7CisKKyAgRml4ZWRTaXplQXJyYXlFeGFtcGxlIHA7CisgIHAuYnl0ZU1hdHJpeFswXVswXSA9IDA7CisgIHAuYnl0ZU1hdHJpeFswXVsxXSA9IDE7CisgIHAuYnl0ZU1hdHJpeFsxXVswXSA9IDI7CisgIHAuYnl0ZU1hdHJpeFsxXVsxXSA9IDM7CisgIHAuZmxvYXRNYXRyaXhbMF1bMF0gPSAwLmY7CisgIHAuZmxvYXRNYXRyaXhbMF1bMV0gPSAxLmY7CisgIHAuZmxvYXRNYXRyaXhbMV1bMF0gPSAyLmY7CisgIHAuZmxvYXRNYXRyaXhbMV1bMV0gPSAzLmY7CisgIEVYUEVDVF9FUShPSywgcC53cml0ZVRvUGFyY2VsKCZwYXJjZWwpKTsKKworICBwYXJjZWwuc2V0RGF0YVBvc2l0aW9uKDApOworCisgIEZpeGVkU2l6ZUFycmF5RXhhbXBsZSBxOworICBFWFBFQ1RfRVEoT0ssIHEucmVhZEZyb21QYXJjZWwoJnBhcmNlbCkpOworICBFWFBFQ1RfRVEocCwgcSk7Cit9CisKK1RFU1RfRihBaWRsVGVzdCwgRml4ZWRTaXplQXJyYXlXaXRoVmFsdWVzQXROdWxsYWJsZUZpZWxkcykgeworICBhbmRyb2lkOjpQYXJjZWwgcGFyY2VsOworCisgIEZpeGVkU2l6ZUFycmF5RXhhbXBsZSBwOworICBwLmJvb2xOdWxsYWJsZUFycmF5ID0gc3RkOjphcnJheTxib29sLCAyPnt0cnVlLCBmYWxzZX07CisgIHAuYnl0ZU51bGxhYmxlQXJyYXkgPSBzdGQ6OmFycmF5PHVpbnQ4X3QsIDI+ezQyLCAwfTsKKyAgcC5zdHJpbmdOdWxsYWJsZUFycmF5ID0gc3RkOjphcnJheTxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiwgMj57ImhlbGxvIiwgIndvcmxkIn07CisKKyAgcC5ib29sTnVsbGFibGVNYXRyaXguZW1wbGFjZSgpOworICBwLmJvb2xOdWxsYWJsZU1hdHJpeC0+YXQoMCkgPSBzdGQ6OmFycmF5PGJvb2wsIDI+e3RydWUsIGZhbHNlfTsKKyAgcC5ieXRlTnVsbGFibGVNYXRyaXguZW1wbGFjZSgpOworICBwLmJ5dGVOdWxsYWJsZU1hdHJpeC0+YXQoMCkgPSBzdGQ6OmFycmF5PHVpbnQ4X3QsIDI+ezQyLCAwfTsKKyAgcC5zdHJpbmdOdWxsYWJsZU1hdHJpeC5lbXBsYWNlKCk7CisgIHAuc3RyaW5nTnVsbGFibGVNYXRyaXgtPmF0KDApID0gc3RkOjphcnJheTxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiwgMj57ImhlbGxvIiwgIndvcmxkIn07CisKKyAgRVhQRUNUX0VRKE9LLCBwLndyaXRlVG9QYXJjZWwoJnBhcmNlbCkpOworCisgIHBhcmNlbC5zZXREYXRhUG9zaXRpb24oMCk7CisKKyAgRml4ZWRTaXplQXJyYXlFeGFtcGxlIHE7CisgIEVYUEVDVF9FUShPSywgcS5yZWFkRnJvbVBhcmNlbCgmcGFyY2VsKSk7CisgIEVYUEVDVF9FUShwLCBxKTsKK30KKworVEVTVF9GKEFpZGxUZXN0LCBGaXhlZFNpemVBcnJheU9mQnl0ZXNTaG91bGRCZVBhY2tlZCkgeworICBhbmRyb2lkOjpQYXJjZWwgcGFyY2VsOworCisgIHN0ZDo6YXJyYXk8c3RkOjphcnJheTx1aW50OF90LCAzPiwgMj4gYnl0ZV9hcnJheTsKKyAgYnl0ZV9hcnJheVswXSA9IHsxLCAyLCAzfTsKKyAgYnl0ZV9hcnJheVsxXSA9IHs0LCA1LCA2fTsKKyAgRVhQRUNUX0VRKE9LLCBwYXJjZWwud3JpdGVGaXhlZEFycmF5KGJ5dGVfYXJyYXkpKTsKKworICBwYXJjZWwuc2V0RGF0YVBvc2l0aW9uKDApOworCisgIGludDMyX3QgbGVuOworICBFWFBFQ1RfRVEoT0ssIHBhcmNlbC5yZWFkSW50MzIoJmxlbikpOworICBFWFBFQ1RfRVEoMiwgbGVuKTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYnl0ZV92ZWN0b3I7CisgIEVYUEVDVF9FUShPSywgcGFyY2VsLnJlYWRCeXRlVmVjdG9yKCZieXRlX3ZlY3RvcikpOworICBFWFBFQ1RfRVEoYnl0ZV92ZWN0b3IsIChzdGQ6OnZlY3Rvcjx1aW50OF90PnsxLCAyLCAzfSkpOworICBFWFBFQ1RfRVEoT0ssIHBhcmNlbC5yZWFkQnl0ZVZlY3RvcigmYnl0ZV92ZWN0b3IpKTsKKyAgRVhQRUNUX0VRKGJ5dGVfdmVjdG9yLCAoc3RkOjp2ZWN0b3I8dWludDhfdD57NCwgNSwgNn0pKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFNlcnZpY2UsIHR5cGVuYW1lIE1lbUZuLCB0eXBlbmFtZSBJbnB1dD4KK3ZvaWQgQ2hlY2tSZXBlYXQoU2VydmljZSBzZXJ2aWNlLCBNZW1GbiBmbiwgSW5wdXQgaW5wdXQpIHsKKyAgSW5wdXQgb3V0MSwgb3V0MjsKKyAgRVhQRUNUX1RSVUUoc3RkOjppbnZva2UoZm4sIHNlcnZpY2UsIGlucHV0LCAmb3V0MSwgJm91dDIpLmlzT2soKSk7CisgIEVYUEVDVF9FUShpbnB1dCwgb3V0MSk7CisgIEVYUEVDVF9FUShpbnB1dCwgb3V0Mik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RkOjphcnJheTxzdGQ6OmFycmF5PFQsIDM+LCAyPiBNYWtlMmRBcnJheShzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gdmFsdWVzKSB7CisgIHN0ZDo6YXJyYXk8c3RkOjphcnJheTxULCAzPiwgMj4gYXJyID0ge307CisgIGF1dG8gaXQgPSBzdGQ6OmJlZ2luKHZhbHVlcyk7CisgIGZvciAoYXV0byYgcm93IDogYXJyKSB7CisgICAgZm9yIChhdXRvJiBlbCA6IHJvdykgeworICAgICAgaWYgKGl0ID09IHN0ZDo6ZW5kKHZhbHVlcykpIGJyZWFrOworICAgICAgZWwgPSAqaXQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGFycjsKK30KKworVEVTVF9GKEFpZGxUZXN0LCBGaXhlZFNpemVBcnJheU92ZXJCaW5kZXIpIHsKKyAgc3A8SVJlcGVhdEZpeGVkU2l6ZUFycmF5PiBzZXJ2aWNlOworICBBU1NFUlRfRVEoT0ssIGdldFNlcnZpY2UoSVJlcGVhdEZpeGVkU2l6ZUFycmF5OjpkZXNjcmlwdG9yLCAmc2VydmljZSkpOworCisgIENoZWNrUmVwZWF0KHNlcnZpY2UsICZJUmVwZWF0Rml4ZWRTaXplQXJyYXk6OlJlcGVhdEJ5dGVzLCAoc3RkOjphcnJheTx1aW50OF90LCAzPnsxLCAyLCAzfSkpOworCisgIENoZWNrUmVwZWF0KHNlcnZpY2UsICZJUmVwZWF0Rml4ZWRTaXplQXJyYXk6OlJlcGVhdEludHMsIChzdGQ6OmFycmF5PGludDMyX3QsIDM+ezEsIDIsIDN9KSk7CisKKyAgc3A8SUJpbmRlcj4gYmluZGVyMSA9IG5ldyBCQmluZGVyKCk7CisgIHNwPElCaW5kZXI+IGJpbmRlcjIgPSBuZXcgQkJpbmRlcigpOworICBzcDxJQmluZGVyPiBiaW5kZXIzID0gbmV3IEJCaW5kZXIoKTsKKyAgQ2hlY2tSZXBlYXQoc2VydmljZSwgJklSZXBlYXRGaXhlZFNpemVBcnJheTo6UmVwZWF0QmluZGVycywKKyAgICAgICAgICAgICAgKHN0ZDo6YXJyYXk8c3A8SUJpbmRlcj4sIDM+e2JpbmRlcjEsIGJpbmRlcjIsIGJpbmRlcjN9KSk7CisKKyAgSW50UGFyY2VsYWJsZSBwMSwgcDIsIHAzOworICBwMS52YWx1ZSA9IDE7CisgIHAyLnZhbHVlID0gMjsKKyAgcDMudmFsdWUgPSAzOworICBDaGVja1JlcGVhdChzZXJ2aWNlLCAmSVJlcGVhdEZpeGVkU2l6ZUFycmF5OjpSZXBlYXRQYXJjZWxhYmxlcywKKyAgICAgICAgICAgICAgKHN0ZDo6YXJyYXk8SW50UGFyY2VsYWJsZSwgMz57cDEsIHAyLCBwM30pKTsKKworICBDaGVja1JlcGVhdChzZXJ2aWNlLCAmSVJlcGVhdEZpeGVkU2l6ZUFycmF5OjpSZXBlYXQyZEJ5dGVzLCBNYWtlMmRBcnJheTx1aW50OF90Pih7MSwgMiwgM30pKTsKKworICBDaGVja1JlcGVhdChzZXJ2aWNlLCAmSVJlcGVhdEZpeGVkU2l6ZUFycmF5OjpSZXBlYXQyZEludHMsIE1ha2UyZEFycmF5PGludDMyX3Q+KHsxLCAyLCAzfSkpOworCisgIC8vIE5vdC1udWxsYWJsZQorICBDaGVja1JlcGVhdChzZXJ2aWNlLCAmSVJlcGVhdEZpeGVkU2l6ZUFycmF5OjpSZXBlYXQyZEJpbmRlcnMsCisgICAgICAgICAgICAgIE1ha2UyZEFycmF5PHNwPElCaW5kZXI+Pih7YmluZGVyMSwgYmluZGVyMiwgYmluZGVyMywgYmluZGVyMSwgYmluZGVyMiwgYmluZGVyM30pKTsKKworICBDaGVja1JlcGVhdChzZXJ2aWNlLCAmSVJlcGVhdEZpeGVkU2l6ZUFycmF5OjpSZXBlYXQyZFBhcmNlbGFibGVzLAorICAgICAgICAgICAgICBNYWtlMmRBcnJheTxJbnRQYXJjZWxhYmxlPih7cDEsIHAyLCBwM30pKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9haWRsX3Rlc3RfY2xpZW50X3ByaW1pdGl2ZXMuY3BwIGIvdGVzdHMvYWlkbF90ZXN0X2NsaWVudF9wcmltaXRpdmVzLmNwcAppbmRleCBmMTViNjdlLi5lZmY2N2M0IDEwMDY0NAotLS0gYS90ZXN0cy9haWRsX3Rlc3RfY2xpZW50X3ByaW1pdGl2ZXMuY3BwCisrKyBiL3Rlc3RzL2FpZGxfdGVzdF9jbGllbnRfcHJpbWl0aXZlcy5jcHAKQEAgLTE5Niw3ICsxOTYsNjIgQEAKICAgICBBU1NFUlRfVFJVRShzdGF0dXMuaXNPaygpKTsKICAgICBpbnB1dC5wdXNoX2JhY2soSU5hbWVkQ2FsbGJhY2s6OmFzQmluZGVyKGdvdCkpOwogICB9Ci0KKyAgeworICAgIHN0ZDo6dmVjdG9yPHNwPElOYW1lZENhbGxiYWNrPj4gZ290OworICAgIGF1dG8gc3RhdHVzID0gc2VydmljZS0+R2V0SW50ZXJmYWNlQXJyYXkobmFtZXMsICZnb3QpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cy5pc09rKCkpOworICAgIGJvb2wgdmVyaWZpZWQgPSBmYWxzZTsKKyAgICBzdGF0dXMgPSBzZXJ2aWNlLT5WZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VBcnJheShnb3QsIG5hbWVzLCAmdmVyaWZpZWQpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cy5pc09rKCkpOworICAgIEFTU0VSVF9UUlVFKHZlcmlmaWVkKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgU3RyaW5nMTYgbmFtZTsKKyAgICAgIEFTU0VSVF9UUlVFKGdvdFtpXS0+R2V0TmFtZSgmbmFtZSkuaXNPaygpKTsKKyAgICAgIEFTU0VSVF9USEFUKG5hbWUsIEVxKG5hbWVzW2ldKSk7CisgICAgfQorICB9CisgIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPFN0cmluZzE2Pj4gbmFtZXMgPSB7U3RyaW5nMTZ7IkxhcnJ5In0sIHN0ZDo6bnVsbG9wdCwgU3RyaW5nMTZ7Ik1vZSJ9fTsKKyAgICBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHNwPElOYW1lZENhbGxiYWNrPj4+IGdvdDsKKyAgICBhdXRvIHN0YXR1cyA9IHNlcnZpY2UtPkdldE51bGxhYmxlSW50ZXJmYWNlQXJyYXkobmFtZXMsICZnb3QpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cy5pc09rKCkpOworICAgIGJvb2wgdmVyaWZpZWQgPSBmYWxzZTsKKyAgICBzdGF0dXMgPSBzZXJ2aWNlLT5WZXJpZnlOYW1lc1dpdGhOdWxsYWJsZUludGVyZmFjZUFycmF5KGdvdCwgbmFtZXMsICZ2ZXJpZmllZCk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzLmlzT2soKSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZpZWQpOworICAgIEFTU0VSVF9UUlVFKGdvdC5oYXNfdmFsdWUoKSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgIGlmIChuYW1lc1tpXS5oYXNfdmFsdWUoKSkgeworICAgICAgICBBU1NFUlRfTkUoZ290LT5hdChpKS5nZXQoKSwgbnVsbHB0cik7CisgICAgICAgIFN0cmluZzE2IG5hbWU7CisgICAgICAgIEFTU0VSVF9UUlVFKGdvdC0+YXQoaSktPkdldE5hbWUoJm5hbWUpLmlzT2soKSk7CisgICAgICAgIEFTU0VSVF9USEFUKG5hbWUsIEVxKG5hbWVzW2ldLnZhbHVlKCkpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVF9FUShnb3QtPmF0KGkpLmdldCgpLCBudWxscHRyKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8U3RyaW5nMTY+PiBuYW1lcyA9IHtTdHJpbmcxNnsiTGFycnkifSwgc3RkOjpudWxsb3B0LCBTdHJpbmcxNnsiTW9lIn19OworICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3A8SU5hbWVkQ2FsbGJhY2s+Pj4gZ290OworICAgIGF1dG8gc3RhdHVzID0gc2VydmljZS0+R2V0SW50ZXJmYWNlTGlzdChuYW1lcywgJmdvdCk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzLmlzT2soKSk7CisgICAgYm9vbCB2ZXJpZmllZCA9IGZhbHNlOworICAgIHN0YXR1cyA9IHNlcnZpY2UtPlZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUxpc3QoZ290LCBuYW1lcywgJnZlcmlmaWVkKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMuaXNPaygpKTsKKyAgICBBU1NFUlRfVFJVRSh2ZXJpZmllZCk7CisgICAgQVNTRVJUX1RSVUUoZ290Lmhhc192YWx1ZSgpKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgaWYgKG5hbWVzW2ldLmhhc192YWx1ZSgpKSB7CisgICAgICAgIEFTU0VSVF9ORShnb3QtPmF0KGkpLmdldCgpLCBudWxscHRyKTsKKyAgICAgICAgU3RyaW5nMTYgbmFtZTsKKyAgICAgICAgQVNTRVJUX1RSVUUoZ290LT5hdChpKS0+R2V0TmFtZSgmbmFtZSkuaXNPaygpKTsKKyAgICAgICAgQVNTRVJUX1RIQVQobmFtZSwgRXEobmFtZXNbaV0udmFsdWUoKSkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgQVNTRVJUX0VRKGdvdC0+YXQoaSkuZ2V0KCksIG51bGxwdHIpOworICAgICAgfQorICAgIH0KKyAgfQogICBpZiAoY3BwX2phdmFfdGVzdHMpIHsKICAgICBzdGQ6OnZlY3RvcjxzcDxJQmluZGVyPj4gb3V0cHV0OwogICAgIHN0ZDo6dmVjdG9yPHNwPElCaW5kZXI+PiByZXZlcnNlZDsKZGlmZiAtLWdpdCBhL3Rlc3RzL2FpZGxfdGVzdF9jbGllbnRfc2VydmljZV9leGNlcHRpb25zLmNwcCBiL3Rlc3RzL2FpZGxfdGVzdF9jbGllbnRfc2VydmljZV9leGNlcHRpb25zLmNwcAppbmRleCBkZjNiMjlmLi44OWRjMTljIDEwMDY0NAotLS0gYS90ZXN0cy9haWRsX3Rlc3RfY2xpZW50X3NlcnZpY2VfZXhjZXB0aW9ucy5jcHAKKysrIGIvdGVzdHMvYWlkbF90ZXN0X2NsaWVudF9zZXJ2aWNlX2V4Y2VwdGlvbnMuY3BwCkBAIC0yNCwxNiArMjQsMTIgQEAKIH0KIAogVEVTVF9GKEFpZGxUZXN0LCBzZXJ2aWNlU3BlY2lmaWNFeGNlcHRpb24pIHsKLSAgaWYgKGJhY2tlbmQgPT0gQmFja2VuZFR5cGU6OkpBVkEpIHsKLSAgICAvLyBUT0RPKGIvMTY5NzA0NDgwKTogaW52ZXN0aWdhdGUgd2h5IHRoaXMgaXMgcmV0dXJuaW5nICd1bmV4cGVjdGVkIG51bGwnCi0gICAgR1RFU1RfU0tJUCgpIDw8ICJCcm9rZW4gaW4gSmF2YT8gYi8xNjk3MDQ0ODAiOwotICB9Ci0KICAgdXNpbmcgdGVzdGluZzo6RXE7CiAKICAgZm9yIChpbnQzMl90IGkgPSAtMTsgaSA8IDI7ICsraSkgewogICAgIGF1dG8gc3RhdHVzID0gc2VydmljZS0+VGhyb3dTZXJ2aWNlRXhjZXB0aW9uKGkpOwotICAgIEFTU0VSVF9USEFUKHN0YXR1cy5leGNlcHRpb25Db2RlKCksIEVxKGFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpFWF9TRVJWSUNFX1NQRUNJRklDKSkgPDwgc3RhdHVzOwotICAgIEFTU0VSVF9USEFUKHN0YXR1cy5zZXJ2aWNlU3BlY2lmaWNFcnJvckNvZGUoKSwgRXEoaSkpIDw8IHN0YXR1czsKKyAgICBFWFBFQ1RfVEhBVChzdGF0dXMuZXhjZXB0aW9uQ29kZSgpLCBFcShhbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6RVhfU0VSVklDRV9TUEVDSUZJQykpCisgICAgICAgIDw8IHN0YXR1cyA8PCAiIGZvciAiIDw8IGk7CisgICAgRVhQRUNUX1RIQVQoc3RhdHVzLnNlcnZpY2VTcGVjaWZpY0Vycm9yQ29kZSgpLCBFcShpKSkgPDwgc3RhdHVzIDw8ICIgZm9yICIgPDwgaTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYWlkbF90ZXN0X2NsaWVudF92ZXJzaW9uZWRfaW50ZXJmYWNlLmNwcCBiL3Rlc3RzL2FpZGxfdGVzdF9jbGllbnRfdmVyc2lvbmVkX2ludGVyZmFjZS5jcHAKaW5kZXggYzQyYTQxYi4uMjJhODg3YiAxMDA2NDQKLS0tIGEvdGVzdHMvYWlkbF90ZXN0X2NsaWVudF92ZXJzaW9uZWRfaW50ZXJmYWNlLmNwcAorKysgYi90ZXN0cy9haWRsX3Rlc3RfY2xpZW50X3ZlcnNpb25lZF9pbnRlcmZhY2UuY3BwCkBAIC0xNCw2ICsxNCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9CbkZvb0ludGVyZmFjZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvSUZvb0ludGVyZmFjZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgpAQCAtMjcsNiArMjgsNyBAQAogdXNpbmcgYW5kcm9pZDo6YWlkbDo6dmVyc2lvbmVkOjp0ZXN0czo6QmF6VW5pb247CiB1c2luZyBhbmRyb2lkOjphaWRsOjp2ZXJzaW9uZWQ6OnRlc3RzOjpGb287CiB1c2luZyBhbmRyb2lkOjphaWRsOjp2ZXJzaW9uZWQ6OnRlc3RzOjpJRm9vSW50ZXJmYWNlOwordXNpbmcgYW5kcm9pZDo6YWlkbDo6dmVyc2lvbmVkOjp0ZXN0czo6SUZvb0ludGVyZmFjZURlbGVnYXRvcjsKIAogY2xhc3MgVmVyc2lvbmVkSW50ZXJmYWNlVGVzdCA6IHB1YmxpYyBBaWRsVGVzdCB7CiAgcHVibGljOgpAQCAtNzksOCArODEsMjIgQEAKIAogVEVTVF9GKFZlcnNpb25lZEludGVyZmFjZVRlc3QsIHJlYWREYXRhQ29ycmVjdGx5QWZ0ZXJQYXJjZWxhYmxlV2l0aE5ld0ZpZWxkKSB7CiAgIEZvbyBpbkZvbywgaW5vdXRGb28sIG91dEZvbzsKKyAgaW5vdXRGb28uaW50RGVmYXVsdDQyID0gMDsKKyAgb3V0Rm9vLmludERlZmF1bHQ0MiA9IDA7CiAgIGludDMyX3QgcmV0OwogICBhdXRvIHN0YXR1cyA9IHZlcnNpb25lZC0+aWdub3JlUGFyY2VsYWJsZXNBbmRSZXBlYXRJbnQoaW5Gb28sICZpbm91dEZvbywgJm91dEZvbywgNDMsICZyZXQpOwogICBFWFBFQ1RfVFJVRShzdGF0dXMuaXNPaygpKTsKICAgRVhQRUNUX0VRKDQzLCByZXQpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyAgRVhQRUNUX0VRKDAsIGlub3V0Rm9vLmludERlZmF1bHQ0Mik7CisgIEVYUEVDVF9FUSgwLCBvdXRGb28uaW50RGVmYXVsdDQyKTsKK30KKworVEVTVF9GKFZlcnNpb25lZEludGVyZmFjZVRlc3QsIG5ld2VyRGVsZWdhdG9yUmV0dXJuc0ltcGxWZXJzaW9uKSB7CisgIGF1dG8gZGVsZWdhdG9yID0gc3A8SUZvb0ludGVyZmFjZURlbGVnYXRvcj46Om1ha2UodmVyc2lvbmVkKTsKKyAgRVhQRUNUX0VRKDEsIGRlbGVnYXRvci0+Z2V0SW50ZXJmYWNlVmVyc2lvbigpKTsKK30KKworVEVTVF9GKFZlcnNpb25lZEludGVyZmFjZVRlc3QsIG5ld2VyRGVsZWdhdG9yUmV0dXJuc0ltcGxIYXNoKSB7CisgIGF1dG8gZGVsZWdhdG9yID0gc3A8SUZvb0ludGVyZmFjZURlbGVnYXRvcj46Om1ha2UodmVyc2lvbmVkKTsKKyAgRVhQRUNUX0VRKCI5ZTdiZTE4NTk4MjBjNTlkOWQ1NWRkMTMzZTcxYTM2ODdiNWQyZTViIiwgZGVsZWdhdG9yLT5nZXRJbnRlcmZhY2VIYXNoKCkpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYWlkbF90ZXN0X3NlcnZpY2UuY3BwIGIvdGVzdHMvYWlkbF90ZXN0X3NlcnZpY2UuY3BwCmluZGV4IDIyY2Q0MmIuLmExMzU0N2YgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2FpZGxfdGVzdF9zZXJ2aWNlLmNwcAorKysgYi90ZXN0cy9haWRsX3Rlc3Rfc2VydmljZS5jcHAKQEAgLTU0LDkgKzU0LDEzIEBACiAjaW5jbHVkZSAiYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dC5oIgogI2luY2x1ZGUgImFuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQyLmgiCiAKKyNpbmNsdWRlICJhbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0JuTmVzdGVkU2VydmljZS5oIgorCiAjaW5jbHVkZSAiYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0JuTG9nZ2FibGVJbnRlcmZhY2UuaCIKICNpbmNsdWRlICJhbmRyb2lkL2FpZGwvbG9nZ2FibGUvRGF0YS5oIgogCisjaW5jbHVkZSAiYW5kcm9pZC9haWRsL2ZpeGVkc2l6ZWFycmF5L0ZpeGVkU2l6ZUFycmF5RXhhbXBsZS5oIgorCiAvLyBVc2VkIGltcGxpY2l0bHkuCiAjdW5kZWYgTE9HX1RBRwogI2RlZmluZSBMT0dfVEFHICJhaWRsX25hdGl2ZV9zZXJ2aWNlIgpAQCAtODMsNiArODcsNyBAQAogCiAvLyBHZW5lcmF0ZWQgY29kZToKIHVzaW5nIGFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCYWNrZW5kVHlwZTsKK3VzaW5nIGFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCYWRQYXJjZWxhYmxlOwogdXNpbmcgYW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJuQ3BwSmF2YVRlc3RzOwogdXNpbmcgYW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJuTmFtZWRDYWxsYmFjazsKIHVzaW5nIGFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCbk5ld05hbWU7CkBAIC05Nyw2ICsxMDIsNyBAQAogdXNpbmcgYW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW07CiB1c2luZyBhbmRyb2lkOjphaWRsOjp0ZXN0czo6SU9sZE5hbWU7CiB1c2luZyBhbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW07Cit1c2luZyBhbmRyb2lkOjphaWRsOjp0ZXN0czo6UmVjdXJzaXZlTGlzdDsKIHVzaW5nIGFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpTaW1wbGVQYXJjZWxhYmxlOwogdXNpbmcgYW5kcm9pZDo6YWlkbDo6dGVzdHM6OlN0cnVjdHVyZWRQYXJjZWxhYmxlOwogdXNpbmcgYW5kcm9pZDo6YWlkbDo6dGVzdHM6OlVuaW9uOwpAQCAtMTc4LDYgKzE4NCwxMSBAQAogICBDcHBKYXZhVGVzdHMoKSA9IGRlZmF1bHQ7CiAgIH5DcHBKYXZhVGVzdHMoKSA9IGRlZmF1bHQ7CiAKKyAgU3RhdHVzIFJlcGVhdEJhZFBhcmNlbGFibGUoY29uc3QgQmFkUGFyY2VsYWJsZSYgaW5wdXQsIEJhZFBhcmNlbGFibGUqIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgICpfYWlkbF9yZXR1cm4gPSBpbnB1dDsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICB9CisKICAgU3RhdHVzIFJlcGVhdFNpbXBsZVBhcmNlbGFibGUoY29uc3QgU2ltcGxlUGFyY2VsYWJsZSYgaW5wdXQsIFNpbXBsZVBhcmNlbGFibGUqIHJlcGVhdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2ltcGxlUGFyY2VsYWJsZSogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CiAgICAgQUxPR0koIlJlcGVhdGVkIGEgU2ltcGxlUGFyY2VsYWJsZSAlcyIsIGlucHV0LnRvU3RyaW5nKCkuY19zdHIoKSk7CkBAIC0yNDksNiArMjYwLDcgQEAKICAgU3RhdHVzIFJldmVyc2VGaWxlRGVzY3JpcHRvckFycmF5KGNvbnN0IHZlY3Rvcjx1bmlxdWVfZmQ+JiBpbnB1dCwgdmVjdG9yPHVuaXF1ZV9mZD4qIHJlcGVhdGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPHVuaXF1ZV9mZD4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgewogICAgIEFMT0dJKCJSZXZlcnNpbmcgZGVzY3JpcHRvciBhcnJheSBvZiBsZW5ndGggJXp1IiwgaW5wdXQuc2l6ZSgpKTsKKyAgICByZXBlYXRlZC0+Y2xlYXIoKTsKICAgICBmb3IgKGNvbnN0IGF1dG8mIGl0ZW0gOiBpbnB1dCkgewogICAgICAgcmVwZWF0ZWQtPnB1c2hfYmFjayh1bmlxdWVfZmQoZHVwKGl0ZW0uZ2V0KCkpKSk7CiAgICAgICBfYWlkbF9yZXR1cm4tPnB1c2hfYmFjayh1bmlxdWVfZmQoZHVwKGl0ZW0uZ2V0KCkpKSk7CkBAIC0yNTYsMjcgKzI2OCw2IEBACiAgICAgc3RkOjpyZXZlcnNlKF9haWRsX3JldHVybi0+YmVnaW4oKSwgX2FpZGxfcmV0dXJuLT5lbmQoKSk7CiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKICAgfQotCi0gIFN0YXR1cyBUYWtlc0FuSUJpbmRlckxpc3QoY29uc3QgdmVjdG9yPHNwPElCaW5kZXI+PiYgaW5wdXQpIG92ZXJyaWRlIHsKLSAgICAodm9pZClpbnB1dDsKLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotICB9Ci0gIFN0YXR1cyBUYWtlc0FOdWxsYWJsZUlCaW5kZXJMaXN0KGNvbnN0IG9wdGlvbmFsPHZlY3RvcjxzcDxJQmluZGVyPj4+JiBpbnB1dCkgewotICAgICh2b2lkKWlucHV0OwotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci0gIH0KLQotICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdEV4dGVuZGFibGVQYXJjZWxhYmxlKAotICAgICAgY29uc3QgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6ZXh0ZW5zaW9uOjpFeHRlbmRhYmxlUGFyY2VsYWJsZSYgZXAsCi0gICAgICA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpleHRlbnNpb246OkV4dGVuZGFibGVQYXJjZWxhYmxlKiBlcDIpIHsKLSAgICBlcDItPmEgPSBlcC5hOwotICAgIGVwMi0+YiA9IGVwLmI7Ci0gICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpleHRlbnNpb246Ok15RXh0PiBteUV4dDsKLSAgICBlcC5leHQuZ2V0UGFyY2VsYWJsZSgmbXlFeHQpOwotICAgIGVwMi0+ZXh0LnNldFBhcmNlbGFibGUobXlFeHQpOwotCi0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLSAgfQogfTsKIAogY2xhc3MgTmF0aXZlU2VydmljZSA6IHB1YmxpYyBCblRlc3RTZXJ2aWNlIHsKQEAgLTQzMiw2ICs0MjMsOTIgQEAKICAgICByZXR1cm4gc3RhdHVzOwogICB9CiAKKyAgU3RhdHVzIEdldEludGVyZmFjZUFycmF5KGNvbnN0IHZlY3RvcjxTdHJpbmcxNj4mIG5hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPHNwPElOYW1lZENhbGxiYWNrPj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHZlY3RvcjxzcDxJTmFtZWRDYWxsYmFjaz4+IHNlcnZpY2VzKG5hbWVzLnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuYW1lcy5zaXplKCk7IGkrKykgeworICAgICAgaWYgKGF1dG8gc3QgPSBHZXRPdGhlclRlc3RTZXJ2aWNlKG5hbWVzW2ldLCAmc2VydmljZXNbaV0pOyAhc3QuaXNPaygpKSB7CisgICAgICAgIHJldHVybiBzdDsKKyAgICAgIH0KKyAgICB9CisgICAgKl9haWRsX3JldHVybiA9IHN0ZDo6bW92ZShzZXJ2aWNlcyk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgfQorCisgIFN0YXR1cyBWZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VBcnJheShjb25zdCB2ZWN0b3I8c3A8SU5hbWVkQ2FsbGJhY2s+PiYgc2VydmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3I8U3RyaW5nMTY+JiBuYW1lcywgYm9vbCogX2FpZGxfcmV0KSBvdmVycmlkZSB7CisgICAgaWYgKHNlcnZpY2VzLnNpemUoKSA9PSBuYW1lcy5zaXplKCkpIHsKKyAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2VydmljZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKGF1dG8gc3QgPSBWZXJpZnlOYW1lKHNlcnZpY2VzW2ldLCBuYW1lc1tpXSwgX2FpZGxfcmV0KTsgIXN0LmlzT2soKSB8fCAhKl9haWRsX3JldCkgeworICAgICAgICAgIHJldHVybiBzdDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgKl9haWRsX3JldCA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICpfYWlkbF9yZXQgPSBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgfQorCisgIFN0YXR1cyBHZXROdWxsYWJsZUludGVyZmFjZUFycmF5KGNvbnN0IG9wdGlvbmFsPHZlY3RvcjxvcHRpb25hbDxTdHJpbmcxNj4+PiYgbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsPHZlY3RvcjxzcDxJTmFtZWRDYWxsYmFjaz4+PiogX2FpZGxfcmV0KSBvdmVycmlkZSB7CisgICAgdmVjdG9yPHNwPElOYW1lZENhbGxiYWNrPj4gc2VydmljZXM7CisgICAgaWYgKG5hbWVzLmhhc192YWx1ZSgpKSB7CisgICAgICBmb3IgKGNvbnN0IGF1dG8mIG5hbWUgOiAqbmFtZXMpIHsKKyAgICAgICAgaWYgKG5hbWUuaGFzX3ZhbHVlKCkpIHsKKyAgICAgICAgICBzcDxJTmFtZWRDYWxsYmFjaz4gcmV0OworICAgICAgICAgIGlmIChhdXRvIHN0ID0gR2V0T3RoZXJUZXN0U2VydmljZSgqbmFtZSwgJnJldCk7ICFzdC5pc09rKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBzdDsKKyAgICAgICAgICB9CisgICAgICAgICAgc2VydmljZXMucHVzaF9iYWNrKHN0ZDo6bW92ZShyZXQpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzZXJ2aWNlcy5lbXBsYWNlX2JhY2soKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICAqX2FpZGxfcmV0ID0gc3RkOjptb3ZlKHNlcnZpY2VzKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICB9CisKKyAgU3RhdHVzIFZlcmlmeU5hbWVzV2l0aE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoY29uc3Qgb3B0aW9uYWw8dmVjdG9yPHNwPElOYW1lZENhbGxiYWNrPj4+JiBzZXJ2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9uYWw8dmVjdG9yPG9wdGlvbmFsPFN0cmluZzE2Pj4+JiBuYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogX2FpZGxfcmV0KSBvdmVycmlkZSB7CisgICAgaWYgKHNlcnZpY2VzLmhhc192YWx1ZSgpICYmIG5hbWVzLmhhc192YWx1ZSgpKSB7CisgICAgICBpZiAoc2VydmljZXMtPnNpemUoKSA9PSBuYW1lcy0+c2l6ZSgpKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2VydmljZXMtPnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgaWYgKHNlcnZpY2VzLT5hdChpKS5nZXQoKSAmJiBuYW1lcy0+YXQoaSkuaGFzX3ZhbHVlKCkpIHsKKyAgICAgICAgICAgIGlmIChhdXRvIHN0ID0gVmVyaWZ5TmFtZShzZXJ2aWNlcy0+YXQoaSksIG5hbWVzLT5hdChpKS52YWx1ZSgpLCBfYWlkbF9yZXQpOworICAgICAgICAgICAgICAgICFzdC5pc09rKCkgfHwgISpfYWlkbF9yZXQpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIHN0OworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSBpZiAoc2VydmljZXMtPmF0KGkpLmdldCgpIHx8IG5hbWVzLT5hdChpKS5oYXNfdmFsdWUoKSkgeworICAgICAgICAgICAgKl9haWRsX3JldCA9IGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gb2sgaWYgc2VydmljZT1udWxsICYmIG5hbWU9bnVsbAorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAqX2FpZGxfcmV0ID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICpfYWlkbF9yZXQgPSBmYWxzZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgKl9haWRsX3JldCA9IHNlcnZpY2VzLmhhc192YWx1ZSgpID09IG5hbWVzLmhhc192YWx1ZSgpOworICAgIH0KKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICB9CisKKyAgU3RhdHVzIEdldEludGVyZmFjZUxpc3QoY29uc3Qgb3B0aW9uYWw8dmVjdG9yPG9wdGlvbmFsPFN0cmluZzE2Pj4+JiBuYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWw8dmVjdG9yPHNwPElOYW1lZENhbGxiYWNrPj4+KiBfYWlkbF9yZXQpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gR2V0TnVsbGFibGVJbnRlcmZhY2VBcnJheShuYW1lcywgX2FpZGxfcmV0KTsKKyAgfQorCisgIFN0YXR1cyBWZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VMaXN0KGNvbnN0IG9wdGlvbmFsPHZlY3RvcjxzcDxJTmFtZWRDYWxsYmFjaz4+PiYgc2VydmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbmFsPHZlY3RvcjxvcHRpb25hbDxTdHJpbmcxNj4+PiYgbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIF9haWRsX3JldCkgb3ZlcnJpZGUgeworICAgIHJldHVybiBWZXJpZnlOYW1lc1dpdGhOdWxsYWJsZUludGVyZmFjZUFycmF5KHNlcnZpY2VzLCBuYW1lcywgX2FpZGxfcmV0KTsKKyAgfQorCiAgIFN0YXR1cyBSZXZlcnNlU3RyaW5nTGlzdChjb25zdCB2ZWN0b3I8U3RyaW5nMTY+JiBpbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxTdHJpbmcxNj4qIHJlcGVhdGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPFN0cmluZzE2PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CkBAIC00OTMsOCArNTcwLDIwIEBACiAgICAgcmV0dXJuIFJlcGVhdE51bGxhYmxlKGlucHV0LCBfYWlkbF9yZXR1cm4pOwogICB9CiAKLSAgU3RhdHVzIFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZShjb25zdCBvcHRpb25hbDxTdHJ1Y3R1cmVkUGFyY2VsYWJsZT4mIGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsPFN0cnVjdHVyZWRQYXJjZWxhYmxlPiogX2FpZGxfcmV0dXJuKSB7CisgIFN0YXR1cyBSZXBlYXROdWxsYWJsZVBhcmNlbGFibGUoY29uc3Qgb3B0aW9uYWw8SVRlc3RTZXJ2aWNlOjpFbXB0eT4mIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsPElUZXN0U2VydmljZTo6RW1wdHk+KiBfYWlkbF9yZXR1cm4pIHsKKyAgICByZXR1cm4gUmVwZWF0TnVsbGFibGUoaW5wdXQsIF9haWRsX3JldHVybik7CisgIH0KKworICBTdGF0dXMgUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlTGlzdCgKKyAgICAgIGNvbnN0IG9wdGlvbmFsPHZlY3RvcjxvcHRpb25hbDxJVGVzdFNlcnZpY2U6OkVtcHR5Pj4+JiBpbnB1dCwKKyAgICAgIG9wdGlvbmFsPHZlY3RvcjxvcHRpb25hbDxJVGVzdFNlcnZpY2U6OkVtcHR5Pj4+KiBfYWlkbF9yZXR1cm4pIHsKKyAgICByZXR1cm4gUmVwZWF0TnVsbGFibGUoaW5wdXQsIF9haWRsX3JldHVybik7CisgIH0KKworICBTdGF0dXMgUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlQXJyYXkoCisgICAgICBjb25zdCBvcHRpb25hbDx2ZWN0b3I8b3B0aW9uYWw8SVRlc3RTZXJ2aWNlOjpFbXB0eT4+PiYgaW5wdXQsCisgICAgICBvcHRpb25hbDx2ZWN0b3I8b3B0aW9uYWw8SVRlc3RTZXJ2aWNlOjpFbXB0eT4+PiogX2FpZGxfcmV0dXJuKSB7CiAgICAgcmV0dXJuIFJlcGVhdE51bGxhYmxlKGlucHV0LCBfYWlkbF9yZXR1cm4pOwogICB9CiAKQEAgLTUwNiw2ICs1OTUsMTQgQEAKICAgICAodm9pZClpbnB1dDsKICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogICB9CisgIFN0YXR1cyBUYWtlc0FuSUJpbmRlckxpc3QoY29uc3QgdmVjdG9yPHNwPElCaW5kZXI+PiYgaW5wdXQpIG92ZXJyaWRlIHsKKyAgICAodm9pZClpbnB1dDsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICB9CisgIFN0YXR1cyBUYWtlc0FOdWxsYWJsZUlCaW5kZXJMaXN0KGNvbnN0IG9wdGlvbmFsPHZlY3RvcjxzcDxJQmluZGVyPj4+JiBpbnB1dCkgeworICAgICh2b2lkKWlucHV0OworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgIH0KIAogICBTdGF0dXMgUmVwZWF0VXRmOENwcFN0cmluZyhjb25zdCBzdHJpbmcmIHRva2VuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqIF9haWRsX3JldHVybikgb3ZlcnJpZGUgewpAQCAtNTg2LDYgKzY4Myw1MSBAQAogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiAgIH0KIAorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdEV4dGVuZGFibGVQYXJjZWxhYmxlKAorICAgICAgY29uc3QgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6ZXh0ZW5zaW9uOjpFeHRlbmRhYmxlUGFyY2VsYWJsZSYgZXAsCisgICAgICA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpleHRlbnNpb246OkV4dGVuZGFibGVQYXJjZWxhYmxlKiBlcDIpIHsKKyAgICBlcDItPmEgPSBlcC5hOworICAgIGVwMi0+YiA9IGVwLmI7CisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpleHRlbnNpb246Ok15RXh0PiBteUV4dDsKKyAgICBlcC5leHQuZ2V0UGFyY2VsYWJsZSgmbXlFeHQpOworICAgIGVwMi0+ZXh0LnNldFBhcmNlbGFibGUobXlFeHQpOworCisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgfQorCisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmV2ZXJzZUxpc3QoY29uc3QgUmVjdXJzaXZlTGlzdCYgbGlzdCwgUmVjdXJzaXZlTGlzdCogcmV0KSBvdmVycmlkZSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPFJlY3Vyc2l2ZUxpc3Q+IHJldmVyc2VkOworICAgIGNvbnN0IFJlY3Vyc2l2ZUxpc3QqIGN1ciA9ICZsaXN0OworICAgIHdoaWxlIChjdXIpIHsKKyAgICAgIGF1dG8gbm9kZSA9IHN0ZDo6bWFrZV91bmlxdWU8UmVjdXJzaXZlTGlzdD4oKTsKKyAgICAgIG5vZGUtPnZhbHVlID0gY3VyLT52YWx1ZTsKKyAgICAgIG5vZGUtPm5leHQgPSBzdGQ6Om1vdmUocmV2ZXJzZWQpOworICAgICAgcmV2ZXJzZWQgPSBzdGQ6Om1vdmUobm9kZSk7CisgICAgICBjdXIgPSBjdXItPm5leHQuZ2V0KCk7CisgICAgfQorICAgICpyZXQgPSBzdGQ6Om1vdmUoKnJldmVyc2VkKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICB9CisKKyAgU3RhdHVzIFJldmVyc2VJQmluZGVyQXJyYXkoY29uc3QgdmVjdG9yPHNwPElCaW5kZXI+PiYgaW5wdXQsIHZlY3RvcjxzcDxJQmluZGVyPj4qIHJlcGVhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8c3A8SUJpbmRlcj4+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICAqcmVwZWF0ZWQgPSBpbnB1dDsKKyAgICAqX2FpZGxfcmV0dXJuID0gaW5wdXQ7CisgICAgc3RkOjpyZXZlcnNlKF9haWRsX3JldHVybi0+YmVnaW4oKSwgX2FpZGxfcmV0dXJuLT5lbmQoKSk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgfQorCisgIFN0YXR1cyBSZXZlcnNlTnVsbGFibGVJQmluZGVyQXJyYXkoY29uc3Qgc3RkOjpvcHRpb25hbDx2ZWN0b3I8c3A8SUJpbmRlcj4+PiYgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvcHRpb25hbDx2ZWN0b3I8c3A8SUJpbmRlcj4+PiogcmVwZWF0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvcHRpb25hbDx2ZWN0b3I8c3A8SUJpbmRlcj4+PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgKnJlcGVhdGVkID0gaW5wdXQ7CisgICAgKl9haWRsX3JldHVybiA9IGlucHV0OworICAgIGlmICgqX2FpZGxfcmV0dXJuKSB7CisgICAgICBzdGQ6OnJldmVyc2UoKCpfYWlkbF9yZXR1cm4pLT5iZWdpbigpLCAoKl9haWRsX3JldHVybiktPmVuZCgpKTsKKyAgICB9CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgfQorCiAgIFN0YXR1cyBVbmltcGxlbWVudGVkTWV0aG9kKGludDMyX3QgLyogYXJnICovLCBpbnQzMl90KiAvKiBfYWlkbF9yZXR1cm4gKi8pIG92ZXJyaWRlIHsKICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJVbmltcGxlbWVudGVkTWV0aG9kIHNob3VsZG4ndCBiZSBjYWxsZWQiKTsKICAgfQpAQCAtNjAwLDYgKzc0MiwxNSBAQAogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiAgIH0KIAorICBTdGF0dXMgR2V0VW5pb25UYWdzKGNvbnN0IHN0ZDo6dmVjdG9yPFVuaW9uPiYgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8VW5pb246OlRhZz4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHN0ZDo6dmVjdG9yPFVuaW9uOjpUYWc+IHRhZ3M7CisgICAgc3RkOjp0cmFuc2Zvcm0oaW5wdXQuYmVnaW4oKSwgaW5wdXQuZW5kKCksIHN0ZDo6YmFja19pbnNlcnRlcih0YWdzKSwKKyAgICAgICAgICAgICAgICAgICBzdGQ6Om1lbV9mbigmVW5pb246OmdldFRhZykpOworICAgICpfYWlkbF9yZXR1cm4gPSBzdGQ6Om1vdmUodGFncyk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgfQorCiAgIFN0YXR1cyBHZXRDcHBKYXZhVGVzdHMoc3A8SUJpbmRlcj4qIHJldCkgewogICAgICpyZXQgPSBuZXcgQ3BwSmF2YVRlc3RzOwogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CkBAIC02NzMsNiArODI0LDk0IEBACiAgIH0KIH07CiAKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOworY2xhc3MgTmVzdGVkU2VydmljZSA6IHB1YmxpYyBCbk5lc3RlZFNlcnZpY2UgeworIHB1YmxpYzoKKyAgTmVzdGVkU2VydmljZSgpIHt9CisgIHZpcnR1YWwgfk5lc3RlZFNlcnZpY2UoKSA9IGRlZmF1bHQ7CisKKyAgdmlydHVhbCBTdGF0dXMgZmxpcFN0YXR1cyhjb25zdCBQYXJjZWxhYmxlV2l0aE5lc3RlZCYgcCwgSU5lc3RlZFNlcnZpY2U6OlJlc3VsdCogX2FpZGxfcmV0dXJuKSB7CisgICAgaWYgKHAuc3RhdHVzID09IFBhcmNlbGFibGVXaXRoTmVzdGVkOjpTdGF0dXM6Ok9LKSB7CisgICAgICBfYWlkbF9yZXR1cm4tPnN0YXR1cyA9IFBhcmNlbGFibGVXaXRoTmVzdGVkOjpTdGF0dXM6Ok5PVF9PSzsKKyAgICB9IGVsc2UgeworICAgICAgX2FpZGxfcmV0dXJuLT5zdGF0dXMgPSBQYXJjZWxhYmxlV2l0aE5lc3RlZDo6U3RhdHVzOjpPSzsKKyAgICB9CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgfQorICB2aXJ0dWFsIFN0YXR1cyBmbGlwU3RhdHVzV2l0aENhbGxiYWNrKFBhcmNlbGFibGVXaXRoTmVzdGVkOjpTdGF0dXMgc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElOZXN0ZWRTZXJ2aWNlOjpJQ2FsbGJhY2s+JiBjYikgeworICAgIGlmIChzdGF0dXMgPT0gUGFyY2VsYWJsZVdpdGhOZXN0ZWQ6OlN0YXR1czo6T0spIHsKKyAgICAgIHJldHVybiBjYi0+ZG9uZShQYXJjZWxhYmxlV2l0aE5lc3RlZDo6U3RhdHVzOjpOT1RfT0spOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gY2ItPmRvbmUoUGFyY2VsYWJsZVdpdGhOZXN0ZWQ6OlN0YXR1czo6T0spOworICAgIH0KKyAgfQorfTsKKwordXNpbmcgYW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTsKK2NsYXNzIEZpeGVkU2l6ZUFycmF5U2VydmljZSA6IHB1YmxpYyBGaXhlZFNpemVBcnJheUV4YW1wbGU6OkJuUmVwZWF0Rml4ZWRTaXplQXJyYXkgeworIHB1YmxpYzoKKyAgRml4ZWRTaXplQXJyYXlTZXJ2aWNlKCkge30KKyAgdmlydHVhbCB+Rml4ZWRTaXplQXJyYXlTZXJ2aWNlKCkgPSBkZWZhdWx0OworCisgIFN0YXR1cyBSZXBlYXRCeXRlcyhjb25zdCBzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+JiBpbl9pbnB1dCwgc3RkOjphcnJheTx1aW50OF90LCAzPiogb3V0X3JlcGVhdGVkLAorICAgICAgICAgICAgICAgICAgICAgc3RkOjphcnJheTx1aW50OF90LCAzPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgKm91dF9yZXBlYXRlZCA9IGluX2lucHV0OworICAgICpfYWlkbF9yZXR1cm4gPSBpbl9pbnB1dDsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICB9CisgIFN0YXR1cyBSZXBlYXRJbnRzKGNvbnN0IHN0ZDo6YXJyYXk8aW50MzJfdCwgMz4mIGluX2lucHV0LCBzdGQ6OmFycmF5PGludDMyX3QsIDM+KiBvdXRfcmVwZWF0ZWQsCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6YXJyYXk8aW50MzJfdCwgMz4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgICpvdXRfcmVwZWF0ZWQgPSBpbl9pbnB1dDsKKyAgICAqX2FpZGxfcmV0dXJuID0gaW5faW5wdXQ7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgfQorICBTdGF0dXMgUmVwZWF0QmluZGVycyhjb25zdCBzdGQ6OmFycmF5PHNwPElCaW5kZXI+LCAzPiYgaW5faW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YXJyYXk8c3A8SUJpbmRlcj4sIDM+KiBvdXRfcmVwZWF0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YXJyYXk8c3A8SUJpbmRlcj4sIDM+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICAqb3V0X3JlcGVhdGVkID0gaW5faW5wdXQ7CisgICAgKl9haWRsX3JldHVybiA9IGluX2lucHV0OworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgIH0KKyAgU3RhdHVzIFJlcGVhdFBhcmNlbGFibGVzKAorICAgICAgY29uc3Qgc3RkOjphcnJheTxGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludFBhcmNlbGFibGUsIDM+JiBpbl9pbnB1dCwKKyAgICAgIHN0ZDo6YXJyYXk8Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlLCAzPiogb3V0X3JlcGVhdGVkLAorICAgICAgc3RkOjphcnJheTxGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludFBhcmNlbGFibGUsIDM+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICAqb3V0X3JlcGVhdGVkID0gaW5faW5wdXQ7CisgICAgKl9haWRsX3JldHVybiA9IGluX2lucHV0OworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgIH0KKyAgU3RhdHVzIFJlcGVhdDJkQnl0ZXMoY29uc3Qgc3RkOjphcnJheTxzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+LCAyPiYgaW5faW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YXJyYXk8c3RkOjphcnJheTx1aW50OF90LCAzPiwgMj4qIG91dF9yZXBlYXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjphcnJheTxzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+LCAyPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgKm91dF9yZXBlYXRlZCA9IGluX2lucHV0OworICAgICpfYWlkbF9yZXR1cm4gPSBpbl9pbnB1dDsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICB9CisgIFN0YXR1cyBSZXBlYXQyZEludHMoY29uc3Qgc3RkOjphcnJheTxzdGQ6OmFycmF5PGludDMyX3QsIDM+LCAyPiYgaW5faW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgc3RkOjphcnJheTxzdGQ6OmFycmF5PGludDMyX3QsIDM+LCAyPiogb3V0X3JlcGVhdGVkLAorICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YXJyYXk8c3RkOjphcnJheTxpbnQzMl90LCAzPiwgMj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgICpvdXRfcmVwZWF0ZWQgPSBpbl9pbnB1dDsKKyAgICAqX2FpZGxfcmV0dXJuID0gaW5faW5wdXQ7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgfQorICBTdGF0dXMgUmVwZWF0MmRCaW5kZXJzKGNvbnN0IHN0ZDo6YXJyYXk8c3RkOjphcnJheTxzcDxJQmluZGVyPiwgMz4sIDI+JiBpbl9pbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8c3A8SUJpbmRlcj4sIDM+LCAyPiogb3V0X3JlcGVhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YXJyYXk8c3RkOjphcnJheTxzcDxJQmluZGVyPiwgMz4sIDI+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICAqb3V0X3JlcGVhdGVkID0gaW5faW5wdXQ7CisgICAgKl9haWRsX3JldHVybiA9IGluX2lucHV0OworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgIH0KKyAgU3RhdHVzIFJlcGVhdDJkUGFyY2VsYWJsZXMoCisgICAgICBjb25zdCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlLCAzPiwgMj4mIGluX2lucHV0LAorICAgICAgc3RkOjphcnJheTxzdGQ6OmFycmF5PEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZSwgMz4sIDI+KiBvdXRfcmVwZWF0ZWQsCisgICAgICBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlLCAzPiwgMj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgICpvdXRfcmVwZWF0ZWQgPSBpbl9pbnB1dDsKKyAgICAqX2FpZGxfcmV0dXJuID0gaW5faW5wdXQ7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgfQorfTsKKwogaW50IFJ1bigpIHsKICAgYW5kcm9pZDo6c3A8TmF0aXZlU2VydmljZT4gc2VydmljZSA9IG5ldyBOYXRpdmVTZXJ2aWNlOwogICBzcDxMb29wZXI+IGxvb3BlcihMb29wZXI6OnByZXBhcmUoMCAvKiBvcHRzICovKSk7CkBAIC03MTQsNiArOTUzLDIzIEBACiAgICAgcmV0dXJuIC0xOwogICB9CiAKKyAgYW5kcm9pZDo6c3A8TmVzdGVkU2VydmljZT4gbmVzdGVkU2VydmljZSA9IG5ldyBOZXN0ZWRTZXJ2aWNlOworICBzdGF0dXMgPQorICAgICAgZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCktPmFkZFNlcnZpY2UobmVzdGVkU2VydmljZS0+Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpLCBuZXN0ZWRTZXJ2aWNlKTsKKyAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgIEFMT0dFKCJGYWlsZWQgdG8gYWRkIHNlcnZpY2UgJXMiLCBTdHJpbmc4KG5lc3RlZFNlcnZpY2UtPmdldEludGVyZmFjZURlc2NyaXB0b3IoKSkuY19zdHIoKSk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgYW5kcm9pZDo6c3A8Rml4ZWRTaXplQXJyYXlTZXJ2aWNlPiBmaXhlZFNpemVBcnJheVNlcnZpY2UgPSBuZXcgRml4ZWRTaXplQXJyYXlTZXJ2aWNlOworICBzdGF0dXMgPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKS0+YWRkU2VydmljZShmaXhlZFNpemVBcnJheVNlcnZpY2UtPmdldEludGVyZmFjZURlc2NyaXB0b3IoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRTaXplQXJyYXlTZXJ2aWNlKTsKKyAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgIEFMT0dFKCJGYWlsZWQgdG8gYWRkIHNlcnZpY2UgJXMiLAorICAgICAgICAgIFN0cmluZzgoZml4ZWRTaXplQXJyYXlTZXJ2aWNlLT5nZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpLmNfc3RyKCkpOworICAgIHJldHVybiAtMTsKKyAgfQorCiAgIEFMT0dJKCJFbnRlcmluZyBsb29wIik7CiAgIHdoaWxlICh0cnVlKSB7CiAgICAgY29uc3QgaW50IHJlc3VsdCA9IGxvb3Blci0+cG9sbEFsbCgtMSAvKiB0aW1lb3V0TWlsbGlzICovKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2FuZHJvaWQvYWlkbC9maXhlZHNpemVhcnJheS9GaXhlZFNpemVBcnJheUV4YW1wbGUuYWlkbCBiL3Rlc3RzL2FuZHJvaWQvYWlkbC9maXhlZHNpemVhcnJheS9GaXhlZFNpemVBcnJheUV4YW1wbGUuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzc2Yzg3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYW5kcm9pZC9haWRsL2ZpeGVkc2l6ZWFycmF5L0ZpeGVkU2l6ZUFycmF5RXhhbXBsZS5haWRsCkBAIC0wLDAgKzEsMTIwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXk7CisKK0BKYXZhRGVyaXZlKHRvU3RyaW5nPXRydWUpCitAUnVzdERlcml2ZShQYXJ0aWFsRXE9dHJ1ZSkKK3BhcmNlbGFibGUgRml4ZWRTaXplQXJyYXlFeGFtcGxlIHsKKyAgICAvLyB0byBzZWUgaWYgTnhNIGFycmF5IHdvcmtzCisgICAgaW50WzJdWzNdIGludDJ4MyA9IHt7MSwgMiwgM30sIHs0LCA1LCA2fX07CisKKyAgICBib29sZWFuWzJdIGJvb2xBcnJheTsKKyAgICBieXRlWzJdIGJ5dGVBcnJheTsKKyAgICBjaGFyWzJdIGNoYXJBcnJheTsKKyAgICBpbnRbMl0gaW50QXJyYXk7CisgICAgbG9uZ1syXSBsb25nQXJyYXk7CisgICAgZmxvYXRbMl0gZmxvYXRBcnJheTsKKyAgICBkb3VibGVbMl0gZG91YmxlQXJyYXk7CisgICAgQHV0ZjhJbkNwcCBTdHJpbmdbMl0gc3RyaW5nQXJyYXkgPSB7ImhlbGxvIiwgIndvcmxkIn07CisgICAgQnl0ZUVudW1bMl0gYnl0ZUVudW1BcnJheTsKKyAgICBJbnRFbnVtWzJdIGludEVudW1BcnJheTsKKyAgICBMb25nRW51bVsyXSBsb25nRW51bUFycmF5OworICAgIEludFBhcmNlbGFibGVbMl0gcGFyY2VsYWJsZUFycmF5OworICAgIC8vIEZvbGxvd2luZyBmaWVsZHMgYXJlIG5vdCB0ZXN0LWZyaWVuZGx5IGJlY2F1c2UgdGhleSBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgYXMgbm9uLW51bGwuCisgICAgLy8gSUJpbmRlclsyXSBiaW5kZXJBcnJheTsKKyAgICAvLyBQYXJjZWxGaWxlRGVzY3JpcHRvclsyXSBwZmRBcnJheTsKKyAgICAvLyBJRW1wdHlJbnRlcmZhY2VbMl0gaW50ZXJmYWNlQXJyYXk7CisKKyAgICBib29sZWFuWzJdWzJdIGJvb2xNYXRyaXg7CisgICAgYnl0ZVsyXVsyXSBieXRlTWF0cml4OworICAgIGNoYXJbMl1bMl0gY2hhck1hdHJpeDsKKyAgICBpbnRbMl1bMl0gaW50TWF0cml4OworICAgIGxvbmdbMl1bMl0gbG9uZ01hdHJpeDsKKyAgICBmbG9hdFsyXVsyXSBmbG9hdE1hdHJpeDsKKyAgICBkb3VibGVbMl1bMl0gZG91YmxlTWF0cml4OworICAgIEB1dGY4SW5DcHAgU3RyaW5nWzJdWzJdIHN0cmluZ01hdHJpeCA9IHt7ImhlbGxvIiwgIndvcmxkIn0sIHsiQ2lhbyIsICJtb25kbyJ9fTsKKyAgICBCeXRlRW51bVsyXVsyXSBieXRlRW51bU1hdHJpeDsKKyAgICBJbnRFbnVtWzJdWzJdIGludEVudW1NYXRyaXg7CisgICAgTG9uZ0VudW1bMl1bMl0gbG9uZ0VudW1NYXRyaXg7CisgICAgSW50UGFyY2VsYWJsZVsyXVsyXSBwYXJjZWxhYmxlTWF0cml4OworICAgIC8vIEZvbGxvd2luZyBmaWVsZHMgYXJlIG5vdCB0ZXN0LWZyaWVuZGx5IGJlY2F1c2UgdGhleSBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgYXMgbm9uLW51bGwuCisgICAgLy8gUGFyY2VsRmlsZURlc2NyaXB0b3JbMl1bMl0gcGZkTWF0cml4OworICAgIC8vIElCaW5kZXJbMl1bMl0gYmluZGVyTWF0cml4OworICAgIC8vIElFbXB0eUludGVyZmFjZVsyXVsyXSBpbnRlcmZhY2VNYXRyaXg7CisKKyAgICBAbnVsbGFibGUgYm9vbGVhblsyXSBib29sTnVsbGFibGVBcnJheTsKKyAgICBAbnVsbGFibGUgYnl0ZVsyXSBieXRlTnVsbGFibGVBcnJheTsKKyAgICBAbnVsbGFibGUgY2hhclsyXSBjaGFyTnVsbGFibGVBcnJheTsKKyAgICBAbnVsbGFibGUgaW50WzJdIGludE51bGxhYmxlQXJyYXk7CisgICAgQG51bGxhYmxlIGxvbmdbMl0gbG9uZ051bGxhYmxlQXJyYXk7CisgICAgQG51bGxhYmxlIGZsb2F0WzJdIGZsb2F0TnVsbGFibGVBcnJheTsKKyAgICBAbnVsbGFibGUgZG91YmxlWzJdIGRvdWJsZU51bGxhYmxlQXJyYXk7CisgICAgQG51bGxhYmxlIEB1dGY4SW5DcHAgU3RyaW5nWzJdIHN0cmluZ051bGxhYmxlQXJyYXkgPSB7ImhlbGxvIiwgIndvcmxkIn07CisgICAgQG51bGxhYmxlIEJ5dGVFbnVtWzJdIGJ5dGVFbnVtTnVsbGFibGVBcnJheTsKKyAgICBAbnVsbGFibGUgSW50RW51bVsyXSBpbnRFbnVtTnVsbGFibGVBcnJheTsKKyAgICBAbnVsbGFibGUgTG9uZ0VudW1bMl0gbG9uZ0VudW1OdWxsYWJsZUFycmF5OworICAgIEBudWxsYWJsZSBJQmluZGVyWzJdIGJpbmRlck51bGxhYmxlQXJyYXk7CisgICAgQG51bGxhYmxlIFBhcmNlbEZpbGVEZXNjcmlwdG9yWzJdIHBmZE51bGxhYmxlQXJyYXk7CisgICAgQG51bGxhYmxlIEludFBhcmNlbGFibGVbMl0gcGFyY2VsYWJsZU51bGxhYmxlQXJyYXk7CisgICAgQG51bGxhYmxlIElFbXB0eUludGVyZmFjZVsyXSBpbnRlcmZhY2VOdWxsYWJsZUFycmF5OworCisgICAgQG51bGxhYmxlIGJvb2xlYW5bMl1bMl0gYm9vbE51bGxhYmxlTWF0cml4OworICAgIEBudWxsYWJsZSBieXRlWzJdWzJdIGJ5dGVOdWxsYWJsZU1hdHJpeDsKKyAgICBAbnVsbGFibGUgY2hhclsyXVsyXSBjaGFyTnVsbGFibGVNYXRyaXg7CisgICAgQG51bGxhYmxlIGludFsyXVsyXSBpbnROdWxsYWJsZU1hdHJpeDsKKyAgICBAbnVsbGFibGUgbG9uZ1syXVsyXSBsb25nTnVsbGFibGVNYXRyaXg7CisgICAgQG51bGxhYmxlIGZsb2F0WzJdWzJdIGZsb2F0TnVsbGFibGVNYXRyaXg7CisgICAgQG51bGxhYmxlIGRvdWJsZVsyXVsyXSBkb3VibGVOdWxsYWJsZU1hdHJpeDsKKyAgICBAbnVsbGFibGUgQHV0ZjhJbkNwcCBTdHJpbmdbMl1bMl0gc3RyaW5nTnVsbGFibGVNYXRyaXggPSB7CisgICAgICAgICAgICB7ImhlbGxvIiwgIndvcmxkIn0sIHsiQ2lhbyIsICJtb25kbyJ9fTsKKyAgICBAbnVsbGFibGUgQnl0ZUVudW1bMl1bMl0gYnl0ZUVudW1OdWxsYWJsZU1hdHJpeDsKKyAgICBAbnVsbGFibGUgSW50RW51bVsyXVsyXSBpbnRFbnVtTnVsbGFibGVNYXRyaXg7CisgICAgQG51bGxhYmxlIExvbmdFbnVtWzJdWzJdIGxvbmdFbnVtTnVsbGFibGVNYXRyaXg7CisgICAgQG51bGxhYmxlIElCaW5kZXJbMl1bMl0gYmluZGVyTnVsbGFibGVNYXRyaXg7CisgICAgQG51bGxhYmxlIFBhcmNlbEZpbGVEZXNjcmlwdG9yWzJdWzJdIHBmZE51bGxhYmxlTWF0cml4OworICAgIEBudWxsYWJsZSBJbnRQYXJjZWxhYmxlWzJdWzJdIHBhcmNlbGFibGVOdWxsYWJsZU1hdHJpeDsKKyAgICBAbnVsbGFibGUgSUVtcHR5SW50ZXJmYWNlWzJdWzJdIGludGVyZmFjZU51bGxhYmxlTWF0cml4OworCisgICAgQFN1cHByZXNzV2FybmluZ3ModmFsdWU9eyJvdXQtYXJyYXkifSkKKyAgICBpbnRlcmZhY2UgSVJlcGVhdEZpeGVkU2l6ZUFycmF5IHsKKyAgICAgICAgYnl0ZVszXSBSZXBlYXRCeXRlcyhpbiBieXRlWzNdIGlucHV0LCBvdXQgYnl0ZVszXSByZXBlYXRlZCk7CisgICAgICAgIGludFszXSBSZXBlYXRJbnRzKGluIGludFszXSBpbnB1dCwgb3V0IGludFszXSByZXBlYXRlZCk7CisgICAgICAgIElCaW5kZXJbM10gUmVwZWF0QmluZGVycyhpbiBJQmluZGVyWzNdIGlucHV0LCBvdXQgSUJpbmRlclszXSByZXBlYXRlZCk7CisgICAgICAgIEludFBhcmNlbGFibGVbM10gUmVwZWF0UGFyY2VsYWJsZXMoCisgICAgICAgICAgICAgICAgaW4gSW50UGFyY2VsYWJsZVszXSBpbnB1dCwgb3V0IEludFBhcmNlbGFibGVbM10gcmVwZWF0ZWQpOworCisgICAgICAgIGJ5dGVbMl1bM10gUmVwZWF0MmRCeXRlcyhpbiBieXRlWzJdWzNdIGlucHV0LCBvdXQgYnl0ZVsyXVszXSByZXBlYXRlZCk7CisgICAgICAgIGludFsyXVszXSBSZXBlYXQyZEludHMoaW4gaW50WzJdWzNdIGlucHV0LCBvdXQgaW50WzJdWzNdIHJlcGVhdGVkKTsKKyAgICAgICAgSUJpbmRlclsyXVszXSBSZXBlYXQyZEJpbmRlcnMoaW4gSUJpbmRlclsyXVszXSBpbnB1dCwgb3V0IElCaW5kZXJbMl1bM10gcmVwZWF0ZWQpOworICAgICAgICBJbnRQYXJjZWxhYmxlWzJdWzNdIFJlcGVhdDJkUGFyY2VsYWJsZXMoCisgICAgICAgICAgICAgICAgaW4gSW50UGFyY2VsYWJsZVsyXVszXSBpbnB1dCwgb3V0IEludFBhcmNlbGFibGVbMl1bM10gcmVwZWF0ZWQpOworICAgIH0KKworICAgIGVudW0gQnl0ZUVudW0geyBBIH0KKworICAgIEBCYWNraW5nKHR5cGU9ImludCIpIGVudW0gSW50RW51bSB7IEEgfQorCisgICAgQEJhY2tpbmcodHlwZT0ibG9uZyIpIGVudW0gTG9uZ0VudW0geyBBIH0KKworICAgIEBKYXZhRGVyaXZlKGVxdWFscz10cnVlKQorICAgIEBSdXN0RGVyaXZlKENsb25lPXRydWUsIENvcHk9dHJ1ZSwgUGFydGlhbEVxPXRydWUpCisgICAgcGFyY2VsYWJsZSBJbnRQYXJjZWxhYmxlIHsKKyAgICAgICAgaW50IHZhbHVlOworICAgIH0KKworICAgIGludGVyZmFjZSBJRW1wdHlJbnRlcmZhY2Uge30KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9JTG9nZ2FibGVJbnRlcmZhY2UuYWlkbCBiL3Rlc3RzL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9JTG9nZ2FibGVJbnRlcmZhY2UuYWlkbAppbmRleCA1ODZjZTM0Li4wNjY4ODRkIDEwMDY0NAotLS0gYS90ZXN0cy9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvSUxvZ2dhYmxlSW50ZXJmYWNlLmFpZGwKKysrIGIvdGVzdHMvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0lMb2dnYWJsZUludGVyZmFjZS5haWRsCkBAIC0xMSw0ICsxMSw4IEBACiAgICAgICAgICAgICBpbiBEYXRhIGRhdGFWYWx1ZSwgQG51bGxhYmxlIElCaW5kZXIgYmluZGVyVmFsdWUsCiAgICAgICAgICAgICBpbm91dCBAbnVsbGFibGUgUGFyY2VsRmlsZURlc2NyaXB0b3IgcGZkVmFsdWUsCiAgICAgICAgICAgICBpbm91dCBQYXJjZWxGaWxlRGVzY3JpcHRvcltdIHBmZEFycmF5KTsKKworICAgIGludGVyZmFjZSBJU3ViIHsKKyAgICAgICAgdm9pZCBMb2coaW50IHZhbHVlKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvQXJyYXlPZkludGVyZmFjZXMuYWlkbCBiL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9BcnJheU9mSW50ZXJmYWNlcy5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NWRiMmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvQXJyYXlPZkludGVyZmFjZXMuYWlkbApAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFpZGwudGVzdHM7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHZhbHVlPXsiaW5vdXQtcGFyYW1ldGVyIiwgIm91dC1hcnJheSJ9KQorcGFyY2VsYWJsZSBBcnJheU9mSW50ZXJmYWNlcyB7CisgICAgaW50ZXJmYWNlIElFbXB0eUludGVyZmFjZSB7fQorCisgICAgaW50ZXJmYWNlIElNeUludGVyZmFjZSB7CisgICAgICAgIEBudWxsYWJsZSBJRW1wdHlJbnRlcmZhY2VbXSBtZXRob2RXaXRoSW50ZXJmYWNlcyhJRW1wdHlJbnRlcmZhY2UgaWZhY2UsCisgICAgICAgICAgICAgICAgQG51bGxhYmxlIElFbXB0eUludGVyZmFjZSBudWxsYWJsZV9pZmFjZSwKKyAgICAgICAgICAgICAgICBpbiBJRW1wdHlJbnRlcmZhY2VbXSBpZmFjZV9hcnJheV9pbiwgb3V0IElFbXB0eUludGVyZmFjZVtdIGlmYWNlX2FycmF5X291dCwKKyAgICAgICAgICAgICAgICBpbm91dCBJRW1wdHlJbnRlcmZhY2VbXSBpZmFjZV9hcnJheV9pbm91dCwKKyAgICAgICAgICAgICAgICBpbiBAbnVsbGFibGUgSUVtcHR5SW50ZXJmYWNlW10gbnVsbGFibGVfaWZhY2VfYXJyYXlfaW4sCisgICAgICAgICAgICAgICAgb3V0IEBudWxsYWJsZSBJRW1wdHlJbnRlcmZhY2VbXSBudWxsYWJsZV9pZmFjZV9hcnJheV9vdXQsCisgICAgICAgICAgICAgICAgaW5vdXQgQG51bGxhYmxlIElFbXB0eUludGVyZmFjZVtdIG51bGxhYmxlX2lmYWNlX2FycmF5X2lub3V0KTsKKyAgICB9CisKKyAgICBASmF2YURlcml2ZSh0b1N0cmluZz10cnVlLCBlcXVhbHM9dHJ1ZSkKKyAgICBwYXJjZWxhYmxlIE15UGFyY2VsYWJsZSB7CisgICAgICAgIElFbXB0eUludGVyZmFjZSBpZmFjZTsKKyAgICAgICAgQG51bGxhYmxlIElFbXB0eUludGVyZmFjZSBudWxsYWJsZV9pZmFjZTsKKyAgICAgICAgSUVtcHR5SW50ZXJmYWNlW10gaWZhY2VfYXJyYXk7CisgICAgICAgIEBudWxsYWJsZSBJRW1wdHlJbnRlcmZhY2VbXSBudWxsYWJsZV9pZmFjZV9hcnJheTsKKyAgICB9CisKKyAgICBASmF2YURlcml2ZSh0b1N0cmluZz10cnVlLCBlcXVhbHM9dHJ1ZSkKKyAgICB1bmlvbiBNeVVuaW9uIHsKKyAgICAgICAgSUVtcHR5SW50ZXJmYWNlIGlmYWNlOworICAgICAgICBAbnVsbGFibGUgSUVtcHR5SW50ZXJmYWNlIG51bGxhYmxlX2lmYWNlOworICAgICAgICBJRW1wdHlJbnRlcmZhY2VbXSBpZmFjZV9hcnJheTsKKyAgICAgICAgQG51bGxhYmxlIElFbXB0eUludGVyZmFjZVtdIG51bGxhYmxlX2lmYWNlX2FycmF5OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9CYWRQYXJjZWxhYmxlLmFpZGwgYi90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvQmFkUGFyY2VsYWJsZS5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYzZlZDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvQmFkUGFyY2VsYWJsZS5haWRsCkBAIC0wLDAgKzEsMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYWlkbC50ZXN0czsKKworcGFyY2VsYWJsZSBCYWRQYXJjZWxhYmxlIGNwcF9oZWFkZXIgInRlc3RzL2JhZF9wYXJjZWxhYmxlLmgiOwpkaWZmIC0tZ2l0IGEvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0ZpeGVkU2l6ZS5haWRsIGIvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0ZpeGVkU2l6ZS5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NTE5OWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvRml4ZWRTaXplLmFpZGwKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5haWRsLnRlc3RzOworCitpbXBvcnQgYW5kcm9pZC5haWRsLnRlc3RzLkxvbmdFbnVtOworCitwYXJjZWxhYmxlIEZpeGVkU2l6ZSB7CisgICAgQEZpeGVkU2l6ZQorICAgIHBhcmNlbGFibGUgRml4ZWRQYXJjZWxhYmxlIHsKKyAgICAgICAgYm9vbGVhbiBib29sZWFuVmFsdWU7CisgICAgICAgIGJ5dGUgYnl0ZVZhbHVlOworICAgICAgICBjaGFyIGNoYXJWYWx1ZTsKKyAgICAgICAgaW50IGludFZhbHVlOworICAgICAgICBsb25nIGxvbmdWYWx1ZTsKKyAgICAgICAgZmxvYXQgZmxvYXRWYWx1ZTsKKyAgICAgICAgZG91YmxlIGRvdWJsZVZhbHVlOworICAgICAgICBMb25nRW51bSBlbnVtVmFsdWUgPSBMb25nRW51bS5GT087CisgICAgICAgIEZpeGVkVW5pb24gcGFyY2VsYWJsZVZhbHVlOworICAgIH0KKworICAgIEBGaXhlZFNpemUKKyAgICB1bmlvbiBGaXhlZFVuaW9uIHsKKyAgICAgICAgYm9vbGVhbiBib29sZWFuVmFsdWUgPSBmYWxzZTsKKyAgICAgICAgYnl0ZSBieXRlVmFsdWU7CisgICAgICAgIGNoYXIgY2hhclZhbHVlOworICAgICAgICBpbnQgaW50VmFsdWU7CisgICAgICAgIGxvbmcgbG9uZ1ZhbHVlOworICAgICAgICBmbG9hdCBmbG9hdFZhbHVlOworICAgICAgICBkb3VibGUgZG91YmxlVmFsdWU7CisgICAgICAgIExvbmdFbnVtIGVudW1WYWx1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvSUNwcEphdmFUZXN0cy5haWRsIGIvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0lDcHBKYXZhVGVzdHMuYWlkbAppbmRleCBiMGRhNTNhLi4yNDNkMTEwIDEwMDY0NAotLS0gYS90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvSUNwcEphdmFUZXN0cy5haWRsCisrKyBiL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9JQ3BwSmF2YVRlc3RzLmFpZGwKQEAgLTE2LDE2ICsxNiwxOCBAQAogCiBwYWNrYWdlIGFuZHJvaWQuYWlkbC50ZXN0czsKIAoraW1wb3J0IGFuZHJvaWQuYWlkbC50ZXN0cy5CYWRQYXJjZWxhYmxlOwogaW1wb3J0IGFuZHJvaWQuYWlkbC50ZXN0cy5HZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGU7CiBpbXBvcnQgYW5kcm9pZC5haWRsLnRlc3RzLkludEVudW07CiBpbXBvcnQgYW5kcm9pZC5haWRsLnRlc3RzLlNpbXBsZVBhcmNlbGFibGU7CiBpbXBvcnQgYW5kcm9pZC5haWRsLnRlc3RzLlN0cnVjdHVyZWRQYXJjZWxhYmxlOwogaW1wb3J0IGFuZHJvaWQuYWlkbC50ZXN0cy5VbmlvbjsKLWltcG9ydCBhbmRyb2lkLmFpZGwudGVzdHMuZXh0ZW5zaW9uLkV4dGVuZGFibGVQYXJjZWxhYmxlOwogaW1wb3J0IGFuZHJvaWQub3MuUGVyc2lzdGFibGVCdW5kbGU7CiAKIC8vIFRlc3RzIHRoYXQgYXJlIG9ubHkgc3VwcG9ydGVkIGJ5IHRoZSBDKysvSmF2YSBiYWNrZW5kcywgbm90IE5ESy9SdXN0CiBpbnRlcmZhY2UgSUNwcEphdmFUZXN0cyB7CisgICAgQmFkUGFyY2VsYWJsZSBSZXBlYXRCYWRQYXJjZWxhYmxlKGluIEJhZFBhcmNlbGFibGUgaW5wdXQpOworCiAgICAgU2ltcGxlUGFyY2VsYWJsZSBSZXBlYXRTaW1wbGVQYXJjZWxhYmxlKGluIFNpbXBsZVBhcmNlbGFibGUgaW5wdXQsIG91dCBTaW1wbGVQYXJjZWxhYmxlIHJlcGVhdCk7CiAgICAgR2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxlPGludCwgU3RydWN0dXJlZFBhcmNlbGFibGUsIEludEVudW0+IFJlcGVhdEdlbmVyaWNQYXJjZWxhYmxlKAogICAgICAgICAgICAgaW4gR2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxlPGludCwgU3RydWN0dXJlZFBhcmNlbGFibGUsIEludEVudW0+IGlucHV0LApAQCAtNDMsOSArNDUsNCBAQAogICAgIEZpbGVEZXNjcmlwdG9yIFJlcGVhdEZpbGVEZXNjcmlwdG9yKGluIEZpbGVEZXNjcmlwdG9yIHJlYWQpOwogICAgIEZpbGVEZXNjcmlwdG9yW10gUmV2ZXJzZUZpbGVEZXNjcmlwdG9yQXJyYXkoCiAgICAgICAgICAgICBpbiBGaWxlRGVzY3JpcHRvcltdIGlucHV0LCBvdXQgRmlsZURlc2NyaXB0b3JbXSByZXBlYXRlZCk7Ci0KLSAgICB2b2lkIFRha2VzQW5JQmluZGVyTGlzdChpbiBMaXN0PElCaW5kZXI+IGlucHV0KTsKLSAgICB2b2lkIFRha2VzQU51bGxhYmxlSUJpbmRlckxpc3QoaW4gQG51bGxhYmxlIExpc3Q8SUJpbmRlcj4gaW5wdXQpOwotCi0gICAgdm9pZCBSZXBlYXRFeHRlbmRhYmxlUGFyY2VsYWJsZShpbiBFeHRlbmRhYmxlUGFyY2VsYWJsZSBlcCwgb3V0IEV4dGVuZGFibGVQYXJjZWxhYmxlIGVwMik7CiB9CmRpZmYgLS1naXQgYS90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvSVRlc3RTZXJ2aWNlLmFpZGwgYi90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvSVRlc3RTZXJ2aWNlLmFpZGwKaW5kZXggMTkxNGE0Yy4uNjNjMGM2YyAxMDA2NDQKLS0tIGEvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0lUZXN0U2VydmljZS5haWRsCisrKyBiL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9JVGVzdFNlcnZpY2UuYWlkbApAQCAtMjMsMTIgKzIzLDMxIEBACiBpbXBvcnQgYW5kcm9pZC5haWRsLnRlc3RzLklPbGROYW1lOwogaW1wb3J0IGFuZHJvaWQuYWlkbC50ZXN0cy5JbnRFbnVtOwogaW1wb3J0IGFuZHJvaWQuYWlkbC50ZXN0cy5Mb25nRW51bTsKK2ltcG9ydCBhbmRyb2lkLmFpZGwudGVzdHMuUmVjdXJzaXZlTGlzdDsKIGltcG9ydCBhbmRyb2lkLmFpZGwudGVzdHMuU3RydWN0dXJlZFBhcmNlbGFibGU7CitpbXBvcnQgYW5kcm9pZC5haWRsLnRlc3RzLlVuaW9uOworaW1wb3J0IGFuZHJvaWQuYWlkbC50ZXN0cy5leHRlbnNpb24uRXh0ZW5kYWJsZVBhcmNlbGFibGU7CiAKKy8qKgorICogaW50ZXJmYWNlIGNvbW1lbnQKKyAqLwogQFN1cHByZXNzV2FybmluZ3ModmFsdWU9eyJpbm91dC1wYXJhbWV0ZXIiLCAibWl4ZWQtb25ld2F5IiwgIm91dC1hcnJheSJ9KQogQFNlbnNpdGl2ZURhdGEKK0BKYXZhRGVmYXVsdAorQEphdmFEZWxlZ2F0b3IKIGludGVyZmFjZSBJVGVzdFNlcnZpY2UgewogICAgIC8vIFRlc3QgdGhhdCBjb25zdGFudHMgYXJlIGFjY2Vzc2libGUKKworICAgIC8qKgorICAgICAqIGV4dHJhIGRvYyBjb21tZW50CisgICAgICovCisgICAgLy8gZXh0cmEgbGluZSBjb21tZW50CisgICAgLyoKKyAgICAgKiBleHRyYSByZWd1bGFyIGNvbW1lbnQKKyAgICAgKi8KKyAgICAvKioKKyAgICAgKiBjb25zdCBjb21tZW50CisgICAgICovCiAgICAgY29uc3QgaW50IFRFU1RfQ09OU1RBTlQgPSA0MjsKICAgICBjb25zdCBpbnQgVEVTVF9DT05TVEFOVDIgPSAtNDI7CiAgICAgY29uc3QgaW50IFRFU1RfQ09OU1RBTlQzID0gKzQyOwpAQCAtOTgsOCArMTE3LDE4IEBACiAgICAgTG9uZ0VudW1bXSBSZXZlcnNlTG9uZ0VudW0oaW4gTG9uZ0VudW1bXSBpbnB1dCwgb3V0IExvbmdFbnVtW10gcmVwZWF0ZWQpOwogCiAgICAgLy8gVGVzdCB0aGF0IGNsaWVudHMgY2FuIHNlbmQgYW5kIHJlY2VpdmUgQmluZGVycy4KLSAgICBJTmFtZWRDYWxsYmFjayBHZXRPdGhlclRlc3RTZXJ2aWNlKFN0cmluZyBuYW1lKTsKKyAgICBAUHJvcGFnYXRlQWxsb3dCbG9ja2luZyBJTmFtZWRDYWxsYmFjayBHZXRPdGhlclRlc3RTZXJ2aWNlKFN0cmluZyBuYW1lKTsKICAgICBib29sZWFuIFZlcmlmeU5hbWUoSU5hbWVkQ2FsbGJhY2sgc2VydmljZSwgU3RyaW5nIG5hbWUpOworICAgIElOYW1lZENhbGxiYWNrW10gR2V0SW50ZXJmYWNlQXJyYXkoaW4gU3RyaW5nW10gbmFtZXMpOworICAgIGJvb2xlYW4gVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlQXJyYXkoaW4gSU5hbWVkQ2FsbGJhY2tbXSBzZXJ2aWNlcywgaW4gU3RyaW5nW10gbmFtZXMpOworICAgIEBudWxsYWJsZSBJTmFtZWRDYWxsYmFja1tdIEdldE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoCisgICAgICAgICAgICBpbiBAbnVsbGFibGUgU3RyaW5nW10gbmFtZXMpOworICAgIGJvb2xlYW4gVmVyaWZ5TmFtZXNXaXRoTnVsbGFibGVJbnRlcmZhY2VBcnJheSgKKyAgICAgICAgICAgIGluIEBudWxsYWJsZSBJTmFtZWRDYWxsYmFja1tdIHNlcnZpY2VzLCBpbiBAbnVsbGFibGUgU3RyaW5nW10gbmFtZXMpOworCisgICAgQG51bGxhYmxlIExpc3Q8SU5hbWVkQ2FsbGJhY2s+IEdldEludGVyZmFjZUxpc3QoaW4gQG51bGxhYmxlIFN0cmluZ1tdIG5hbWVzKTsKKyAgICBib29sZWFuIFZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUxpc3QoaW4gQG51bGxhYmxlIExpc3Q8SU5hbWVkQ2FsbGJhY2s+IHNlcnZpY2VzLAorICAgICAgICAgICAgaW4gQG51bGxhYmxlIFN0cmluZ1tdIG5hbWVzKTsKIAogICAgIC8vIFRlc3QgdGhhdCBMaXN0PFQ+IHR5cGVzIHdvcmsgY29ycmVjdGx5LgogICAgIExpc3Q8U3RyaW5nPiBSZXZlcnNlU3RyaW5nTGlzdChpbiBMaXN0PFN0cmluZz4gaW5wdXQsIG91dCBMaXN0PFN0cmluZz4gcmVwZWF0ZWQpOwpAQCAtMTE5LDExICsxNDgsMjAgQEAKICAgICBAbnVsbGFibGUgU3RyaW5nIFJlcGVhdE51bGxhYmxlU3RyaW5nKGluIEBudWxsYWJsZSBTdHJpbmcgaW5wdXQpOwogICAgIEBudWxsYWJsZSBMaXN0PFN0cmluZz4gUmVwZWF0TnVsbGFibGVTdHJpbmdMaXN0KAogICAgICAgICAgICAgaW4gQG51bGxhYmxlIExpc3Q8U3RyaW5nPiBpbnB1dCk7Ci0gICAgQG51bGxhYmxlIFN0cnVjdHVyZWRQYXJjZWxhYmxlIFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZSgKLSAgICAgICAgICAgIGluIEBudWxsYWJsZSBTdHJ1Y3R1cmVkUGFyY2VsYWJsZSBpbnB1dCk7CisKKyAgICAvLyBTbWFsbCBlbXB0eSBwYXJjZWxhYmxlIGZvciBudWxsYWJpbGl0eSBjaGVjaworICAgIEBKYXZhRGVyaXZlKGVxdWFscz10cnVlKQorICAgIEBSdXN0RGVyaXZlKENsb25lPXRydWUsIFBhcnRpYWxFcT10cnVlKQorICAgIHBhcmNlbGFibGUgRW1wdHkge30KKyAgICBAbnVsbGFibGUgRW1wdHkgUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlKGluIEBudWxsYWJsZSBFbXB0eSBpbnB1dCk7CisgICAgQG51bGxhYmxlIEVtcHR5W10gUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlQXJyYXkoaW4gQG51bGxhYmxlIEVtcHR5W10gaW5wdXQpOworICAgIEBudWxsYWJsZSBMaXN0PEVtcHR5PiBSZXBlYXROdWxsYWJsZVBhcmNlbGFibGVMaXN0KAorICAgICAgICAgICAgaW4gQG51bGxhYmxlIExpc3Q8RW1wdHk+IGlucHV0KTsKIAogICAgIHZvaWQgVGFrZXNBbklCaW5kZXIoaW4gSUJpbmRlciBpbnB1dCk7CiAgICAgdm9pZCBUYWtlc0FOdWxsYWJsZUlCaW5kZXIoaW4gQG51bGxhYmxlIElCaW5kZXIgaW5wdXQpOworICAgIHZvaWQgVGFrZXNBbklCaW5kZXJMaXN0KGluIExpc3Q8SUJpbmRlcj4gaW5wdXQpOworICAgIHZvaWQgVGFrZXNBTnVsbGFibGVJQmluZGVyTGlzdChpbiBAbnVsbGFibGUgTGlzdDxJQmluZGVyPiBpbnB1dCk7CiAKICAgICAvLyBUZXN0IHV0ZjggZGVjb2RpbmcgZnJvbSB1dGYxNiB3aXJlIGZvcm1hdAogICAgIEB1dGY4SW5DcHAgU3RyaW5nIFJlcGVhdFV0ZjhDcHBTdHJpbmcoQHV0ZjhJbkNwcCBTdHJpbmcgdG9rZW4pOwpAQCAtMTQzLDEyICsxODEsMjMgQEAKICAgICAgICAgICAgIGluIEBudWxsYWJsZSBAdXRmOEluQ3BwIExpc3Q8U3RyaW5nPiBpbnB1dCwKICAgICAgICAgICAgIG91dCBAbnVsbGFibGUgQHV0ZjhJbkNwcCBMaXN0PFN0cmluZz4gcmVwZWF0ZWQpOwogCisgICAgLyoqCisgICAgICogY29tbWVudCBiZWZvcmUgYW5ub3RhdGlvbgorICAgICAqLwogICAgIEBudWxsYWJsZSBJTmFtZWRDYWxsYmFjayBHZXRDYWxsYmFjayhib29sZWFuIHJldHVybl9udWxsKTsKIAogICAgIC8vIFNpbmNlIHRoaXMgcGFyYWNlbGFibGUgaGFzIGNsZWFybHkgZGVmaW5lZCBkZWZhdWx0IHZhbHVlcywgaXQgd291bGQgYmUKICAgICAvLyBpbmVmZmljaWVudCB0byB1c2UgYW4gSVBDIHRvIGZpbGwgaXQgb3V0IGluIHByYWN0aWNlLgogICAgIHZvaWQgRmlsbE91dFN0cnVjdHVyZWRQYXJjZWxhYmxlKGlub3V0IFN0cnVjdHVyZWRQYXJjZWxhYmxlIHBhcmNlbCk7CiAKKyAgICB2b2lkIFJlcGVhdEV4dGVuZGFibGVQYXJjZWxhYmxlKGluIEV4dGVuZGFibGVQYXJjZWxhYmxlIGVwLCBvdXQgRXh0ZW5kYWJsZVBhcmNlbGFibGUgZXAyKTsKKworICAgIFJlY3Vyc2l2ZUxpc3QgUmV2ZXJzZUxpc3QoaW4gUmVjdXJzaXZlTGlzdCBsaXN0KTsKKworICAgIElCaW5kZXJbXSBSZXZlcnNlSUJpbmRlckFycmF5KGluIElCaW5kZXJbXSBpbnB1dCwgb3V0IElCaW5kZXJbXSByZXBlYXRlZCk7CisgICAgQG51bGxhYmxlIElCaW5kZXJbXSBSZXZlcnNlTnVsbGFibGVJQmluZGVyQXJyYXkoCisgICAgICAgICAgICBpbiBAbnVsbGFibGUgSUJpbmRlcltdIGlucHV0LCBvdXQgQG51bGxhYmxlIElCaW5kZXJbXSByZXBlYXRlZCk7CisKICAgICAvLyBBbGwgdGhlc2UgY29uc3RhbnQgZXhwcmVzc2lvbnMgc2hvdWxkIGJlIGVxdWFsIHRvIDEKICAgICBjb25zdCBpbnQgQTEgPSAofigtMSkpID09IDA7CiAgICAgY29uc3QgaW50IEEyID0gfn4oMSA8PCAzMSkgPT0gKDEgPDwgMzEpOwpAQCAtMjExLDggKzI2MCwzNiBAQAogICAgIElPbGROYW1lIEdldE9sZE5hbWVJbnRlcmZhY2UoKTsKICAgICBJTmV3TmFtZSBHZXROZXdOYW1lSW50ZXJmYWNlKCk7CiAKKyAgICBVbmlvbi5UYWdbXSBHZXRVbmlvblRhZ3MoaW4gVW5pb25bXSBpbnB1dCk7CisKICAgICAvLyBSZXRyaWV2ZSB0aGUgSUNwcEphdmFUZXN0cyBpZiB0aGUgc2VydmVyIHN1cHBvcnRzIGl0CiAgICAgQG51bGxhYmxlIElCaW5kZXIgR2V0Q3BwSmF2YVRlc3RzKCk7CiAKICAgICBCYWNrZW5kVHlwZSBnZXRCYWNrZW5kVHlwZSgpOworCisgICAgcGFyY2VsYWJsZSBDb21waWxlckNoZWNrcyB7CisgICAgICAgIC8vIElCaW5kZXIKKyAgICAgICAgSUJpbmRlciBiaW5kZXI7CisgICAgICAgIEBudWxsYWJsZSBJQmluZGVyIG51bGxhYmxlX2JpbmRlcjsKKyAgICAgICAgSUJpbmRlcltdIGJpbmRlcl9hcnJheTsKKyAgICAgICAgQG51bGxhYmxlIElCaW5kZXJbXSBudWxsYWJsZV9iaW5kZXJfYXJyYXk7CisgICAgICAgIExpc3Q8SUJpbmRlcj4gYmluZGVyX2xpc3Q7CisgICAgICAgIEBudWxsYWJsZSBMaXN0PElCaW5kZXI+IG51bGxhYmxlX2JpbmRlcl9saXN0OworCisgICAgICAgIC8vIFBhcmNlbEZpbGVEZXNjcmlwdG9yCisgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIHBmZDsKKyAgICAgICAgQG51bGxhYmxlIFBhcmNlbEZpbGVEZXNjcmlwdG9yIG51bGxhYmxlX3BmZDsKKyAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3JbXSBwZmRfYXJyYXk7CisgICAgICAgIEBudWxsYWJsZSBQYXJjZWxGaWxlRGVzY3JpcHRvcltdIG51bGxhYmxlX3BmZF9hcnJheTsKKyAgICAgICAgTGlzdDxQYXJjZWxGaWxlRGVzY3JpcHRvcj4gcGZkX2xpc3Q7CisgICAgICAgIEBudWxsYWJsZSBMaXN0PFBhcmNlbEZpbGVEZXNjcmlwdG9yPiBudWxsYWJsZV9wZmRfbGlzdDsKKworICAgICAgICAvLyBwYXJjZWxhYmxlCisgICAgICAgIEVtcHR5IHBhcmNlbDsKKyAgICAgICAgQG51bGxhYmxlIEVtcHR5IG51bGxhYmxlX3BhcmNlbDsKKyAgICAgICAgRW1wdHlbXSBwYXJjZWxfYXJyYXk7CisgICAgICAgIEBudWxsYWJsZSBFbXB0eVtdIG51bGxhYmxlX3BhcmNlbF9hcnJheTsKKyAgICAgICAgTGlzdDxFbXB0eT4gcGFyY2VsX2xpc3Q7CisgICAgICAgIEBudWxsYWJsZSBMaXN0PEVtcHR5PiBudWxsYWJsZV9wYXJjZWxfbGlzdDsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvSW50RW51bS5haWRsIGIvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0ludEVudW0uYWlkbAppbmRleCBkOWFlNmIzLi43YWI2M2YzIDEwMDY0NAotLS0gYS90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvSW50RW51bS5haWRsCisrKyBiL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9JbnRFbnVtLmFpZGwKQEAgLTE2LDkgKzE2LDEyIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5haWRsLnRlc3RzOwogCitASmF2YURlcml2ZSh0b1N0cmluZz10cnVlKQogQEJhY2tpbmcodHlwZT0iaW50IikKIGVudW0gSW50RW51bSB7CiAgICAgRk9PID0gMTAwMCwKICAgICBCQVIgPSAyMDAwLAogICAgIEJBWiwKKyAgICAvKiogQGRlcHJlY2F0ZWQgZG8gbm90IHVzZSB0aGlzICovCisgICAgUVVYLAogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0xpc3RPZkludGVyZmFjZXMuYWlkbCBiL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9MaXN0T2ZJbnRlcmZhY2VzLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdiYTJhYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9MaXN0T2ZJbnRlcmZhY2VzLmFpZGwKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5haWRsLnRlc3RzOworCitAU3VwcHJlc3NXYXJuaW5ncyh2YWx1ZT17Imlub3V0LXBhcmFtZXRlciIsICJvdXQtbnVsbGFibGUifSkKK3BhcmNlbGFibGUgTGlzdE9mSW50ZXJmYWNlcyB7CisgICAgaW50ZXJmYWNlIElFbXB0eUludGVyZmFjZSB7fQorCisgICAgaW50ZXJmYWNlIElNeUludGVyZmFjZSB7CisgICAgICAgIEBudWxsYWJsZSBMaXN0PElFbXB0eUludGVyZmFjZT4gbWV0aG9kV2l0aEludGVyZmFjZXMoSUVtcHR5SW50ZXJmYWNlIGlmYWNlLAorICAgICAgICAgICAgICAgIEBudWxsYWJsZSBJRW1wdHlJbnRlcmZhY2UgbnVsbGFibGVfaWZhY2UsCisgICAgICAgICAgICAgICAgaW4gTGlzdDxJRW1wdHlJbnRlcmZhY2U+IGlmYWNlX2xpc3RfaW4sIG91dCBMaXN0PElFbXB0eUludGVyZmFjZT4gaWZhY2VfbGlzdF9vdXQsCisgICAgICAgICAgICAgICAgaW5vdXQgTGlzdDxJRW1wdHlJbnRlcmZhY2U+IGlmYWNlX2xpc3RfaW5vdXQsCisgICAgICAgICAgICAgICAgaW4gQG51bGxhYmxlIExpc3Q8SUVtcHR5SW50ZXJmYWNlPiBudWxsYWJsZV9pZmFjZV9saXN0X2luLAorICAgICAgICAgICAgICAgIG91dCBAbnVsbGFibGUgTGlzdDxJRW1wdHlJbnRlcmZhY2U+IG51bGxhYmxlX2lmYWNlX2xpc3Rfb3V0LAorICAgICAgICAgICAgICAgIGlub3V0IEBudWxsYWJsZSBMaXN0PElFbXB0eUludGVyZmFjZT4gbnVsbGFibGVfaWZhY2VfbGlzdF9pbm91dCk7CisgICAgfQorCisgICAgQEphdmFEZXJpdmUodG9TdHJpbmc9dHJ1ZSwgZXF1YWxzPXRydWUpCisgICAgcGFyY2VsYWJsZSBNeVBhcmNlbGFibGUgeworICAgICAgICBJRW1wdHlJbnRlcmZhY2UgaWZhY2U7CisgICAgICAgIEBudWxsYWJsZSBJRW1wdHlJbnRlcmZhY2UgbnVsbGFibGVfaWZhY2U7CisgICAgICAgIExpc3Q8SUVtcHR5SW50ZXJmYWNlPiBpZmFjZV9saXN0OworICAgICAgICBAbnVsbGFibGUgTGlzdDxJRW1wdHlJbnRlcmZhY2U+IG51bGxhYmxlX2lmYWNlX2xpc3Q7CisgICAgfQorCisgICAgQEphdmFEZXJpdmUodG9TdHJpbmc9dHJ1ZSwgZXF1YWxzPXRydWUpCisgICAgdW5pb24gTXlVbmlvbiB7CisgICAgICAgIElFbXB0eUludGVyZmFjZSBpZmFjZTsKKyAgICAgICAgQG51bGxhYmxlIElFbXB0eUludGVyZmFjZSBudWxsYWJsZV9pZmFjZTsKKyAgICAgICAgTGlzdDxJRW1wdHlJbnRlcmZhY2U+IGlmYWNlX2xpc3Q7CisgICAgICAgIEBudWxsYWJsZSBMaXN0PElFbXB0eUludGVyZmFjZT4gbnVsbGFibGVfaWZhY2VfbGlzdDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvUmVjdXJzaXZlTGlzdC5haWRsIGIvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL1JlY3Vyc2l2ZUxpc3QuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWYxMGQzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL1JlY3Vyc2l2ZUxpc3QuYWlkbApAQCAtMCwwICsxLDIyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFpZGwudGVzdHM7CisKK3BhcmNlbGFibGUgUmVjdXJzaXZlTGlzdCB7CisgICAgaW50IHZhbHVlOworICAgIEBudWxsYWJsZShoZWFwPXRydWUpIFJlY3Vyc2l2ZUxpc3QgbmV4dDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5haWRsIGIvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL1N0cnVjdHVyZWRQYXJjZWxhYmxlLmFpZGwKaW5kZXggZGY2NmNkMy4uNDFmY2RmYiAxMDA2NDQKLS0tIGEvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL1N0cnVjdHVyZWRQYXJjZWxhYmxlLmFpZGwKKysrIGIvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL1N0cnVjdHVyZWRQYXJjZWxhYmxlLmFpZGwKQEAgLTcxLDcgKzcxLDIyIEBACiAKICAgICBAbnVsbGFibGUgSUJpbmRlciBpYmluZGVyOwogCisgICAgLy8gTWFrZSBzdXJlIHdlIGNhbiBzZW5kIGFuIGVtcHR5IHBhcmNlbGFibGUKKyAgICBASmF2YURlcml2ZSh0b1N0cmluZz10cnVlLCBlcXVhbHM9dHJ1ZSkKKyAgICBAUnVzdERlcml2ZShDbG9uZT10cnVlLCBQYXJ0aWFsRXE9dHJ1ZSkKKyAgICBwYXJjZWxhYmxlIEVtcHR5IHt9CisKKyAgICBFbXB0eSBlbXB0eTsKKwogICAgIC8vIENvbnN0YW50IGV4cHJlc3Npb25zIHRoYXQgZXZhbHVhdGUgdG8gMQorICAgIGJ5dGVbXSBpbnQ4XzEgPSB7CisgICAgICAgICAgICAxLAorICAgICAgICAgICAgMHhmZnU4ICsgMSA9PSAwLAorICAgICAgICAgICAgMjU1dTggKyAxID09IDAsCisgICAgICAgICAgICAweDgwdTggPT0gLTEyOCwKKyAgICAgICAgICAgIC8vIHU4IHR5cGUgaXMgcmVpbnRlcnByZXRlZCBhcyBhIHNpZ25lZCB0eXBlCisgICAgICAgICAgICAweDgwdTggLyAyID09IC0weDQwdTgsCisgICAgfTsKICAgICBpbnRbXSBpbnQzMl8xID0gewogICAgICAgICAgICAgKH4oLTEpKSA9PSAwLAogICAgICAgICAgICAgfn4oMSA8PCAzMSkgPT0gKDEgPDwgMzEpLApkaWZmIC0tZ2l0IGEvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL21hcC9JTWFwVGVzdC5haWRsIGIvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL21hcC9JTWFwVGVzdC5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMTg4ZGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvbWFwL0lNYXBUZXN0LmFpZGwKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5haWRsLnRlc3RzLm1hcDsKKworaW1wb3J0IGFuZHJvaWQuYWlkbC50ZXN0cy5tYXAuQmFyOworaW1wb3J0IGFuZHJvaWQuYWlkbC50ZXN0cy5tYXAuSUVtcHR5OworaW1wb3J0IGFuZHJvaWQuYWlkbC50ZXN0cy5tYXAuSW50RW51bTsKKworaW50ZXJmYWNlIElNYXBUZXN0IHsKKyAgICBNYXA8U3RyaW5nLCBJbnRFbnVtW10+IHJlcGVhdEludEVudW1BcnJheU1hcCgKKyAgICAgICAgICAgIGluIE1hcDxTdHJpbmcsIEludEVudW1bXT4gaW5wdXQsIG91dCBNYXA8U3RyaW5nLCBJbnRFbnVtW10+IG91dHB1dCk7CisgICAgTWFwPFN0cmluZywgaW50W10+IHJlcGVhdEludEFycmF5TWFwKAorICAgICAgICAgICAgaW4gTWFwPFN0cmluZywgaW50W10+IGlucHV0LCBvdXQgTWFwPFN0cmluZywgaW50W10+IG91dHB1dCk7CisgICAgTWFwPFN0cmluZywgQmFyPiByZXBlYXRCYXJNYXAoaW4gTWFwPFN0cmluZywgQmFyPiBpbnB1dCwgb3V0IE1hcDxTdHJpbmcsIEJhcj4gb3V0cHV0KTsKKyAgICBNYXA8U3RyaW5nLCBCYXJbXT4gcmVwZWF0QmFyQXJyYXlNYXAoCisgICAgICAgICAgICBpbiBNYXA8U3RyaW5nLCBCYXJbXT4gaW5wdXQsIG91dCBNYXA8U3RyaW5nLCBCYXJbXT4gb3V0cHV0KTsKKyAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHJlcGVhdFN0cmluZ01hcCgKKyAgICAgICAgICAgIGluIE1hcDxTdHJpbmcsIFN0cmluZz4gaW5wdXQsIG91dCBNYXA8U3RyaW5nLCBTdHJpbmc+IG91dHB1dCk7CisgICAgTWFwPFN0cmluZywgU3RyaW5nW10+IHJlcGVhdFN0cmluZ0FycmF5TWFwKAorICAgICAgICAgICAgaW4gTWFwPFN0cmluZywgU3RyaW5nW10+IGlucHV0LCBvdXQgTWFwPFN0cmluZywgU3RyaW5nW10+IG91dHB1dCk7CisgICAgTWFwPFN0cmluZywgSUVtcHR5PiByZXBlYXRJbnRlcmZhY2VNYXAoCisgICAgICAgICAgICBpbiBNYXA8U3RyaW5nLCBJRW1wdHk+IGlucHV0LCBvdXQgTWFwPFN0cmluZywgSUVtcHR5PiBvdXRwdXQpOworICAgIE1hcDxTdHJpbmcsIElCaW5kZXI+IHJlcGVhdEliaW5kZXJNYXAoCisgICAgICAgICAgICBpbiBNYXA8U3RyaW5nLCBJQmluZGVyPiBpbnB1dCwgb3V0IE1hcDxTdHJpbmcsIElCaW5kZXI+IG91dHB1dCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0RlZXBseU5lc3RlZC5haWRsIGIvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9EZWVwbHlOZXN0ZWQuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjZkYzM4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9EZWVwbHlOZXN0ZWQuYWlkbApAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFpZGwudGVzdHMubmVzdGVkOworCitwYXJjZWxhYmxlIERlZXBseU5lc3RlZCB7CisgICAgcGFyY2VsYWJsZSBBIHsKKyAgICAgICAgLy8gQ2FuIHJlZmVyZW5jZSBkZWVwbHkgbmVzdGVkIHR5cGUgb2YgYSBzaWJsaW5nIHR5cGUuCisgICAgICAgIEIuQy5ELkUgZSA9IEIuQy5ELkUuT0s7CisgICAgfQorICAgIHBhcmNlbGFibGUgQiB7CisgICAgICAgIHBhcmNlbGFibGUgQyB7CisgICAgICAgICAgICBwYXJjZWxhYmxlIEQgeworICAgICAgICAgICAgICAgIGVudW0gRSB7IE9LIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvSU5lc3RlZFNlcnZpY2UuYWlkbCBiL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvSU5lc3RlZFNlcnZpY2UuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjNmNWJlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9JTmVzdGVkU2VydmljZS5haWRsCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYWlkbC50ZXN0cy5uZXN0ZWQ7CisKK2ltcG9ydCBhbmRyb2lkLmFpZGwudGVzdHMubmVzdGVkLlBhcmNlbGFibGVXaXRoTmVzdGVkOworCitpbnRlcmZhY2UgSU5lc3RlZFNlcnZpY2UgeworICAgIEBSdXN0RGVyaXZlKFBhcnRpYWxFcT10cnVlKQorICAgIHBhcmNlbGFibGUgUmVzdWx0IHsKKyAgICAgICAgUGFyY2VsYWJsZVdpdGhOZXN0ZWQuU3RhdHVzIHN0YXR1cyA9IFBhcmNlbGFibGVXaXRoTmVzdGVkLlN0YXR1cy5PSzsKKyAgICB9CisKKyAgICBSZXN1bHQgZmxpcFN0YXR1cyhpbiBQYXJjZWxhYmxlV2l0aE5lc3RlZCBwKTsKKworICAgIGludGVyZmFjZSBJQ2FsbGJhY2sgeworICAgICAgICB2b2lkIGRvbmUoUGFyY2VsYWJsZVdpdGhOZXN0ZWQuU3RhdHVzIHN0YXR1cyk7CisgICAgfQorICAgIHZvaWQgZmxpcFN0YXR1c1dpdGhDYWxsYmFjayhQYXJjZWxhYmxlV2l0aE5lc3RlZC5TdGF0dXMgc3RhdHVzLCBJQ2FsbGJhY2sgY2IpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9QYXJjZWxhYmxlV2l0aE5lc3RlZC5haWRsIGIvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9QYXJjZWxhYmxlV2l0aE5lc3RlZC5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiY2ZhMmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL1BhcmNlbGFibGVXaXRoTmVzdGVkLmFpZGwKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5haWRsLnRlc3RzLm5lc3RlZDsKKworcGFyY2VsYWJsZSBQYXJjZWxhYmxlV2l0aE5lc3RlZCB7CisgICAgZW51bSBTdGF0dXMgeyBPSywgTk9UX09LIH0KKyAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vSVByb3RlY3RlZC5haWRsIGIvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vSVByb3RlY3RlZC5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MDcxOTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9JUHJvdGVjdGVkLmFpZGwKQEAgLTAsMCArMSwxMiBAQAorcGFja2FnZSBhbmRyb2lkLmFpZGwudGVzdHMucGVybWlzc2lvbjsKKworaW50ZXJmYWNlIElQcm90ZWN0ZWQgeworICAgIEBFbmZvcmNlUGVybWlzc2lvbigiUkVBRF9QSE9ORV9TVEFURSIpIHZvaWQgUGVybWlzc2lvblByb3RlY3RlZCgpOworCisgICAgQEVuZm9yY2VQZXJtaXNzaW9uKGFsbE9mPXsiSU5URVJORVQiLCAiVklCUkFURSJ9KSB2b2lkIE11bHRpcGxlUGVybWlzc2lvbnNBbGwoKTsKKworICAgIEBFbmZvcmNlUGVybWlzc2lvbihhbnlPZj17IklOVEVSTkVUIiwgIlZJQlJBVEUifSkgdm9pZCBNdWx0aXBsZVBlcm1pc3Npb25zQW55KCk7CisKKyAgICBARW5mb3JjZVBlcm1pc3Npb24oImFuZHJvaWQubmV0Lk5ldHdvcmtTdGFjay5QRVJNSVNTSU9OX01BSU5MSU5FX05FVFdPUktfU1RBQ0siKQorICAgIHZvaWQgTm9uTWFuaWZlc3RQZXJtaXNzaW9uKCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9JUHJvdGVjdGVkSW50ZXJmYWNlLmFpZGwgYi90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9JUHJvdGVjdGVkSW50ZXJmYWNlLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMxNjY0MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9wZXJtaXNzaW9uL0lQcm90ZWN0ZWRJbnRlcmZhY2UuYWlkbApAQCAtMCwwICsxLDggQEAKK3BhY2thZ2UgYW5kcm9pZC5haWRsLnRlc3RzLnBlcm1pc3Npb247CisKK0BFbmZvcmNlUGVybWlzc2lvbigiQUNDRVNTX0ZJTkVfTE9DQVRJT04iKQoraW50ZXJmYWNlIElQcm90ZWN0ZWRJbnRlcmZhY2UgeworICAgIHZvaWQgTWV0aG9kMSgpOworCisgICAgQEVuZm9yY2VQZXJtaXNzaW9uKCJJTlRFUk5FVCIpIHZvaWQgTWV0aG9kMigpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vcGxhdGZvcm0vSVByb3RlY3RlZC5haWRsIGIvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vcGxhdGZvcm0vSVByb3RlY3RlZC5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NjcwYTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9wbGF0Zm9ybS9JUHJvdGVjdGVkLmFpZGwKQEAgLTAsMCArMSw4IEBACitwYWNrYWdlIGFuZHJvaWQuYWlkbC50ZXN0cy5wZXJtaXNzaW9uLnBsYXRmb3JtOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkF0dHJpYnV0aW9uU291cmNlOworCitpbnRlcmZhY2UgSVByb3RlY3RlZCB7CisgICAgQEVuZm9yY2VQZXJtaXNzaW9uKGFsbE9mPXsiSU5URVJORVQiLCAiVklCUkFURSJ9KQorICAgIHZvaWQgUHJvdGVjdGVkV2l0aFNvdXJjZUF0dHJpYnV0aW9uKGluIEF0dHJpYnV0aW9uU291cmNlIHNvdXJjZSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL0VudW1Vbmlvbi5haWRsIGIvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9FbnVtVW5pb24uYWlkbAppbmRleCA1ZjliYjA1Li44MTdlYTFjIDEwMDY0NAotLS0gYS90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL0VudW1Vbmlvbi5haWRsCisrKyBiL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvRW51bVVuaW9uLmFpZGwKQEAgLTIzLDQgKzIzLDYgQEAKIHVuaW9uIEVudW1VbmlvbiB7CiAgICAgSW50RW51bSBpbnRFbnVtID0gSW50RW51bS5GT087CiAgICAgTG9uZ0VudW0gbG9uZ0VudW07CisgICAgLyoqIEBkZXByZWNhdGVkIGRvIG5vdCB1c2UgdGhpcyAqLworICAgIGludCBkZXByZWNhdGVkRmllbGQ7CiB9CmRpZmYgLS1naXQgYS90ZXN0cy9iYWRfcGFyY2VsYWJsZS5jcHAgYi90ZXN0cy9iYWRfcGFyY2VsYWJsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZjYTcyNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2JhZF9wYXJjZWxhYmxlLmNwcApAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgInRlc3RzL2JhZF9wYXJjZWxhYmxlLmgiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKwordXNpbmcgYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworCitCYWRQYXJjZWxhYmxlOjpCYWRQYXJjZWxhYmxlKGJvb2wgYmFkLCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgaW50MzJfdCBudW1iZXIpCisgICAgOiBiYWRfKGJhZCksIG5hbWVfKG5hbWUuY19zdHIoKSwgbmFtZS5sZW5ndGgoKSksIG51bWJlcl8obnVtYmVyKSB7fQorCitzdGF0dXNfdCBCYWRQYXJjZWxhYmxlOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCB7CisgIGlmIChhdXRvIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVCb29sKGJhZF8pOyBzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7CisgIGlmIChhdXRvIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVTdHJpbmcxNihuYW1lXyk7IHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKKyAgaWYgKGF1dG8gc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKG51bWJlcl8pOyBzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7CisgIC8vIEJBRCEgd3JpdGUgc3VwZXJmbHVvdXMgZGF0YQorICBpZiAoYmFkXykgcGFyY2VsLT53cml0ZUludDMyKDQyKTsKKyAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBCYWRQYXJjZWxhYmxlOjpyZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwqIHBhcmNlbCkgeworICBpZiAoYXV0byBzdGF0dXMgPSBwYXJjZWwtPnJlYWRCb29sKCZiYWRfKTsgc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOworICBpZiAoYXV0byBzdGF0dXMgPSBwYXJjZWwtPnJlYWRTdHJpbmcxNigmbmFtZV8pOyBzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7CisgIGlmIChhdXRvIHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyKCZudW1iZXJfKTsgc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOworICByZXR1cm4gT0s7Cit9CisKK3N0ZDo6c3RyaW5nIEJhZFBhcmNlbGFibGU6OnRvU3RyaW5nKCkgY29uc3QgeworICByZXR1cm4gU3RyaW5nUHJpbnRmKCJCYWRQYXJjZWxhYmxle2JhZD0lZCxuYW1lPSVzLG51bWJlcj0lZH0iLCBiYWRfLCBTdHJpbmc4KG5hbWVfKS5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICBudW1iZXJfKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2JhZF9wYXJjZWxhYmxlLmggYi90ZXN0cy9iYWRfcGFyY2VsYWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkY2M5YmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9iYWRfcGFyY2VsYWJsZS5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbGFibGUuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworCitjbGFzcyBCYWRQYXJjZWxhYmxlIDogcHVibGljIFBhcmNlbGFibGUgeworIHB1YmxpYzoKKyAgQmFkUGFyY2VsYWJsZSgpID0gZGVmYXVsdDsKKyAgQmFkUGFyY2VsYWJsZShib29sIGJhZCwgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGludDMyX3QgbnVtYmVyKTsKKyAgdmlydHVhbCB+QmFkUGFyY2VsYWJsZSgpID0gZGVmYXVsdDsKKworICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCBvdmVycmlkZTsKKyAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIG92ZXJyaWRlOworCisgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3Q7CisKKyAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBCYWRQYXJjZWxhYmxlJiBsaHMsIGNvbnN0IEJhZFBhcmNlbGFibGUmIHJocykgeworICAgIHJldHVybiAobGhzLmJhZF8gPT0gcmhzLmJhZF8pICYmIChsaHMubmFtZV8gPT0gcmhzLm5hbWVfKSAmJiAobGhzLm51bWJlcl8gPT0gcmhzLm51bWJlcl8pOworICB9CisgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3QgQmFkUGFyY2VsYWJsZSYgbGhzLCBjb25zdCBCYWRQYXJjZWxhYmxlJiByaHMpIHsKKyAgICByZXR1cm4gIShsaHMgPT0gcmhzKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgYm9vbCBiYWRfOworICBTdHJpbmcxNiBuYW1lXzsKKyAgaW50MzJfdCBudW1iZXJfID0gMDsKK307ICAvLyBjbGFzcyBCYWRQYXJjZWxhYmxlCisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9jb3JwdXMvY2hhcl9zZXFfbGVhayBiL3Rlc3RzL2NvcnB1cy9jaGFyX3NlcV9sZWFrCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODhkNmQ4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL2NvcnB1cy9jaGFyX3NlcV9sZWFrCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotMWVudW0gRntVfXBhcmNlbGFibGUgZXtDaGFyU2VxdWVuY2UgZTt9CmRpZmYgLS1naXQgYS90ZXN0cy9jb3JwdXMvY29uc3Rfb3ZlcmZsb3cgYi90ZXN0cy9jb3JwdXMvY29uc3Rfb3ZlcmZsb3cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NWE0MzIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvY29ycHVzL2NvbnN0X292ZXJmbG93CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotlmVudW0gb3twPS0gcyx6cD0tIGZhbHNlICxzLFUsVSxzLHMsc1UscyxULHRlUyxzLFUsVSxieXQsVSxVLHMscyxzVSxzLFUsdGVTLHMsVSxVLGJ5dCxzfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2NvcnB1cy9jb25zdF92YWx1ZV9iaW5hcnlfZXhwIGIvdGVzdHMvY29ycHVzL2NvbnN0X3ZhbHVlX2JpbmFyeV9leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NWY4ZDEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvY29ycHVzL2NvbnN0X3ZhbHVlX2JpbmFyeV9leHAKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi2saW50ZXJmYWNlIGF7Y29uc3QgaW50IE89NDU5MTAxNjM2MyY3O31lbnVtIEZ7cH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9jb3JwdXMvZG91YmxlX2luY2x1ZGUgYi90ZXN0cy9jb3JwdXMvZG91YmxlX2luY2x1ZGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyZTRhM2QuLjAwMDAwMDAKLS0tIGEvdGVzdHMvY29ycHVzL2RvdWJsZV9pbmNsdWRlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotO2ltcG9ydCBkO2ltcG9ydCBkOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2NvcnB1cy9kdXBsaWNhdGVkX2ltcG9ydHMgYi90ZXN0cy9jb3JwdXMvZHVwbGljYXRlZF9pbXBvcnRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDA3M2E3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL2NvcnB1cy9kdXBsaWNhdGVkX2ltcG9ydHMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi07aW1wb3J0IGQ7aW1wb3J0IGQ7CmRpZmYgLS1naXQgYS90ZXN0cy9jb3JwdXMvZW51bV9pbnZhbGlkX3VuYXJ5IGIvdGVzdHMvY29ycHVzL2VudW1faW52YWxpZF91bmFyeQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUyZjU2Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9jb3JwdXMvZW51bV9pbnZhbGlkX3VuYXJ5CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAot/2VudW0gb3tyPSsiIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9jb3JwdXMvZW51bV9uYW1lZF9ieXRlIGIvdGVzdHMvY29ycHVzL2VudW1fbmFtZWRfYnl0ZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NmM2FkNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9jb3JwdXMvZW51bV9uYW1lZF9ieXRlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotPSBpbXBvcnQgcztlbnVtIGJ5dGV7cH1lbnVtIHN7cH0gZW51bSBventwMn1wYXJjZWxhYmxlIGV7ZSBveTtveiB5O30gClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvY29ycHVzL2VudW1fc3RyaW5nIGIvdGVzdHMvY29ycHVzL2VudW1fc3RyaW5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDVlMTA5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL2NvcnB1cy9lbnVtX3N0cmluZworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSBlbnVtIG97cD0ipyJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvY29ycHVzL2V4YW1wbGVfY3BwIGIvdGVzdHMvY29ycHVzL2V4YW1wbGVfY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NjVkYjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jb3JwdXMvZXhhbXBsZV9jcHAKQEAgLTAsMCArMSBAQAorYWlkbFwgLS1sYW5nPWNwcFwgdGVzdHMvSUZvby5haWRsXCAtLW91dFwgLlwgLS1oZWFkZXJfb3V0XCAuXCB0ZXN0cy9JRm9vLmFpZGxcIGludGVyZmFjZSBJRm9vIHsgY29uc3QgaW50IGEgPSAzICsgMzsgdm9pZCBkb0ZvbygpOyB9BwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2NvcnB1cy9leGFtcGxlX2VuZm9yY2UgYi90ZXN0cy9jb3JwdXMvZXhhbXBsZV9lbmZvcmNlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczYjU1ODcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jb3JwdXMvZXhhbXBsZV9lbmZvcmNlCkBAIC0wLDAgKzEgQEAKK2FpZGxcIC0tbGFuZz1qYXZhXCB0ZXN0cy9JRm9vLmFpZGxcIC0tb3V0XCAuXCAtLWhlYWRlcl9vdXRcIC5cIHRlc3RzL0lGb28uYWlkbFwgaW50ZXJmYWNlIElGb28geyAgQEVuZm9yY2UoInBlcm1pc3Npb24gPSBBQkMgfHwgcGVybWlzc2lvbj1ERUYiKSB2b2lkIGRvRm9vKCk7IH0FCmRpZmYgLS1naXQgYS90ZXN0cy9jb3JwdXMvZXhhbXBsZV9qYXZhIGIvdGVzdHMvY29ycHVzL2V4YW1wbGVfamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODhmNmMxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY29ycHVzL2V4YW1wbGVfamF2YQpAQCAtMCwwICsxIEBACithaWRsXCAtLWxhbmc9amF2YVwgdGVzdHMvSUZvby5haWRsXCAtLW91dFwgLlwgLS1oZWFkZXJfb3V0XCAuXCB0ZXN0cy9JRm9vLmFpZGxcIGludGVyZmFjZSBJRm9vIHsgY29uc3QgaW50IGEgPSAzICsgMzsgdm9pZCBkb0ZvbygpOyB9BQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2NvcnB1cy9leGFtcGxlX25kayBiL3Rlc3RzL2NvcnB1cy9leGFtcGxlX25kawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjQ4YzIzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY29ycHVzL2V4YW1wbGVfbmRrCkBAIC0wLDAgKzEgQEAKK2FpZGxcIC0tbGFuZz1uZGtcIHRlc3RzL0lGb28uYWlkbFwgLS1vdXRcIC5cIC0taGVhZGVyX291dFwgLlwgdGVzdHMvSUZvby5haWRsXCBpbnRlcmZhY2UgSUZvbyB7IGNvbnN0IGludCBhID0gMyArIDM7IHZvaWQgZG9Gb28oKTsgfQcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9jb3JwdXMvZXhhbXBsZV9ydXN0IGIvdGVzdHMvY29ycHVzL2V4YW1wbGVfcnVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzkyYjg5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY29ycHVzL2V4YW1wbGVfcnVzdApAQCAtMCwwICsxIEBACithaWRsXCAtLWxhbmc9cnVzdFwgdGVzdHMvSUZvby5haWRsXCAtLW91dFwgLlwgLS1oZWFkZXJfb3V0XCAuXCB0ZXN0cy9JRm9vLmFpZGxcIGludGVyZmFjZSBJRm9vIHsgY29uc3QgaW50IGEgPSAzICsgMzsgdm9pZCBkb0ZvbygpOyB9BQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2NvcnB1cy9mYWlsc19vbmx5X2luX2phdmEgYi90ZXN0cy9jb3JwdXMvZmFpbHNfb25seV9pbl9qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDBhNjUwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL2NvcnB1cy9mYWlsc19vbmx5X2luX2phdmEKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0mZW51bSBse3B9cGFyY2VsYWJsZSBle01hcCB5MDt9IApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2NvcnB1cy9pYmluZGVyX2FycmF5IGIvdGVzdHMvY29ycHVzL2liaW5kZXJfYXJyYXkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1M2U0MWEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvY29ycHVzL2liaW5kZXJfYXJyYXkKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0gZW51bSBGe3B9cGFyY2VsYWJsZSBle0lCaW5kZXJbXXk7fQpkaWZmIC0tZ2l0IGEvdGVzdHMvY29ycHVzL2ludmFsaWRfYmluYXJ5X29wX3R5cGVzIGIvdGVzdHMvY29ycHVzL2ludmFsaWRfYmluYXJ5X29wX3R5cGVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWZiODE3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL2NvcnB1cy9pbnZhbGlkX2JpbmFyeV9vcF90eXBlcworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSZlbnVtIGx7cH1wYXJjZWxhYmxlIGV7TWFwIHk9LjAmMDt9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvY29ycHVzL2ludmFsaWRfdHlwZV9hZnRlcl92YWxpZF90eXBlIGIvdGVzdHMvY29ycHVzL2ludmFsaWRfdHlwZV9hZnRlcl92YWxpZF90eXBlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTA5Y2ZjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL2NvcnB1cy9pbnZhbGlkX3R5cGVfYWZ0ZXJfdmFsaWRfdHlwZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSBwYXJjZWxhYmxlIG17fXQKZGlmZiAtLWdpdCBhL3Rlc3RzL2NvcnB1cy9qYXZhX21hcCBiL3Rlc3RzL2NvcnB1cy9qYXZhX21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzM1YjhjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY29ycHVzL2phdmFfbWFwCkBAIC0wLDAgKzEgQEAKK2FpZGxcIC0tbGFuZz1qYXZhXCB0ZXN0cy9JRm9vLmFpZGxcIC0tb3V0XCAuXCAtLWhlYWRlcl9vdXRcIC5cIHRlc3RzL0lGb28uYWlkbFwgaW50ZXJmYWNlIElGb28geyBib29sZWFuIGdldEZkcyhvdXQgTWFwPFN0cmluZyxGaWxlRGVzY3JpcHRvcj4gZmRzKTsgfQUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9jb3JwdXMvbGFyZ2Vfc2hpZnRfb3ZlcmZsb3cgYi90ZXN0cy9jb3JwdXMvbGFyZ2Vfc2hpZnRfb3ZlcmZsb3cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhYTRmZmIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvY29ycHVzL2xhcmdlX3NoaWZ0X292ZXJmbG93CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotICBlbnVtIGx7cH1wYXJjZWxhYmxlIGV7TWFwIHk9MzY8PC0zOTIyMzMxMjU2PDwyMjM3MjAzMzEwO30KZGlmZiAtLWdpdCBhL3Rlc3RzL2NvcnB1cy9tYXBfbGVhayBiL3Rlc3RzL2NvcnB1cy9tYXBfbGVhawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFjYzY3MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9jb3JwdXMvbWFwX2xlYWsKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1xcGFyY2VsYWJsZSBhe01hcCBlO31lbnVtIG57cH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2NvcnB1cy9uZGtfZmlsZV9kZXNjcmlwdG9yIGIvdGVzdHMvY29ycHVzL25ka19maWxlX2Rlc2NyaXB0b3IKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NjlkYTAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvY29ycHVzL25ka19maWxlX2Rlc2NyaXB0b3IKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0mZW51bSBGe3B9cGFyY2VsYWJsZSBle0ZpbGVEZXNjcmlwdG9yIGU7fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2NvcnB1cy9uZWdhdGl2ZV9sZWZ0X3NoaWZ0IGIvdGVzdHMvY29ycHVzL25lZ2F0aXZlX2xlZnRfc2hpZnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZGU4YjMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvY29ycHVzL25lZ2F0aXZlX2xlZnRfc2hpZnQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0vIGVudW0gbyB7cD0xMjdMPj4tMT4+Mj4zMD4tODE+PjA+ND4yNkw+Pi0xPi0yPj4xLTg+MS0zMD4+MT4+LTdMPj4tMT4+LTI+PjA+Pi0yPj4xLTg+Pi0zMD4+LTI+PjEtODA+Pi03Pj42TD4+LTE+PjA+ND4yNkw+Pi0xPi0yPj4xLTg+Pi0zPj4tMzA+Pi0yPj4yPj4xPj4xLTg+Pi0zMD4+LTI+PjEtODA+Pi03Pj42TD4+LTE+PjA+ND4yTD4+LTE+LTI+PjEtOD4+LTM+Pi0zMD4+LTI+PjI+PjQyPj4xPj4xLTg+Pi0zMD4+LTI+PjEtODA+Pi03Pj42TD4+LTE3Pj42TD4+LTE+Pi0xPj4wPjQ+MjZMPj4tMT4tMj4+MS04Pj4tMzA+PjE+Pi03TD4+LTE+Pi0yPj4wPj4tMj4+MS04Pj4tMzA+Pi0yPj4xLTgwPj4tNz4+Nkw+Pi0xPj4wPjQ+MjZMPj4tMT4tMj4+MS04Pj4tMz4+LTMwPj4tMj4+Mj4+MT4+MS04Pj4tMzA+Pi0yPj4xLTgwPj4tNz4+Nkw+Pi0xPj4wPjQ+Mkw+Pi0xPi0yPj4xLTg+Pi0zPj4tMzA+Pi0yPj4yPj4xLTgwPj4tNz4+Nkw+Pi0xPj4wPjQ+MjZMPj4tMT4tMj4+MS04Pj4tMz4+LTMxPj4wPjQ+MjZMPj4tMT4tODA+Pi03Pj42TD4+LTE+PjA+ND4yNkw+Pi0xPi0yPj4xLTM+Pi0zPj4tMzA+Pi0yPj4xLTgwPj4tMS04MD4+LTc+PjZMPj4tMT4+MD40PjI2TD4+LTE+LTI+PjF9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvY29ycHVzL25vbmdlbmVyaWNfbGlzdCBiL3Rlc3RzL2NvcnB1cy9ub25nZW5lcmljX2xpc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2ZTllOTcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvY29ycHVzL25vbmdlbmVyaWNfbGlzdAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLbJlbnVtIEZ7dH1wYXJjZWxhYmxlIGV7TGlzdCBlO30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9jb3JwdXMvbnVsbGFibGVfcGFyY2VsYWJsZV9hcnJheSBiL3Rlc3RzL2NvcnB1cy9udWxsYWJsZV9wYXJjZWxhYmxlX2FycmF5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWNiMGFmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL2NvcnB1cy9udWxsYWJsZV9wYXJjZWxhYmxlX2FycmF5CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotKWVudW0gcntyfXBhcmNlbGFibGUgZXtAbnVsbGFibGUgZVtdZTt9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvY29ycHVzL251bGxhYmxlX3BmZF9hcnJheSBiL3Rlc3RzL2NvcnB1cy9udWxsYWJsZV9wZmRfYXJyYXkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExOGRkZDEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvY29ycHVzL251bGxhYmxlX3BmZF9hcnJheQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSBlbnVtIEZ7cH1wYXJjZWxhYmxlIGV7QG51bGxhYmxlIFBhcmNlbEZpbGVEZXNjcmlwdG9yW115O30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9jb3JwdXMvb3RoZXJfc3RyaW5nX29wZXJhdGlvbiBiL3Rlc3RzL2NvcnB1cy9vdGhlcl9zdHJpbmdfb3BlcmF0aW9uCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDRmY2MyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL2NvcnB1cy9vdGhlcl9zdHJpbmdfb3BlcmF0aW9uCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvY29ycHVzL3BhcmNlbGFibGVfaG9sZGVyX2FycmF5IGIvdGVzdHMvY29ycHVzL3BhcmNlbGFibGVfaG9sZGVyX2FycmF5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTI4NjZmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL2NvcnB1cy9wYXJjZWxhYmxlX2hvbGRlcl9hcnJheQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLdZlbnVtIEZve3BycH1wYXJjZWxhYmxlIGV7IFBhcmNlbGFibGVIb2xkZXIgW11vO30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9jb3JwdXMvc2hpZnRfbGVmdF9ndF9sZWFkaW5nX3plcm9zIGIvdGVzdHMvY29ycHVzL3NoaWZ0X2xlZnRfZ3RfbGVhZGluZ196ZXJvcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAyY2YyMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9jb3JwdXMvc2hpZnRfbGVmdF9ndF9sZWFkaW5nX3plcm9zCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotIGVudW0gbyB7cD0wNkw+Pi0yPj4tMkw+PjAtMj4+LTgtMj4+MC0yMT4+MC0yPj4tOC0yPj4wLTI+Pi02Pj4tOUw+PjAtMj4+LTY+Pi0yTD4+MD4xfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2NvcnB1cy9zaGlmdF9vdmVyZmxvdyBiL3Rlc3RzL2NvcnB1cy9zaGlmdF9vdmVyZmxvdwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ3YTI1NC4uMDAwMDAwMAotLS0gYS90ZXN0cy9jb3JwdXMvc2hpZnRfb3ZlcmZsb3cKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi3WZW51bSBve3g9NDw8OTJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvY29ycHVzL3NoaWZ0X3JpZ2h0XzY0IGIvdGVzdHMvY29ycHVzL3NoaWZ0X3JpZ2h0XzY0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTgwZDRkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL2NvcnB1cy9zaGlmdF9yaWdodF82NAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS8gZW51bSBvIHtwPTE3NTZMPj4tMT4+MT4+LTQ+MjZMPj4xPj4tND4yNj4+LTE+PjE+Pi0xMDAtMT4+MT4+LTQ+MjY+Pi0xPj4xPj4tMTAwPjQ+PjI2Nj4+LTE+PjE+Pi0xPj4xPi0yLTg+Pi0yPj4tMT4+MT4+LTE+Pi03TD4+MTE+Pi0yPj4wPj4tMjg+Pi0zMD4+LTI+PjEtODA+Pi03PjMwPj4tNzw1Nkw+Pi0xPj4xPj4tND4yND4+LS4xPj4xPj4tMTAwLTE+PjE+Pi00PjI2Pj4tMT4+MT4+LTI2Pj4tMT4+MT4+LTQ+MjY+Pi0xPj4xPj4tMTAwLTE+PjE+Pi00PjI2Pj4tMT4+MT4+LTEwMD40Pj4yNkw+PjA+Pi0yPj4wMDY0PjI2TD4+LTF9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvY29ycHVzL3NoaWZ0X3plcm9fbGVmdF8zMiBiL3Rlc3RzL2NvcnB1cy9zaGlmdF96ZXJvX2xlZnRfMzIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiZjEyZjcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvY29ycHVzL3NoaWZ0X3plcm9fbGVmdF8zMgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSBlbnVtIG97cD0wPj4tMzJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvY29ycHVzL3R5cGVfcGFyYW1fbGVhayBiL3Rlc3RzL2NvcnB1cy90eXBlX3BhcmFtX2xlYWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ZWI2ODQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvY29ycHVzL3R5cGVfcGFyYW1fbGVhaworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLTtwYXJjZWxhYmxlIHA8ZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2NvcnB1cy91dGY4X25vbl9zdHJpbmcgYi90ZXN0cy9jb3JwdXMvdXRmOF9ub25fc3RyaW5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2E0ZTNhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL2NvcnB1cy91dGY4X25vbl9zdHJpbmcKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1VZW51bSBve3J9cGFyY2VsYWJsZSBle0B1dGY4SW5DcHAgYnl0ZVtdeTt9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZmFrZV9pb19kZWxlZ2F0ZS5jcHAgYi90ZXN0cy9mYWtlX2lvX2RlbGVnYXRlLmNwcAppbmRleCBhOTlhMjBhLi42YmQyOTg0IDEwMDY0NAotLS0gYS90ZXN0cy9mYWtlX2lvX2RlbGVnYXRlLmNwcAorKysgYi90ZXN0cy9mYWtlX2lvX2RlbGVnYXRlLmNwcApAQCAtNTcsMTYgKzU3LDYgQEAKICAgcmV0dXJuIGNvbnRlbnRzOwogfQogCi11bmlxdWVfcHRyPExpbmVSZWFkZXI+IEZha2VJb0RlbGVnYXRlOjpHZXRMaW5lUmVhZGVyKAotICAgIGNvbnN0IHN0cmluZyYgZmlsZV9wYXRoKSBjb25zdCB7Ci0gIHVuaXF1ZV9wdHI8TGluZVJlYWRlcj4gcmV0OwotICBjb25zdCBhdXRvJiBpdCA9IGZpbGVfY29udGVudHNfLmZpbmQoQ2xlYW5QYXRoKGZpbGVfcGF0aCkpOwotICBpZiAoaXQgIT0gZmlsZV9jb250ZW50c18uY2VuZCgpKSB7Ci0gICAgcmV0ID0gTGluZVJlYWRlcjo6UmVhZEZyb21NZW1vcnkoaXQtPnNlY29uZCk7Ci0gIH0KLSAgcmV0dXJuIHJldDsKLX0KLQogYm9vbCBGYWtlSW9EZWxlZ2F0ZTo6RmlsZUlzUmVhZGFibGUoY29uc3Qgc3RyaW5nJiBwYXRoKSBjb25zdCB7CiAgIHJldHVybiBmaWxlX2NvbnRlbnRzXy5maW5kKENsZWFuUGF0aChwYXRoKSkgIT0gZmlsZV9jb250ZW50c18uZW5kKCk7CiB9CkBAIC03NiwxNSArNjYsMTAgQEAKICAgaWYgKGJyb2tlbl9maWxlc18uY291bnQoZmlsZV9wYXRoKSA+IDApIHsKICAgICByZXR1cm4gdW5pcXVlX3B0cjxDb2RlV3JpdGVyPihuZXcgQnJva2VuQ29kZVdyaXRlcik7CiAgIH0KLSAgcmVtb3ZlZF9maWxlc18uZXJhc2UoZmlsZV9wYXRoKTsKICAgd3JpdHRlbl9maWxlX2NvbnRlbnRzX1tmaWxlX3BhdGhdID0gIiI7CiAgIHJldHVybiBDb2RlV3JpdGVyOjpGb3JTdHJpbmcoJndyaXR0ZW5fZmlsZV9jb250ZW50c19bZmlsZV9wYXRoXSk7CiB9CiAKLXZvaWQgRmFrZUlvRGVsZWdhdGU6OlJlbW92ZVBhdGgoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVfcGF0aCkgY29uc3QgewotICByZW1vdmVkX2ZpbGVzXy5pbnNlcnQoZmlsZV9wYXRoKTsKLX0KLQogdm9pZCBGYWtlSW9EZWxlZ2F0ZTo6U2V0RmlsZUNvbnRlbnRzKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBjb250ZW50cykgewogICBmaWxlX2NvbnRlbnRzX1tmaWxlbmFtZV0gPSBjb250ZW50czsKQEAgLTE2MCwyMyArMTQ1LDYgQEAKICAgcmV0dXJuIHdyaXR0ZW5fZmlsZV9jb250ZW50c187CiB9CiAKLWJvb2wgRmFrZUlvRGVsZWdhdGU6OlBhdGhXYXNSZW1vdmVkKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKSB7Ci0gIGlmIChyZW1vdmVkX2ZpbGVzXy5jb3VudChwYXRoKSA+IDApIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0cmluZyBGYWtlSW9EZWxlZ2F0ZTo6Q2xlYW5QYXRoKGNvbnN0IHN0cmluZyYgcGF0aCkgY29uc3QgewotICBzdHJpbmcgY2xlYW5fcGF0aCA9IHBhdGg7Ci0gIHdoaWxlIChjbGVhbl9wYXRoLmxlbmd0aCgpID49IDIgJiYKLSAgICAgICAgIGNsZWFuX3BhdGhbMF0gPT0gJy4nICYmCi0gICAgICAgICBjbGVhbl9wYXRoWzFdID09IE9TX1BBVEhfU0VQQVJBVE9SKSB7Ci0gICAgY2xlYW5fcGF0aCA9IGNsZWFuX3BhdGguc3Vic3RyKDIpOwotICB9Ci0gIHJldHVybiBjbGVhbl9wYXRoOwotfQotCiB9ICAvLyBuYW1lc3BhY2UgdGVzdAogfSAgLy8gbmFtZXNwYWNlIGFpZGwKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9mYWtlX2lvX2RlbGVnYXRlLmggYi90ZXN0cy9mYWtlX2lvX2RlbGVnYXRlLmgKaW5kZXggNmYyNDY3OC4uODFkNmY4OSAxMDA2NDQKLS0tIGEvdGVzdHMvZmFrZV9pb19kZWxlZ2F0ZS5oCisrKyBiL3Rlc3RzL2Zha2VfaW9fZGVsZWdhdGUuaApAQCAtNDIsMTIgKzQyLDkgQEAKICAgc3RkOjp1bmlxdWVfcHRyPHN0ZDo6c3RyaW5nPiBHZXRGaWxlQ29udGVudHMoCiAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsCiAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYXBwZW5kX2NvbnRlbnRfc3VmZml4ID0gIiIpIGNvbnN0IG92ZXJyaWRlOwotICBzdGQ6OnVuaXF1ZV9wdHI8TGluZVJlYWRlcj4gR2V0TGluZVJlYWRlcigKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlX3BhdGgpIGNvbnN0IG92ZXJyaWRlOwogICBib29sIEZpbGVJc1JlYWRhYmxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKSBjb25zdCBvdmVycmlkZTsKICAgc3RkOjp1bmlxdWVfcHRyPENvZGVXcml0ZXI+IEdldENvZGVXcml0ZXIoCiAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZV9wYXRoKSBjb25zdCBvdmVycmlkZTsKLSAgdm9pZCBSZW1vdmVQYXRoKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlX3BhdGgpIGNvbnN0IG92ZXJyaWRlOwogICBhbmRyb2lkOjpiYXNlOjpSZXN1bHQ8c3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+PiBMaXN0RmlsZXMoY29uc3Qgc3RkOjpzdHJpbmcmIGRpcikgY29uc3Qgb3ZlcnJpZGU7CiAKICAgLy8gTWV0aG9kcyBhZGRlZCB0byBmYWNpbGl0YXRlIHRlc3RpbmcuCkBAIC02NSwxMiArNjIsNyBAQAogICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBJbnB1dEZpbGVzKCkgY29uc3Q7CiAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIE91dHB1dEZpbGVzKCkgY29uc3Q7CiAKLSAgYm9vbCBQYXRoV2FzUmVtb3ZlZChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCk7Ci0KICBwcml2YXRlOgotICAvLyBSZW1vdmUgbGVhZGluZyAiLi8iIGZyb20gfHBhdGh8LgotICBzdGQ6OnN0cmluZyBDbGVhblBhdGgoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpIGNvbnN0OwotCiAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gZmlsZV9jb250ZW50c187CiAgIC8vIE5vcm1hbGx5LCB3cml0aW5nIHRvIGZpbGVzIGxlYXZlcyB0aGUgSW9EZWxlZ2F0ZSB1bmNoYW5nZWQsIHNvCiAgIC8vIEdldENvZGVXcml0ZXIgaXMgYSBjb25zdCBtZXRob2QuICBIb3dldmVyLCBmb3IgdGVzdHMsIHdlIGJyZWFrIHRoaXMKQEAgLTgwLDcgKzcyLDYgQEAKICAgLy8gV2Ugbm9ybWFsbHkganVzdCB3cml0ZSB0byBzdHJpbmdzIGluIHx3cml0dGVuX2ZpbGVfY29udGVudHNffCBidXQgZm9yCiAgIC8vIGZpbGVzIGluIHRoaXMgbGlzdCwgd2Ugc2ltdWxhdGUgSS9PIGVycm9ycy4KICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IGJyb2tlbl9maWxlc187Ci0gIG11dGFibGUgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IHJlbW92ZWRfZmlsZXNfOwogfTsgIC8vIGNsYXNzIEZha2VJb0RlbGVnYXRlCiAKIH0gIC8vIG5hbWVzcGFjZSB0ZXN0CmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1maXhlZHNpemVhcnJheS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvZml4ZWRzaXplYXJyYXkvRml4ZWRTaXplQXJyYXlFeGFtcGxlLmNwcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWZpeGVkc2l6ZWFycmF5LWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9maXhlZHNpemVhcnJheS9GaXhlZFNpemVBcnJheUV4YW1wbGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhYTQyNDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1maXhlZHNpemVhcnJheS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvZml4ZWRzaXplYXJyYXkvRml4ZWRTaXplQXJyYXlFeGFtcGxlLmNwcApAQCAtMCwwICsxLDE0NTYgQEAKKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvZml4ZWRzaXplYXJyYXkvRml4ZWRTaXplQXJyYXlFeGFtcGxlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBmaXhlZHNpemVhcnJheSB7Cis6OmFuZHJvaWQ6OnN0YXR1c190IEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6cmVhZEZyb21QYXJjZWwoY29uc3QgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgeworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICBzaXplX3QgX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKKyAgaW50MzJfdCBfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplID0gMDsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEludDMyKCZfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplIDwgNCkgcmV0dXJuIDo6YW5kcm9pZDo6QkFEX1ZBTFVFOworICBzaXplX3QgX2FpZGxfcGFyY2VsYWJsZV9zaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplKTsKKyAgaWYgKF9haWRsX3N0YXJ0X3BvcyA+IFNJWkVfTUFYIC0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm4gOjphbmRyb2lkOjpCQURfVkFMVUU7CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEZpeGVkQXJyYXkoJmludDJ4Myk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRGaXhlZEFycmF5KCZib29sQXJyYXkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkRml4ZWRBcnJheSgmYnl0ZUFycmF5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEZpeGVkQXJyYXkoJmNoYXJBcnJheSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRGaXhlZEFycmF5KCZpbnRBcnJheSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRGaXhlZEFycmF5KCZsb25nQXJyYXkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkRml4ZWRBcnJheSgmZmxvYXRBcnJheSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRGaXhlZEFycmF5KCZkb3VibGVBcnJheSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRGaXhlZEFycmF5KCZzdHJpbmdBcnJheSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRGaXhlZEFycmF5KCZieXRlRW51bUFycmF5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEZpeGVkQXJyYXkoJmludEVudW1BcnJheSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRGaXhlZEFycmF5KCZsb25nRW51bUFycmF5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEZpeGVkQXJyYXkoJnBhcmNlbGFibGVBcnJheSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRGaXhlZEFycmF5KCZib29sTWF0cml4KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEZpeGVkQXJyYXkoJmJ5dGVNYXRyaXgpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkRml4ZWRBcnJheSgmY2hhck1hdHJpeCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRGaXhlZEFycmF5KCZpbnRNYXRyaXgpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkRml4ZWRBcnJheSgmbG9uZ01hdHJpeCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRGaXhlZEFycmF5KCZmbG9hdE1hdHJpeCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRGaXhlZEFycmF5KCZkb3VibGVNYXRyaXgpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkRml4ZWRBcnJheSgmc3RyaW5nTWF0cml4KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEZpeGVkQXJyYXkoJmJ5dGVFbnVtTWF0cml4KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEZpeGVkQXJyYXkoJmludEVudW1NYXRyaXgpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkRml4ZWRBcnJheSgmbG9uZ0VudW1NYXRyaXgpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkRml4ZWRBcnJheSgmcGFyY2VsYWJsZU1hdHJpeCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRGaXhlZEFycmF5KCZib29sTnVsbGFibGVBcnJheSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRGaXhlZEFycmF5KCZieXRlTnVsbGFibGVBcnJheSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRGaXhlZEFycmF5KCZjaGFyTnVsbGFibGVBcnJheSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRGaXhlZEFycmF5KCZpbnROdWxsYWJsZUFycmF5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEZpeGVkQXJyYXkoJmxvbmdOdWxsYWJsZUFycmF5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEZpeGVkQXJyYXkoJmZsb2F0TnVsbGFibGVBcnJheSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRGaXhlZEFycmF5KCZkb3VibGVOdWxsYWJsZUFycmF5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEZpeGVkQXJyYXkoJnN0cmluZ051bGxhYmxlQXJyYXkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkRml4ZWRBcnJheSgmYnl0ZUVudW1OdWxsYWJsZUFycmF5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEZpeGVkQXJyYXkoJmludEVudW1OdWxsYWJsZUFycmF5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEZpeGVkQXJyYXkoJmxvbmdFbnVtTnVsbGFibGVBcnJheSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRGaXhlZEFycmF5KCZiaW5kZXJOdWxsYWJsZUFycmF5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEZpeGVkQXJyYXkoJnBmZE51bGxhYmxlQXJyYXkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkRml4ZWRBcnJheSgmcGFyY2VsYWJsZU51bGxhYmxlQXJyYXkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkRml4ZWRBcnJheSgmaW50ZXJmYWNlTnVsbGFibGVBcnJheSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRGaXhlZEFycmF5KCZib29sTnVsbGFibGVNYXRyaXgpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkRml4ZWRBcnJheSgmYnl0ZU51bGxhYmxlTWF0cml4KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEZpeGVkQXJyYXkoJmNoYXJOdWxsYWJsZU1hdHJpeCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRGaXhlZEFycmF5KCZpbnROdWxsYWJsZU1hdHJpeCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRGaXhlZEFycmF5KCZsb25nTnVsbGFibGVNYXRyaXgpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkRml4ZWRBcnJheSgmZmxvYXROdWxsYWJsZU1hdHJpeCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRGaXhlZEFycmF5KCZkb3VibGVOdWxsYWJsZU1hdHJpeCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRGaXhlZEFycmF5KCZzdHJpbmdOdWxsYWJsZU1hdHJpeCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRGaXhlZEFycmF5KCZieXRlRW51bU51bGxhYmxlTWF0cml4KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEZpeGVkQXJyYXkoJmludEVudW1OdWxsYWJsZU1hdHJpeCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRGaXhlZEFycmF5KCZsb25nRW51bU51bGxhYmxlTWF0cml4KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEZpeGVkQXJyYXkoJmJpbmRlck51bGxhYmxlTWF0cml4KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEZpeGVkQXJyYXkoJnBmZE51bGxhYmxlTWF0cml4KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEZpeGVkQXJyYXkoJnBhcmNlbGFibGVOdWxsYWJsZU1hdHJpeCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRGaXhlZEFycmF5KCZpbnRlcmZhY2VOdWxsYWJsZU1hdHJpeCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KKzo6YW5kcm9pZDo6c3RhdHVzX3QgRml4ZWRTaXplQXJyYXlFeGFtcGxlOjp3cml0ZVRvUGFyY2VsKDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IHsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpPSzsKKyAgYXV0byBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBfYWlkbF9wYXJjZWwtPndyaXRlSW50MzIoMCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlRml4ZWRBcnJheShpbnQyeDMpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVGaXhlZEFycmF5KGJvb2xBcnJheSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUZpeGVkQXJyYXkoYnl0ZUFycmF5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlRml4ZWRBcnJheShjaGFyQXJyYXkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVGaXhlZEFycmF5KGludEFycmF5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlRml4ZWRBcnJheShsb25nQXJyYXkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVGaXhlZEFycmF5KGZsb2F0QXJyYXkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVGaXhlZEFycmF5KGRvdWJsZUFycmF5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlRml4ZWRBcnJheShzdHJpbmdBcnJheSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUZpeGVkQXJyYXkoYnl0ZUVudW1BcnJheSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUZpeGVkQXJyYXkoaW50RW51bUFycmF5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlRml4ZWRBcnJheShsb25nRW51bUFycmF5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlRml4ZWRBcnJheShwYXJjZWxhYmxlQXJyYXkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVGaXhlZEFycmF5KGJvb2xNYXRyaXgpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVGaXhlZEFycmF5KGJ5dGVNYXRyaXgpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVGaXhlZEFycmF5KGNoYXJNYXRyaXgpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVGaXhlZEFycmF5KGludE1hdHJpeCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUZpeGVkQXJyYXkobG9uZ01hdHJpeCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUZpeGVkQXJyYXkoZmxvYXRNYXRyaXgpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVGaXhlZEFycmF5KGRvdWJsZU1hdHJpeCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUZpeGVkQXJyYXkoc3RyaW5nTWF0cml4KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlRml4ZWRBcnJheShieXRlRW51bU1hdHJpeCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUZpeGVkQXJyYXkoaW50RW51bU1hdHJpeCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUZpeGVkQXJyYXkobG9uZ0VudW1NYXRyaXgpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVGaXhlZEFycmF5KHBhcmNlbGFibGVNYXRyaXgpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVGaXhlZEFycmF5KGJvb2xOdWxsYWJsZUFycmF5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlRml4ZWRBcnJheShieXRlTnVsbGFibGVBcnJheSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUZpeGVkQXJyYXkoY2hhck51bGxhYmxlQXJyYXkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVGaXhlZEFycmF5KGludE51bGxhYmxlQXJyYXkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVGaXhlZEFycmF5KGxvbmdOdWxsYWJsZUFycmF5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlRml4ZWRBcnJheShmbG9hdE51bGxhYmxlQXJyYXkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVGaXhlZEFycmF5KGRvdWJsZU51bGxhYmxlQXJyYXkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVGaXhlZEFycmF5KHN0cmluZ051bGxhYmxlQXJyYXkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVGaXhlZEFycmF5KGJ5dGVFbnVtTnVsbGFibGVBcnJheSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUZpeGVkQXJyYXkoaW50RW51bU51bGxhYmxlQXJyYXkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVGaXhlZEFycmF5KGxvbmdFbnVtTnVsbGFibGVBcnJheSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUZpeGVkQXJyYXkoYmluZGVyTnVsbGFibGVBcnJheSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUZpeGVkQXJyYXkocGZkTnVsbGFibGVBcnJheSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUZpeGVkQXJyYXkocGFyY2VsYWJsZU51bGxhYmxlQXJyYXkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVGaXhlZEFycmF5KGludGVyZmFjZU51bGxhYmxlQXJyYXkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVGaXhlZEFycmF5KGJvb2xOdWxsYWJsZU1hdHJpeCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUZpeGVkQXJyYXkoYnl0ZU51bGxhYmxlTWF0cml4KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlRml4ZWRBcnJheShjaGFyTnVsbGFibGVNYXRyaXgpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVGaXhlZEFycmF5KGludE51bGxhYmxlTWF0cml4KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlRml4ZWRBcnJheShsb25nTnVsbGFibGVNYXRyaXgpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVGaXhlZEFycmF5KGZsb2F0TnVsbGFibGVNYXRyaXgpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVGaXhlZEFycmF5KGRvdWJsZU51bGxhYmxlTWF0cml4KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlRml4ZWRBcnJheShzdHJpbmdOdWxsYWJsZU1hdHJpeCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUZpeGVkQXJyYXkoYnl0ZUVudW1OdWxsYWJsZU1hdHJpeCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUZpeGVkQXJyYXkoaW50RW51bU51bGxhYmxlTWF0cml4KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlRml4ZWRBcnJheShsb25nRW51bU51bGxhYmxlTWF0cml4KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlRml4ZWRBcnJheShiaW5kZXJOdWxsYWJsZU1hdHJpeCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUZpeGVkQXJyYXkocGZkTnVsbGFibGVNYXRyaXgpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVGaXhlZEFycmF5KHBhcmNlbGFibGVOdWxsYWJsZU1hdHJpeCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUZpeGVkQXJyYXkoaW50ZXJmYWNlTnVsbGFibGVNYXRyaXgpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgYXV0byBfYWlkbF9lbmRfcG9zID0gX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKKyAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zKTsKKyAgX2FpZGxfcGFyY2VsLT53cml0ZUludDMyKF9haWRsX2VuZF9wb3MgLSBfYWlkbF9zdGFydF9wb3MpOworICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9lbmRfcG9zKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9Cit9ICAvLyBuYW1lc3BhY2UgZml4ZWRzaXplYXJyYXkKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC9maXhlZHNpemVhcnJheS9GaXhlZFNpemVBcnJheUV4YW1wbGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvZml4ZWRzaXplYXJyYXkvRml4ZWRTaXplQXJyYXlFeGFtcGxlLmg+CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgZml4ZWRzaXplYXJyYXkgeworRE9fTk9UX0RJUkVDVExZX1VTRV9NRV9JTVBMRU1FTlRfTUVUQV9ORVNURURfSU5URVJGQUNFKEZpeGVkU2l6ZUFycmF5RXhhbXBsZSwgUmVwZWF0Rml4ZWRTaXplQXJyYXksICJhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLklSZXBlYXRGaXhlZFNpemVBcnJheSIpCit9ICAvLyBuYW1lc3BhY2UgZml4ZWRzaXplYXJyYXkKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC9maXhlZHNpemVhcnJheS9GaXhlZFNpemVBcnJheUV4YW1wbGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvZml4ZWRzaXplYXJyYXkvRml4ZWRTaXplQXJyYXlFeGFtcGxlLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9tYWNyb3MuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGZpeGVkc2l6ZWFycmF5IHsKKworRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpCcFJlcGVhdEZpeGVkU2l6ZUFycmF5OjpCcFJlcGVhdEZpeGVkU2l6ZUFycmF5KGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiYgX2FpZGxfaW1wbCkKKyAgICA6IEJwSW50ZXJmYWNlPElSZXBlYXRGaXhlZFNpemVBcnJheT4oX2FpZGxfaW1wbCl7Cit9CisKKzo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpCcFJlcGVhdEZpeGVkU2l6ZUFycmF5OjpSZXBlYXRCeXRlcyhjb25zdCBzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+JiBpbnB1dCwgc3RkOjphcnJheTx1aW50OF90LCAzPiogcmVwZWF0ZWQsIHN0ZDo6YXJyYXk8dWludDhfdCwgMz4qIF9haWRsX3JldHVybikgeworICA6OmFuZHJvaWQ6OlBhcmNlbCBfYWlkbF9kYXRhOworICBfYWlkbF9kYXRhLm1hcmtGb3JCaW5kZXIocmVtb3RlU3Ryb25nKCkpOworICA6OmFuZHJvaWQ6OlBhcmNlbCBfYWlkbF9yZXBseTsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpPSzsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oZ2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVGaXhlZEFycmF5KGlucHV0KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChGaXhlZFNpemVBcnJheUV4YW1wbGU6OkJuUmVwZWF0Rml4ZWRTaXplQXJyYXk6OlRSQU5TQUNUSU9OX1JlcGVhdEJ5dGVzLCBfYWlkbF9kYXRhLCAmX2FpZGxfcmVwbHksIDApOworICBpZiAoVU5MSUtFTFkoX2FpZGxfcmV0X3N0YXR1cyA9PSA6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04gJiYgSVJlcGVhdEZpeGVkU2l6ZUFycmF5OjpnZXREZWZhdWx0SW1wbCgpKSkgeworICAgICByZXR1cm4gSVJlcGVhdEZpeGVkU2l6ZUFycmF5OjpnZXREZWZhdWx0SW1wbCgpLT5SZXBlYXRCeXRlcyhpbnB1dCwgcmVwZWF0ZWQsIF9haWRsX3JldHVybik7CisgIH0KKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy5yZWFkRnJvbVBhcmNlbChfYWlkbF9yZXBseSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIGlmICghX2FpZGxfc3RhdHVzLmlzT2soKSkgeworICAgIHJldHVybiBfYWlkbF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWRGaXhlZEFycmF5KF9haWRsX3JldHVybik7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS5yZWFkRml4ZWRBcnJheShyZXBlYXRlZCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX2Vycm9yOgorICBfYWlkbF9zdGF0dXMuc2V0RnJvbVN0YXR1c1QoX2FpZGxfcmV0X3N0YXR1cyk7CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9CisKKzo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpCcFJlcGVhdEZpeGVkU2l6ZUFycmF5OjpSZXBlYXRJbnRzKGNvbnN0IHN0ZDo6YXJyYXk8aW50MzJfdCwgMz4mIGlucHV0LCBzdGQ6OmFycmF5PGludDMyX3QsIDM+KiByZXBlYXRlZCwgc3RkOjphcnJheTxpbnQzMl90LCAzPiogX2FpZGxfcmV0dXJuKSB7CisgIDo6YW5kcm9pZDo6UGFyY2VsIF9haWRsX2RhdGE7CisgIF9haWRsX2RhdGEubWFya0ZvckJpbmRlcihyZW1vdGVTdHJvbmcoKSk7CisgIDo6YW5kcm9pZDo6UGFyY2VsIF9haWRsX3JlcGx5OworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1czsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZUZpeGVkQXJyYXkoaW5wdXQpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6Qm5SZXBlYXRGaXhlZFNpemVBcnJheTo6VFJBTlNBQ1RJT05fUmVwZWF0SW50cywgX2FpZGxfZGF0YSwgJl9haWRsX3JlcGx5LCAwKTsKKyAgaWYgKFVOTElLRUxZKF9haWRsX3JldF9zdGF0dXMgPT0gOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OICYmIElSZXBlYXRGaXhlZFNpemVBcnJheTo6Z2V0RGVmYXVsdEltcGwoKSkpIHsKKyAgICAgcmV0dXJuIElSZXBlYXRGaXhlZFNpemVBcnJheTo6Z2V0RGVmYXVsdEltcGwoKS0+UmVwZWF0SW50cyhpbnB1dCwgcmVwZWF0ZWQsIF9haWRsX3JldHVybik7CisgIH0KKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy5yZWFkRnJvbVBhcmNlbChfYWlkbF9yZXBseSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIGlmICghX2FpZGxfc3RhdHVzLmlzT2soKSkgeworICAgIHJldHVybiBfYWlkbF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWRGaXhlZEFycmF5KF9haWRsX3JldHVybik7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS5yZWFkRml4ZWRBcnJheShyZXBlYXRlZCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX2Vycm9yOgorICBfYWlkbF9zdGF0dXMuc2V0RnJvbVN0YXR1c1QoX2FpZGxfcmV0X3N0YXR1cyk7CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9CisKKzo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpCcFJlcGVhdEZpeGVkU2l6ZUFycmF5OjpSZXBlYXRCaW5kZXJzKGNvbnN0IHN0ZDo6YXJyYXk8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+LCAzPiYgaW5wdXQsIHN0ZDo6YXJyYXk8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+LCAzPiogcmVwZWF0ZWQsIHN0ZDo6YXJyYXk8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+LCAzPiogX2FpZGxfcmV0dXJuKSB7CisgIDo6YW5kcm9pZDo6UGFyY2VsIF9haWRsX2RhdGE7CisgIF9haWRsX2RhdGEubWFya0ZvckJpbmRlcihyZW1vdGVTdHJvbmcoKSk7CisgIDo6YW5kcm9pZDo6UGFyY2VsIF9haWRsX3JlcGx5OworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1czsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZUZpeGVkQXJyYXkoaW5wdXQpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6Qm5SZXBlYXRGaXhlZFNpemVBcnJheTo6VFJBTlNBQ1RJT05fUmVwZWF0QmluZGVycywgX2FpZGxfZGF0YSwgJl9haWRsX3JlcGx5LCAwKTsKKyAgaWYgKFVOTElLRUxZKF9haWRsX3JldF9zdGF0dXMgPT0gOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OICYmIElSZXBlYXRGaXhlZFNpemVBcnJheTo6Z2V0RGVmYXVsdEltcGwoKSkpIHsKKyAgICAgcmV0dXJuIElSZXBlYXRGaXhlZFNpemVBcnJheTo6Z2V0RGVmYXVsdEltcGwoKS0+UmVwZWF0QmluZGVycyhpbnB1dCwgcmVwZWF0ZWQsIF9haWRsX3JldHVybik7CisgIH0KKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy5yZWFkRnJvbVBhcmNlbChfYWlkbF9yZXBseSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIGlmICghX2FpZGxfc3RhdHVzLmlzT2soKSkgeworICAgIHJldHVybiBfYWlkbF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWRGaXhlZEFycmF5KF9haWRsX3JldHVybik7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS5yZWFkRml4ZWRBcnJheShyZXBlYXRlZCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX2Vycm9yOgorICBfYWlkbF9zdGF0dXMuc2V0RnJvbVN0YXR1c1QoX2FpZGxfcmV0X3N0YXR1cyk7CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9CisKKzo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpCcFJlcGVhdEZpeGVkU2l6ZUFycmF5OjpSZXBlYXRQYXJjZWxhYmxlcyhjb25zdCBzdGQ6OmFycmF5PDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZSwgMz4mIGlucHV0LCBzdGQ6OmFycmF5PDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZSwgMz4qIHJlcGVhdGVkLCBzdGQ6OmFycmF5PDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZSwgMz4qIF9haWRsX3JldHVybikgeworICA6OmFuZHJvaWQ6OlBhcmNlbCBfYWlkbF9kYXRhOworICBfYWlkbF9kYXRhLm1hcmtGb3JCaW5kZXIocmVtb3RlU3Ryb25nKCkpOworICA6OmFuZHJvaWQ6OlBhcmNlbCBfYWlkbF9yZXBseTsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpPSzsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oZ2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVGaXhlZEFycmF5KGlucHV0KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChGaXhlZFNpemVBcnJheUV4YW1wbGU6OkJuUmVwZWF0Rml4ZWRTaXplQXJyYXk6OlRSQU5TQUNUSU9OX1JlcGVhdFBhcmNlbGFibGVzLCBfYWlkbF9kYXRhLCAmX2FpZGxfcmVwbHksIDApOworICBpZiAoVU5MSUtFTFkoX2FpZGxfcmV0X3N0YXR1cyA9PSA6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04gJiYgSVJlcGVhdEZpeGVkU2l6ZUFycmF5OjpnZXREZWZhdWx0SW1wbCgpKSkgeworICAgICByZXR1cm4gSVJlcGVhdEZpeGVkU2l6ZUFycmF5OjpnZXREZWZhdWx0SW1wbCgpLT5SZXBlYXRQYXJjZWxhYmxlcyhpbnB1dCwgcmVwZWF0ZWQsIF9haWRsX3JldHVybik7CisgIH0KKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy5yZWFkRnJvbVBhcmNlbChfYWlkbF9yZXBseSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIGlmICghX2FpZGxfc3RhdHVzLmlzT2soKSkgeworICAgIHJldHVybiBfYWlkbF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWRGaXhlZEFycmF5KF9haWRsX3JldHVybik7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS5yZWFkRml4ZWRBcnJheShyZXBlYXRlZCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX2Vycm9yOgorICBfYWlkbF9zdGF0dXMuc2V0RnJvbVN0YXR1c1QoX2FpZGxfcmV0X3N0YXR1cyk7CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9CisKKzo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpCcFJlcGVhdEZpeGVkU2l6ZUFycmF5OjpSZXBlYXQyZEJ5dGVzKGNvbnN0IHN0ZDo6YXJyYXk8c3RkOjphcnJheTx1aW50OF90LCAzPiwgMj4mIGlucHV0LCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8dWludDhfdCwgMz4sIDI+KiByZXBlYXRlZCwgc3RkOjphcnJheTxzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+LCAyPiogX2FpZGxfcmV0dXJuKSB7CisgIDo6YW5kcm9pZDo6UGFyY2VsIF9haWRsX2RhdGE7CisgIF9haWRsX2RhdGEubWFya0ZvckJpbmRlcihyZW1vdGVTdHJvbmcoKSk7CisgIDo6YW5kcm9pZDo6UGFyY2VsIF9haWRsX3JlcGx5OworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1czsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZUZpeGVkQXJyYXkoaW5wdXQpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6Qm5SZXBlYXRGaXhlZFNpemVBcnJheTo6VFJBTlNBQ1RJT05fUmVwZWF0MmRCeXRlcywgX2FpZGxfZGF0YSwgJl9haWRsX3JlcGx5LCAwKTsKKyAgaWYgKFVOTElLRUxZKF9haWRsX3JldF9zdGF0dXMgPT0gOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OICYmIElSZXBlYXRGaXhlZFNpemVBcnJheTo6Z2V0RGVmYXVsdEltcGwoKSkpIHsKKyAgICAgcmV0dXJuIElSZXBlYXRGaXhlZFNpemVBcnJheTo6Z2V0RGVmYXVsdEltcGwoKS0+UmVwZWF0MmRCeXRlcyhpbnB1dCwgcmVwZWF0ZWQsIF9haWRsX3JldHVybik7CisgIH0KKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy5yZWFkRnJvbVBhcmNlbChfYWlkbF9yZXBseSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIGlmICghX2FpZGxfc3RhdHVzLmlzT2soKSkgeworICAgIHJldHVybiBfYWlkbF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWRGaXhlZEFycmF5KF9haWRsX3JldHVybik7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS5yZWFkRml4ZWRBcnJheShyZXBlYXRlZCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX2Vycm9yOgorICBfYWlkbF9zdGF0dXMuc2V0RnJvbVN0YXR1c1QoX2FpZGxfcmV0X3N0YXR1cyk7CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9CisKKzo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpCcFJlcGVhdEZpeGVkU2l6ZUFycmF5OjpSZXBlYXQyZEludHMoY29uc3Qgc3RkOjphcnJheTxzdGQ6OmFycmF5PGludDMyX3QsIDM+LCAyPiYgaW5wdXQsIHN0ZDo6YXJyYXk8c3RkOjphcnJheTxpbnQzMl90LCAzPiwgMj4qIHJlcGVhdGVkLCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8aW50MzJfdCwgMz4sIDI+KiBfYWlkbF9yZXR1cm4pIHsKKyAgOjphbmRyb2lkOjpQYXJjZWwgX2FpZGxfZGF0YTsKKyAgX2FpZGxfZGF0YS5tYXJrRm9yQmluZGVyKHJlbW90ZVN0cm9uZygpKTsKKyAgOjphbmRyb2lkOjpQYXJjZWwgX2FpZGxfcmVwbHk7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzOworICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKGdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLndyaXRlRml4ZWRBcnJheShpbnB1dCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpCblJlcGVhdEZpeGVkU2l6ZUFycmF5OjpUUkFOU0FDVElPTl9SZXBlYXQyZEludHMsIF9haWRsX2RhdGEsICZfYWlkbF9yZXBseSwgMCk7CisgIGlmIChVTkxJS0VMWShfYWlkbF9yZXRfc3RhdHVzID09IDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTiAmJiBJUmVwZWF0Rml4ZWRTaXplQXJyYXk6OmdldERlZmF1bHRJbXBsKCkpKSB7CisgICAgIHJldHVybiBJUmVwZWF0Rml4ZWRTaXplQXJyYXk6OmdldERlZmF1bHRJbXBsKCktPlJlcGVhdDJkSW50cyhpbnB1dCwgcmVwZWF0ZWQsIF9haWRsX3JldHVybik7CisgIH0KKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy5yZWFkRnJvbVBhcmNlbChfYWlkbF9yZXBseSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIGlmICghX2FpZGxfc3RhdHVzLmlzT2soKSkgeworICAgIHJldHVybiBfYWlkbF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWRGaXhlZEFycmF5KF9haWRsX3JldHVybik7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS5yZWFkRml4ZWRBcnJheShyZXBlYXRlZCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX2Vycm9yOgorICBfYWlkbF9zdGF0dXMuc2V0RnJvbVN0YXR1c1QoX2FpZGxfcmV0X3N0YXR1cyk7CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9CisKKzo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpCcFJlcGVhdEZpeGVkU2l6ZUFycmF5OjpSZXBlYXQyZEJpbmRlcnMoY29uc3Qgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiwgMz4sIDI+JiBpbnB1dCwgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiwgMz4sIDI+KiByZXBlYXRlZCwgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiwgMz4sIDI+KiBfYWlkbF9yZXR1cm4pIHsKKyAgOjphbmRyb2lkOjpQYXJjZWwgX2FpZGxfZGF0YTsKKyAgX2FpZGxfZGF0YS5tYXJrRm9yQmluZGVyKHJlbW90ZVN0cm9uZygpKTsKKyAgOjphbmRyb2lkOjpQYXJjZWwgX2FpZGxfcmVwbHk7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzOworICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKGdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLndyaXRlRml4ZWRBcnJheShpbnB1dCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpCblJlcGVhdEZpeGVkU2l6ZUFycmF5OjpUUkFOU0FDVElPTl9SZXBlYXQyZEJpbmRlcnMsIF9haWRsX2RhdGEsICZfYWlkbF9yZXBseSwgMCk7CisgIGlmIChVTkxJS0VMWShfYWlkbF9yZXRfc3RhdHVzID09IDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTiAmJiBJUmVwZWF0Rml4ZWRTaXplQXJyYXk6OmdldERlZmF1bHRJbXBsKCkpKSB7CisgICAgIHJldHVybiBJUmVwZWF0Rml4ZWRTaXplQXJyYXk6OmdldERlZmF1bHRJbXBsKCktPlJlcGVhdDJkQmluZGVycyhpbnB1dCwgcmVwZWF0ZWQsIF9haWRsX3JldHVybik7CisgIH0KKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy5yZWFkRnJvbVBhcmNlbChfYWlkbF9yZXBseSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIGlmICghX2FpZGxfc3RhdHVzLmlzT2soKSkgeworICAgIHJldHVybiBfYWlkbF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWRGaXhlZEFycmF5KF9haWRsX3JldHVybik7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS5yZWFkRml4ZWRBcnJheShyZXBlYXRlZCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX2Vycm9yOgorICBfYWlkbF9zdGF0dXMuc2V0RnJvbVN0YXR1c1QoX2FpZGxfcmV0X3N0YXR1cyk7CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9CisKKzo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpCcFJlcGVhdEZpeGVkU2l6ZUFycmF5OjpSZXBlYXQyZFBhcmNlbGFibGVzKGNvbnN0IHN0ZDo6YXJyYXk8c3RkOjphcnJheTw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludFBhcmNlbGFibGUsIDM+LCAyPiYgaW5wdXQsIHN0ZDo6YXJyYXk8c3RkOjphcnJheTw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludFBhcmNlbGFibGUsIDM+LCAyPiogcmVwZWF0ZWQsIHN0ZDo6YXJyYXk8c3RkOjphcnJheTw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludFBhcmNlbGFibGUsIDM+LCAyPiogX2FpZGxfcmV0dXJuKSB7CisgIDo6YW5kcm9pZDo6UGFyY2VsIF9haWRsX2RhdGE7CisgIF9haWRsX2RhdGEubWFya0ZvckJpbmRlcihyZW1vdGVTdHJvbmcoKSk7CisgIDo6YW5kcm9pZDo6UGFyY2VsIF9haWRsX3JlcGx5OworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1czsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZUZpeGVkQXJyYXkoaW5wdXQpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6Qm5SZXBlYXRGaXhlZFNpemVBcnJheTo6VFJBTlNBQ1RJT05fUmVwZWF0MmRQYXJjZWxhYmxlcywgX2FpZGxfZGF0YSwgJl9haWRsX3JlcGx5LCAwKTsKKyAgaWYgKFVOTElLRUxZKF9haWRsX3JldF9zdGF0dXMgPT0gOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OICYmIElSZXBlYXRGaXhlZFNpemVBcnJheTo6Z2V0RGVmYXVsdEltcGwoKSkpIHsKKyAgICAgcmV0dXJuIElSZXBlYXRGaXhlZFNpemVBcnJheTo6Z2V0RGVmYXVsdEltcGwoKS0+UmVwZWF0MmRQYXJjZWxhYmxlcyhpbnB1dCwgcmVwZWF0ZWQsIF9haWRsX3JldHVybik7CisgIH0KKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy5yZWFkRnJvbVBhcmNlbChfYWlkbF9yZXBseSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIGlmICghX2FpZGxfc3RhdHVzLmlzT2soKSkgeworICAgIHJldHVybiBfYWlkbF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWRGaXhlZEFycmF5KF9haWRsX3JldHVybik7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS5yZWFkRml4ZWRBcnJheShyZXBlYXRlZCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX2Vycm9yOgorICBfYWlkbF9zdGF0dXMuc2V0RnJvbVN0YXR1c1QoX2FpZGxfcmV0X3N0YXR1cyk7CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBmaXhlZHNpemVhcnJheQorfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL2ZpeGVkc2l6ZWFycmF5L0ZpeGVkU2l6ZUFycmF5RXhhbXBsZS5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxiaW5kZXIvU3RhYmlsaXR5Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBmaXhlZHNpemVhcnJheSB7CisKK0ZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6Qm5SZXBlYXRGaXhlZFNpemVBcnJheTo6Qm5SZXBlYXRGaXhlZFNpemVBcnJheSgpCit7CisgIDo6YW5kcm9pZDo6aW50ZXJuYWw6OlN0YWJpbGl0eTo6bWFya0NvbXBpbGF0aW9uVW5pdCh0aGlzKTsKK30KKworOjphbmRyb2lkOjpzdGF0dXNfdCBGaXhlZFNpemVBcnJheUV4YW1wbGU6OkJuUmVwZWF0Rml4ZWRTaXplQXJyYXk6Om9uVHJhbnNhY3QodWludDMyX3QgX2FpZGxfY29kZSwgY29uc3QgOjphbmRyb2lkOjpQYXJjZWwmIF9haWRsX2RhdGEsIDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9yZXBseSwgdWludDMyX3QgX2FpZGxfZmxhZ3MpIHsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpPSzsKKyAgc3dpdGNoIChfYWlkbF9jb2RlKSB7CisgIGNhc2UgQm5SZXBlYXRGaXhlZFNpemVBcnJheTo6VFJBTlNBQ1RJT05fUmVwZWF0Qnl0ZXM6CisgIHsKKyAgICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+IGluX2lucHV0OworICAgIHN0ZDo6YXJyYXk8dWludDhfdCwgMz4gb3V0X3JlcGVhdGVkOworICAgIHN0ZDo6YXJyYXk8dWludDhfdCwgMz4gX2FpZGxfcmV0dXJuOworICAgIGlmICghKF9haWRsX2RhdGEuY2hlY2tJbnRlcmZhY2UodGhpcykpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpCQURfVFlQRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS5yZWFkRml4ZWRBcnJheSgmaW5faW5wdXQpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoYXV0byBzdCA9IF9haWRsX2RhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7ICFzdC5pc09rKCkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBzdC53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1cyhSZXBlYXRCeXRlcyhpbl9pbnB1dCwgJm91dF9yZXBlYXRlZCwgJl9haWRsX3JldHVybikpOworICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICghX2FpZGxfc3RhdHVzLmlzT2soKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS0+d3JpdGVGaXhlZEFycmF5KF9haWRsX3JldHVybik7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS0+d3JpdGVGaXhlZEFycmF5KG91dF9yZXBlYXRlZCk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGJyZWFrOworICBjYXNlIEJuUmVwZWF0Rml4ZWRTaXplQXJyYXk6OlRSQU5TQUNUSU9OX1JlcGVhdEludHM6CisgIHsKKyAgICBzdGQ6OmFycmF5PGludDMyX3QsIDM+IGluX2lucHV0OworICAgIHN0ZDo6YXJyYXk8aW50MzJfdCwgMz4gb3V0X3JlcGVhdGVkOworICAgIHN0ZDo6YXJyYXk8aW50MzJfdCwgMz4gX2FpZGxfcmV0dXJuOworICAgIGlmICghKF9haWRsX2RhdGEuY2hlY2tJbnRlcmZhY2UodGhpcykpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpCQURfVFlQRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS5yZWFkRml4ZWRBcnJheSgmaW5faW5wdXQpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoYXV0byBzdCA9IF9haWRsX2RhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7ICFzdC5pc09rKCkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBzdC53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1cyhSZXBlYXRJbnRzKGluX2lucHV0LCAmb3V0X3JlcGVhdGVkLCAmX2FpZGxfcmV0dXJuKSk7CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKCFfYWlkbF9zdGF0dXMuaXNPaygpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LT53cml0ZUZpeGVkQXJyYXkoX2FpZGxfcmV0dXJuKTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LT53cml0ZUZpeGVkQXJyYXkob3V0X3JlcGVhdGVkKTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgYnJlYWs7CisgIGNhc2UgQm5SZXBlYXRGaXhlZFNpemVBcnJheTo6VFJBTlNBQ1RJT05fUmVwZWF0QmluZGVyczoKKyAgeworICAgIHN0ZDo6YXJyYXk8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+LCAzPiBpbl9pbnB1dDsKKyAgICBzdGQ6OmFycmF5PDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiwgMz4gb3V0X3JlcGVhdGVkOworICAgIHN0ZDo6YXJyYXk8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+LCAzPiBfYWlkbF9yZXR1cm47CisgICAgaWYgKCEoX2FpZGxfZGF0YS5jaGVja0ludGVyZmFjZSh0aGlzKSkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6OkJBRF9UWVBFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLnJlYWRGaXhlZEFycmF5KCZpbl9pbnB1dCk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChhdXRvIHN0ID0gX2FpZGxfZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsgIXN0LmlzT2soKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IHN0LndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzKFJlcGVhdEJpbmRlcnMoaW5faW5wdXQsICZvdXRfcmVwZWF0ZWQsICZfYWlkbF9yZXR1cm4pKTsKKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoIV9haWRsX3N0YXR1cy5pc09rKCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHktPndyaXRlRml4ZWRBcnJheShfYWlkbF9yZXR1cm4pOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHktPndyaXRlRml4ZWRBcnJheShvdXRfcmVwZWF0ZWQpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBicmVhazsKKyAgY2FzZSBCblJlcGVhdEZpeGVkU2l6ZUFycmF5OjpUUkFOU0FDVElPTl9SZXBlYXRQYXJjZWxhYmxlczoKKyAgeworICAgIHN0ZDo6YXJyYXk8OjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlLCAzPiBpbl9pbnB1dDsKKyAgICBzdGQ6OmFycmF5PDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZSwgMz4gb3V0X3JlcGVhdGVkOworICAgIHN0ZDo6YXJyYXk8OjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlLCAzPiBfYWlkbF9yZXR1cm47CisgICAgaWYgKCEoX2FpZGxfZGF0YS5jaGVja0ludGVyZmFjZSh0aGlzKSkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6OkJBRF9UWVBFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLnJlYWRGaXhlZEFycmF5KCZpbl9pbnB1dCk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChhdXRvIHN0ID0gX2FpZGxfZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsgIXN0LmlzT2soKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IHN0LndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzKFJlcGVhdFBhcmNlbGFibGVzKGluX2lucHV0LCAmb3V0X3JlcGVhdGVkLCAmX2FpZGxfcmV0dXJuKSk7CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKCFfYWlkbF9zdGF0dXMuaXNPaygpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LT53cml0ZUZpeGVkQXJyYXkoX2FpZGxfcmV0dXJuKTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LT53cml0ZUZpeGVkQXJyYXkob3V0X3JlcGVhdGVkKTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgYnJlYWs7CisgIGNhc2UgQm5SZXBlYXRGaXhlZFNpemVBcnJheTo6VFJBTlNBQ1RJT05fUmVwZWF0MmRCeXRlczoKKyAgeworICAgIHN0ZDo6YXJyYXk8c3RkOjphcnJheTx1aW50OF90LCAzPiwgMj4gaW5faW5wdXQ7CisgICAgc3RkOjphcnJheTxzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+LCAyPiBvdXRfcmVwZWF0ZWQ7CisgICAgc3RkOjphcnJheTxzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+LCAyPiBfYWlkbF9yZXR1cm47CisgICAgaWYgKCEoX2FpZGxfZGF0YS5jaGVja0ludGVyZmFjZSh0aGlzKSkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6OkJBRF9UWVBFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLnJlYWRGaXhlZEFycmF5KCZpbl9pbnB1dCk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChhdXRvIHN0ID0gX2FpZGxfZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsgIXN0LmlzT2soKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IHN0LndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzKFJlcGVhdDJkQnl0ZXMoaW5faW5wdXQsICZvdXRfcmVwZWF0ZWQsICZfYWlkbF9yZXR1cm4pKTsKKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoIV9haWRsX3N0YXR1cy5pc09rKCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHktPndyaXRlRml4ZWRBcnJheShfYWlkbF9yZXR1cm4pOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHktPndyaXRlRml4ZWRBcnJheShvdXRfcmVwZWF0ZWQpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBicmVhazsKKyAgY2FzZSBCblJlcGVhdEZpeGVkU2l6ZUFycmF5OjpUUkFOU0FDVElPTl9SZXBlYXQyZEludHM6CisgIHsKKyAgICBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8aW50MzJfdCwgMz4sIDI+IGluX2lucHV0OworICAgIHN0ZDo6YXJyYXk8c3RkOjphcnJheTxpbnQzMl90LCAzPiwgMj4gb3V0X3JlcGVhdGVkOworICAgIHN0ZDo6YXJyYXk8c3RkOjphcnJheTxpbnQzMl90LCAzPiwgMj4gX2FpZGxfcmV0dXJuOworICAgIGlmICghKF9haWRsX2RhdGEuY2hlY2tJbnRlcmZhY2UodGhpcykpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpCQURfVFlQRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS5yZWFkRml4ZWRBcnJheSgmaW5faW5wdXQpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoYXV0byBzdCA9IF9haWRsX2RhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7ICFzdC5pc09rKCkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBzdC53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1cyhSZXBlYXQyZEludHMoaW5faW5wdXQsICZvdXRfcmVwZWF0ZWQsICZfYWlkbF9yZXR1cm4pKTsKKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoIV9haWRsX3N0YXR1cy5pc09rKCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHktPndyaXRlRml4ZWRBcnJheShfYWlkbF9yZXR1cm4pOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHktPndyaXRlRml4ZWRBcnJheShvdXRfcmVwZWF0ZWQpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBicmVhazsKKyAgY2FzZSBCblJlcGVhdEZpeGVkU2l6ZUFycmF5OjpUUkFOU0FDVElPTl9SZXBlYXQyZEJpbmRlcnM6CisgIHsKKyAgICBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+LCAzPiwgMj4gaW5faW5wdXQ7CisgICAgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiwgMz4sIDI+IG91dF9yZXBlYXRlZDsKKyAgICBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+LCAzPiwgMj4gX2FpZGxfcmV0dXJuOworICAgIGlmICghKF9haWRsX2RhdGEuY2hlY2tJbnRlcmZhY2UodGhpcykpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpCQURfVFlQRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS5yZWFkRml4ZWRBcnJheSgmaW5faW5wdXQpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoYXV0byBzdCA9IF9haWRsX2RhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7ICFzdC5pc09rKCkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBzdC53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1cyhSZXBlYXQyZEJpbmRlcnMoaW5faW5wdXQsICZvdXRfcmVwZWF0ZWQsICZfYWlkbF9yZXR1cm4pKTsKKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoIV9haWRsX3N0YXR1cy5pc09rKCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHktPndyaXRlRml4ZWRBcnJheShfYWlkbF9yZXR1cm4pOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHktPndyaXRlRml4ZWRBcnJheShvdXRfcmVwZWF0ZWQpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBicmVhazsKKyAgY2FzZSBCblJlcGVhdEZpeGVkU2l6ZUFycmF5OjpUUkFOU0FDVElPTl9SZXBlYXQyZFBhcmNlbGFibGVzOgorICB7CisgICAgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZSwgMz4sIDI+IGluX2lucHV0OworICAgIHN0ZDo6YXJyYXk8c3RkOjphcnJheTw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludFBhcmNlbGFibGUsIDM+LCAyPiBvdXRfcmVwZWF0ZWQ7CisgICAgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZSwgMz4sIDI+IF9haWRsX3JldHVybjsKKyAgICBpZiAoIShfYWlkbF9kYXRhLmNoZWNrSW50ZXJmYWNlKHRoaXMpKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6QkFEX1RZUEU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEucmVhZEZpeGVkQXJyYXkoJmluX2lucHV0KTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGF1dG8gc3QgPSBfYWlkbF9kYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOyAhc3QuaXNPaygpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gc3Qud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXMoUmVwZWF0MmRQYXJjZWxhYmxlcyhpbl9pbnB1dCwgJm91dF9yZXBlYXRlZCwgJl9haWRsX3JldHVybikpOworICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICghX2FpZGxfc3RhdHVzLmlzT2soKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS0+d3JpdGVGaXhlZEFycmF5KF9haWRsX3JldHVybik7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS0+d3JpdGVGaXhlZEFycmF5KG91dF9yZXBlYXRlZCk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGJyZWFrOworICBkZWZhdWx0OgorICB7CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6QkJpbmRlcjo6b25UcmFuc2FjdChfYWlkbF9jb2RlLCBfYWlkbF9kYXRhLCBfYWlkbF9yZXBseSwgX2FpZGxfZmxhZ3MpOworICB9CisgIGJyZWFrOworICB9CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzID09IDo6YW5kcm9pZDo6VU5FWFBFQ1RFRF9OVUxMKSB7CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21FeGNlcHRpb25Db2RlKDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OkVYX05VTExfUE9JTlRFUikud3JpdGVPdmVyUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgfQorICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KKworfSAgLy8gbmFtZXNwYWNlIGZpeGVkc2l6ZWFycmF5Cit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvZml4ZWRzaXplYXJyYXkvRml4ZWRTaXplQXJyYXlFeGFtcGxlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBmaXhlZHNpemVhcnJheSB7Cis6OmFuZHJvaWQ6OnN0YXR1c190IEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZTo6cmVhZEZyb21QYXJjZWwoY29uc3QgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgeworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICBzaXplX3QgX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKKyAgaW50MzJfdCBfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplID0gMDsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEludDMyKCZfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplIDwgNCkgcmV0dXJuIDo6YW5kcm9pZDo6QkFEX1ZBTFVFOworICBzaXplX3QgX2FpZGxfcGFyY2VsYWJsZV9zaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplKTsKKyAgaWYgKF9haWRsX3N0YXJ0X3BvcyA+IFNJWkVfTUFYIC0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm4gOjphbmRyb2lkOjpCQURfVkFMVUU7CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEludDMyKCZ2YWx1ZSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KKzo6YW5kcm9pZDo6c3RhdHVzX3QgRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlOjp3cml0ZVRvUGFyY2VsKDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IHsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpPSzsKKyAgYXV0byBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBfYWlkbF9wYXJjZWwtPndyaXRlSW50MzIoMCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlSW50MzIodmFsdWUpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgYXV0byBfYWlkbF9lbmRfcG9zID0gX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKKyAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zKTsKKyAgX2FpZGxfcGFyY2VsLT53cml0ZUludDMyKF9haWRsX2VuZF9wb3MgLSBfYWlkbF9zdGFydF9wb3MpOworICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9lbmRfcG9zKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9Cit9ICAvLyBuYW1lc3BhY2UgZml4ZWRzaXplYXJyYXkKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC9maXhlZHNpemVhcnJheS9GaXhlZFNpemVBcnJheUV4YW1wbGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvZml4ZWRzaXplYXJyYXkvRml4ZWRTaXplQXJyYXlFeGFtcGxlLmg+CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgZml4ZWRzaXplYXJyYXkgeworRE9fTk9UX0RJUkVDVExZX1VTRV9NRV9JTVBMRU1FTlRfTUVUQV9ORVNURURfSU5URVJGQUNFKEZpeGVkU2l6ZUFycmF5RXhhbXBsZSwgRW1wdHlJbnRlcmZhY2UsICJhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLklFbXB0eUludGVyZmFjZSIpCit9ICAvLyBuYW1lc3BhY2UgZml4ZWRzaXplYXJyYXkKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC9maXhlZHNpemVhcnJheS9GaXhlZFNpemVBcnJheUV4YW1wbGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvZml4ZWRzaXplYXJyYXkvRml4ZWRTaXplQXJyYXlFeGFtcGxlLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9tYWNyb3MuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGZpeGVkc2l6ZWFycmF5IHsKKworRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpCcEVtcHR5SW50ZXJmYWNlOjpCcEVtcHR5SW50ZXJmYWNlKGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiYgX2FpZGxfaW1wbCkKKyAgICA6IEJwSW50ZXJmYWNlPElFbXB0eUludGVyZmFjZT4oX2FpZGxfaW1wbCl7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBmaXhlZHNpemVhcnJheQorfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL2ZpeGVkc2l6ZWFycmF5L0ZpeGVkU2l6ZUFycmF5RXhhbXBsZS5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxiaW5kZXIvU3RhYmlsaXR5Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBmaXhlZHNpemVhcnJheSB7CisKK0ZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6Qm5FbXB0eUludGVyZmFjZTo6Qm5FbXB0eUludGVyZmFjZSgpCit7CisgIDo6YW5kcm9pZDo6aW50ZXJuYWw6OlN0YWJpbGl0eTo6bWFya0NvbXBpbGF0aW9uVW5pdCh0aGlzKTsKK30KKworOjphbmRyb2lkOjpzdGF0dXNfdCBGaXhlZFNpemVBcnJheUV4YW1wbGU6OkJuRW1wdHlJbnRlcmZhY2U6Om9uVHJhbnNhY3QodWludDMyX3QgX2FpZGxfY29kZSwgY29uc3QgOjphbmRyb2lkOjpQYXJjZWwmIF9haWRsX2RhdGEsIDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9yZXBseSwgdWludDMyX3QgX2FpZGxfZmxhZ3MpIHsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpPSzsKKyAgc3dpdGNoIChfYWlkbF9jb2RlKSB7CisgIGRlZmF1bHQ6CisgIHsKKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpCQmluZGVyOjpvblRyYW5zYWN0KF9haWRsX2NvZGUsIF9haWRsX2RhdGEsIF9haWRsX3JlcGx5LCBfYWlkbF9mbGFncyk7CisgIH0KKyAgYnJlYWs7CisgIH0KKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgPT0gOjphbmRyb2lkOjpVTkVYUEVDVEVEX05VTEwpIHsKKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbUV4Y2VwdGlvbkNvZGUoOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6RVhfTlVMTF9QT0lOVEVSKS53cml0ZU92ZXJQYXJjZWwoX2FpZGxfcmVwbHkpOworICB9CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorCit9ICAvLyBuYW1lc3BhY2UgZml4ZWRzaXplYXJyYXkKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtZml4ZWRzaXplYXJyYXktY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2ZpeGVkc2l6ZWFycmF5L0ZpeGVkU2l6ZUFycmF5RXhhbXBsZS5jcHAuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWZpeGVkc2l6ZWFycmF5LWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9maXhlZHNpemVhcnJheS9GaXhlZFNpemVBcnJheUV4YW1wbGUuY3BwLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQwZTE4MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWZpeGVkc2l6ZWFycmF5LWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9maXhlZHNpemVhcnJheS9GaXhlZFNpemVBcnJheUV4YW1wbGUuY3BwLmQKQEAgLTAsMCArMSwyIEBACitvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LWZpeGVkc2l6ZWFycmF5LWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9maXhlZHNpemVhcnJheS9GaXhlZFNpemVBcnJheUV4YW1wbGUuY3BwIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvZml4ZWRzaXplYXJyYXkvRml4ZWRTaXplQXJyYXlFeGFtcGxlLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWZpeGVkc2l6ZWFycmF5LWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL2ZpeGVkc2l6ZWFycmF5L0JuRml4ZWRTaXplQXJyYXlFeGFtcGxlLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1maXhlZHNpemVhcnJheS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC9maXhlZHNpemVhcnJheS9CbkZpeGVkU2l6ZUFycmF5RXhhbXBsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNzJhYTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1maXhlZHNpemVhcnJheS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC9maXhlZHNpemVhcnJheS9CbkZpeGVkU2l6ZUFycmF5RXhhbXBsZS5oCkBAIC0wLDAgKzEgQEAKKyNlcnJvciBUT0RPKGIvMTExMzYyNTkzKSBwYXJjZWxhYmxlcyBkbyBub3QgaGF2ZSBibiBjbGFzc2VzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtZml4ZWRzaXplYXJyYXktY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvZml4ZWRzaXplYXJyYXkvQnBGaXhlZFNpemVBcnJheUV4YW1wbGUuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWZpeGVkc2l6ZWFycmF5LWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL2ZpeGVkc2l6ZWFycmF5L0JwRml4ZWRTaXplQXJyYXlFeGFtcGxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdhZjZiMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWZpeGVkc2l6ZWFycmF5LWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL2ZpeGVkc2l6ZWFycmF5L0JwRml4ZWRTaXplQXJyYXlFeGFtcGxlLmgKQEAgLTAsMCArMSBAQAorI2Vycm9yIFRPRE8oYi8xMTEzNjI1OTMpIHBhcmNlbGFibGVzIGRvIG5vdCBoYXZlIGJwIGNsYXNzZXMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1maXhlZHNpemVhcnJheS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC9maXhlZHNpemVhcnJheS9GaXhlZFNpemVBcnJheUV4YW1wbGUuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWZpeGVkc2l6ZWFycmF5LWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL2ZpeGVkc2l6ZWFycmF5L0ZpeGVkU2l6ZUFycmF5RXhhbXBsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0NjBhMzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1maXhlZHNpemVhcnJheS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC9maXhlZHNpemVhcnJheS9GaXhlZFNpemVBcnJheUV4YW1wbGUuaApAQCAtMCwwICsxLDQxOCBAQAorI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvZml4ZWRzaXplYXJyYXkvRml4ZWRTaXplQXJyYXlFeGFtcGxlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfdG9fc3RyaW5nLmg+CisjaW5jbHVkZSA8YXJyYXk+CisjaW5jbHVkZSA8YmluZGVyL0VudW1zLmg+CisjaW5jbHVkZSA8YmluZGVyL0lCaW5kZXIuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsRmlsZURlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxiaW5kZXIvU3RhdHVzLmg+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxvcHRpb25hbD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dHVwbGU+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBmaXhlZHNpemVhcnJheSB7CitjbGFzcyBGaXhlZFNpemVBcnJheUV4YW1wbGUgOiBwdWJsaWMgOjphbmRyb2lkOjpQYXJjZWxhYmxlIHsKK3B1YmxpYzoKKyAgY2xhc3MgSW50UGFyY2VsYWJsZSA6IHB1YmxpYyA6OmFuZHJvaWQ6OlBhcmNlbGFibGUgeworICBwdWJsaWM6CisgICAgaW50MzJfdCB2YWx1ZSA9IDA7CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBJbnRQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZSh2YWx1ZSkgIT0gc3RkOjp0aWUocmhzLnZhbHVlKTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEludFBhcmNlbGFibGUmIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKHZhbHVlKSA8IHN0ZDo6dGllKHJocy52YWx1ZSk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgSW50UGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUodmFsdWUpIDw9IHN0ZDo6dGllKHJocy52YWx1ZSk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgSW50UGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUodmFsdWUpID09IHN0ZDo6dGllKHJocy52YWx1ZSk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPihjb25zdCBJbnRQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZSh2YWx1ZSkgPiBzdGQ6OnRpZShyaHMudmFsdWUpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IEludFBhcmNlbGFibGUmIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKHZhbHVlKSA+PSBzdGQ6OnRpZShyaHMudmFsdWUpOworICAgIH0KKworICAgIDo6YW5kcm9pZDo6c3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgZmluYWw7CisgICAgOjphbmRyb2lkOjpzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IGZpbmFsOworICAgIHN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiBnZXRQYXJjZWxhYmxlRGVzY3JpcHRvcigpIHsKKyAgICAgIHN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0YXRpY1N0cmluZzE2IERFU0NJUFRPUiAodSJhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLkludFBhcmNlbGFibGUiKTsKKyAgICAgIHJldHVybiBERVNDSVBUT1I7CisgICAgfQorICAgIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsKKyAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvczsKKyAgICAgIG9zIDw8ICJJbnRQYXJjZWxhYmxleyI7CisgICAgICBvcyA8PCAidmFsdWU6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcodmFsdWUpOworICAgICAgb3MgPDwgIn0iOworICAgICAgcmV0dXJuIG9zLnN0cigpOworICAgIH0KKyAgfTsgIC8vIGNsYXNzIEludFBhcmNlbGFibGUKKyAgY2xhc3MgSVJlcGVhdEZpeGVkU2l6ZUFycmF5IDogcHVibGljIDo6YW5kcm9pZDo6SUludGVyZmFjZSB7CisgIHB1YmxpYzoKKyAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKFJlcGVhdEZpeGVkU2l6ZUFycmF5KQorICAgIHZpcnR1YWwgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXRCeXRlcyhjb25zdCBzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+JiBpbnB1dCwgc3RkOjphcnJheTx1aW50OF90LCAzPiogcmVwZWF0ZWQsIHN0ZDo6YXJyYXk8dWludDhfdCwgMz4qIF9haWRsX3JldHVybikgPSAwOworICAgIHZpcnR1YWwgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXRJbnRzKGNvbnN0IHN0ZDo6YXJyYXk8aW50MzJfdCwgMz4mIGlucHV0LCBzdGQ6OmFycmF5PGludDMyX3QsIDM+KiByZXBlYXRlZCwgc3RkOjphcnJheTxpbnQzMl90LCAzPiogX2FpZGxfcmV0dXJuKSA9IDA7CisgICAgdmlydHVhbCA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdEJpbmRlcnMoY29uc3Qgc3RkOjphcnJheTw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4sIDM+JiBpbnB1dCwgc3RkOjphcnJheTw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4sIDM+KiByZXBlYXRlZCwgc3RkOjphcnJheTw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4sIDM+KiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgICB2aXJ0dWFsIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0UGFyY2VsYWJsZXMoY29uc3Qgc3RkOjphcnJheTw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludFBhcmNlbGFibGUsIDM+JiBpbnB1dCwgc3RkOjphcnJheTw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludFBhcmNlbGFibGUsIDM+KiByZXBlYXRlZCwgc3RkOjphcnJheTw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludFBhcmNlbGFibGUsIDM+KiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgICB2aXJ0dWFsIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0MmRCeXRlcyhjb25zdCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8dWludDhfdCwgMz4sIDI+JiBpbnB1dCwgc3RkOjphcnJheTxzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+LCAyPiogcmVwZWF0ZWQsIHN0ZDo6YXJyYXk8c3RkOjphcnJheTx1aW50OF90LCAzPiwgMj4qIF9haWRsX3JldHVybikgPSAwOworICAgIHZpcnR1YWwgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXQyZEludHMoY29uc3Qgc3RkOjphcnJheTxzdGQ6OmFycmF5PGludDMyX3QsIDM+LCAyPiYgaW5wdXQsIHN0ZDo6YXJyYXk8c3RkOjphcnJheTxpbnQzMl90LCAzPiwgMj4qIHJlcGVhdGVkLCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8aW50MzJfdCwgMz4sIDI+KiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgICB2aXJ0dWFsIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0MmRCaW5kZXJzKGNvbnN0IHN0ZDo6YXJyYXk8c3RkOjphcnJheTw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4sIDM+LCAyPiYgaW5wdXQsIHN0ZDo6YXJyYXk8c3RkOjphcnJheTw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4sIDM+LCAyPiogcmVwZWF0ZWQsIHN0ZDo6YXJyYXk8c3RkOjphcnJheTw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4sIDM+LCAyPiogX2FpZGxfcmV0dXJuKSA9IDA7CisgICAgdmlydHVhbCA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdDJkUGFyY2VsYWJsZXMoY29uc3Qgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZSwgMz4sIDI+JiBpbnB1dCwgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZSwgMz4sIDI+KiByZXBlYXRlZCwgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZSwgMz4sIDI+KiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgfTsgIC8vIGNsYXNzIElSZXBlYXRGaXhlZFNpemVBcnJheQorCisgIGNsYXNzIElSZXBlYXRGaXhlZFNpemVBcnJheURlZmF1bHQgOiBwdWJsaWMgSVJlcGVhdEZpeGVkU2l6ZUFycmF5IHsKKyAgcHVibGljOgorICAgIDo6YW5kcm9pZDo6SUJpbmRlciogb25Bc0JpbmRlcigpIG92ZXJyaWRlIHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdEJ5dGVzKGNvbnN0IHN0ZDo6YXJyYXk8dWludDhfdCwgMz4mIC8qaW5wdXQqLywgc3RkOjphcnJheTx1aW50OF90LCAzPiogLypyZXBlYXRlZCovLCBzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+KiAvKl9haWRsX3JldHVybiovKSBvdmVycmlkZSB7CisgICAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTsKKyAgICB9CisgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXRJbnRzKGNvbnN0IHN0ZDo6YXJyYXk8aW50MzJfdCwgMz4mIC8qaW5wdXQqLywgc3RkOjphcnJheTxpbnQzMl90LCAzPiogLypyZXBlYXRlZCovLCBzdGQ6OmFycmF5PGludDMyX3QsIDM+KiAvKl9haWRsX3JldHVybiovKSBvdmVycmlkZSB7CisgICAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTsKKyAgICB9CisgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXRCaW5kZXJzKGNvbnN0IHN0ZDo6YXJyYXk8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+LCAzPiYgLyppbnB1dCovLCBzdGQ6OmFycmF5PDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiwgMz4qIC8qcmVwZWF0ZWQqLywgc3RkOjphcnJheTw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4sIDM+KiAvKl9haWRsX3JldHVybiovKSBvdmVycmlkZSB7CisgICAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTsKKyAgICB9CisgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXRQYXJjZWxhYmxlcyhjb25zdCBzdGQ6OmFycmF5PDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZSwgMz4mIC8qaW5wdXQqLywgc3RkOjphcnJheTw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludFBhcmNlbGFibGUsIDM+KiAvKnJlcGVhdGVkKi8sIHN0ZDo6YXJyYXk8OjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlLCAzPiogLypfYWlkbF9yZXR1cm4qLykgb3ZlcnJpZGUgeworICAgICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTik7CisgICAgfQorICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0MmRCeXRlcyhjb25zdCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8dWludDhfdCwgMz4sIDI+JiAvKmlucHV0Ki8sIHN0ZDo6YXJyYXk8c3RkOjphcnJheTx1aW50OF90LCAzPiwgMj4qIC8qcmVwZWF0ZWQqLywgc3RkOjphcnJheTxzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+LCAyPiogLypfYWlkbF9yZXR1cm4qLykgb3ZlcnJpZGUgeworICAgICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTik7CisgICAgfQorICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0MmRJbnRzKGNvbnN0IHN0ZDo6YXJyYXk8c3RkOjphcnJheTxpbnQzMl90LCAzPiwgMj4mIC8qaW5wdXQqLywgc3RkOjphcnJheTxzdGQ6OmFycmF5PGludDMyX3QsIDM+LCAyPiogLypyZXBlYXRlZCovLCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8aW50MzJfdCwgMz4sIDI+KiAvKl9haWRsX3JldHVybiovKSBvdmVycmlkZSB7CisgICAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTsKKyAgICB9CisgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXQyZEJpbmRlcnMoY29uc3Qgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiwgMz4sIDI+JiAvKmlucHV0Ki8sIHN0ZDo6YXJyYXk8c3RkOjphcnJheTw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4sIDM+LCAyPiogLypyZXBlYXRlZCovLCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+LCAzPiwgMj4qIC8qX2FpZGxfcmV0dXJuKi8pIG92ZXJyaWRlIHsKKyAgICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOworICAgIH0KKyAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdDJkUGFyY2VsYWJsZXMoY29uc3Qgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZSwgMz4sIDI+JiAvKmlucHV0Ki8sIHN0ZDo6YXJyYXk8c3RkOjphcnJheTw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludFBhcmNlbGFibGUsIDM+LCAyPiogLypyZXBlYXRlZCovLCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlLCAzPiwgMj4qIC8qX2FpZGxfcmV0dXJuKi8pIG92ZXJyaWRlIHsKKyAgICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOworICAgIH0KKyAgfTsgIC8vIGNsYXNzIElSZXBlYXRGaXhlZFNpemVBcnJheURlZmF1bHQKKyAgY2xhc3MgQnBSZXBlYXRGaXhlZFNpemVBcnJheSA6IHB1YmxpYyA6OmFuZHJvaWQ6OkJwSW50ZXJmYWNlPElSZXBlYXRGaXhlZFNpemVBcnJheT4geworICBwdWJsaWM6CisgICAgZXhwbGljaXQgQnBSZXBlYXRGaXhlZFNpemVBcnJheShjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4mIF9haWRsX2ltcGwpOworICAgIHZpcnR1YWwgfkJwUmVwZWF0Rml4ZWRTaXplQXJyYXkoKSA9IGRlZmF1bHQ7CisgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXRCeXRlcyhjb25zdCBzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+JiBpbnB1dCwgc3RkOjphcnJheTx1aW50OF90LCAzPiogcmVwZWF0ZWQsIHN0ZDo6YXJyYXk8dWludDhfdCwgMz4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXRJbnRzKGNvbnN0IHN0ZDo6YXJyYXk8aW50MzJfdCwgMz4mIGlucHV0LCBzdGQ6OmFycmF5PGludDMyX3QsIDM+KiByZXBlYXRlZCwgc3RkOjphcnJheTxpbnQzMl90LCAzPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdEJpbmRlcnMoY29uc3Qgc3RkOjphcnJheTw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4sIDM+JiBpbnB1dCwgc3RkOjphcnJheTw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4sIDM+KiByZXBlYXRlZCwgc3RkOjphcnJheTw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4sIDM+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0UGFyY2VsYWJsZXMoY29uc3Qgc3RkOjphcnJheTw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludFBhcmNlbGFibGUsIDM+JiBpbnB1dCwgc3RkOjphcnJheTw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludFBhcmNlbGFibGUsIDM+KiByZXBlYXRlZCwgc3RkOjphcnJheTw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludFBhcmNlbGFibGUsIDM+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0MmRCeXRlcyhjb25zdCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8dWludDhfdCwgMz4sIDI+JiBpbnB1dCwgc3RkOjphcnJheTxzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+LCAyPiogcmVwZWF0ZWQsIHN0ZDo6YXJyYXk8c3RkOjphcnJheTx1aW50OF90LCAzPiwgMj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXQyZEludHMoY29uc3Qgc3RkOjphcnJheTxzdGQ6OmFycmF5PGludDMyX3QsIDM+LCAyPiYgaW5wdXQsIHN0ZDo6YXJyYXk8c3RkOjphcnJheTxpbnQzMl90LCAzPiwgMj4qIHJlcGVhdGVkLCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8aW50MzJfdCwgMz4sIDI+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0MmRCaW5kZXJzKGNvbnN0IHN0ZDo6YXJyYXk8c3RkOjphcnJheTw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4sIDM+LCAyPiYgaW5wdXQsIHN0ZDo6YXJyYXk8c3RkOjphcnJheTw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4sIDM+LCAyPiogcmVwZWF0ZWQsIHN0ZDo6YXJyYXk8c3RkOjphcnJheTw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4sIDM+LCAyPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdDJkUGFyY2VsYWJsZXMoY29uc3Qgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZSwgMz4sIDI+JiBpbnB1dCwgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZSwgMz4sIDI+KiByZXBlYXRlZCwgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZSwgMz4sIDI+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICB9OyAgLy8gY2xhc3MgQnBSZXBlYXRGaXhlZFNpemVBcnJheQorICBjbGFzcyBCblJlcGVhdEZpeGVkU2l6ZUFycmF5IDogcHVibGljIDo6YW5kcm9pZDo6Qm5JbnRlcmZhY2U8SVJlcGVhdEZpeGVkU2l6ZUFycmF5PiB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdEJ5dGVzID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMDsKKyAgICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdEludHMgPSA6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAxOworICAgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0QmluZGVycyA9IDo6YW5kcm9pZDo6SUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDI7CisgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXBlYXRQYXJjZWxhYmxlcyA9IDo6YW5kcm9pZDo6SUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDM7CisgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXBlYXQyZEJ5dGVzID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDsKKyAgICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdDJkSW50cyA9IDo6YW5kcm9pZDo6SUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDU7CisgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXBlYXQyZEJpbmRlcnMgPSA6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA2OworICAgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0MmRQYXJjZWxhYmxlcyA9IDo6YW5kcm9pZDo6SUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDc7CisgICAgZXhwbGljaXQgQm5SZXBlYXRGaXhlZFNpemVBcnJheSgpOworICAgIDo6YW5kcm9pZDo6c3RhdHVzX3Qgb25UcmFuc2FjdCh1aW50MzJfdCBfYWlkbF9jb2RlLCBjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCYgX2FpZGxfZGF0YSwgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3JlcGx5LCB1aW50MzJfdCBfYWlkbF9mbGFncykgb3ZlcnJpZGU7CisgIH07ICAvLyBjbGFzcyBCblJlcGVhdEZpeGVkU2l6ZUFycmF5CisKKyAgY2xhc3MgSVJlcGVhdEZpeGVkU2l6ZUFycmF5RGVsZWdhdG9yIDogcHVibGljIEJuUmVwZWF0Rml4ZWRTaXplQXJyYXkgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQgSVJlcGVhdEZpeGVkU2l6ZUFycmF5RGVsZWdhdG9yKDo6YW5kcm9pZDo6c3A8SVJlcGVhdEZpeGVkU2l6ZUFycmF5PiAmaW1wbCkgOiBfYWlkbF9kZWxlZ2F0ZShpbXBsKSB7fQorCisgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXRCeXRlcyhjb25zdCBzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+JiBpbnB1dCwgc3RkOjphcnJheTx1aW50OF90LCAzPiogcmVwZWF0ZWQsIHN0ZDo6YXJyYXk8dWludDhfdCwgMz4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgICAgcmV0dXJuIF9haWRsX2RlbGVnYXRlLT5SZXBlYXRCeXRlcyhpbnB1dCwgcmVwZWF0ZWQsIF9haWRsX3JldHVybik7CisgICAgfQorICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0SW50cyhjb25zdCBzdGQ6OmFycmF5PGludDMyX3QsIDM+JiBpbnB1dCwgc3RkOjphcnJheTxpbnQzMl90LCAzPiogcmVwZWF0ZWQsIHN0ZDo6YXJyYXk8aW50MzJfdCwgMz4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgICAgcmV0dXJuIF9haWRsX2RlbGVnYXRlLT5SZXBlYXRJbnRzKGlucHV0LCByZXBlYXRlZCwgX2FpZGxfcmV0dXJuKTsKKyAgICB9CisgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXRCaW5kZXJzKGNvbnN0IHN0ZDo6YXJyYXk8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+LCAzPiYgaW5wdXQsIHN0ZDo6YXJyYXk8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+LCAzPiogcmVwZWF0ZWQsIHN0ZDo6YXJyYXk8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+LCAzPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPlJlcGVhdEJpbmRlcnMoaW5wdXQsIHJlcGVhdGVkLCBfYWlkbF9yZXR1cm4pOworICAgIH0KKyAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdFBhcmNlbGFibGVzKGNvbnN0IHN0ZDo6YXJyYXk8OjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlLCAzPiYgaW5wdXQsIHN0ZDo6YXJyYXk8OjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlLCAzPiogcmVwZWF0ZWQsIHN0ZDo6YXJyYXk8OjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlLCAzPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPlJlcGVhdFBhcmNlbGFibGVzKGlucHV0LCByZXBlYXRlZCwgX2FpZGxfcmV0dXJuKTsKKyAgICB9CisgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXQyZEJ5dGVzKGNvbnN0IHN0ZDo6YXJyYXk8c3RkOjphcnJheTx1aW50OF90LCAzPiwgMj4mIGlucHV0LCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8dWludDhfdCwgMz4sIDI+KiByZXBlYXRlZCwgc3RkOjphcnJheTxzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+LCAyPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPlJlcGVhdDJkQnl0ZXMoaW5wdXQsIHJlcGVhdGVkLCBfYWlkbF9yZXR1cm4pOworICAgIH0KKyAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdDJkSW50cyhjb25zdCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8aW50MzJfdCwgMz4sIDI+JiBpbnB1dCwgc3RkOjphcnJheTxzdGQ6OmFycmF5PGludDMyX3QsIDM+LCAyPiogcmVwZWF0ZWQsIHN0ZDo6YXJyYXk8c3RkOjphcnJheTxpbnQzMl90LCAzPiwgMj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgICAgcmV0dXJuIF9haWRsX2RlbGVnYXRlLT5SZXBlYXQyZEludHMoaW5wdXQsIHJlcGVhdGVkLCBfYWlkbF9yZXR1cm4pOworICAgIH0KKyAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdDJkQmluZGVycyhjb25zdCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+LCAzPiwgMj4mIGlucHV0LCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+LCAzPiwgMj4qIHJlcGVhdGVkLCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+LCAzPiwgMj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgICAgcmV0dXJuIF9haWRsX2RlbGVnYXRlLT5SZXBlYXQyZEJpbmRlcnMoaW5wdXQsIHJlcGVhdGVkLCBfYWlkbF9yZXR1cm4pOworICAgIH0KKyAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdDJkUGFyY2VsYWJsZXMoY29uc3Qgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZSwgMz4sIDI+JiBpbnB1dCwgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZSwgMz4sIDI+KiByZXBlYXRlZCwgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZSwgMz4sIDI+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+UmVwZWF0MmRQYXJjZWxhYmxlcyhpbnB1dCwgcmVwZWF0ZWQsIF9haWRsX3JldHVybik7CisgICAgfQorICBwcml2YXRlOgorICAgIDo6YW5kcm9pZDo6c3A8SVJlcGVhdEZpeGVkU2l6ZUFycmF5PiBfYWlkbF9kZWxlZ2F0ZTsKKyAgfTsgIC8vIGNsYXNzIElSZXBlYXRGaXhlZFNpemVBcnJheURlbGVnYXRvcgorICBlbnVtIGNsYXNzIEJ5dGVFbnVtIDogaW50OF90IHsKKyAgICBBID0gMCwKKyAgfTsKKyAgZW51bSBjbGFzcyBJbnRFbnVtIDogaW50MzJfdCB7CisgICAgQSA9IDAsCisgIH07CisgIGVudW0gY2xhc3MgTG9uZ0VudW0gOiBpbnQ2NF90IHsKKyAgICBBID0gMEwsCisgIH07CisgIGNsYXNzIElFbXB0eUludGVyZmFjZSA6IHB1YmxpYyA6OmFuZHJvaWQ6OklJbnRlcmZhY2UgeworICBwdWJsaWM6CisgICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShFbXB0eUludGVyZmFjZSkKKyAgfTsgIC8vIGNsYXNzIElFbXB0eUludGVyZmFjZQorCisgIGNsYXNzIElFbXB0eUludGVyZmFjZURlZmF1bHQgOiBwdWJsaWMgSUVtcHR5SW50ZXJmYWNlIHsKKyAgcHVibGljOgorICAgIDo6YW5kcm9pZDo6SUJpbmRlciogb25Bc0JpbmRlcigpIG92ZXJyaWRlIHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgfTsgIC8vIGNsYXNzIElFbXB0eUludGVyZmFjZURlZmF1bHQKKyAgY2xhc3MgQnBFbXB0eUludGVyZmFjZSA6IHB1YmxpYyA6OmFuZHJvaWQ6OkJwSW50ZXJmYWNlPElFbXB0eUludGVyZmFjZT4geworICBwdWJsaWM6CisgICAgZXhwbGljaXQgQnBFbXB0eUludGVyZmFjZShjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4mIF9haWRsX2ltcGwpOworICAgIHZpcnR1YWwgfkJwRW1wdHlJbnRlcmZhY2UoKSA9IGRlZmF1bHQ7CisgIH07ICAvLyBjbGFzcyBCcEVtcHR5SW50ZXJmYWNlCisgIGNsYXNzIEJuRW1wdHlJbnRlcmZhY2UgOiBwdWJsaWMgOjphbmRyb2lkOjpCbkludGVyZmFjZTxJRW1wdHlJbnRlcmZhY2U+IHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IEJuRW1wdHlJbnRlcmZhY2UoKTsKKyAgICA6OmFuZHJvaWQ6OnN0YXR1c190IG9uVHJhbnNhY3QodWludDMyX3QgX2FpZGxfY29kZSwgY29uc3QgOjphbmRyb2lkOjpQYXJjZWwmIF9haWRsX2RhdGEsIDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9yZXBseSwgdWludDMyX3QgX2FpZGxfZmxhZ3MpIG92ZXJyaWRlOworICB9OyAgLy8gY2xhc3MgQm5FbXB0eUludGVyZmFjZQorCisgIGNsYXNzIElFbXB0eUludGVyZmFjZURlbGVnYXRvciA6IHB1YmxpYyBCbkVtcHR5SW50ZXJmYWNlIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IElFbXB0eUludGVyZmFjZURlbGVnYXRvcig6OmFuZHJvaWQ6OnNwPElFbXB0eUludGVyZmFjZT4gJmltcGwpIDogX2FpZGxfZGVsZWdhdGUoaW1wbCkge30KKworICBwcml2YXRlOgorICAgIDo6YW5kcm9pZDo6c3A8SUVtcHR5SW50ZXJmYWNlPiBfYWlkbF9kZWxlZ2F0ZTsKKyAgfTsgIC8vIGNsYXNzIElFbXB0eUludGVyZmFjZURlbGVnYXRvcgorICBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8aW50MzJfdCwgMz4sIDI+IGludDJ4MyA9IHt7e3sxLCAyLCAzfX0sIHt7NCwgNSwgNn19fX07CisgIHN0ZDo6YXJyYXk8Ym9vbCwgMj4gYm9vbEFycmF5ID0ge3t9fTsKKyAgc3RkOjphcnJheTx1aW50OF90LCAyPiBieXRlQXJyYXkgPSB7e319OworICBzdGQ6OmFycmF5PGNoYXIxNl90LCAyPiBjaGFyQXJyYXkgPSB7e319OworICBzdGQ6OmFycmF5PGludDMyX3QsIDI+IGludEFycmF5ID0ge3t9fTsKKyAgc3RkOjphcnJheTxpbnQ2NF90LCAyPiBsb25nQXJyYXkgPSB7e319OworICBzdGQ6OmFycmF5PGZsb2F0LCAyPiBmbG9hdEFycmF5ID0ge3t9fTsKKyAgc3RkOjphcnJheTxkb3VibGUsIDI+IGRvdWJsZUFycmF5ID0ge3t9fTsKKyAgc3RkOjphcnJheTw6OnN0ZDo6c3RyaW5nLCAyPiBzdHJpbmdBcnJheSA9IHt7ImhlbGxvIiwgIndvcmxkIn19OworICBzdGQ6OmFycmF5PDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6Qnl0ZUVudW0sIDI+IGJ5dGVFbnVtQXJyYXkgPSB7e319OworICBzdGQ6OmFycmF5PDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50RW51bSwgMj4gaW50RW51bUFycmF5ID0ge3t9fTsKKyAgc3RkOjphcnJheTw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkxvbmdFbnVtLCAyPiBsb25nRW51bUFycmF5ID0ge3t9fTsKKyAgc3RkOjphcnJheTw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludFBhcmNlbGFibGUsIDI+IHBhcmNlbGFibGVBcnJheSA9IHt7fX07CisgIHN0ZDo6YXJyYXk8c3RkOjphcnJheTxib29sLCAyPiwgMj4gYm9vbE1hdHJpeCA9IHt7fX07CisgIHN0ZDo6YXJyYXk8c3RkOjphcnJheTx1aW50OF90LCAyPiwgMj4gYnl0ZU1hdHJpeCA9IHt7fX07CisgIHN0ZDo6YXJyYXk8c3RkOjphcnJheTxjaGFyMTZfdCwgMj4sIDI+IGNoYXJNYXRyaXggPSB7e319OworICBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8aW50MzJfdCwgMj4sIDI+IGludE1hdHJpeCA9IHt7fX07CisgIHN0ZDo6YXJyYXk8c3RkOjphcnJheTxpbnQ2NF90LCAyPiwgMj4gbG9uZ01hdHJpeCA9IHt7fX07CisgIHN0ZDo6YXJyYXk8c3RkOjphcnJheTxmbG9hdCwgMj4sIDI+IGZsb2F0TWF0cml4ID0ge3t9fTsKKyAgc3RkOjphcnJheTxzdGQ6OmFycmF5PGRvdWJsZSwgMj4sIDI+IGRvdWJsZU1hdHJpeCA9IHt7fX07CisgIHN0ZDo6YXJyYXk8c3RkOjphcnJheTw6OnN0ZDo6c3RyaW5nLCAyPiwgMj4gc3RyaW5nTWF0cml4ID0ge3t7eyJoZWxsbyIsICJ3b3JsZCJ9fSwge3siQ2lhbyIsICJtb25kbyJ9fX19OworICBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpCeXRlRW51bSwgMj4sIDI+IGJ5dGVFbnVtTWF0cml4ID0ge3t9fTsKKyAgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50RW51bSwgMj4sIDI+IGludEVudW1NYXRyaXggPSB7e319OworICBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpMb25nRW51bSwgMj4sIDI+IGxvbmdFbnVtTWF0cml4ID0ge3t9fTsKKyAgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZSwgMj4sIDI+IHBhcmNlbGFibGVNYXRyaXggPSB7e319OworICA6OnN0ZDo6b3B0aW9uYWw8c3RkOjphcnJheTxib29sLCAyPj4gYm9vbE51bGxhYmxlQXJyYXk7CisgIDo6c3RkOjpvcHRpb25hbDxzdGQ6OmFycmF5PHVpbnQ4X3QsIDI+PiBieXRlTnVsbGFibGVBcnJheTsKKyAgOjpzdGQ6Om9wdGlvbmFsPHN0ZDo6YXJyYXk8Y2hhcjE2X3QsIDI+PiBjaGFyTnVsbGFibGVBcnJheTsKKyAgOjpzdGQ6Om9wdGlvbmFsPHN0ZDo6YXJyYXk8aW50MzJfdCwgMj4+IGludE51bGxhYmxlQXJyYXk7CisgIDo6c3RkOjpvcHRpb25hbDxzdGQ6OmFycmF5PGludDY0X3QsIDI+PiBsb25nTnVsbGFibGVBcnJheTsKKyAgOjpzdGQ6Om9wdGlvbmFsPHN0ZDo6YXJyYXk8ZmxvYXQsIDI+PiBmbG9hdE51bGxhYmxlQXJyYXk7CisgIDo6c3RkOjpvcHRpb25hbDxzdGQ6OmFycmF5PGRvdWJsZSwgMj4+IGRvdWJsZU51bGxhYmxlQXJyYXk7CisgIDo6c3RkOjpvcHRpb25hbDxzdGQ6OmFycmF5PDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6c3RyaW5nPiwgMj4+IHN0cmluZ051bGxhYmxlQXJyYXkgPSB7e3siaGVsbG8iLCAid29ybGQifX19OworICA6OnN0ZDo6b3B0aW9uYWw8c3RkOjphcnJheTw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkJ5dGVFbnVtLCAyPj4gYnl0ZUVudW1OdWxsYWJsZUFycmF5OworICA6OnN0ZDo6b3B0aW9uYWw8c3RkOjphcnJheTw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludEVudW0sIDI+PiBpbnRFbnVtTnVsbGFibGVBcnJheTsKKyAgOjpzdGQ6Om9wdGlvbmFsPHN0ZDo6YXJyYXk8OjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpMb25nRW51bSwgMj4+IGxvbmdFbnVtTnVsbGFibGVBcnJheTsKKyAgOjpzdGQ6Om9wdGlvbmFsPHN0ZDo6YXJyYXk8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+LCAyPj4gYmluZGVyTnVsbGFibGVBcnJheTsKKyAgOjpzdGQ6Om9wdGlvbmFsPHN0ZDo6YXJyYXk8OjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6b3M6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPiwgMj4+IHBmZE51bGxhYmxlQXJyYXk7CisgIDo6c3RkOjpvcHRpb25hbDxzdGQ6OmFycmF5PDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludFBhcmNlbGFibGU+LCAyPj4gcGFyY2VsYWJsZU51bGxhYmxlQXJyYXk7CisgIDo6c3RkOjpvcHRpb25hbDxzdGQ6OmFycmF5PDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJRW1wdHlJbnRlcmZhY2U+LCAyPj4gaW50ZXJmYWNlTnVsbGFibGVBcnJheTsKKyAgOjpzdGQ6Om9wdGlvbmFsPHN0ZDo6YXJyYXk8c3RkOjphcnJheTxib29sLCAyPiwgMj4+IGJvb2xOdWxsYWJsZU1hdHJpeDsKKyAgOjpzdGQ6Om9wdGlvbmFsPHN0ZDo6YXJyYXk8c3RkOjphcnJheTx1aW50OF90LCAyPiwgMj4+IGJ5dGVOdWxsYWJsZU1hdHJpeDsKKyAgOjpzdGQ6Om9wdGlvbmFsPHN0ZDo6YXJyYXk8c3RkOjphcnJheTxjaGFyMTZfdCwgMj4sIDI+PiBjaGFyTnVsbGFibGVNYXRyaXg7CisgIDo6c3RkOjpvcHRpb25hbDxzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8aW50MzJfdCwgMj4sIDI+PiBpbnROdWxsYWJsZU1hdHJpeDsKKyAgOjpzdGQ6Om9wdGlvbmFsPHN0ZDo6YXJyYXk8c3RkOjphcnJheTxpbnQ2NF90LCAyPiwgMj4+IGxvbmdOdWxsYWJsZU1hdHJpeDsKKyAgOjpzdGQ6Om9wdGlvbmFsPHN0ZDo6YXJyYXk8c3RkOjphcnJheTxmbG9hdCwgMj4sIDI+PiBmbG9hdE51bGxhYmxlTWF0cml4OworICA6OnN0ZDo6b3B0aW9uYWw8c3RkOjphcnJheTxzdGQ6OmFycmF5PGRvdWJsZSwgMj4sIDI+PiBkb3VibGVOdWxsYWJsZU1hdHJpeDsKKyAgOjpzdGQ6Om9wdGlvbmFsPHN0ZDo6YXJyYXk8c3RkOjphcnJheTw6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnN0cmluZz4sIDI+LCAyPj4gc3RyaW5nTnVsbGFibGVNYXRyaXggPSB7e3t7eyJoZWxsbyIsICJ3b3JsZCJ9fSwge3siQ2lhbyIsICJtb25kbyJ9fX19fTsKKyAgOjpzdGQ6Om9wdGlvbmFsPHN0ZDo6YXJyYXk8c3RkOjphcnJheTw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkJ5dGVFbnVtLCAyPiwgMj4+IGJ5dGVFbnVtTnVsbGFibGVNYXRyaXg7CisgIDo6c3RkOjpvcHRpb25hbDxzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRFbnVtLCAyPiwgMj4+IGludEVudW1OdWxsYWJsZU1hdHJpeDsKKyAgOjpzdGQ6Om9wdGlvbmFsPHN0ZDo6YXJyYXk8c3RkOjphcnJheTw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkxvbmdFbnVtLCAyPiwgMj4+IGxvbmdFbnVtTnVsbGFibGVNYXRyaXg7CisgIDo6c3RkOjpvcHRpb25hbDxzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+LCAyPiwgMj4+IGJpbmRlck51bGxhYmxlTWF0cml4OworICA6OnN0ZDo6b3B0aW9uYWw8c3RkOjphcnJheTxzdGQ6OmFycmF5PDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6Om9zOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj4sIDI+LCAyPj4gcGZkTnVsbGFibGVNYXRyaXg7CisgIDo6c3RkOjpvcHRpb25hbDxzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZT4sIDI+LCAyPj4gcGFyY2VsYWJsZU51bGxhYmxlTWF0cml4OworICA6OnN0ZDo6b3B0aW9uYWw8c3RkOjphcnJheTxzdGQ6OmFycmF5PDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJRW1wdHlJbnRlcmZhY2U+LCAyPiwgMj4+IGludGVyZmFjZU51bGxhYmxlTWF0cml4OworICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEZpeGVkU2l6ZUFycmF5RXhhbXBsZSYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKGludDJ4MywgYm9vbEFycmF5LCBieXRlQXJyYXksIGNoYXJBcnJheSwgaW50QXJyYXksIGxvbmdBcnJheSwgZmxvYXRBcnJheSwgZG91YmxlQXJyYXksIHN0cmluZ0FycmF5LCBieXRlRW51bUFycmF5LCBpbnRFbnVtQXJyYXksIGxvbmdFbnVtQXJyYXksIHBhcmNlbGFibGVBcnJheSwgYm9vbE1hdHJpeCwgYnl0ZU1hdHJpeCwgY2hhck1hdHJpeCwgaW50TWF0cml4LCBsb25nTWF0cml4LCBmbG9hdE1hdHJpeCwgZG91YmxlTWF0cml4LCBzdHJpbmdNYXRyaXgsIGJ5dGVFbnVtTWF0cml4LCBpbnRFbnVtTWF0cml4LCBsb25nRW51bU1hdHJpeCwgcGFyY2VsYWJsZU1hdHJpeCwgYm9vbE51bGxhYmxlQXJyYXksIGJ5dGVOdWxsYWJsZUFycmF5LCBjaGFyTnVsbGFibGVBcnJheSwgaW50TnVsbGFibGVBcnJheSwgbG9uZ051bGxhYmxlQXJyYXksIGZsb2F0TnVsbGFibGVBcnJheSwgZG91YmxlTnVsbGFibGVBcnJheSwgc3RyaW5nTnVsbGFibGVBcnJheSwgYnl0ZUVudW1OdWxsYWJsZUFycmF5LCBpbnRFbnVtTnVsbGFibGVBcnJheSwgbG9uZ0VudW1OdWxsYWJsZUFycmF5LCBiaW5kZXJOdWxsYWJsZUFycmF5LCBwZmROdWxsYWJsZUFycmF5LCBwYXJjZWxhYmxlTnVsbGFibGVBcnJheSwgaW50ZXJmYWNlTnVsbGFibGVBcnJheSwgYm9vbE51bGxhYmxlTWF0cml4LCBieXRlTnVsbGFibGVNYXRyaXgsIGNoYXJOdWxsYWJsZU1hdHJpeCwgaW50TnVsbGFibGVNYXRyaXgsIGxvbmdOdWxsYWJsZU1hdHJpeCwgZmxvYXROdWxsYWJsZU1hdHJpeCwgZG91YmxlTnVsbGFibGVNYXRyaXgsIHN0cmluZ051bGxhYmxlTWF0cml4LCBieXRlRW51bU51bGxhYmxlTWF0cml4LCBpbnRFbnVtTnVsbGFibGVNYXRyaXgsIGxvbmdFbnVtTnVsbGFibGVNYXRyaXgsIGJpbmRlck51bGxhYmxlTWF0cml4LCBwZmROdWxsYWJsZU1hdHJpeCwgcGFyY2VsYWJsZU51bGxhYmxlTWF0cml4LCBpbnRlcmZhY2VOdWxsYWJsZU1hdHJpeCkgIT0gc3RkOjp0aWUocmhzLmludDJ4MywgcmhzLmJvb2xBcnJheSwgcmhzLmJ5dGVBcnJheSwgcmhzLmNoYXJBcnJheSwgcmhzLmludEFycmF5LCByaHMubG9uZ0FycmF5LCByaHMuZmxvYXRBcnJheSwgcmhzLmRvdWJsZUFycmF5LCByaHMuc3RyaW5nQXJyYXksIHJocy5ieXRlRW51bUFycmF5LCByaHMuaW50RW51bUFycmF5LCByaHMubG9uZ0VudW1BcnJheSwgcmhzLnBhcmNlbGFibGVBcnJheSwgcmhzLmJvb2xNYXRyaXgsIHJocy5ieXRlTWF0cml4LCByaHMuY2hhck1hdHJpeCwgcmhzLmludE1hdHJpeCwgcmhzLmxvbmdNYXRyaXgsIHJocy5mbG9hdE1hdHJpeCwgcmhzLmRvdWJsZU1hdHJpeCwgcmhzLnN0cmluZ01hdHJpeCwgcmhzLmJ5dGVFbnVtTWF0cml4LCByaHMuaW50RW51bU1hdHJpeCwgcmhzLmxvbmdFbnVtTWF0cml4LCByaHMucGFyY2VsYWJsZU1hdHJpeCwgcmhzLmJvb2xOdWxsYWJsZUFycmF5LCByaHMuYnl0ZU51bGxhYmxlQXJyYXksIHJocy5jaGFyTnVsbGFibGVBcnJheSwgcmhzLmludE51bGxhYmxlQXJyYXksIHJocy5sb25nTnVsbGFibGVBcnJheSwgcmhzLmZsb2F0TnVsbGFibGVBcnJheSwgcmhzLmRvdWJsZU51bGxhYmxlQXJyYXksIHJocy5zdHJpbmdOdWxsYWJsZUFycmF5LCByaHMuYnl0ZUVudW1OdWxsYWJsZUFycmF5LCByaHMuaW50RW51bU51bGxhYmxlQXJyYXksIHJocy5sb25nRW51bU51bGxhYmxlQXJyYXksIHJocy5iaW5kZXJOdWxsYWJsZUFycmF5LCByaHMucGZkTnVsbGFibGVBcnJheSwgcmhzLnBhcmNlbGFibGVOdWxsYWJsZUFycmF5LCByaHMuaW50ZXJmYWNlTnVsbGFibGVBcnJheSwgcmhzLmJvb2xOdWxsYWJsZU1hdHJpeCwgcmhzLmJ5dGVOdWxsYWJsZU1hdHJpeCwgcmhzLmNoYXJOdWxsYWJsZU1hdHJpeCwgcmhzLmludE51bGxhYmxlTWF0cml4LCByaHMubG9uZ051bGxhYmxlTWF0cml4LCByaHMuZmxvYXROdWxsYWJsZU1hdHJpeCwgcmhzLmRvdWJsZU51bGxhYmxlTWF0cml4LCByaHMuc3RyaW5nTnVsbGFibGVNYXRyaXgsIHJocy5ieXRlRW51bU51bGxhYmxlTWF0cml4LCByaHMuaW50RW51bU51bGxhYmxlTWF0cml4LCByaHMubG9uZ0VudW1OdWxsYWJsZU1hdHJpeCwgcmhzLmJpbmRlck51bGxhYmxlTWF0cml4LCByaHMucGZkTnVsbGFibGVNYXRyaXgsIHJocy5wYXJjZWxhYmxlTnVsbGFibGVNYXRyaXgsIHJocy5pbnRlcmZhY2VOdWxsYWJsZU1hdHJpeCk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEZpeGVkU2l6ZUFycmF5RXhhbXBsZSYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKGludDJ4MywgYm9vbEFycmF5LCBieXRlQXJyYXksIGNoYXJBcnJheSwgaW50QXJyYXksIGxvbmdBcnJheSwgZmxvYXRBcnJheSwgZG91YmxlQXJyYXksIHN0cmluZ0FycmF5LCBieXRlRW51bUFycmF5LCBpbnRFbnVtQXJyYXksIGxvbmdFbnVtQXJyYXksIHBhcmNlbGFibGVBcnJheSwgYm9vbE1hdHJpeCwgYnl0ZU1hdHJpeCwgY2hhck1hdHJpeCwgaW50TWF0cml4LCBsb25nTWF0cml4LCBmbG9hdE1hdHJpeCwgZG91YmxlTWF0cml4LCBzdHJpbmdNYXRyaXgsIGJ5dGVFbnVtTWF0cml4LCBpbnRFbnVtTWF0cml4LCBsb25nRW51bU1hdHJpeCwgcGFyY2VsYWJsZU1hdHJpeCwgYm9vbE51bGxhYmxlQXJyYXksIGJ5dGVOdWxsYWJsZUFycmF5LCBjaGFyTnVsbGFibGVBcnJheSwgaW50TnVsbGFibGVBcnJheSwgbG9uZ051bGxhYmxlQXJyYXksIGZsb2F0TnVsbGFibGVBcnJheSwgZG91YmxlTnVsbGFibGVBcnJheSwgc3RyaW5nTnVsbGFibGVBcnJheSwgYnl0ZUVudW1OdWxsYWJsZUFycmF5LCBpbnRFbnVtTnVsbGFibGVBcnJheSwgbG9uZ0VudW1OdWxsYWJsZUFycmF5LCBiaW5kZXJOdWxsYWJsZUFycmF5LCBwZmROdWxsYWJsZUFycmF5LCBwYXJjZWxhYmxlTnVsbGFibGVBcnJheSwgaW50ZXJmYWNlTnVsbGFibGVBcnJheSwgYm9vbE51bGxhYmxlTWF0cml4LCBieXRlTnVsbGFibGVNYXRyaXgsIGNoYXJOdWxsYWJsZU1hdHJpeCwgaW50TnVsbGFibGVNYXRyaXgsIGxvbmdOdWxsYWJsZU1hdHJpeCwgZmxvYXROdWxsYWJsZU1hdHJpeCwgZG91YmxlTnVsbGFibGVNYXRyaXgsIHN0cmluZ051bGxhYmxlTWF0cml4LCBieXRlRW51bU51bGxhYmxlTWF0cml4LCBpbnRFbnVtTnVsbGFibGVNYXRyaXgsIGxvbmdFbnVtTnVsbGFibGVNYXRyaXgsIGJpbmRlck51bGxhYmxlTWF0cml4LCBwZmROdWxsYWJsZU1hdHJpeCwgcGFyY2VsYWJsZU51bGxhYmxlTWF0cml4LCBpbnRlcmZhY2VOdWxsYWJsZU1hdHJpeCkgPCBzdGQ6OnRpZShyaHMuaW50MngzLCByaHMuYm9vbEFycmF5LCByaHMuYnl0ZUFycmF5LCByaHMuY2hhckFycmF5LCByaHMuaW50QXJyYXksIHJocy5sb25nQXJyYXksIHJocy5mbG9hdEFycmF5LCByaHMuZG91YmxlQXJyYXksIHJocy5zdHJpbmdBcnJheSwgcmhzLmJ5dGVFbnVtQXJyYXksIHJocy5pbnRFbnVtQXJyYXksIHJocy5sb25nRW51bUFycmF5LCByaHMucGFyY2VsYWJsZUFycmF5LCByaHMuYm9vbE1hdHJpeCwgcmhzLmJ5dGVNYXRyaXgsIHJocy5jaGFyTWF0cml4LCByaHMuaW50TWF0cml4LCByaHMubG9uZ01hdHJpeCwgcmhzLmZsb2F0TWF0cml4LCByaHMuZG91YmxlTWF0cml4LCByaHMuc3RyaW5nTWF0cml4LCByaHMuYnl0ZUVudW1NYXRyaXgsIHJocy5pbnRFbnVtTWF0cml4LCByaHMubG9uZ0VudW1NYXRyaXgsIHJocy5wYXJjZWxhYmxlTWF0cml4LCByaHMuYm9vbE51bGxhYmxlQXJyYXksIHJocy5ieXRlTnVsbGFibGVBcnJheSwgcmhzLmNoYXJOdWxsYWJsZUFycmF5LCByaHMuaW50TnVsbGFibGVBcnJheSwgcmhzLmxvbmdOdWxsYWJsZUFycmF5LCByaHMuZmxvYXROdWxsYWJsZUFycmF5LCByaHMuZG91YmxlTnVsbGFibGVBcnJheSwgcmhzLnN0cmluZ051bGxhYmxlQXJyYXksIHJocy5ieXRlRW51bU51bGxhYmxlQXJyYXksIHJocy5pbnRFbnVtTnVsbGFibGVBcnJheSwgcmhzLmxvbmdFbnVtTnVsbGFibGVBcnJheSwgcmhzLmJpbmRlck51bGxhYmxlQXJyYXksIHJocy5wZmROdWxsYWJsZUFycmF5LCByaHMucGFyY2VsYWJsZU51bGxhYmxlQXJyYXksIHJocy5pbnRlcmZhY2VOdWxsYWJsZUFycmF5LCByaHMuYm9vbE51bGxhYmxlTWF0cml4LCByaHMuYnl0ZU51bGxhYmxlTWF0cml4LCByaHMuY2hhck51bGxhYmxlTWF0cml4LCByaHMuaW50TnVsbGFibGVNYXRyaXgsIHJocy5sb25nTnVsbGFibGVNYXRyaXgsIHJocy5mbG9hdE51bGxhYmxlTWF0cml4LCByaHMuZG91YmxlTnVsbGFibGVNYXRyaXgsIHJocy5zdHJpbmdOdWxsYWJsZU1hdHJpeCwgcmhzLmJ5dGVFbnVtTnVsbGFibGVNYXRyaXgsIHJocy5pbnRFbnVtTnVsbGFibGVNYXRyaXgsIHJocy5sb25nRW51bU51bGxhYmxlTWF0cml4LCByaHMuYmluZGVyTnVsbGFibGVNYXRyaXgsIHJocy5wZmROdWxsYWJsZU1hdHJpeCwgcmhzLnBhcmNlbGFibGVOdWxsYWJsZU1hdHJpeCwgcmhzLmludGVyZmFjZU51bGxhYmxlTWF0cml4KTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IEZpeGVkU2l6ZUFycmF5RXhhbXBsZSYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKGludDJ4MywgYm9vbEFycmF5LCBieXRlQXJyYXksIGNoYXJBcnJheSwgaW50QXJyYXksIGxvbmdBcnJheSwgZmxvYXRBcnJheSwgZG91YmxlQXJyYXksIHN0cmluZ0FycmF5LCBieXRlRW51bUFycmF5LCBpbnRFbnVtQXJyYXksIGxvbmdFbnVtQXJyYXksIHBhcmNlbGFibGVBcnJheSwgYm9vbE1hdHJpeCwgYnl0ZU1hdHJpeCwgY2hhck1hdHJpeCwgaW50TWF0cml4LCBsb25nTWF0cml4LCBmbG9hdE1hdHJpeCwgZG91YmxlTWF0cml4LCBzdHJpbmdNYXRyaXgsIGJ5dGVFbnVtTWF0cml4LCBpbnRFbnVtTWF0cml4LCBsb25nRW51bU1hdHJpeCwgcGFyY2VsYWJsZU1hdHJpeCwgYm9vbE51bGxhYmxlQXJyYXksIGJ5dGVOdWxsYWJsZUFycmF5LCBjaGFyTnVsbGFibGVBcnJheSwgaW50TnVsbGFibGVBcnJheSwgbG9uZ051bGxhYmxlQXJyYXksIGZsb2F0TnVsbGFibGVBcnJheSwgZG91YmxlTnVsbGFibGVBcnJheSwgc3RyaW5nTnVsbGFibGVBcnJheSwgYnl0ZUVudW1OdWxsYWJsZUFycmF5LCBpbnRFbnVtTnVsbGFibGVBcnJheSwgbG9uZ0VudW1OdWxsYWJsZUFycmF5LCBiaW5kZXJOdWxsYWJsZUFycmF5LCBwZmROdWxsYWJsZUFycmF5LCBwYXJjZWxhYmxlTnVsbGFibGVBcnJheSwgaW50ZXJmYWNlTnVsbGFibGVBcnJheSwgYm9vbE51bGxhYmxlTWF0cml4LCBieXRlTnVsbGFibGVNYXRyaXgsIGNoYXJOdWxsYWJsZU1hdHJpeCwgaW50TnVsbGFibGVNYXRyaXgsIGxvbmdOdWxsYWJsZU1hdHJpeCwgZmxvYXROdWxsYWJsZU1hdHJpeCwgZG91YmxlTnVsbGFibGVNYXRyaXgsIHN0cmluZ051bGxhYmxlTWF0cml4LCBieXRlRW51bU51bGxhYmxlTWF0cml4LCBpbnRFbnVtTnVsbGFibGVNYXRyaXgsIGxvbmdFbnVtTnVsbGFibGVNYXRyaXgsIGJpbmRlck51bGxhYmxlTWF0cml4LCBwZmROdWxsYWJsZU1hdHJpeCwgcGFyY2VsYWJsZU51bGxhYmxlTWF0cml4LCBpbnRlcmZhY2VOdWxsYWJsZU1hdHJpeCkgPD0gc3RkOjp0aWUocmhzLmludDJ4MywgcmhzLmJvb2xBcnJheSwgcmhzLmJ5dGVBcnJheSwgcmhzLmNoYXJBcnJheSwgcmhzLmludEFycmF5LCByaHMubG9uZ0FycmF5LCByaHMuZmxvYXRBcnJheSwgcmhzLmRvdWJsZUFycmF5LCByaHMuc3RyaW5nQXJyYXksIHJocy5ieXRlRW51bUFycmF5LCByaHMuaW50RW51bUFycmF5LCByaHMubG9uZ0VudW1BcnJheSwgcmhzLnBhcmNlbGFibGVBcnJheSwgcmhzLmJvb2xNYXRyaXgsIHJocy5ieXRlTWF0cml4LCByaHMuY2hhck1hdHJpeCwgcmhzLmludE1hdHJpeCwgcmhzLmxvbmdNYXRyaXgsIHJocy5mbG9hdE1hdHJpeCwgcmhzLmRvdWJsZU1hdHJpeCwgcmhzLnN0cmluZ01hdHJpeCwgcmhzLmJ5dGVFbnVtTWF0cml4LCByaHMuaW50RW51bU1hdHJpeCwgcmhzLmxvbmdFbnVtTWF0cml4LCByaHMucGFyY2VsYWJsZU1hdHJpeCwgcmhzLmJvb2xOdWxsYWJsZUFycmF5LCByaHMuYnl0ZU51bGxhYmxlQXJyYXksIHJocy5jaGFyTnVsbGFibGVBcnJheSwgcmhzLmludE51bGxhYmxlQXJyYXksIHJocy5sb25nTnVsbGFibGVBcnJheSwgcmhzLmZsb2F0TnVsbGFibGVBcnJheSwgcmhzLmRvdWJsZU51bGxhYmxlQXJyYXksIHJocy5zdHJpbmdOdWxsYWJsZUFycmF5LCByaHMuYnl0ZUVudW1OdWxsYWJsZUFycmF5LCByaHMuaW50RW51bU51bGxhYmxlQXJyYXksIHJocy5sb25nRW51bU51bGxhYmxlQXJyYXksIHJocy5iaW5kZXJOdWxsYWJsZUFycmF5LCByaHMucGZkTnVsbGFibGVBcnJheSwgcmhzLnBhcmNlbGFibGVOdWxsYWJsZUFycmF5LCByaHMuaW50ZXJmYWNlTnVsbGFibGVBcnJheSwgcmhzLmJvb2xOdWxsYWJsZU1hdHJpeCwgcmhzLmJ5dGVOdWxsYWJsZU1hdHJpeCwgcmhzLmNoYXJOdWxsYWJsZU1hdHJpeCwgcmhzLmludE51bGxhYmxlTWF0cml4LCByaHMubG9uZ051bGxhYmxlTWF0cml4LCByaHMuZmxvYXROdWxsYWJsZU1hdHJpeCwgcmhzLmRvdWJsZU51bGxhYmxlTWF0cml4LCByaHMuc3RyaW5nTnVsbGFibGVNYXRyaXgsIHJocy5ieXRlRW51bU51bGxhYmxlTWF0cml4LCByaHMuaW50RW51bU51bGxhYmxlTWF0cml4LCByaHMubG9uZ0VudW1OdWxsYWJsZU1hdHJpeCwgcmhzLmJpbmRlck51bGxhYmxlTWF0cml4LCByaHMucGZkTnVsbGFibGVNYXRyaXgsIHJocy5wYXJjZWxhYmxlTnVsbGFibGVNYXRyaXgsIHJocy5pbnRlcmZhY2VOdWxsYWJsZU1hdHJpeCk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBGaXhlZFNpemVBcnJheUV4YW1wbGUmIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZShpbnQyeDMsIGJvb2xBcnJheSwgYnl0ZUFycmF5LCBjaGFyQXJyYXksIGludEFycmF5LCBsb25nQXJyYXksIGZsb2F0QXJyYXksIGRvdWJsZUFycmF5LCBzdHJpbmdBcnJheSwgYnl0ZUVudW1BcnJheSwgaW50RW51bUFycmF5LCBsb25nRW51bUFycmF5LCBwYXJjZWxhYmxlQXJyYXksIGJvb2xNYXRyaXgsIGJ5dGVNYXRyaXgsIGNoYXJNYXRyaXgsIGludE1hdHJpeCwgbG9uZ01hdHJpeCwgZmxvYXRNYXRyaXgsIGRvdWJsZU1hdHJpeCwgc3RyaW5nTWF0cml4LCBieXRlRW51bU1hdHJpeCwgaW50RW51bU1hdHJpeCwgbG9uZ0VudW1NYXRyaXgsIHBhcmNlbGFibGVNYXRyaXgsIGJvb2xOdWxsYWJsZUFycmF5LCBieXRlTnVsbGFibGVBcnJheSwgY2hhck51bGxhYmxlQXJyYXksIGludE51bGxhYmxlQXJyYXksIGxvbmdOdWxsYWJsZUFycmF5LCBmbG9hdE51bGxhYmxlQXJyYXksIGRvdWJsZU51bGxhYmxlQXJyYXksIHN0cmluZ051bGxhYmxlQXJyYXksIGJ5dGVFbnVtTnVsbGFibGVBcnJheSwgaW50RW51bU51bGxhYmxlQXJyYXksIGxvbmdFbnVtTnVsbGFibGVBcnJheSwgYmluZGVyTnVsbGFibGVBcnJheSwgcGZkTnVsbGFibGVBcnJheSwgcGFyY2VsYWJsZU51bGxhYmxlQXJyYXksIGludGVyZmFjZU51bGxhYmxlQXJyYXksIGJvb2xOdWxsYWJsZU1hdHJpeCwgYnl0ZU51bGxhYmxlTWF0cml4LCBjaGFyTnVsbGFibGVNYXRyaXgsIGludE51bGxhYmxlTWF0cml4LCBsb25nTnVsbGFibGVNYXRyaXgsIGZsb2F0TnVsbGFibGVNYXRyaXgsIGRvdWJsZU51bGxhYmxlTWF0cml4LCBzdHJpbmdOdWxsYWJsZU1hdHJpeCwgYnl0ZUVudW1OdWxsYWJsZU1hdHJpeCwgaW50RW51bU51bGxhYmxlTWF0cml4LCBsb25nRW51bU51bGxhYmxlTWF0cml4LCBiaW5kZXJOdWxsYWJsZU1hdHJpeCwgcGZkTnVsbGFibGVNYXRyaXgsIHBhcmNlbGFibGVOdWxsYWJsZU1hdHJpeCwgaW50ZXJmYWNlTnVsbGFibGVNYXRyaXgpID09IHN0ZDo6dGllKHJocy5pbnQyeDMsIHJocy5ib29sQXJyYXksIHJocy5ieXRlQXJyYXksIHJocy5jaGFyQXJyYXksIHJocy5pbnRBcnJheSwgcmhzLmxvbmdBcnJheSwgcmhzLmZsb2F0QXJyYXksIHJocy5kb3VibGVBcnJheSwgcmhzLnN0cmluZ0FycmF5LCByaHMuYnl0ZUVudW1BcnJheSwgcmhzLmludEVudW1BcnJheSwgcmhzLmxvbmdFbnVtQXJyYXksIHJocy5wYXJjZWxhYmxlQXJyYXksIHJocy5ib29sTWF0cml4LCByaHMuYnl0ZU1hdHJpeCwgcmhzLmNoYXJNYXRyaXgsIHJocy5pbnRNYXRyaXgsIHJocy5sb25nTWF0cml4LCByaHMuZmxvYXRNYXRyaXgsIHJocy5kb3VibGVNYXRyaXgsIHJocy5zdHJpbmdNYXRyaXgsIHJocy5ieXRlRW51bU1hdHJpeCwgcmhzLmludEVudW1NYXRyaXgsIHJocy5sb25nRW51bU1hdHJpeCwgcmhzLnBhcmNlbGFibGVNYXRyaXgsIHJocy5ib29sTnVsbGFibGVBcnJheSwgcmhzLmJ5dGVOdWxsYWJsZUFycmF5LCByaHMuY2hhck51bGxhYmxlQXJyYXksIHJocy5pbnROdWxsYWJsZUFycmF5LCByaHMubG9uZ051bGxhYmxlQXJyYXksIHJocy5mbG9hdE51bGxhYmxlQXJyYXksIHJocy5kb3VibGVOdWxsYWJsZUFycmF5LCByaHMuc3RyaW5nTnVsbGFibGVBcnJheSwgcmhzLmJ5dGVFbnVtTnVsbGFibGVBcnJheSwgcmhzLmludEVudW1OdWxsYWJsZUFycmF5LCByaHMubG9uZ0VudW1OdWxsYWJsZUFycmF5LCByaHMuYmluZGVyTnVsbGFibGVBcnJheSwgcmhzLnBmZE51bGxhYmxlQXJyYXksIHJocy5wYXJjZWxhYmxlTnVsbGFibGVBcnJheSwgcmhzLmludGVyZmFjZU51bGxhYmxlQXJyYXksIHJocy5ib29sTnVsbGFibGVNYXRyaXgsIHJocy5ieXRlTnVsbGFibGVNYXRyaXgsIHJocy5jaGFyTnVsbGFibGVNYXRyaXgsIHJocy5pbnROdWxsYWJsZU1hdHJpeCwgcmhzLmxvbmdOdWxsYWJsZU1hdHJpeCwgcmhzLmZsb2F0TnVsbGFibGVNYXRyaXgsIHJocy5kb3VibGVOdWxsYWJsZU1hdHJpeCwgcmhzLnN0cmluZ051bGxhYmxlTWF0cml4LCByaHMuYnl0ZUVudW1OdWxsYWJsZU1hdHJpeCwgcmhzLmludEVudW1OdWxsYWJsZU1hdHJpeCwgcmhzLmxvbmdFbnVtTnVsbGFibGVNYXRyaXgsIHJocy5iaW5kZXJOdWxsYWJsZU1hdHJpeCwgcmhzLnBmZE51bGxhYmxlTWF0cml4LCByaHMucGFyY2VsYWJsZU51bGxhYmxlTWF0cml4LCByaHMuaW50ZXJmYWNlTnVsbGFibGVNYXRyaXgpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPihjb25zdCBGaXhlZFNpemVBcnJheUV4YW1wbGUmIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZShpbnQyeDMsIGJvb2xBcnJheSwgYnl0ZUFycmF5LCBjaGFyQXJyYXksIGludEFycmF5LCBsb25nQXJyYXksIGZsb2F0QXJyYXksIGRvdWJsZUFycmF5LCBzdHJpbmdBcnJheSwgYnl0ZUVudW1BcnJheSwgaW50RW51bUFycmF5LCBsb25nRW51bUFycmF5LCBwYXJjZWxhYmxlQXJyYXksIGJvb2xNYXRyaXgsIGJ5dGVNYXRyaXgsIGNoYXJNYXRyaXgsIGludE1hdHJpeCwgbG9uZ01hdHJpeCwgZmxvYXRNYXRyaXgsIGRvdWJsZU1hdHJpeCwgc3RyaW5nTWF0cml4LCBieXRlRW51bU1hdHJpeCwgaW50RW51bU1hdHJpeCwgbG9uZ0VudW1NYXRyaXgsIHBhcmNlbGFibGVNYXRyaXgsIGJvb2xOdWxsYWJsZUFycmF5LCBieXRlTnVsbGFibGVBcnJheSwgY2hhck51bGxhYmxlQXJyYXksIGludE51bGxhYmxlQXJyYXksIGxvbmdOdWxsYWJsZUFycmF5LCBmbG9hdE51bGxhYmxlQXJyYXksIGRvdWJsZU51bGxhYmxlQXJyYXksIHN0cmluZ051bGxhYmxlQXJyYXksIGJ5dGVFbnVtTnVsbGFibGVBcnJheSwgaW50RW51bU51bGxhYmxlQXJyYXksIGxvbmdFbnVtTnVsbGFibGVBcnJheSwgYmluZGVyTnVsbGFibGVBcnJheSwgcGZkTnVsbGFibGVBcnJheSwgcGFyY2VsYWJsZU51bGxhYmxlQXJyYXksIGludGVyZmFjZU51bGxhYmxlQXJyYXksIGJvb2xOdWxsYWJsZU1hdHJpeCwgYnl0ZU51bGxhYmxlTWF0cml4LCBjaGFyTnVsbGFibGVNYXRyaXgsIGludE51bGxhYmxlTWF0cml4LCBsb25nTnVsbGFibGVNYXRyaXgsIGZsb2F0TnVsbGFibGVNYXRyaXgsIGRvdWJsZU51bGxhYmxlTWF0cml4LCBzdHJpbmdOdWxsYWJsZU1hdHJpeCwgYnl0ZUVudW1OdWxsYWJsZU1hdHJpeCwgaW50RW51bU51bGxhYmxlTWF0cml4LCBsb25nRW51bU51bGxhYmxlTWF0cml4LCBiaW5kZXJOdWxsYWJsZU1hdHJpeCwgcGZkTnVsbGFibGVNYXRyaXgsIHBhcmNlbGFibGVOdWxsYWJsZU1hdHJpeCwgaW50ZXJmYWNlTnVsbGFibGVNYXRyaXgpID4gc3RkOjp0aWUocmhzLmludDJ4MywgcmhzLmJvb2xBcnJheSwgcmhzLmJ5dGVBcnJheSwgcmhzLmNoYXJBcnJheSwgcmhzLmludEFycmF5LCByaHMubG9uZ0FycmF5LCByaHMuZmxvYXRBcnJheSwgcmhzLmRvdWJsZUFycmF5LCByaHMuc3RyaW5nQXJyYXksIHJocy5ieXRlRW51bUFycmF5LCByaHMuaW50RW51bUFycmF5LCByaHMubG9uZ0VudW1BcnJheSwgcmhzLnBhcmNlbGFibGVBcnJheSwgcmhzLmJvb2xNYXRyaXgsIHJocy5ieXRlTWF0cml4LCByaHMuY2hhck1hdHJpeCwgcmhzLmludE1hdHJpeCwgcmhzLmxvbmdNYXRyaXgsIHJocy5mbG9hdE1hdHJpeCwgcmhzLmRvdWJsZU1hdHJpeCwgcmhzLnN0cmluZ01hdHJpeCwgcmhzLmJ5dGVFbnVtTWF0cml4LCByaHMuaW50RW51bU1hdHJpeCwgcmhzLmxvbmdFbnVtTWF0cml4LCByaHMucGFyY2VsYWJsZU1hdHJpeCwgcmhzLmJvb2xOdWxsYWJsZUFycmF5LCByaHMuYnl0ZU51bGxhYmxlQXJyYXksIHJocy5jaGFyTnVsbGFibGVBcnJheSwgcmhzLmludE51bGxhYmxlQXJyYXksIHJocy5sb25nTnVsbGFibGVBcnJheSwgcmhzLmZsb2F0TnVsbGFibGVBcnJheSwgcmhzLmRvdWJsZU51bGxhYmxlQXJyYXksIHJocy5zdHJpbmdOdWxsYWJsZUFycmF5LCByaHMuYnl0ZUVudW1OdWxsYWJsZUFycmF5LCByaHMuaW50RW51bU51bGxhYmxlQXJyYXksIHJocy5sb25nRW51bU51bGxhYmxlQXJyYXksIHJocy5iaW5kZXJOdWxsYWJsZUFycmF5LCByaHMucGZkTnVsbGFibGVBcnJheSwgcmhzLnBhcmNlbGFibGVOdWxsYWJsZUFycmF5LCByaHMuaW50ZXJmYWNlTnVsbGFibGVBcnJheSwgcmhzLmJvb2xOdWxsYWJsZU1hdHJpeCwgcmhzLmJ5dGVOdWxsYWJsZU1hdHJpeCwgcmhzLmNoYXJOdWxsYWJsZU1hdHJpeCwgcmhzLmludE51bGxhYmxlTWF0cml4LCByaHMubG9uZ051bGxhYmxlTWF0cml4LCByaHMuZmxvYXROdWxsYWJsZU1hdHJpeCwgcmhzLmRvdWJsZU51bGxhYmxlTWF0cml4LCByaHMuc3RyaW5nTnVsbGFibGVNYXRyaXgsIHJocy5ieXRlRW51bU51bGxhYmxlTWF0cml4LCByaHMuaW50RW51bU51bGxhYmxlTWF0cml4LCByaHMubG9uZ0VudW1OdWxsYWJsZU1hdHJpeCwgcmhzLmJpbmRlck51bGxhYmxlTWF0cml4LCByaHMucGZkTnVsbGFibGVNYXRyaXgsIHJocy5wYXJjZWxhYmxlTnVsbGFibGVNYXRyaXgsIHJocy5pbnRlcmZhY2VOdWxsYWJsZU1hdHJpeCk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBGaXhlZFNpemVBcnJheUV4YW1wbGUmIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZShpbnQyeDMsIGJvb2xBcnJheSwgYnl0ZUFycmF5LCBjaGFyQXJyYXksIGludEFycmF5LCBsb25nQXJyYXksIGZsb2F0QXJyYXksIGRvdWJsZUFycmF5LCBzdHJpbmdBcnJheSwgYnl0ZUVudW1BcnJheSwgaW50RW51bUFycmF5LCBsb25nRW51bUFycmF5LCBwYXJjZWxhYmxlQXJyYXksIGJvb2xNYXRyaXgsIGJ5dGVNYXRyaXgsIGNoYXJNYXRyaXgsIGludE1hdHJpeCwgbG9uZ01hdHJpeCwgZmxvYXRNYXRyaXgsIGRvdWJsZU1hdHJpeCwgc3RyaW5nTWF0cml4LCBieXRlRW51bU1hdHJpeCwgaW50RW51bU1hdHJpeCwgbG9uZ0VudW1NYXRyaXgsIHBhcmNlbGFibGVNYXRyaXgsIGJvb2xOdWxsYWJsZUFycmF5LCBieXRlTnVsbGFibGVBcnJheSwgY2hhck51bGxhYmxlQXJyYXksIGludE51bGxhYmxlQXJyYXksIGxvbmdOdWxsYWJsZUFycmF5LCBmbG9hdE51bGxhYmxlQXJyYXksIGRvdWJsZU51bGxhYmxlQXJyYXksIHN0cmluZ051bGxhYmxlQXJyYXksIGJ5dGVFbnVtTnVsbGFibGVBcnJheSwgaW50RW51bU51bGxhYmxlQXJyYXksIGxvbmdFbnVtTnVsbGFibGVBcnJheSwgYmluZGVyTnVsbGFibGVBcnJheSwgcGZkTnVsbGFibGVBcnJheSwgcGFyY2VsYWJsZU51bGxhYmxlQXJyYXksIGludGVyZmFjZU51bGxhYmxlQXJyYXksIGJvb2xOdWxsYWJsZU1hdHJpeCwgYnl0ZU51bGxhYmxlTWF0cml4LCBjaGFyTnVsbGFibGVNYXRyaXgsIGludE51bGxhYmxlTWF0cml4LCBsb25nTnVsbGFibGVNYXRyaXgsIGZsb2F0TnVsbGFibGVNYXRyaXgsIGRvdWJsZU51bGxhYmxlTWF0cml4LCBzdHJpbmdOdWxsYWJsZU1hdHJpeCwgYnl0ZUVudW1OdWxsYWJsZU1hdHJpeCwgaW50RW51bU51bGxhYmxlTWF0cml4LCBsb25nRW51bU51bGxhYmxlTWF0cml4LCBiaW5kZXJOdWxsYWJsZU1hdHJpeCwgcGZkTnVsbGFibGVNYXRyaXgsIHBhcmNlbGFibGVOdWxsYWJsZU1hdHJpeCwgaW50ZXJmYWNlTnVsbGFibGVNYXRyaXgpID49IHN0ZDo6dGllKHJocy5pbnQyeDMsIHJocy5ib29sQXJyYXksIHJocy5ieXRlQXJyYXksIHJocy5jaGFyQXJyYXksIHJocy5pbnRBcnJheSwgcmhzLmxvbmdBcnJheSwgcmhzLmZsb2F0QXJyYXksIHJocy5kb3VibGVBcnJheSwgcmhzLnN0cmluZ0FycmF5LCByaHMuYnl0ZUVudW1BcnJheSwgcmhzLmludEVudW1BcnJheSwgcmhzLmxvbmdFbnVtQXJyYXksIHJocy5wYXJjZWxhYmxlQXJyYXksIHJocy5ib29sTWF0cml4LCByaHMuYnl0ZU1hdHJpeCwgcmhzLmNoYXJNYXRyaXgsIHJocy5pbnRNYXRyaXgsIHJocy5sb25nTWF0cml4LCByaHMuZmxvYXRNYXRyaXgsIHJocy5kb3VibGVNYXRyaXgsIHJocy5zdHJpbmdNYXRyaXgsIHJocy5ieXRlRW51bU1hdHJpeCwgcmhzLmludEVudW1NYXRyaXgsIHJocy5sb25nRW51bU1hdHJpeCwgcmhzLnBhcmNlbGFibGVNYXRyaXgsIHJocy5ib29sTnVsbGFibGVBcnJheSwgcmhzLmJ5dGVOdWxsYWJsZUFycmF5LCByaHMuY2hhck51bGxhYmxlQXJyYXksIHJocy5pbnROdWxsYWJsZUFycmF5LCByaHMubG9uZ051bGxhYmxlQXJyYXksIHJocy5mbG9hdE51bGxhYmxlQXJyYXksIHJocy5kb3VibGVOdWxsYWJsZUFycmF5LCByaHMuc3RyaW5nTnVsbGFibGVBcnJheSwgcmhzLmJ5dGVFbnVtTnVsbGFibGVBcnJheSwgcmhzLmludEVudW1OdWxsYWJsZUFycmF5LCByaHMubG9uZ0VudW1OdWxsYWJsZUFycmF5LCByaHMuYmluZGVyTnVsbGFibGVBcnJheSwgcmhzLnBmZE51bGxhYmxlQXJyYXksIHJocy5wYXJjZWxhYmxlTnVsbGFibGVBcnJheSwgcmhzLmludGVyZmFjZU51bGxhYmxlQXJyYXksIHJocy5ib29sTnVsbGFibGVNYXRyaXgsIHJocy5ieXRlTnVsbGFibGVNYXRyaXgsIHJocy5jaGFyTnVsbGFibGVNYXRyaXgsIHJocy5pbnROdWxsYWJsZU1hdHJpeCwgcmhzLmxvbmdOdWxsYWJsZU1hdHJpeCwgcmhzLmZsb2F0TnVsbGFibGVNYXRyaXgsIHJocy5kb3VibGVOdWxsYWJsZU1hdHJpeCwgcmhzLnN0cmluZ051bGxhYmxlTWF0cml4LCByaHMuYnl0ZUVudW1OdWxsYWJsZU1hdHJpeCwgcmhzLmludEVudW1OdWxsYWJsZU1hdHJpeCwgcmhzLmxvbmdFbnVtTnVsbGFibGVNYXRyaXgsIHJocy5iaW5kZXJOdWxsYWJsZU1hdHJpeCwgcmhzLnBmZE51bGxhYmxlTWF0cml4LCByaHMucGFyY2VsYWJsZU51bGxhYmxlTWF0cml4LCByaHMuaW50ZXJmYWNlTnVsbGFibGVNYXRyaXgpOworICB9CisKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBmaW5hbDsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IGZpbmFsOworICBzdGF0aWMgY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiYgZ2V0UGFyY2VsYWJsZURlc2NyaXB0b3IoKSB7CisgICAgc3RhdGljIGNvbnN0IDo6YW5kcm9pZDo6U3RhdGljU3RyaW5nMTYgREVTQ0lQVE9SICh1ImFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUiKTsKKyAgICByZXR1cm4gREVTQ0lQVE9SOworICB9CisgIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7CisgICAgb3MgPDwgIkZpeGVkU2l6ZUFycmF5RXhhbXBsZXsiOworICAgIG9zIDw8ICJpbnQyeDM6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaW50MngzKTsKKyAgICBvcyA8PCAiLCBib29sQXJyYXk6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoYm9vbEFycmF5KTsKKyAgICBvcyA8PCAiLCBieXRlQXJyYXk6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoYnl0ZUFycmF5KTsKKyAgICBvcyA8PCAiLCBjaGFyQXJyYXk6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoY2hhckFycmF5KTsKKyAgICBvcyA8PCAiLCBpbnRBcnJheTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbnRBcnJheSk7CisgICAgb3MgPDwgIiwgbG9uZ0FycmF5OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGxvbmdBcnJheSk7CisgICAgb3MgPDwgIiwgZmxvYXRBcnJheTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhmbG9hdEFycmF5KTsKKyAgICBvcyA8PCAiLCBkb3VibGVBcnJheTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhkb3VibGVBcnJheSk7CisgICAgb3MgPDwgIiwgc3RyaW5nQXJyYXk6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoc3RyaW5nQXJyYXkpOworICAgIG9zIDw8ICIsIGJ5dGVFbnVtQXJyYXk6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoYnl0ZUVudW1BcnJheSk7CisgICAgb3MgPDwgIiwgaW50RW51bUFycmF5OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGludEVudW1BcnJheSk7CisgICAgb3MgPDwgIiwgbG9uZ0VudW1BcnJheTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhsb25nRW51bUFycmF5KTsKKyAgICBvcyA8PCAiLCBwYXJjZWxhYmxlQXJyYXk6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcocGFyY2VsYWJsZUFycmF5KTsKKyAgICBvcyA8PCAiLCBib29sTWF0cml4OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGJvb2xNYXRyaXgpOworICAgIG9zIDw8ICIsIGJ5dGVNYXRyaXg6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoYnl0ZU1hdHJpeCk7CisgICAgb3MgPDwgIiwgY2hhck1hdHJpeDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhjaGFyTWF0cml4KTsKKyAgICBvcyA8PCAiLCBpbnRNYXRyaXg6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaW50TWF0cml4KTsKKyAgICBvcyA8PCAiLCBsb25nTWF0cml4OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGxvbmdNYXRyaXgpOworICAgIG9zIDw8ICIsIGZsb2F0TWF0cml4OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGZsb2F0TWF0cml4KTsKKyAgICBvcyA8PCAiLCBkb3VibGVNYXRyaXg6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoZG91YmxlTWF0cml4KTsKKyAgICBvcyA8PCAiLCBzdHJpbmdNYXRyaXg6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoc3RyaW5nTWF0cml4KTsKKyAgICBvcyA8PCAiLCBieXRlRW51bU1hdHJpeDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhieXRlRW51bU1hdHJpeCk7CisgICAgb3MgPDwgIiwgaW50RW51bU1hdHJpeDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbnRFbnVtTWF0cml4KTsKKyAgICBvcyA8PCAiLCBsb25nRW51bU1hdHJpeDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhsb25nRW51bU1hdHJpeCk7CisgICAgb3MgPDwgIiwgcGFyY2VsYWJsZU1hdHJpeDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhwYXJjZWxhYmxlTWF0cml4KTsKKyAgICBvcyA8PCAiLCBib29sTnVsbGFibGVBcnJheTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhib29sTnVsbGFibGVBcnJheSk7CisgICAgb3MgPDwgIiwgYnl0ZU51bGxhYmxlQXJyYXk6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoYnl0ZU51bGxhYmxlQXJyYXkpOworICAgIG9zIDw8ICIsIGNoYXJOdWxsYWJsZUFycmF5OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGNoYXJOdWxsYWJsZUFycmF5KTsKKyAgICBvcyA8PCAiLCBpbnROdWxsYWJsZUFycmF5OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGludE51bGxhYmxlQXJyYXkpOworICAgIG9zIDw8ICIsIGxvbmdOdWxsYWJsZUFycmF5OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGxvbmdOdWxsYWJsZUFycmF5KTsKKyAgICBvcyA8PCAiLCBmbG9hdE51bGxhYmxlQXJyYXk6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoZmxvYXROdWxsYWJsZUFycmF5KTsKKyAgICBvcyA8PCAiLCBkb3VibGVOdWxsYWJsZUFycmF5OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGRvdWJsZU51bGxhYmxlQXJyYXkpOworICAgIG9zIDw8ICIsIHN0cmluZ051bGxhYmxlQXJyYXk6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoc3RyaW5nTnVsbGFibGVBcnJheSk7CisgICAgb3MgPDwgIiwgYnl0ZUVudW1OdWxsYWJsZUFycmF5OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGJ5dGVFbnVtTnVsbGFibGVBcnJheSk7CisgICAgb3MgPDwgIiwgaW50RW51bU51bGxhYmxlQXJyYXk6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaW50RW51bU51bGxhYmxlQXJyYXkpOworICAgIG9zIDw8ICIsIGxvbmdFbnVtTnVsbGFibGVBcnJheTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhsb25nRW51bU51bGxhYmxlQXJyYXkpOworICAgIG9zIDw8ICIsIGJpbmRlck51bGxhYmxlQXJyYXk6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoYmluZGVyTnVsbGFibGVBcnJheSk7CisgICAgb3MgPDwgIiwgcGZkTnVsbGFibGVBcnJheTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhwZmROdWxsYWJsZUFycmF5KTsKKyAgICBvcyA8PCAiLCBwYXJjZWxhYmxlTnVsbGFibGVBcnJheTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhwYXJjZWxhYmxlTnVsbGFibGVBcnJheSk7CisgICAgb3MgPDwgIiwgaW50ZXJmYWNlTnVsbGFibGVBcnJheTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbnRlcmZhY2VOdWxsYWJsZUFycmF5KTsKKyAgICBvcyA8PCAiLCBib29sTnVsbGFibGVNYXRyaXg6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoYm9vbE51bGxhYmxlTWF0cml4KTsKKyAgICBvcyA8PCAiLCBieXRlTnVsbGFibGVNYXRyaXg6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoYnl0ZU51bGxhYmxlTWF0cml4KTsKKyAgICBvcyA8PCAiLCBjaGFyTnVsbGFibGVNYXRyaXg6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoY2hhck51bGxhYmxlTWF0cml4KTsKKyAgICBvcyA8PCAiLCBpbnROdWxsYWJsZU1hdHJpeDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbnROdWxsYWJsZU1hdHJpeCk7CisgICAgb3MgPDwgIiwgbG9uZ051bGxhYmxlTWF0cml4OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGxvbmdOdWxsYWJsZU1hdHJpeCk7CisgICAgb3MgPDwgIiwgZmxvYXROdWxsYWJsZU1hdHJpeDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhmbG9hdE51bGxhYmxlTWF0cml4KTsKKyAgICBvcyA8PCAiLCBkb3VibGVOdWxsYWJsZU1hdHJpeDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhkb3VibGVOdWxsYWJsZU1hdHJpeCk7CisgICAgb3MgPDwgIiwgc3RyaW5nTnVsbGFibGVNYXRyaXg6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoc3RyaW5nTnVsbGFibGVNYXRyaXgpOworICAgIG9zIDw8ICIsIGJ5dGVFbnVtTnVsbGFibGVNYXRyaXg6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoYnl0ZUVudW1OdWxsYWJsZU1hdHJpeCk7CisgICAgb3MgPDwgIiwgaW50RW51bU51bGxhYmxlTWF0cml4OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGludEVudW1OdWxsYWJsZU1hdHJpeCk7CisgICAgb3MgPDwgIiwgbG9uZ0VudW1OdWxsYWJsZU1hdHJpeDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhsb25nRW51bU51bGxhYmxlTWF0cml4KTsKKyAgICBvcyA8PCAiLCBiaW5kZXJOdWxsYWJsZU1hdHJpeDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhiaW5kZXJOdWxsYWJsZU1hdHJpeCk7CisgICAgb3MgPDwgIiwgcGZkTnVsbGFibGVNYXRyaXg6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcocGZkTnVsbGFibGVNYXRyaXgpOworICAgIG9zIDw8ICIsIHBhcmNlbGFibGVOdWxsYWJsZU1hdHJpeDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhwYXJjZWxhYmxlTnVsbGFibGVNYXRyaXgpOworICAgIG9zIDw8ICIsIGludGVyZmFjZU51bGxhYmxlTWF0cml4OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGludGVyZmFjZU51bGxhYmxlTWF0cml4KTsKKyAgICBvcyA8PCAifSI7CisgICAgcmV0dXJuIG9zLnN0cigpOworICB9Cit9OyAgLy8gY2xhc3MgRml4ZWRTaXplQXJyYXlFeGFtcGxlCit9ICAvLyBuYW1lc3BhY2UgZml4ZWRzaXplYXJyYXkKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGZpeGVkc2l6ZWFycmF5IHsKK1tbbm9kaXNjYXJkXV0gc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZyhGaXhlZFNpemVBcnJheUV4YW1wbGU6OkJ5dGVFbnVtIHZhbCkgeworICBzd2l0Y2godmFsKSB7CisgIGNhc2UgRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpCeXRlRW51bTo6QToKKyAgICByZXR1cm4gIkEiOworICBkZWZhdWx0OgorICAgIHJldHVybiBzdGQ6OnRvX3N0cmluZyhzdGF0aWNfY2FzdDxpbnQ4X3Q+KHZhbCkpOworICB9Cit9Cit9ICAvLyBuYW1lc3BhY2UgZml4ZWRzaXplYXJyYXkKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGludGVybmFsIHsKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdjKysxNy1leHRlbnNpb25zIgordGVtcGxhdGUgPD4KK2NvbnN0ZXhwciBpbmxpbmUgc3RkOjphcnJheTw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkJ5dGVFbnVtLCAxPiBlbnVtX3ZhbHVlczw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkJ5dGVFbnVtPiA9IHsKKyAgOjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpCeXRlRW51bTo6QSwKK307CisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgZml4ZWRzaXplYXJyYXkgeworW1tub2Rpc2NhcmRdXSBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50RW51bSB2YWwpIHsKKyAgc3dpdGNoKHZhbCkgeworICBjYXNlIEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50RW51bTo6QToKKyAgICByZXR1cm4gIkEiOworICBkZWZhdWx0OgorICAgIHJldHVybiBzdGQ6OnRvX3N0cmluZyhzdGF0aWNfY2FzdDxpbnQzMl90Pih2YWwpKTsKKyAgfQorfQorfSAgLy8gbmFtZXNwYWNlIGZpeGVkc2l6ZWFycmF5Cit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XYysrMTctZXh0ZW5zaW9ucyIKK3RlbXBsYXRlIDw+Citjb25zdGV4cHIgaW5saW5lIHN0ZDo6YXJyYXk8OjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRFbnVtLCAxPiBlbnVtX3ZhbHVlczw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludEVudW0+ID0geworICA6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludEVudW06OkEsCit9OworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAorfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGZpeGVkc2l6ZWFycmF5IHsKK1tbbm9kaXNjYXJkXV0gc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZyhGaXhlZFNpemVBcnJheUV4YW1wbGU6OkxvbmdFbnVtIHZhbCkgeworICBzd2l0Y2godmFsKSB7CisgIGNhc2UgRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpMb25nRW51bTo6QToKKyAgICByZXR1cm4gIkEiOworICBkZWZhdWx0OgorICAgIHJldHVybiBzdGQ6OnRvX3N0cmluZyhzdGF0aWNfY2FzdDxpbnQ2NF90Pih2YWwpKTsKKyAgfQorfQorfSAgLy8gbmFtZXNwYWNlIGZpeGVkc2l6ZWFycmF5Cit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XYysrMTctZXh0ZW5zaW9ucyIKK3RlbXBsYXRlIDw+Citjb25zdGV4cHIgaW5saW5lIHN0ZDo6YXJyYXk8OjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpMb25nRW51bSwgMT4gZW51bV92YWx1ZXM8OjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpMb25nRW51bT4gPSB7CisgIDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6TG9uZ0VudW06OkEsCit9OworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAorfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL3RpbWVzdGFtcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWZpeGVkc2l6ZWFycmF5LWNwcC1zb3VyY2UvZ2VuL3RpbWVzdGFtcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi90aW1lc3RhbXAKY29weSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1maXhlZHNpemVhcnJheS1jcHAtc291cmNlL2dlbi90aW1lc3RhbXAKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWZpeGVkc2l6ZWFycmF5LWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvZml4ZWRzaXplYXJyYXkvRml4ZWRTaXplQXJyYXlFeGFtcGxlLmphdmEgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1maXhlZHNpemVhcnJheS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2ZpeGVkc2l6ZWFycmF5L0ZpeGVkU2l6ZUFycmF5RXhhbXBsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMGFlMjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1maXhlZHNpemVhcnJheS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2ZpeGVkc2l6ZWFycmF5L0ZpeGVkU2l6ZUFycmF5RXhhbXBsZS5qYXZhCkBAIC0wLDAgKzEsODgyIEBACisvKgorICogVGhpcyBmaWxlIGlzIGF1dG8tZ2VuZXJhdGVkLiAgRE8gTk9UIE1PRElGWS4KKyAqLworcGFja2FnZSBhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXk7CitwdWJsaWMgY2xhc3MgRml4ZWRTaXplQXJyYXlFeGFtcGxlIGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlCit7CisgIC8vIHRvIHNlZSBpZiBOeE0gYXJyYXkgd29ya3MKKyAgcHVibGljIGludFtdW10gaW50MngzID0ge3sxLCAyLCAzfSwgezQsIDUsIDZ9fTsKKyAgcHVibGljIGJvb2xlYW5bXSBib29sQXJyYXk7CisgIHB1YmxpYyBieXRlW10gYnl0ZUFycmF5OworICBwdWJsaWMgY2hhcltdIGNoYXJBcnJheTsKKyAgcHVibGljIGludFtdIGludEFycmF5OworICBwdWJsaWMgbG9uZ1tdIGxvbmdBcnJheTsKKyAgcHVibGljIGZsb2F0W10gZmxvYXRBcnJheTsKKyAgcHVibGljIGRvdWJsZVtdIGRvdWJsZUFycmF5OworICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIHN0cmluZ0FycmF5ID0geyJoZWxsbyIsICJ3b3JsZCJ9OworICBwdWJsaWMgYnl0ZVtdIGJ5dGVFbnVtQXJyYXk7CisgIHB1YmxpYyBpbnRbXSBpbnRFbnVtQXJyYXk7CisgIHB1YmxpYyBsb25nW10gbG9uZ0VudW1BcnJheTsKKyAgcHVibGljIGFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSW50UGFyY2VsYWJsZVtdIHBhcmNlbGFibGVBcnJheTsKKyAgLy8gRm9sbG93aW5nIGZpZWxkcyBhcmUgbm90IHRlc3QtZnJpZW5kbHkgYmVjYXVzZSB0aGV5IHNob3VsZCBiZSBpbml0aWFsaXplZCBhcyBub24tbnVsbC4KKyAgLy8gSUJpbmRlclsyXSBiaW5kZXJBcnJheTsKKyAgLy8gUGFyY2VsRmlsZURlc2NyaXB0b3JbMl0gcGZkQXJyYXk7CisgIC8vIElFbXB0eUludGVyZmFjZVsyXSBpbnRlcmZhY2VBcnJheTsKKyAgcHVibGljIGJvb2xlYW5bXVtdIGJvb2xNYXRyaXg7CisgIHB1YmxpYyBieXRlW11bXSBieXRlTWF0cml4OworICBwdWJsaWMgY2hhcltdW10gY2hhck1hdHJpeDsKKyAgcHVibGljIGludFtdW10gaW50TWF0cml4OworICBwdWJsaWMgbG9uZ1tdW10gbG9uZ01hdHJpeDsKKyAgcHVibGljIGZsb2F0W11bXSBmbG9hdE1hdHJpeDsKKyAgcHVibGljIGRvdWJsZVtdW10gZG91YmxlTWF0cml4OworICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdW10gc3RyaW5nTWF0cml4ID0ge3siaGVsbG8iLCAid29ybGQifSwgeyJDaWFvIiwgIm1vbmRvIn19OworICBwdWJsaWMgYnl0ZVtdW10gYnl0ZUVudW1NYXRyaXg7CisgIHB1YmxpYyBpbnRbXVtdIGludEVudW1NYXRyaXg7CisgIHB1YmxpYyBsb25nW11bXSBsb25nRW51bU1hdHJpeDsKKyAgcHVibGljIGFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSW50UGFyY2VsYWJsZVtdW10gcGFyY2VsYWJsZU1hdHJpeDsKKyAgLy8gRm9sbG93aW5nIGZpZWxkcyBhcmUgbm90IHRlc3QtZnJpZW5kbHkgYmVjYXVzZSB0aGV5IHNob3VsZCBiZSBpbml0aWFsaXplZCBhcyBub24tbnVsbC4KKyAgLy8gUGFyY2VsRmlsZURlc2NyaXB0b3JbMl1bMl0gcGZkTWF0cml4OworICAvLyBJQmluZGVyWzJdWzJdIGJpbmRlck1hdHJpeDsKKyAgLy8gSUVtcHR5SW50ZXJmYWNlWzJdWzJdIGludGVyZmFjZU1hdHJpeDsKKyAgcHVibGljIGJvb2xlYW5bXSBib29sTnVsbGFibGVBcnJheTsKKyAgcHVibGljIGJ5dGVbXSBieXRlTnVsbGFibGVBcnJheTsKKyAgcHVibGljIGNoYXJbXSBjaGFyTnVsbGFibGVBcnJheTsKKyAgcHVibGljIGludFtdIGludE51bGxhYmxlQXJyYXk7CisgIHB1YmxpYyBsb25nW10gbG9uZ051bGxhYmxlQXJyYXk7CisgIHB1YmxpYyBmbG9hdFtdIGZsb2F0TnVsbGFibGVBcnJheTsKKyAgcHVibGljIGRvdWJsZVtdIGRvdWJsZU51bGxhYmxlQXJyYXk7CisgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gc3RyaW5nTnVsbGFibGVBcnJheSA9IHsiaGVsbG8iLCAid29ybGQifTsKKyAgcHVibGljIGJ5dGVbXSBieXRlRW51bU51bGxhYmxlQXJyYXk7CisgIHB1YmxpYyBpbnRbXSBpbnRFbnVtTnVsbGFibGVBcnJheTsKKyAgcHVibGljIGxvbmdbXSBsb25nRW51bU51bGxhYmxlQXJyYXk7CisgIHB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXJbXSBiaW5kZXJOdWxsYWJsZUFycmF5OworICBwdWJsaWMgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcltdIHBmZE51bGxhYmxlQXJyYXk7CisgIHB1YmxpYyBhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLkludFBhcmNlbGFibGVbXSBwYXJjZWxhYmxlTnVsbGFibGVBcnJheTsKKyAgcHVibGljIGFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSUVtcHR5SW50ZXJmYWNlW10gaW50ZXJmYWNlTnVsbGFibGVBcnJheTsKKyAgcHVibGljIGJvb2xlYW5bXVtdIGJvb2xOdWxsYWJsZU1hdHJpeDsKKyAgcHVibGljIGJ5dGVbXVtdIGJ5dGVOdWxsYWJsZU1hdHJpeDsKKyAgcHVibGljIGNoYXJbXVtdIGNoYXJOdWxsYWJsZU1hdHJpeDsKKyAgcHVibGljIGludFtdW10gaW50TnVsbGFibGVNYXRyaXg7CisgIHB1YmxpYyBsb25nW11bXSBsb25nTnVsbGFibGVNYXRyaXg7CisgIHB1YmxpYyBmbG9hdFtdW10gZmxvYXROdWxsYWJsZU1hdHJpeDsKKyAgcHVibGljIGRvdWJsZVtdW10gZG91YmxlTnVsbGFibGVNYXRyaXg7CisgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW11bXSBzdHJpbmdOdWxsYWJsZU1hdHJpeCA9IHt7ImhlbGxvIiwgIndvcmxkIn0sIHsiQ2lhbyIsICJtb25kbyJ9fTsKKyAgcHVibGljIGJ5dGVbXVtdIGJ5dGVFbnVtTnVsbGFibGVNYXRyaXg7CisgIHB1YmxpYyBpbnRbXVtdIGludEVudW1OdWxsYWJsZU1hdHJpeDsKKyAgcHVibGljIGxvbmdbXVtdIGxvbmdFbnVtTnVsbGFibGVNYXRyaXg7CisgIHB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXJbXVtdIGJpbmRlck51bGxhYmxlTWF0cml4OworICBwdWJsaWMgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcltdW10gcGZkTnVsbGFibGVNYXRyaXg7CisgIHB1YmxpYyBhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLkludFBhcmNlbGFibGVbXVtdIHBhcmNlbGFibGVOdWxsYWJsZU1hdHJpeDsKKyAgcHVibGljIGFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSUVtcHR5SW50ZXJmYWNlW11bXSBpbnRlcmZhY2VOdWxsYWJsZU1hdHJpeDsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm9zLlBhcmNlbGFibGUuQ3JlYXRvcjxGaXhlZFNpemVBcnJheUV4YW1wbGU+IENSRUFUT1IgPSBuZXcgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3I8Rml4ZWRTaXplQXJyYXlFeGFtcGxlPigpIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRml4ZWRTaXplQXJyYXlFeGFtcGxlIGNyZWF0ZUZyb21QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgX2FpZGxfc291cmNlKSB7CisgICAgICBGaXhlZFNpemVBcnJheUV4YW1wbGUgX2FpZGxfb3V0ID0gbmV3IEZpeGVkU2l6ZUFycmF5RXhhbXBsZSgpOworICAgICAgX2FpZGxfb3V0LnJlYWRGcm9tUGFyY2VsKF9haWRsX3NvdXJjZSk7CisgICAgICByZXR1cm4gX2FpZGxfb3V0OworICAgIH0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRml4ZWRTaXplQXJyYXlFeGFtcGxlW10gbmV3QXJyYXkoaW50IF9haWRsX3NpemUpIHsKKyAgICAgIHJldHVybiBuZXcgRml4ZWRTaXplQXJyYXlFeGFtcGxlW19haWRsX3NpemVdOworICAgIH0KKyAgfTsKKyAgQE92ZXJyaWRlIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlVG9QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgX2FpZGxfcGFyY2VsLCBpbnQgX2FpZGxfZmxhZykKKyAgeworICAgIGludCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCk7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KDApOworICAgIF9haWRsX3BhcmNlbC53cml0ZUZpeGVkQXJyYXkoaW50MngzLCBfYWlkbF9mbGFnLCAyLCAzKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVGaXhlZEFycmF5KGJvb2xBcnJheSwgX2FpZGxfZmxhZywgMik7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlRml4ZWRBcnJheShieXRlQXJyYXksIF9haWRsX2ZsYWcsIDIpOworICAgIF9haWRsX3BhcmNlbC53cml0ZUZpeGVkQXJyYXkoY2hhckFycmF5LCBfYWlkbF9mbGFnLCAyKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVGaXhlZEFycmF5KGludEFycmF5LCBfYWlkbF9mbGFnLCAyKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVGaXhlZEFycmF5KGxvbmdBcnJheSwgX2FpZGxfZmxhZywgMik7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlRml4ZWRBcnJheShmbG9hdEFycmF5LCBfYWlkbF9mbGFnLCAyKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVGaXhlZEFycmF5KGRvdWJsZUFycmF5LCBfYWlkbF9mbGFnLCAyKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVGaXhlZEFycmF5KHN0cmluZ0FycmF5LCBfYWlkbF9mbGFnLCAyKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVGaXhlZEFycmF5KGJ5dGVFbnVtQXJyYXksIF9haWRsX2ZsYWcsIDIpOworICAgIF9haWRsX3BhcmNlbC53cml0ZUZpeGVkQXJyYXkoaW50RW51bUFycmF5LCBfYWlkbF9mbGFnLCAyKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVGaXhlZEFycmF5KGxvbmdFbnVtQXJyYXksIF9haWRsX2ZsYWcsIDIpOworICAgIF9haWRsX3BhcmNlbC53cml0ZUZpeGVkQXJyYXkocGFyY2VsYWJsZUFycmF5LCBfYWlkbF9mbGFnLCAyKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVGaXhlZEFycmF5KGJvb2xNYXRyaXgsIF9haWRsX2ZsYWcsIDIsIDIpOworICAgIF9haWRsX3BhcmNlbC53cml0ZUZpeGVkQXJyYXkoYnl0ZU1hdHJpeCwgX2FpZGxfZmxhZywgMiwgMik7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlRml4ZWRBcnJheShjaGFyTWF0cml4LCBfYWlkbF9mbGFnLCAyLCAyKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVGaXhlZEFycmF5KGludE1hdHJpeCwgX2FpZGxfZmxhZywgMiwgMik7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlRml4ZWRBcnJheShsb25nTWF0cml4LCBfYWlkbF9mbGFnLCAyLCAyKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVGaXhlZEFycmF5KGZsb2F0TWF0cml4LCBfYWlkbF9mbGFnLCAyLCAyKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVGaXhlZEFycmF5KGRvdWJsZU1hdHJpeCwgX2FpZGxfZmxhZywgMiwgMik7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlRml4ZWRBcnJheShzdHJpbmdNYXRyaXgsIF9haWRsX2ZsYWcsIDIsIDIpOworICAgIF9haWRsX3BhcmNlbC53cml0ZUZpeGVkQXJyYXkoYnl0ZUVudW1NYXRyaXgsIF9haWRsX2ZsYWcsIDIsIDIpOworICAgIF9haWRsX3BhcmNlbC53cml0ZUZpeGVkQXJyYXkoaW50RW51bU1hdHJpeCwgX2FpZGxfZmxhZywgMiwgMik7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlRml4ZWRBcnJheShsb25nRW51bU1hdHJpeCwgX2FpZGxfZmxhZywgMiwgMik7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlRml4ZWRBcnJheShwYXJjZWxhYmxlTWF0cml4LCBfYWlkbF9mbGFnLCAyLCAyKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVGaXhlZEFycmF5KGJvb2xOdWxsYWJsZUFycmF5LCBfYWlkbF9mbGFnLCAyKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVGaXhlZEFycmF5KGJ5dGVOdWxsYWJsZUFycmF5LCBfYWlkbF9mbGFnLCAyKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVGaXhlZEFycmF5KGNoYXJOdWxsYWJsZUFycmF5LCBfYWlkbF9mbGFnLCAyKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVGaXhlZEFycmF5KGludE51bGxhYmxlQXJyYXksIF9haWRsX2ZsYWcsIDIpOworICAgIF9haWRsX3BhcmNlbC53cml0ZUZpeGVkQXJyYXkobG9uZ051bGxhYmxlQXJyYXksIF9haWRsX2ZsYWcsIDIpOworICAgIF9haWRsX3BhcmNlbC53cml0ZUZpeGVkQXJyYXkoZmxvYXROdWxsYWJsZUFycmF5LCBfYWlkbF9mbGFnLCAyKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVGaXhlZEFycmF5KGRvdWJsZU51bGxhYmxlQXJyYXksIF9haWRsX2ZsYWcsIDIpOworICAgIF9haWRsX3BhcmNlbC53cml0ZUZpeGVkQXJyYXkoc3RyaW5nTnVsbGFibGVBcnJheSwgX2FpZGxfZmxhZywgMik7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlRml4ZWRBcnJheShieXRlRW51bU51bGxhYmxlQXJyYXksIF9haWRsX2ZsYWcsIDIpOworICAgIF9haWRsX3BhcmNlbC53cml0ZUZpeGVkQXJyYXkoaW50RW51bU51bGxhYmxlQXJyYXksIF9haWRsX2ZsYWcsIDIpOworICAgIF9haWRsX3BhcmNlbC53cml0ZUZpeGVkQXJyYXkobG9uZ0VudW1OdWxsYWJsZUFycmF5LCBfYWlkbF9mbGFnLCAyKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVGaXhlZEFycmF5KGJpbmRlck51bGxhYmxlQXJyYXksIF9haWRsX2ZsYWcsIDIpOworICAgIF9haWRsX3BhcmNlbC53cml0ZUZpeGVkQXJyYXkocGZkTnVsbGFibGVBcnJheSwgX2FpZGxfZmxhZywgMik7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlRml4ZWRBcnJheShwYXJjZWxhYmxlTnVsbGFibGVBcnJheSwgX2FpZGxfZmxhZywgMik7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlRml4ZWRBcnJheShpbnRlcmZhY2VOdWxsYWJsZUFycmF5LCBfYWlkbF9mbGFnLCAyKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVGaXhlZEFycmF5KGJvb2xOdWxsYWJsZU1hdHJpeCwgX2FpZGxfZmxhZywgMiwgMik7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlRml4ZWRBcnJheShieXRlTnVsbGFibGVNYXRyaXgsIF9haWRsX2ZsYWcsIDIsIDIpOworICAgIF9haWRsX3BhcmNlbC53cml0ZUZpeGVkQXJyYXkoY2hhck51bGxhYmxlTWF0cml4LCBfYWlkbF9mbGFnLCAyLCAyKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVGaXhlZEFycmF5KGludE51bGxhYmxlTWF0cml4LCBfYWlkbF9mbGFnLCAyLCAyKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVGaXhlZEFycmF5KGxvbmdOdWxsYWJsZU1hdHJpeCwgX2FpZGxfZmxhZywgMiwgMik7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlRml4ZWRBcnJheShmbG9hdE51bGxhYmxlTWF0cml4LCBfYWlkbF9mbGFnLCAyLCAyKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVGaXhlZEFycmF5KGRvdWJsZU51bGxhYmxlTWF0cml4LCBfYWlkbF9mbGFnLCAyLCAyKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVGaXhlZEFycmF5KHN0cmluZ051bGxhYmxlTWF0cml4LCBfYWlkbF9mbGFnLCAyLCAyKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVGaXhlZEFycmF5KGJ5dGVFbnVtTnVsbGFibGVNYXRyaXgsIF9haWRsX2ZsYWcsIDIsIDIpOworICAgIF9haWRsX3BhcmNlbC53cml0ZUZpeGVkQXJyYXkoaW50RW51bU51bGxhYmxlTWF0cml4LCBfYWlkbF9mbGFnLCAyLCAyKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVGaXhlZEFycmF5KGxvbmdFbnVtTnVsbGFibGVNYXRyaXgsIF9haWRsX2ZsYWcsIDIsIDIpOworICAgIF9haWRsX3BhcmNlbC53cml0ZUZpeGVkQXJyYXkoYmluZGVyTnVsbGFibGVNYXRyaXgsIF9haWRsX2ZsYWcsIDIsIDIpOworICAgIF9haWRsX3BhcmNlbC53cml0ZUZpeGVkQXJyYXkocGZkTnVsbGFibGVNYXRyaXgsIF9haWRsX2ZsYWcsIDIsIDIpOworICAgIF9haWRsX3BhcmNlbC53cml0ZUZpeGVkQXJyYXkocGFyY2VsYWJsZU51bGxhYmxlTWF0cml4LCBfYWlkbF9mbGFnLCAyLCAyKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVGaXhlZEFycmF5KGludGVyZmFjZU51bGxhYmxlTWF0cml4LCBfYWlkbF9mbGFnLCAyLCAyKTsKKyAgICBpbnQgX2FpZGxfZW5kX3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKKyAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3Bvcyk7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KF9haWRsX2VuZF9wb3MgLSBfYWlkbF9zdGFydF9wb3MpOworICAgIF9haWRsX3BhcmNlbC5zZXREYXRhUG9zaXRpb24oX2FpZGxfZW5kX3Bvcyk7CisgIH0KKyAgcHVibGljIGZpbmFsIHZvaWQgcmVhZEZyb21QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgX2FpZGxfcGFyY2VsKQorICB7CisgICAgaW50IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKKyAgICBpbnQgX2FpZGxfcGFyY2VsYWJsZV9zaXplID0gX2FpZGxfcGFyY2VsLnJlYWRJbnQoKTsKKyAgICB0cnkgeworICAgICAgaWYgKF9haWRsX3BhcmNlbGFibGVfc2l6ZSA8IDQpIHRocm93IG5ldyBhbmRyb2lkLm9zLkJhZFBhcmNlbGFibGVFeGNlcHRpb24oIlBhcmNlbGFibGUgdG9vIHNtYWxsIik7OworICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgIGludDJ4MyA9IF9haWRsX3BhcmNlbC5jcmVhdGVGaXhlZEFycmF5KGludFtdW10uY2xhc3MsIDIsIDMpOworICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgIGJvb2xBcnJheSA9IF9haWRsX3BhcmNlbC5jcmVhdGVGaXhlZEFycmF5KGJvb2xlYW5bXS5jbGFzcywgMik7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgYnl0ZUFycmF5ID0gX2FpZGxfcGFyY2VsLmNyZWF0ZUZpeGVkQXJyYXkoYnl0ZVtdLmNsYXNzLCAyKTsKKyAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICBjaGFyQXJyYXkgPSBfYWlkbF9wYXJjZWwuY3JlYXRlRml4ZWRBcnJheShjaGFyW10uY2xhc3MsIDIpOworICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgIGludEFycmF5ID0gX2FpZGxfcGFyY2VsLmNyZWF0ZUZpeGVkQXJyYXkoaW50W10uY2xhc3MsIDIpOworICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgIGxvbmdBcnJheSA9IF9haWRsX3BhcmNlbC5jcmVhdGVGaXhlZEFycmF5KGxvbmdbXS5jbGFzcywgMik7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgZmxvYXRBcnJheSA9IF9haWRsX3BhcmNlbC5jcmVhdGVGaXhlZEFycmF5KGZsb2F0W10uY2xhc3MsIDIpOworICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgIGRvdWJsZUFycmF5ID0gX2FpZGxfcGFyY2VsLmNyZWF0ZUZpeGVkQXJyYXkoZG91YmxlW10uY2xhc3MsIDIpOworICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgIHN0cmluZ0FycmF5ID0gX2FpZGxfcGFyY2VsLmNyZWF0ZUZpeGVkQXJyYXkoamF2YS5sYW5nLlN0cmluZ1tdLmNsYXNzLCAyKTsKKyAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICBieXRlRW51bUFycmF5ID0gX2FpZGxfcGFyY2VsLmNyZWF0ZUZpeGVkQXJyYXkoYnl0ZVtdLmNsYXNzLCAyKTsKKyAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICBpbnRFbnVtQXJyYXkgPSBfYWlkbF9wYXJjZWwuY3JlYXRlRml4ZWRBcnJheShpbnRbXS5jbGFzcywgMik7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgbG9uZ0VudW1BcnJheSA9IF9haWRsX3BhcmNlbC5jcmVhdGVGaXhlZEFycmF5KGxvbmdbXS5jbGFzcywgMik7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgcGFyY2VsYWJsZUFycmF5ID0gX2FpZGxfcGFyY2VsLmNyZWF0ZUZpeGVkQXJyYXkoYW5kcm9pZC5haWRsLmZpeGVkc2l6ZWFycmF5LkZpeGVkU2l6ZUFycmF5RXhhbXBsZS5JbnRQYXJjZWxhYmxlW10uY2xhc3MsIGFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSW50UGFyY2VsYWJsZS5DUkVBVE9SLCAyKTsKKyAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICBib29sTWF0cml4ID0gX2FpZGxfcGFyY2VsLmNyZWF0ZUZpeGVkQXJyYXkoYm9vbGVhbltdW10uY2xhc3MsIDIsIDIpOworICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgIGJ5dGVNYXRyaXggPSBfYWlkbF9wYXJjZWwuY3JlYXRlRml4ZWRBcnJheShieXRlW11bXS5jbGFzcywgMiwgMik7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgY2hhck1hdHJpeCA9IF9haWRsX3BhcmNlbC5jcmVhdGVGaXhlZEFycmF5KGNoYXJbXVtdLmNsYXNzLCAyLCAyKTsKKyAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICBpbnRNYXRyaXggPSBfYWlkbF9wYXJjZWwuY3JlYXRlRml4ZWRBcnJheShpbnRbXVtdLmNsYXNzLCAyLCAyKTsKKyAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICBsb25nTWF0cml4ID0gX2FpZGxfcGFyY2VsLmNyZWF0ZUZpeGVkQXJyYXkobG9uZ1tdW10uY2xhc3MsIDIsIDIpOworICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgIGZsb2F0TWF0cml4ID0gX2FpZGxfcGFyY2VsLmNyZWF0ZUZpeGVkQXJyYXkoZmxvYXRbXVtdLmNsYXNzLCAyLCAyKTsKKyAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICBkb3VibGVNYXRyaXggPSBfYWlkbF9wYXJjZWwuY3JlYXRlRml4ZWRBcnJheShkb3VibGVbXVtdLmNsYXNzLCAyLCAyKTsKKyAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICBzdHJpbmdNYXRyaXggPSBfYWlkbF9wYXJjZWwuY3JlYXRlRml4ZWRBcnJheShqYXZhLmxhbmcuU3RyaW5nW11bXS5jbGFzcywgMiwgMik7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgYnl0ZUVudW1NYXRyaXggPSBfYWlkbF9wYXJjZWwuY3JlYXRlRml4ZWRBcnJheShieXRlW11bXS5jbGFzcywgMiwgMik7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgaW50RW51bU1hdHJpeCA9IF9haWRsX3BhcmNlbC5jcmVhdGVGaXhlZEFycmF5KGludFtdW10uY2xhc3MsIDIsIDIpOworICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgIGxvbmdFbnVtTWF0cml4ID0gX2FpZGxfcGFyY2VsLmNyZWF0ZUZpeGVkQXJyYXkobG9uZ1tdW10uY2xhc3MsIDIsIDIpOworICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgIHBhcmNlbGFibGVNYXRyaXggPSBfYWlkbF9wYXJjZWwuY3JlYXRlRml4ZWRBcnJheShhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLkludFBhcmNlbGFibGVbXVtdLmNsYXNzLCBhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLkludFBhcmNlbGFibGUuQ1JFQVRPUiwgMiwgMik7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgYm9vbE51bGxhYmxlQXJyYXkgPSBfYWlkbF9wYXJjZWwuY3JlYXRlRml4ZWRBcnJheShib29sZWFuW10uY2xhc3MsIDIpOworICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgIGJ5dGVOdWxsYWJsZUFycmF5ID0gX2FpZGxfcGFyY2VsLmNyZWF0ZUZpeGVkQXJyYXkoYnl0ZVtdLmNsYXNzLCAyKTsKKyAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICBjaGFyTnVsbGFibGVBcnJheSA9IF9haWRsX3BhcmNlbC5jcmVhdGVGaXhlZEFycmF5KGNoYXJbXS5jbGFzcywgMik7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgaW50TnVsbGFibGVBcnJheSA9IF9haWRsX3BhcmNlbC5jcmVhdGVGaXhlZEFycmF5KGludFtdLmNsYXNzLCAyKTsKKyAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICBsb25nTnVsbGFibGVBcnJheSA9IF9haWRsX3BhcmNlbC5jcmVhdGVGaXhlZEFycmF5KGxvbmdbXS5jbGFzcywgMik7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgZmxvYXROdWxsYWJsZUFycmF5ID0gX2FpZGxfcGFyY2VsLmNyZWF0ZUZpeGVkQXJyYXkoZmxvYXRbXS5jbGFzcywgMik7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgZG91YmxlTnVsbGFibGVBcnJheSA9IF9haWRsX3BhcmNlbC5jcmVhdGVGaXhlZEFycmF5KGRvdWJsZVtdLmNsYXNzLCAyKTsKKyAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICBzdHJpbmdOdWxsYWJsZUFycmF5ID0gX2FpZGxfcGFyY2VsLmNyZWF0ZUZpeGVkQXJyYXkoamF2YS5sYW5nLlN0cmluZ1tdLmNsYXNzLCAyKTsKKyAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICBieXRlRW51bU51bGxhYmxlQXJyYXkgPSBfYWlkbF9wYXJjZWwuY3JlYXRlRml4ZWRBcnJheShieXRlW10uY2xhc3MsIDIpOworICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgIGludEVudW1OdWxsYWJsZUFycmF5ID0gX2FpZGxfcGFyY2VsLmNyZWF0ZUZpeGVkQXJyYXkoaW50W10uY2xhc3MsIDIpOworICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgIGxvbmdFbnVtTnVsbGFibGVBcnJheSA9IF9haWRsX3BhcmNlbC5jcmVhdGVGaXhlZEFycmF5KGxvbmdbXS5jbGFzcywgMik7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgYmluZGVyTnVsbGFibGVBcnJheSA9IF9haWRsX3BhcmNlbC5jcmVhdGVGaXhlZEFycmF5KGFuZHJvaWQub3MuSUJpbmRlcltdLmNsYXNzLCAyKTsKKyAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICBwZmROdWxsYWJsZUFycmF5ID0gX2FpZGxfcGFyY2VsLmNyZWF0ZUZpeGVkQXJyYXkoYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcltdLmNsYXNzLCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yLkNSRUFUT1IsIDIpOworICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgIHBhcmNlbGFibGVOdWxsYWJsZUFycmF5ID0gX2FpZGxfcGFyY2VsLmNyZWF0ZUZpeGVkQXJyYXkoYW5kcm9pZC5haWRsLmZpeGVkc2l6ZWFycmF5LkZpeGVkU2l6ZUFycmF5RXhhbXBsZS5JbnRQYXJjZWxhYmxlW10uY2xhc3MsIGFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSW50UGFyY2VsYWJsZS5DUkVBVE9SLCAyKTsKKyAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICBpbnRlcmZhY2VOdWxsYWJsZUFycmF5ID0gX2FpZGxfcGFyY2VsLmNyZWF0ZUZpeGVkQXJyYXkoYW5kcm9pZC5haWRsLmZpeGVkc2l6ZWFycmF5LkZpeGVkU2l6ZUFycmF5RXhhbXBsZS5JRW1wdHlJbnRlcmZhY2VbXS5jbGFzcywgYW5kcm9pZC5haWRsLmZpeGVkc2l6ZWFycmF5LkZpeGVkU2l6ZUFycmF5RXhhbXBsZS5JRW1wdHlJbnRlcmZhY2UuU3R1Yjo6YXNJbnRlcmZhY2UsIDIpOworICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgIGJvb2xOdWxsYWJsZU1hdHJpeCA9IF9haWRsX3BhcmNlbC5jcmVhdGVGaXhlZEFycmF5KGJvb2xlYW5bXVtdLmNsYXNzLCAyLCAyKTsKKyAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICBieXRlTnVsbGFibGVNYXRyaXggPSBfYWlkbF9wYXJjZWwuY3JlYXRlRml4ZWRBcnJheShieXRlW11bXS5jbGFzcywgMiwgMik7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgY2hhck51bGxhYmxlTWF0cml4ID0gX2FpZGxfcGFyY2VsLmNyZWF0ZUZpeGVkQXJyYXkoY2hhcltdW10uY2xhc3MsIDIsIDIpOworICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgIGludE51bGxhYmxlTWF0cml4ID0gX2FpZGxfcGFyY2VsLmNyZWF0ZUZpeGVkQXJyYXkoaW50W11bXS5jbGFzcywgMiwgMik7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgbG9uZ051bGxhYmxlTWF0cml4ID0gX2FpZGxfcGFyY2VsLmNyZWF0ZUZpeGVkQXJyYXkobG9uZ1tdW10uY2xhc3MsIDIsIDIpOworICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgIGZsb2F0TnVsbGFibGVNYXRyaXggPSBfYWlkbF9wYXJjZWwuY3JlYXRlRml4ZWRBcnJheShmbG9hdFtdW10uY2xhc3MsIDIsIDIpOworICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgIGRvdWJsZU51bGxhYmxlTWF0cml4ID0gX2FpZGxfcGFyY2VsLmNyZWF0ZUZpeGVkQXJyYXkoZG91YmxlW11bXS5jbGFzcywgMiwgMik7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgc3RyaW5nTnVsbGFibGVNYXRyaXggPSBfYWlkbF9wYXJjZWwuY3JlYXRlRml4ZWRBcnJheShqYXZhLmxhbmcuU3RyaW5nW11bXS5jbGFzcywgMiwgMik7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgYnl0ZUVudW1OdWxsYWJsZU1hdHJpeCA9IF9haWRsX3BhcmNlbC5jcmVhdGVGaXhlZEFycmF5KGJ5dGVbXVtdLmNsYXNzLCAyLCAyKTsKKyAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICBpbnRFbnVtTnVsbGFibGVNYXRyaXggPSBfYWlkbF9wYXJjZWwuY3JlYXRlRml4ZWRBcnJheShpbnRbXVtdLmNsYXNzLCAyLCAyKTsKKyAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICBsb25nRW51bU51bGxhYmxlTWF0cml4ID0gX2FpZGxfcGFyY2VsLmNyZWF0ZUZpeGVkQXJyYXkobG9uZ1tdW10uY2xhc3MsIDIsIDIpOworICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgIGJpbmRlck51bGxhYmxlTWF0cml4ID0gX2FpZGxfcGFyY2VsLmNyZWF0ZUZpeGVkQXJyYXkoYW5kcm9pZC5vcy5JQmluZGVyW11bXS5jbGFzcywgMiwgMik7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgcGZkTnVsbGFibGVNYXRyaXggPSBfYWlkbF9wYXJjZWwuY3JlYXRlRml4ZWRBcnJheShhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yW11bXS5jbGFzcywgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvci5DUkVBVE9SLCAyLCAyKTsKKyAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICBwYXJjZWxhYmxlTnVsbGFibGVNYXRyaXggPSBfYWlkbF9wYXJjZWwuY3JlYXRlRml4ZWRBcnJheShhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLkludFBhcmNlbGFibGVbXVtdLmNsYXNzLCBhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLkludFBhcmNlbGFibGUuQ1JFQVRPUiwgMiwgMik7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgaW50ZXJmYWNlTnVsbGFibGVNYXRyaXggPSBfYWlkbF9wYXJjZWwuY3JlYXRlRml4ZWRBcnJheShhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLklFbXB0eUludGVyZmFjZVtdW10uY2xhc3MsIGFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSUVtcHR5SW50ZXJmYWNlLlN0dWI6OmFzSW50ZXJmYWNlLCAyLCAyKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgaWYgKF9haWRsX3N0YXJ0X3BvcyA+IChJbnRlZ2VyLk1BWF9WQUxVRSAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkpIHsKKyAgICAgICAgdGhyb3cgbmV3IGFuZHJvaWQub3MuQmFkUGFyY2VsYWJsZUV4Y2VwdGlvbigiT3ZlcmZsb3cgaW4gdGhlIHNpemUgb2YgcGFyY2VsYWJsZSIpOworICAgICAgfQorICAgICAgX2FpZGxfcGFyY2VsLnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIH0KKyAgfQorICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICBqYXZhLnV0aWwuU3RyaW5nSm9pbmVyIF9haWRsX3NqID0gbmV3IGphdmEudXRpbC5TdHJpbmdKb2luZXIoIiwgIiwgInsiLCAifSIpOworICAgIF9haWRsX3NqLmFkZCgiaW50MngzOiAiICsgKGphdmEudXRpbC5BcnJheXMuZGVlcFRvU3RyaW5nKGludDJ4MykpKTsKKyAgICBfYWlkbF9zai5hZGQoImJvb2xBcnJheTogIiArIChqYXZhLnV0aWwuQXJyYXlzLnRvU3RyaW5nKGJvb2xBcnJheSkpKTsKKyAgICBfYWlkbF9zai5hZGQoImJ5dGVBcnJheTogIiArIChqYXZhLnV0aWwuQXJyYXlzLnRvU3RyaW5nKGJ5dGVBcnJheSkpKTsKKyAgICBfYWlkbF9zai5hZGQoImNoYXJBcnJheTogIiArIChqYXZhLnV0aWwuQXJyYXlzLnRvU3RyaW5nKGNoYXJBcnJheSkpKTsKKyAgICBfYWlkbF9zai5hZGQoImludEFycmF5OiAiICsgKGphdmEudXRpbC5BcnJheXMudG9TdHJpbmcoaW50QXJyYXkpKSk7CisgICAgX2FpZGxfc2ouYWRkKCJsb25nQXJyYXk6ICIgKyAoamF2YS51dGlsLkFycmF5cy50b1N0cmluZyhsb25nQXJyYXkpKSk7CisgICAgX2FpZGxfc2ouYWRkKCJmbG9hdEFycmF5OiAiICsgKGphdmEudXRpbC5BcnJheXMudG9TdHJpbmcoZmxvYXRBcnJheSkpKTsKKyAgICBfYWlkbF9zai5hZGQoImRvdWJsZUFycmF5OiAiICsgKGphdmEudXRpbC5BcnJheXMudG9TdHJpbmcoZG91YmxlQXJyYXkpKSk7CisgICAgX2FpZGxfc2ouYWRkKCJzdHJpbmdBcnJheTogIiArIChqYXZhLnV0aWwuQXJyYXlzLnRvU3RyaW5nKHN0cmluZ0FycmF5KSkpOworICAgIF9haWRsX3NqLmFkZCgiYnl0ZUVudW1BcnJheTogIiArIChqYXZhLnV0aWwuQXJyYXlzLnRvU3RyaW5nKGJ5dGVFbnVtQXJyYXkpKSk7CisgICAgX2FpZGxfc2ouYWRkKCJpbnRFbnVtQXJyYXk6ICIgKyAoamF2YS51dGlsLkFycmF5cy50b1N0cmluZyhpbnRFbnVtQXJyYXkpKSk7CisgICAgX2FpZGxfc2ouYWRkKCJsb25nRW51bUFycmF5OiAiICsgKGphdmEudXRpbC5BcnJheXMudG9TdHJpbmcobG9uZ0VudW1BcnJheSkpKTsKKyAgICBfYWlkbF9zai5hZGQoInBhcmNlbGFibGVBcnJheTogIiArIChqYXZhLnV0aWwuQXJyYXlzLnRvU3RyaW5nKHBhcmNlbGFibGVBcnJheSkpKTsKKyAgICBfYWlkbF9zai5hZGQoImJvb2xNYXRyaXg6ICIgKyAoamF2YS51dGlsLkFycmF5cy5kZWVwVG9TdHJpbmcoYm9vbE1hdHJpeCkpKTsKKyAgICBfYWlkbF9zai5hZGQoImJ5dGVNYXRyaXg6ICIgKyAoamF2YS51dGlsLkFycmF5cy5kZWVwVG9TdHJpbmcoYnl0ZU1hdHJpeCkpKTsKKyAgICBfYWlkbF9zai5hZGQoImNoYXJNYXRyaXg6ICIgKyAoamF2YS51dGlsLkFycmF5cy5kZWVwVG9TdHJpbmcoY2hhck1hdHJpeCkpKTsKKyAgICBfYWlkbF9zai5hZGQoImludE1hdHJpeDogIiArIChqYXZhLnV0aWwuQXJyYXlzLmRlZXBUb1N0cmluZyhpbnRNYXRyaXgpKSk7CisgICAgX2FpZGxfc2ouYWRkKCJsb25nTWF0cml4OiAiICsgKGphdmEudXRpbC5BcnJheXMuZGVlcFRvU3RyaW5nKGxvbmdNYXRyaXgpKSk7CisgICAgX2FpZGxfc2ouYWRkKCJmbG9hdE1hdHJpeDogIiArIChqYXZhLnV0aWwuQXJyYXlzLmRlZXBUb1N0cmluZyhmbG9hdE1hdHJpeCkpKTsKKyAgICBfYWlkbF9zai5hZGQoImRvdWJsZU1hdHJpeDogIiArIChqYXZhLnV0aWwuQXJyYXlzLmRlZXBUb1N0cmluZyhkb3VibGVNYXRyaXgpKSk7CisgICAgX2FpZGxfc2ouYWRkKCJzdHJpbmdNYXRyaXg6ICIgKyAoamF2YS51dGlsLkFycmF5cy5kZWVwVG9TdHJpbmcoc3RyaW5nTWF0cml4KSkpOworICAgIF9haWRsX3NqLmFkZCgiYnl0ZUVudW1NYXRyaXg6ICIgKyAoamF2YS51dGlsLkFycmF5cy5kZWVwVG9TdHJpbmcoYnl0ZUVudW1NYXRyaXgpKSk7CisgICAgX2FpZGxfc2ouYWRkKCJpbnRFbnVtTWF0cml4OiAiICsgKGphdmEudXRpbC5BcnJheXMuZGVlcFRvU3RyaW5nKGludEVudW1NYXRyaXgpKSk7CisgICAgX2FpZGxfc2ouYWRkKCJsb25nRW51bU1hdHJpeDogIiArIChqYXZhLnV0aWwuQXJyYXlzLmRlZXBUb1N0cmluZyhsb25nRW51bU1hdHJpeCkpKTsKKyAgICBfYWlkbF9zai5hZGQoInBhcmNlbGFibGVNYXRyaXg6ICIgKyAoamF2YS51dGlsLkFycmF5cy5kZWVwVG9TdHJpbmcocGFyY2VsYWJsZU1hdHJpeCkpKTsKKyAgICBfYWlkbF9zai5hZGQoImJvb2xOdWxsYWJsZUFycmF5OiAiICsgKGphdmEudXRpbC5BcnJheXMudG9TdHJpbmcoYm9vbE51bGxhYmxlQXJyYXkpKSk7CisgICAgX2FpZGxfc2ouYWRkKCJieXRlTnVsbGFibGVBcnJheTogIiArIChqYXZhLnV0aWwuQXJyYXlzLnRvU3RyaW5nKGJ5dGVOdWxsYWJsZUFycmF5KSkpOworICAgIF9haWRsX3NqLmFkZCgiY2hhck51bGxhYmxlQXJyYXk6ICIgKyAoamF2YS51dGlsLkFycmF5cy50b1N0cmluZyhjaGFyTnVsbGFibGVBcnJheSkpKTsKKyAgICBfYWlkbF9zai5hZGQoImludE51bGxhYmxlQXJyYXk6ICIgKyAoamF2YS51dGlsLkFycmF5cy50b1N0cmluZyhpbnROdWxsYWJsZUFycmF5KSkpOworICAgIF9haWRsX3NqLmFkZCgibG9uZ051bGxhYmxlQXJyYXk6ICIgKyAoamF2YS51dGlsLkFycmF5cy50b1N0cmluZyhsb25nTnVsbGFibGVBcnJheSkpKTsKKyAgICBfYWlkbF9zai5hZGQoImZsb2F0TnVsbGFibGVBcnJheTogIiArIChqYXZhLnV0aWwuQXJyYXlzLnRvU3RyaW5nKGZsb2F0TnVsbGFibGVBcnJheSkpKTsKKyAgICBfYWlkbF9zai5hZGQoImRvdWJsZU51bGxhYmxlQXJyYXk6ICIgKyAoamF2YS51dGlsLkFycmF5cy50b1N0cmluZyhkb3VibGVOdWxsYWJsZUFycmF5KSkpOworICAgIF9haWRsX3NqLmFkZCgic3RyaW5nTnVsbGFibGVBcnJheTogIiArIChqYXZhLnV0aWwuQXJyYXlzLnRvU3RyaW5nKHN0cmluZ051bGxhYmxlQXJyYXkpKSk7CisgICAgX2FpZGxfc2ouYWRkKCJieXRlRW51bU51bGxhYmxlQXJyYXk6ICIgKyAoamF2YS51dGlsLkFycmF5cy50b1N0cmluZyhieXRlRW51bU51bGxhYmxlQXJyYXkpKSk7CisgICAgX2FpZGxfc2ouYWRkKCJpbnRFbnVtTnVsbGFibGVBcnJheTogIiArIChqYXZhLnV0aWwuQXJyYXlzLnRvU3RyaW5nKGludEVudW1OdWxsYWJsZUFycmF5KSkpOworICAgIF9haWRsX3NqLmFkZCgibG9uZ0VudW1OdWxsYWJsZUFycmF5OiAiICsgKGphdmEudXRpbC5BcnJheXMudG9TdHJpbmcobG9uZ0VudW1OdWxsYWJsZUFycmF5KSkpOworICAgIF9haWRsX3NqLmFkZCgiYmluZGVyTnVsbGFibGVBcnJheTogIiArIChqYXZhLnV0aWwuQXJyYXlzLnRvU3RyaW5nKGJpbmRlck51bGxhYmxlQXJyYXkpKSk7CisgICAgX2FpZGxfc2ouYWRkKCJwZmROdWxsYWJsZUFycmF5OiAiICsgKGphdmEudXRpbC5BcnJheXMudG9TdHJpbmcocGZkTnVsbGFibGVBcnJheSkpKTsKKyAgICBfYWlkbF9zai5hZGQoInBhcmNlbGFibGVOdWxsYWJsZUFycmF5OiAiICsgKGphdmEudXRpbC5BcnJheXMudG9TdHJpbmcocGFyY2VsYWJsZU51bGxhYmxlQXJyYXkpKSk7CisgICAgX2FpZGxfc2ouYWRkKCJpbnRlcmZhY2VOdWxsYWJsZUFycmF5OiAiICsgKGphdmEudXRpbC5BcnJheXMudG9TdHJpbmcoaW50ZXJmYWNlTnVsbGFibGVBcnJheSkpKTsKKyAgICBfYWlkbF9zai5hZGQoImJvb2xOdWxsYWJsZU1hdHJpeDogIiArIChqYXZhLnV0aWwuQXJyYXlzLmRlZXBUb1N0cmluZyhib29sTnVsbGFibGVNYXRyaXgpKSk7CisgICAgX2FpZGxfc2ouYWRkKCJieXRlTnVsbGFibGVNYXRyaXg6ICIgKyAoamF2YS51dGlsLkFycmF5cy5kZWVwVG9TdHJpbmcoYnl0ZU51bGxhYmxlTWF0cml4KSkpOworICAgIF9haWRsX3NqLmFkZCgiY2hhck51bGxhYmxlTWF0cml4OiAiICsgKGphdmEudXRpbC5BcnJheXMuZGVlcFRvU3RyaW5nKGNoYXJOdWxsYWJsZU1hdHJpeCkpKTsKKyAgICBfYWlkbF9zai5hZGQoImludE51bGxhYmxlTWF0cml4OiAiICsgKGphdmEudXRpbC5BcnJheXMuZGVlcFRvU3RyaW5nKGludE51bGxhYmxlTWF0cml4KSkpOworICAgIF9haWRsX3NqLmFkZCgibG9uZ051bGxhYmxlTWF0cml4OiAiICsgKGphdmEudXRpbC5BcnJheXMuZGVlcFRvU3RyaW5nKGxvbmdOdWxsYWJsZU1hdHJpeCkpKTsKKyAgICBfYWlkbF9zai5hZGQoImZsb2F0TnVsbGFibGVNYXRyaXg6ICIgKyAoamF2YS51dGlsLkFycmF5cy5kZWVwVG9TdHJpbmcoZmxvYXROdWxsYWJsZU1hdHJpeCkpKTsKKyAgICBfYWlkbF9zai5hZGQoImRvdWJsZU51bGxhYmxlTWF0cml4OiAiICsgKGphdmEudXRpbC5BcnJheXMuZGVlcFRvU3RyaW5nKGRvdWJsZU51bGxhYmxlTWF0cml4KSkpOworICAgIF9haWRsX3NqLmFkZCgic3RyaW5nTnVsbGFibGVNYXRyaXg6ICIgKyAoamF2YS51dGlsLkFycmF5cy5kZWVwVG9TdHJpbmcoc3RyaW5nTnVsbGFibGVNYXRyaXgpKSk7CisgICAgX2FpZGxfc2ouYWRkKCJieXRlRW51bU51bGxhYmxlTWF0cml4OiAiICsgKGphdmEudXRpbC5BcnJheXMuZGVlcFRvU3RyaW5nKGJ5dGVFbnVtTnVsbGFibGVNYXRyaXgpKSk7CisgICAgX2FpZGxfc2ouYWRkKCJpbnRFbnVtTnVsbGFibGVNYXRyaXg6ICIgKyAoamF2YS51dGlsLkFycmF5cy5kZWVwVG9TdHJpbmcoaW50RW51bU51bGxhYmxlTWF0cml4KSkpOworICAgIF9haWRsX3NqLmFkZCgibG9uZ0VudW1OdWxsYWJsZU1hdHJpeDogIiArIChqYXZhLnV0aWwuQXJyYXlzLmRlZXBUb1N0cmluZyhsb25nRW51bU51bGxhYmxlTWF0cml4KSkpOworICAgIF9haWRsX3NqLmFkZCgiYmluZGVyTnVsbGFibGVNYXRyaXg6ICIgKyAoamF2YS51dGlsLkFycmF5cy5kZWVwVG9TdHJpbmcoYmluZGVyTnVsbGFibGVNYXRyaXgpKSk7CisgICAgX2FpZGxfc2ouYWRkKCJwZmROdWxsYWJsZU1hdHJpeDogIiArIChqYXZhLnV0aWwuQXJyYXlzLmRlZXBUb1N0cmluZyhwZmROdWxsYWJsZU1hdHJpeCkpKTsKKyAgICBfYWlkbF9zai5hZGQoInBhcmNlbGFibGVOdWxsYWJsZU1hdHJpeDogIiArIChqYXZhLnV0aWwuQXJyYXlzLmRlZXBUb1N0cmluZyhwYXJjZWxhYmxlTnVsbGFibGVNYXRyaXgpKSk7CisgICAgX2FpZGxfc2ouYWRkKCJpbnRlcmZhY2VOdWxsYWJsZU1hdHJpeDogIiArIChqYXZhLnV0aWwuQXJyYXlzLmRlZXBUb1N0cmluZyhpbnRlcmZhY2VOdWxsYWJsZU1hdHJpeCkpKTsKKyAgICByZXR1cm4gImFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUiICsgX2FpZGxfc2oudG9TdHJpbmcoKSAgOworICB9CisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgaW50IF9tYXNrID0gMDsKKyAgICBfbWFzayB8PSBkZXNjcmliZUNvbnRlbnRzKHBhcmNlbGFibGVBcnJheSk7CisgICAgX21hc2sgfD0gZGVzY3JpYmVDb250ZW50cyhwYXJjZWxhYmxlTWF0cml4KTsKKyAgICBfbWFzayB8PSBkZXNjcmliZUNvbnRlbnRzKHBmZE51bGxhYmxlQXJyYXkpOworICAgIF9tYXNrIHw9IGRlc2NyaWJlQ29udGVudHMocGFyY2VsYWJsZU51bGxhYmxlQXJyYXkpOworICAgIF9tYXNrIHw9IGRlc2NyaWJlQ29udGVudHMocGZkTnVsbGFibGVNYXRyaXgpOworICAgIF9tYXNrIHw9IGRlc2NyaWJlQ29udGVudHMocGFyY2VsYWJsZU51bGxhYmxlTWF0cml4KTsKKyAgICByZXR1cm4gX21hc2s7CisgIH0KKyAgcHJpdmF0ZSBpbnQgZGVzY3JpYmVDb250ZW50cyhPYmplY3QgX3YpIHsKKyAgICBpZiAoX3YgPT0gbnVsbCkgcmV0dXJuIDA7CisgICAgaWYgKF92IGluc3RhbmNlb2YgT2JqZWN0W10pIHsKKyAgICAgIGludCBfbWFzayA9IDA7CisgICAgICBmb3IgKE9iamVjdCBvIDogKE9iamVjdFtdKSBfdikgeworICAgICAgICBfbWFzayB8PSBkZXNjcmliZUNvbnRlbnRzKG8pOworICAgICAgfQorICAgICAgcmV0dXJuIF9tYXNrOworICAgIH0KKyAgICBpZiAoX3YgaW5zdGFuY2VvZiBhbmRyb2lkLm9zLlBhcmNlbGFibGUpIHsKKyAgICAgIHJldHVybiAoKGFuZHJvaWQub3MuUGFyY2VsYWJsZSkgX3YpLmRlc2NyaWJlQ29udGVudHMoKTsKKyAgICB9CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcHVibGljIGludGVyZmFjZSBJUmVwZWF0Rml4ZWRTaXplQXJyYXkgZXh0ZW5kcyBhbmRyb2lkLm9zLklJbnRlcmZhY2UKKyAgeworICAgIC8qKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciBJUmVwZWF0Rml4ZWRTaXplQXJyYXkuICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBEZWZhdWx0IGltcGxlbWVudHMgYW5kcm9pZC5haWRsLmZpeGVkc2l6ZWFycmF5LkZpeGVkU2l6ZUFycmF5RXhhbXBsZS5JUmVwZWF0Rml4ZWRTaXplQXJyYXkKKyAgICB7CisgICAgICBAT3ZlcnJpZGUgcHVibGljIGJ5dGVbXSBSZXBlYXRCeXRlcyhieXRlW10gaW5wdXQsIGJ5dGVbXSByZXBlYXRlZCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgICB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgICAgQE92ZXJyaWRlIHB1YmxpYyBpbnRbXSBSZXBlYXRJbnRzKGludFtdIGlucHV0LCBpbnRbXSByZXBlYXRlZCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgICB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgICAgQE92ZXJyaWRlIHB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXJbXSBSZXBlYXRCaW5kZXJzKGFuZHJvaWQub3MuSUJpbmRlcltdIGlucHV0LCBhbmRyb2lkLm9zLklCaW5kZXJbXSByZXBlYXRlZCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgICB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgICAgQE92ZXJyaWRlIHB1YmxpYyBhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLkludFBhcmNlbGFibGVbXSBSZXBlYXRQYXJjZWxhYmxlcyhhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLkludFBhcmNlbGFibGVbXSBpbnB1dCwgYW5kcm9pZC5haWRsLmZpeGVkc2l6ZWFycmF5LkZpeGVkU2l6ZUFycmF5RXhhbXBsZS5JbnRQYXJjZWxhYmxlW10gcmVwZWF0ZWQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgICAgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgYnl0ZVtdW10gUmVwZWF0MmRCeXRlcyhieXRlW11bXSBpbnB1dCwgYnl0ZVtdW10gcmVwZWF0ZWQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgICAgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgaW50W11bXSBSZXBlYXQyZEludHMoaW50W11bXSBpbnB1dCwgaW50W11bXSByZXBlYXRlZCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgICB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgICAgQE92ZXJyaWRlIHB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXJbXVtdIFJlcGVhdDJkQmluZGVycyhhbmRyb2lkLm9zLklCaW5kZXJbXVtdIGlucHV0LCBhbmRyb2lkLm9zLklCaW5kZXJbXVtdIHJlcGVhdGVkKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisgICAgICBAT3ZlcnJpZGUgcHVibGljIGFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSW50UGFyY2VsYWJsZVtdW10gUmVwZWF0MmRQYXJjZWxhYmxlcyhhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLkludFBhcmNlbGFibGVbXVtdIGlucHV0LCBhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLkludFBhcmNlbGFibGVbXVtdIHJlcGVhdGVkKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgIH0KKyAgICAvKiogTG9jYWwtc2lkZSBJUEMgaW1wbGVtZW50YXRpb24gc3R1YiBjbGFzcy4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIFN0dWIgZXh0ZW5kcyBhbmRyb2lkLm9zLkJpbmRlciBpbXBsZW1lbnRzIGFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSVJlcGVhdEZpeGVkU2l6ZUFycmF5CisgICAgeworICAgICAgLyoqIENvbnN0cnVjdCB0aGUgc3R1YiBhdCBhdHRhY2ggaXQgdG8gdGhlIGludGVyZmFjZS4gKi8KKyAgICAgIHB1YmxpYyBTdHViKCkKKyAgICAgIHsKKyAgICAgICAgdGhpcy5hdHRhY2hJbnRlcmZhY2UodGhpcywgREVTQ1JJUFRPUik7CisgICAgICB9CisgICAgICAvKioKKyAgICAgICAqIENhc3QgYW4gSUJpbmRlciBvYmplY3QgaW50byBhbiBhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLklSZXBlYXRGaXhlZFNpemVBcnJheSBpbnRlcmZhY2UsCisgICAgICAgKiBnZW5lcmF0aW5nIGEgcHJveHkgaWYgbmVlZGVkLgorICAgICAgICovCisgICAgICBwdWJsaWMgc3RhdGljIGFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSVJlcGVhdEZpeGVkU2l6ZUFycmF5IGFzSW50ZXJmYWNlKGFuZHJvaWQub3MuSUJpbmRlciBvYmopCisgICAgICB7CisgICAgICAgIGlmICgob2JqPT1udWxsKSkgeworICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIGFuZHJvaWQub3MuSUludGVyZmFjZSBpaW4gPSBvYmoucXVlcnlMb2NhbEludGVyZmFjZShERVNDUklQVE9SKTsKKyAgICAgICAgaWYgKCgoaWluIT1udWxsKSYmKGlpbiBpbnN0YW5jZW9mIGFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSVJlcGVhdEZpeGVkU2l6ZUFycmF5KSkpIHsKKyAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLklSZXBlYXRGaXhlZFNpemVBcnJheSlpaW4pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgYW5kcm9pZC5haWRsLmZpeGVkc2l6ZWFycmF5LkZpeGVkU2l6ZUFycmF5RXhhbXBsZS5JUmVwZWF0Rml4ZWRTaXplQXJyYXkuU3R1Yi5Qcm94eShvYmopOworICAgICAgfQorICAgICAgQE92ZXJyaWRlIHB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKQorICAgICAgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgYm9vbGVhbiBvblRyYW5zYWN0KGludCBjb2RlLCBhbmRyb2lkLm9zLlBhcmNlbCBkYXRhLCBhbmRyb2lkLm9zLlBhcmNlbCByZXBseSwgaW50IGZsYWdzKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICAgIHsKKyAgICAgICAgamF2YS5sYW5nLlN0cmluZyBkZXNjcmlwdG9yID0gREVTQ1JJUFRPUjsKKyAgICAgICAgaWYgKGNvZGUgPj0gYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gJiYgY29kZSA8PSBhbmRyb2lkLm9zLklCaW5kZXIuTEFTVF9DQUxMX1RSQU5TQUNUSU9OKSB7CisgICAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKGRlc2NyaXB0b3IpOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoY29kZSkKKyAgICAgICAgeworICAgICAgICAgIGNhc2UgSU5URVJGQUNFX1RSQU5TQUNUSU9OOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIHJlcGx5LndyaXRlU3RyaW5nKGRlc2NyaXB0b3IpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoY29kZSkKKyAgICAgICAgeworICAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fUmVwZWF0Qnl0ZXM6CisgICAgICAgICAgeworICAgICAgICAgICAgYnl0ZVtdIF9hcmcwOworICAgICAgICAgICAgX2FyZzAgPSBkYXRhLmNyZWF0ZUZpeGVkQXJyYXkoYnl0ZVtdLmNsYXNzLCAzKTsKKyAgICAgICAgICAgIGJ5dGVbXSBfYXJnMTsKKyAgICAgICAgICAgIF9hcmcxID0gbmV3IGJ5dGVbM107CisgICAgICAgICAgICBkYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOworICAgICAgICAgICAgYnl0ZVtdIF9yZXN1bHQgPSB0aGlzLlJlcGVhdEJ5dGVzKF9hcmcwLCBfYXJnMSk7CisgICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgICByZXBseS53cml0ZUZpeGVkQXJyYXkoX3Jlc3VsdCwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLlBBUkNFTEFCTEVfV1JJVEVfUkVUVVJOX1ZBTFVFLCAzKTsKKyAgICAgICAgICAgIHJlcGx5LndyaXRlRml4ZWRBcnJheShfYXJnMSwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLlBBUkNFTEFCTEVfV1JJVEVfUkVUVVJOX1ZBTFVFLCAzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX1JlcGVhdEludHM6CisgICAgICAgICAgeworICAgICAgICAgICAgaW50W10gX2FyZzA7CisgICAgICAgICAgICBfYXJnMCA9IGRhdGEuY3JlYXRlRml4ZWRBcnJheShpbnRbXS5jbGFzcywgMyk7CisgICAgICAgICAgICBpbnRbXSBfYXJnMTsKKyAgICAgICAgICAgIF9hcmcxID0gbmV3IGludFszXTsKKyAgICAgICAgICAgIGRhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7CisgICAgICAgICAgICBpbnRbXSBfcmVzdWx0ID0gdGhpcy5SZXBlYXRJbnRzKF9hcmcwLCBfYXJnMSk7CisgICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgICByZXBseS53cml0ZUZpeGVkQXJyYXkoX3Jlc3VsdCwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLlBBUkNFTEFCTEVfV1JJVEVfUkVUVVJOX1ZBTFVFLCAzKTsKKyAgICAgICAgICAgIHJlcGx5LndyaXRlRml4ZWRBcnJheShfYXJnMSwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLlBBUkNFTEFCTEVfV1JJVEVfUkVUVVJOX1ZBTFVFLCAzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX1JlcGVhdEJpbmRlcnM6CisgICAgICAgICAgeworICAgICAgICAgICAgYW5kcm9pZC5vcy5JQmluZGVyW10gX2FyZzA7CisgICAgICAgICAgICBfYXJnMCA9IGRhdGEuY3JlYXRlRml4ZWRBcnJheShhbmRyb2lkLm9zLklCaW5kZXJbXS5jbGFzcywgMyk7CisgICAgICAgICAgICBhbmRyb2lkLm9zLklCaW5kZXJbXSBfYXJnMTsKKyAgICAgICAgICAgIF9hcmcxID0gbmV3IGFuZHJvaWQub3MuSUJpbmRlclszXTsKKyAgICAgICAgICAgIGRhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7CisgICAgICAgICAgICBhbmRyb2lkLm9zLklCaW5kZXJbXSBfcmVzdWx0ID0gdGhpcy5SZXBlYXRCaW5kZXJzKF9hcmcwLCBfYXJnMSk7CisgICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgICByZXBseS53cml0ZUZpeGVkQXJyYXkoX3Jlc3VsdCwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLlBBUkNFTEFCTEVfV1JJVEVfUkVUVVJOX1ZBTFVFLCAzKTsKKyAgICAgICAgICAgIHJlcGx5LndyaXRlRml4ZWRBcnJheShfYXJnMSwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLlBBUkNFTEFCTEVfV1JJVEVfUkVUVVJOX1ZBTFVFLCAzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX1JlcGVhdFBhcmNlbGFibGVzOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIGFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSW50UGFyY2VsYWJsZVtdIF9hcmcwOworICAgICAgICAgICAgX2FyZzAgPSBkYXRhLmNyZWF0ZUZpeGVkQXJyYXkoYW5kcm9pZC5haWRsLmZpeGVkc2l6ZWFycmF5LkZpeGVkU2l6ZUFycmF5RXhhbXBsZS5JbnRQYXJjZWxhYmxlW10uY2xhc3MsIGFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSW50UGFyY2VsYWJsZS5DUkVBVE9SLCAzKTsKKyAgICAgICAgICAgIGFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSW50UGFyY2VsYWJsZVtdIF9hcmcxOworICAgICAgICAgICAgX2FyZzEgPSBuZXcgYW5kcm9pZC5haWRsLmZpeGVkc2l6ZWFycmF5LkZpeGVkU2l6ZUFycmF5RXhhbXBsZS5JbnRQYXJjZWxhYmxlWzNdOworICAgICAgICAgICAgZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsKKyAgICAgICAgICAgIGFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSW50UGFyY2VsYWJsZVtdIF9yZXN1bHQgPSB0aGlzLlJlcGVhdFBhcmNlbGFibGVzKF9hcmcwLCBfYXJnMSk7CisgICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgICByZXBseS53cml0ZUZpeGVkQXJyYXkoX3Jlc3VsdCwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLlBBUkNFTEFCTEVfV1JJVEVfUkVUVVJOX1ZBTFVFLCAzKTsKKyAgICAgICAgICAgIHJlcGx5LndyaXRlRml4ZWRBcnJheShfYXJnMSwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLlBBUkNFTEFCTEVfV1JJVEVfUkVUVVJOX1ZBTFVFLCAzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX1JlcGVhdDJkQnl0ZXM6CisgICAgICAgICAgeworICAgICAgICAgICAgYnl0ZVtdW10gX2FyZzA7CisgICAgICAgICAgICBfYXJnMCA9IGRhdGEuY3JlYXRlRml4ZWRBcnJheShieXRlW11bXS5jbGFzcywgMiwgMyk7CisgICAgICAgICAgICBieXRlW11bXSBfYXJnMTsKKyAgICAgICAgICAgIF9hcmcxID0gbmV3IGJ5dGVbMl1bM107CisgICAgICAgICAgICBkYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOworICAgICAgICAgICAgYnl0ZVtdW10gX3Jlc3VsdCA9IHRoaXMuUmVwZWF0MmRCeXRlcyhfYXJnMCwgX2FyZzEpOworICAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOworICAgICAgICAgICAgcmVwbHkud3JpdGVGaXhlZEFycmF5KF9yZXN1bHQsIGFuZHJvaWQub3MuUGFyY2VsYWJsZS5QQVJDRUxBQkxFX1dSSVRFX1JFVFVSTl9WQUxVRSwgMiwgMyk7CisgICAgICAgICAgICByZXBseS53cml0ZUZpeGVkQXJyYXkoX2FyZzEsIGFuZHJvaWQub3MuUGFyY2VsYWJsZS5QQVJDRUxBQkxFX1dSSVRFX1JFVFVSTl9WQUxVRSwgMiwgMyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9SZXBlYXQyZEludHM6CisgICAgICAgICAgeworICAgICAgICAgICAgaW50W11bXSBfYXJnMDsKKyAgICAgICAgICAgIF9hcmcwID0gZGF0YS5jcmVhdGVGaXhlZEFycmF5KGludFtdW10uY2xhc3MsIDIsIDMpOworICAgICAgICAgICAgaW50W11bXSBfYXJnMTsKKyAgICAgICAgICAgIF9hcmcxID0gbmV3IGludFsyXVszXTsKKyAgICAgICAgICAgIGRhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7CisgICAgICAgICAgICBpbnRbXVtdIF9yZXN1bHQgPSB0aGlzLlJlcGVhdDJkSW50cyhfYXJnMCwgX2FyZzEpOworICAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOworICAgICAgICAgICAgcmVwbHkud3JpdGVGaXhlZEFycmF5KF9yZXN1bHQsIGFuZHJvaWQub3MuUGFyY2VsYWJsZS5QQVJDRUxBQkxFX1dSSVRFX1JFVFVSTl9WQUxVRSwgMiwgMyk7CisgICAgICAgICAgICByZXBseS53cml0ZUZpeGVkQXJyYXkoX2FyZzEsIGFuZHJvaWQub3MuUGFyY2VsYWJsZS5QQVJDRUxBQkxFX1dSSVRFX1JFVFVSTl9WQUxVRSwgMiwgMyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9SZXBlYXQyZEJpbmRlcnM6CisgICAgICAgICAgeworICAgICAgICAgICAgYW5kcm9pZC5vcy5JQmluZGVyW11bXSBfYXJnMDsKKyAgICAgICAgICAgIF9hcmcwID0gZGF0YS5jcmVhdGVGaXhlZEFycmF5KGFuZHJvaWQub3MuSUJpbmRlcltdW10uY2xhc3MsIDIsIDMpOworICAgICAgICAgICAgYW5kcm9pZC5vcy5JQmluZGVyW11bXSBfYXJnMTsKKyAgICAgICAgICAgIF9hcmcxID0gbmV3IGFuZHJvaWQub3MuSUJpbmRlclsyXVszXTsKKyAgICAgICAgICAgIGRhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7CisgICAgICAgICAgICBhbmRyb2lkLm9zLklCaW5kZXJbXVtdIF9yZXN1bHQgPSB0aGlzLlJlcGVhdDJkQmluZGVycyhfYXJnMCwgX2FyZzEpOworICAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOworICAgICAgICAgICAgcmVwbHkud3JpdGVGaXhlZEFycmF5KF9yZXN1bHQsIGFuZHJvaWQub3MuUGFyY2VsYWJsZS5QQVJDRUxBQkxFX1dSSVRFX1JFVFVSTl9WQUxVRSwgMiwgMyk7CisgICAgICAgICAgICByZXBseS53cml0ZUZpeGVkQXJyYXkoX2FyZzEsIGFuZHJvaWQub3MuUGFyY2VsYWJsZS5QQVJDRUxBQkxFX1dSSVRFX1JFVFVSTl9WQUxVRSwgMiwgMyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9SZXBlYXQyZFBhcmNlbGFibGVzOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIGFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSW50UGFyY2VsYWJsZVtdW10gX2FyZzA7CisgICAgICAgICAgICBfYXJnMCA9IGRhdGEuY3JlYXRlRml4ZWRBcnJheShhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLkludFBhcmNlbGFibGVbXVtdLmNsYXNzLCBhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLkludFBhcmNlbGFibGUuQ1JFQVRPUiwgMiwgMyk7CisgICAgICAgICAgICBhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLkludFBhcmNlbGFibGVbXVtdIF9hcmcxOworICAgICAgICAgICAgX2FyZzEgPSBuZXcgYW5kcm9pZC5haWRsLmZpeGVkc2l6ZWFycmF5LkZpeGVkU2l6ZUFycmF5RXhhbXBsZS5JbnRQYXJjZWxhYmxlWzJdWzNdOworICAgICAgICAgICAgZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsKKyAgICAgICAgICAgIGFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSW50UGFyY2VsYWJsZVtdW10gX3Jlc3VsdCA9IHRoaXMuUmVwZWF0MmRQYXJjZWxhYmxlcyhfYXJnMCwgX2FyZzEpOworICAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOworICAgICAgICAgICAgcmVwbHkud3JpdGVGaXhlZEFycmF5KF9yZXN1bHQsIGFuZHJvaWQub3MuUGFyY2VsYWJsZS5QQVJDRUxBQkxFX1dSSVRFX1JFVFVSTl9WQUxVRSwgMiwgMyk7CisgICAgICAgICAgICByZXBseS53cml0ZUZpeGVkQXJyYXkoX2FyZzEsIGFuZHJvaWQub3MuUGFyY2VsYWJsZS5QQVJDRUxBQkxFX1dSSVRFX1JFVFVSTl9WQUxVRSwgMiwgMyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIub25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFByb3h5IGltcGxlbWVudHMgYW5kcm9pZC5haWRsLmZpeGVkc2l6ZWFycmF5LkZpeGVkU2l6ZUFycmF5RXhhbXBsZS5JUmVwZWF0Rml4ZWRTaXplQXJyYXkKKyAgICAgIHsKKyAgICAgICAgcHJpdmF0ZSBhbmRyb2lkLm9zLklCaW5kZXIgbVJlbW90ZTsKKyAgICAgICAgUHJveHkoYW5kcm9pZC5vcy5JQmluZGVyIHJlbW90ZSkKKyAgICAgICAgeworICAgICAgICAgIG1SZW1vdGUgPSByZW1vdGU7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIG1SZW1vdGU7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gREVTQ1JJUFRPUjsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUgcHVibGljIGJ5dGVbXSBSZXBlYXRCeXRlcyhieXRlW10gaW5wdXQsIGJ5dGVbXSByZXBlYXRlZCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICAgIGJ5dGVbXSBfcmVzdWx0OworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOworICAgICAgICAgICAgX2RhdGEud3JpdGVGaXhlZEFycmF5KGlucHV0LCAwLCAzKTsKKyAgICAgICAgICAgIGJvb2xlYW4gX3N0YXR1cyA9IG1SZW1vdGUudHJhbnNhY3QoU3R1Yi5UUkFOU0FDVElPTl9SZXBlYXRCeXRlcywgX2RhdGEsIF9yZXBseSwgMCk7CisgICAgICAgICAgICBfcmVwbHkucmVhZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgX3Jlc3VsdCA9IF9yZXBseS5jcmVhdGVGaXhlZEFycmF5KGJ5dGVbXS5jbGFzcywgMyk7CisgICAgICAgICAgICBfcmVwbHkucmVhZEZpeGVkQXJyYXkocmVwZWF0ZWQpOworICAgICAgICAgIH0KKyAgICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICAgIF9yZXBseS5yZWN5Y2xlKCk7CisgICAgICAgICAgICBfZGF0YS5yZWN5Y2xlKCk7CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiBfcmVzdWx0OworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgaW50W10gUmVwZWF0SW50cyhpbnRbXSBpbnB1dCwgaW50W10gcmVwZWF0ZWQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgICBpbnRbXSBfcmVzdWx0OworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOworICAgICAgICAgICAgX2RhdGEud3JpdGVGaXhlZEFycmF5KGlucHV0LCAwLCAzKTsKKyAgICAgICAgICAgIGJvb2xlYW4gX3N0YXR1cyA9IG1SZW1vdGUudHJhbnNhY3QoU3R1Yi5UUkFOU0FDVElPTl9SZXBlYXRJbnRzLCBfZGF0YSwgX3JlcGx5LCAwKTsKKyAgICAgICAgICAgIF9yZXBseS5yZWFkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICBfcmVzdWx0ID0gX3JlcGx5LmNyZWF0ZUZpeGVkQXJyYXkoaW50W10uY2xhc3MsIDMpOworICAgICAgICAgICAgX3JlcGx5LnJlYWRGaXhlZEFycmF5KHJlcGVhdGVkKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgICBfcmVwbHkucmVjeWNsZSgpOworICAgICAgICAgICAgX2RhdGEucmVjeWNsZSgpOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gX3Jlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUgcHVibGljIGFuZHJvaWQub3MuSUJpbmRlcltdIFJlcGVhdEJpbmRlcnMoYW5kcm9pZC5vcy5JQmluZGVyW10gaW5wdXQsIGFuZHJvaWQub3MuSUJpbmRlcltdIHJlcGVhdGVkKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgICAgYW5kcm9pZC5vcy5JQmluZGVyW10gX3Jlc3VsdDsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKKyAgICAgICAgICAgIF9kYXRhLndyaXRlRml4ZWRBcnJheShpbnB1dCwgMCwgMyk7CisgICAgICAgICAgICBib29sZWFuIF9zdGF0dXMgPSBtUmVtb3RlLnRyYW5zYWN0KFN0dWIuVFJBTlNBQ1RJT05fUmVwZWF0QmluZGVycywgX2RhdGEsIF9yZXBseSwgMCk7CisgICAgICAgICAgICBfcmVwbHkucmVhZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgX3Jlc3VsdCA9IF9yZXBseS5jcmVhdGVGaXhlZEFycmF5KGFuZHJvaWQub3MuSUJpbmRlcltdLmNsYXNzLCAzKTsKKyAgICAgICAgICAgIF9yZXBseS5yZWFkRml4ZWRBcnJheShyZXBlYXRlZCk7CisgICAgICAgICAgfQorICAgICAgICAgIGZpbmFsbHkgeworICAgICAgICAgICAgX3JlcGx5LnJlY3ljbGUoKTsKKyAgICAgICAgICAgIF9kYXRhLnJlY3ljbGUoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIF9yZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLkludFBhcmNlbGFibGVbXSBSZXBlYXRQYXJjZWxhYmxlcyhhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLkludFBhcmNlbGFibGVbXSBpbnB1dCwgYW5kcm9pZC5haWRsLmZpeGVkc2l6ZWFycmF5LkZpeGVkU2l6ZUFycmF5RXhhbXBsZS5JbnRQYXJjZWxhYmxlW10gcmVwZWF0ZWQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgICBhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLkludFBhcmNlbGFibGVbXSBfcmVzdWx0OworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOworICAgICAgICAgICAgX2RhdGEud3JpdGVGaXhlZEFycmF5KGlucHV0LCAwLCAzKTsKKyAgICAgICAgICAgIGJvb2xlYW4gX3N0YXR1cyA9IG1SZW1vdGUudHJhbnNhY3QoU3R1Yi5UUkFOU0FDVElPTl9SZXBlYXRQYXJjZWxhYmxlcywgX2RhdGEsIF9yZXBseSwgMCk7CisgICAgICAgICAgICBfcmVwbHkucmVhZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgX3Jlc3VsdCA9IF9yZXBseS5jcmVhdGVGaXhlZEFycmF5KGFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSW50UGFyY2VsYWJsZVtdLmNsYXNzLCBhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLkludFBhcmNlbGFibGUuQ1JFQVRPUiwgMyk7CisgICAgICAgICAgICBfcmVwbHkucmVhZEZpeGVkQXJyYXkocmVwZWF0ZWQsIGFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSW50UGFyY2VsYWJsZS5DUkVBVE9SKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgICBfcmVwbHkucmVjeWNsZSgpOworICAgICAgICAgICAgX2RhdGEucmVjeWNsZSgpOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gX3Jlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUgcHVibGljIGJ5dGVbXVtdIFJlcGVhdDJkQnl0ZXMoYnl0ZVtdW10gaW5wdXQsIGJ5dGVbXVtdIHJlcGVhdGVkKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgICAgYnl0ZVtdW10gX3Jlc3VsdDsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKKyAgICAgICAgICAgIF9kYXRhLndyaXRlRml4ZWRBcnJheShpbnB1dCwgMCwgMiwgMyk7CisgICAgICAgICAgICBib29sZWFuIF9zdGF0dXMgPSBtUmVtb3RlLnRyYW5zYWN0KFN0dWIuVFJBTlNBQ1RJT05fUmVwZWF0MmRCeXRlcywgX2RhdGEsIF9yZXBseSwgMCk7CisgICAgICAgICAgICBfcmVwbHkucmVhZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgX3Jlc3VsdCA9IF9yZXBseS5jcmVhdGVGaXhlZEFycmF5KGJ5dGVbXVtdLmNsYXNzLCAyLCAzKTsKKyAgICAgICAgICAgIF9yZXBseS5yZWFkRml4ZWRBcnJheShyZXBlYXRlZCk7CisgICAgICAgICAgfQorICAgICAgICAgIGZpbmFsbHkgeworICAgICAgICAgICAgX3JlcGx5LnJlY3ljbGUoKTsKKyAgICAgICAgICAgIF9kYXRhLnJlY3ljbGUoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIF9yZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBpbnRbXVtdIFJlcGVhdDJkSW50cyhpbnRbXVtdIGlucHV0LCBpbnRbXVtdIHJlcGVhdGVkKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgICAgaW50W11bXSBfcmVzdWx0OworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOworICAgICAgICAgICAgX2RhdGEud3JpdGVGaXhlZEFycmF5KGlucHV0LCAwLCAyLCAzKTsKKyAgICAgICAgICAgIGJvb2xlYW4gX3N0YXR1cyA9IG1SZW1vdGUudHJhbnNhY3QoU3R1Yi5UUkFOU0FDVElPTl9SZXBlYXQyZEludHMsIF9kYXRhLCBfcmVwbHksIDApOworICAgICAgICAgICAgX3JlcGx5LnJlYWRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIF9yZXN1bHQgPSBfcmVwbHkuY3JlYXRlRml4ZWRBcnJheShpbnRbXVtdLmNsYXNzLCAyLCAzKTsKKyAgICAgICAgICAgIF9yZXBseS5yZWFkRml4ZWRBcnJheShyZXBlYXRlZCk7CisgICAgICAgICAgfQorICAgICAgICAgIGZpbmFsbHkgeworICAgICAgICAgICAgX3JlcGx5LnJlY3ljbGUoKTsKKyAgICAgICAgICAgIF9kYXRhLnJlY3ljbGUoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIF9yZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXJbXVtdIFJlcGVhdDJkQmluZGVycyhhbmRyb2lkLm9zLklCaW5kZXJbXVtdIGlucHV0LCBhbmRyb2lkLm9zLklCaW5kZXJbXVtdIHJlcGVhdGVkKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgICAgYW5kcm9pZC5vcy5JQmluZGVyW11bXSBfcmVzdWx0OworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOworICAgICAgICAgICAgX2RhdGEud3JpdGVGaXhlZEFycmF5KGlucHV0LCAwLCAyLCAzKTsKKyAgICAgICAgICAgIGJvb2xlYW4gX3N0YXR1cyA9IG1SZW1vdGUudHJhbnNhY3QoU3R1Yi5UUkFOU0FDVElPTl9SZXBlYXQyZEJpbmRlcnMsIF9kYXRhLCBfcmVwbHksIDApOworICAgICAgICAgICAgX3JlcGx5LnJlYWRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIF9yZXN1bHQgPSBfcmVwbHkuY3JlYXRlRml4ZWRBcnJheShhbmRyb2lkLm9zLklCaW5kZXJbXVtdLmNsYXNzLCAyLCAzKTsKKyAgICAgICAgICAgIF9yZXBseS5yZWFkRml4ZWRBcnJheShyZXBlYXRlZCk7CisgICAgICAgICAgfQorICAgICAgICAgIGZpbmFsbHkgeworICAgICAgICAgICAgX3JlcGx5LnJlY3ljbGUoKTsKKyAgICAgICAgICAgIF9kYXRhLnJlY3ljbGUoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIF9yZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLkludFBhcmNlbGFibGVbXVtdIFJlcGVhdDJkUGFyY2VsYWJsZXMoYW5kcm9pZC5haWRsLmZpeGVkc2l6ZWFycmF5LkZpeGVkU2l6ZUFycmF5RXhhbXBsZS5JbnRQYXJjZWxhYmxlW11bXSBpbnB1dCwgYW5kcm9pZC5haWRsLmZpeGVkc2l6ZWFycmF5LkZpeGVkU2l6ZUFycmF5RXhhbXBsZS5JbnRQYXJjZWxhYmxlW11bXSByZXBlYXRlZCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICAgIGFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSW50UGFyY2VsYWJsZVtdW10gX3Jlc3VsdDsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKKyAgICAgICAgICAgIF9kYXRhLndyaXRlRml4ZWRBcnJheShpbnB1dCwgMCwgMiwgMyk7CisgICAgICAgICAgICBib29sZWFuIF9zdGF0dXMgPSBtUmVtb3RlLnRyYW5zYWN0KFN0dWIuVFJBTlNBQ1RJT05fUmVwZWF0MmRQYXJjZWxhYmxlcywgX2RhdGEsIF9yZXBseSwgMCk7CisgICAgICAgICAgICBfcmVwbHkucmVhZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgX3Jlc3VsdCA9IF9yZXBseS5jcmVhdGVGaXhlZEFycmF5KGFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSW50UGFyY2VsYWJsZVtdW10uY2xhc3MsIGFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSW50UGFyY2VsYWJsZS5DUkVBVE9SLCAyLCAzKTsKKyAgICAgICAgICAgIF9yZXBseS5yZWFkRml4ZWRBcnJheShyZXBlYXRlZCwgYW5kcm9pZC5haWRsLmZpeGVkc2l6ZWFycmF5LkZpeGVkU2l6ZUFycmF5RXhhbXBsZS5JbnRQYXJjZWxhYmxlLkNSRUFUT1IpOworICAgICAgICAgIH0KKyAgICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICAgIF9yZXBseS5yZWN5Y2xlKCk7CisgICAgICAgICAgICBfZGF0YS5yZWN5Y2xlKCk7CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiBfcmVzdWx0OworICAgICAgICB9CisgICAgICB9CisgICAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX1JlcGVhdEJ5dGVzID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMCk7CisgICAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX1JlcGVhdEludHMgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAxKTsKKyAgICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fUmVwZWF0QmluZGVycyA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDIpOworICAgICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9SZXBlYXRQYXJjZWxhYmxlcyA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDMpOworICAgICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9SZXBlYXQyZEJ5dGVzID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNCk7CisgICAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX1JlcGVhdDJkSW50cyA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDUpOworICAgICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9SZXBlYXQyZEJpbmRlcnMgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA2KTsKKyAgICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fUmVwZWF0MmRQYXJjZWxhYmxlcyA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDcpOworICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVTQ1JJUFRPUiA9ICJhbmRyb2lkJGFpZGwkZml4ZWRzaXplYXJyYXkkRml4ZWRTaXplQXJyYXlFeGFtcGxlJElSZXBlYXRGaXhlZFNpemVBcnJheSIucmVwbGFjZSgnJCcsICcuJyk7CisgICAgcHVibGljIGJ5dGVbXSBSZXBlYXRCeXRlcyhieXRlW10gaW5wdXQsIGJ5dGVbXSByZXBlYXRlZCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworICAgIHB1YmxpYyBpbnRbXSBSZXBlYXRJbnRzKGludFtdIGlucHV0LCBpbnRbXSByZXBlYXRlZCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworICAgIHB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXJbXSBSZXBlYXRCaW5kZXJzKGFuZHJvaWQub3MuSUJpbmRlcltdIGlucHV0LCBhbmRyb2lkLm9zLklCaW5kZXJbXSByZXBlYXRlZCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworICAgIHB1YmxpYyBhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLkludFBhcmNlbGFibGVbXSBSZXBlYXRQYXJjZWxhYmxlcyhhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLkludFBhcmNlbGFibGVbXSBpbnB1dCwgYW5kcm9pZC5haWRsLmZpeGVkc2l6ZWFycmF5LkZpeGVkU2l6ZUFycmF5RXhhbXBsZS5JbnRQYXJjZWxhYmxlW10gcmVwZWF0ZWQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKKyAgICBwdWJsaWMgYnl0ZVtdW10gUmVwZWF0MmRCeXRlcyhieXRlW11bXSBpbnB1dCwgYnl0ZVtdW10gcmVwZWF0ZWQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKKyAgICBwdWJsaWMgaW50W11bXSBSZXBlYXQyZEludHMoaW50W11bXSBpbnB1dCwgaW50W11bXSByZXBlYXRlZCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworICAgIHB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXJbXVtdIFJlcGVhdDJkQmluZGVycyhhbmRyb2lkLm9zLklCaW5kZXJbXVtdIGlucHV0LCBhbmRyb2lkLm9zLklCaW5kZXJbXVtdIHJlcGVhdGVkKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CisgICAgcHVibGljIGFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSW50UGFyY2VsYWJsZVtdW10gUmVwZWF0MmRQYXJjZWxhYmxlcyhhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLkludFBhcmNlbGFibGVbXVtdIGlucHV0LCBhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLkludFBhcmNlbGFibGVbXVtdIHJlcGVhdGVkKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CisgIH0KKyAgcHVibGljIHN0YXRpYyBAaW50ZXJmYWNlIEJ5dGVFbnVtIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgQSA9IDA7CisgIH0KKyAgcHVibGljIHN0YXRpYyBAaW50ZXJmYWNlIEludEVudW0geworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEEgPSAwOworICB9CisgIHB1YmxpYyBzdGF0aWMgQGludGVyZmFjZSBMb25nRW51bSB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEEgPSAwTDsKKyAgfQorICBwdWJsaWMgc3RhdGljIGNsYXNzIEludFBhcmNlbGFibGUgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUKKyAgeworICAgIHB1YmxpYyBpbnQgdmFsdWUgPSAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3I8SW50UGFyY2VsYWJsZT4gQ1JFQVRPUiA9IG5ldyBhbmRyb2lkLm9zLlBhcmNlbGFibGUuQ3JlYXRvcjxJbnRQYXJjZWxhYmxlPigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIEludFBhcmNlbGFibGUgY3JlYXRlRnJvbVBhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9zb3VyY2UpIHsKKyAgICAgICAgSW50UGFyY2VsYWJsZSBfYWlkbF9vdXQgPSBuZXcgSW50UGFyY2VsYWJsZSgpOworICAgICAgICBfYWlkbF9vdXQucmVhZEZyb21QYXJjZWwoX2FpZGxfc291cmNlKTsKKyAgICAgICAgcmV0dXJuIF9haWRsX291dDsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIEludFBhcmNlbGFibGVbXSBuZXdBcnJheShpbnQgX2FpZGxfc2l6ZSkgeworICAgICAgICByZXR1cm4gbmV3IEludFBhcmNlbGFibGVbX2FpZGxfc2l6ZV07CisgICAgICB9CisgICAgfTsKKyAgICBAT3ZlcnJpZGUgcHVibGljIGZpbmFsIHZvaWQgd3JpdGVUb1BhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9wYXJjZWwsIGludCBfYWlkbF9mbGFnKQorICAgIHsKKyAgICAgIGludCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCk7CisgICAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoMCk7CisgICAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQodmFsdWUpOworICAgICAgaW50IF9haWRsX2VuZF9wb3MgPSBfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCk7CisgICAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3Bvcyk7CisgICAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgICAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX2VuZF9wb3MpOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgdm9pZCByZWFkRnJvbVBhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9wYXJjZWwpCisgICAgeworICAgICAgaW50IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKKyAgICAgIGludCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSBfYWlkbF9wYXJjZWwucmVhZEludCgpOworICAgICAgdHJ5IHsKKyAgICAgICAgaWYgKF9haWRsX3BhcmNlbGFibGVfc2l6ZSA8IDQpIHRocm93IG5ldyBhbmRyb2lkLm9zLkJhZFBhcmNlbGFibGVFeGNlcHRpb24oIlBhcmNlbGFibGUgdG9vIHNtYWxsIik7OworICAgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgICB2YWx1ZSA9IF9haWRsX3BhcmNlbC5yZWFkSW50KCk7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gKEludGVnZXIuTUFYX1ZBTFVFIC0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSkgeworICAgICAgICAgIHRocm93IG5ldyBhbmRyb2lkLm9zLkJhZFBhcmNlbGFibGVFeGNlcHRpb24oIk92ZXJmbG93IGluIHRoZSBzaXplIG9mIHBhcmNlbGFibGUiKTsKKyAgICAgICAgfQorICAgICAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgICB9CisgICAgfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKKyAgICAgIGlmICh0aGlzID09IG90aGVyKSByZXR1cm4gdHJ1ZTsKKyAgICAgIGlmIChvdGhlciA9PSBudWxsKSByZXR1cm4gZmFsc2U7CisgICAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIEludFBhcmNlbGFibGUpKSByZXR1cm4gZmFsc2U7CisgICAgICBJbnRQYXJjZWxhYmxlIHRoYXQgPSAoSW50UGFyY2VsYWJsZSlvdGhlcjsKKyAgICAgIGlmICghamF2YS51dGlsLk9iamVjdHMuZGVlcEVxdWFscyh2YWx1ZSwgdGhhdC52YWx1ZSkpIHJldHVybiBmYWxzZTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICByZXR1cm4gamF2YS51dGlsLkFycmF5cy5kZWVwSGFzaENvZGUoamF2YS51dGlsLkFycmF5cy5hc0xpc3QodmFsdWUpLnRvQXJyYXkoKSk7CisgICAgfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKKyAgICAgIGludCBfbWFzayA9IDA7CisgICAgICByZXR1cm4gX21hc2s7CisgICAgfQorICB9CisgIHB1YmxpYyBpbnRlcmZhY2UgSUVtcHR5SW50ZXJmYWNlIGV4dGVuZHMgYW5kcm9pZC5vcy5JSW50ZXJmYWNlCisgIHsKKyAgICAvKiogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3IgSUVtcHR5SW50ZXJmYWNlLiAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRGVmYXVsdCBpbXBsZW1lbnRzIGFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSUVtcHR5SW50ZXJmYWNlCisgICAgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICB9CisgICAgLyoqIExvY2FsLXNpZGUgSVBDIGltcGxlbWVudGF0aW9uIHN0dWIgY2xhc3MuICovCisgICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBTdHViIGV4dGVuZHMgYW5kcm9pZC5vcy5CaW5kZXIgaW1wbGVtZW50cyBhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLklFbXB0eUludGVyZmFjZQorICAgIHsKKyAgICAgIC8qKiBDb25zdHJ1Y3QgdGhlIHN0dWIgYXQgYXR0YWNoIGl0IHRvIHRoZSBpbnRlcmZhY2UuICovCisgICAgICBwdWJsaWMgU3R1YigpCisgICAgICB7CisgICAgICAgIHRoaXMuYXR0YWNoSW50ZXJmYWNlKHRoaXMsIERFU0NSSVBUT1IpOworICAgICAgfQorICAgICAgLyoqCisgICAgICAgKiBDYXN0IGFuIElCaW5kZXIgb2JqZWN0IGludG8gYW4gYW5kcm9pZC5haWRsLmZpeGVkc2l6ZWFycmF5LkZpeGVkU2l6ZUFycmF5RXhhbXBsZS5JRW1wdHlJbnRlcmZhY2UgaW50ZXJmYWNlLAorICAgICAgICogZ2VuZXJhdGluZyBhIHByb3h5IGlmIG5lZWRlZC4KKyAgICAgICAqLworICAgICAgcHVibGljIHN0YXRpYyBhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLklFbXB0eUludGVyZmFjZSBhc0ludGVyZmFjZShhbmRyb2lkLm9zLklCaW5kZXIgb2JqKQorICAgICAgeworICAgICAgICBpZiAoKG9iaj09bnVsbCkpIHsKKyAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBhbmRyb2lkLm9zLklJbnRlcmZhY2UgaWluID0gb2JqLnF1ZXJ5TG9jYWxJbnRlcmZhY2UoREVTQ1JJUFRPUik7CisgICAgICAgIGlmICgoKGlpbiE9bnVsbCkmJihpaW4gaW5zdGFuY2VvZiBhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLklFbXB0eUludGVyZmFjZSkpKSB7CisgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5haWRsLmZpeGVkc2l6ZWFycmF5LkZpeGVkU2l6ZUFycmF5RXhhbXBsZS5JRW1wdHlJbnRlcmZhY2UpaWluKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IGFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSUVtcHR5SW50ZXJmYWNlLlN0dWIuUHJveHkob2JqKTsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICB9CisgICAgICBAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gb25UcmFuc2FjdChpbnQgY29kZSwgYW5kcm9pZC5vcy5QYXJjZWwgZGF0YSwgYW5kcm9pZC5vcy5QYXJjZWwgcmVwbHksIGludCBmbGFncykgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgICB7CisgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZGVzY3JpcHRvciA9IERFU0NSSVBUT1I7CisgICAgICAgIHN3aXRjaCAoY29kZSkKKyAgICAgICAgeworICAgICAgICAgIGNhc2UgSU5URVJGQUNFX1RSQU5TQUNUSU9OOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIHJlcGx5LndyaXRlU3RyaW5nKGRlc2NyaXB0b3IpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoY29kZSkKKyAgICAgICAgeworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLm9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFByb3h5IGltcGxlbWVudHMgYW5kcm9pZC5haWRsLmZpeGVkc2l6ZWFycmF5LkZpeGVkU2l6ZUFycmF5RXhhbXBsZS5JRW1wdHlJbnRlcmZhY2UKKyAgICAgIHsKKyAgICAgICAgcHJpdmF0ZSBhbmRyb2lkLm9zLklCaW5kZXIgbVJlbW90ZTsKKyAgICAgICAgUHJveHkoYW5kcm9pZC5vcy5JQmluZGVyIHJlbW90ZSkKKyAgICAgICAgeworICAgICAgICAgIG1SZW1vdGUgPSByZW1vdGU7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIG1SZW1vdGU7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gREVTQ1JJUFRPUjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVTQ1JJUFRPUiA9ICJhbmRyb2lkJGFpZGwkZml4ZWRzaXplYXJyYXkkRml4ZWRTaXplQXJyYXlFeGFtcGxlJElFbXB0eUludGVyZmFjZSIucmVwbGFjZSgnJCcsICcuJyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWZpeGVkc2l6ZWFycmF5LWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvZml4ZWRzaXplYXJyYXkvRml4ZWRTaXplQXJyYXlFeGFtcGxlLmphdmEuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWZpeGVkc2l6ZWFycmF5LWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvZml4ZWRzaXplYXJyYXkvRml4ZWRTaXplQXJyYXlFeGFtcGxlLmphdmEuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWQ2YmRhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtZml4ZWRzaXplYXJyYXktamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9maXhlZHNpemVhcnJheS9GaXhlZFNpemVBcnJheUV4YW1wbGUuamF2YS5kCkBAIC0wLDAgKzEsMiBAQAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1maXhlZHNpemVhcnJheS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2ZpeGVkc2l6ZWFycmF5L0ZpeGVkU2l6ZUFycmF5RXhhbXBsZS5qYXZhIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvZml4ZWRzaXplYXJyYXkvRml4ZWRTaXplQXJyYXlFeGFtcGxlLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi90aW1lc3RhbXAgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1maXhlZHNpemVhcnJheS1qYXZhLXNvdXJjZS9nZW4vdGltZXN0YW1wCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL3RpbWVzdGFtcApjb3B5IHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWZpeGVkc2l6ZWFycmF5LWphdmEtc291cmNlL2dlbi90aW1lc3RhbXAKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWZpeGVkc2l6ZWFycmF5LW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9maXhlZHNpemVhcnJheS9GaXhlZFNpemVBcnJheUV4YW1wbGUuY3BwIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtZml4ZWRzaXplYXJyYXktbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2ZpeGVkc2l6ZWFycmF5L0ZpeGVkU2l6ZUFycmF5RXhhbXBsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBjZGNhZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWZpeGVkc2l6ZWFycmF5LW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9maXhlZHNpemVhcnJheS9GaXhlZFNpemVBcnJheUV4YW1wbGUuY3BwCkBAIC0wLDAgKzEsMTM1MSBAQAorI2luY2x1ZGUgImFpZGwvYW5kcm9pZC9haWRsL2ZpeGVkc2l6ZWFycmF5L0ZpeGVkU2l6ZUFycmF5RXhhbXBsZS5oIgorCisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcGFyY2VsX3V0aWxzLmg+CisKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBmaXhlZHNpemVhcnJheSB7Citjb25zdCBjaGFyKiBGaXhlZFNpemVBcnJheUV4YW1wbGU6OmRlc2NyaXB0b3IgPSAiYW5kcm9pZC5haWRsLmZpeGVkc2l6ZWFycmF5LkZpeGVkU2l6ZUFycmF5RXhhbXBsZSI7CisKK2JpbmRlcl9zdGF0dXNfdCBGaXhlZFNpemVBcnJheUV4YW1wbGU6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIF9haWRsX3BhcmNlbCkgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19PSzsKKyAgaW50MzJfdCBfYWlkbF9zdGFydF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpOworICBpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IDA7CisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihfYWlkbF9wYXJjZWwsICZfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChfYWlkbF9wYXJjZWxhYmxlX3NpemUgPCA0KSByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTsKKyAgaWYgKF9haWRsX3N0YXJ0X3BvcyA+IElOVDMyX01BWCAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuIFNUQVRVU19CQURfVkFMVUU7CisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmaW50MngzKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmJvb2xBcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZieXRlQXJyYXkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmY2hhckFycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmludEFycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmxvbmdBcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZmbG9hdEFycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmRvdWJsZUFycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJnN0cmluZ0FycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmJ5dGVFbnVtQXJyYXkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmaW50RW51bUFycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmxvbmdFbnVtQXJyYXkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmcGFyY2VsYWJsZUFycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmJvb2xNYXRyaXgpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmYnl0ZU1hdHJpeCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZjaGFyTWF0cml4KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmludE1hdHJpeCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZsb25nTWF0cml4KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmZsb2F0TWF0cml4KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmRvdWJsZU1hdHJpeCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZzdHJpbmdNYXRyaXgpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmYnl0ZUVudW1NYXRyaXgpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmaW50RW51bU1hdHJpeCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZsb25nRW51bU1hdHJpeCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZwYXJjZWxhYmxlTWF0cml4KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCAmYm9vbE51bGxhYmxlQXJyYXkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsICZieXRlTnVsbGFibGVBcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgJmNoYXJOdWxsYWJsZUFycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCAmaW50TnVsbGFibGVBcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgJmxvbmdOdWxsYWJsZUFycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCAmZmxvYXROdWxsYWJsZUFycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCAmZG91YmxlTnVsbGFibGVBcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgJnN0cmluZ051bGxhYmxlQXJyYXkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsICZieXRlRW51bU51bGxhYmxlQXJyYXkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsICZpbnRFbnVtTnVsbGFibGVBcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgJmxvbmdFbnVtTnVsbGFibGVBcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgJmJpbmRlck51bGxhYmxlQXJyYXkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsICZwZmROdWxsYWJsZUFycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCAmcGFyY2VsYWJsZU51bGxhYmxlQXJyYXkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsICZpbnRlcmZhY2VOdWxsYWJsZUFycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCAmYm9vbE51bGxhYmxlTWF0cml4KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCAmYnl0ZU51bGxhYmxlTWF0cml4KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCAmY2hhck51bGxhYmxlTWF0cml4KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCAmaW50TnVsbGFibGVNYXRyaXgpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsICZsb25nTnVsbGFibGVNYXRyaXgpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsICZmbG9hdE51bGxhYmxlTWF0cml4KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCAmZG91YmxlTnVsbGFibGVNYXRyaXgpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsICZzdHJpbmdOdWxsYWJsZU1hdHJpeCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgJmJ5dGVFbnVtTnVsbGFibGVNYXRyaXgpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsICZpbnRFbnVtTnVsbGFibGVNYXRyaXgpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsICZsb25nRW51bU51bGxhYmxlTWF0cml4KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCAmYmluZGVyTnVsbGFibGVNYXRyaXgpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsICZwZmROdWxsYWJsZU1hdHJpeCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgJnBhcmNlbGFibGVOdWxsYWJsZU1hdHJpeCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgJmludGVyZmFjZU51bGxhYmxlTWF0cml4KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorYmluZGVyX3N0YXR1c190IEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6d3JpdGVUb1BhcmNlbChBUGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IHsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXM7CisgIHNpemVfdCBfYWlkbF9zdGFydF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpOworICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDMyKF9haWRsX3BhcmNlbCwgMCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGludDJ4Myk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGJvb2xBcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGJ5dGVBcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGNoYXJBcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGludEFycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgbG9uZ0FycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgZmxvYXRBcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGRvdWJsZUFycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgc3RyaW5nQXJyYXkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBieXRlRW51bUFycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgaW50RW51bUFycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgbG9uZ0VudW1BcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIHBhcmNlbGFibGVBcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGJvb2xNYXRyaXgpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBieXRlTWF0cml4KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgY2hhck1hdHJpeCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGludE1hdHJpeCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGxvbmdNYXRyaXgpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBmbG9hdE1hdHJpeCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGRvdWJsZU1hdHJpeCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIHN0cmluZ01hdHJpeCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGJ5dGVFbnVtTWF0cml4KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgaW50RW51bU1hdHJpeCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGxvbmdFbnVtTWF0cml4KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgcGFyY2VsYWJsZU1hdHJpeCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgYm9vbE51bGxhYmxlQXJyYXkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsIGJ5dGVOdWxsYWJsZUFycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCBjaGFyTnVsbGFibGVBcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgaW50TnVsbGFibGVBcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgbG9uZ051bGxhYmxlQXJyYXkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsIGZsb2F0TnVsbGFibGVBcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgZG91YmxlTnVsbGFibGVBcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgc3RyaW5nTnVsbGFibGVBcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgYnl0ZUVudW1OdWxsYWJsZUFycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCBpbnRFbnVtTnVsbGFibGVBcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgbG9uZ0VudW1OdWxsYWJsZUFycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCBiaW5kZXJOdWxsYWJsZUFycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCBwZmROdWxsYWJsZUFycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCBwYXJjZWxhYmxlTnVsbGFibGVBcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgaW50ZXJmYWNlTnVsbGFibGVBcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgYm9vbE51bGxhYmxlTWF0cml4KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCBieXRlTnVsbGFibGVNYXRyaXgpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsIGNoYXJOdWxsYWJsZU1hdHJpeCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgaW50TnVsbGFibGVNYXRyaXgpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsIGxvbmdOdWxsYWJsZU1hdHJpeCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgZmxvYXROdWxsYWJsZU1hdHJpeCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgZG91YmxlTnVsbGFibGVNYXRyaXgpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsIHN0cmluZ051bGxhYmxlTWF0cml4KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCBieXRlRW51bU51bGxhYmxlTWF0cml4KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCBpbnRFbnVtTnVsbGFibGVNYXRyaXgpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsIGxvbmdFbnVtTnVsbGFibGVNYXRyaXgpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsIGJpbmRlck51bGxhYmxlTWF0cml4KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCBwZmROdWxsYWJsZU1hdHJpeCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgcGFyY2VsYWJsZU51bGxhYmxlTWF0cml4KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCBpbnRlcmZhY2VOdWxsYWJsZU1hdHJpeCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgc2l6ZV90IF9haWRsX2VuZF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpOworICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3Bvcyk7CisgIEFQYXJjZWxfd3JpdGVJbnQzMihfYWlkbF9wYXJjZWwsIF9haWRsX2VuZF9wb3MgLSBfYWlkbF9zdGFydF9wb3MpOworICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX2VuZF9wb3MpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KKworfSAgLy8gbmFtZXNwYWNlIGZpeGVkc2l6ZWFycmF5Cit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgZml4ZWRzaXplYXJyYXkgeworc3RhdGljIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9hbmRyb2lkX2FpZGxfZml4ZWRzaXplYXJyYXlfRml4ZWRTaXplQXJyYXlFeGFtcGxlX0lSZXBlYXRGaXhlZFNpemVBcnJheV9vblRyYW5zYWN0KEFJQmluZGVyKiBfYWlkbF9iaW5kZXIsIHRyYW5zYWN0aW9uX2NvZGVfdCBfYWlkbF9jb2RlLCBjb25zdCBBUGFyY2VsKiBfYWlkbF9pbiwgQVBhcmNlbCogX2FpZGxfb3V0KSB7CisgICh2b2lkKV9haWRsX2luOworICAodm9pZClfYWlkbF9vdXQ7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT047CisgIHN0ZDo6c2hhcmVkX3B0cjxGaXhlZFNpemVBcnJheUV4YW1wbGU6OkJuUmVwZWF0Rml4ZWRTaXplQXJyYXk+IF9haWRsX2ltcGwgPSBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpCblJlcGVhdEZpeGVkU2l6ZUFycmF5Pig6Om5kazo6SUNJbnRlcmZhY2U6OmFzSW50ZXJmYWNlKF9haWRsX2JpbmRlcikpOworICBzd2l0Y2ggKF9haWRsX2NvZGUpIHsKKyAgICBjYXNlIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMCAvKlJlcGVhdEJ5dGVzKi8pOiB7CisgICAgICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+IGluX2lucHV0OworICAgICAgc3RkOjphcnJheTx1aW50OF90LCAzPiBvdXRfcmVwZWF0ZWQ7CisgICAgICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+IF9haWRsX3JldHVybjsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX2luLCAmaW5faW5wdXQpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzID0gX2FpZGxfaW1wbC0+UmVwZWF0Qnl0ZXMoaW5faW5wdXQsICZvdXRfcmVwZWF0ZWQsICZfYWlkbF9yZXR1cm4pOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVTdGF0dXNIZWFkZXIoX2FpZGxfb3V0LCBfYWlkbF9zdGF0dXMuZ2V0KCkpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7CisKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIG91dF9yZXBlYXRlZCk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDEgLypSZXBlYXRJbnRzKi8pOiB7CisgICAgICBzdGQ6OmFycmF5PGludDMyX3QsIDM+IGluX2lucHV0OworICAgICAgc3RkOjphcnJheTxpbnQzMl90LCAzPiBvdXRfcmVwZWF0ZWQ7CisgICAgICBzdGQ6OmFycmF5PGludDMyX3QsIDM+IF9haWRsX3JldHVybjsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX2luLCAmaW5faW5wdXQpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzID0gX2FpZGxfaW1wbC0+UmVwZWF0SW50cyhpbl9pbnB1dCwgJm91dF9yZXBlYXRlZCwgJl9haWRsX3JldHVybik7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZVN0YXR1c0hlYWRlcihfYWlkbF9vdXQsIF9haWRsX3N0YXR1cy5nZXQoKSk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBicmVhazsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgb3V0X3JlcGVhdGVkKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMiAvKlJlcGVhdEJpbmRlcnMqLyk6IHsKKyAgICAgIHN0ZDo6YXJyYXk8OjpuZGs6OlNwQUlCaW5kZXIsIDM+IGluX2lucHV0OworICAgICAgc3RkOjphcnJheTw6Om5kazo6U3BBSUJpbmRlciwgMz4gb3V0X3JlcGVhdGVkOworICAgICAgc3RkOjphcnJheTw6Om5kazo6U3BBSUJpbmRlciwgMz4gX2FpZGxfcmV0dXJuOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfaW4sICZpbl9pbnB1dCk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXMgPSBfYWlkbF9pbXBsLT5SZXBlYXRCaW5kZXJzKGluX2lucHV0LCAmb3V0X3JlcGVhdGVkLCAmX2FpZGxfcmV0dXJuKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlU3RhdHVzSGVhZGVyKF9haWRsX291dCwgX2FpZGxfc3RhdHVzLmdldCgpKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBvdXRfcmVwZWF0ZWQpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzIC8qUmVwZWF0UGFyY2VsYWJsZXMqLyk6IHsKKyAgICAgIHN0ZDo6YXJyYXk8OjphaWRsOjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlLCAzPiBpbl9pbnB1dDsKKyAgICAgIHN0ZDo6YXJyYXk8OjphaWRsOjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlLCAzPiBvdXRfcmVwZWF0ZWQ7CisgICAgICBzdGQ6OmFycmF5PDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZSwgMz4gX2FpZGxfcmV0dXJuOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfaW4sICZpbl9pbnB1dCk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXMgPSBfYWlkbF9pbXBsLT5SZXBlYXRQYXJjZWxhYmxlcyhpbl9pbnB1dCwgJm91dF9yZXBlYXRlZCwgJl9haWRsX3JldHVybik7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZVN0YXR1c0hlYWRlcihfYWlkbF9vdXQsIF9haWRsX3N0YXR1cy5nZXQoKSk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBicmVhazsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgb3V0X3JlcGVhdGVkKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNCAvKlJlcGVhdDJkQnl0ZXMqLyk6IHsKKyAgICAgIHN0ZDo6YXJyYXk8c3RkOjphcnJheTx1aW50OF90LCAzPiwgMj4gaW5faW5wdXQ7CisgICAgICBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8dWludDhfdCwgMz4sIDI+IG91dF9yZXBlYXRlZDsKKyAgICAgIHN0ZDo6YXJyYXk8c3RkOjphcnJheTx1aW50OF90LCAzPiwgMj4gX2FpZGxfcmV0dXJuOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfaW4sICZpbl9pbnB1dCk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXMgPSBfYWlkbF9pbXBsLT5SZXBlYXQyZEJ5dGVzKGluX2lucHV0LCAmb3V0X3JlcGVhdGVkLCAmX2FpZGxfcmV0dXJuKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlU3RhdHVzSGVhZGVyKF9haWRsX291dCwgX2FpZGxfc3RhdHVzLmdldCgpKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBvdXRfcmVwZWF0ZWQpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1IC8qUmVwZWF0MmRJbnRzKi8pOiB7CisgICAgICBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8aW50MzJfdCwgMz4sIDI+IGluX2lucHV0OworICAgICAgc3RkOjphcnJheTxzdGQ6OmFycmF5PGludDMyX3QsIDM+LCAyPiBvdXRfcmVwZWF0ZWQ7CisgICAgICBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8aW50MzJfdCwgMz4sIDI+IF9haWRsX3JldHVybjsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX2luLCAmaW5faW5wdXQpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzID0gX2FpZGxfaW1wbC0+UmVwZWF0MmRJbnRzKGluX2lucHV0LCAmb3V0X3JlcGVhdGVkLCAmX2FpZGxfcmV0dXJuKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlU3RhdHVzSGVhZGVyKF9haWRsX291dCwgX2FpZGxfc3RhdHVzLmdldCgpKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBvdXRfcmVwZWF0ZWQpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA2IC8qUmVwZWF0MmRCaW5kZXJzKi8pOiB7CisgICAgICBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjpuZGs6OlNwQUlCaW5kZXIsIDM+LCAyPiBpbl9pbnB1dDsKKyAgICAgIHN0ZDo6YXJyYXk8c3RkOjphcnJheTw6Om5kazo6U3BBSUJpbmRlciwgMz4sIDI+IG91dF9yZXBlYXRlZDsKKyAgICAgIHN0ZDo6YXJyYXk8c3RkOjphcnJheTw6Om5kazo6U3BBSUJpbmRlciwgMz4sIDI+IF9haWRsX3JldHVybjsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX2luLCAmaW5faW5wdXQpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzID0gX2FpZGxfaW1wbC0+UmVwZWF0MmRCaW5kZXJzKGluX2lucHV0LCAmb3V0X3JlcGVhdGVkLCAmX2FpZGxfcmV0dXJuKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlU3RhdHVzSGVhZGVyKF9haWRsX291dCwgX2FpZGxfc3RhdHVzLmdldCgpKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBvdXRfcmVwZWF0ZWQpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA3IC8qUmVwZWF0MmRQYXJjZWxhYmxlcyovKTogeworICAgICAgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZSwgMz4sIDI+IGluX2lucHV0OworICAgICAgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZSwgMz4sIDI+IG91dF9yZXBlYXRlZDsKKyAgICAgIHN0ZDo6YXJyYXk8c3RkOjphcnJheTw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludFBhcmNlbGFibGUsIDM+LCAyPiBfYWlkbF9yZXR1cm47CisKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9pbiwgJmluX2lucHV0KTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1cyA9IF9haWRsX2ltcGwtPlJlcGVhdDJkUGFyY2VsYWJsZXMoaW5faW5wdXQsICZvdXRfcmVwZWF0ZWQsICZfYWlkbF9yZXR1cm4pOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVTdGF0dXNIZWFkZXIoX2FpZGxfb3V0LCBfYWlkbF9zdGF0dXMuZ2V0KCkpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7CisKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIG91dF9yZXBlYXRlZCk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9CisKK3N0YXRpYyBBSUJpbmRlcl9DbGFzcyogX2dfYWlkbF9hbmRyb2lkX2FpZGxfZml4ZWRzaXplYXJyYXlfRml4ZWRTaXplQXJyYXlFeGFtcGxlX0lSZXBlYXRGaXhlZFNpemVBcnJheV9jbGF6eiA9IDo6bmRrOjpJQ0ludGVyZmFjZTo6ZGVmaW5lQ2xhc3MoRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJUmVwZWF0Rml4ZWRTaXplQXJyYXk6OmRlc2NyaXB0b3IsIF9haWRsX2FuZHJvaWRfYWlkbF9maXhlZHNpemVhcnJheV9GaXhlZFNpemVBcnJheUV4YW1wbGVfSVJlcGVhdEZpeGVkU2l6ZUFycmF5X29uVHJhbnNhY3QpOworCitGaXhlZFNpemVBcnJheUV4YW1wbGU6OkJwUmVwZWF0Rml4ZWRTaXplQXJyYXk6OkJwUmVwZWF0Rml4ZWRTaXplQXJyYXkoY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGJpbmRlcikgOiBCcENJbnRlcmZhY2UoYmluZGVyKSB7fQorRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpCcFJlcGVhdEZpeGVkU2l6ZUFycmF5Ojp+QnBSZXBlYXRGaXhlZFNpemVBcnJheSgpIHt9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6QnBSZXBlYXRGaXhlZFNpemVBcnJheTo6UmVwZWF0Qnl0ZXMoY29uc3Qgc3RkOjphcnJheTx1aW50OF90LCAzPiYgaW5faW5wdXQsIHN0ZDo6YXJyYXk8dWludDhfdCwgMz4qIG91dF9yZXBlYXRlZCwgc3RkOjphcnJheTx1aW50OF90LCAzPiogX2FpZGxfcmV0dXJuKSB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX09LOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIDo6bmRrOjpTY29wZWRBUGFyY2VsIF9haWRsX2luOworICA6Om5kazo6U2NvcGVkQVBhcmNlbCBfYWlkbF9vdXQ7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3ByZXBhcmVUcmFuc2FjdGlvbihhc0JpbmRlcigpLmdldCgpLCBfYWlkbF9pbi5nZXRSKCkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5faW5wdXQpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KAorICAgIGFzQmluZGVyKCkuZ2V0KCksCisgICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAwIC8qUmVwZWF0Qnl0ZXMqLyksCisgICAgX2FpZGxfaW4uZ2V0UigpLAorICAgIF9haWRsX291dC5nZXRSKCksCisgICAgMAorICAgICNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgICB8IEZMQUdfUFJJVkFURV9MT0NBTAorICAgICNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgICAgKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgPT0gU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT04gJiYgSVJlcGVhdEZpeGVkU2l6ZUFycmF5OjpnZXREZWZhdWx0SW1wbCgpKSB7CisgICAgX2FpZGxfc3RhdHVzID0gSVJlcGVhdEZpeGVkU2l6ZUFycmF5OjpnZXREZWZhdWx0SW1wbCgpLT5SZXBlYXRCeXRlcyhpbl9pbnB1dCwgb3V0X3JlcGVhdGVkLCBfYWlkbF9yZXR1cm4pOworICAgIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKKyAgfQorICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZFN0YXR1c0hlYWRlcihfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3N0YXR1cy5nZXRSKCkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgb3V0X3JlcGVhdGVkKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX2Vycm9yOgorICBfYWlkbF9zdGF0dXMuc2V0KEFTdGF0dXNfZnJvbVN0YXR1cyhfYWlkbF9yZXRfc3RhdHVzKSk7CisgIF9haWRsX3N0YXR1c19yZXR1cm46CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBGaXhlZFNpemVBcnJheUV4YW1wbGU6OkJwUmVwZWF0Rml4ZWRTaXplQXJyYXk6OlJlcGVhdEludHMoY29uc3Qgc3RkOjphcnJheTxpbnQzMl90LCAzPiYgaW5faW5wdXQsIHN0ZDo6YXJyYXk8aW50MzJfdCwgMz4qIG91dF9yZXBlYXRlZCwgc3RkOjphcnJheTxpbnQzMl90LCAzPiogX2FpZGxfcmV0dXJuKSB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX09LOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIDo6bmRrOjpTY29wZWRBUGFyY2VsIF9haWRsX2luOworICA6Om5kazo6U2NvcGVkQVBhcmNlbCBfYWlkbF9vdXQ7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3ByZXBhcmVUcmFuc2FjdGlvbihhc0JpbmRlcigpLmdldCgpLCBfYWlkbF9pbi5nZXRSKCkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5faW5wdXQpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KAorICAgIGFzQmluZGVyKCkuZ2V0KCksCisgICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAxIC8qUmVwZWF0SW50cyovKSwKKyAgICBfYWlkbF9pbi5nZXRSKCksCisgICAgX2FpZGxfb3V0LmdldFIoKSwKKyAgICAwCisgICAgI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICAgIHwgRkxBR19QUklWQVRFX0xPQ0FMCisgICAgI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgICApOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyA9PSBTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTiAmJiBJUmVwZWF0Rml4ZWRTaXplQXJyYXk6OmdldERlZmF1bHRJbXBsKCkpIHsKKyAgICBfYWlkbF9zdGF0dXMgPSBJUmVwZWF0Rml4ZWRTaXplQXJyYXk6OmdldERlZmF1bHRJbXBsKCktPlJlcGVhdEludHMoaW5faW5wdXQsIG91dF9yZXBlYXRlZCwgX2FpZGxfcmV0dXJuKTsKKyAgICBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47CisgIH0KKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRTdGF0dXNIZWFkZXIoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9zdGF0dXMuZ2V0UigpKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIG91dF9yZXBlYXRlZCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9lcnJvcjoKKyAgX2FpZGxfc3RhdHVzLnNldChBU3RhdHVzX2Zyb21TdGF0dXMoX2FpZGxfcmV0X3N0YXR1cykpOworICBfYWlkbF9zdGF0dXNfcmV0dXJuOgorICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorOjpuZGs6OlNjb3BlZEFTdGF0dXMgRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpCcFJlcGVhdEZpeGVkU2l6ZUFycmF5OjpSZXBlYXRCaW5kZXJzKGNvbnN0IHN0ZDo6YXJyYXk8OjpuZGs6OlNwQUlCaW5kZXIsIDM+JiBpbl9pbnB1dCwgc3RkOjphcnJheTw6Om5kazo6U3BBSUJpbmRlciwgMz4qIG91dF9yZXBlYXRlZCwgc3RkOjphcnJheTw6Om5kazo6U3BBSUJpbmRlciwgMz4qIF9haWRsX3JldHVybikgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19PSzsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOworICA6Om5kazo6U2NvcGVkQVBhcmNlbCBfYWlkbF9pbjsKKyAgOjpuZGs6OlNjb3BlZEFQYXJjZWwgX2FpZGxfb3V0OworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl9wcmVwYXJlVHJhbnNhY3Rpb24oYXNCaW5kZXIoKS5nZXQoKSwgX2FpZGxfaW4uZ2V0UigpKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX2lucHV0KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl90cmFuc2FjdCgKKyAgICBhc0JpbmRlcigpLmdldCgpLAorICAgIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMiAvKlJlcGVhdEJpbmRlcnMqLyksCisgICAgX2FpZGxfaW4uZ2V0UigpLAorICAgIF9haWRsX291dC5nZXRSKCksCisgICAgMAorICAgICNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgICB8IEZMQUdfUFJJVkFURV9MT0NBTAorICAgICNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgICAgKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgPT0gU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT04gJiYgSVJlcGVhdEZpeGVkU2l6ZUFycmF5OjpnZXREZWZhdWx0SW1wbCgpKSB7CisgICAgX2FpZGxfc3RhdHVzID0gSVJlcGVhdEZpeGVkU2l6ZUFycmF5OjpnZXREZWZhdWx0SW1wbCgpLT5SZXBlYXRCaW5kZXJzKGluX2lucHV0LCBvdXRfcmVwZWF0ZWQsIF9haWRsX3JldHVybik7CisgICAgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOworICB9CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkU3RhdHVzSGVhZGVyKF9haWRsX291dC5nZXQoKSwgX2FpZGxfc3RhdHVzLmdldFIoKSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBvdXRfcmVwZWF0ZWQpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfZXJyb3I6CisgIF9haWRsX3N0YXR1cy5zZXQoQVN0YXR1c19mcm9tU3RhdHVzKF9haWRsX3JldF9zdGF0dXMpKTsKKyAgX2FpZGxfc3RhdHVzX3JldHVybjoKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKzo6bmRrOjpTY29wZWRBU3RhdHVzIEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6QnBSZXBlYXRGaXhlZFNpemVBcnJheTo6UmVwZWF0UGFyY2VsYWJsZXMoY29uc3Qgc3RkOjphcnJheTw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludFBhcmNlbGFibGUsIDM+JiBpbl9pbnB1dCwgc3RkOjphcnJheTw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludFBhcmNlbGFibGUsIDM+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6YXJyYXk8OjphaWRsOjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlLCAzPiogX2FpZGxfcmV0dXJuKSB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX09LOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIDo6bmRrOjpTY29wZWRBUGFyY2VsIF9haWRsX2luOworICA6Om5kazo6U2NvcGVkQVBhcmNlbCBfYWlkbF9vdXQ7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3ByZXBhcmVUcmFuc2FjdGlvbihhc0JpbmRlcigpLmdldCgpLCBfYWlkbF9pbi5nZXRSKCkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5faW5wdXQpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KAorICAgIGFzQmluZGVyKCkuZ2V0KCksCisgICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzIC8qUmVwZWF0UGFyY2VsYWJsZXMqLyksCisgICAgX2FpZGxfaW4uZ2V0UigpLAorICAgIF9haWRsX291dC5nZXRSKCksCisgICAgMAorICAgICNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgICB8IEZMQUdfUFJJVkFURV9MT0NBTAorICAgICNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgICAgKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgPT0gU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT04gJiYgSVJlcGVhdEZpeGVkU2l6ZUFycmF5OjpnZXREZWZhdWx0SW1wbCgpKSB7CisgICAgX2FpZGxfc3RhdHVzID0gSVJlcGVhdEZpeGVkU2l6ZUFycmF5OjpnZXREZWZhdWx0SW1wbCgpLT5SZXBlYXRQYXJjZWxhYmxlcyhpbl9pbnB1dCwgb3V0X3JlcGVhdGVkLCBfYWlkbF9yZXR1cm4pOworICAgIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKKyAgfQorICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZFN0YXR1c0hlYWRlcihfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3N0YXR1cy5nZXRSKCkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgb3V0X3JlcGVhdGVkKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX2Vycm9yOgorICBfYWlkbF9zdGF0dXMuc2V0KEFTdGF0dXNfZnJvbVN0YXR1cyhfYWlkbF9yZXRfc3RhdHVzKSk7CisgIF9haWRsX3N0YXR1c19yZXR1cm46CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBGaXhlZFNpemVBcnJheUV4YW1wbGU6OkJwUmVwZWF0Rml4ZWRTaXplQXJyYXk6OlJlcGVhdDJkQnl0ZXMoY29uc3Qgc3RkOjphcnJheTxzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+LCAyPiYgaW5faW5wdXQsIHN0ZDo6YXJyYXk8c3RkOjphcnJheTx1aW50OF90LCAzPiwgMj4qIG91dF9yZXBlYXRlZCwgc3RkOjphcnJheTxzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+LCAyPiogX2FpZGxfcmV0dXJuKSB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX09LOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIDo6bmRrOjpTY29wZWRBUGFyY2VsIF9haWRsX2luOworICA6Om5kazo6U2NvcGVkQVBhcmNlbCBfYWlkbF9vdXQ7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3ByZXBhcmVUcmFuc2FjdGlvbihhc0JpbmRlcigpLmdldCgpLCBfYWlkbF9pbi5nZXRSKCkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5faW5wdXQpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KAorICAgIGFzQmluZGVyKCkuZ2V0KCksCisgICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0IC8qUmVwZWF0MmRCeXRlcyovKSwKKyAgICBfYWlkbF9pbi5nZXRSKCksCisgICAgX2FpZGxfb3V0LmdldFIoKSwKKyAgICAwCisgICAgI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICAgIHwgRkxBR19QUklWQVRFX0xPQ0FMCisgICAgI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgICApOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyA9PSBTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTiAmJiBJUmVwZWF0Rml4ZWRTaXplQXJyYXk6OmdldERlZmF1bHRJbXBsKCkpIHsKKyAgICBfYWlkbF9zdGF0dXMgPSBJUmVwZWF0Rml4ZWRTaXplQXJyYXk6OmdldERlZmF1bHRJbXBsKCktPlJlcGVhdDJkQnl0ZXMoaW5faW5wdXQsIG91dF9yZXBlYXRlZCwgX2FpZGxfcmV0dXJuKTsKKyAgICBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47CisgIH0KKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRTdGF0dXNIZWFkZXIoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9zdGF0dXMuZ2V0UigpKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIG91dF9yZXBlYXRlZCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9lcnJvcjoKKyAgX2FpZGxfc3RhdHVzLnNldChBU3RhdHVzX2Zyb21TdGF0dXMoX2FpZGxfcmV0X3N0YXR1cykpOworICBfYWlkbF9zdGF0dXNfcmV0dXJuOgorICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorOjpuZGs6OlNjb3BlZEFTdGF0dXMgRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpCcFJlcGVhdEZpeGVkU2l6ZUFycmF5OjpSZXBlYXQyZEludHMoY29uc3Qgc3RkOjphcnJheTxzdGQ6OmFycmF5PGludDMyX3QsIDM+LCAyPiYgaW5faW5wdXQsIHN0ZDo6YXJyYXk8c3RkOjphcnJheTxpbnQzMl90LCAzPiwgMj4qIG91dF9yZXBlYXRlZCwgc3RkOjphcnJheTxzdGQ6OmFycmF5PGludDMyX3QsIDM+LCAyPiogX2FpZGxfcmV0dXJuKSB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX09LOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIDo6bmRrOjpTY29wZWRBUGFyY2VsIF9haWRsX2luOworICA6Om5kazo6U2NvcGVkQVBhcmNlbCBfYWlkbF9vdXQ7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3ByZXBhcmVUcmFuc2FjdGlvbihhc0JpbmRlcigpLmdldCgpLCBfYWlkbF9pbi5nZXRSKCkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5faW5wdXQpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KAorICAgIGFzQmluZGVyKCkuZ2V0KCksCisgICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1IC8qUmVwZWF0MmRJbnRzKi8pLAorICAgIF9haWRsX2luLmdldFIoKSwKKyAgICBfYWlkbF9vdXQuZ2V0UigpLAorICAgIDAKKyAgICAjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgICAgfCBGTEFHX1BSSVZBVEVfTE9DQUwKKyAgICAjZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICAgICk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzID09IFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OICYmIElSZXBlYXRGaXhlZFNpemVBcnJheTo6Z2V0RGVmYXVsdEltcGwoKSkgeworICAgIF9haWRsX3N0YXR1cyA9IElSZXBlYXRGaXhlZFNpemVBcnJheTo6Z2V0RGVmYXVsdEltcGwoKS0+UmVwZWF0MmRJbnRzKGluX2lucHV0LCBvdXRfcmVwZWF0ZWQsIF9haWRsX3JldHVybik7CisgICAgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOworICB9CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkU3RhdHVzSGVhZGVyKF9haWRsX291dC5nZXQoKSwgX2FpZGxfc3RhdHVzLmdldFIoKSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBvdXRfcmVwZWF0ZWQpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfZXJyb3I6CisgIF9haWRsX3N0YXR1cy5zZXQoQVN0YXR1c19mcm9tU3RhdHVzKF9haWRsX3JldF9zdGF0dXMpKTsKKyAgX2FpZGxfc3RhdHVzX3JldHVybjoKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKzo6bmRrOjpTY29wZWRBU3RhdHVzIEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6QnBSZXBlYXRGaXhlZFNpemVBcnJheTo6UmVwZWF0MmRCaW5kZXJzKGNvbnN0IHN0ZDo6YXJyYXk8c3RkOjphcnJheTw6Om5kazo6U3BBSUJpbmRlciwgMz4sIDI+JiBpbl9pbnB1dCwgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6bmRrOjpTcEFJQmluZGVyLCAzPiwgMj4qIG91dF9yZXBlYXRlZCwgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6bmRrOjpTcEFJQmluZGVyLCAzPiwgMj4qIF9haWRsX3JldHVybikgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19PSzsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOworICA6Om5kazo6U2NvcGVkQVBhcmNlbCBfYWlkbF9pbjsKKyAgOjpuZGs6OlNjb3BlZEFQYXJjZWwgX2FpZGxfb3V0OworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl9wcmVwYXJlVHJhbnNhY3Rpb24oYXNCaW5kZXIoKS5nZXQoKSwgX2FpZGxfaW4uZ2V0UigpKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX2lucHV0KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl90cmFuc2FjdCgKKyAgICBhc0JpbmRlcigpLmdldCgpLAorICAgIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNiAvKlJlcGVhdDJkQmluZGVycyovKSwKKyAgICBfYWlkbF9pbi5nZXRSKCksCisgICAgX2FpZGxfb3V0LmdldFIoKSwKKyAgICAwCisgICAgI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICAgIHwgRkxBR19QUklWQVRFX0xPQ0FMCisgICAgI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgICApOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyA9PSBTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTiAmJiBJUmVwZWF0Rml4ZWRTaXplQXJyYXk6OmdldERlZmF1bHRJbXBsKCkpIHsKKyAgICBfYWlkbF9zdGF0dXMgPSBJUmVwZWF0Rml4ZWRTaXplQXJyYXk6OmdldERlZmF1bHRJbXBsKCktPlJlcGVhdDJkQmluZGVycyhpbl9pbnB1dCwgb3V0X3JlcGVhdGVkLCBfYWlkbF9yZXR1cm4pOworICAgIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKKyAgfQorICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZFN0YXR1c0hlYWRlcihfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3N0YXR1cy5nZXRSKCkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgb3V0X3JlcGVhdGVkKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX2Vycm9yOgorICBfYWlkbF9zdGF0dXMuc2V0KEFTdGF0dXNfZnJvbVN0YXR1cyhfYWlkbF9yZXRfc3RhdHVzKSk7CisgIF9haWRsX3N0YXR1c19yZXR1cm46CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBGaXhlZFNpemVBcnJheUV4YW1wbGU6OkJwUmVwZWF0Rml4ZWRTaXplQXJyYXk6OlJlcGVhdDJkUGFyY2VsYWJsZXMoY29uc3Qgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZSwgMz4sIDI+JiBpbl9pbnB1dCwgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZSwgMz4sIDI+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6YXJyYXk8c3RkOjphcnJheTw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludFBhcmNlbGFibGUsIDM+LCAyPiogX2FpZGxfcmV0dXJuKSB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX09LOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIDo6bmRrOjpTY29wZWRBUGFyY2VsIF9haWRsX2luOworICA6Om5kazo6U2NvcGVkQVBhcmNlbCBfYWlkbF9vdXQ7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3ByZXBhcmVUcmFuc2FjdGlvbihhc0JpbmRlcigpLmdldCgpLCBfYWlkbF9pbi5nZXRSKCkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5faW5wdXQpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KAorICAgIGFzQmluZGVyKCkuZ2V0KCksCisgICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA3IC8qUmVwZWF0MmRQYXJjZWxhYmxlcyovKSwKKyAgICBfYWlkbF9pbi5nZXRSKCksCisgICAgX2FpZGxfb3V0LmdldFIoKSwKKyAgICAwCisgICAgI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICAgIHwgRkxBR19QUklWQVRFX0xPQ0FMCisgICAgI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgICApOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyA9PSBTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTiAmJiBJUmVwZWF0Rml4ZWRTaXplQXJyYXk6OmdldERlZmF1bHRJbXBsKCkpIHsKKyAgICBfYWlkbF9zdGF0dXMgPSBJUmVwZWF0Rml4ZWRTaXplQXJyYXk6OmdldERlZmF1bHRJbXBsKCktPlJlcGVhdDJkUGFyY2VsYWJsZXMoaW5faW5wdXQsIG91dF9yZXBlYXRlZCwgX2FpZGxfcmV0dXJuKTsKKyAgICBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47CisgIH0KKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRTdGF0dXNIZWFkZXIoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9zdGF0dXMuZ2V0UigpKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIG91dF9yZXBlYXRlZCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9lcnJvcjoKKyAgX2FpZGxfc3RhdHVzLnNldChBU3RhdHVzX2Zyb21TdGF0dXMoX2FpZGxfcmV0X3N0YXR1cykpOworICBfYWlkbF9zdGF0dXNfcmV0dXJuOgorICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorLy8gU291cmNlIGZvciBCblJlcGVhdEZpeGVkU2l6ZUFycmF5CitGaXhlZFNpemVBcnJheUV4YW1wbGU6OkJuUmVwZWF0Rml4ZWRTaXplQXJyYXk6OkJuUmVwZWF0Rml4ZWRTaXplQXJyYXkoKSB7fQorRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpCblJlcGVhdEZpeGVkU2l6ZUFycmF5Ojp+Qm5SZXBlYXRGaXhlZFNpemVBcnJheSgpIHt9Cis6Om5kazo6U3BBSUJpbmRlciBGaXhlZFNpemVBcnJheUV4YW1wbGU6OkJuUmVwZWF0Rml4ZWRTaXplQXJyYXk6OmNyZWF0ZUJpbmRlcigpIHsKKyAgQUlCaW5kZXIqIGJpbmRlciA9IEFJQmluZGVyX25ldyhfZ19haWRsX2FuZHJvaWRfYWlkbF9maXhlZHNpemVhcnJheV9GaXhlZFNpemVBcnJheUV4YW1wbGVfSVJlcGVhdEZpeGVkU2l6ZUFycmF5X2NsYXp6LCBzdGF0aWNfY2FzdDx2b2lkKj4odGhpcykpOworICAjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgIEFJQmluZGVyX21hcmtDb21waWxhdGlvblVuaXRTdGFiaWxpdHkoYmluZGVyKTsKKyAgI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgcmV0dXJuIDo6bmRrOjpTcEFJQmluZGVyKGJpbmRlcik7Cit9CisvLyBTb3VyY2UgZm9yIElSZXBlYXRGaXhlZFNpemVBcnJheQorY29uc3QgY2hhciogRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJUmVwZWF0Rml4ZWRTaXplQXJyYXk6OmRlc2NyaXB0b3IgPSAiYW5kcm9pZC5haWRsLmZpeGVkc2l6ZWFycmF5LkZpeGVkU2l6ZUFycmF5RXhhbXBsZS5JUmVwZWF0Rml4ZWRTaXplQXJyYXkiOworRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJUmVwZWF0Rml4ZWRTaXplQXJyYXk6OklSZXBlYXRGaXhlZFNpemVBcnJheSgpIHt9CitGaXhlZFNpemVBcnJheUV4YW1wbGU6OklSZXBlYXRGaXhlZFNpemVBcnJheTo6fklSZXBlYXRGaXhlZFNpemVBcnJheSgpIHt9CisKKworc3RkOjpzaGFyZWRfcHRyPEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SVJlcGVhdEZpeGVkU2l6ZUFycmF5PiBGaXhlZFNpemVBcnJheUV4YW1wbGU6OklSZXBlYXRGaXhlZFNpemVBcnJheTo6ZnJvbUJpbmRlcihjb25zdCA6Om5kazo6U3BBSUJpbmRlciYgYmluZGVyKSB7CisgIGlmICghQUlCaW5kZXJfYXNzb2NpYXRlQ2xhc3MoYmluZGVyLmdldCgpLCBfZ19haWRsX2FuZHJvaWRfYWlkbF9maXhlZHNpemVhcnJheV9GaXhlZFNpemVBcnJheUV4YW1wbGVfSVJlcGVhdEZpeGVkU2l6ZUFycmF5X2NsYXp6KSkgeyByZXR1cm4gbnVsbHB0cjsgfQorICBzdGQ6OnNoYXJlZF9wdHI8OjpuZGs6OklDSW50ZXJmYWNlPiBpbnRlcmZhY2UgPSA6Om5kazo6SUNJbnRlcmZhY2U6OmFzSW50ZXJmYWNlKGJpbmRlci5nZXQoKSk7CisgIGlmIChpbnRlcmZhY2UpIHsKKyAgICByZXR1cm4gc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PElSZXBlYXRGaXhlZFNpemVBcnJheT4oaW50ZXJmYWNlKTsKKyAgfQorICByZXR1cm4gOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpCcFJlcGVhdEZpeGVkU2l6ZUFycmF5PihiaW5kZXIpOworfQorCitiaW5kZXJfc3RhdHVzX3QgRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJUmVwZWF0Rml4ZWRTaXplQXJyYXk6OndyaXRlVG9QYXJjZWwoQVBhcmNlbCogcGFyY2VsLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVJlcGVhdEZpeGVkU2l6ZUFycmF5PiYgaW5zdGFuY2UpIHsKKyAgcmV0dXJuIEFQYXJjZWxfd3JpdGVTdHJvbmdCaW5kZXIocGFyY2VsLCBpbnN0YW5jZSA/IGluc3RhbmNlLT5hc0JpbmRlcigpLmdldCgpIDogbnVsbHB0cik7Cit9CitiaW5kZXJfc3RhdHVzX3QgRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJUmVwZWF0Rml4ZWRTaXplQXJyYXk6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIHBhcmNlbCwgc3RkOjpzaGFyZWRfcHRyPElSZXBlYXRGaXhlZFNpemVBcnJheT4qIGluc3RhbmNlKSB7CisgIDo6bmRrOjpTcEFJQmluZGVyIGJpbmRlcjsKKyAgYmluZGVyX3N0YXR1c190IHN0YXR1cyA9IEFQYXJjZWxfcmVhZFN0cm9uZ0JpbmRlcihwYXJjZWwsIGJpbmRlci5nZXRSKCkpOworICBpZiAoc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIHN0YXR1czsKKyAgKmluc3RhbmNlID0gSVJlcGVhdEZpeGVkU2l6ZUFycmF5Ojpmcm9tQmluZGVyKGJpbmRlcik7CisgIHJldHVybiBTVEFUVVNfT0s7Cit9Citib29sIEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SVJlcGVhdEZpeGVkU2l6ZUFycmF5OjpzZXREZWZhdWx0SW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVJlcGVhdEZpeGVkU2l6ZUFycmF5PiYgaW1wbCkgeworICAvLyBPbmx5IG9uZSB1c2VyIG9mIHRoaXMgaW50ZXJmYWNlIGNhbiB1c2UgdGhpcyBmdW5jdGlvbgorICAvLyBhdCBhIHRpbWUuIFRoaXMgaXMgYSBoZXVyaXN0aWMgdG8gZGV0ZWN0IGlmIHR3byBkaWZmZXJlbnQKKyAgLy8gdXNlcnMgaW4gdGhlIHNhbWUgcHJvY2VzcyB1c2UgdGhpcyBmdW5jdGlvbi4KKyAgYXNzZXJ0KCFJUmVwZWF0Rml4ZWRTaXplQXJyYXk6OmRlZmF1bHRfaW1wbCk7CisgIGlmIChpbXBsKSB7CisgICAgSVJlcGVhdEZpeGVkU2l6ZUFycmF5OjpkZWZhdWx0X2ltcGwgPSBpbXBsOworICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KK2NvbnN0IHN0ZDo6c2hhcmVkX3B0cjxGaXhlZFNpemVBcnJheUV4YW1wbGU6OklSZXBlYXRGaXhlZFNpemVBcnJheT4mIEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SVJlcGVhdEZpeGVkU2l6ZUFycmF5OjpnZXREZWZhdWx0SW1wbCgpIHsKKyAgcmV0dXJuIElSZXBlYXRGaXhlZFNpemVBcnJheTo6ZGVmYXVsdF9pbXBsOworfQorc3RkOjpzaGFyZWRfcHRyPEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SVJlcGVhdEZpeGVkU2l6ZUFycmF5PiBGaXhlZFNpemVBcnJheUV4YW1wbGU6OklSZXBlYXRGaXhlZFNpemVBcnJheTo6ZGVmYXVsdF9pbXBsID0gbnVsbHB0cjsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SVJlcGVhdEZpeGVkU2l6ZUFycmF5RGVmYXVsdDo6UmVwZWF0Qnl0ZXMoY29uc3Qgc3RkOjphcnJheTx1aW50OF90LCAzPiYgLyppbl9pbnB1dCovLCBzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+KiAvKm91dF9yZXBlYXRlZCovLCBzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+KiAvKl9haWRsX3JldHVybiovKSB7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1czsKKyAgX2FpZGxfc3RhdHVzLnNldChBU3RhdHVzX2Zyb21TdGF0dXMoU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT04pKTsKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKzo6bmRrOjpTY29wZWRBU3RhdHVzIEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SVJlcGVhdEZpeGVkU2l6ZUFycmF5RGVmYXVsdDo6UmVwZWF0SW50cyhjb25zdCBzdGQ6OmFycmF5PGludDMyX3QsIDM+JiAvKmluX2lucHV0Ki8sIHN0ZDo6YXJyYXk8aW50MzJfdCwgMz4qIC8qb3V0X3JlcGVhdGVkKi8sIHN0ZDo6YXJyYXk8aW50MzJfdCwgMz4qIC8qX2FpZGxfcmV0dXJuKi8pIHsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOworICBfYWlkbF9zdGF0dXMuc2V0KEFTdGF0dXNfZnJvbVN0YXR1cyhTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTikpOworICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorOjpuZGs6OlNjb3BlZEFTdGF0dXMgRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJUmVwZWF0Rml4ZWRTaXplQXJyYXlEZWZhdWx0OjpSZXBlYXRCaW5kZXJzKGNvbnN0IHN0ZDo6YXJyYXk8OjpuZGs6OlNwQUlCaW5kZXIsIDM+JiAvKmluX2lucHV0Ki8sIHN0ZDo6YXJyYXk8OjpuZGs6OlNwQUlCaW5kZXIsIDM+KiAvKm91dF9yZXBlYXRlZCovLCBzdGQ6OmFycmF5PDo6bmRrOjpTcEFJQmluZGVyLCAzPiogLypfYWlkbF9yZXR1cm4qLykgeworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIF9haWRsX3N0YXR1cy5zZXQoQVN0YXR1c19mcm9tU3RhdHVzKFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OKSk7CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBGaXhlZFNpemVBcnJheUV4YW1wbGU6OklSZXBlYXRGaXhlZFNpemVBcnJheURlZmF1bHQ6OlJlcGVhdFBhcmNlbGFibGVzKGNvbnN0IHN0ZDo6YXJyYXk8OjphaWRsOjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlLCAzPiYgLyppbl9pbnB1dCovLCBzdGQ6OmFycmF5PDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZSwgMz4qIC8qb3V0X3JlcGVhdGVkKi8sIHN0ZDo6YXJyYXk8OjphaWRsOjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlLCAzPiogLypfYWlkbF9yZXR1cm4qLykgeworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIF9haWRsX3N0YXR1cy5zZXQoQVN0YXR1c19mcm9tU3RhdHVzKFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OKSk7CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBGaXhlZFNpemVBcnJheUV4YW1wbGU6OklSZXBlYXRGaXhlZFNpemVBcnJheURlZmF1bHQ6OlJlcGVhdDJkQnl0ZXMoY29uc3Qgc3RkOjphcnJheTxzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+LCAyPiYgLyppbl9pbnB1dCovLCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8dWludDhfdCwgMz4sIDI+KiAvKm91dF9yZXBlYXRlZCovLCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8dWludDhfdCwgMz4sIDI+KiAvKl9haWRsX3JldHVybiovKSB7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1czsKKyAgX2FpZGxfc3RhdHVzLnNldChBU3RhdHVzX2Zyb21TdGF0dXMoU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT04pKTsKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKzo6bmRrOjpTY29wZWRBU3RhdHVzIEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SVJlcGVhdEZpeGVkU2l6ZUFycmF5RGVmYXVsdDo6UmVwZWF0MmRJbnRzKGNvbnN0IHN0ZDo6YXJyYXk8c3RkOjphcnJheTxpbnQzMl90LCAzPiwgMj4mIC8qaW5faW5wdXQqLywgc3RkOjphcnJheTxzdGQ6OmFycmF5PGludDMyX3QsIDM+LCAyPiogLypvdXRfcmVwZWF0ZWQqLywgc3RkOjphcnJheTxzdGQ6OmFycmF5PGludDMyX3QsIDM+LCAyPiogLypfYWlkbF9yZXR1cm4qLykgeworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIF9haWRsX3N0YXR1cy5zZXQoQVN0YXR1c19mcm9tU3RhdHVzKFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OKSk7CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBGaXhlZFNpemVBcnJheUV4YW1wbGU6OklSZXBlYXRGaXhlZFNpemVBcnJheURlZmF1bHQ6OlJlcGVhdDJkQmluZGVycyhjb25zdCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjpuZGs6OlNwQUlCaW5kZXIsIDM+LCAyPiYgLyppbl9pbnB1dCovLCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjpuZGs6OlNwQUlCaW5kZXIsIDM+LCAyPiogLypvdXRfcmVwZWF0ZWQqLywgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6bmRrOjpTcEFJQmluZGVyLCAzPiwgMj4qIC8qX2FpZGxfcmV0dXJuKi8pIHsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOworICBfYWlkbF9zdGF0dXMuc2V0KEFTdGF0dXNfZnJvbVN0YXR1cyhTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTikpOworICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorOjpuZGs6OlNjb3BlZEFTdGF0dXMgRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJUmVwZWF0Rml4ZWRTaXplQXJyYXlEZWZhdWx0OjpSZXBlYXQyZFBhcmNlbGFibGVzKGNvbnN0IHN0ZDo6YXJyYXk8c3RkOjphcnJheTw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludFBhcmNlbGFibGUsIDM+LCAyPiYgLyppbl9pbnB1dCovLCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjphaWRsOjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlLCAzPiwgMj4qIC8qb3V0X3JlcGVhdGVkKi8sIHN0ZDo6YXJyYXk8c3RkOjphcnJheTw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludFBhcmNlbGFibGUsIDM+LCAyPiogLypfYWlkbF9yZXR1cm4qLykgeworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIF9haWRsX3N0YXR1cy5zZXQoQVN0YXR1c19mcm9tU3RhdHVzKFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OKSk7CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9Cis6Om5kazo6U3BBSUJpbmRlciBGaXhlZFNpemVBcnJheUV4YW1wbGU6OklSZXBlYXRGaXhlZFNpemVBcnJheURlZmF1bHQ6OmFzQmluZGVyKCkgeworICByZXR1cm4gOjpuZGs6OlNwQUlCaW5kZXIoKTsKK30KK2Jvb2wgRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJUmVwZWF0Rml4ZWRTaXplQXJyYXlEZWZhdWx0Ojppc1JlbW90ZSgpIHsKKyAgcmV0dXJuIGZhbHNlOworfQorfSAgLy8gbmFtZXNwYWNlIGZpeGVkc2l6ZWFycmF5Cit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgZml4ZWRzaXplYXJyYXkgeworY29uc3QgY2hhciogRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlOjpkZXNjcmlwdG9yID0gImFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSW50UGFyY2VsYWJsZSI7CisKK2JpbmRlcl9zdGF0dXNfdCBGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludFBhcmNlbGFibGU6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIF9haWRsX3BhcmNlbCkgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19PSzsKKyAgaW50MzJfdCBfYWlkbF9zdGFydF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpOworICBpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IDA7CisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihfYWlkbF9wYXJjZWwsICZfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChfYWlkbF9wYXJjZWxhYmxlX3NpemUgPCA0KSByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTsKKyAgaWYgKF9haWRsX3N0YXJ0X3BvcyA+IElOVDMyX01BWCAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuIFNUQVRVU19CQURfVkFMVUU7CisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmdmFsdWUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9CitiaW5kZXJfc3RhdHVzX3QgRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlOjp3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1czsKKyAgc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIoX2FpZGxfcGFyY2VsLCAwKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgdmFsdWUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIHNpemVfdCBfYWlkbF9lbmRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKTsKKyAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MpOworICBBUGFyY2VsX3dyaXRlSW50MzIoX2FpZGxfcGFyY2VsLCBfYWlkbF9lbmRfcG9zIC0gX2FpZGxfc3RhcnRfcG9zKTsKKyAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9lbmRfcG9zKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBmaXhlZHNpemVhcnJheQorfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGZpeGVkc2l6ZWFycmF5IHsKK3N0YXRpYyBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfYW5kcm9pZF9haWRsX2ZpeGVkc2l6ZWFycmF5X0ZpeGVkU2l6ZUFycmF5RXhhbXBsZV9JRW1wdHlJbnRlcmZhY2Vfb25UcmFuc2FjdChBSUJpbmRlciogX2FpZGxfYmluZGVyLCB0cmFuc2FjdGlvbl9jb2RlX3QgX2FpZGxfY29kZSwgY29uc3QgQVBhcmNlbCogX2FpZGxfaW4sIEFQYXJjZWwqIF9haWRsX291dCkgeworICAodm9pZClfYWlkbF9pbjsKKyAgKHZvaWQpX2FpZGxfb3V0OworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OOworICAodm9pZClfYWlkbF9iaW5kZXI7CisgICh2b2lkKV9haWRsX2NvZGU7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorCitzdGF0aWMgQUlCaW5kZXJfQ2xhc3MqIF9nX2FpZGxfYW5kcm9pZF9haWRsX2ZpeGVkc2l6ZWFycmF5X0ZpeGVkU2l6ZUFycmF5RXhhbXBsZV9JRW1wdHlJbnRlcmZhY2VfY2xhenogPSA6Om5kazo6SUNJbnRlcmZhY2U6OmRlZmluZUNsYXNzKEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SUVtcHR5SW50ZXJmYWNlOjpkZXNjcmlwdG9yLCBfYWlkbF9hbmRyb2lkX2FpZGxfZml4ZWRzaXplYXJyYXlfRml4ZWRTaXplQXJyYXlFeGFtcGxlX0lFbXB0eUludGVyZmFjZV9vblRyYW5zYWN0KTsKKworRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpCcEVtcHR5SW50ZXJmYWNlOjpCcEVtcHR5SW50ZXJmYWNlKGNvbnN0IDo6bmRrOjpTcEFJQmluZGVyJiBiaW5kZXIpIDogQnBDSW50ZXJmYWNlKGJpbmRlcikge30KK0ZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6QnBFbXB0eUludGVyZmFjZTo6fkJwRW1wdHlJbnRlcmZhY2UoKSB7fQorCisvLyBTb3VyY2UgZm9yIEJuRW1wdHlJbnRlcmZhY2UKK0ZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6Qm5FbXB0eUludGVyZmFjZTo6Qm5FbXB0eUludGVyZmFjZSgpIHt9CitGaXhlZFNpemVBcnJheUV4YW1wbGU6OkJuRW1wdHlJbnRlcmZhY2U6On5CbkVtcHR5SW50ZXJmYWNlKCkge30KKzo6bmRrOjpTcEFJQmluZGVyIEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6Qm5FbXB0eUludGVyZmFjZTo6Y3JlYXRlQmluZGVyKCkgeworICBBSUJpbmRlciogYmluZGVyID0gQUlCaW5kZXJfbmV3KF9nX2FpZGxfYW5kcm9pZF9haWRsX2ZpeGVkc2l6ZWFycmF5X0ZpeGVkU2l6ZUFycmF5RXhhbXBsZV9JRW1wdHlJbnRlcmZhY2VfY2xhenosIHN0YXRpY19jYXN0PHZvaWQqPih0aGlzKSk7CisgICNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgQUlCaW5kZXJfbWFya0NvbXBpbGF0aW9uVW5pdFN0YWJpbGl0eShiaW5kZXIpOworICAjZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICByZXR1cm4gOjpuZGs6OlNwQUlCaW5kZXIoYmluZGVyKTsKK30KKy8vIFNvdXJjZSBmb3IgSUVtcHR5SW50ZXJmYWNlCitjb25zdCBjaGFyKiBGaXhlZFNpemVBcnJheUV4YW1wbGU6OklFbXB0eUludGVyZmFjZTo6ZGVzY3JpcHRvciA9ICJhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLklFbXB0eUludGVyZmFjZSI7CitGaXhlZFNpemVBcnJheUV4YW1wbGU6OklFbXB0eUludGVyZmFjZTo6SUVtcHR5SW50ZXJmYWNlKCkge30KK0ZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SUVtcHR5SW50ZXJmYWNlOjp+SUVtcHR5SW50ZXJmYWNlKCkge30KKworCitzdGQ6OnNoYXJlZF9wdHI8Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJRW1wdHlJbnRlcmZhY2U+IEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SUVtcHR5SW50ZXJmYWNlOjpmcm9tQmluZGVyKGNvbnN0IDo6bmRrOjpTcEFJQmluZGVyJiBiaW5kZXIpIHsKKyAgaWYgKCFBSUJpbmRlcl9hc3NvY2lhdGVDbGFzcyhiaW5kZXIuZ2V0KCksIF9nX2FpZGxfYW5kcm9pZF9haWRsX2ZpeGVkc2l6ZWFycmF5X0ZpeGVkU2l6ZUFycmF5RXhhbXBsZV9JRW1wdHlJbnRlcmZhY2VfY2xhenopKSB7IHJldHVybiBudWxscHRyOyB9CisgIHN0ZDo6c2hhcmVkX3B0cjw6Om5kazo6SUNJbnRlcmZhY2U+IGludGVyZmFjZSA9IDo6bmRrOjpJQ0ludGVyZmFjZTo6YXNJbnRlcmZhY2UoYmluZGVyLmdldCgpKTsKKyAgaWYgKGludGVyZmFjZSkgeworICAgIHJldHVybiBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8SUVtcHR5SW50ZXJmYWNlPihpbnRlcmZhY2UpOworICB9CisgIHJldHVybiA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxGaXhlZFNpemVBcnJheUV4YW1wbGU6OkJwRW1wdHlJbnRlcmZhY2U+KGJpbmRlcik7Cit9CisKK2JpbmRlcl9zdGF0dXNfdCBGaXhlZFNpemVBcnJheUV4YW1wbGU6OklFbXB0eUludGVyZmFjZTo6d3JpdGVUb1BhcmNlbChBUGFyY2VsKiBwYXJjZWwsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJRW1wdHlJbnRlcmZhY2U+JiBpbnN0YW5jZSkgeworICByZXR1cm4gQVBhcmNlbF93cml0ZVN0cm9uZ0JpbmRlcihwYXJjZWwsIGluc3RhbmNlID8gaW5zdGFuY2UtPmFzQmluZGVyKCkuZ2V0KCkgOiBudWxscHRyKTsKK30KK2JpbmRlcl9zdGF0dXNfdCBGaXhlZFNpemVBcnJheUV4YW1wbGU6OklFbXB0eUludGVyZmFjZTo6cmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogcGFyY2VsLCBzdGQ6OnNoYXJlZF9wdHI8SUVtcHR5SW50ZXJmYWNlPiogaW5zdGFuY2UpIHsKKyAgOjpuZGs6OlNwQUlCaW5kZXIgYmluZGVyOworICBiaW5kZXJfc3RhdHVzX3Qgc3RhdHVzID0gQVBhcmNlbF9yZWFkU3Ryb25nQmluZGVyKHBhcmNlbCwgYmluZGVyLmdldFIoKSk7CisgIGlmIChzdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gc3RhdHVzOworICAqaW5zdGFuY2UgPSBJRW1wdHlJbnRlcmZhY2U6OmZyb21CaW5kZXIoYmluZGVyKTsKKyAgcmV0dXJuIFNUQVRVU19PSzsKK30KK2Jvb2wgRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJRW1wdHlJbnRlcmZhY2U6OnNldERlZmF1bHRJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJRW1wdHlJbnRlcmZhY2U+JiBpbXBsKSB7CisgIC8vIE9ubHkgb25lIHVzZXIgb2YgdGhpcyBpbnRlcmZhY2UgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uCisgIC8vIGF0IGEgdGltZS4gVGhpcyBpcyBhIGhldXJpc3RpYyB0byBkZXRlY3QgaWYgdHdvIGRpZmZlcmVudAorICAvLyB1c2VycyBpbiB0aGUgc2FtZSBwcm9jZXNzIHVzZSB0aGlzIGZ1bmN0aW9uLgorICBhc3NlcnQoIUlFbXB0eUludGVyZmFjZTo6ZGVmYXVsdF9pbXBsKTsKKyAgaWYgKGltcGwpIHsKKyAgICBJRW1wdHlJbnRlcmZhY2U6OmRlZmF1bHRfaW1wbCA9IGltcGw7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SUVtcHR5SW50ZXJmYWNlPiYgRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJRW1wdHlJbnRlcmZhY2U6OmdldERlZmF1bHRJbXBsKCkgeworICByZXR1cm4gSUVtcHR5SW50ZXJmYWNlOjpkZWZhdWx0X2ltcGw7Cit9CitzdGQ6OnNoYXJlZF9wdHI8Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJRW1wdHlJbnRlcmZhY2U+IEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SUVtcHR5SW50ZXJmYWNlOjpkZWZhdWx0X2ltcGwgPSBudWxscHRyOworOjpuZGs6OlNwQUlCaW5kZXIgRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJRW1wdHlJbnRlcmZhY2VEZWZhdWx0Ojphc0JpbmRlcigpIHsKKyAgcmV0dXJuIDo6bmRrOjpTcEFJQmluZGVyKCk7Cit9Citib29sIEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SUVtcHR5SW50ZXJmYWNlRGVmYXVsdDo6aXNSZW1vdGUoKSB7CisgIHJldHVybiBmYWxzZTsKK30KK30gIC8vIG5hbWVzcGFjZSBmaXhlZHNpemVhcnJheQorfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtZml4ZWRzaXplYXJyYXktbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2ZpeGVkc2l6ZWFycmF5L0ZpeGVkU2l6ZUFycmF5RXhhbXBsZS5jcHAuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWZpeGVkc2l6ZWFycmF5LW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9maXhlZHNpemVhcnJheS9GaXhlZFNpemVBcnJheUV4YW1wbGUuY3BwLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ0MzQ5MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWZpeGVkc2l6ZWFycmF5LW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9maXhlZHNpemVhcnJheS9GaXhlZFNpemVBcnJheUV4YW1wbGUuY3BwLmQKQEAgLTAsMCArMSwyIEBACitvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LWZpeGVkc2l6ZWFycmF5LW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9maXhlZHNpemVhcnJheS9GaXhlZFNpemVBcnJheUV4YW1wbGUuY3BwIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvZml4ZWRzaXplYXJyYXkvRml4ZWRTaXplQXJyYXlFeGFtcGxlLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuRGVwcmVjYXRlZFBhcmNlbGFibGUuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWZpeGVkc2l6ZWFycmF5LW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvZml4ZWRzaXplYXJyYXkvQm5GaXhlZFNpemVBcnJheUV4YW1wbGUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuRGVwcmVjYXRlZFBhcmNlbGFibGUuaApjb3B5IHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWZpeGVkc2l6ZWFycmF5LW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvZml4ZWRzaXplYXJyYXkvQm5GaXhlZFNpemVBcnJheUV4YW1wbGUuaApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBEZXByZWNhdGVkUGFyY2VsYWJsZS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtZml4ZWRzaXplYXJyYXktbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC9maXhlZHNpemVhcnJheS9CcEZpeGVkU2l6ZUFycmF5RXhhbXBsZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBEZXByZWNhdGVkUGFyY2VsYWJsZS5oCmNvcHkgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtZml4ZWRzaXplYXJyYXktbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC9maXhlZHNpemVhcnJheS9CcEZpeGVkU2l6ZUFycmF5RXhhbXBsZS5oCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1maXhlZHNpemVhcnJheS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL2ZpeGVkc2l6ZWFycmF5L0ZpeGVkU2l6ZUFycmF5RXhhbXBsZS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtZml4ZWRzaXplYXJyYXktbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC9maXhlZHNpemVhcnJheS9GaXhlZFNpemVBcnJheUV4YW1wbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWNmMjkyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtZml4ZWRzaXplYXJyYXktbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC9maXhlZHNpemVhcnJheS9GaXhlZFNpemVBcnJheUV4YW1wbGUuaApAQCAtMCwwICsxLDQwMyBAQAorI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxhcnJheT4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxvcHRpb25hbD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2VudW1zLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaWJpbmRlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2ludGVyZmFjZV91dGlscy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3BhcmNlbGFibGVfdXRpbHMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl90b19zdHJpbmcuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC9maXhlZHNpemVhcnJheS9GaXhlZFNpemVBcnJheUV4YW1wbGUuaD4KKyNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9zdGFiaWxpdHkuaD4KKyNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBmaXhlZHNpemVhcnJheSB7CitjbGFzcyBGaXhlZFNpemVBcnJheUV4YW1wbGUgeworcHVibGljOgorICB0eXBlZGVmIHN0ZDo6ZmFsc2VfdHlwZSBmaXhlZF9zaXplOworICBzdGF0aWMgY29uc3QgY2hhciogZGVzY3JpcHRvcjsKKworICBjbGFzcyBJbnRQYXJjZWxhYmxlIHsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgc3RkOjpmYWxzZV90eXBlIGZpeGVkX3NpemU7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGRlc2NyaXB0b3I7CisKKyAgICBpbnQzMl90IHZhbHVlID0gMDsKKworICAgIGJpbmRlcl9zdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBwYXJjZWwpOworICAgIGJpbmRlcl9zdGF0dXNfdCB3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIHBhcmNlbCkgY29uc3Q7CisKKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEludFBhcmNlbGFibGUmIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKHZhbHVlKSAhPSBzdGQ6OnRpZShyaHMudmFsdWUpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgSW50UGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUodmFsdWUpIDwgc3RkOjp0aWUocmhzLnZhbHVlKTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBJbnRQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZSh2YWx1ZSkgPD0gc3RkOjp0aWUocmhzLnZhbHVlKTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBJbnRQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZSh2YWx1ZSkgPT0gc3RkOjp0aWUocmhzLnZhbHVlKTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IEludFBhcmNlbGFibGUmIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKHZhbHVlKSA+IHN0ZDo6dGllKHJocy52YWx1ZSk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgSW50UGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUodmFsdWUpID49IHN0ZDo6dGllKHJocy52YWx1ZSk7CisgICAgfQorCisgICAgc3RhdGljIGNvbnN0IDo6bmRrOjpwYXJjZWxhYmxlX3N0YWJpbGl0eV90IF9haWRsX3N0YWJpbGl0eSA9IDo6bmRrOjpTVEFCSUxJVFlfTE9DQUw7CisgICAgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOworICAgICAgb3MgPDwgIkludFBhcmNlbGFibGV7IjsKKyAgICAgIG9zIDw8ICJ2YWx1ZTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyh2YWx1ZSk7CisgICAgICBvcyA8PCAifSI7CisgICAgICByZXR1cm4gb3Muc3RyKCk7CisgICAgfQorICB9OworICBjbGFzcyBJUmVwZWF0Rml4ZWRTaXplQXJyYXkgOiBwdWJsaWMgOjpuZGs6OklDSW50ZXJmYWNlIHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkZXNjcmlwdG9yOworICAgIElSZXBlYXRGaXhlZFNpemVBcnJheSgpOworICAgIHZpcnR1YWwgfklSZXBlYXRGaXhlZFNpemVBcnJheSgpOworCisgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXBlYXRCeXRlcyA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAwOworICAgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0SW50cyA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAxOworICAgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0QmluZGVycyA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyOworICAgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0UGFyY2VsYWJsZXMgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzsKKyAgICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdDJkQnl0ZXMgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDsKKyAgICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdDJkSW50cyA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1OworICAgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0MmRCaW5kZXJzID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDY7CisgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXBlYXQyZFBhcmNlbGFibGVzID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDc7CisKKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPElSZXBlYXRGaXhlZFNpemVBcnJheT4gZnJvbUJpbmRlcihjb25zdCA6Om5kazo6U3BBSUJpbmRlciYgYmluZGVyKTsKKyAgICBzdGF0aWMgYmluZGVyX3N0YXR1c190IHdyaXRlVG9QYXJjZWwoQVBhcmNlbCogcGFyY2VsLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVJlcGVhdEZpeGVkU2l6ZUFycmF5PiYgaW5zdGFuY2UpOworICAgIHN0YXRpYyBiaW5kZXJfc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogcGFyY2VsLCBzdGQ6OnNoYXJlZF9wdHI8SVJlcGVhdEZpeGVkU2l6ZUFycmF5PiogaW5zdGFuY2UpOworICAgIHN0YXRpYyBib29sIHNldERlZmF1bHRJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJUmVwZWF0Rml4ZWRTaXplQXJyYXk+JiBpbXBsKTsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElSZXBlYXRGaXhlZFNpemVBcnJheT4mIGdldERlZmF1bHRJbXBsKCk7CisgICAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXRCeXRlcyhjb25zdCBzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+JiBpbl9pbnB1dCwgc3RkOjphcnJheTx1aW50OF90LCAzPiogb3V0X3JlcGVhdGVkLCBzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+KiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdEludHMoY29uc3Qgc3RkOjphcnJheTxpbnQzMl90LCAzPiYgaW5faW5wdXQsIHN0ZDo6YXJyYXk8aW50MzJfdCwgMz4qIG91dF9yZXBlYXRlZCwgc3RkOjphcnJheTxpbnQzMl90LCAzPiogX2FpZGxfcmV0dXJuKSA9IDA7CisgICAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXRCaW5kZXJzKGNvbnN0IHN0ZDo6YXJyYXk8OjpuZGs6OlNwQUlCaW5kZXIsIDM+JiBpbl9pbnB1dCwgc3RkOjphcnJheTw6Om5kazo6U3BBSUJpbmRlciwgMz4qIG91dF9yZXBlYXRlZCwgc3RkOjphcnJheTw6Om5kazo6U3BBSUJpbmRlciwgMz4qIF9haWRsX3JldHVybikgPSAwOworICAgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0UGFyY2VsYWJsZXMoY29uc3Qgc3RkOjphcnJheTw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludFBhcmNlbGFibGUsIDM+JiBpbl9pbnB1dCwgc3RkOjphcnJheTw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludFBhcmNlbGFibGUsIDM+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6YXJyYXk8OjphaWRsOjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlLCAzPiogX2FpZGxfcmV0dXJuKSA9IDA7CisgICAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXQyZEJ5dGVzKGNvbnN0IHN0ZDo6YXJyYXk8c3RkOjphcnJheTx1aW50OF90LCAzPiwgMj4mIGluX2lucHV0LCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8dWludDhfdCwgMz4sIDI+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6YXJyYXk8c3RkOjphcnJheTx1aW50OF90LCAzPiwgMj4qIF9haWRsX3JldHVybikgPSAwOworICAgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0MmRJbnRzKGNvbnN0IHN0ZDo6YXJyYXk8c3RkOjphcnJheTxpbnQzMl90LCAzPiwgMj4mIGluX2lucHV0LCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8aW50MzJfdCwgMz4sIDI+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6YXJyYXk8c3RkOjphcnJheTxpbnQzMl90LCAzPiwgMj4qIF9haWRsX3JldHVybikgPSAwOworICAgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0MmRCaW5kZXJzKGNvbnN0IHN0ZDo6YXJyYXk8c3RkOjphcnJheTw6Om5kazo6U3BBSUJpbmRlciwgMz4sIDI+JiBpbl9pbnB1dCwgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6bmRrOjpTcEFJQmluZGVyLCAzPiwgMj4qIG91dF9yZXBlYXRlZCwgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6bmRrOjpTcEFJQmluZGVyLCAzPiwgMj4qIF9haWRsX3JldHVybikgPSAwOworICAgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0MmRQYXJjZWxhYmxlcyhjb25zdCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjphaWRsOjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlLCAzPiwgMj4mIGluX2lucHV0LCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjphaWRsOjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlLCAzPiwgMj4qIG91dF9yZXBlYXRlZCwgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZSwgMz4sIDI+KiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgcHJpdmF0ZToKKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPElSZXBlYXRGaXhlZFNpemVBcnJheT4gZGVmYXVsdF9pbXBsOworICB9OworICBjbGFzcyBJUmVwZWF0Rml4ZWRTaXplQXJyYXlEZWZhdWx0IDogcHVibGljIElSZXBlYXRGaXhlZFNpemVBcnJheSB7CisgIHB1YmxpYzoKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXRCeXRlcyhjb25zdCBzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+JiBpbl9pbnB1dCwgc3RkOjphcnJheTx1aW50OF90LCAzPiogb3V0X3JlcGVhdGVkLCBzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdEludHMoY29uc3Qgc3RkOjphcnJheTxpbnQzMl90LCAzPiYgaW5faW5wdXQsIHN0ZDo6YXJyYXk8aW50MzJfdCwgMz4qIG91dF9yZXBlYXRlZCwgc3RkOjphcnJheTxpbnQzMl90LCAzPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXRCaW5kZXJzKGNvbnN0IHN0ZDo6YXJyYXk8OjpuZGs6OlNwQUlCaW5kZXIsIDM+JiBpbl9pbnB1dCwgc3RkOjphcnJheTw6Om5kazo6U3BBSUJpbmRlciwgMz4qIG91dF9yZXBlYXRlZCwgc3RkOjphcnJheTw6Om5kazo6U3BBSUJpbmRlciwgMz4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0UGFyY2VsYWJsZXMoY29uc3Qgc3RkOjphcnJheTw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludFBhcmNlbGFibGUsIDM+JiBpbl9pbnB1dCwgc3RkOjphcnJheTw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludFBhcmNlbGFibGUsIDM+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6YXJyYXk8OjphaWRsOjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlLCAzPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXQyZEJ5dGVzKGNvbnN0IHN0ZDo6YXJyYXk8c3RkOjphcnJheTx1aW50OF90LCAzPiwgMj4mIGluX2lucHV0LCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8dWludDhfdCwgMz4sIDI+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6YXJyYXk8c3RkOjphcnJheTx1aW50OF90LCAzPiwgMj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0MmRJbnRzKGNvbnN0IHN0ZDo6YXJyYXk8c3RkOjphcnJheTxpbnQzMl90LCAzPiwgMj4mIGluX2lucHV0LCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8aW50MzJfdCwgMz4sIDI+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6YXJyYXk8c3RkOjphcnJheTxpbnQzMl90LCAzPiwgMj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0MmRCaW5kZXJzKGNvbnN0IHN0ZDo6YXJyYXk8c3RkOjphcnJheTw6Om5kazo6U3BBSUJpbmRlciwgMz4sIDI+JiBpbl9pbnB1dCwgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6bmRrOjpTcEFJQmluZGVyLCAzPiwgMj4qIG91dF9yZXBlYXRlZCwgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6bmRrOjpTcEFJQmluZGVyLCAzPiwgMj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0MmRQYXJjZWxhYmxlcyhjb25zdCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjphaWRsOjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlLCAzPiwgMj4mIGluX2lucHV0LCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjphaWRsOjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlLCAzPiwgMj4qIG91dF9yZXBlYXRlZCwgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZSwgMz4sIDI+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTcEFJQmluZGVyIGFzQmluZGVyKCkgb3ZlcnJpZGU7CisgICAgYm9vbCBpc1JlbW90ZSgpIG92ZXJyaWRlOworICB9OworICBjbGFzcyBCcFJlcGVhdEZpeGVkU2l6ZUFycmF5IDogcHVibGljIDo6bmRrOjpCcENJbnRlcmZhY2U8SVJlcGVhdEZpeGVkU2l6ZUFycmF5PiB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBCcFJlcGVhdEZpeGVkU2l6ZUFycmF5KGNvbnN0IDo6bmRrOjpTcEFJQmluZGVyJiBiaW5kZXIpOworICAgIHZpcnR1YWwgfkJwUmVwZWF0Rml4ZWRTaXplQXJyYXkoKTsKKworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdEJ5dGVzKGNvbnN0IHN0ZDo6YXJyYXk8dWludDhfdCwgMz4mIGluX2lucHV0LCBzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6YXJyYXk8dWludDhfdCwgMz4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0SW50cyhjb25zdCBzdGQ6OmFycmF5PGludDMyX3QsIDM+JiBpbl9pbnB1dCwgc3RkOjphcnJheTxpbnQzMl90LCAzPiogb3V0X3JlcGVhdGVkLCBzdGQ6OmFycmF5PGludDMyX3QsIDM+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdEJpbmRlcnMoY29uc3Qgc3RkOjphcnJheTw6Om5kazo6U3BBSUJpbmRlciwgMz4mIGluX2lucHV0LCBzdGQ6OmFycmF5PDo6bmRrOjpTcEFJQmluZGVyLCAzPiogb3V0X3JlcGVhdGVkLCBzdGQ6OmFycmF5PDo6bmRrOjpTcEFJQmluZGVyLCAzPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXRQYXJjZWxhYmxlcyhjb25zdCBzdGQ6OmFycmF5PDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZSwgMz4mIGluX2lucHV0LCBzdGQ6OmFycmF5PDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZSwgMz4qIG91dF9yZXBlYXRlZCwgc3RkOjphcnJheTw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludFBhcmNlbGFibGUsIDM+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdDJkQnl0ZXMoY29uc3Qgc3RkOjphcnJheTxzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+LCAyPiYgaW5faW5wdXQsIHN0ZDo6YXJyYXk8c3RkOjphcnJheTx1aW50OF90LCAzPiwgMj4qIG91dF9yZXBlYXRlZCwgc3RkOjphcnJheTxzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+LCAyPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXQyZEludHMoY29uc3Qgc3RkOjphcnJheTxzdGQ6OmFycmF5PGludDMyX3QsIDM+LCAyPiYgaW5faW5wdXQsIHN0ZDo6YXJyYXk8c3RkOjphcnJheTxpbnQzMl90LCAzPiwgMj4qIG91dF9yZXBlYXRlZCwgc3RkOjphcnJheTxzdGQ6OmFycmF5PGludDMyX3QsIDM+LCAyPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXQyZEJpbmRlcnMoY29uc3Qgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6bmRrOjpTcEFJQmluZGVyLCAzPiwgMj4mIGluX2lucHV0LCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjpuZGs6OlNwQUlCaW5kZXIsIDM+LCAyPiogb3V0X3JlcGVhdGVkLCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjpuZGs6OlNwQUlCaW5kZXIsIDM+LCAyPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXQyZFBhcmNlbGFibGVzKGNvbnN0IHN0ZDo6YXJyYXk8c3RkOjphcnJheTw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludFBhcmNlbGFibGUsIDM+LCAyPiYgaW5faW5wdXQsIHN0ZDo6YXJyYXk8c3RkOjphcnJheTw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludFBhcmNlbGFibGUsIDM+LCAyPiogb3V0X3JlcGVhdGVkLCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjphaWRsOjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlLCAzPiwgMj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIH07CisgIGNsYXNzIEJuUmVwZWF0Rml4ZWRTaXplQXJyYXkgOiBwdWJsaWMgOjpuZGs6OkJuQ0ludGVyZmFjZTxJUmVwZWF0Rml4ZWRTaXplQXJyYXk+IHsKKyAgcHVibGljOgorICAgIEJuUmVwZWF0Rml4ZWRTaXplQXJyYXkoKTsKKyAgICB2aXJ0dWFsIH5CblJlcGVhdEZpeGVkU2l6ZUFycmF5KCk7CisgIHByb3RlY3RlZDoKKyAgICA6Om5kazo6U3BBSUJpbmRlciBjcmVhdGVCaW5kZXIoKSBvdmVycmlkZTsKKyAgcHJpdmF0ZToKKyAgfTsKKyAgZW51bSBjbGFzcyBCeXRlRW51bSA6IGludDhfdCB7CisgICAgQSA9IDAsCisgIH07CisKKyAgZW51bSBjbGFzcyBJbnRFbnVtIDogaW50MzJfdCB7CisgICAgQSA9IDAsCisgIH07CisKKyAgZW51bSBjbGFzcyBMb25nRW51bSA6IGludDY0X3QgeworICAgIEEgPSAwTCwKKyAgfTsKKworICBjbGFzcyBJRW1wdHlJbnRlcmZhY2UgOiBwdWJsaWMgOjpuZGs6OklDSW50ZXJmYWNlIHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkZXNjcmlwdG9yOworICAgIElFbXB0eUludGVyZmFjZSgpOworICAgIHZpcnR1YWwgfklFbXB0eUludGVyZmFjZSgpOworCisKKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPElFbXB0eUludGVyZmFjZT4gZnJvbUJpbmRlcihjb25zdCA6Om5kazo6U3BBSUJpbmRlciYgYmluZGVyKTsKKyAgICBzdGF0aWMgYmluZGVyX3N0YXR1c190IHdyaXRlVG9QYXJjZWwoQVBhcmNlbCogcGFyY2VsLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SUVtcHR5SW50ZXJmYWNlPiYgaW5zdGFuY2UpOworICAgIHN0YXRpYyBiaW5kZXJfc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogcGFyY2VsLCBzdGQ6OnNoYXJlZF9wdHI8SUVtcHR5SW50ZXJmYWNlPiogaW5zdGFuY2UpOworICAgIHN0YXRpYyBib29sIHNldERlZmF1bHRJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJRW1wdHlJbnRlcmZhY2U+JiBpbXBsKTsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElFbXB0eUludGVyZmFjZT4mIGdldERlZmF1bHRJbXBsKCk7CisgIHByaXZhdGU6CisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxJRW1wdHlJbnRlcmZhY2U+IGRlZmF1bHRfaW1wbDsKKyAgfTsKKyAgY2xhc3MgSUVtcHR5SW50ZXJmYWNlRGVmYXVsdCA6IHB1YmxpYyBJRW1wdHlJbnRlcmZhY2UgeworICBwdWJsaWM6CisgICAgOjpuZGs6OlNwQUlCaW5kZXIgYXNCaW5kZXIoKSBvdmVycmlkZTsKKyAgICBib29sIGlzUmVtb3RlKCkgb3ZlcnJpZGU7CisgIH07CisgIGNsYXNzIEJwRW1wdHlJbnRlcmZhY2UgOiBwdWJsaWMgOjpuZGs6OkJwQ0ludGVyZmFjZTxJRW1wdHlJbnRlcmZhY2U+IHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IEJwRW1wdHlJbnRlcmZhY2UoY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGJpbmRlcik7CisgICAgdmlydHVhbCB+QnBFbXB0eUludGVyZmFjZSgpOworCisgIH07CisgIGNsYXNzIEJuRW1wdHlJbnRlcmZhY2UgOiBwdWJsaWMgOjpuZGs6OkJuQ0ludGVyZmFjZTxJRW1wdHlJbnRlcmZhY2U+IHsKKyAgcHVibGljOgorICAgIEJuRW1wdHlJbnRlcmZhY2UoKTsKKyAgICB2aXJ0dWFsIH5CbkVtcHR5SW50ZXJmYWNlKCk7CisgIHByb3RlY3RlZDoKKyAgICA6Om5kazo6U3BBSUJpbmRlciBjcmVhdGVCaW5kZXIoKSBvdmVycmlkZTsKKyAgcHJpdmF0ZToKKyAgfTsKKyAgc3RkOjphcnJheTxzdGQ6OmFycmF5PGludDMyX3QsIDM+LCAyPiBpbnQyeDMgPSB7e3t7MSwgMiwgM319LCB7ezQsIDUsIDZ9fX19OworICBzdGQ6OmFycmF5PGJvb2wsIDI+IGJvb2xBcnJheSA9IHt7fX07CisgIHN0ZDo6YXJyYXk8dWludDhfdCwgMj4gYnl0ZUFycmF5ID0ge3t9fTsKKyAgc3RkOjphcnJheTxjaGFyMTZfdCwgMj4gY2hhckFycmF5ID0ge3t9fTsKKyAgc3RkOjphcnJheTxpbnQzMl90LCAyPiBpbnRBcnJheSA9IHt7fX07CisgIHN0ZDo6YXJyYXk8aW50NjRfdCwgMj4gbG9uZ0FycmF5ID0ge3t9fTsKKyAgc3RkOjphcnJheTxmbG9hdCwgMj4gZmxvYXRBcnJheSA9IHt7fX07CisgIHN0ZDo6YXJyYXk8ZG91YmxlLCAyPiBkb3VibGVBcnJheSA9IHt7fX07CisgIHN0ZDo6YXJyYXk8c3RkOjpzdHJpbmcsIDI+IHN0cmluZ0FycmF5ID0ge3siaGVsbG8iLCAid29ybGQifX07CisgIHN0ZDo6YXJyYXk8OjphaWRsOjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpCeXRlRW51bSwgMj4gYnl0ZUVudW1BcnJheSA9IHt7fX07CisgIHN0ZDo6YXJyYXk8OjphaWRsOjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRFbnVtLCAyPiBpbnRFbnVtQXJyYXkgPSB7e319OworICBzdGQ6OmFycmF5PDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6TG9uZ0VudW0sIDI+IGxvbmdFbnVtQXJyYXkgPSB7e319OworICBzdGQ6OmFycmF5PDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZSwgMj4gcGFyY2VsYWJsZUFycmF5ID0ge3t9fTsKKyAgc3RkOjphcnJheTxzdGQ6OmFycmF5PGJvb2wsIDI+LCAyPiBib29sTWF0cml4ID0ge3t9fTsKKyAgc3RkOjphcnJheTxzdGQ6OmFycmF5PHVpbnQ4X3QsIDI+LCAyPiBieXRlTWF0cml4ID0ge3t9fTsKKyAgc3RkOjphcnJheTxzdGQ6OmFycmF5PGNoYXIxNl90LCAyPiwgMj4gY2hhck1hdHJpeCA9IHt7fX07CisgIHN0ZDo6YXJyYXk8c3RkOjphcnJheTxpbnQzMl90LCAyPiwgMj4gaW50TWF0cml4ID0ge3t9fTsKKyAgc3RkOjphcnJheTxzdGQ6OmFycmF5PGludDY0X3QsIDI+LCAyPiBsb25nTWF0cml4ID0ge3t9fTsKKyAgc3RkOjphcnJheTxzdGQ6OmFycmF5PGZsb2F0LCAyPiwgMj4gZmxvYXRNYXRyaXggPSB7e319OworICBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8ZG91YmxlLCAyPiwgMj4gZG91YmxlTWF0cml4ID0ge3t9fTsKKyAgc3RkOjphcnJheTxzdGQ6OmFycmF5PHN0ZDo6c3RyaW5nLCAyPiwgMj4gc3RyaW5nTWF0cml4ID0ge3t7eyJoZWxsbyIsICJ3b3JsZCJ9fSwge3siQ2lhbyIsICJtb25kbyJ9fX19OworICBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjphaWRsOjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpCeXRlRW51bSwgMj4sIDI+IGJ5dGVFbnVtTWF0cml4ID0ge3t9fTsKKyAgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50RW51bSwgMj4sIDI+IGludEVudW1NYXRyaXggPSB7e319OworICBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjphaWRsOjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpMb25nRW51bSwgMj4sIDI+IGxvbmdFbnVtTWF0cml4ID0ge3t9fTsKKyAgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZSwgMj4sIDI+IHBhcmNlbGFibGVNYXRyaXggPSB7e319OworICBzdGQ6Om9wdGlvbmFsPHN0ZDo6YXJyYXk8Ym9vbCwgMj4+IGJvb2xOdWxsYWJsZUFycmF5OworICBzdGQ6Om9wdGlvbmFsPHN0ZDo6YXJyYXk8dWludDhfdCwgMj4+IGJ5dGVOdWxsYWJsZUFycmF5OworICBzdGQ6Om9wdGlvbmFsPHN0ZDo6YXJyYXk8Y2hhcjE2X3QsIDI+PiBjaGFyTnVsbGFibGVBcnJheTsKKyAgc3RkOjpvcHRpb25hbDxzdGQ6OmFycmF5PGludDMyX3QsIDI+PiBpbnROdWxsYWJsZUFycmF5OworICBzdGQ6Om9wdGlvbmFsPHN0ZDo6YXJyYXk8aW50NjRfdCwgMj4+IGxvbmdOdWxsYWJsZUFycmF5OworICBzdGQ6Om9wdGlvbmFsPHN0ZDo6YXJyYXk8ZmxvYXQsIDI+PiBmbG9hdE51bGxhYmxlQXJyYXk7CisgIHN0ZDo6b3B0aW9uYWw8c3RkOjphcnJheTxkb3VibGUsIDI+PiBkb3VibGVOdWxsYWJsZUFycmF5OworICBzdGQ6Om9wdGlvbmFsPHN0ZDo6YXJyYXk8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4sIDI+PiBzdHJpbmdOdWxsYWJsZUFycmF5ID0ge3t7ImhlbGxvIiwgIndvcmxkIn19fTsKKyAgc3RkOjpvcHRpb25hbDxzdGQ6OmFycmF5PDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6Qnl0ZUVudW0sIDI+PiBieXRlRW51bU51bGxhYmxlQXJyYXk7CisgIHN0ZDo6b3B0aW9uYWw8c3RkOjphcnJheTw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludEVudW0sIDI+PiBpbnRFbnVtTnVsbGFibGVBcnJheTsKKyAgc3RkOjpvcHRpb25hbDxzdGQ6OmFycmF5PDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6TG9uZ0VudW0sIDI+PiBsb25nRW51bU51bGxhYmxlQXJyYXk7CisgIHN0ZDo6b3B0aW9uYWw8c3RkOjphcnJheTw6Om5kazo6U3BBSUJpbmRlciwgMj4+IGJpbmRlck51bGxhYmxlQXJyYXk7CisgIHN0ZDo6b3B0aW9uYWw8c3RkOjphcnJheTw6Om5kazo6U2NvcGVkRmlsZURlc2NyaXB0b3IsIDI+PiBwZmROdWxsYWJsZUFycmF5OworICBzdGQ6Om9wdGlvbmFsPHN0ZDo6YXJyYXk8c3RkOjpvcHRpb25hbDw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludFBhcmNlbGFibGU+LCAyPj4gcGFyY2VsYWJsZU51bGxhYmxlQXJyYXk7CisgIHN0ZDo6b3B0aW9uYWw8c3RkOjphcnJheTxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJRW1wdHlJbnRlcmZhY2U+LCAyPj4gaW50ZXJmYWNlTnVsbGFibGVBcnJheTsKKyAgc3RkOjpvcHRpb25hbDxzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8Ym9vbCwgMj4sIDI+PiBib29sTnVsbGFibGVNYXRyaXg7CisgIHN0ZDo6b3B0aW9uYWw8c3RkOjphcnJheTxzdGQ6OmFycmF5PHVpbnQ4X3QsIDI+LCAyPj4gYnl0ZU51bGxhYmxlTWF0cml4OworICBzdGQ6Om9wdGlvbmFsPHN0ZDo6YXJyYXk8c3RkOjphcnJheTxjaGFyMTZfdCwgMj4sIDI+PiBjaGFyTnVsbGFibGVNYXRyaXg7CisgIHN0ZDo6b3B0aW9uYWw8c3RkOjphcnJheTxzdGQ6OmFycmF5PGludDMyX3QsIDI+LCAyPj4gaW50TnVsbGFibGVNYXRyaXg7CisgIHN0ZDo6b3B0aW9uYWw8c3RkOjphcnJheTxzdGQ6OmFycmF5PGludDY0X3QsIDI+LCAyPj4gbG9uZ051bGxhYmxlTWF0cml4OworICBzdGQ6Om9wdGlvbmFsPHN0ZDo6YXJyYXk8c3RkOjphcnJheTxmbG9hdCwgMj4sIDI+PiBmbG9hdE51bGxhYmxlTWF0cml4OworICBzdGQ6Om9wdGlvbmFsPHN0ZDo6YXJyYXk8c3RkOjphcnJheTxkb3VibGUsIDI+LCAyPj4gZG91YmxlTnVsbGFibGVNYXRyaXg7CisgIHN0ZDo6b3B0aW9uYWw8c3RkOjphcnJheTxzdGQ6OmFycmF5PHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+LCAyPiwgMj4+IHN0cmluZ051bGxhYmxlTWF0cml4ID0ge3t7e3siaGVsbG8iLCAid29ybGQifX0sIHt7IkNpYW8iLCAibW9uZG8ifX19fX07CisgIHN0ZDo6b3B0aW9uYWw8c3RkOjphcnJheTxzdGQ6OmFycmF5PDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6Qnl0ZUVudW0sIDI+LCAyPj4gYnl0ZUVudW1OdWxsYWJsZU1hdHJpeDsKKyAgc3RkOjpvcHRpb25hbDxzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjphaWRsOjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRFbnVtLCAyPiwgMj4+IGludEVudW1OdWxsYWJsZU1hdHJpeDsKKyAgc3RkOjpvcHRpb25hbDxzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjphaWRsOjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpMb25nRW51bSwgMj4sIDI+PiBsb25nRW51bU51bGxhYmxlTWF0cml4OworICBzdGQ6Om9wdGlvbmFsPHN0ZDo6YXJyYXk8c3RkOjphcnJheTw6Om5kazo6U3BBSUJpbmRlciwgMj4sIDI+PiBiaW5kZXJOdWxsYWJsZU1hdHJpeDsKKyAgc3RkOjpvcHRpb25hbDxzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjpuZGs6OlNjb3BlZEZpbGVEZXNjcmlwdG9yLCAyPiwgMj4+IHBmZE51bGxhYmxlTWF0cml4OworICBzdGQ6Om9wdGlvbmFsPHN0ZDo6YXJyYXk8c3RkOjphcnJheTxzdGQ6Om9wdGlvbmFsPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZT4sIDI+LCAyPj4gcGFyY2VsYWJsZU51bGxhYmxlTWF0cml4OworICBzdGQ6Om9wdGlvbmFsPHN0ZDo6YXJyYXk8c3RkOjphcnJheTxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJRW1wdHlJbnRlcmZhY2U+LCAyPiwgMj4+IGludGVyZmFjZU51bGxhYmxlTWF0cml4OworCisgIGJpbmRlcl9zdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBwYXJjZWwpOworICBiaW5kZXJfc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChBUGFyY2VsKiBwYXJjZWwpIGNvbnN0OworCisgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgRml4ZWRTaXplQXJyYXlFeGFtcGxlJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoaW50MngzLCBib29sQXJyYXksIGJ5dGVBcnJheSwgY2hhckFycmF5LCBpbnRBcnJheSwgbG9uZ0FycmF5LCBmbG9hdEFycmF5LCBkb3VibGVBcnJheSwgc3RyaW5nQXJyYXksIGJ5dGVFbnVtQXJyYXksIGludEVudW1BcnJheSwgbG9uZ0VudW1BcnJheSwgcGFyY2VsYWJsZUFycmF5LCBib29sTWF0cml4LCBieXRlTWF0cml4LCBjaGFyTWF0cml4LCBpbnRNYXRyaXgsIGxvbmdNYXRyaXgsIGZsb2F0TWF0cml4LCBkb3VibGVNYXRyaXgsIHN0cmluZ01hdHJpeCwgYnl0ZUVudW1NYXRyaXgsIGludEVudW1NYXRyaXgsIGxvbmdFbnVtTWF0cml4LCBwYXJjZWxhYmxlTWF0cml4LCBib29sTnVsbGFibGVBcnJheSwgYnl0ZU51bGxhYmxlQXJyYXksIGNoYXJOdWxsYWJsZUFycmF5LCBpbnROdWxsYWJsZUFycmF5LCBsb25nTnVsbGFibGVBcnJheSwgZmxvYXROdWxsYWJsZUFycmF5LCBkb3VibGVOdWxsYWJsZUFycmF5LCBzdHJpbmdOdWxsYWJsZUFycmF5LCBieXRlRW51bU51bGxhYmxlQXJyYXksIGludEVudW1OdWxsYWJsZUFycmF5LCBsb25nRW51bU51bGxhYmxlQXJyYXksIGJpbmRlck51bGxhYmxlQXJyYXksIHBmZE51bGxhYmxlQXJyYXksIHBhcmNlbGFibGVOdWxsYWJsZUFycmF5LCBpbnRlcmZhY2VOdWxsYWJsZUFycmF5LCBib29sTnVsbGFibGVNYXRyaXgsIGJ5dGVOdWxsYWJsZU1hdHJpeCwgY2hhck51bGxhYmxlTWF0cml4LCBpbnROdWxsYWJsZU1hdHJpeCwgbG9uZ051bGxhYmxlTWF0cml4LCBmbG9hdE51bGxhYmxlTWF0cml4LCBkb3VibGVOdWxsYWJsZU1hdHJpeCwgc3RyaW5nTnVsbGFibGVNYXRyaXgsIGJ5dGVFbnVtTnVsbGFibGVNYXRyaXgsIGludEVudW1OdWxsYWJsZU1hdHJpeCwgbG9uZ0VudW1OdWxsYWJsZU1hdHJpeCwgYmluZGVyTnVsbGFibGVNYXRyaXgsIHBmZE51bGxhYmxlTWF0cml4LCBwYXJjZWxhYmxlTnVsbGFibGVNYXRyaXgsIGludGVyZmFjZU51bGxhYmxlTWF0cml4KSAhPSBzdGQ6OnRpZShyaHMuaW50MngzLCByaHMuYm9vbEFycmF5LCByaHMuYnl0ZUFycmF5LCByaHMuY2hhckFycmF5LCByaHMuaW50QXJyYXksIHJocy5sb25nQXJyYXksIHJocy5mbG9hdEFycmF5LCByaHMuZG91YmxlQXJyYXksIHJocy5zdHJpbmdBcnJheSwgcmhzLmJ5dGVFbnVtQXJyYXksIHJocy5pbnRFbnVtQXJyYXksIHJocy5sb25nRW51bUFycmF5LCByaHMucGFyY2VsYWJsZUFycmF5LCByaHMuYm9vbE1hdHJpeCwgcmhzLmJ5dGVNYXRyaXgsIHJocy5jaGFyTWF0cml4LCByaHMuaW50TWF0cml4LCByaHMubG9uZ01hdHJpeCwgcmhzLmZsb2F0TWF0cml4LCByaHMuZG91YmxlTWF0cml4LCByaHMuc3RyaW5nTWF0cml4LCByaHMuYnl0ZUVudW1NYXRyaXgsIHJocy5pbnRFbnVtTWF0cml4LCByaHMubG9uZ0VudW1NYXRyaXgsIHJocy5wYXJjZWxhYmxlTWF0cml4LCByaHMuYm9vbE51bGxhYmxlQXJyYXksIHJocy5ieXRlTnVsbGFibGVBcnJheSwgcmhzLmNoYXJOdWxsYWJsZUFycmF5LCByaHMuaW50TnVsbGFibGVBcnJheSwgcmhzLmxvbmdOdWxsYWJsZUFycmF5LCByaHMuZmxvYXROdWxsYWJsZUFycmF5LCByaHMuZG91YmxlTnVsbGFibGVBcnJheSwgcmhzLnN0cmluZ051bGxhYmxlQXJyYXksIHJocy5ieXRlRW51bU51bGxhYmxlQXJyYXksIHJocy5pbnRFbnVtTnVsbGFibGVBcnJheSwgcmhzLmxvbmdFbnVtTnVsbGFibGVBcnJheSwgcmhzLmJpbmRlck51bGxhYmxlQXJyYXksIHJocy5wZmROdWxsYWJsZUFycmF5LCByaHMucGFyY2VsYWJsZU51bGxhYmxlQXJyYXksIHJocy5pbnRlcmZhY2VOdWxsYWJsZUFycmF5LCByaHMuYm9vbE51bGxhYmxlTWF0cml4LCByaHMuYnl0ZU51bGxhYmxlTWF0cml4LCByaHMuY2hhck51bGxhYmxlTWF0cml4LCByaHMuaW50TnVsbGFibGVNYXRyaXgsIHJocy5sb25nTnVsbGFibGVNYXRyaXgsIHJocy5mbG9hdE51bGxhYmxlTWF0cml4LCByaHMuZG91YmxlTnVsbGFibGVNYXRyaXgsIHJocy5zdHJpbmdOdWxsYWJsZU1hdHJpeCwgcmhzLmJ5dGVFbnVtTnVsbGFibGVNYXRyaXgsIHJocy5pbnRFbnVtTnVsbGFibGVNYXRyaXgsIHJocy5sb25nRW51bU51bGxhYmxlTWF0cml4LCByaHMuYmluZGVyTnVsbGFibGVNYXRyaXgsIHJocy5wZmROdWxsYWJsZU1hdHJpeCwgcmhzLnBhcmNlbGFibGVOdWxsYWJsZU1hdHJpeCwgcmhzLmludGVyZmFjZU51bGxhYmxlTWF0cml4KTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgRml4ZWRTaXplQXJyYXlFeGFtcGxlJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoaW50MngzLCBib29sQXJyYXksIGJ5dGVBcnJheSwgY2hhckFycmF5LCBpbnRBcnJheSwgbG9uZ0FycmF5LCBmbG9hdEFycmF5LCBkb3VibGVBcnJheSwgc3RyaW5nQXJyYXksIGJ5dGVFbnVtQXJyYXksIGludEVudW1BcnJheSwgbG9uZ0VudW1BcnJheSwgcGFyY2VsYWJsZUFycmF5LCBib29sTWF0cml4LCBieXRlTWF0cml4LCBjaGFyTWF0cml4LCBpbnRNYXRyaXgsIGxvbmdNYXRyaXgsIGZsb2F0TWF0cml4LCBkb3VibGVNYXRyaXgsIHN0cmluZ01hdHJpeCwgYnl0ZUVudW1NYXRyaXgsIGludEVudW1NYXRyaXgsIGxvbmdFbnVtTWF0cml4LCBwYXJjZWxhYmxlTWF0cml4LCBib29sTnVsbGFibGVBcnJheSwgYnl0ZU51bGxhYmxlQXJyYXksIGNoYXJOdWxsYWJsZUFycmF5LCBpbnROdWxsYWJsZUFycmF5LCBsb25nTnVsbGFibGVBcnJheSwgZmxvYXROdWxsYWJsZUFycmF5LCBkb3VibGVOdWxsYWJsZUFycmF5LCBzdHJpbmdOdWxsYWJsZUFycmF5LCBieXRlRW51bU51bGxhYmxlQXJyYXksIGludEVudW1OdWxsYWJsZUFycmF5LCBsb25nRW51bU51bGxhYmxlQXJyYXksIGJpbmRlck51bGxhYmxlQXJyYXksIHBmZE51bGxhYmxlQXJyYXksIHBhcmNlbGFibGVOdWxsYWJsZUFycmF5LCBpbnRlcmZhY2VOdWxsYWJsZUFycmF5LCBib29sTnVsbGFibGVNYXRyaXgsIGJ5dGVOdWxsYWJsZU1hdHJpeCwgY2hhck51bGxhYmxlTWF0cml4LCBpbnROdWxsYWJsZU1hdHJpeCwgbG9uZ051bGxhYmxlTWF0cml4LCBmbG9hdE51bGxhYmxlTWF0cml4LCBkb3VibGVOdWxsYWJsZU1hdHJpeCwgc3RyaW5nTnVsbGFibGVNYXRyaXgsIGJ5dGVFbnVtTnVsbGFibGVNYXRyaXgsIGludEVudW1OdWxsYWJsZU1hdHJpeCwgbG9uZ0VudW1OdWxsYWJsZU1hdHJpeCwgYmluZGVyTnVsbGFibGVNYXRyaXgsIHBmZE51bGxhYmxlTWF0cml4LCBwYXJjZWxhYmxlTnVsbGFibGVNYXRyaXgsIGludGVyZmFjZU51bGxhYmxlTWF0cml4KSA8IHN0ZDo6dGllKHJocy5pbnQyeDMsIHJocy5ib29sQXJyYXksIHJocy5ieXRlQXJyYXksIHJocy5jaGFyQXJyYXksIHJocy5pbnRBcnJheSwgcmhzLmxvbmdBcnJheSwgcmhzLmZsb2F0QXJyYXksIHJocy5kb3VibGVBcnJheSwgcmhzLnN0cmluZ0FycmF5LCByaHMuYnl0ZUVudW1BcnJheSwgcmhzLmludEVudW1BcnJheSwgcmhzLmxvbmdFbnVtQXJyYXksIHJocy5wYXJjZWxhYmxlQXJyYXksIHJocy5ib29sTWF0cml4LCByaHMuYnl0ZU1hdHJpeCwgcmhzLmNoYXJNYXRyaXgsIHJocy5pbnRNYXRyaXgsIHJocy5sb25nTWF0cml4LCByaHMuZmxvYXRNYXRyaXgsIHJocy5kb3VibGVNYXRyaXgsIHJocy5zdHJpbmdNYXRyaXgsIHJocy5ieXRlRW51bU1hdHJpeCwgcmhzLmludEVudW1NYXRyaXgsIHJocy5sb25nRW51bU1hdHJpeCwgcmhzLnBhcmNlbGFibGVNYXRyaXgsIHJocy5ib29sTnVsbGFibGVBcnJheSwgcmhzLmJ5dGVOdWxsYWJsZUFycmF5LCByaHMuY2hhck51bGxhYmxlQXJyYXksIHJocy5pbnROdWxsYWJsZUFycmF5LCByaHMubG9uZ051bGxhYmxlQXJyYXksIHJocy5mbG9hdE51bGxhYmxlQXJyYXksIHJocy5kb3VibGVOdWxsYWJsZUFycmF5LCByaHMuc3RyaW5nTnVsbGFibGVBcnJheSwgcmhzLmJ5dGVFbnVtTnVsbGFibGVBcnJheSwgcmhzLmludEVudW1OdWxsYWJsZUFycmF5LCByaHMubG9uZ0VudW1OdWxsYWJsZUFycmF5LCByaHMuYmluZGVyTnVsbGFibGVBcnJheSwgcmhzLnBmZE51bGxhYmxlQXJyYXksIHJocy5wYXJjZWxhYmxlTnVsbGFibGVBcnJheSwgcmhzLmludGVyZmFjZU51bGxhYmxlQXJyYXksIHJocy5ib29sTnVsbGFibGVNYXRyaXgsIHJocy5ieXRlTnVsbGFibGVNYXRyaXgsIHJocy5jaGFyTnVsbGFibGVNYXRyaXgsIHJocy5pbnROdWxsYWJsZU1hdHJpeCwgcmhzLmxvbmdOdWxsYWJsZU1hdHJpeCwgcmhzLmZsb2F0TnVsbGFibGVNYXRyaXgsIHJocy5kb3VibGVOdWxsYWJsZU1hdHJpeCwgcmhzLnN0cmluZ051bGxhYmxlTWF0cml4LCByaHMuYnl0ZUVudW1OdWxsYWJsZU1hdHJpeCwgcmhzLmludEVudW1OdWxsYWJsZU1hdHJpeCwgcmhzLmxvbmdFbnVtTnVsbGFibGVNYXRyaXgsIHJocy5iaW5kZXJOdWxsYWJsZU1hdHJpeCwgcmhzLnBmZE51bGxhYmxlTWF0cml4LCByaHMucGFyY2VsYWJsZU51bGxhYmxlTWF0cml4LCByaHMuaW50ZXJmYWNlTnVsbGFibGVNYXRyaXgpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgRml4ZWRTaXplQXJyYXlFeGFtcGxlJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoaW50MngzLCBib29sQXJyYXksIGJ5dGVBcnJheSwgY2hhckFycmF5LCBpbnRBcnJheSwgbG9uZ0FycmF5LCBmbG9hdEFycmF5LCBkb3VibGVBcnJheSwgc3RyaW5nQXJyYXksIGJ5dGVFbnVtQXJyYXksIGludEVudW1BcnJheSwgbG9uZ0VudW1BcnJheSwgcGFyY2VsYWJsZUFycmF5LCBib29sTWF0cml4LCBieXRlTWF0cml4LCBjaGFyTWF0cml4LCBpbnRNYXRyaXgsIGxvbmdNYXRyaXgsIGZsb2F0TWF0cml4LCBkb3VibGVNYXRyaXgsIHN0cmluZ01hdHJpeCwgYnl0ZUVudW1NYXRyaXgsIGludEVudW1NYXRyaXgsIGxvbmdFbnVtTWF0cml4LCBwYXJjZWxhYmxlTWF0cml4LCBib29sTnVsbGFibGVBcnJheSwgYnl0ZU51bGxhYmxlQXJyYXksIGNoYXJOdWxsYWJsZUFycmF5LCBpbnROdWxsYWJsZUFycmF5LCBsb25nTnVsbGFibGVBcnJheSwgZmxvYXROdWxsYWJsZUFycmF5LCBkb3VibGVOdWxsYWJsZUFycmF5LCBzdHJpbmdOdWxsYWJsZUFycmF5LCBieXRlRW51bU51bGxhYmxlQXJyYXksIGludEVudW1OdWxsYWJsZUFycmF5LCBsb25nRW51bU51bGxhYmxlQXJyYXksIGJpbmRlck51bGxhYmxlQXJyYXksIHBmZE51bGxhYmxlQXJyYXksIHBhcmNlbGFibGVOdWxsYWJsZUFycmF5LCBpbnRlcmZhY2VOdWxsYWJsZUFycmF5LCBib29sTnVsbGFibGVNYXRyaXgsIGJ5dGVOdWxsYWJsZU1hdHJpeCwgY2hhck51bGxhYmxlTWF0cml4LCBpbnROdWxsYWJsZU1hdHJpeCwgbG9uZ051bGxhYmxlTWF0cml4LCBmbG9hdE51bGxhYmxlTWF0cml4LCBkb3VibGVOdWxsYWJsZU1hdHJpeCwgc3RyaW5nTnVsbGFibGVNYXRyaXgsIGJ5dGVFbnVtTnVsbGFibGVNYXRyaXgsIGludEVudW1OdWxsYWJsZU1hdHJpeCwgbG9uZ0VudW1OdWxsYWJsZU1hdHJpeCwgYmluZGVyTnVsbGFibGVNYXRyaXgsIHBmZE51bGxhYmxlTWF0cml4LCBwYXJjZWxhYmxlTnVsbGFibGVNYXRyaXgsIGludGVyZmFjZU51bGxhYmxlTWF0cml4KSA8PSBzdGQ6OnRpZShyaHMuaW50MngzLCByaHMuYm9vbEFycmF5LCByaHMuYnl0ZUFycmF5LCByaHMuY2hhckFycmF5LCByaHMuaW50QXJyYXksIHJocy5sb25nQXJyYXksIHJocy5mbG9hdEFycmF5LCByaHMuZG91YmxlQXJyYXksIHJocy5zdHJpbmdBcnJheSwgcmhzLmJ5dGVFbnVtQXJyYXksIHJocy5pbnRFbnVtQXJyYXksIHJocy5sb25nRW51bUFycmF5LCByaHMucGFyY2VsYWJsZUFycmF5LCByaHMuYm9vbE1hdHJpeCwgcmhzLmJ5dGVNYXRyaXgsIHJocy5jaGFyTWF0cml4LCByaHMuaW50TWF0cml4LCByaHMubG9uZ01hdHJpeCwgcmhzLmZsb2F0TWF0cml4LCByaHMuZG91YmxlTWF0cml4LCByaHMuc3RyaW5nTWF0cml4LCByaHMuYnl0ZUVudW1NYXRyaXgsIHJocy5pbnRFbnVtTWF0cml4LCByaHMubG9uZ0VudW1NYXRyaXgsIHJocy5wYXJjZWxhYmxlTWF0cml4LCByaHMuYm9vbE51bGxhYmxlQXJyYXksIHJocy5ieXRlTnVsbGFibGVBcnJheSwgcmhzLmNoYXJOdWxsYWJsZUFycmF5LCByaHMuaW50TnVsbGFibGVBcnJheSwgcmhzLmxvbmdOdWxsYWJsZUFycmF5LCByaHMuZmxvYXROdWxsYWJsZUFycmF5LCByaHMuZG91YmxlTnVsbGFibGVBcnJheSwgcmhzLnN0cmluZ051bGxhYmxlQXJyYXksIHJocy5ieXRlRW51bU51bGxhYmxlQXJyYXksIHJocy5pbnRFbnVtTnVsbGFibGVBcnJheSwgcmhzLmxvbmdFbnVtTnVsbGFibGVBcnJheSwgcmhzLmJpbmRlck51bGxhYmxlQXJyYXksIHJocy5wZmROdWxsYWJsZUFycmF5LCByaHMucGFyY2VsYWJsZU51bGxhYmxlQXJyYXksIHJocy5pbnRlcmZhY2VOdWxsYWJsZUFycmF5LCByaHMuYm9vbE51bGxhYmxlTWF0cml4LCByaHMuYnl0ZU51bGxhYmxlTWF0cml4LCByaHMuY2hhck51bGxhYmxlTWF0cml4LCByaHMuaW50TnVsbGFibGVNYXRyaXgsIHJocy5sb25nTnVsbGFibGVNYXRyaXgsIHJocy5mbG9hdE51bGxhYmxlTWF0cml4LCByaHMuZG91YmxlTnVsbGFibGVNYXRyaXgsIHJocy5zdHJpbmdOdWxsYWJsZU1hdHJpeCwgcmhzLmJ5dGVFbnVtTnVsbGFibGVNYXRyaXgsIHJocy5pbnRFbnVtTnVsbGFibGVNYXRyaXgsIHJocy5sb25nRW51bU51bGxhYmxlTWF0cml4LCByaHMuYmluZGVyTnVsbGFibGVNYXRyaXgsIHJocy5wZmROdWxsYWJsZU1hdHJpeCwgcmhzLnBhcmNlbGFibGVOdWxsYWJsZU1hdHJpeCwgcmhzLmludGVyZmFjZU51bGxhYmxlTWF0cml4KTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEZpeGVkU2l6ZUFycmF5RXhhbXBsZSYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKGludDJ4MywgYm9vbEFycmF5LCBieXRlQXJyYXksIGNoYXJBcnJheSwgaW50QXJyYXksIGxvbmdBcnJheSwgZmxvYXRBcnJheSwgZG91YmxlQXJyYXksIHN0cmluZ0FycmF5LCBieXRlRW51bUFycmF5LCBpbnRFbnVtQXJyYXksIGxvbmdFbnVtQXJyYXksIHBhcmNlbGFibGVBcnJheSwgYm9vbE1hdHJpeCwgYnl0ZU1hdHJpeCwgY2hhck1hdHJpeCwgaW50TWF0cml4LCBsb25nTWF0cml4LCBmbG9hdE1hdHJpeCwgZG91YmxlTWF0cml4LCBzdHJpbmdNYXRyaXgsIGJ5dGVFbnVtTWF0cml4LCBpbnRFbnVtTWF0cml4LCBsb25nRW51bU1hdHJpeCwgcGFyY2VsYWJsZU1hdHJpeCwgYm9vbE51bGxhYmxlQXJyYXksIGJ5dGVOdWxsYWJsZUFycmF5LCBjaGFyTnVsbGFibGVBcnJheSwgaW50TnVsbGFibGVBcnJheSwgbG9uZ051bGxhYmxlQXJyYXksIGZsb2F0TnVsbGFibGVBcnJheSwgZG91YmxlTnVsbGFibGVBcnJheSwgc3RyaW5nTnVsbGFibGVBcnJheSwgYnl0ZUVudW1OdWxsYWJsZUFycmF5LCBpbnRFbnVtTnVsbGFibGVBcnJheSwgbG9uZ0VudW1OdWxsYWJsZUFycmF5LCBiaW5kZXJOdWxsYWJsZUFycmF5LCBwZmROdWxsYWJsZUFycmF5LCBwYXJjZWxhYmxlTnVsbGFibGVBcnJheSwgaW50ZXJmYWNlTnVsbGFibGVBcnJheSwgYm9vbE51bGxhYmxlTWF0cml4LCBieXRlTnVsbGFibGVNYXRyaXgsIGNoYXJOdWxsYWJsZU1hdHJpeCwgaW50TnVsbGFibGVNYXRyaXgsIGxvbmdOdWxsYWJsZU1hdHJpeCwgZmxvYXROdWxsYWJsZU1hdHJpeCwgZG91YmxlTnVsbGFibGVNYXRyaXgsIHN0cmluZ051bGxhYmxlTWF0cml4LCBieXRlRW51bU51bGxhYmxlTWF0cml4LCBpbnRFbnVtTnVsbGFibGVNYXRyaXgsIGxvbmdFbnVtTnVsbGFibGVNYXRyaXgsIGJpbmRlck51bGxhYmxlTWF0cml4LCBwZmROdWxsYWJsZU1hdHJpeCwgcGFyY2VsYWJsZU51bGxhYmxlTWF0cml4LCBpbnRlcmZhY2VOdWxsYWJsZU1hdHJpeCkgPT0gc3RkOjp0aWUocmhzLmludDJ4MywgcmhzLmJvb2xBcnJheSwgcmhzLmJ5dGVBcnJheSwgcmhzLmNoYXJBcnJheSwgcmhzLmludEFycmF5LCByaHMubG9uZ0FycmF5LCByaHMuZmxvYXRBcnJheSwgcmhzLmRvdWJsZUFycmF5LCByaHMuc3RyaW5nQXJyYXksIHJocy5ieXRlRW51bUFycmF5LCByaHMuaW50RW51bUFycmF5LCByaHMubG9uZ0VudW1BcnJheSwgcmhzLnBhcmNlbGFibGVBcnJheSwgcmhzLmJvb2xNYXRyaXgsIHJocy5ieXRlTWF0cml4LCByaHMuY2hhck1hdHJpeCwgcmhzLmludE1hdHJpeCwgcmhzLmxvbmdNYXRyaXgsIHJocy5mbG9hdE1hdHJpeCwgcmhzLmRvdWJsZU1hdHJpeCwgcmhzLnN0cmluZ01hdHJpeCwgcmhzLmJ5dGVFbnVtTWF0cml4LCByaHMuaW50RW51bU1hdHJpeCwgcmhzLmxvbmdFbnVtTWF0cml4LCByaHMucGFyY2VsYWJsZU1hdHJpeCwgcmhzLmJvb2xOdWxsYWJsZUFycmF5LCByaHMuYnl0ZU51bGxhYmxlQXJyYXksIHJocy5jaGFyTnVsbGFibGVBcnJheSwgcmhzLmludE51bGxhYmxlQXJyYXksIHJocy5sb25nTnVsbGFibGVBcnJheSwgcmhzLmZsb2F0TnVsbGFibGVBcnJheSwgcmhzLmRvdWJsZU51bGxhYmxlQXJyYXksIHJocy5zdHJpbmdOdWxsYWJsZUFycmF5LCByaHMuYnl0ZUVudW1OdWxsYWJsZUFycmF5LCByaHMuaW50RW51bU51bGxhYmxlQXJyYXksIHJocy5sb25nRW51bU51bGxhYmxlQXJyYXksIHJocy5iaW5kZXJOdWxsYWJsZUFycmF5LCByaHMucGZkTnVsbGFibGVBcnJheSwgcmhzLnBhcmNlbGFibGVOdWxsYWJsZUFycmF5LCByaHMuaW50ZXJmYWNlTnVsbGFibGVBcnJheSwgcmhzLmJvb2xOdWxsYWJsZU1hdHJpeCwgcmhzLmJ5dGVOdWxsYWJsZU1hdHJpeCwgcmhzLmNoYXJOdWxsYWJsZU1hdHJpeCwgcmhzLmludE51bGxhYmxlTWF0cml4LCByaHMubG9uZ051bGxhYmxlTWF0cml4LCByaHMuZmxvYXROdWxsYWJsZU1hdHJpeCwgcmhzLmRvdWJsZU51bGxhYmxlTWF0cml4LCByaHMuc3RyaW5nTnVsbGFibGVNYXRyaXgsIHJocy5ieXRlRW51bU51bGxhYmxlTWF0cml4LCByaHMuaW50RW51bU51bGxhYmxlTWF0cml4LCByaHMubG9uZ0VudW1OdWxsYWJsZU1hdHJpeCwgcmhzLmJpbmRlck51bGxhYmxlTWF0cml4LCByaHMucGZkTnVsbGFibGVNYXRyaXgsIHJocy5wYXJjZWxhYmxlTnVsbGFibGVNYXRyaXgsIHJocy5pbnRlcmZhY2VOdWxsYWJsZU1hdHJpeCk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IEZpeGVkU2l6ZUFycmF5RXhhbXBsZSYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKGludDJ4MywgYm9vbEFycmF5LCBieXRlQXJyYXksIGNoYXJBcnJheSwgaW50QXJyYXksIGxvbmdBcnJheSwgZmxvYXRBcnJheSwgZG91YmxlQXJyYXksIHN0cmluZ0FycmF5LCBieXRlRW51bUFycmF5LCBpbnRFbnVtQXJyYXksIGxvbmdFbnVtQXJyYXksIHBhcmNlbGFibGVBcnJheSwgYm9vbE1hdHJpeCwgYnl0ZU1hdHJpeCwgY2hhck1hdHJpeCwgaW50TWF0cml4LCBsb25nTWF0cml4LCBmbG9hdE1hdHJpeCwgZG91YmxlTWF0cml4LCBzdHJpbmdNYXRyaXgsIGJ5dGVFbnVtTWF0cml4LCBpbnRFbnVtTWF0cml4LCBsb25nRW51bU1hdHJpeCwgcGFyY2VsYWJsZU1hdHJpeCwgYm9vbE51bGxhYmxlQXJyYXksIGJ5dGVOdWxsYWJsZUFycmF5LCBjaGFyTnVsbGFibGVBcnJheSwgaW50TnVsbGFibGVBcnJheSwgbG9uZ051bGxhYmxlQXJyYXksIGZsb2F0TnVsbGFibGVBcnJheSwgZG91YmxlTnVsbGFibGVBcnJheSwgc3RyaW5nTnVsbGFibGVBcnJheSwgYnl0ZUVudW1OdWxsYWJsZUFycmF5LCBpbnRFbnVtTnVsbGFibGVBcnJheSwgbG9uZ0VudW1OdWxsYWJsZUFycmF5LCBiaW5kZXJOdWxsYWJsZUFycmF5LCBwZmROdWxsYWJsZUFycmF5LCBwYXJjZWxhYmxlTnVsbGFibGVBcnJheSwgaW50ZXJmYWNlTnVsbGFibGVBcnJheSwgYm9vbE51bGxhYmxlTWF0cml4LCBieXRlTnVsbGFibGVNYXRyaXgsIGNoYXJOdWxsYWJsZU1hdHJpeCwgaW50TnVsbGFibGVNYXRyaXgsIGxvbmdOdWxsYWJsZU1hdHJpeCwgZmxvYXROdWxsYWJsZU1hdHJpeCwgZG91YmxlTnVsbGFibGVNYXRyaXgsIHN0cmluZ051bGxhYmxlTWF0cml4LCBieXRlRW51bU51bGxhYmxlTWF0cml4LCBpbnRFbnVtTnVsbGFibGVNYXRyaXgsIGxvbmdFbnVtTnVsbGFibGVNYXRyaXgsIGJpbmRlck51bGxhYmxlTWF0cml4LCBwZmROdWxsYWJsZU1hdHJpeCwgcGFyY2VsYWJsZU51bGxhYmxlTWF0cml4LCBpbnRlcmZhY2VOdWxsYWJsZU1hdHJpeCkgPiBzdGQ6OnRpZShyaHMuaW50MngzLCByaHMuYm9vbEFycmF5LCByaHMuYnl0ZUFycmF5LCByaHMuY2hhckFycmF5LCByaHMuaW50QXJyYXksIHJocy5sb25nQXJyYXksIHJocy5mbG9hdEFycmF5LCByaHMuZG91YmxlQXJyYXksIHJocy5zdHJpbmdBcnJheSwgcmhzLmJ5dGVFbnVtQXJyYXksIHJocy5pbnRFbnVtQXJyYXksIHJocy5sb25nRW51bUFycmF5LCByaHMucGFyY2VsYWJsZUFycmF5LCByaHMuYm9vbE1hdHJpeCwgcmhzLmJ5dGVNYXRyaXgsIHJocy5jaGFyTWF0cml4LCByaHMuaW50TWF0cml4LCByaHMubG9uZ01hdHJpeCwgcmhzLmZsb2F0TWF0cml4LCByaHMuZG91YmxlTWF0cml4LCByaHMuc3RyaW5nTWF0cml4LCByaHMuYnl0ZUVudW1NYXRyaXgsIHJocy5pbnRFbnVtTWF0cml4LCByaHMubG9uZ0VudW1NYXRyaXgsIHJocy5wYXJjZWxhYmxlTWF0cml4LCByaHMuYm9vbE51bGxhYmxlQXJyYXksIHJocy5ieXRlTnVsbGFibGVBcnJheSwgcmhzLmNoYXJOdWxsYWJsZUFycmF5LCByaHMuaW50TnVsbGFibGVBcnJheSwgcmhzLmxvbmdOdWxsYWJsZUFycmF5LCByaHMuZmxvYXROdWxsYWJsZUFycmF5LCByaHMuZG91YmxlTnVsbGFibGVBcnJheSwgcmhzLnN0cmluZ051bGxhYmxlQXJyYXksIHJocy5ieXRlRW51bU51bGxhYmxlQXJyYXksIHJocy5pbnRFbnVtTnVsbGFibGVBcnJheSwgcmhzLmxvbmdFbnVtTnVsbGFibGVBcnJheSwgcmhzLmJpbmRlck51bGxhYmxlQXJyYXksIHJocy5wZmROdWxsYWJsZUFycmF5LCByaHMucGFyY2VsYWJsZU51bGxhYmxlQXJyYXksIHJocy5pbnRlcmZhY2VOdWxsYWJsZUFycmF5LCByaHMuYm9vbE51bGxhYmxlTWF0cml4LCByaHMuYnl0ZU51bGxhYmxlTWF0cml4LCByaHMuY2hhck51bGxhYmxlTWF0cml4LCByaHMuaW50TnVsbGFibGVNYXRyaXgsIHJocy5sb25nTnVsbGFibGVNYXRyaXgsIHJocy5mbG9hdE51bGxhYmxlTWF0cml4LCByaHMuZG91YmxlTnVsbGFibGVNYXRyaXgsIHJocy5zdHJpbmdOdWxsYWJsZU1hdHJpeCwgcmhzLmJ5dGVFbnVtTnVsbGFibGVNYXRyaXgsIHJocy5pbnRFbnVtTnVsbGFibGVNYXRyaXgsIHJocy5sb25nRW51bU51bGxhYmxlTWF0cml4LCByaHMuYmluZGVyTnVsbGFibGVNYXRyaXgsIHJocy5wZmROdWxsYWJsZU1hdHJpeCwgcmhzLnBhcmNlbGFibGVOdWxsYWJsZU1hdHJpeCwgcmhzLmludGVyZmFjZU51bGxhYmxlTWF0cml4KTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IEZpeGVkU2l6ZUFycmF5RXhhbXBsZSYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKGludDJ4MywgYm9vbEFycmF5LCBieXRlQXJyYXksIGNoYXJBcnJheSwgaW50QXJyYXksIGxvbmdBcnJheSwgZmxvYXRBcnJheSwgZG91YmxlQXJyYXksIHN0cmluZ0FycmF5LCBieXRlRW51bUFycmF5LCBpbnRFbnVtQXJyYXksIGxvbmdFbnVtQXJyYXksIHBhcmNlbGFibGVBcnJheSwgYm9vbE1hdHJpeCwgYnl0ZU1hdHJpeCwgY2hhck1hdHJpeCwgaW50TWF0cml4LCBsb25nTWF0cml4LCBmbG9hdE1hdHJpeCwgZG91YmxlTWF0cml4LCBzdHJpbmdNYXRyaXgsIGJ5dGVFbnVtTWF0cml4LCBpbnRFbnVtTWF0cml4LCBsb25nRW51bU1hdHJpeCwgcGFyY2VsYWJsZU1hdHJpeCwgYm9vbE51bGxhYmxlQXJyYXksIGJ5dGVOdWxsYWJsZUFycmF5LCBjaGFyTnVsbGFibGVBcnJheSwgaW50TnVsbGFibGVBcnJheSwgbG9uZ051bGxhYmxlQXJyYXksIGZsb2F0TnVsbGFibGVBcnJheSwgZG91YmxlTnVsbGFibGVBcnJheSwgc3RyaW5nTnVsbGFibGVBcnJheSwgYnl0ZUVudW1OdWxsYWJsZUFycmF5LCBpbnRFbnVtTnVsbGFibGVBcnJheSwgbG9uZ0VudW1OdWxsYWJsZUFycmF5LCBiaW5kZXJOdWxsYWJsZUFycmF5LCBwZmROdWxsYWJsZUFycmF5LCBwYXJjZWxhYmxlTnVsbGFibGVBcnJheSwgaW50ZXJmYWNlTnVsbGFibGVBcnJheSwgYm9vbE51bGxhYmxlTWF0cml4LCBieXRlTnVsbGFibGVNYXRyaXgsIGNoYXJOdWxsYWJsZU1hdHJpeCwgaW50TnVsbGFibGVNYXRyaXgsIGxvbmdOdWxsYWJsZU1hdHJpeCwgZmxvYXROdWxsYWJsZU1hdHJpeCwgZG91YmxlTnVsbGFibGVNYXRyaXgsIHN0cmluZ051bGxhYmxlTWF0cml4LCBieXRlRW51bU51bGxhYmxlTWF0cml4LCBpbnRFbnVtTnVsbGFibGVNYXRyaXgsIGxvbmdFbnVtTnVsbGFibGVNYXRyaXgsIGJpbmRlck51bGxhYmxlTWF0cml4LCBwZmROdWxsYWJsZU1hdHJpeCwgcGFyY2VsYWJsZU51bGxhYmxlTWF0cml4LCBpbnRlcmZhY2VOdWxsYWJsZU1hdHJpeCkgPj0gc3RkOjp0aWUocmhzLmludDJ4MywgcmhzLmJvb2xBcnJheSwgcmhzLmJ5dGVBcnJheSwgcmhzLmNoYXJBcnJheSwgcmhzLmludEFycmF5LCByaHMubG9uZ0FycmF5LCByaHMuZmxvYXRBcnJheSwgcmhzLmRvdWJsZUFycmF5LCByaHMuc3RyaW5nQXJyYXksIHJocy5ieXRlRW51bUFycmF5LCByaHMuaW50RW51bUFycmF5LCByaHMubG9uZ0VudW1BcnJheSwgcmhzLnBhcmNlbGFibGVBcnJheSwgcmhzLmJvb2xNYXRyaXgsIHJocy5ieXRlTWF0cml4LCByaHMuY2hhck1hdHJpeCwgcmhzLmludE1hdHJpeCwgcmhzLmxvbmdNYXRyaXgsIHJocy5mbG9hdE1hdHJpeCwgcmhzLmRvdWJsZU1hdHJpeCwgcmhzLnN0cmluZ01hdHJpeCwgcmhzLmJ5dGVFbnVtTWF0cml4LCByaHMuaW50RW51bU1hdHJpeCwgcmhzLmxvbmdFbnVtTWF0cml4LCByaHMucGFyY2VsYWJsZU1hdHJpeCwgcmhzLmJvb2xOdWxsYWJsZUFycmF5LCByaHMuYnl0ZU51bGxhYmxlQXJyYXksIHJocy5jaGFyTnVsbGFibGVBcnJheSwgcmhzLmludE51bGxhYmxlQXJyYXksIHJocy5sb25nTnVsbGFibGVBcnJheSwgcmhzLmZsb2F0TnVsbGFibGVBcnJheSwgcmhzLmRvdWJsZU51bGxhYmxlQXJyYXksIHJocy5zdHJpbmdOdWxsYWJsZUFycmF5LCByaHMuYnl0ZUVudW1OdWxsYWJsZUFycmF5LCByaHMuaW50RW51bU51bGxhYmxlQXJyYXksIHJocy5sb25nRW51bU51bGxhYmxlQXJyYXksIHJocy5iaW5kZXJOdWxsYWJsZUFycmF5LCByaHMucGZkTnVsbGFibGVBcnJheSwgcmhzLnBhcmNlbGFibGVOdWxsYWJsZUFycmF5LCByaHMuaW50ZXJmYWNlTnVsbGFibGVBcnJheSwgcmhzLmJvb2xOdWxsYWJsZU1hdHJpeCwgcmhzLmJ5dGVOdWxsYWJsZU1hdHJpeCwgcmhzLmNoYXJOdWxsYWJsZU1hdHJpeCwgcmhzLmludE51bGxhYmxlTWF0cml4LCByaHMubG9uZ051bGxhYmxlTWF0cml4LCByaHMuZmxvYXROdWxsYWJsZU1hdHJpeCwgcmhzLmRvdWJsZU51bGxhYmxlTWF0cml4LCByaHMuc3RyaW5nTnVsbGFibGVNYXRyaXgsIHJocy5ieXRlRW51bU51bGxhYmxlTWF0cml4LCByaHMuaW50RW51bU51bGxhYmxlTWF0cml4LCByaHMubG9uZ0VudW1OdWxsYWJsZU1hdHJpeCwgcmhzLmJpbmRlck51bGxhYmxlTWF0cml4LCByaHMucGZkTnVsbGFibGVNYXRyaXgsIHJocy5wYXJjZWxhYmxlTnVsbGFibGVNYXRyaXgsIHJocy5pbnRlcmZhY2VOdWxsYWJsZU1hdHJpeCk7CisgIH0KKworICBzdGF0aWMgY29uc3QgOjpuZGs6OnBhcmNlbGFibGVfc3RhYmlsaXR5X3QgX2FpZGxfc3RhYmlsaXR5ID0gOjpuZGs6OlNUQUJJTElUWV9MT0NBTDsKKyAgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvczsKKyAgICBvcyA8PCAiRml4ZWRTaXplQXJyYXlFeGFtcGxleyI7CisgICAgb3MgPDwgImludDJ4MzogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbnQyeDMpOworICAgIG9zIDw8ICIsIGJvb2xBcnJheTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhib29sQXJyYXkpOworICAgIG9zIDw8ICIsIGJ5dGVBcnJheTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhieXRlQXJyYXkpOworICAgIG9zIDw8ICIsIGNoYXJBcnJheTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhjaGFyQXJyYXkpOworICAgIG9zIDw8ICIsIGludEFycmF5OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGludEFycmF5KTsKKyAgICBvcyA8PCAiLCBsb25nQXJyYXk6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcobG9uZ0FycmF5KTsKKyAgICBvcyA8PCAiLCBmbG9hdEFycmF5OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGZsb2F0QXJyYXkpOworICAgIG9zIDw8ICIsIGRvdWJsZUFycmF5OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGRvdWJsZUFycmF5KTsKKyAgICBvcyA8PCAiLCBzdHJpbmdBcnJheTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhzdHJpbmdBcnJheSk7CisgICAgb3MgPDwgIiwgYnl0ZUVudW1BcnJheTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhieXRlRW51bUFycmF5KTsKKyAgICBvcyA8PCAiLCBpbnRFbnVtQXJyYXk6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaW50RW51bUFycmF5KTsKKyAgICBvcyA8PCAiLCBsb25nRW51bUFycmF5OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGxvbmdFbnVtQXJyYXkpOworICAgIG9zIDw8ICIsIHBhcmNlbGFibGVBcnJheTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhwYXJjZWxhYmxlQXJyYXkpOworICAgIG9zIDw8ICIsIGJvb2xNYXRyaXg6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoYm9vbE1hdHJpeCk7CisgICAgb3MgPDwgIiwgYnl0ZU1hdHJpeDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhieXRlTWF0cml4KTsKKyAgICBvcyA8PCAiLCBjaGFyTWF0cml4OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGNoYXJNYXRyaXgpOworICAgIG9zIDw8ICIsIGludE1hdHJpeDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbnRNYXRyaXgpOworICAgIG9zIDw8ICIsIGxvbmdNYXRyaXg6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcobG9uZ01hdHJpeCk7CisgICAgb3MgPDwgIiwgZmxvYXRNYXRyaXg6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoZmxvYXRNYXRyaXgpOworICAgIG9zIDw8ICIsIGRvdWJsZU1hdHJpeDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhkb3VibGVNYXRyaXgpOworICAgIG9zIDw8ICIsIHN0cmluZ01hdHJpeDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhzdHJpbmdNYXRyaXgpOworICAgIG9zIDw8ICIsIGJ5dGVFbnVtTWF0cml4OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGJ5dGVFbnVtTWF0cml4KTsKKyAgICBvcyA8PCAiLCBpbnRFbnVtTWF0cml4OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGludEVudW1NYXRyaXgpOworICAgIG9zIDw8ICIsIGxvbmdFbnVtTWF0cml4OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGxvbmdFbnVtTWF0cml4KTsKKyAgICBvcyA8PCAiLCBwYXJjZWxhYmxlTWF0cml4OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKHBhcmNlbGFibGVNYXRyaXgpOworICAgIG9zIDw8ICIsIGJvb2xOdWxsYWJsZUFycmF5OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGJvb2xOdWxsYWJsZUFycmF5KTsKKyAgICBvcyA8PCAiLCBieXRlTnVsbGFibGVBcnJheTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhieXRlTnVsbGFibGVBcnJheSk7CisgICAgb3MgPDwgIiwgY2hhck51bGxhYmxlQXJyYXk6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoY2hhck51bGxhYmxlQXJyYXkpOworICAgIG9zIDw8ICIsIGludE51bGxhYmxlQXJyYXk6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaW50TnVsbGFibGVBcnJheSk7CisgICAgb3MgPDwgIiwgbG9uZ051bGxhYmxlQXJyYXk6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcobG9uZ051bGxhYmxlQXJyYXkpOworICAgIG9zIDw8ICIsIGZsb2F0TnVsbGFibGVBcnJheTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhmbG9hdE51bGxhYmxlQXJyYXkpOworICAgIG9zIDw8ICIsIGRvdWJsZU51bGxhYmxlQXJyYXk6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoZG91YmxlTnVsbGFibGVBcnJheSk7CisgICAgb3MgPDwgIiwgc3RyaW5nTnVsbGFibGVBcnJheTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhzdHJpbmdOdWxsYWJsZUFycmF5KTsKKyAgICBvcyA8PCAiLCBieXRlRW51bU51bGxhYmxlQXJyYXk6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoYnl0ZUVudW1OdWxsYWJsZUFycmF5KTsKKyAgICBvcyA8PCAiLCBpbnRFbnVtTnVsbGFibGVBcnJheTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbnRFbnVtTnVsbGFibGVBcnJheSk7CisgICAgb3MgPDwgIiwgbG9uZ0VudW1OdWxsYWJsZUFycmF5OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGxvbmdFbnVtTnVsbGFibGVBcnJheSk7CisgICAgb3MgPDwgIiwgYmluZGVyTnVsbGFibGVBcnJheTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhiaW5kZXJOdWxsYWJsZUFycmF5KTsKKyAgICBvcyA8PCAiLCBwZmROdWxsYWJsZUFycmF5OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKHBmZE51bGxhYmxlQXJyYXkpOworICAgIG9zIDw8ICIsIHBhcmNlbGFibGVOdWxsYWJsZUFycmF5OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKHBhcmNlbGFibGVOdWxsYWJsZUFycmF5KTsKKyAgICBvcyA8PCAiLCBpbnRlcmZhY2VOdWxsYWJsZUFycmF5OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGludGVyZmFjZU51bGxhYmxlQXJyYXkpOworICAgIG9zIDw8ICIsIGJvb2xOdWxsYWJsZU1hdHJpeDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhib29sTnVsbGFibGVNYXRyaXgpOworICAgIG9zIDw8ICIsIGJ5dGVOdWxsYWJsZU1hdHJpeDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhieXRlTnVsbGFibGVNYXRyaXgpOworICAgIG9zIDw8ICIsIGNoYXJOdWxsYWJsZU1hdHJpeDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhjaGFyTnVsbGFibGVNYXRyaXgpOworICAgIG9zIDw8ICIsIGludE51bGxhYmxlTWF0cml4OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGludE51bGxhYmxlTWF0cml4KTsKKyAgICBvcyA8PCAiLCBsb25nTnVsbGFibGVNYXRyaXg6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcobG9uZ051bGxhYmxlTWF0cml4KTsKKyAgICBvcyA8PCAiLCBmbG9hdE51bGxhYmxlTWF0cml4OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGZsb2F0TnVsbGFibGVNYXRyaXgpOworICAgIG9zIDw8ICIsIGRvdWJsZU51bGxhYmxlTWF0cml4OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGRvdWJsZU51bGxhYmxlTWF0cml4KTsKKyAgICBvcyA8PCAiLCBzdHJpbmdOdWxsYWJsZU1hdHJpeDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhzdHJpbmdOdWxsYWJsZU1hdHJpeCk7CisgICAgb3MgPDwgIiwgYnl0ZUVudW1OdWxsYWJsZU1hdHJpeDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhieXRlRW51bU51bGxhYmxlTWF0cml4KTsKKyAgICBvcyA8PCAiLCBpbnRFbnVtTnVsbGFibGVNYXRyaXg6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaW50RW51bU51bGxhYmxlTWF0cml4KTsKKyAgICBvcyA8PCAiLCBsb25nRW51bU51bGxhYmxlTWF0cml4OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGxvbmdFbnVtTnVsbGFibGVNYXRyaXgpOworICAgIG9zIDw8ICIsIGJpbmRlck51bGxhYmxlTWF0cml4OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGJpbmRlck51bGxhYmxlTWF0cml4KTsKKyAgICBvcyA8PCAiLCBwZmROdWxsYWJsZU1hdHJpeDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhwZmROdWxsYWJsZU1hdHJpeCk7CisgICAgb3MgPDwgIiwgcGFyY2VsYWJsZU51bGxhYmxlTWF0cml4OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKHBhcmNlbGFibGVOdWxsYWJsZU1hdHJpeCk7CisgICAgb3MgPDwgIiwgaW50ZXJmYWNlTnVsbGFibGVNYXRyaXg6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaW50ZXJmYWNlTnVsbGFibGVNYXRyaXgpOworICAgIG9zIDw8ICJ9IjsKKyAgICByZXR1cm4gb3Muc3RyKCk7CisgIH0KK307Cit9ICAvLyBuYW1lc3BhY2UgZml4ZWRzaXplYXJyYXkKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBmaXhlZHNpemVhcnJheSB7CitbW25vZGlzY2FyZF1dIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpCeXRlRW51bSB2YWwpIHsKKyAgc3dpdGNoKHZhbCkgeworICBjYXNlIEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6Qnl0ZUVudW06OkE6CisgICAgcmV0dXJuICJBIjsKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gc3RkOjp0b19zdHJpbmcoc3RhdGljX2Nhc3Q8aW50OF90Pih2YWwpKTsKKyAgfQorfQorfSAgLy8gbmFtZXNwYWNlIGZpeGVkc2l6ZWFycmF5Cit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCituYW1lc3BhY2UgbmRrIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XYysrMTctZXh0ZW5zaW9ucyIKK3RlbXBsYXRlIDw+Citjb25zdGV4cHIgaW5saW5lIHN0ZDo6YXJyYXk8YWlkbDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6Qnl0ZUVudW0sIDE+IGVudW1fdmFsdWVzPGFpZGw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkJ5dGVFbnVtPiA9IHsKKyAgYWlkbDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6Qnl0ZUVudW06OkEsCit9OworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAorfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgbmRrCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgZml4ZWRzaXplYXJyYXkgeworW1tub2Rpc2NhcmRdXSBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50RW51bSB2YWwpIHsKKyAgc3dpdGNoKHZhbCkgeworICBjYXNlIEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50RW51bTo6QToKKyAgICByZXR1cm4gIkEiOworICBkZWZhdWx0OgorICAgIHJldHVybiBzdGQ6OnRvX3N0cmluZyhzdGF0aWNfY2FzdDxpbnQzMl90Pih2YWwpKTsKKyAgfQorfQorfSAgLy8gbmFtZXNwYWNlIGZpeGVkc2l6ZWFycmF5Cit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCituYW1lc3BhY2UgbmRrIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XYysrMTctZXh0ZW5zaW9ucyIKK3RlbXBsYXRlIDw+Citjb25zdGV4cHIgaW5saW5lIHN0ZDo6YXJyYXk8YWlkbDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50RW51bSwgMT4gZW51bV92YWx1ZXM8YWlkbDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50RW51bT4gPSB7CisgIGFpZGw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludEVudW06OkEsCit9OworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAorfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgbmRrCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgZml4ZWRzaXplYXJyYXkgeworW1tub2Rpc2NhcmRdXSBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6TG9uZ0VudW0gdmFsKSB7CisgIHN3aXRjaCh2YWwpIHsKKyAgY2FzZSBGaXhlZFNpemVBcnJheUV4YW1wbGU6OkxvbmdFbnVtOjpBOgorICAgIHJldHVybiAiQSI7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIHN0ZDo6dG9fc3RyaW5nKHN0YXRpY19jYXN0PGludDY0X3Q+KHZhbCkpOworICB9Cit9Cit9ICAvLyBuYW1lc3BhY2UgZml4ZWRzaXplYXJyYXkKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKK25hbWVzcGFjZSBuZGsgeworbmFtZXNwYWNlIGludGVybmFsIHsKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdjKysxNy1leHRlbnNpb25zIgordGVtcGxhdGUgPD4KK2NvbnN0ZXhwciBpbmxpbmUgc3RkOjphcnJheTxhaWRsOjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpMb25nRW51bSwgMT4gZW51bV92YWx1ZXM8YWlkbDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6TG9uZ0VudW0+ID0geworICBhaWRsOjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpMb25nRW51bTo6QSwKK307CisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBuZGsKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi90aW1lc3RhbXAgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1maXhlZHNpemVhcnJheS1uZGstc291cmNlL2dlbi90aW1lc3RhbXAKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vdGltZXN0YW1wCmNvcHkgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtZml4ZWRzaXplYXJyYXktbmRrLXNvdXJjZS9nZW4vdGltZXN0YW1wCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1maXhlZHNpemVhcnJheS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2ZpeGVkc2l6ZWFycmF5L0ZpeGVkU2l6ZUFycmF5RXhhbXBsZS5ycyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWZpeGVkc2l6ZWFycmF5LXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvZml4ZWRzaXplYXJyYXkvRml4ZWRTaXplQXJyYXlFeGFtcGxlLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ZjIzODcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1maXhlZHNpemVhcnJheS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2ZpeGVkc2l6ZWFycmF5L0ZpeGVkU2l6ZUFycmF5RXhhbXBsZS5ycwpAQCAtMCwwICsxLDEwNzAgQEAKKyMhW2ZvcmJpZCh1bnNhZmVfY29kZSldCisjIVtydXN0Zm10Ojpza2lwXQorI1tkZXJpdmUoRGVidWcsIFBhcnRpYWxFcSldCitwdWIgc3RydWN0IEZpeGVkU2l6ZUFycmF5RXhhbXBsZSB7CisgIHB1YiBpbnQyeDM6IFtbaTMyOyAzXTsgMl0sCisgIHB1YiBib29sQXJyYXk6IFtib29sOyAyXSwKKyAgcHViIGJ5dGVBcnJheTogW3U4OyAyXSwKKyAgcHViIGNoYXJBcnJheTogW3UxNjsgMl0sCisgIHB1YiBpbnRBcnJheTogW2kzMjsgMl0sCisgIHB1YiBsb25nQXJyYXk6IFtpNjQ7IDJdLAorICBwdWIgZmxvYXRBcnJheTogW2YzMjsgMl0sCisgIHB1YiBkb3VibGVBcnJheTogW2Y2NDsgMl0sCisgIHB1YiBzdHJpbmdBcnJheTogW1N0cmluZzsgMl0sCisgIHB1YiBieXRlRW51bUFycmF5OiBbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzE0X2ZpeGVkc2l6ZWFycmF5XzIxX0ZpeGVkU2l6ZUFycmF5RXhhbXBsZV84X0J5dGVFbnVtOyAyXSwKKyAgcHViIGludEVudW1BcnJheTogW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfN19JbnRFbnVtOyAyXSwKKyAgcHViIGxvbmdFbnVtQXJyYXk6IFtjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfMTRfZml4ZWRzaXplYXJyYXlfMjFfRml4ZWRTaXplQXJyYXlFeGFtcGxlXzhfTG9uZ0VudW07IDJdLAorICBwdWIgcGFyY2VsYWJsZUFycmF5OiBbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzE0X2ZpeGVkc2l6ZWFycmF5XzIxX0ZpeGVkU2l6ZUFycmF5RXhhbXBsZV8xM19JbnRQYXJjZWxhYmxlOyAyXSwKKyAgcHViIGJvb2xNYXRyaXg6IFtbYm9vbDsgMl07IDJdLAorICBwdWIgYnl0ZU1hdHJpeDogW1t1ODsgMl07IDJdLAorICBwdWIgY2hhck1hdHJpeDogW1t1MTY7IDJdOyAyXSwKKyAgcHViIGludE1hdHJpeDogW1tpMzI7IDJdOyAyXSwKKyAgcHViIGxvbmdNYXRyaXg6IFtbaTY0OyAyXTsgMl0sCisgIHB1YiBmbG9hdE1hdHJpeDogW1tmMzI7IDJdOyAyXSwKKyAgcHViIGRvdWJsZU1hdHJpeDogW1tmNjQ7IDJdOyAyXSwKKyAgcHViIHN0cmluZ01hdHJpeDogW1tTdHJpbmc7IDJdOyAyXSwKKyAgcHViIGJ5dGVFbnVtTWF0cml4OiBbW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfOF9CeXRlRW51bTsgMl07IDJdLAorICBwdWIgaW50RW51bU1hdHJpeDogW1tjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfMTRfZml4ZWRzaXplYXJyYXlfMjFfRml4ZWRTaXplQXJyYXlFeGFtcGxlXzdfSW50RW51bTsgMl07IDJdLAorICBwdWIgbG9uZ0VudW1NYXRyaXg6IFtbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzE0X2ZpeGVkc2l6ZWFycmF5XzIxX0ZpeGVkU2l6ZUFycmF5RXhhbXBsZV84X0xvbmdFbnVtOyAyXTsgMl0sCisgIHB1YiBwYXJjZWxhYmxlTWF0cml4OiBbW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTNfSW50UGFyY2VsYWJsZTsgMl07IDJdLAorICBwdWIgYm9vbE51bGxhYmxlQXJyYXk6IE9wdGlvbjxbYm9vbDsgMl0+LAorICBwdWIgYnl0ZU51bGxhYmxlQXJyYXk6IE9wdGlvbjxbdTg7IDJdPiwKKyAgcHViIGNoYXJOdWxsYWJsZUFycmF5OiBPcHRpb248W3UxNjsgMl0+LAorICBwdWIgaW50TnVsbGFibGVBcnJheTogT3B0aW9uPFtpMzI7IDJdPiwKKyAgcHViIGxvbmdOdWxsYWJsZUFycmF5OiBPcHRpb248W2k2NDsgMl0+LAorICBwdWIgZmxvYXROdWxsYWJsZUFycmF5OiBPcHRpb248W2YzMjsgMl0+LAorICBwdWIgZG91YmxlTnVsbGFibGVBcnJheTogT3B0aW9uPFtmNjQ7IDJdPiwKKyAgcHViIHN0cmluZ051bGxhYmxlQXJyYXk6IE9wdGlvbjxbT3B0aW9uPFN0cmluZz47IDJdPiwKKyAgcHViIGJ5dGVFbnVtTnVsbGFibGVBcnJheTogT3B0aW9uPFtjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfMTRfZml4ZWRzaXplYXJyYXlfMjFfRml4ZWRTaXplQXJyYXlFeGFtcGxlXzhfQnl0ZUVudW07IDJdPiwKKyAgcHViIGludEVudW1OdWxsYWJsZUFycmF5OiBPcHRpb248W2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfN19JbnRFbnVtOyAyXT4sCisgIHB1YiBsb25nRW51bU51bGxhYmxlQXJyYXk6IE9wdGlvbjxbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzE0X2ZpeGVkc2l6ZWFycmF5XzIxX0ZpeGVkU2l6ZUFycmF5RXhhbXBsZV84X0xvbmdFbnVtOyAyXT4sCisgIHB1YiBiaW5kZXJOdWxsYWJsZUFycmF5OiBPcHRpb248W09wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj47IDJdPiwKKyAgcHViIHBmZE51bGxhYmxlQXJyYXk6IE9wdGlvbjxbT3B0aW9uPGJpbmRlcjo6UGFyY2VsRmlsZURlc2NyaXB0b3I+OyAyXT4sCisgIHB1YiBwYXJjZWxhYmxlTnVsbGFibGVBcnJheTogT3B0aW9uPFtPcHRpb248Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzE0X2ZpeGVkc2l6ZWFycmF5XzIxX0ZpeGVkU2l6ZUFycmF5RXhhbXBsZV8xM19JbnRQYXJjZWxhYmxlPjsgMl0+LAorICBwdWIgaW50ZXJmYWNlTnVsbGFibGVBcnJheTogT3B0aW9uPFtPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTVfSUVtcHR5SW50ZXJmYWNlPj47IDJdPiwKKyAgcHViIGJvb2xOdWxsYWJsZU1hdHJpeDogT3B0aW9uPFtbYm9vbDsgMl07IDJdPiwKKyAgcHViIGJ5dGVOdWxsYWJsZU1hdHJpeDogT3B0aW9uPFtbdTg7IDJdOyAyXT4sCisgIHB1YiBjaGFyTnVsbGFibGVNYXRyaXg6IE9wdGlvbjxbW3UxNjsgMl07IDJdPiwKKyAgcHViIGludE51bGxhYmxlTWF0cml4OiBPcHRpb248W1tpMzI7IDJdOyAyXT4sCisgIHB1YiBsb25nTnVsbGFibGVNYXRyaXg6IE9wdGlvbjxbW2k2NDsgMl07IDJdPiwKKyAgcHViIGZsb2F0TnVsbGFibGVNYXRyaXg6IE9wdGlvbjxbW2YzMjsgMl07IDJdPiwKKyAgcHViIGRvdWJsZU51bGxhYmxlTWF0cml4OiBPcHRpb248W1tmNjQ7IDJdOyAyXT4sCisgIHB1YiBzdHJpbmdOdWxsYWJsZU1hdHJpeDogT3B0aW9uPFtbT3B0aW9uPFN0cmluZz47IDJdOyAyXT4sCisgIHB1YiBieXRlRW51bU51bGxhYmxlTWF0cml4OiBPcHRpb248W1tjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfMTRfZml4ZWRzaXplYXJyYXlfMjFfRml4ZWRTaXplQXJyYXlFeGFtcGxlXzhfQnl0ZUVudW07IDJdOyAyXT4sCisgIHB1YiBpbnRFbnVtTnVsbGFibGVNYXRyaXg6IE9wdGlvbjxbW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfN19JbnRFbnVtOyAyXTsgMl0+LAorICBwdWIgbG9uZ0VudW1OdWxsYWJsZU1hdHJpeDogT3B0aW9uPFtbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzE0X2ZpeGVkc2l6ZWFycmF5XzIxX0ZpeGVkU2l6ZUFycmF5RXhhbXBsZV84X0xvbmdFbnVtOyAyXTsgMl0+LAorICBwdWIgYmluZGVyTnVsbGFibGVNYXRyaXg6IE9wdGlvbjxbW09wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj47IDJdOyAyXT4sCisgIHB1YiBwZmROdWxsYWJsZU1hdHJpeDogT3B0aW9uPFtbT3B0aW9uPGJpbmRlcjo6UGFyY2VsRmlsZURlc2NyaXB0b3I+OyAyXTsgMl0+LAorICBwdWIgcGFyY2VsYWJsZU51bGxhYmxlTWF0cml4OiBPcHRpb248W1tPcHRpb248Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzE0X2ZpeGVkc2l6ZWFycmF5XzIxX0ZpeGVkU2l6ZUFycmF5RXhhbXBsZV8xM19JbnRQYXJjZWxhYmxlPjsgMl07IDJdPiwKKyAgcHViIGludGVyZmFjZU51bGxhYmxlTWF0cml4OiBPcHRpb248W1tPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTVfSUVtcHR5SW50ZXJmYWNlPj47IDJdOyAyXT4sCit9CitpbXBsIERlZmF1bHQgZm9yIEZpeGVkU2l6ZUFycmF5RXhhbXBsZSB7CisgIGZuIGRlZmF1bHQoKSAtPiBTZWxmIHsKKyAgICBTZWxmIHsKKyAgICAgIGludDJ4MzogW1sxLCAyLCAzXSwgWzQsIDUsIDZdXSwKKyAgICAgIGJvb2xBcnJheTogW0RlZmF1bHQ6OmRlZmF1bHQoKSwgRGVmYXVsdDo6ZGVmYXVsdCgpXSwKKyAgICAgIGJ5dGVBcnJheTogW0RlZmF1bHQ6OmRlZmF1bHQoKSwgRGVmYXVsdDo6ZGVmYXVsdCgpXSwKKyAgICAgIGNoYXJBcnJheTogW0RlZmF1bHQ6OmRlZmF1bHQoKSwgRGVmYXVsdDo6ZGVmYXVsdCgpXSwKKyAgICAgIGludEFycmF5OiBbRGVmYXVsdDo6ZGVmYXVsdCgpLCBEZWZhdWx0OjpkZWZhdWx0KCldLAorICAgICAgbG9uZ0FycmF5OiBbRGVmYXVsdDo6ZGVmYXVsdCgpLCBEZWZhdWx0OjpkZWZhdWx0KCldLAorICAgICAgZmxvYXRBcnJheTogW0RlZmF1bHQ6OmRlZmF1bHQoKSwgRGVmYXVsdDo6ZGVmYXVsdCgpXSwKKyAgICAgIGRvdWJsZUFycmF5OiBbRGVmYXVsdDo6ZGVmYXVsdCgpLCBEZWZhdWx0OjpkZWZhdWx0KCldLAorICAgICAgc3RyaW5nQXJyYXk6IFsiaGVsbG8iLmludG8oKSwgIndvcmxkIi5pbnRvKCldLAorICAgICAgYnl0ZUVudW1BcnJheTogW0RlZmF1bHQ6OmRlZmF1bHQoKSwgRGVmYXVsdDo6ZGVmYXVsdCgpXSwKKyAgICAgIGludEVudW1BcnJheTogW0RlZmF1bHQ6OmRlZmF1bHQoKSwgRGVmYXVsdDo6ZGVmYXVsdCgpXSwKKyAgICAgIGxvbmdFbnVtQXJyYXk6IFtEZWZhdWx0OjpkZWZhdWx0KCksIERlZmF1bHQ6OmRlZmF1bHQoKV0sCisgICAgICBwYXJjZWxhYmxlQXJyYXk6IFtEZWZhdWx0OjpkZWZhdWx0KCksIERlZmF1bHQ6OmRlZmF1bHQoKV0sCisgICAgICBib29sTWF0cml4OiBbW0RlZmF1bHQ6OmRlZmF1bHQoKSwgRGVmYXVsdDo6ZGVmYXVsdCgpXSwgW0RlZmF1bHQ6OmRlZmF1bHQoKSwgRGVmYXVsdDo6ZGVmYXVsdCgpXV0sCisgICAgICBieXRlTWF0cml4OiBbW0RlZmF1bHQ6OmRlZmF1bHQoKSwgRGVmYXVsdDo6ZGVmYXVsdCgpXSwgW0RlZmF1bHQ6OmRlZmF1bHQoKSwgRGVmYXVsdDo6ZGVmYXVsdCgpXV0sCisgICAgICBjaGFyTWF0cml4OiBbW0RlZmF1bHQ6OmRlZmF1bHQoKSwgRGVmYXVsdDo6ZGVmYXVsdCgpXSwgW0RlZmF1bHQ6OmRlZmF1bHQoKSwgRGVmYXVsdDo6ZGVmYXVsdCgpXV0sCisgICAgICBpbnRNYXRyaXg6IFtbRGVmYXVsdDo6ZGVmYXVsdCgpLCBEZWZhdWx0OjpkZWZhdWx0KCldLCBbRGVmYXVsdDo6ZGVmYXVsdCgpLCBEZWZhdWx0OjpkZWZhdWx0KCldXSwKKyAgICAgIGxvbmdNYXRyaXg6IFtbRGVmYXVsdDo6ZGVmYXVsdCgpLCBEZWZhdWx0OjpkZWZhdWx0KCldLCBbRGVmYXVsdDo6ZGVmYXVsdCgpLCBEZWZhdWx0OjpkZWZhdWx0KCldXSwKKyAgICAgIGZsb2F0TWF0cml4OiBbW0RlZmF1bHQ6OmRlZmF1bHQoKSwgRGVmYXVsdDo6ZGVmYXVsdCgpXSwgW0RlZmF1bHQ6OmRlZmF1bHQoKSwgRGVmYXVsdDo6ZGVmYXVsdCgpXV0sCisgICAgICBkb3VibGVNYXRyaXg6IFtbRGVmYXVsdDo6ZGVmYXVsdCgpLCBEZWZhdWx0OjpkZWZhdWx0KCldLCBbRGVmYXVsdDo6ZGVmYXVsdCgpLCBEZWZhdWx0OjpkZWZhdWx0KCldXSwKKyAgICAgIHN0cmluZ01hdHJpeDogW1siaGVsbG8iLmludG8oKSwgIndvcmxkIi5pbnRvKCldLCBbIkNpYW8iLmludG8oKSwgIm1vbmRvIi5pbnRvKCldXSwKKyAgICAgIGJ5dGVFbnVtTWF0cml4OiBbW0RlZmF1bHQ6OmRlZmF1bHQoKSwgRGVmYXVsdDo6ZGVmYXVsdCgpXSwgW0RlZmF1bHQ6OmRlZmF1bHQoKSwgRGVmYXVsdDo6ZGVmYXVsdCgpXV0sCisgICAgICBpbnRFbnVtTWF0cml4OiBbW0RlZmF1bHQ6OmRlZmF1bHQoKSwgRGVmYXVsdDo6ZGVmYXVsdCgpXSwgW0RlZmF1bHQ6OmRlZmF1bHQoKSwgRGVmYXVsdDo6ZGVmYXVsdCgpXV0sCisgICAgICBsb25nRW51bU1hdHJpeDogW1tEZWZhdWx0OjpkZWZhdWx0KCksIERlZmF1bHQ6OmRlZmF1bHQoKV0sIFtEZWZhdWx0OjpkZWZhdWx0KCksIERlZmF1bHQ6OmRlZmF1bHQoKV1dLAorICAgICAgcGFyY2VsYWJsZU1hdHJpeDogW1tEZWZhdWx0OjpkZWZhdWx0KCksIERlZmF1bHQ6OmRlZmF1bHQoKV0sIFtEZWZhdWx0OjpkZWZhdWx0KCksIERlZmF1bHQ6OmRlZmF1bHQoKV1dLAorICAgICAgYm9vbE51bGxhYmxlQXJyYXk6IERlZmF1bHQ6OmRlZmF1bHQoKSwKKyAgICAgIGJ5dGVOdWxsYWJsZUFycmF5OiBEZWZhdWx0OjpkZWZhdWx0KCksCisgICAgICBjaGFyTnVsbGFibGVBcnJheTogRGVmYXVsdDo6ZGVmYXVsdCgpLAorICAgICAgaW50TnVsbGFibGVBcnJheTogRGVmYXVsdDo6ZGVmYXVsdCgpLAorICAgICAgbG9uZ051bGxhYmxlQXJyYXk6IERlZmF1bHQ6OmRlZmF1bHQoKSwKKyAgICAgIGZsb2F0TnVsbGFibGVBcnJheTogRGVmYXVsdDo6ZGVmYXVsdCgpLAorICAgICAgZG91YmxlTnVsbGFibGVBcnJheTogRGVmYXVsdDo6ZGVmYXVsdCgpLAorICAgICAgc3RyaW5nTnVsbGFibGVBcnJheTogU29tZShbU29tZSgiaGVsbG8iLmludG8oKSksIFNvbWUoIndvcmxkIi5pbnRvKCkpXSksCisgICAgICBieXRlRW51bU51bGxhYmxlQXJyYXk6IERlZmF1bHQ6OmRlZmF1bHQoKSwKKyAgICAgIGludEVudW1OdWxsYWJsZUFycmF5OiBEZWZhdWx0OjpkZWZhdWx0KCksCisgICAgICBsb25nRW51bU51bGxhYmxlQXJyYXk6IERlZmF1bHQ6OmRlZmF1bHQoKSwKKyAgICAgIGJpbmRlck51bGxhYmxlQXJyYXk6IERlZmF1bHQ6OmRlZmF1bHQoKSwKKyAgICAgIHBmZE51bGxhYmxlQXJyYXk6IERlZmF1bHQ6OmRlZmF1bHQoKSwKKyAgICAgIHBhcmNlbGFibGVOdWxsYWJsZUFycmF5OiBEZWZhdWx0OjpkZWZhdWx0KCksCisgICAgICBpbnRlcmZhY2VOdWxsYWJsZUFycmF5OiBEZWZhdWx0OjpkZWZhdWx0KCksCisgICAgICBib29sTnVsbGFibGVNYXRyaXg6IERlZmF1bHQ6OmRlZmF1bHQoKSwKKyAgICAgIGJ5dGVOdWxsYWJsZU1hdHJpeDogRGVmYXVsdDo6ZGVmYXVsdCgpLAorICAgICAgY2hhck51bGxhYmxlTWF0cml4OiBEZWZhdWx0OjpkZWZhdWx0KCksCisgICAgICBpbnROdWxsYWJsZU1hdHJpeDogRGVmYXVsdDo6ZGVmYXVsdCgpLAorICAgICAgbG9uZ051bGxhYmxlTWF0cml4OiBEZWZhdWx0OjpkZWZhdWx0KCksCisgICAgICBmbG9hdE51bGxhYmxlTWF0cml4OiBEZWZhdWx0OjpkZWZhdWx0KCksCisgICAgICBkb3VibGVOdWxsYWJsZU1hdHJpeDogRGVmYXVsdDo6ZGVmYXVsdCgpLAorICAgICAgc3RyaW5nTnVsbGFibGVNYXRyaXg6IFNvbWUoW1tTb21lKCJoZWxsbyIuaW50bygpKSwgU29tZSgid29ybGQiLmludG8oKSldLCBbU29tZSgiQ2lhbyIuaW50bygpKSwgU29tZSgibW9uZG8iLmludG8oKSldXSksCisgICAgICBieXRlRW51bU51bGxhYmxlTWF0cml4OiBEZWZhdWx0OjpkZWZhdWx0KCksCisgICAgICBpbnRFbnVtTnVsbGFibGVNYXRyaXg6IERlZmF1bHQ6OmRlZmF1bHQoKSwKKyAgICAgIGxvbmdFbnVtTnVsbGFibGVNYXRyaXg6IERlZmF1bHQ6OmRlZmF1bHQoKSwKKyAgICAgIGJpbmRlck51bGxhYmxlTWF0cml4OiBEZWZhdWx0OjpkZWZhdWx0KCksCisgICAgICBwZmROdWxsYWJsZU1hdHJpeDogRGVmYXVsdDo6ZGVmYXVsdCgpLAorICAgICAgcGFyY2VsYWJsZU51bGxhYmxlTWF0cml4OiBEZWZhdWx0OjpkZWZhdWx0KCksCisgICAgICBpbnRlcmZhY2VOdWxsYWJsZU1hdHJpeDogRGVmYXVsdDo6ZGVmYXVsdCgpLAorICAgIH0KKyAgfQorfQoraW1wbCBiaW5kZXI6OlBhcmNlbGFibGUgZm9yIEZpeGVkU2l6ZUFycmF5RXhhbXBsZSB7CisgIGZuIHdyaXRlX3RvX3BhcmNlbCgmc2VsZiwgcGFyY2VsOiAmbXV0IGJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsKSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsKKyAgICBwYXJjZWwuc2l6ZWRfd3JpdGUofHN1YnBhcmNlbHwgeworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmludDJ4Myk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmJvb2xBcnJheSk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmJ5dGVBcnJheSk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmNoYXJBcnJheSk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmludEFycmF5KT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYubG9uZ0FycmF5KT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuZmxvYXRBcnJheSk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmRvdWJsZUFycmF5KT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuc3RyaW5nQXJyYXkpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5ieXRlRW51bUFycmF5KT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuaW50RW51bUFycmF5KT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYubG9uZ0VudW1BcnJheSk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLnBhcmNlbGFibGVBcnJheSk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmJvb2xNYXRyaXgpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5ieXRlTWF0cml4KT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuY2hhck1hdHJpeCk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmludE1hdHJpeCk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmxvbmdNYXRyaXgpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5mbG9hdE1hdHJpeCk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmRvdWJsZU1hdHJpeCk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLnN0cmluZ01hdHJpeCk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmJ5dGVFbnVtTWF0cml4KT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuaW50RW51bU1hdHJpeCk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmxvbmdFbnVtTWF0cml4KT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYucGFyY2VsYWJsZU1hdHJpeCk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmJvb2xOdWxsYWJsZUFycmF5KT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuYnl0ZU51bGxhYmxlQXJyYXkpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5jaGFyTnVsbGFibGVBcnJheSk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmludE51bGxhYmxlQXJyYXkpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5sb25nTnVsbGFibGVBcnJheSk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmZsb2F0TnVsbGFibGVBcnJheSk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmRvdWJsZU51bGxhYmxlQXJyYXkpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5zdHJpbmdOdWxsYWJsZUFycmF5KT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuYnl0ZUVudW1OdWxsYWJsZUFycmF5KT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuaW50RW51bU51bGxhYmxlQXJyYXkpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5sb25nRW51bU51bGxhYmxlQXJyYXkpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5iaW5kZXJOdWxsYWJsZUFycmF5KT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYucGZkTnVsbGFibGVBcnJheSk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLnBhcmNlbGFibGVOdWxsYWJsZUFycmF5KT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuaW50ZXJmYWNlTnVsbGFibGVBcnJheSk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmJvb2xOdWxsYWJsZU1hdHJpeCk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmJ5dGVOdWxsYWJsZU1hdHJpeCk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmNoYXJOdWxsYWJsZU1hdHJpeCk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmludE51bGxhYmxlTWF0cml4KT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYubG9uZ051bGxhYmxlTWF0cml4KT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuZmxvYXROdWxsYWJsZU1hdHJpeCk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmRvdWJsZU51bGxhYmxlTWF0cml4KT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuc3RyaW5nTnVsbGFibGVNYXRyaXgpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5ieXRlRW51bU51bGxhYmxlTWF0cml4KT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuaW50RW51bU51bGxhYmxlTWF0cml4KT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYubG9uZ0VudW1OdWxsYWJsZU1hdHJpeCk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmJpbmRlck51bGxhYmxlTWF0cml4KT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYucGZkTnVsbGFibGVNYXRyaXgpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5wYXJjZWxhYmxlTnVsbGFibGVNYXRyaXgpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5pbnRlcmZhY2VOdWxsYWJsZU1hdHJpeCk/OworICAgICAgT2soKCkpCisgICAgfSkKKyAgfQorICBmbiByZWFkX2Zyb21fcGFyY2VsKCZtdXQgc2VsZiwgcGFyY2VsOiAmYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWwpIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4geworICAgIHBhcmNlbC5zaXplZF9yZWFkKHxzdWJwYXJjZWx8IHsKKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmludDJ4MyA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuYm9vbEFycmF5ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5ieXRlQXJyYXkgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmNoYXJBcnJheSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuaW50QXJyYXkgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmxvbmdBcnJheSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuZmxvYXRBcnJheSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuZG91YmxlQXJyYXkgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLnN0cmluZ0FycmF5ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5ieXRlRW51bUFycmF5ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5pbnRFbnVtQXJyYXkgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmxvbmdFbnVtQXJyYXkgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLnBhcmNlbGFibGVBcnJheSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuYm9vbE1hdHJpeCA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuYnl0ZU1hdHJpeCA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuY2hhck1hdHJpeCA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuaW50TWF0cml4ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5sb25nTWF0cml4ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5mbG9hdE1hdHJpeCA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuZG91YmxlTWF0cml4ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5zdHJpbmdNYXRyaXggPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmJ5dGVFbnVtTWF0cml4ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5pbnRFbnVtTWF0cml4ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5sb25nRW51bU1hdHJpeCA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYucGFyY2VsYWJsZU1hdHJpeCA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuYm9vbE51bGxhYmxlQXJyYXkgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmJ5dGVOdWxsYWJsZUFycmF5ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5jaGFyTnVsbGFibGVBcnJheSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuaW50TnVsbGFibGVBcnJheSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYubG9uZ051bGxhYmxlQXJyYXkgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmZsb2F0TnVsbGFibGVBcnJheSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuZG91YmxlTnVsbGFibGVBcnJheSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuc3RyaW5nTnVsbGFibGVBcnJheSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuYnl0ZUVudW1OdWxsYWJsZUFycmF5ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5pbnRFbnVtTnVsbGFibGVBcnJheSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYubG9uZ0VudW1OdWxsYWJsZUFycmF5ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5iaW5kZXJOdWxsYWJsZUFycmF5ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5wZmROdWxsYWJsZUFycmF5ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5wYXJjZWxhYmxlTnVsbGFibGVBcnJheSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuaW50ZXJmYWNlTnVsbGFibGVBcnJheSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuYm9vbE51bGxhYmxlTWF0cml4ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5ieXRlTnVsbGFibGVNYXRyaXggPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmNoYXJOdWxsYWJsZU1hdHJpeCA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuaW50TnVsbGFibGVNYXRyaXggPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmxvbmdOdWxsYWJsZU1hdHJpeCA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuZmxvYXROdWxsYWJsZU1hdHJpeCA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuZG91YmxlTnVsbGFibGVNYXRyaXggPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLnN0cmluZ051bGxhYmxlTWF0cml4ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5ieXRlRW51bU51bGxhYmxlTWF0cml4ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5pbnRFbnVtTnVsbGFibGVNYXRyaXggPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmxvbmdFbnVtTnVsbGFibGVNYXRyaXggPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmJpbmRlck51bGxhYmxlTWF0cml4ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5wZmROdWxsYWJsZU1hdHJpeCA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYucGFyY2VsYWJsZU51bGxhYmxlTWF0cml4ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5pbnRlcmZhY2VOdWxsYWJsZU1hdHJpeCA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgT2soKCkpCisgICAgfSkKKyAgfQorfQorYmluZGVyOjppbXBsX3NlcmlhbGl6ZV9mb3JfcGFyY2VsYWJsZSEoRml4ZWRTaXplQXJyYXlFeGFtcGxlKTsKK2JpbmRlcjo6aW1wbF9kZXNlcmlhbGl6ZV9mb3JfcGFyY2VsYWJsZSEoRml4ZWRTaXplQXJyYXlFeGFtcGxlKTsKK2ltcGwgYmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsYWJsZU1ldGFkYXRhIGZvciBGaXhlZFNpemVBcnJheUV4YW1wbGUgeworICBmbiBnZXRfZGVzY3JpcHRvcigpIC0+ICYnc3RhdGljIHN0ciB7ICJhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlIiB9Cit9CitwdWIgbW9kIElSZXBlYXRGaXhlZFNpemVBcnJheSB7CisgICMhW2FsbG93KG5vbl91cHBlcl9jYXNlX2dsb2JhbHMpXQorICAjIVthbGxvdyhub25fc25ha2VfY2FzZSldCisgICNbYWxsb3codW51c2VkX2ltcG9ydHMpXSB1c2UgYmluZGVyOjpiaW5kZXJfaW1wbDo6SUJpbmRlckludGVybmFsOworICB1c2UgYmluZGVyOjpkZWNsYXJlX2JpbmRlcl9pbnRlcmZhY2U7CisgIGRlY2xhcmVfYmluZGVyX2ludGVyZmFjZSEgeworICAgIElSZXBlYXRGaXhlZFNpemVBcnJheVsiYW5kcm9pZC5haWRsLmZpeGVkc2l6ZWFycmF5LkZpeGVkU2l6ZUFycmF5RXhhbXBsZS5JUmVwZWF0Rml4ZWRTaXplQXJyYXkiXSB7CisgICAgICBuYXRpdmU6IEJuUmVwZWF0Rml4ZWRTaXplQXJyYXkob25fdHJhbnNhY3QpLAorICAgICAgcHJveHk6IEJwUmVwZWF0Rml4ZWRTaXplQXJyYXkgeworICAgICAgfSwKKyAgICAgIGFzeW5jOiBJUmVwZWF0Rml4ZWRTaXplQXJyYXlBc3luYywKKyAgICB9CisgIH0KKyAgcHViIHRyYWl0IElSZXBlYXRGaXhlZFNpemVBcnJheTogYmluZGVyOjpJbnRlcmZhY2UgKyBTZW5kIHsKKyAgICBmbiBnZXRfZGVzY3JpcHRvcigpIC0+ICYnc3RhdGljIHN0ciB3aGVyZSBTZWxmOiBTaXplZCB7ICJhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLklSZXBlYXRGaXhlZFNpemVBcnJheSIgfQorICAgIGZuIFJlcGVhdEJ5dGVzKCZzZWxmLCBfYXJnX2lucHV0OiAmW3U4OyAzXSwgX2FyZ19yZXBlYXRlZDogJm11dCBbdTg7IDNdKSAtPiBiaW5kZXI6OlJlc3VsdDxbdTg7IDNdPjsKKyAgICBmbiBSZXBlYXRJbnRzKCZzZWxmLCBfYXJnX2lucHV0OiAmW2kzMjsgM10sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgW2kzMjsgM10pIC0+IGJpbmRlcjo6UmVzdWx0PFtpMzI7IDNdPjsKKyAgICBmbiBSZXBlYXRCaW5kZXJzKCZzZWxmLCBfYXJnX2lucHV0OiAmW2JpbmRlcjo6U3BJQmluZGVyOyAzXSwgX2FyZ19yZXBlYXRlZDogJm11dCBbT3B0aW9uPGJpbmRlcjo6U3BJQmluZGVyPjsgM10pIC0+IGJpbmRlcjo6UmVzdWx0PFtiaW5kZXI6OlNwSUJpbmRlcjsgM10+OworICAgIGZuIFJlcGVhdFBhcmNlbGFibGVzKCZzZWxmLCBfYXJnX2lucHV0OiAmW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTNfSW50UGFyY2VsYWJsZTsgM10sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTNfSW50UGFyY2VsYWJsZTsgM10pIC0+IGJpbmRlcjo6UmVzdWx0PFtjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfMTRfZml4ZWRzaXplYXJyYXlfMjFfRml4ZWRTaXplQXJyYXlFeGFtcGxlXzEzX0ludFBhcmNlbGFibGU7IDNdPjsKKyAgICBmbiBSZXBlYXQyZEJ5dGVzKCZzZWxmLCBfYXJnX2lucHV0OiAmW1t1ODsgM107IDJdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFtbdTg7IDNdOyAyXSkgLT4gYmluZGVyOjpSZXN1bHQ8W1t1ODsgM107IDJdPjsKKyAgICBmbiBSZXBlYXQyZEludHMoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbW2kzMjsgM107IDJdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFtbaTMyOyAzXTsgMl0pIC0+IGJpbmRlcjo6UmVzdWx0PFtbaTMyOyAzXTsgMl0+OworICAgIGZuIFJlcGVhdDJkQmluZGVycygmc2VsZiwgX2FyZ19pbnB1dDogJltbYmluZGVyOjpTcElCaW5kZXI7IDNdOyAyXSwgX2FyZ19yZXBlYXRlZDogJm11dCBbW09wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj47IDNdOyAyXSkgLT4gYmluZGVyOjpSZXN1bHQ8W1tiaW5kZXI6OlNwSUJpbmRlcjsgM107IDJdPjsKKyAgICBmbiBSZXBlYXQyZFBhcmNlbGFibGVzKCZzZWxmLCBfYXJnX2lucHV0OiAmW1tjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfMTRfZml4ZWRzaXplYXJyYXlfMjFfRml4ZWRTaXplQXJyYXlFeGFtcGxlXzEzX0ludFBhcmNlbGFibGU7IDNdOyAyXSwgX2FyZ19yZXBlYXRlZDogJm11dCBbW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTNfSW50UGFyY2VsYWJsZTsgM107IDJdKSAtPiBiaW5kZXI6OlJlc3VsdDxbW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTNfSW50UGFyY2VsYWJsZTsgM107IDJdPjsKKyAgICBmbiBnZXREZWZhdWx0SW1wbCgpIC0+IElSZXBlYXRGaXhlZFNpemVBcnJheURlZmF1bHRSZWYgd2hlcmUgU2VsZjogU2l6ZWQgeworICAgICAgREVGQVVMVF9JTVBMLmxvY2soKS51bndyYXAoKS5jbG9uZSgpCisgICAgfQorICAgIGZuIHNldERlZmF1bHRJbXBsKGQ6IElSZXBlYXRGaXhlZFNpemVBcnJheURlZmF1bHRSZWYpIC0+IElSZXBlYXRGaXhlZFNpemVBcnJheURlZmF1bHRSZWYgd2hlcmUgU2VsZjogU2l6ZWQgeworICAgICAgc3RkOjptZW06OnJlcGxhY2UoJm11dCAqREVGQVVMVF9JTVBMLmxvY2soKS51bndyYXAoKSwgZCkKKyAgICB9CisgIH0KKyAgcHViIHRyYWl0IElSZXBlYXRGaXhlZFNpemVBcnJheUFzeW5jPFA+OiBiaW5kZXI6OkludGVyZmFjZSArIFNlbmQgeworICAgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHdoZXJlIFNlbGY6IFNpemVkIHsgImFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSVJlcGVhdEZpeGVkU2l6ZUFycmF5IiB9CisgICAgZm4gUmVwZWF0Qnl0ZXM8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiAmJ2EgW3U4OyAzXSwgX2FyZ19yZXBlYXRlZDogJidhIG11dCBbdTg7IDNdKSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8W3U4OyAzXT4+OworICAgIGZuIFJlcGVhdEludHM8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiAmJ2EgW2kzMjsgM10sIF9hcmdfcmVwZWF0ZWQ6ICYnYSBtdXQgW2kzMjsgM10pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxbaTMyOyAzXT4+OworICAgIGZuIFJlcGVhdEJpbmRlcnM8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiAmJ2EgW2JpbmRlcjo6U3BJQmluZGVyOyAzXSwgX2FyZ19yZXBlYXRlZDogJidhIG11dCBbT3B0aW9uPGJpbmRlcjo6U3BJQmluZGVyPjsgM10pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxbYmluZGVyOjpTcElCaW5kZXI7IDNdPj47CisgICAgZm4gUmVwZWF0UGFyY2VsYWJsZXM8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiAmJ2EgW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTNfSW50UGFyY2VsYWJsZTsgM10sIF9hcmdfcmVwZWF0ZWQ6ICYnYSBtdXQgW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTNfSW50UGFyY2VsYWJsZTsgM10pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzE0X2ZpeGVkc2l6ZWFycmF5XzIxX0ZpeGVkU2l6ZUFycmF5RXhhbXBsZV8xM19JbnRQYXJjZWxhYmxlOyAzXT4+OworICAgIGZuIFJlcGVhdDJkQnl0ZXM8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiAmJ2EgW1t1ODsgM107IDJdLCBfYXJnX3JlcGVhdGVkOiAmJ2EgbXV0IFtbdTg7IDNdOyAyXSkgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PFtbdTg7IDNdOyAyXT4+OworICAgIGZuIFJlcGVhdDJkSW50czwnYT4oJidhIHNlbGYsIF9hcmdfaW5wdXQ6ICYnYSBbW2kzMjsgM107IDJdLCBfYXJnX3JlcGVhdGVkOiAmJ2EgbXV0IFtbaTMyOyAzXTsgMl0pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxbW2kzMjsgM107IDJdPj47CisgICAgZm4gUmVwZWF0MmRCaW5kZXJzPCdhPigmJ2Egc2VsZiwgX2FyZ19pbnB1dDogJidhIFtbYmluZGVyOjpTcElCaW5kZXI7IDNdOyAyXSwgX2FyZ19yZXBlYXRlZDogJidhIG11dCBbW09wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj47IDNdOyAyXSkgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PFtbYmluZGVyOjpTcElCaW5kZXI7IDNdOyAyXT4+OworICAgIGZuIFJlcGVhdDJkUGFyY2VsYWJsZXM8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiAmJ2EgW1tjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfMTRfZml4ZWRzaXplYXJyYXlfMjFfRml4ZWRTaXplQXJyYXlFeGFtcGxlXzEzX0ludFBhcmNlbGFibGU7IDNdOyAyXSwgX2FyZ19yZXBlYXRlZDogJidhIG11dCBbW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTNfSW50UGFyY2VsYWJsZTsgM107IDJdKSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8W1tjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfMTRfZml4ZWRzaXplYXJyYXlfMjFfRml4ZWRTaXplQXJyYXlFeGFtcGxlXzEzX0ludFBhcmNlbGFibGU7IDNdOyAyXT4+OworICB9CisgICNbOjphc3luY190cmFpdDo6YXN5bmNfdHJhaXRdCisgIHB1YiB0cmFpdCBJUmVwZWF0Rml4ZWRTaXplQXJyYXlBc3luY1NlcnZlcjogYmluZGVyOjpJbnRlcmZhY2UgKyBTZW5kIHsKKyAgICBmbiBnZXRfZGVzY3JpcHRvcigpIC0+ICYnc3RhdGljIHN0ciB3aGVyZSBTZWxmOiBTaXplZCB7ICJhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLklSZXBlYXRGaXhlZFNpemVBcnJheSIgfQorICAgIGFzeW5jIGZuIFJlcGVhdEJ5dGVzKCZzZWxmLCBfYXJnX2lucHV0OiAmW3U4OyAzXSwgX2FyZ19yZXBlYXRlZDogJm11dCBbdTg7IDNdKSAtPiBiaW5kZXI6OlJlc3VsdDxbdTg7IDNdPjsKKyAgICBhc3luYyBmbiBSZXBlYXRJbnRzKCZzZWxmLCBfYXJnX2lucHV0OiAmW2kzMjsgM10sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgW2kzMjsgM10pIC0+IGJpbmRlcjo6UmVzdWx0PFtpMzI7IDNdPjsKKyAgICBhc3luYyBmbiBSZXBlYXRCaW5kZXJzKCZzZWxmLCBfYXJnX2lucHV0OiAmW2JpbmRlcjo6U3BJQmluZGVyOyAzXSwgX2FyZ19yZXBlYXRlZDogJm11dCBbT3B0aW9uPGJpbmRlcjo6U3BJQmluZGVyPjsgM10pIC0+IGJpbmRlcjo6UmVzdWx0PFtiaW5kZXI6OlNwSUJpbmRlcjsgM10+OworICAgIGFzeW5jIGZuIFJlcGVhdFBhcmNlbGFibGVzKCZzZWxmLCBfYXJnX2lucHV0OiAmW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTNfSW50UGFyY2VsYWJsZTsgM10sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTNfSW50UGFyY2VsYWJsZTsgM10pIC0+IGJpbmRlcjo6UmVzdWx0PFtjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfMTRfZml4ZWRzaXplYXJyYXlfMjFfRml4ZWRTaXplQXJyYXlFeGFtcGxlXzEzX0ludFBhcmNlbGFibGU7IDNdPjsKKyAgICBhc3luYyBmbiBSZXBlYXQyZEJ5dGVzKCZzZWxmLCBfYXJnX2lucHV0OiAmW1t1ODsgM107IDJdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFtbdTg7IDNdOyAyXSkgLT4gYmluZGVyOjpSZXN1bHQ8W1t1ODsgM107IDJdPjsKKyAgICBhc3luYyBmbiBSZXBlYXQyZEludHMoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbW2kzMjsgM107IDJdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFtbaTMyOyAzXTsgMl0pIC0+IGJpbmRlcjo6UmVzdWx0PFtbaTMyOyAzXTsgMl0+OworICAgIGFzeW5jIGZuIFJlcGVhdDJkQmluZGVycygmc2VsZiwgX2FyZ19pbnB1dDogJltbYmluZGVyOjpTcElCaW5kZXI7IDNdOyAyXSwgX2FyZ19yZXBlYXRlZDogJm11dCBbW09wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj47IDNdOyAyXSkgLT4gYmluZGVyOjpSZXN1bHQ8W1tiaW5kZXI6OlNwSUJpbmRlcjsgM107IDJdPjsKKyAgICBhc3luYyBmbiBSZXBlYXQyZFBhcmNlbGFibGVzKCZzZWxmLCBfYXJnX2lucHV0OiAmW1tjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfMTRfZml4ZWRzaXplYXJyYXlfMjFfRml4ZWRTaXplQXJyYXlFeGFtcGxlXzEzX0ludFBhcmNlbGFibGU7IDNdOyAyXSwgX2FyZ19yZXBlYXRlZDogJm11dCBbW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTNfSW50UGFyY2VsYWJsZTsgM107IDJdKSAtPiBiaW5kZXI6OlJlc3VsdDxbW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTNfSW50UGFyY2VsYWJsZTsgM107IDJdPjsKKyAgfQorICBpbXBsIEJuUmVwZWF0Rml4ZWRTaXplQXJyYXkgeworICAgIC8vLyBDcmVhdGUgYSBuZXcgYXN5bmMgYmluZGVyIHNlcnZpY2UuCisgICAgcHViIGZuIG5ld19hc3luY19iaW5kZXI8VCwgUj4oaW5uZXI6IFQsIHJ0OiBSLCBmZWF0dXJlczogYmluZGVyOjpCaW5kZXJGZWF0dXJlcykgLT4gYmluZGVyOjpTdHJvbmc8ZHluIElSZXBlYXRGaXhlZFNpemVBcnJheT4KKyAgICB3aGVyZQorICAgICAgVDogSVJlcGVhdEZpeGVkU2l6ZUFycmF5QXN5bmNTZXJ2ZXIgKyBiaW5kZXI6OkludGVyZmFjZSArIFNlbmQgKyBTeW5jICsgJ3N0YXRpYywKKyAgICAgIFI6IGJpbmRlcjo6YmluZGVyX2ltcGw6OkJpbmRlckFzeW5jUnVudGltZSArIFNlbmQgKyBTeW5jICsgJ3N0YXRpYywKKyAgICB7CisgICAgICBzdHJ1Y3QgV3JhcHBlcjxULCBSPiB7CisgICAgICAgIF9pbm5lcjogVCwKKyAgICAgICAgX3J0OiBSLAorICAgICAgfQorICAgICAgaW1wbDxULCBSPiBiaW5kZXI6OkludGVyZmFjZSBmb3IgV3JhcHBlcjxULCBSPiB3aGVyZSBUOiBiaW5kZXI6OkludGVyZmFjZSwgUjogU2VuZCArIFN5bmMgeworICAgICAgICBmbiBhc19iaW5kZXIoJnNlbGYpIC0+IGJpbmRlcjo6U3BJQmluZGVyIHsgc2VsZi5faW5uZXIuYXNfYmluZGVyKCkgfQorICAgICAgICBmbiBkdW1wKCZzZWxmLCBfZmlsZTogJnN0ZDo6ZnM6OkZpbGUsIF9hcmdzOiAmWyZzdGQ6OmZmaTo6Q1N0cl0pIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4geyBzZWxmLl9pbm5lci5kdW1wKF9maWxlLCBfYXJncykgfQorICAgICAgfQorICAgICAgaW1wbDxULCBSPiBJUmVwZWF0Rml4ZWRTaXplQXJyYXkgZm9yIFdyYXBwZXI8VCwgUj4KKyAgICAgIHdoZXJlCisgICAgICAgIFQ6IElSZXBlYXRGaXhlZFNpemVBcnJheUFzeW5jU2VydmVyICsgU2VuZCArIFN5bmMgKyAnc3RhdGljLAorICAgICAgICBSOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpCaW5kZXJBc3luY1J1bnRpbWUgKyBTZW5kICsgU3luYyArICdzdGF0aWMsCisgICAgICB7CisgICAgICAgIGZuIFJlcGVhdEJ5dGVzKCZzZWxmLCBfYXJnX2lucHV0OiAmW3U4OyAzXSwgX2FyZ19yZXBlYXRlZDogJm11dCBbdTg7IDNdKSAtPiBiaW5kZXI6OlJlc3VsdDxbdTg7IDNdPiB7CisgICAgICAgICAgc2VsZi5fcnQuYmxvY2tfb24oc2VsZi5faW5uZXIuUmVwZWF0Qnl0ZXMoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCkpCisgICAgICAgIH0KKyAgICAgICAgZm4gUmVwZWF0SW50cygmc2VsZiwgX2FyZ19pbnB1dDogJltpMzI7IDNdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFtpMzI7IDNdKSAtPiBiaW5kZXI6OlJlc3VsdDxbaTMyOyAzXT4geworICAgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLlJlcGVhdEludHMoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCkpCisgICAgICAgIH0KKyAgICAgICAgZm4gUmVwZWF0QmluZGVycygmc2VsZiwgX2FyZ19pbnB1dDogJltiaW5kZXI6OlNwSUJpbmRlcjsgM10sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgW09wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj47IDNdKSAtPiBiaW5kZXI6OlJlc3VsdDxbYmluZGVyOjpTcElCaW5kZXI7IDNdPiB7CisgICAgICAgICAgc2VsZi5fcnQuYmxvY2tfb24oc2VsZi5faW5uZXIuUmVwZWF0QmluZGVycyhfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSkKKyAgICAgICAgfQorICAgICAgICBmbiBSZXBlYXRQYXJjZWxhYmxlcygmc2VsZiwgX2FyZ19pbnB1dDogJltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfMTRfZml4ZWRzaXplYXJyYXlfMjFfRml4ZWRTaXplQXJyYXlFeGFtcGxlXzEzX0ludFBhcmNlbGFibGU7IDNdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFtjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfMTRfZml4ZWRzaXplYXJyYXlfMjFfRml4ZWRTaXplQXJyYXlFeGFtcGxlXzEzX0ludFBhcmNlbGFibGU7IDNdKSAtPiBiaW5kZXI6OlJlc3VsdDxbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzE0X2ZpeGVkc2l6ZWFycmF5XzIxX0ZpeGVkU2l6ZUFycmF5RXhhbXBsZV8xM19JbnRQYXJjZWxhYmxlOyAzXT4geworICAgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLlJlcGVhdFBhcmNlbGFibGVzKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpKQorICAgICAgICB9CisgICAgICAgIGZuIFJlcGVhdDJkQnl0ZXMoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbW3U4OyAzXTsgMl0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgW1t1ODsgM107IDJdKSAtPiBiaW5kZXI6OlJlc3VsdDxbW3U4OyAzXTsgMl0+IHsKKyAgICAgICAgICBzZWxmLl9ydC5ibG9ja19vbihzZWxmLl9pbm5lci5SZXBlYXQyZEJ5dGVzKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpKQorICAgICAgICB9CisgICAgICAgIGZuIFJlcGVhdDJkSW50cygmc2VsZiwgX2FyZ19pbnB1dDogJltbaTMyOyAzXTsgMl0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgW1tpMzI7IDNdOyAyXSkgLT4gYmluZGVyOjpSZXN1bHQ8W1tpMzI7IDNdOyAyXT4geworICAgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLlJlcGVhdDJkSW50cyhfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSkKKyAgICAgICAgfQorICAgICAgICBmbiBSZXBlYXQyZEJpbmRlcnMoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbW2JpbmRlcjo6U3BJQmluZGVyOyAzXTsgMl0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgW1tPcHRpb248YmluZGVyOjpTcElCaW5kZXI+OyAzXTsgMl0pIC0+IGJpbmRlcjo6UmVzdWx0PFtbYmluZGVyOjpTcElCaW5kZXI7IDNdOyAyXT4geworICAgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLlJlcGVhdDJkQmluZGVycyhfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSkKKyAgICAgICAgfQorICAgICAgICBmbiBSZXBlYXQyZFBhcmNlbGFibGVzKCZzZWxmLCBfYXJnX2lucHV0OiAmW1tjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfMTRfZml4ZWRzaXplYXJyYXlfMjFfRml4ZWRTaXplQXJyYXlFeGFtcGxlXzEzX0ludFBhcmNlbGFibGU7IDNdOyAyXSwgX2FyZ19yZXBlYXRlZDogJm11dCBbW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTNfSW50UGFyY2VsYWJsZTsgM107IDJdKSAtPiBiaW5kZXI6OlJlc3VsdDxbW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTNfSW50UGFyY2VsYWJsZTsgM107IDJdPiB7CisgICAgICAgICAgc2VsZi5fcnQuYmxvY2tfb24oc2VsZi5faW5uZXIuUmVwZWF0MmRQYXJjZWxhYmxlcyhfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSkKKyAgICAgICAgfQorICAgICAgfQorICAgICAgbGV0IHdyYXBwZWQgPSBXcmFwcGVyIHsgX2lubmVyOiBpbm5lciwgX3J0OiBydCB9OworICAgICAgU2VsZjo6bmV3X2JpbmRlcih3cmFwcGVkLCBmZWF0dXJlcykKKyAgICB9CisgIH0KKyAgcHViIHRyYWl0IElSZXBlYXRGaXhlZFNpemVBcnJheURlZmF1bHQ6IFNlbmQgKyBTeW5jIHsKKyAgICBmbiBSZXBlYXRCeXRlcygmc2VsZiwgX2FyZ19pbnB1dDogJlt1ODsgM10sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgW3U4OyAzXSkgLT4gYmluZGVyOjpSZXN1bHQ8W3U4OyAzXT4geworICAgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTi5pbnRvKCkpCisgICAgfQorICAgIGZuIFJlcGVhdEludHMoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbaTMyOyAzXSwgX2FyZ19yZXBlYXRlZDogJm11dCBbaTMyOyAzXSkgLT4gYmluZGVyOjpSZXN1bHQ8W2kzMjsgM10+IHsKKyAgICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQorICAgIH0KKyAgICBmbiBSZXBlYXRCaW5kZXJzKCZzZWxmLCBfYXJnX2lucHV0OiAmW2JpbmRlcjo6U3BJQmluZGVyOyAzXSwgX2FyZ19yZXBlYXRlZDogJm11dCBbT3B0aW9uPGJpbmRlcjo6U3BJQmluZGVyPjsgM10pIC0+IGJpbmRlcjo6UmVzdWx0PFtiaW5kZXI6OlNwSUJpbmRlcjsgM10+IHsKKyAgICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQorICAgIH0KKyAgICBmbiBSZXBlYXRQYXJjZWxhYmxlcygmc2VsZiwgX2FyZ19pbnB1dDogJltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfMTRfZml4ZWRzaXplYXJyYXlfMjFfRml4ZWRTaXplQXJyYXlFeGFtcGxlXzEzX0ludFBhcmNlbGFibGU7IDNdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFtjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfMTRfZml4ZWRzaXplYXJyYXlfMjFfRml4ZWRTaXplQXJyYXlFeGFtcGxlXzEzX0ludFBhcmNlbGFibGU7IDNdKSAtPiBiaW5kZXI6OlJlc3VsdDxbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzE0X2ZpeGVkc2l6ZWFycmF5XzIxX0ZpeGVkU2l6ZUFycmF5RXhhbXBsZV8xM19JbnRQYXJjZWxhYmxlOyAzXT4geworICAgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTi5pbnRvKCkpCisgICAgfQorICAgIGZuIFJlcGVhdDJkQnl0ZXMoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbW3U4OyAzXTsgMl0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgW1t1ODsgM107IDJdKSAtPiBiaW5kZXI6OlJlc3VsdDxbW3U4OyAzXTsgMl0+IHsKKyAgICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQorICAgIH0KKyAgICBmbiBSZXBlYXQyZEludHMoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbW2kzMjsgM107IDJdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFtbaTMyOyAzXTsgMl0pIC0+IGJpbmRlcjo6UmVzdWx0PFtbaTMyOyAzXTsgMl0+IHsKKyAgICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQorICAgIH0KKyAgICBmbiBSZXBlYXQyZEJpbmRlcnMoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbW2JpbmRlcjo6U3BJQmluZGVyOyAzXTsgMl0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgW1tPcHRpb248YmluZGVyOjpTcElCaW5kZXI+OyAzXTsgMl0pIC0+IGJpbmRlcjo6UmVzdWx0PFtbYmluZGVyOjpTcElCaW5kZXI7IDNdOyAyXT4geworICAgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTi5pbnRvKCkpCisgICAgfQorICAgIGZuIFJlcGVhdDJkUGFyY2VsYWJsZXMoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTNfSW50UGFyY2VsYWJsZTsgM107IDJdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFtbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzE0X2ZpeGVkc2l6ZWFycmF5XzIxX0ZpeGVkU2l6ZUFycmF5RXhhbXBsZV8xM19JbnRQYXJjZWxhYmxlOyAzXTsgMl0pIC0+IGJpbmRlcjo6UmVzdWx0PFtbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzE0X2ZpeGVkc2l6ZWFycmF5XzIxX0ZpeGVkU2l6ZUFycmF5RXhhbXBsZV8xM19JbnRQYXJjZWxhYmxlOyAzXTsgMl0+IHsKKyAgICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQorICAgIH0KKyAgfQorICBwdWIgbW9kIHRyYW5zYWN0aW9ucyB7CisgICAgcHViIGNvbnN0IFJlcGVhdEJ5dGVzOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMDsKKyAgICBwdWIgY29uc3QgUmVwZWF0SW50czogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpiaW5kZXJfaW1wbDo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDE7CisgICAgcHViIGNvbnN0IFJlcGVhdEJpbmRlcnM6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyOworICAgIHB1YiBjb25zdCBSZXBlYXRQYXJjZWxhYmxlczogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpiaW5kZXJfaW1wbDo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDM7CisgICAgcHViIGNvbnN0IFJlcGVhdDJkQnl0ZXM6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0OworICAgIHB1YiBjb25zdCBSZXBlYXQyZEludHM6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1OworICAgIHB1YiBjb25zdCBSZXBlYXQyZEJpbmRlcnM6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA2OworICAgIHB1YiBjb25zdCBSZXBlYXQyZFBhcmNlbGFibGVzOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNzsKKyAgfQorICBwdWIgdHlwZSBJUmVwZWF0Rml4ZWRTaXplQXJyYXlEZWZhdWx0UmVmID0gT3B0aW9uPHN0ZDo6c3luYzo6QXJjPGR5biBJUmVwZWF0Rml4ZWRTaXplQXJyYXlEZWZhdWx0Pj47CisgIHVzZSBsYXp5X3N0YXRpYzo6bGF6eV9zdGF0aWM7CisgIGxhenlfc3RhdGljISB7CisgICAgc3RhdGljIHJlZiBERUZBVUxUX0lNUEw6IHN0ZDo6c3luYzo6TXV0ZXg8SVJlcGVhdEZpeGVkU2l6ZUFycmF5RGVmYXVsdFJlZj4gPSBzdGQ6OnN5bmM6Ok11dGV4OjpuZXcoTm9uZSk7CisgIH0KKyAgaW1wbCBCcFJlcGVhdEZpeGVkU2l6ZUFycmF5IHsKKyAgICBmbiBidWlsZF9wYXJjZWxfUmVwZWF0Qnl0ZXMoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbdTg7IDNdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFt1ODsgM10pIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbD4geworICAgICAgbGV0IG11dCBhaWRsX2RhdGEgPSBzZWxmLmJpbmRlci5wcmVwYXJlX3RyYW5zYWN0KCk/OworICAgICAgYWlkbF9kYXRhLndyaXRlKF9hcmdfaW5wdXQpPzsKKyAgICAgIE9rKGFpZGxfZGF0YSkKKyAgICB9CisgICAgZm4gcmVhZF9yZXNwb25zZV9SZXBlYXRCeXRlcygmc2VsZiwgX2FyZ19pbnB1dDogJlt1ODsgM10sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgW3U4OyAzXSwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDxbdTg7IDNdPiB7CisgICAgICBpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7CisgICAgICAgIGlmIGxldCBTb21lKF9haWRsX2RlZmF1bHRfaW1wbCkgPSA8U2VsZiBhcyBJUmVwZWF0Rml4ZWRTaXplQXJyYXk+OjpnZXREZWZhdWx0SW1wbCgpIHsKKyAgICAgICAgICByZXR1cm4gX2FpZGxfZGVmYXVsdF9pbXBsLlJlcGVhdEJ5dGVzKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpOworICAgICAgICB9CisgICAgICB9CisgICAgICBsZXQgX2FpZGxfcmVwbHkgPSBfYWlkbF9yZXBseT87CisgICAgICBsZXQgX2FpZGxfc3RhdHVzOiBiaW5kZXI6OlN0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWQoKT87CisgICAgICBpZiAhX2FpZGxfc3RhdHVzLmlzX29rKCkgeyByZXR1cm4gRXJyKF9haWRsX3N0YXR1cyk7IH0KKyAgICAgIGxldCBfYWlkbF9yZXR1cm46IFt1ODsgM10gPSBfYWlkbF9yZXBseS5yZWFkKCk/OworICAgICAgX2FpZGxfcmVwbHkucmVhZF9vbnRvKF9hcmdfcmVwZWF0ZWQpPzsKKyAgICAgIE9rKF9haWRsX3JldHVybikKKyAgICB9CisgICAgZm4gYnVpbGRfcGFyY2VsX1JlcGVhdEludHMoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbaTMyOyAzXSwgX2FyZ19yZXBlYXRlZDogJm11dCBbaTMyOyAzXSkgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsPiB7CisgICAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgICBhaWRsX2RhdGEud3JpdGUoX2FyZ19pbnB1dCk/OworICAgICAgT2soYWlkbF9kYXRhKQorICAgIH0KKyAgICBmbiByZWFkX3Jlc3BvbnNlX1JlcGVhdEludHMoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbaTMyOyAzXSwgX2FyZ19yZXBlYXRlZDogJm11dCBbaTMyOyAzXSwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDxbaTMyOyAzXT4geworICAgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgeworICAgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSVJlcGVhdEZpeGVkU2l6ZUFycmF5Pjo6Z2V0RGVmYXVsdEltcGwoKSB7CisgICAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5SZXBlYXRJbnRzKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpOworICAgICAgICB9CisgICAgICB9CisgICAgICBsZXQgX2FpZGxfcmVwbHkgPSBfYWlkbF9yZXBseT87CisgICAgICBsZXQgX2FpZGxfc3RhdHVzOiBiaW5kZXI6OlN0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWQoKT87CisgICAgICBpZiAhX2FpZGxfc3RhdHVzLmlzX29rKCkgeyByZXR1cm4gRXJyKF9haWRsX3N0YXR1cyk7IH0KKyAgICAgIGxldCBfYWlkbF9yZXR1cm46IFtpMzI7IDNdID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKKyAgICAgIF9haWRsX3JlcGx5LnJlYWRfb250byhfYXJnX3JlcGVhdGVkKT87CisgICAgICBPayhfYWlkbF9yZXR1cm4pCisgICAgfQorICAgIGZuIGJ1aWxkX3BhcmNlbF9SZXBlYXRCaW5kZXJzKCZzZWxmLCBfYXJnX2lucHV0OiAmW2JpbmRlcjo6U3BJQmluZGVyOyAzXSwgX2FyZ19yZXBlYXRlZDogJm11dCBbT3B0aW9uPGJpbmRlcjo6U3BJQmluZGVyPjsgM10pIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbD4geworICAgICAgbGV0IG11dCBhaWRsX2RhdGEgPSBzZWxmLmJpbmRlci5wcmVwYXJlX3RyYW5zYWN0KCk/OworICAgICAgYWlkbF9kYXRhLndyaXRlKF9hcmdfaW5wdXQpPzsKKyAgICAgIE9rKGFpZGxfZGF0YSkKKyAgICB9CisgICAgZm4gcmVhZF9yZXNwb25zZV9SZXBlYXRCaW5kZXJzKCZzZWxmLCBfYXJnX2lucHV0OiAmW2JpbmRlcjo6U3BJQmluZGVyOyAzXSwgX2FyZ19yZXBlYXRlZDogJm11dCBbT3B0aW9uPGJpbmRlcjo6U3BJQmluZGVyPjsgM10sIF9haWRsX3JlcGx5OiBzdGQ6OnJlc3VsdDo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbCwgYmluZGVyOjpTdGF0dXNDb2RlPikgLT4gYmluZGVyOjpSZXN1bHQ8W2JpbmRlcjo6U3BJQmluZGVyOyAzXT4geworICAgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgeworICAgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSVJlcGVhdEZpeGVkU2l6ZUFycmF5Pjo6Z2V0RGVmYXVsdEltcGwoKSB7CisgICAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5SZXBlYXRCaW5kZXJzKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpOworICAgICAgICB9CisgICAgICB9CisgICAgICBsZXQgX2FpZGxfcmVwbHkgPSBfYWlkbF9yZXBseT87CisgICAgICBsZXQgX2FpZGxfc3RhdHVzOiBiaW5kZXI6OlN0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWQoKT87CisgICAgICBpZiAhX2FpZGxfc3RhdHVzLmlzX29rKCkgeyByZXR1cm4gRXJyKF9haWRsX3N0YXR1cyk7IH0KKyAgICAgIGxldCBfYWlkbF9yZXR1cm46IFtiaW5kZXI6OlNwSUJpbmRlcjsgM10gPSBfYWlkbF9yZXBseS5yZWFkKCk/OworICAgICAgX2FpZGxfcmVwbHkucmVhZF9vbnRvKF9hcmdfcmVwZWF0ZWQpPzsKKyAgICAgIE9rKF9haWRsX3JldHVybikKKyAgICB9CisgICAgZm4gYnVpbGRfcGFyY2VsX1JlcGVhdFBhcmNlbGFibGVzKCZzZWxmLCBfYXJnX2lucHV0OiAmW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTNfSW50UGFyY2VsYWJsZTsgM10sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTNfSW50UGFyY2VsYWJsZTsgM10pIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbD4geworICAgICAgbGV0IG11dCBhaWRsX2RhdGEgPSBzZWxmLmJpbmRlci5wcmVwYXJlX3RyYW5zYWN0KCk/OworICAgICAgYWlkbF9kYXRhLndyaXRlKF9hcmdfaW5wdXQpPzsKKyAgICAgIE9rKGFpZGxfZGF0YSkKKyAgICB9CisgICAgZm4gcmVhZF9yZXNwb25zZV9SZXBlYXRQYXJjZWxhYmxlcygmc2VsZiwgX2FyZ19pbnB1dDogJltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfMTRfZml4ZWRzaXplYXJyYXlfMjFfRml4ZWRTaXplQXJyYXlFeGFtcGxlXzEzX0ludFBhcmNlbGFibGU7IDNdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFtjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfMTRfZml4ZWRzaXplYXJyYXlfMjFfRml4ZWRTaXplQXJyYXlFeGFtcGxlXzEzX0ludFBhcmNlbGFibGU7IDNdLCBfYWlkbF9yZXBseTogc3RkOjpyZXN1bHQ6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWwsIGJpbmRlcjo6U3RhdHVzQ29kZT4pIC0+IGJpbmRlcjo6UmVzdWx0PFtjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfMTRfZml4ZWRzaXplYXJyYXlfMjFfRml4ZWRTaXplQXJyYXlFeGFtcGxlXzEzX0ludFBhcmNlbGFibGU7IDNdPiB7CisgICAgICBpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7CisgICAgICAgIGlmIGxldCBTb21lKF9haWRsX2RlZmF1bHRfaW1wbCkgPSA8U2VsZiBhcyBJUmVwZWF0Rml4ZWRTaXplQXJyYXk+OjpnZXREZWZhdWx0SW1wbCgpIHsKKyAgICAgICAgICByZXR1cm4gX2FpZGxfZGVmYXVsdF9pbXBsLlJlcGVhdFBhcmNlbGFibGVzKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpOworICAgICAgICB9CisgICAgICB9CisgICAgICBsZXQgX2FpZGxfcmVwbHkgPSBfYWlkbF9yZXBseT87CisgICAgICBsZXQgX2FpZGxfc3RhdHVzOiBiaW5kZXI6OlN0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWQoKT87CisgICAgICBpZiAhX2FpZGxfc3RhdHVzLmlzX29rKCkgeyByZXR1cm4gRXJyKF9haWRsX3N0YXR1cyk7IH0KKyAgICAgIGxldCBfYWlkbF9yZXR1cm46IFtjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfMTRfZml4ZWRzaXplYXJyYXlfMjFfRml4ZWRTaXplQXJyYXlFeGFtcGxlXzEzX0ludFBhcmNlbGFibGU7IDNdID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKKyAgICAgIF9haWRsX3JlcGx5LnJlYWRfb250byhfYXJnX3JlcGVhdGVkKT87CisgICAgICBPayhfYWlkbF9yZXR1cm4pCisgICAgfQorICAgIGZuIGJ1aWxkX3BhcmNlbF9SZXBlYXQyZEJ5dGVzKCZzZWxmLCBfYXJnX2lucHV0OiAmW1t1ODsgM107IDJdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFtbdTg7IDNdOyAyXSkgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsPiB7CisgICAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgICBhaWRsX2RhdGEud3JpdGUoX2FyZ19pbnB1dCk/OworICAgICAgT2soYWlkbF9kYXRhKQorICAgIH0KKyAgICBmbiByZWFkX3Jlc3BvbnNlX1JlcGVhdDJkQnl0ZXMoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbW3U4OyAzXTsgMl0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgW1t1ODsgM107IDJdLCBfYWlkbF9yZXBseTogc3RkOjpyZXN1bHQ6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWwsIGJpbmRlcjo6U3RhdHVzQ29kZT4pIC0+IGJpbmRlcjo6UmVzdWx0PFtbdTg7IDNdOyAyXT4geworICAgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgeworICAgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSVJlcGVhdEZpeGVkU2l6ZUFycmF5Pjo6Z2V0RGVmYXVsdEltcGwoKSB7CisgICAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5SZXBlYXQyZEJ5dGVzKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpOworICAgICAgICB9CisgICAgICB9CisgICAgICBsZXQgX2FpZGxfcmVwbHkgPSBfYWlkbF9yZXBseT87CisgICAgICBsZXQgX2FpZGxfc3RhdHVzOiBiaW5kZXI6OlN0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWQoKT87CisgICAgICBpZiAhX2FpZGxfc3RhdHVzLmlzX29rKCkgeyByZXR1cm4gRXJyKF9haWRsX3N0YXR1cyk7IH0KKyAgICAgIGxldCBfYWlkbF9yZXR1cm46IFtbdTg7IDNdOyAyXSA9IF9haWRsX3JlcGx5LnJlYWQoKT87CisgICAgICBfYWlkbF9yZXBseS5yZWFkX29udG8oX2FyZ19yZXBlYXRlZCk/OworICAgICAgT2soX2FpZGxfcmV0dXJuKQorICAgIH0KKyAgICBmbiBidWlsZF9wYXJjZWxfUmVwZWF0MmRJbnRzKCZzZWxmLCBfYXJnX2lucHV0OiAmW1tpMzI7IDNdOyAyXSwgX2FyZ19yZXBlYXRlZDogJm11dCBbW2kzMjsgM107IDJdKSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICAgIGxldCBtdXQgYWlkbF9kYXRhID0gc2VsZi5iaW5kZXIucHJlcGFyZV90cmFuc2FjdCgpPzsKKyAgICAgIGFpZGxfZGF0YS53cml0ZShfYXJnX2lucHV0KT87CisgICAgICBPayhhaWRsX2RhdGEpCisgICAgfQorICAgIGZuIHJlYWRfcmVzcG9uc2VfUmVwZWF0MmRJbnRzKCZzZWxmLCBfYXJnX2lucHV0OiAmW1tpMzI7IDNdOyAyXSwgX2FyZ19yZXBlYXRlZDogJm11dCBbW2kzMjsgM107IDJdLCBfYWlkbF9yZXBseTogc3RkOjpyZXN1bHQ6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWwsIGJpbmRlcjo6U3RhdHVzQ29kZT4pIC0+IGJpbmRlcjo6UmVzdWx0PFtbaTMyOyAzXTsgMl0+IHsKKyAgICAgIGlmIGxldCBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKSA9IF9haWRsX3JlcGx5IHsKKyAgICAgICAgaWYgbGV0IFNvbWUoX2FpZGxfZGVmYXVsdF9pbXBsKSA9IDxTZWxmIGFzIElSZXBlYXRGaXhlZFNpemVBcnJheT46OmdldERlZmF1bHRJbXBsKCkgeworICAgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwuUmVwZWF0MmRJbnRzKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpOworICAgICAgICB9CisgICAgICB9CisgICAgICBsZXQgX2FpZGxfcmVwbHkgPSBfYWlkbF9yZXBseT87CisgICAgICBsZXQgX2FpZGxfc3RhdHVzOiBiaW5kZXI6OlN0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWQoKT87CisgICAgICBpZiAhX2FpZGxfc3RhdHVzLmlzX29rKCkgeyByZXR1cm4gRXJyKF9haWRsX3N0YXR1cyk7IH0KKyAgICAgIGxldCBfYWlkbF9yZXR1cm46IFtbaTMyOyAzXTsgMl0gPSBfYWlkbF9yZXBseS5yZWFkKCk/OworICAgICAgX2FpZGxfcmVwbHkucmVhZF9vbnRvKF9hcmdfcmVwZWF0ZWQpPzsKKyAgICAgIE9rKF9haWRsX3JldHVybikKKyAgICB9CisgICAgZm4gYnVpbGRfcGFyY2VsX1JlcGVhdDJkQmluZGVycygmc2VsZiwgX2FyZ19pbnB1dDogJltbYmluZGVyOjpTcElCaW5kZXI7IDNdOyAyXSwgX2FyZ19yZXBlYXRlZDogJm11dCBbW09wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj47IDNdOyAyXSkgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsPiB7CisgICAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgICBhaWRsX2RhdGEud3JpdGUoX2FyZ19pbnB1dCk/OworICAgICAgT2soYWlkbF9kYXRhKQorICAgIH0KKyAgICBmbiByZWFkX3Jlc3BvbnNlX1JlcGVhdDJkQmluZGVycygmc2VsZiwgX2FyZ19pbnB1dDogJltbYmluZGVyOjpTcElCaW5kZXI7IDNdOyAyXSwgX2FyZ19yZXBlYXRlZDogJm11dCBbW09wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj47IDNdOyAyXSwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDxbW2JpbmRlcjo6U3BJQmluZGVyOyAzXTsgMl0+IHsKKyAgICAgIGlmIGxldCBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKSA9IF9haWRsX3JlcGx5IHsKKyAgICAgICAgaWYgbGV0IFNvbWUoX2FpZGxfZGVmYXVsdF9pbXBsKSA9IDxTZWxmIGFzIElSZXBlYXRGaXhlZFNpemVBcnJheT46OmdldERlZmF1bHRJbXBsKCkgeworICAgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwuUmVwZWF0MmRCaW5kZXJzKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpOworICAgICAgICB9CisgICAgICB9CisgICAgICBsZXQgX2FpZGxfcmVwbHkgPSBfYWlkbF9yZXBseT87CisgICAgICBsZXQgX2FpZGxfc3RhdHVzOiBiaW5kZXI6OlN0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWQoKT87CisgICAgICBpZiAhX2FpZGxfc3RhdHVzLmlzX29rKCkgeyByZXR1cm4gRXJyKF9haWRsX3N0YXR1cyk7IH0KKyAgICAgIGxldCBfYWlkbF9yZXR1cm46IFtbYmluZGVyOjpTcElCaW5kZXI7IDNdOyAyXSA9IF9haWRsX3JlcGx5LnJlYWQoKT87CisgICAgICBfYWlkbF9yZXBseS5yZWFkX29udG8oX2FyZ19yZXBlYXRlZCk/OworICAgICAgT2soX2FpZGxfcmV0dXJuKQorICAgIH0KKyAgICBmbiBidWlsZF9wYXJjZWxfUmVwZWF0MmRQYXJjZWxhYmxlcygmc2VsZiwgX2FyZ19pbnB1dDogJltbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzE0X2ZpeGVkc2l6ZWFycmF5XzIxX0ZpeGVkU2l6ZUFycmF5RXhhbXBsZV8xM19JbnRQYXJjZWxhYmxlOyAzXTsgMl0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgW1tjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfMTRfZml4ZWRzaXplYXJyYXlfMjFfRml4ZWRTaXplQXJyYXlFeGFtcGxlXzEzX0ludFBhcmNlbGFibGU7IDNdOyAyXSkgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsPiB7CisgICAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgICBhaWRsX2RhdGEud3JpdGUoX2FyZ19pbnB1dCk/OworICAgICAgT2soYWlkbF9kYXRhKQorICAgIH0KKyAgICBmbiByZWFkX3Jlc3BvbnNlX1JlcGVhdDJkUGFyY2VsYWJsZXMoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTNfSW50UGFyY2VsYWJsZTsgM107IDJdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFtbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzE0X2ZpeGVkc2l6ZWFycmF5XzIxX0ZpeGVkU2l6ZUFycmF5RXhhbXBsZV8xM19JbnRQYXJjZWxhYmxlOyAzXTsgMl0sIF9haWRsX3JlcGx5OiBzdGQ6OnJlc3VsdDo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbCwgYmluZGVyOjpTdGF0dXNDb2RlPikgLT4gYmluZGVyOjpSZXN1bHQ8W1tjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfMTRfZml4ZWRzaXplYXJyYXlfMjFfRml4ZWRTaXplQXJyYXlFeGFtcGxlXzEzX0ludFBhcmNlbGFibGU7IDNdOyAyXT4geworICAgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgeworICAgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSVJlcGVhdEZpeGVkU2l6ZUFycmF5Pjo6Z2V0RGVmYXVsdEltcGwoKSB7CisgICAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5SZXBlYXQyZFBhcmNlbGFibGVzKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpOworICAgICAgICB9CisgICAgICB9CisgICAgICBsZXQgX2FpZGxfcmVwbHkgPSBfYWlkbF9yZXBseT87CisgICAgICBsZXQgX2FpZGxfc3RhdHVzOiBiaW5kZXI6OlN0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWQoKT87CisgICAgICBpZiAhX2FpZGxfc3RhdHVzLmlzX29rKCkgeyByZXR1cm4gRXJyKF9haWRsX3N0YXR1cyk7IH0KKyAgICAgIGxldCBfYWlkbF9yZXR1cm46IFtbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzE0X2ZpeGVkc2l6ZWFycmF5XzIxX0ZpeGVkU2l6ZUFycmF5RXhhbXBsZV8xM19JbnRQYXJjZWxhYmxlOyAzXTsgMl0gPSBfYWlkbF9yZXBseS5yZWFkKCk/OworICAgICAgX2FpZGxfcmVwbHkucmVhZF9vbnRvKF9hcmdfcmVwZWF0ZWQpPzsKKyAgICAgIE9rKF9haWRsX3JldHVybikKKyAgICB9CisgIH0KKyAgaW1wbCBJUmVwZWF0Rml4ZWRTaXplQXJyYXkgZm9yIEJwUmVwZWF0Rml4ZWRTaXplQXJyYXkgeworICAgIGZuIFJlcGVhdEJ5dGVzKCZzZWxmLCBfYXJnX2lucHV0OiAmW3U4OyAzXSwgX2FyZ19yZXBlYXRlZDogJm11dCBbdTg7IDNdKSAtPiBiaW5kZXI6OlJlc3VsdDxbdTg7IDNdPiB7CisgICAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1JlcGVhdEJ5dGVzKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpPzsKKyAgICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlcGVhdEJ5dGVzLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpOworICAgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JlcGVhdEJ5dGVzKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQsIF9haWRsX3JlcGx5KQorICAgIH0KKyAgICBmbiBSZXBlYXRJbnRzKCZzZWxmLCBfYXJnX2lucHV0OiAmW2kzMjsgM10sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgW2kzMjsgM10pIC0+IGJpbmRlcjo6UmVzdWx0PFtpMzI7IDNdPiB7CisgICAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1JlcGVhdEludHMoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCk/OworICAgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0SW50cywgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXBlYXRJbnRzKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQsIF9haWRsX3JlcGx5KQorICAgIH0KKyAgICBmbiBSZXBlYXRCaW5kZXJzKCZzZWxmLCBfYXJnX2lucHV0OiAmW2JpbmRlcjo6U3BJQmluZGVyOyAzXSwgX2FyZ19yZXBlYXRlZDogJm11dCBbT3B0aW9uPGJpbmRlcjo6U3BJQmluZGVyPjsgM10pIC0+IGJpbmRlcjo6UmVzdWx0PFtiaW5kZXI6OlNwSUJpbmRlcjsgM10+IHsKKyAgICAgIGxldCBfYWlkbF9kYXRhID0gc2VsZi5idWlsZF9wYXJjZWxfUmVwZWF0QmluZGVycyhfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKT87CisgICAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXBlYXRCaW5kZXJzLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpOworICAgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JlcGVhdEJpbmRlcnMoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCwgX2FpZGxfcmVwbHkpCisgICAgfQorICAgIGZuIFJlcGVhdFBhcmNlbGFibGVzKCZzZWxmLCBfYXJnX2lucHV0OiAmW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTNfSW50UGFyY2VsYWJsZTsgM10sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTNfSW50UGFyY2VsYWJsZTsgM10pIC0+IGJpbmRlcjo6UmVzdWx0PFtjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfMTRfZml4ZWRzaXplYXJyYXlfMjFfRml4ZWRTaXplQXJyYXlFeGFtcGxlXzEzX0ludFBhcmNlbGFibGU7IDNdPiB7CisgICAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1JlcGVhdFBhcmNlbGFibGVzKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpPzsKKyAgICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlcGVhdFBhcmNlbGFibGVzLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpOworICAgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JlcGVhdFBhcmNlbGFibGVzKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQsIF9haWRsX3JlcGx5KQorICAgIH0KKyAgICBmbiBSZXBlYXQyZEJ5dGVzKCZzZWxmLCBfYXJnX2lucHV0OiAmW1t1ODsgM107IDJdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFtbdTg7IDNdOyAyXSkgLT4gYmluZGVyOjpSZXN1bHQ8W1t1ODsgM107IDJdPiB7CisgICAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1JlcGVhdDJkQnl0ZXMoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCk/OworICAgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0MmRCeXRlcywgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXBlYXQyZEJ5dGVzKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQsIF9haWRsX3JlcGx5KQorICAgIH0KKyAgICBmbiBSZXBlYXQyZEludHMoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbW2kzMjsgM107IDJdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFtbaTMyOyAzXTsgMl0pIC0+IGJpbmRlcjo6UmVzdWx0PFtbaTMyOyAzXTsgMl0+IHsKKyAgICAgIGxldCBfYWlkbF9kYXRhID0gc2VsZi5idWlsZF9wYXJjZWxfUmVwZWF0MmRJbnRzKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpPzsKKyAgICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlcGVhdDJkSW50cywgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXBlYXQyZEludHMoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCwgX2FpZGxfcmVwbHkpCisgICAgfQorICAgIGZuIFJlcGVhdDJkQmluZGVycygmc2VsZiwgX2FyZ19pbnB1dDogJltbYmluZGVyOjpTcElCaW5kZXI7IDNdOyAyXSwgX2FyZ19yZXBlYXRlZDogJm11dCBbW09wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj47IDNdOyAyXSkgLT4gYmluZGVyOjpSZXN1bHQ8W1tiaW5kZXI6OlNwSUJpbmRlcjsgM107IDJdPiB7CisgICAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1JlcGVhdDJkQmluZGVycyhfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKT87CisgICAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXBlYXQyZEJpbmRlcnMsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCk7CisgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmVwZWF0MmRCaW5kZXJzKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQsIF9haWRsX3JlcGx5KQorICAgIH0KKyAgICBmbiBSZXBlYXQyZFBhcmNlbGFibGVzKCZzZWxmLCBfYXJnX2lucHV0OiAmW1tjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfMTRfZml4ZWRzaXplYXJyYXlfMjFfRml4ZWRTaXplQXJyYXlFeGFtcGxlXzEzX0ludFBhcmNlbGFibGU7IDNdOyAyXSwgX2FyZ19yZXBlYXRlZDogJm11dCBbW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTNfSW50UGFyY2VsYWJsZTsgM107IDJdKSAtPiBiaW5kZXI6OlJlc3VsdDxbW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTNfSW50UGFyY2VsYWJsZTsgM107IDJdPiB7CisgICAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1JlcGVhdDJkUGFyY2VsYWJsZXMoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCk/OworICAgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0MmRQYXJjZWxhYmxlcywgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXBlYXQyZFBhcmNlbGFibGVzKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQsIF9haWRsX3JlcGx5KQorICAgIH0KKyAgfQorICBpbXBsPFA6IGJpbmRlcjo6QmluZGVyQXN5bmNQb29sPiBJUmVwZWF0Rml4ZWRTaXplQXJyYXlBc3luYzxQPiBmb3IgQnBSZXBlYXRGaXhlZFNpemVBcnJheSB7CisgICAgZm4gUmVwZWF0Qnl0ZXM8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiAmJ2EgW3U4OyAzXSwgX2FyZ19yZXBlYXRlZDogJidhIG11dCBbdTg7IDNdKSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8W3U4OyAzXT4+IHsKKyAgICAgIGxldCBfYWlkbF9kYXRhID0gbWF0Y2ggc2VsZi5idWlsZF9wYXJjZWxfUmVwZWF0Qnl0ZXMoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCkgeworICAgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgICB9OworICAgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgICBQOjpzcGF3bigKKyAgICAgICAgbW92ZSB8fCBiaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0Qnl0ZXMsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmVwZWF0Qnl0ZXMoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCwgX2FpZGxfcmVwbHkpCisgICAgICAgIH0KKyAgICAgICkKKyAgICB9CisgICAgZm4gUmVwZWF0SW50czwnYT4oJidhIHNlbGYsIF9hcmdfaW5wdXQ6ICYnYSBbaTMyOyAzXSwgX2FyZ19yZXBlYXRlZDogJidhIG11dCBbaTMyOyAzXSkgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PFtpMzI7IDNdPj4geworICAgICAgbGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF9SZXBlYXRJbnRzKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpIHsKKyAgICAgICAgT2soX2FpZGxfZGF0YSkgPT4gX2FpZGxfZGF0YSwKKyAgICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgICAgfTsKKyAgICAgIGxldCBiaW5kZXIgPSBzZWxmLmJpbmRlci5jbG9uZSgpOworICAgICAgUDo6c3Bhd24oCisgICAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlcGVhdEludHMsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmVwZWF0SW50cyhfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkLCBfYWlkbF9yZXBseSkKKyAgICAgICAgfQorICAgICAgKQorICAgIH0KKyAgICBmbiBSZXBlYXRCaW5kZXJzPCdhPigmJ2Egc2VsZiwgX2FyZ19pbnB1dDogJidhIFtiaW5kZXI6OlNwSUJpbmRlcjsgM10sIF9hcmdfcmVwZWF0ZWQ6ICYnYSBtdXQgW09wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj47IDNdKSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8W2JpbmRlcjo6U3BJQmluZGVyOyAzXT4+IHsKKyAgICAgIGxldCBfYWlkbF9kYXRhID0gbWF0Y2ggc2VsZi5idWlsZF9wYXJjZWxfUmVwZWF0QmluZGVycyhfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSB7CisgICAgICAgIE9rKF9haWRsX2RhdGEpID0+IF9haWRsX2RhdGEsCisgICAgICAgIEVycihlcnIpID0+IHJldHVybiBCb3g6OnBpbihzdGQ6OmZ1dHVyZTo6cmVhZHkoRXJyKGVycikpKSwKKyAgICAgIH07CisgICAgICBsZXQgYmluZGVyID0gc2VsZi5iaW5kZXIuY2xvbmUoKTsKKyAgICAgIFA6OnNwYXduKAorICAgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXBlYXRCaW5kZXJzLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpLAorICAgICAgICBtb3ZlIHxfYWlkbF9yZXBseXwgYXN5bmMgbW92ZSB7CisgICAgICAgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JlcGVhdEJpbmRlcnMoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCwgX2FpZGxfcmVwbHkpCisgICAgICAgIH0KKyAgICAgICkKKyAgICB9CisgICAgZm4gUmVwZWF0UGFyY2VsYWJsZXM8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiAmJ2EgW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTNfSW50UGFyY2VsYWJsZTsgM10sIF9hcmdfcmVwZWF0ZWQ6ICYnYSBtdXQgW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTNfSW50UGFyY2VsYWJsZTsgM10pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzE0X2ZpeGVkc2l6ZWFycmF5XzIxX0ZpeGVkU2l6ZUFycmF5RXhhbXBsZV8xM19JbnRQYXJjZWxhYmxlOyAzXT4+IHsKKyAgICAgIGxldCBfYWlkbF9kYXRhID0gbWF0Y2ggc2VsZi5idWlsZF9wYXJjZWxfUmVwZWF0UGFyY2VsYWJsZXMoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCkgeworICAgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgICB9OworICAgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgICBQOjpzcGF3bigKKyAgICAgICAgbW92ZSB8fCBiaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0UGFyY2VsYWJsZXMsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmVwZWF0UGFyY2VsYWJsZXMoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCwgX2FpZGxfcmVwbHkpCisgICAgICAgIH0KKyAgICAgICkKKyAgICB9CisgICAgZm4gUmVwZWF0MmRCeXRlczwnYT4oJidhIHNlbGYsIF9hcmdfaW5wdXQ6ICYnYSBbW3U4OyAzXTsgMl0sIF9hcmdfcmVwZWF0ZWQ6ICYnYSBtdXQgW1t1ODsgM107IDJdKSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8W1t1ODsgM107IDJdPj4geworICAgICAgbGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF9SZXBlYXQyZEJ5dGVzKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpIHsKKyAgICAgICAgT2soX2FpZGxfZGF0YSkgPT4gX2FpZGxfZGF0YSwKKyAgICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgICAgfTsKKyAgICAgIGxldCBiaW5kZXIgPSBzZWxmLmJpbmRlci5jbG9uZSgpOworICAgICAgUDo6c3Bhd24oCisgICAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlcGVhdDJkQnl0ZXMsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmVwZWF0MmRCeXRlcyhfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkLCBfYWlkbF9yZXBseSkKKyAgICAgICAgfQorICAgICAgKQorICAgIH0KKyAgICBmbiBSZXBlYXQyZEludHM8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiAmJ2EgW1tpMzI7IDNdOyAyXSwgX2FyZ19yZXBlYXRlZDogJidhIG11dCBbW2kzMjsgM107IDJdKSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8W1tpMzI7IDNdOyAyXT4+IHsKKyAgICAgIGxldCBfYWlkbF9kYXRhID0gbWF0Y2ggc2VsZi5idWlsZF9wYXJjZWxfUmVwZWF0MmRJbnRzKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpIHsKKyAgICAgICAgT2soX2FpZGxfZGF0YSkgPT4gX2FpZGxfZGF0YSwKKyAgICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgICAgfTsKKyAgICAgIGxldCBiaW5kZXIgPSBzZWxmLmJpbmRlci5jbG9uZSgpOworICAgICAgUDo6c3Bhd24oCisgICAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlcGVhdDJkSW50cywgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKSwKKyAgICAgICAgbW92ZSB8X2FpZGxfcmVwbHl8IGFzeW5jIG1vdmUgeworICAgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXBlYXQyZEludHMoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCwgX2FpZGxfcmVwbHkpCisgICAgICAgIH0KKyAgICAgICkKKyAgICB9CisgICAgZm4gUmVwZWF0MmRCaW5kZXJzPCdhPigmJ2Egc2VsZiwgX2FyZ19pbnB1dDogJidhIFtbYmluZGVyOjpTcElCaW5kZXI7IDNdOyAyXSwgX2FyZ19yZXBlYXRlZDogJidhIG11dCBbW09wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj47IDNdOyAyXSkgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PFtbYmluZGVyOjpTcElCaW5kZXI7IDNdOyAyXT4+IHsKKyAgICAgIGxldCBfYWlkbF9kYXRhID0gbWF0Y2ggc2VsZi5idWlsZF9wYXJjZWxfUmVwZWF0MmRCaW5kZXJzKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpIHsKKyAgICAgICAgT2soX2FpZGxfZGF0YSkgPT4gX2FpZGxfZGF0YSwKKyAgICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgICAgfTsKKyAgICAgIGxldCBiaW5kZXIgPSBzZWxmLmJpbmRlci5jbG9uZSgpOworICAgICAgUDo6c3Bhd24oCisgICAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlcGVhdDJkQmluZGVycywgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKSwKKyAgICAgICAgbW92ZSB8X2FpZGxfcmVwbHl8IGFzeW5jIG1vdmUgeworICAgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXBlYXQyZEJpbmRlcnMoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCwgX2FpZGxfcmVwbHkpCisgICAgICAgIH0KKyAgICAgICkKKyAgICB9CisgICAgZm4gUmVwZWF0MmRQYXJjZWxhYmxlczwnYT4oJidhIHNlbGYsIF9hcmdfaW5wdXQ6ICYnYSBbW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTNfSW50UGFyY2VsYWJsZTsgM107IDJdLCBfYXJnX3JlcGVhdGVkOiAmJ2EgbXV0IFtbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzE0X2ZpeGVkc2l6ZWFycmF5XzIxX0ZpeGVkU2l6ZUFycmF5RXhhbXBsZV8xM19JbnRQYXJjZWxhYmxlOyAzXTsgMl0pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxbW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTNfSW50UGFyY2VsYWJsZTsgM107IDJdPj4geworICAgICAgbGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF9SZXBlYXQyZFBhcmNlbGFibGVzKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpIHsKKyAgICAgICAgT2soX2FpZGxfZGF0YSkgPT4gX2FpZGxfZGF0YSwKKyAgICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgICAgfTsKKyAgICAgIGxldCBiaW5kZXIgPSBzZWxmLmJpbmRlci5jbG9uZSgpOworICAgICAgUDo6c3Bhd24oCisgICAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlcGVhdDJkUGFyY2VsYWJsZXMsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmVwZWF0MmRQYXJjZWxhYmxlcyhfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkLCBfYWlkbF9yZXBseSkKKyAgICAgICAgfQorICAgICAgKQorICAgIH0KKyAgfQorICBpbXBsIElSZXBlYXRGaXhlZFNpemVBcnJheSBmb3IgYmluZGVyOjpiaW5kZXJfaW1wbDo6QmluZGVyPEJuUmVwZWF0Rml4ZWRTaXplQXJyYXk+IHsKKyAgICBmbiBSZXBlYXRCeXRlcygmc2VsZiwgX2FyZ19pbnB1dDogJlt1ODsgM10sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgW3U4OyAzXSkgLT4gYmluZGVyOjpSZXN1bHQ8W3U4OyAzXT4geyBzZWxmLjAuUmVwZWF0Qnl0ZXMoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCkgfQorICAgIGZuIFJlcGVhdEludHMoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbaTMyOyAzXSwgX2FyZ19yZXBlYXRlZDogJm11dCBbaTMyOyAzXSkgLT4gYmluZGVyOjpSZXN1bHQ8W2kzMjsgM10+IHsgc2VsZi4wLlJlcGVhdEludHMoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCkgfQorICAgIGZuIFJlcGVhdEJpbmRlcnMoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbYmluZGVyOjpTcElCaW5kZXI7IDNdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFtPcHRpb248YmluZGVyOjpTcElCaW5kZXI+OyAzXSkgLT4gYmluZGVyOjpSZXN1bHQ8W2JpbmRlcjo6U3BJQmluZGVyOyAzXT4geyBzZWxmLjAuUmVwZWF0QmluZGVycyhfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSB9CisgICAgZm4gUmVwZWF0UGFyY2VsYWJsZXMoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzE0X2ZpeGVkc2l6ZWFycmF5XzIxX0ZpeGVkU2l6ZUFycmF5RXhhbXBsZV8xM19JbnRQYXJjZWxhYmxlOyAzXSwgX2FyZ19yZXBlYXRlZDogJm11dCBbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzE0X2ZpeGVkc2l6ZWFycmF5XzIxX0ZpeGVkU2l6ZUFycmF5RXhhbXBsZV8xM19JbnRQYXJjZWxhYmxlOyAzXSkgLT4gYmluZGVyOjpSZXN1bHQ8W2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTNfSW50UGFyY2VsYWJsZTsgM10+IHsgc2VsZi4wLlJlcGVhdFBhcmNlbGFibGVzKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpIH0KKyAgICBmbiBSZXBlYXQyZEJ5dGVzKCZzZWxmLCBfYXJnX2lucHV0OiAmW1t1ODsgM107IDJdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFtbdTg7IDNdOyAyXSkgLT4gYmluZGVyOjpSZXN1bHQ8W1t1ODsgM107IDJdPiB7IHNlbGYuMC5SZXBlYXQyZEJ5dGVzKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpIH0KKyAgICBmbiBSZXBlYXQyZEludHMoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbW2kzMjsgM107IDJdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFtbaTMyOyAzXTsgMl0pIC0+IGJpbmRlcjo6UmVzdWx0PFtbaTMyOyAzXTsgMl0+IHsgc2VsZi4wLlJlcGVhdDJkSW50cyhfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSB9CisgICAgZm4gUmVwZWF0MmRCaW5kZXJzKCZzZWxmLCBfYXJnX2lucHV0OiAmW1tiaW5kZXI6OlNwSUJpbmRlcjsgM107IDJdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFtbT3B0aW9uPGJpbmRlcjo6U3BJQmluZGVyPjsgM107IDJdKSAtPiBiaW5kZXI6OlJlc3VsdDxbW2JpbmRlcjo6U3BJQmluZGVyOyAzXTsgMl0+IHsgc2VsZi4wLlJlcGVhdDJkQmluZGVycyhfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSB9CisgICAgZm4gUmVwZWF0MmRQYXJjZWxhYmxlcygmc2VsZiwgX2FyZ19pbnB1dDogJltbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzE0X2ZpeGVkc2l6ZWFycmF5XzIxX0ZpeGVkU2l6ZUFycmF5RXhhbXBsZV8xM19JbnRQYXJjZWxhYmxlOyAzXTsgMl0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgW1tjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfMTRfZml4ZWRzaXplYXJyYXlfMjFfRml4ZWRTaXplQXJyYXlFeGFtcGxlXzEzX0ludFBhcmNlbGFibGU7IDNdOyAyXSkgLT4gYmluZGVyOjpSZXN1bHQ8W1tjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfMTRfZml4ZWRzaXplYXJyYXlfMjFfRml4ZWRTaXplQXJyYXlFeGFtcGxlXzEzX0ludFBhcmNlbGFibGU7IDNdOyAyXT4geyBzZWxmLjAuUmVwZWF0MmRQYXJjZWxhYmxlcyhfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSB9CisgIH0KKyAgZm4gb25fdHJhbnNhY3QoX2FpZGxfc2VydmljZTogJmR5biBJUmVwZWF0Rml4ZWRTaXplQXJyYXksIF9haWRsX2NvZGU6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSwgX2FpZGxfZGF0YTogJmJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsPCdfPiwgX2FpZGxfcmVwbHk6ICZtdXQgYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWw8J18+KSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsKKyAgICBtYXRjaCBfYWlkbF9jb2RlIHsKKyAgICAgIHRyYW5zYWN0aW9uczo6UmVwZWF0Qnl0ZXMgPT4geworICAgICAgICBsZXQgX2FyZ19pbnB1dDogW3U4OyAzXSA9IF9haWRsX2RhdGEucmVhZCgpPzsKKyAgICAgICAgbGV0IG11dCBfYXJnX3JlcGVhdGVkOiBbdTg7IDNdID0gRGVmYXVsdDo6ZGVmYXVsdCgpOworICAgICAgICBsZXQgX2FpZGxfcmV0dXJuID0gX2FpZGxfc2VydmljZS5SZXBlYXRCeXRlcygmX2FyZ19pbnB1dCwgJm11dCBfYXJnX3JlcGVhdGVkKTsKKyAgICAgICAgbWF0Y2ggJl9haWRsX3JldHVybiB7CisgICAgICAgICAgT2soX2FpZGxfcmV0dXJuKSA9PiB7CisgICAgICAgICAgICBfYWlkbF9yZXBseS53cml0ZSgmYmluZGVyOjpTdGF0dXM6OmZyb20oYmluZGVyOjpTdGF0dXNDb2RlOjpPSykpPzsKKyAgICAgICAgICAgIF9haWRsX3JlcGx5LndyaXRlKF9haWRsX3JldHVybik/OworICAgICAgICAgICAgX2FpZGxfcmVwbHkud3JpdGUoJl9hcmdfcmVwZWF0ZWQpPzsKKyAgICAgICAgICB9CisgICAgICAgICAgRXJyKF9haWRsX3N0YXR1cykgPT4gX2FpZGxfcmVwbHkud3JpdGUoX2FpZGxfc3RhdHVzKT8KKyAgICAgICAgfQorICAgICAgICBPaygoKSkKKyAgICAgIH0KKyAgICAgIHRyYW5zYWN0aW9uczo6UmVwZWF0SW50cyA9PiB7CisgICAgICAgIGxldCBfYXJnX2lucHV0OiBbaTMyOyAzXSA9IF9haWRsX2RhdGEucmVhZCgpPzsKKyAgICAgICAgbGV0IG11dCBfYXJnX3JlcGVhdGVkOiBbaTMyOyAzXSA9IERlZmF1bHQ6OmRlZmF1bHQoKTsKKyAgICAgICAgbGV0IF9haWRsX3JldHVybiA9IF9haWRsX3NlcnZpY2UuUmVwZWF0SW50cygmX2FyZ19pbnB1dCwgJm11dCBfYXJnX3JlcGVhdGVkKTsKKyAgICAgICAgbWF0Y2ggJl9haWRsX3JldHVybiB7CisgICAgICAgICAgT2soX2FpZGxfcmV0dXJuKSA9PiB7CisgICAgICAgICAgICBfYWlkbF9yZXBseS53cml0ZSgmYmluZGVyOjpTdGF0dXM6OmZyb20oYmluZGVyOjpTdGF0dXNDb2RlOjpPSykpPzsKKyAgICAgICAgICAgIF9haWRsX3JlcGx5LndyaXRlKF9haWRsX3JldHVybik/OworICAgICAgICAgICAgX2FpZGxfcmVwbHkud3JpdGUoJl9hcmdfcmVwZWF0ZWQpPzsKKyAgICAgICAgICB9CisgICAgICAgICAgRXJyKF9haWRsX3N0YXR1cykgPT4gX2FpZGxfcmVwbHkud3JpdGUoX2FpZGxfc3RhdHVzKT8KKyAgICAgICAgfQorICAgICAgICBPaygoKSkKKyAgICAgIH0KKyAgICAgIHRyYW5zYWN0aW9uczo6UmVwZWF0QmluZGVycyA9PiB7CisgICAgICAgIGxldCBfYXJnX2lucHV0OiBbYmluZGVyOjpTcElCaW5kZXI7IDNdID0gX2FpZGxfZGF0YS5yZWFkKCk/OworICAgICAgICBsZXQgbXV0IF9hcmdfcmVwZWF0ZWQ6IFtPcHRpb248YmluZGVyOjpTcElCaW5kZXI+OyAzXSA9IERlZmF1bHQ6OmRlZmF1bHQoKTsKKyAgICAgICAgbGV0IF9haWRsX3JldHVybiA9IF9haWRsX3NlcnZpY2UuUmVwZWF0QmluZGVycygmX2FyZ19pbnB1dCwgJm11dCBfYXJnX3JlcGVhdGVkKTsKKyAgICAgICAgbWF0Y2ggJl9haWRsX3JldHVybiB7CisgICAgICAgICAgT2soX2FpZGxfcmV0dXJuKSA9PiB7CisgICAgICAgICAgICBfYWlkbF9yZXBseS53cml0ZSgmYmluZGVyOjpTdGF0dXM6OmZyb20oYmluZGVyOjpTdGF0dXNDb2RlOjpPSykpPzsKKyAgICAgICAgICAgIF9haWRsX3JlcGx5LndyaXRlKF9haWRsX3JldHVybik/OworICAgICAgICAgICAgX2FpZGxfcmVwbHkud3JpdGUoJl9hcmdfcmVwZWF0ZWQpPzsKKyAgICAgICAgICB9CisgICAgICAgICAgRXJyKF9haWRsX3N0YXR1cykgPT4gX2FpZGxfcmVwbHkud3JpdGUoX2FpZGxfc3RhdHVzKT8KKyAgICAgICAgfQorICAgICAgICBPaygoKSkKKyAgICAgIH0KKyAgICAgIHRyYW5zYWN0aW9uczo6UmVwZWF0UGFyY2VsYWJsZXMgPT4geworICAgICAgICBsZXQgX2FyZ19pbnB1dDogW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTNfSW50UGFyY2VsYWJsZTsgM10gPSBfYWlkbF9kYXRhLnJlYWQoKT87CisgICAgICAgIGxldCBtdXQgX2FyZ19yZXBlYXRlZDogW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTNfSW50UGFyY2VsYWJsZTsgM10gPSBEZWZhdWx0OjpkZWZhdWx0KCk7CisgICAgICAgIGxldCBfYWlkbF9yZXR1cm4gPSBfYWlkbF9zZXJ2aWNlLlJlcGVhdFBhcmNlbGFibGVzKCZfYXJnX2lucHV0LCAmbXV0IF9hcmdfcmVwZWF0ZWQpOworICAgICAgICBtYXRjaCAmX2FpZGxfcmV0dXJuIHsKKyAgICAgICAgICBPayhfYWlkbF9yZXR1cm4pID0+IHsKKyAgICAgICAgICAgIF9haWRsX3JlcGx5LndyaXRlKCZiaW5kZXI6OlN0YXR1czo6ZnJvbShiaW5kZXI6OlN0YXR1c0NvZGU6Ok9LKSk/OworICAgICAgICAgICAgX2FpZGxfcmVwbHkud3JpdGUoX2FpZGxfcmV0dXJuKT87CisgICAgICAgICAgICBfYWlkbF9yZXBseS53cml0ZSgmX2FyZ19yZXBlYXRlZCk/OworICAgICAgICAgIH0KKyAgICAgICAgICBFcnIoX2FpZGxfc3RhdHVzKSA9PiBfYWlkbF9yZXBseS53cml0ZShfYWlkbF9zdGF0dXMpPworICAgICAgICB9CisgICAgICAgIE9rKCgpKQorICAgICAgfQorICAgICAgdHJhbnNhY3Rpb25zOjpSZXBlYXQyZEJ5dGVzID0+IHsKKyAgICAgICAgbGV0IF9hcmdfaW5wdXQ6IFtbdTg7IDNdOyAyXSA9IF9haWRsX2RhdGEucmVhZCgpPzsKKyAgICAgICAgbGV0IG11dCBfYXJnX3JlcGVhdGVkOiBbW3U4OyAzXTsgMl0gPSBEZWZhdWx0OjpkZWZhdWx0KCk7CisgICAgICAgIGxldCBfYWlkbF9yZXR1cm4gPSBfYWlkbF9zZXJ2aWNlLlJlcGVhdDJkQnl0ZXMoJl9hcmdfaW5wdXQsICZtdXQgX2FyZ19yZXBlYXRlZCk7CisgICAgICAgIG1hdGNoICZfYWlkbF9yZXR1cm4geworICAgICAgICAgIE9rKF9haWRsX3JldHVybikgPT4geworICAgICAgICAgICAgX2FpZGxfcmVwbHkud3JpdGUoJmJpbmRlcjo6U3RhdHVzOjpmcm9tKGJpbmRlcjo6U3RhdHVzQ29kZTo6T0spKT87CisgICAgICAgICAgICBfYWlkbF9yZXBseS53cml0ZShfYWlkbF9yZXR1cm4pPzsKKyAgICAgICAgICAgIF9haWRsX3JlcGx5LndyaXRlKCZfYXJnX3JlcGVhdGVkKT87CisgICAgICAgICAgfQorICAgICAgICAgIEVycihfYWlkbF9zdGF0dXMpID0+IF9haWRsX3JlcGx5LndyaXRlKF9haWRsX3N0YXR1cyk/CisgICAgICAgIH0KKyAgICAgICAgT2soKCkpCisgICAgICB9CisgICAgICB0cmFuc2FjdGlvbnM6OlJlcGVhdDJkSW50cyA9PiB7CisgICAgICAgIGxldCBfYXJnX2lucHV0OiBbW2kzMjsgM107IDJdID0gX2FpZGxfZGF0YS5yZWFkKCk/OworICAgICAgICBsZXQgbXV0IF9hcmdfcmVwZWF0ZWQ6IFtbaTMyOyAzXTsgMl0gPSBEZWZhdWx0OjpkZWZhdWx0KCk7CisgICAgICAgIGxldCBfYWlkbF9yZXR1cm4gPSBfYWlkbF9zZXJ2aWNlLlJlcGVhdDJkSW50cygmX2FyZ19pbnB1dCwgJm11dCBfYXJnX3JlcGVhdGVkKTsKKyAgICAgICAgbWF0Y2ggJl9haWRsX3JldHVybiB7CisgICAgICAgICAgT2soX2FpZGxfcmV0dXJuKSA9PiB7CisgICAgICAgICAgICBfYWlkbF9yZXBseS53cml0ZSgmYmluZGVyOjpTdGF0dXM6OmZyb20oYmluZGVyOjpTdGF0dXNDb2RlOjpPSykpPzsKKyAgICAgICAgICAgIF9haWRsX3JlcGx5LndyaXRlKF9haWRsX3JldHVybik/OworICAgICAgICAgICAgX2FpZGxfcmVwbHkud3JpdGUoJl9hcmdfcmVwZWF0ZWQpPzsKKyAgICAgICAgICB9CisgICAgICAgICAgRXJyKF9haWRsX3N0YXR1cykgPT4gX2FpZGxfcmVwbHkud3JpdGUoX2FpZGxfc3RhdHVzKT8KKyAgICAgICAgfQorICAgICAgICBPaygoKSkKKyAgICAgIH0KKyAgICAgIHRyYW5zYWN0aW9uczo6UmVwZWF0MmRCaW5kZXJzID0+IHsKKyAgICAgICAgbGV0IF9hcmdfaW5wdXQ6IFtbYmluZGVyOjpTcElCaW5kZXI7IDNdOyAyXSA9IF9haWRsX2RhdGEucmVhZCgpPzsKKyAgICAgICAgbGV0IG11dCBfYXJnX3JlcGVhdGVkOiBbW09wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj47IDNdOyAyXSA9IERlZmF1bHQ6OmRlZmF1bHQoKTsKKyAgICAgICAgbGV0IF9haWRsX3JldHVybiA9IF9haWRsX3NlcnZpY2UuUmVwZWF0MmRCaW5kZXJzKCZfYXJnX2lucHV0LCAmbXV0IF9hcmdfcmVwZWF0ZWQpOworICAgICAgICBtYXRjaCAmX2FpZGxfcmV0dXJuIHsKKyAgICAgICAgICBPayhfYWlkbF9yZXR1cm4pID0+IHsKKyAgICAgICAgICAgIF9haWRsX3JlcGx5LndyaXRlKCZiaW5kZXI6OlN0YXR1czo6ZnJvbShiaW5kZXI6OlN0YXR1c0NvZGU6Ok9LKSk/OworICAgICAgICAgICAgX2FpZGxfcmVwbHkud3JpdGUoX2FpZGxfcmV0dXJuKT87CisgICAgICAgICAgICBfYWlkbF9yZXBseS53cml0ZSgmX2FyZ19yZXBlYXRlZCk/OworICAgICAgICAgIH0KKyAgICAgICAgICBFcnIoX2FpZGxfc3RhdHVzKSA9PiBfYWlkbF9yZXBseS53cml0ZShfYWlkbF9zdGF0dXMpPworICAgICAgICB9CisgICAgICAgIE9rKCgpKQorICAgICAgfQorICAgICAgdHJhbnNhY3Rpb25zOjpSZXBlYXQyZFBhcmNlbGFibGVzID0+IHsKKyAgICAgICAgbGV0IF9hcmdfaW5wdXQ6IFtbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzE0X2ZpeGVkc2l6ZWFycmF5XzIxX0ZpeGVkU2l6ZUFycmF5RXhhbXBsZV8xM19JbnRQYXJjZWxhYmxlOyAzXTsgMl0gPSBfYWlkbF9kYXRhLnJlYWQoKT87CisgICAgICAgIGxldCBtdXQgX2FyZ19yZXBlYXRlZDogW1tjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfMTRfZml4ZWRzaXplYXJyYXlfMjFfRml4ZWRTaXplQXJyYXlFeGFtcGxlXzEzX0ludFBhcmNlbGFibGU7IDNdOyAyXSA9IERlZmF1bHQ6OmRlZmF1bHQoKTsKKyAgICAgICAgbGV0IF9haWRsX3JldHVybiA9IF9haWRsX3NlcnZpY2UuUmVwZWF0MmRQYXJjZWxhYmxlcygmX2FyZ19pbnB1dCwgJm11dCBfYXJnX3JlcGVhdGVkKTsKKyAgICAgICAgbWF0Y2ggJl9haWRsX3JldHVybiB7CisgICAgICAgICAgT2soX2FpZGxfcmV0dXJuKSA9PiB7CisgICAgICAgICAgICBfYWlkbF9yZXBseS53cml0ZSgmYmluZGVyOjpTdGF0dXM6OmZyb20oYmluZGVyOjpTdGF0dXNDb2RlOjpPSykpPzsKKyAgICAgICAgICAgIF9haWRsX3JlcGx5LndyaXRlKF9haWRsX3JldHVybik/OworICAgICAgICAgICAgX2FpZGxfcmVwbHkud3JpdGUoJl9hcmdfcmVwZWF0ZWQpPzsKKyAgICAgICAgICB9CisgICAgICAgICAgRXJyKF9haWRsX3N0YXR1cykgPT4gX2FpZGxfcmVwbHkud3JpdGUoX2FpZGxfc3RhdHVzKT8KKyAgICAgICAgfQorICAgICAgICBPaygoKSkKKyAgICAgIH0KKyAgICAgIF8gPT4gRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikKKyAgICB9CisgIH0KK30KK3B1YiBtb2QgQnl0ZUVudW0geworICAjIVthbGxvdyhub25fdXBwZXJfY2FzZV9nbG9iYWxzKV0KKyAgdXNlIGJpbmRlcjo6ZGVjbGFyZV9iaW5kZXJfZW51bTsKKyAgZGVjbGFyZV9iaW5kZXJfZW51bSEgeworICAgIEJ5dGVFbnVtIDogW2k4OyAxXSB7CisgICAgICBBID0gMCwKKyAgICB9CisgIH0KK30KK3B1YiBtb2QgSW50RW51bSB7CisgICMhW2FsbG93KG5vbl91cHBlcl9jYXNlX2dsb2JhbHMpXQorICB1c2UgYmluZGVyOjpkZWNsYXJlX2JpbmRlcl9lbnVtOworICBkZWNsYXJlX2JpbmRlcl9lbnVtISB7CisgICAgSW50RW51bSA6IFtpMzI7IDFdIHsKKyAgICAgIEEgPSAwLAorICAgIH0KKyAgfQorfQorcHViIG1vZCBMb25nRW51bSB7CisgICMhW2FsbG93KG5vbl91cHBlcl9jYXNlX2dsb2JhbHMpXQorICB1c2UgYmluZGVyOjpkZWNsYXJlX2JpbmRlcl9lbnVtOworICBkZWNsYXJlX2JpbmRlcl9lbnVtISB7CisgICAgTG9uZ0VudW0gOiBbaTY0OyAxXSB7CisgICAgICBBID0gMCwKKyAgICB9CisgIH0KK30KK3B1YiBtb2QgSW50UGFyY2VsYWJsZSB7CisgICNbZGVyaXZlKERlYnVnLCBDbG9uZSwgQ29weSwgUGFydGlhbEVxKV0KKyAgcHViIHN0cnVjdCBJbnRQYXJjZWxhYmxlIHsKKyAgICBwdWIgdmFsdWU6IGkzMiwKKyAgfQorICBpbXBsIERlZmF1bHQgZm9yIEludFBhcmNlbGFibGUgeworICAgIGZuIGRlZmF1bHQoKSAtPiBTZWxmIHsKKyAgICAgIFNlbGYgeworICAgICAgICB2YWx1ZTogMCwKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaW1wbCBiaW5kZXI6OlBhcmNlbGFibGUgZm9yIEludFBhcmNlbGFibGUgeworICAgIGZuIHdyaXRlX3RvX3BhcmNlbCgmc2VsZiwgcGFyY2VsOiAmbXV0IGJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsKSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsKKyAgICAgIHBhcmNlbC5zaXplZF93cml0ZSh8c3VicGFyY2VsfCB7CisgICAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi52YWx1ZSk/OworICAgICAgICBPaygoKSkKKyAgICAgIH0pCisgICAgfQorICAgIGZuIHJlYWRfZnJvbV9wYXJjZWwoJm11dCBzZWxmLCBwYXJjZWw6ICZiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbCkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CisgICAgICBwYXJjZWwuc2l6ZWRfcmVhZCh8c3VicGFyY2VsfCB7CisgICAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICAgIHNlbGYudmFsdWUgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgICAgfQorICAgICAgICBPaygoKSkKKyAgICAgIH0pCisgICAgfQorICB9CisgIGJpbmRlcjo6aW1wbF9zZXJpYWxpemVfZm9yX3BhcmNlbGFibGUhKEludFBhcmNlbGFibGUpOworICBiaW5kZXI6OmltcGxfZGVzZXJpYWxpemVfZm9yX3BhcmNlbGFibGUhKEludFBhcmNlbGFibGUpOworICBpbXBsIGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbGFibGVNZXRhZGF0YSBmb3IgSW50UGFyY2VsYWJsZSB7CisgICAgZm4gZ2V0X2Rlc2NyaXB0b3IoKSAtPiAmJ3N0YXRpYyBzdHIgeyAiYW5kcm9pZC5haWRsLmZpeGVkc2l6ZWFycmF5LkZpeGVkU2l6ZUFycmF5RXhhbXBsZS5JbnRQYXJjZWxhYmxlIiB9CisgIH0KK30KK3B1YiBtb2QgSUVtcHR5SW50ZXJmYWNlIHsKKyAgIyFbYWxsb3cobm9uX3VwcGVyX2Nhc2VfZ2xvYmFscyldCisgICMhW2FsbG93KG5vbl9zbmFrZV9jYXNlKV0KKyAgI1thbGxvdyh1bnVzZWRfaW1wb3J0cyldIHVzZSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpJQmluZGVySW50ZXJuYWw7CisgIHVzZSBiaW5kZXI6OmRlY2xhcmVfYmluZGVyX2ludGVyZmFjZTsKKyAgZGVjbGFyZV9iaW5kZXJfaW50ZXJmYWNlISB7CisgICAgSUVtcHR5SW50ZXJmYWNlWyJhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLklFbXB0eUludGVyZmFjZSJdIHsKKyAgICAgIG5hdGl2ZTogQm5FbXB0eUludGVyZmFjZShvbl90cmFuc2FjdCksCisgICAgICBwcm94eTogQnBFbXB0eUludGVyZmFjZSB7CisgICAgICB9LAorICAgICAgYXN5bmM6IElFbXB0eUludGVyZmFjZUFzeW5jLAorICAgIH0KKyAgfQorICBwdWIgdHJhaXQgSUVtcHR5SW50ZXJmYWNlOiBiaW5kZXI6OkludGVyZmFjZSArIFNlbmQgeworICAgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHdoZXJlIFNlbGY6IFNpemVkIHsgImFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSUVtcHR5SW50ZXJmYWNlIiB9CisgICAgZm4gZ2V0RGVmYXVsdEltcGwoKSAtPiBJRW1wdHlJbnRlcmZhY2VEZWZhdWx0UmVmIHdoZXJlIFNlbGY6IFNpemVkIHsKKyAgICAgIERFRkFVTFRfSU1QTC5sb2NrKCkudW53cmFwKCkuY2xvbmUoKQorICAgIH0KKyAgICBmbiBzZXREZWZhdWx0SW1wbChkOiBJRW1wdHlJbnRlcmZhY2VEZWZhdWx0UmVmKSAtPiBJRW1wdHlJbnRlcmZhY2VEZWZhdWx0UmVmIHdoZXJlIFNlbGY6IFNpemVkIHsKKyAgICAgIHN0ZDo6bWVtOjpyZXBsYWNlKCZtdXQgKkRFRkFVTFRfSU1QTC5sb2NrKCkudW53cmFwKCksIGQpCisgICAgfQorICB9CisgIHB1YiB0cmFpdCBJRW1wdHlJbnRlcmZhY2VBc3luYzxQPjogYmluZGVyOjpJbnRlcmZhY2UgKyBTZW5kIHsKKyAgICBmbiBnZXRfZGVzY3JpcHRvcigpIC0+ICYnc3RhdGljIHN0ciB3aGVyZSBTZWxmOiBTaXplZCB7ICJhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLklFbXB0eUludGVyZmFjZSIgfQorICB9CisgICNbOjphc3luY190cmFpdDo6YXN5bmNfdHJhaXRdCisgIHB1YiB0cmFpdCBJRW1wdHlJbnRlcmZhY2VBc3luY1NlcnZlcjogYmluZGVyOjpJbnRlcmZhY2UgKyBTZW5kIHsKKyAgICBmbiBnZXRfZGVzY3JpcHRvcigpIC0+ICYnc3RhdGljIHN0ciB3aGVyZSBTZWxmOiBTaXplZCB7ICJhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLklFbXB0eUludGVyZmFjZSIgfQorICB9CisgIGltcGwgQm5FbXB0eUludGVyZmFjZSB7CisgICAgLy8vIENyZWF0ZSBhIG5ldyBhc3luYyBiaW5kZXIgc2VydmljZS4KKyAgICBwdWIgZm4gbmV3X2FzeW5jX2JpbmRlcjxULCBSPihpbm5lcjogVCwgcnQ6IFIsIGZlYXR1cmVzOiBiaW5kZXI6OkJpbmRlckZlYXR1cmVzKSAtPiBiaW5kZXI6OlN0cm9uZzxkeW4gSUVtcHR5SW50ZXJmYWNlPgorICAgIHdoZXJlCisgICAgICBUOiBJRW1wdHlJbnRlcmZhY2VBc3luY1NlcnZlciArIGJpbmRlcjo6SW50ZXJmYWNlICsgU2VuZCArIFN5bmMgKyAnc3RhdGljLAorICAgICAgUjogYmluZGVyOjpiaW5kZXJfaW1wbDo6QmluZGVyQXN5bmNSdW50aW1lICsgU2VuZCArIFN5bmMgKyAnc3RhdGljLAorICAgIHsKKyAgICAgIHN0cnVjdCBXcmFwcGVyPFQsIFI+IHsKKyAgICAgICAgX2lubmVyOiBULAorICAgICAgICBfcnQ6IFIsCisgICAgICB9CisgICAgICBpbXBsPFQsIFI+IGJpbmRlcjo6SW50ZXJmYWNlIGZvciBXcmFwcGVyPFQsIFI+IHdoZXJlIFQ6IGJpbmRlcjo6SW50ZXJmYWNlLCBSOiBTZW5kICsgU3luYyB7CisgICAgICAgIGZuIGFzX2JpbmRlcigmc2VsZikgLT4gYmluZGVyOjpTcElCaW5kZXIgeyBzZWxmLl9pbm5lci5hc19iaW5kZXIoKSB9CisgICAgICAgIGZuIGR1bXAoJnNlbGYsIF9maWxlOiAmc3RkOjpmczo6RmlsZSwgX2FyZ3M6ICZbJnN0ZDo6ZmZpOjpDU3RyXSkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7IHNlbGYuX2lubmVyLmR1bXAoX2ZpbGUsIF9hcmdzKSB9CisgICAgICB9CisgICAgICBpbXBsPFQsIFI+IElFbXB0eUludGVyZmFjZSBmb3IgV3JhcHBlcjxULCBSPgorICAgICAgd2hlcmUKKyAgICAgICAgVDogSUVtcHR5SW50ZXJmYWNlQXN5bmNTZXJ2ZXIgKyBTZW5kICsgU3luYyArICdzdGF0aWMsCisgICAgICAgIFI6IGJpbmRlcjo6YmluZGVyX2ltcGw6OkJpbmRlckFzeW5jUnVudGltZSArIFNlbmQgKyBTeW5jICsgJ3N0YXRpYywKKyAgICAgIHsKKyAgICAgIH0KKyAgICAgIGxldCB3cmFwcGVkID0gV3JhcHBlciB7IF9pbm5lcjogaW5uZXIsIF9ydDogcnQgfTsKKyAgICAgIFNlbGY6Om5ld19iaW5kZXIod3JhcHBlZCwgZmVhdHVyZXMpCisgICAgfQorICB9CisgIHB1YiB0cmFpdCBJRW1wdHlJbnRlcmZhY2VEZWZhdWx0OiBTZW5kICsgU3luYyB7CisgIH0KKyAgcHViIG1vZCB0cmFuc2FjdGlvbnMgeworICB9CisgIHB1YiB0eXBlIElFbXB0eUludGVyZmFjZURlZmF1bHRSZWYgPSBPcHRpb248c3RkOjpzeW5jOjpBcmM8ZHluIElFbXB0eUludGVyZmFjZURlZmF1bHQ+PjsKKyAgdXNlIGxhenlfc3RhdGljOjpsYXp5X3N0YXRpYzsKKyAgbGF6eV9zdGF0aWMhIHsKKyAgICBzdGF0aWMgcmVmIERFRkFVTFRfSU1QTDogc3RkOjpzeW5jOjpNdXRleDxJRW1wdHlJbnRlcmZhY2VEZWZhdWx0UmVmPiA9IHN0ZDo6c3luYzo6TXV0ZXg6Om5ldyhOb25lKTsKKyAgfQorICBpbXBsIEJwRW1wdHlJbnRlcmZhY2UgeworICB9CisgIGltcGwgSUVtcHR5SW50ZXJmYWNlIGZvciBCcEVtcHR5SW50ZXJmYWNlIHsKKyAgfQorICBpbXBsPFA6IGJpbmRlcjo6QmluZGVyQXN5bmNQb29sPiBJRW1wdHlJbnRlcmZhY2VBc3luYzxQPiBmb3IgQnBFbXB0eUludGVyZmFjZSB7CisgIH0KKyAgaW1wbCBJRW1wdHlJbnRlcmZhY2UgZm9yIGJpbmRlcjo6YmluZGVyX2ltcGw6OkJpbmRlcjxCbkVtcHR5SW50ZXJmYWNlPiB7CisgIH0KKyAgZm4gb25fdHJhbnNhY3QoX2FpZGxfc2VydmljZTogJmR5biBJRW1wdHlJbnRlcmZhY2UsIF9haWRsX2NvZGU6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSwgX2FpZGxfZGF0YTogJmJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsPCdfPiwgX2FpZGxfcmVwbHk6ICZtdXQgYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWw8J18+KSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsKKyAgICBtYXRjaCBfYWlkbF9jb2RlIHsKKyAgICAgIF8gPT4gRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikKKyAgICB9CisgIH0KK30KK3B1YihjcmF0ZSkgbW9kIG1hbmdsZWQgeworIHB1YiB1c2Ugc3VwZXI6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZSBhcyBfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGU7CisgcHViIHVzZSBzdXBlcjo6SVJlcGVhdEZpeGVkU2l6ZUFycmF5OjpJUmVwZWF0Rml4ZWRTaXplQXJyYXkgYXMgXzdfYW5kcm9pZF80X2FpZGxfMTRfZml4ZWRzaXplYXJyYXlfMjFfRml4ZWRTaXplQXJyYXlFeGFtcGxlXzIxX0lSZXBlYXRGaXhlZFNpemVBcnJheTsKKyBwdWIgdXNlIHN1cGVyOjpCeXRlRW51bTo6Qnl0ZUVudW0gYXMgXzdfYW5kcm9pZF80X2FpZGxfMTRfZml4ZWRzaXplYXJyYXlfMjFfRml4ZWRTaXplQXJyYXlFeGFtcGxlXzhfQnl0ZUVudW07CisgcHViIHVzZSBzdXBlcjo6SW50RW51bTo6SW50RW51bSBhcyBfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfN19JbnRFbnVtOworIHB1YiB1c2Ugc3VwZXI6OkxvbmdFbnVtOjpMb25nRW51bSBhcyBfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfOF9Mb25nRW51bTsKKyBwdWIgdXNlIHN1cGVyOjpJbnRQYXJjZWxhYmxlOjpJbnRQYXJjZWxhYmxlIGFzIF83X2FuZHJvaWRfNF9haWRsXzE0X2ZpeGVkc2l6ZWFycmF5XzIxX0ZpeGVkU2l6ZUFycmF5RXhhbXBsZV8xM19JbnRQYXJjZWxhYmxlOworIHB1YiB1c2Ugc3VwZXI6OklFbXB0eUludGVyZmFjZTo6SUVtcHR5SW50ZXJmYWNlIGFzIF83X2FuZHJvaWRfNF9haWRsXzE0X2ZpeGVkc2l6ZWFycmF5XzIxX0ZpeGVkU2l6ZUFycmF5RXhhbXBsZV8xNV9JRW1wdHlJbnRlcmZhY2U7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1maXhlZHNpemVhcnJheS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2ZpeGVkc2l6ZWFycmF5L0ZpeGVkU2l6ZUFycmF5RXhhbXBsZS5ycy5kIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtZml4ZWRzaXplYXJyYXktcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9maXhlZHNpemVhcnJheS9GaXhlZFNpemVBcnJheUV4YW1wbGUucnMuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODExY2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtZml4ZWRzaXplYXJyYXktcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9maXhlZHNpemVhcnJheS9GaXhlZFNpemVBcnJheUV4YW1wbGUucnMuZApAQCAtMCwwICsxLDIgQEAKK291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtZml4ZWRzaXplYXJyYXktcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9maXhlZHNpemVhcnJheS9GaXhlZFNpemVBcnJheUV4YW1wbGUucnMgOiBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC9maXhlZHNpemVhcnJheS9GaXhlZFNpemVBcnJheUV4YW1wbGUuYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL3RpbWVzdGFtcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWZpeGVkc2l6ZWFycmF5LXJ1c3Qtc291cmNlL2dlbi90aW1lc3RhbXAKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vdGltZXN0YW1wCmNvcHkgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtZml4ZWRzaXplYXJyYXktcnVzdC1zb3VyY2UvZ2VuL3RpbWVzdGFtcApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9BcnJheU9mSW50ZXJmYWNlcy5jcHAgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0FycmF5T2ZJbnRlcmZhY2VzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2RmMmEwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9BcnJheU9mSW50ZXJmYWNlcy5jcHAKQEAgLTAsMCArMSw0NTMgQEAKKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvQXJyYXlPZkludGVyZmFjZXMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKKzo6YW5kcm9pZDo6c3RhdHVzX3QgQXJyYXlPZkludGVyZmFjZXM6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIHsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpPSzsKKyAgc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgIGludDMyX3QgX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSA9IDA7CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRJbnQzMigmX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSA8IDQpIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgc2l6ZV90IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4oX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSk7CisgIGlmIChfYWlkbF9zdGFydF9wb3MgPiBTSVpFX01BWCAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuIDo6YW5kcm9pZDo6QkFEX1ZBTFVFOworICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KKzo6YW5kcm9pZDo6c3RhdHVzX3QgQXJyYXlPZkludGVyZmFjZXM6OndyaXRlVG9QYXJjZWwoOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgeworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICBhdXRvIF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgIF9haWRsX3BhcmNlbC0+d3JpdGVJbnQzMigwKTsKKyAgYXV0byBfYWlkbF9lbmRfcG9zID0gX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKKyAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zKTsKKyAgX2FpZGxfcGFyY2VsLT53cml0ZUludDMyKF9haWRsX2VuZF9wb3MgLSBfYWlkbF9zdGFydF9wb3MpOworICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9lbmRfcG9zKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9Cit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9BcnJheU9mSW50ZXJmYWNlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9BcnJheU9mSW50ZXJmYWNlcy5oPgorbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK0RPX05PVF9ESVJFQ1RMWV9VU0VfTUVfSU1QTEVNRU5UX01FVEFfTkVTVEVEX0lOVEVSRkFDRShBcnJheU9mSW50ZXJmYWNlcywgRW1wdHlJbnRlcmZhY2UsICJhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlIikKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL0FycmF5T2ZJbnRlcmZhY2VzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL0FycmF5T2ZJbnRlcmZhY2VzLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9tYWNyb3MuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKKworQXJyYXlPZkludGVyZmFjZXM6OkJwRW1wdHlJbnRlcmZhY2U6OkJwRW1wdHlJbnRlcmZhY2UoY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+JiBfYWlkbF9pbXBsKQorICAgIDogQnBJbnRlcmZhY2U8SUVtcHR5SW50ZXJmYWNlPihfYWlkbF9pbXBsKXsKK30KKworfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvQXJyYXlPZkludGVyZmFjZXMuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8YmluZGVyL1N0YWJpbGl0eS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworCitBcnJheU9mSW50ZXJmYWNlczo6Qm5FbXB0eUludGVyZmFjZTo6Qm5FbXB0eUludGVyZmFjZSgpCit7CisgIDo6YW5kcm9pZDo6aW50ZXJuYWw6OlN0YWJpbGl0eTo6bWFya0NvbXBpbGF0aW9uVW5pdCh0aGlzKTsKK30KKworOjphbmRyb2lkOjpzdGF0dXNfdCBBcnJheU9mSW50ZXJmYWNlczo6Qm5FbXB0eUludGVyZmFjZTo6b25UcmFuc2FjdCh1aW50MzJfdCBfYWlkbF9jb2RlLCBjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCYgX2FpZGxfZGF0YSwgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3JlcGx5LCB1aW50MzJfdCBfYWlkbF9mbGFncykgeworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICBzd2l0Y2ggKF9haWRsX2NvZGUpIHsKKyAgZGVmYXVsdDoKKyAgeworICAgIF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6OkJCaW5kZXI6Om9uVHJhbnNhY3QoX2FpZGxfY29kZSwgX2FpZGxfZGF0YSwgX2FpZGxfcmVwbHksIF9haWRsX2ZsYWdzKTsKKyAgfQorICBicmVhazsKKyAgfQorICBpZiAoX2FpZGxfcmV0X3N0YXR1cyA9PSA6OmFuZHJvaWQ6OlVORVhQRUNURURfTlVMTCkgeworICAgIF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tRXhjZXB0aW9uQ29kZSg6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpFWF9OVUxMX1BPSU5URVIpLndyaXRlT3ZlclBhcmNlbChfYWlkbF9yZXBseSk7CisgIH0KKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL0FycmF5T2ZJbnRlcmZhY2VzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL0FycmF5T2ZJbnRlcmZhY2VzLmg+CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworRE9fTk9UX0RJUkVDVExZX1VTRV9NRV9JTVBMRU1FTlRfTUVUQV9ORVNURURfSU5URVJGQUNFKEFycmF5T2ZJbnRlcmZhY2VzLCBNeUludGVyZmFjZSwgImFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JTXlJbnRlcmZhY2UiKQorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvQXJyYXlPZkludGVyZmFjZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvQXJyYXlPZkludGVyZmFjZXMuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL21hY3Jvcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworCitBcnJheU9mSW50ZXJmYWNlczo6QnBNeUludGVyZmFjZTo6QnBNeUludGVyZmFjZShjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4mIF9haWRsX2ltcGwpCisgICAgOiBCcEludGVyZmFjZTxJTXlJbnRlcmZhY2U+KF9haWRsX2ltcGwpeworfQorCis6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEFycmF5T2ZJbnRlcmZhY2VzOjpCcE15SW50ZXJmYWNlOjptZXRob2RXaXRoSW50ZXJmYWNlcyhjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+JiBpZmFjZSwgY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPiYgbnVsbGFibGVfaWZhY2UsIGNvbnN0IDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4mIGlmYWNlX2FycmF5X2luLCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+KiBpZmFjZV9hcnJheV9vdXQsIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4qIGlmYWNlX2FycmF5X2lub3V0LCBjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4mIG51bGxhYmxlX2lmYWNlX2FycmF5X2luLCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4qIG51bGxhYmxlX2lmYWNlX2FycmF5X291dCwgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+KiBudWxsYWJsZV9pZmFjZV9hcnJheV9pbm91dCwgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+KiBfYWlkbF9yZXR1cm4pIHsKKyAgOjphbmRyb2lkOjpQYXJjZWwgX2FpZGxfZGF0YTsKKyAgX2FpZGxfZGF0YS5tYXJrRm9yQmluZGVyKHJlbW90ZVN0cm9uZygpKTsKKyAgOjphbmRyb2lkOjpQYXJjZWwgX2FpZGxfcmVwbHk7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzOworICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKGdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLndyaXRlU3Ryb25nQmluZGVyKGlmYWNlKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVTdHJvbmdCaW5kZXIobnVsbGFibGVfaWZhY2UpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZVN0cm9uZ0JpbmRlclZlY3RvcihpZmFjZV9hcnJheV9pbik7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLndyaXRlVmVjdG9yU2l6ZSgqaWZhY2VfYXJyYXlfb3V0KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVTdHJvbmdCaW5kZXJWZWN0b3IoKmlmYWNlX2FycmF5X2lub3V0KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVTdHJvbmdCaW5kZXJWZWN0b3IobnVsbGFibGVfaWZhY2VfYXJyYXlfaW4pOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZVZlY3RvclNpemUoKm51bGxhYmxlX2lmYWNlX2FycmF5X291dCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLndyaXRlU3Ryb25nQmluZGVyVmVjdG9yKCpudWxsYWJsZV9pZmFjZV9hcnJheV9pbm91dCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoQXJyYXlPZkludGVyZmFjZXM6OkJuTXlJbnRlcmZhY2U6OlRSQU5TQUNUSU9OX21ldGhvZFdpdGhJbnRlcmZhY2VzLCBfYWlkbF9kYXRhLCAmX2FpZGxfcmVwbHksIDApOworICBpZiAoVU5MSUtFTFkoX2FpZGxfcmV0X3N0YXR1cyA9PSA6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04gJiYgSU15SW50ZXJmYWNlOjpnZXREZWZhdWx0SW1wbCgpKSkgeworICAgICByZXR1cm4gSU15SW50ZXJmYWNlOjpnZXREZWZhdWx0SW1wbCgpLT5tZXRob2RXaXRoSW50ZXJmYWNlcyhpZmFjZSwgbnVsbGFibGVfaWZhY2UsIGlmYWNlX2FycmF5X2luLCBpZmFjZV9hcnJheV9vdXQsIGlmYWNlX2FycmF5X2lub3V0LCBudWxsYWJsZV9pZmFjZV9hcnJheV9pbiwgbnVsbGFibGVfaWZhY2VfYXJyYXlfb3V0LCBudWxsYWJsZV9pZmFjZV9hcnJheV9pbm91dCwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLnJlYWRGcm9tUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgaWYgKCFfYWlkbF9zdGF0dXMuaXNPaygpKSB7CisgICAgcmV0dXJuIF9haWRsX3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHkucmVhZFN0cm9uZ0JpbmRlclZlY3RvcihfYWlkbF9yZXR1cm4pOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHkucmVhZFN0cm9uZ0JpbmRlclZlY3RvcihpZmFjZV9hcnJheV9vdXQpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHkucmVhZFN0cm9uZ0JpbmRlclZlY3RvcihpZmFjZV9hcnJheV9pbm91dCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS5yZWFkU3Ryb25nQmluZGVyVmVjdG9yKG51bGxhYmxlX2lmYWNlX2FycmF5X291dCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS5yZWFkU3Ryb25nQmluZGVyVmVjdG9yKG51bGxhYmxlX2lmYWNlX2FycmF5X2lub3V0KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfZXJyb3I6CisgIF9haWRsX3N0YXR1cy5zZXRGcm9tU3RhdHVzVChfYWlkbF9yZXRfc3RhdHVzKTsKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKworfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvQXJyYXlPZkludGVyZmFjZXMuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8YmluZGVyL1N0YWJpbGl0eS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworCitBcnJheU9mSW50ZXJmYWNlczo6Qm5NeUludGVyZmFjZTo6Qm5NeUludGVyZmFjZSgpCit7CisgIDo6YW5kcm9pZDo6aW50ZXJuYWw6OlN0YWJpbGl0eTo6bWFya0NvbXBpbGF0aW9uVW5pdCh0aGlzKTsKK30KKworOjphbmRyb2lkOjpzdGF0dXNfdCBBcnJheU9mSW50ZXJmYWNlczo6Qm5NeUludGVyZmFjZTo6b25UcmFuc2FjdCh1aW50MzJfdCBfYWlkbF9jb2RlLCBjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCYgX2FpZGxfZGF0YSwgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3JlcGx5LCB1aW50MzJfdCBfYWlkbF9mbGFncykgeworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICBzd2l0Y2ggKF9haWRsX2NvZGUpIHsKKyAgY2FzZSBCbk15SW50ZXJmYWNlOjpUUkFOU0FDVElPTl9tZXRob2RXaXRoSW50ZXJmYWNlczoKKyAgeworICAgIDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4gaW5faWZhY2U7CisgICAgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPiBpbl9udWxsYWJsZV9pZmFjZTsKKyAgICA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+IGluX2lmYWNlX2FycmF5X2luOworICAgIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4gb3V0X2lmYWNlX2FycmF5X291dDsKKyAgICA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+IGluX2lmYWNlX2FycmF5X2lub3V0OworICAgIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PiBpbl9udWxsYWJsZV9pZmFjZV9hcnJheV9pbjsKKyAgICA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4gb3V0X251bGxhYmxlX2lmYWNlX2FycmF5X291dDsKKyAgICA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4gaW5fbnVsbGFibGVfaWZhY2VfYXJyYXlfaW5vdXQ7CisgICAgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+IF9haWRsX3JldHVybjsKKyAgICBpZiAoIShfYWlkbF9kYXRhLmNoZWNrSW50ZXJmYWNlKHRoaXMpKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6QkFEX1RZUEU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEucmVhZFN0cm9uZ0JpbmRlcigmaW5faWZhY2UpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS5yZWFkTnVsbGFibGVTdHJvbmdCaW5kZXIoJmluX251bGxhYmxlX2lmYWNlKTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEucmVhZFN0cm9uZ0JpbmRlclZlY3RvcigmaW5faWZhY2VfYXJyYXlfaW4pOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS5yZXNpemVPdXRWZWN0b3IoJm91dF9pZmFjZV9hcnJheV9vdXQpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS5yZWFkU3Ryb25nQmluZGVyVmVjdG9yKCZpbl9pZmFjZV9hcnJheV9pbm91dCk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLnJlYWRTdHJvbmdCaW5kZXJWZWN0b3IoJmluX251bGxhYmxlX2lmYWNlX2FycmF5X2luKTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEucmVzaXplT3V0VmVjdG9yKCZvdXRfbnVsbGFibGVfaWZhY2VfYXJyYXlfb3V0KTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEucmVhZFN0cm9uZ0JpbmRlclZlY3RvcigmaW5fbnVsbGFibGVfaWZhY2VfYXJyYXlfaW5vdXQpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoYXV0byBzdCA9IF9haWRsX2RhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7ICFzdC5pc09rKCkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBzdC53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1cyhtZXRob2RXaXRoSW50ZXJmYWNlcyhpbl9pZmFjZSwgaW5fbnVsbGFibGVfaWZhY2UsIGluX2lmYWNlX2FycmF5X2luLCAmb3V0X2lmYWNlX2FycmF5X291dCwgJmluX2lmYWNlX2FycmF5X2lub3V0LCBpbl9udWxsYWJsZV9pZmFjZV9hcnJheV9pbiwgJm91dF9udWxsYWJsZV9pZmFjZV9hcnJheV9vdXQsICZpbl9udWxsYWJsZV9pZmFjZV9hcnJheV9pbm91dCwgJl9haWRsX3JldHVybikpOworICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICghX2FpZGxfc3RhdHVzLmlzT2soKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS0+d3JpdGVTdHJvbmdCaW5kZXJWZWN0b3IoX2FpZGxfcmV0dXJuKTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LT53cml0ZVN0cm9uZ0JpbmRlclZlY3RvcihvdXRfaWZhY2VfYXJyYXlfb3V0KTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LT53cml0ZVN0cm9uZ0JpbmRlclZlY3Rvcihpbl9pZmFjZV9hcnJheV9pbm91dCk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS0+d3JpdGVTdHJvbmdCaW5kZXJWZWN0b3Iob3V0X251bGxhYmxlX2lmYWNlX2FycmF5X291dCk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS0+d3JpdGVTdHJvbmdCaW5kZXJWZWN0b3IoaW5fbnVsbGFibGVfaWZhY2VfYXJyYXlfaW5vdXQpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBicmVhazsKKyAgZGVmYXVsdDoKKyAgeworICAgIF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6OkJCaW5kZXI6Om9uVHJhbnNhY3QoX2FpZGxfY29kZSwgX2FpZGxfZGF0YSwgX2FpZGxfcmVwbHksIF9haWRsX2ZsYWdzKTsKKyAgfQorICBicmVhazsKKyAgfQorICBpZiAoX2FpZGxfcmV0X3N0YXR1cyA9PSA6OmFuZHJvaWQ6OlVORVhQRUNURURfTlVMTCkgeworICAgIF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tRXhjZXB0aW9uQ29kZSg6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpFWF9OVUxMX1BPSU5URVIpLndyaXRlT3ZlclBhcmNlbChfYWlkbF9yZXBseSk7CisgIH0KKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL0FycmF5T2ZJbnRlcmZhY2VzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7Cis6OmFuZHJvaWQ6OnN0YXR1c190IEFycmF5T2ZJbnRlcmZhY2VzOjpNeVBhcmNlbGFibGU6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIHsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpPSzsKKyAgc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgIGludDMyX3QgX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSA9IDA7CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRJbnQzMigmX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSA8IDQpIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgc2l6ZV90IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4oX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSk7CisgIGlmIChfYWlkbF9zdGFydF9wb3MgPiBTSVpFX01BWCAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuIDo6YW5kcm9pZDo6QkFEX1ZBTFVFOworICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRTdHJvbmdCaW5kZXIoJmlmYWNlKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZE51bGxhYmxlU3Ryb25nQmluZGVyKCZudWxsYWJsZV9pZmFjZSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRTdHJvbmdCaW5kZXJWZWN0b3IoJmlmYWNlX2FycmF5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZFN0cm9uZ0JpbmRlclZlY3RvcigmbnVsbGFibGVfaWZhY2VfYXJyYXkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9Cis6OmFuZHJvaWQ6OnN0YXR1c190IEFycmF5T2ZJbnRlcmZhY2VzOjpNeVBhcmNlbGFibGU6OndyaXRlVG9QYXJjZWwoOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgeworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICBhdXRvIF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgIF9haWRsX3BhcmNlbC0+d3JpdGVJbnQzMigwKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVTdHJvbmdCaW5kZXIoaWZhY2UpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVTdHJvbmdCaW5kZXIobnVsbGFibGVfaWZhY2UpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVTdHJvbmdCaW5kZXJWZWN0b3IoaWZhY2VfYXJyYXkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVTdHJvbmdCaW5kZXJWZWN0b3IobnVsbGFibGVfaWZhY2VfYXJyYXkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgYXV0byBfYWlkbF9lbmRfcG9zID0gX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKKyAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zKTsKKyAgX2FpZGxfcGFyY2VsLT53cml0ZUludDMyKF9haWRsX2VuZF9wb3MgLSBfYWlkbF9zdGFydF9wb3MpOworICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9lbmRfcG9zKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9Cit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9BcnJheU9mSW50ZXJmYWNlcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworOjphbmRyb2lkOjpzdGF0dXNfdCBBcnJheU9mSW50ZXJmYWNlczo6TXlVbmlvbjo6cmVhZEZyb21QYXJjZWwoY29uc3QgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgeworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXM7CisgIGludDMyX3QgX2FpZGxfdGFnOworICBpZiAoKF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRJbnQzMigmX2FpZGxfdGFnKSkgIT0gOjphbmRyb2lkOjpPSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIHN3aXRjaCAoc3RhdGljX2Nhc3Q8VGFnPihfYWlkbF90YWcpKSB7CisgIGNhc2UgaWZhY2U6IHsKKyAgICA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+IF9haWRsX3ZhbHVlOworICAgIGlmICgoX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZFN0cm9uZ0JpbmRlcigmX2FpZGxfdmFsdWUpKSAhPSA6OmFuZHJvaWQ6Ok9LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgICBpZiBjb25zdGV4cHIgKHN0ZDo6aXNfdHJpdmlhbGx5X2NvcHlhYmxlX3Y8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4pIHsKKyAgICAgIHNldDxpZmFjZT4oX2FpZGxfdmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBOT0xJTlRORVhUTElORShwZXJmb3JtYW5jZS1tb3ZlLWNvbnN0LWFyZykKKyAgICAgIHNldDxpZmFjZT4oc3RkOjptb3ZlKF9haWRsX3ZhbHVlKSk7CisgICAgfQorICAgIHJldHVybiA6OmFuZHJvaWQ6Ok9LOyB9CisgIGNhc2UgbnVsbGFibGVfaWZhY2U6IHsKKyAgICA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+IF9haWRsX3ZhbHVlOworICAgIGlmICgoX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZE51bGxhYmxlU3Ryb25nQmluZGVyKCZfYWlkbF92YWx1ZSkpICE9IDo6YW5kcm9pZDo6T0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICAgIGlmIGNvbnN0ZXhwciAoc3RkOjppc190cml2aWFsbHlfY29weWFibGVfdjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+PikgeworICAgICAgc2V0PG51bGxhYmxlX2lmYWNlPihfYWlkbF92YWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIE5PTElOVE5FWFRMSU5FKHBlcmZvcm1hbmNlLW1vdmUtY29uc3QtYXJnKQorICAgICAgc2V0PG51bGxhYmxlX2lmYWNlPihzdGQ6Om1vdmUoX2FpZGxfdmFsdWUpKTsKKyAgICB9CisgICAgcmV0dXJuIDo6YW5kcm9pZDo6T0s7IH0KKyAgY2FzZSBpZmFjZV9hcnJheTogeworICAgIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4gX2FpZGxfdmFsdWU7CisgICAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkU3Ryb25nQmluZGVyVmVjdG9yKCZfYWlkbF92YWx1ZSkpICE9IDo6YW5kcm9pZDo6T0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICAgIGlmIGNvbnN0ZXhwciAoc3RkOjppc190cml2aWFsbHlfY29weWFibGVfdjw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PikgeworICAgICAgc2V0PGlmYWNlX2FycmF5PihfYWlkbF92YWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIE5PTElOVE5FWFRMSU5FKHBlcmZvcm1hbmNlLW1vdmUtY29uc3QtYXJnKQorICAgICAgc2V0PGlmYWNlX2FycmF5PihzdGQ6Om1vdmUoX2FpZGxfdmFsdWUpKTsKKyAgICB9CisgICAgcmV0dXJuIDo6YW5kcm9pZDo6T0s7IH0KKyAgY2FzZSBudWxsYWJsZV9pZmFjZV9hcnJheTogeworICAgIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PiBfYWlkbF92YWx1ZTsKKyAgICBpZiAoKF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRTdHJvbmdCaW5kZXJWZWN0b3IoJl9haWRsX3ZhbHVlKSkgIT0gOjphbmRyb2lkOjpPSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgICAgaWYgY29uc3RleHByIChzdGQ6OmlzX3RyaXZpYWxseV9jb3B5YWJsZV92PDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+Pj4pIHsKKyAgICAgIHNldDxudWxsYWJsZV9pZmFjZV9hcnJheT4oX2FpZGxfdmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBOT0xJTlRORVhUTElORShwZXJmb3JtYW5jZS1tb3ZlLWNvbnN0LWFyZykKKyAgICAgIHNldDxudWxsYWJsZV9pZmFjZV9hcnJheT4oc3RkOjptb3ZlKF9haWRsX3ZhbHVlKSk7CisgICAgfQorICAgIHJldHVybiA6OmFuZHJvaWQ6Ok9LOyB9CisgIH0KKyAgcmV0dXJuIDo6YW5kcm9pZDo6QkFEX1ZBTFVFOworfQorOjphbmRyb2lkOjpzdGF0dXNfdCBBcnJheU9mSW50ZXJmYWNlczo6TXlVbmlvbjo6d3JpdGVUb1BhcmNlbCg6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCB7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90PihnZXRUYWcoKSkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSA6OmFuZHJvaWQ6Ok9LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgc3dpdGNoIChnZXRUYWcoKSkgeworICBjYXNlIGlmYWNlOiByZXR1cm4gX2FpZGxfcGFyY2VsLT53cml0ZVN0cm9uZ0JpbmRlcihnZXQ8aWZhY2U+KCkpOworICBjYXNlIG51bGxhYmxlX2lmYWNlOiByZXR1cm4gX2FpZGxfcGFyY2VsLT53cml0ZVN0cm9uZ0JpbmRlcihnZXQ8bnVsbGFibGVfaWZhY2U+KCkpOworICBjYXNlIGlmYWNlX2FycmF5OiByZXR1cm4gX2FpZGxfcGFyY2VsLT53cml0ZVN0cm9uZ0JpbmRlclZlY3RvcihnZXQ8aWZhY2VfYXJyYXk+KCkpOworICBjYXNlIG51bGxhYmxlX2lmYWNlX2FycmF5OiByZXR1cm4gX2FpZGxfcGFyY2VsLT53cml0ZVN0cm9uZ0JpbmRlclZlY3RvcihnZXQ8bnVsbGFibGVfaWZhY2VfYXJyYXk+KCkpOworICB9CisgIF9fYXNzZXJ0MihfX0ZJTEVfXywgX19MSU5FX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18sICJjYW4ndCByZWFjaCBoZXJlIik7Cit9Cit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9BcnJheU9mSW50ZXJmYWNlcy5jcHAuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvQXJyYXlPZkludGVyZmFjZXMuY3BwLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FhY2E3ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvQXJyYXlPZkludGVyZmFjZXMuY3BwLmQKQEAgLTAsMCArMSwyIEBACitvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvQXJyYXlPZkludGVyZmFjZXMuY3BwIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvQXJyYXlPZkludGVyZmFjZXMuYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9EZXByZWNhdGVkUGFyY2VsYWJsZS5jcHAgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0RlcHJlY2F0ZWRQYXJjZWxhYmxlLmNwcAppbmRleCBiYTRiMTViLi42NzE0MmI5IDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0RlcHJlY2F0ZWRQYXJjZWxhYmxlLmNwcAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0RlcHJlY2F0ZWRQYXJjZWxhYmxlLmNwcApAQCAtMSwyMiArMSwyMiBAQAogI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9EZXByZWNhdGVkUGFyY2VsYWJsZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIG5hbWVzcGFjZSBhaWRsIHsKLQogbmFtZXNwYWNlIHRlc3RzIHsKLQogOjphbmRyb2lkOjpzdGF0dXNfdCBEZXByZWNhdGVkUGFyY2VsYWJsZTo6cmVhZEZyb21QYXJjZWwoY29uc3QgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgewogICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOwotICBbW21heWJlX3VudXNlZF1dIHNpemVfdCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOwotICBpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPSBfYWlkbF9wYXJjZWwtPnJlYWRJbnQzMigpOwotICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSA8IDApIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKLSAgW1ttYXliZV91bnVzZWRdXSBzaXplX3QgX2FpZGxfcGFyY2VsYWJsZV9zaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplKTsKKyAgc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgIGludDMyX3QgX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSA9IDA7CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRJbnQzMigmX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSA8IDQpIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgc2l6ZV90IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4oX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSk7CiAgIGlmIChfYWlkbF9zdGFydF9wb3MgPiBTSVpFX01BWCAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuIDo6YW5kcm9pZDo6QkFEX1ZBTFVFOwogICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwogICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKIH0KLQogOjphbmRyb2lkOjpzdGF0dXNfdCBEZXByZWNhdGVkUGFyY2VsYWJsZTo6d3JpdGVUb1BhcmNlbCg6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCB7CiAgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CiAgIGF1dG8gX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKQEAgLTI3LDkgKzI3LDYgQEAKICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfZW5kX3Bvcyk7CiAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwogfQotCiB9ICAvLyBuYW1lc3BhY2UgdGVzdHMKLQogfSAgLy8gbmFtZXNwYWNlIGFpZGwKLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvRml4ZWRTaXplLmNwcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvRml4ZWRTaXplLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjBmZTI3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9GaXhlZFNpemUuY3BwCkBAIC0wLDAgKzEsMjgzIEBACisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL0ZpeGVkU2l6ZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworOjphbmRyb2lkOjpzdGF0dXNfdCBGaXhlZFNpemU6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIHsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpPSzsKKyAgc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgIGludDMyX3QgX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSA9IDA7CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRJbnQzMigmX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSA8IDQpIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgc2l6ZV90IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4oX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSk7CisgIGlmIChfYWlkbF9zdGFydF9wb3MgPiBTSVpFX01BWCAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuIDo6YW5kcm9pZDo6QkFEX1ZBTFVFOworICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KKzo6YW5kcm9pZDo6c3RhdHVzX3QgRml4ZWRTaXplOjp3cml0ZVRvUGFyY2VsKDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IHsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpPSzsKKyAgYXV0byBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBfYWlkbF9wYXJjZWwtPndyaXRlSW50MzIoMCk7CisgIGF1dG8gX2FpZGxfZW5kX3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3Bvcyk7CisgIF9haWRsX3BhcmNlbC0+d3JpdGVJbnQzMihfYWlkbF9lbmRfcG9zIC0gX2FpZGxfc3RhcnRfcG9zKTsKKyAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfZW5kX3Bvcyk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvRml4ZWRTaXplLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7Cis6OmFuZHJvaWQ6OnN0YXR1c190IEZpeGVkU2l6ZTo6Rml4ZWRQYXJjZWxhYmxlOjpyZWFkRnJvbVBhcmNlbChjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSB7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIHNpemVfdCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPSAwOworICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkSW50MzIoJl9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPCA0KSByZXR1cm4gOjphbmRyb2lkOjpCQURfVkFMVUU7CisgIHNpemVfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUpOworICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gU0laRV9NQVggLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkQm9vbCgmYm9vbGVhblZhbHVlKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEJ5dGUoJmJ5dGVWYWx1ZSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRDaGFyKCZjaGFyVmFsdWUpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkSW50MzIoJmludFZhbHVlKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEludDY0KCZsb25nVmFsdWUpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkRmxvYXQoJmZsb2F0VmFsdWUpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkRG91YmxlKCZkb3VibGVWYWx1ZSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRJbnQ2NChyZWludGVycHJldF9jYXN0PGludDY0X3QgKj4oJmVudW1WYWx1ZSkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkUGFyY2VsYWJsZSgmcGFyY2VsYWJsZVZhbHVlKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorOjphbmRyb2lkOjpzdGF0dXNfdCBGaXhlZFNpemU6OkZpeGVkUGFyY2VsYWJsZTo6d3JpdGVUb1BhcmNlbCg6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCB7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIGF1dG8gX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKKyAgX2FpZGxfcGFyY2VsLT53cml0ZUludDMyKDApOworICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUJvb2woYm9vbGVhblZhbHVlKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlQnl0ZShieXRlVmFsdWUpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVDaGFyKGNoYXJWYWx1ZSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUludDMyKGludFZhbHVlKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlSW50NjQobG9uZ1ZhbHVlKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlRmxvYXQoZmxvYXRWYWx1ZSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZURvdWJsZShkb3VibGVWYWx1ZSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUludDY0KHN0YXRpY19jYXN0PGludDY0X3Q+KGVudW1WYWx1ZSkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVQYXJjZWxhYmxlKHBhcmNlbGFibGVWYWx1ZSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBhdXRvIF9haWRsX2VuZF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MpOworICBfYWlkbF9wYXJjZWwtPndyaXRlSW50MzIoX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX2VuZF9wb3MpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL0ZpeGVkU2l6ZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworOjphbmRyb2lkOjpzdGF0dXNfdCBGaXhlZFNpemU6OkZpeGVkVW5pb246OnJlYWRGcm9tUGFyY2VsKGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIHsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzOworICBpbnQzMl90IF9haWRsX3RhZzsKKyAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkSW50MzIoJl9haWRsX3RhZykpICE9IDo6YW5kcm9pZDo6T0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICBzd2l0Y2ggKHN0YXRpY19jYXN0PFRhZz4oX2FpZGxfdGFnKSkgeworICBjYXNlIGJvb2xlYW5WYWx1ZTogeworICAgIGJvb2wgX2FpZGxfdmFsdWU7CisgICAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkQm9vbCgmX2FpZGxfdmFsdWUpKSAhPSA6OmFuZHJvaWQ6Ok9LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgICBpZiBjb25zdGV4cHIgKHN0ZDo6aXNfdHJpdmlhbGx5X2NvcHlhYmxlX3Y8Ym9vbD4pIHsKKyAgICAgIHNldDxib29sZWFuVmFsdWU+KF9haWRsX3ZhbHVlKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gTk9MSU5UTkVYVExJTkUocGVyZm9ybWFuY2UtbW92ZS1jb25zdC1hcmcpCisgICAgICBzZXQ8Ym9vbGVhblZhbHVlPihzdGQ6Om1vdmUoX2FpZGxfdmFsdWUpKTsKKyAgICB9CisgICAgcmV0dXJuIDo6YW5kcm9pZDo6T0s7IH0KKyAgY2FzZSBieXRlVmFsdWU6IHsKKyAgICBpbnQ4X3QgX2FpZGxfdmFsdWU7CisgICAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkQnl0ZSgmX2FpZGxfdmFsdWUpKSAhPSA6OmFuZHJvaWQ6Ok9LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgICBpZiBjb25zdGV4cHIgKHN0ZDo6aXNfdHJpdmlhbGx5X2NvcHlhYmxlX3Y8aW50OF90PikgeworICAgICAgc2V0PGJ5dGVWYWx1ZT4oX2FpZGxfdmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBOT0xJTlRORVhUTElORShwZXJmb3JtYW5jZS1tb3ZlLWNvbnN0LWFyZykKKyAgICAgIHNldDxieXRlVmFsdWU+KHN0ZDo6bW92ZShfYWlkbF92YWx1ZSkpOworICAgIH0KKyAgICByZXR1cm4gOjphbmRyb2lkOjpPSzsgfQorICBjYXNlIGNoYXJWYWx1ZTogeworICAgIGNoYXIxNl90IF9haWRsX3ZhbHVlOworICAgIGlmICgoX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZENoYXIoJl9haWRsX3ZhbHVlKSkgIT0gOjphbmRyb2lkOjpPSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgICAgaWYgY29uc3RleHByIChzdGQ6OmlzX3RyaXZpYWxseV9jb3B5YWJsZV92PGNoYXIxNl90PikgeworICAgICAgc2V0PGNoYXJWYWx1ZT4oX2FpZGxfdmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBOT0xJTlRORVhUTElORShwZXJmb3JtYW5jZS1tb3ZlLWNvbnN0LWFyZykKKyAgICAgIHNldDxjaGFyVmFsdWU+KHN0ZDo6bW92ZShfYWlkbF92YWx1ZSkpOworICAgIH0KKyAgICByZXR1cm4gOjphbmRyb2lkOjpPSzsgfQorICBjYXNlIGludFZhbHVlOiB7CisgICAgaW50MzJfdCBfYWlkbF92YWx1ZTsKKyAgICBpZiAoKF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRJbnQzMigmX2FpZGxfdmFsdWUpKSAhPSA6OmFuZHJvaWQ6Ok9LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgICBpZiBjb25zdGV4cHIgKHN0ZDo6aXNfdHJpdmlhbGx5X2NvcHlhYmxlX3Y8aW50MzJfdD4pIHsKKyAgICAgIHNldDxpbnRWYWx1ZT4oX2FpZGxfdmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBOT0xJTlRORVhUTElORShwZXJmb3JtYW5jZS1tb3ZlLWNvbnN0LWFyZykKKyAgICAgIHNldDxpbnRWYWx1ZT4oc3RkOjptb3ZlKF9haWRsX3ZhbHVlKSk7CisgICAgfQorICAgIHJldHVybiA6OmFuZHJvaWQ6Ok9LOyB9CisgIGNhc2UgbG9uZ1ZhbHVlOiB7CisgICAgaW50NjRfdCBfYWlkbF92YWx1ZTsKKyAgICBpZiAoKF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRJbnQ2NCgmX2FpZGxfdmFsdWUpKSAhPSA6OmFuZHJvaWQ6Ok9LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgICBpZiBjb25zdGV4cHIgKHN0ZDo6aXNfdHJpdmlhbGx5X2NvcHlhYmxlX3Y8aW50NjRfdD4pIHsKKyAgICAgIHNldDxsb25nVmFsdWU+KF9haWRsX3ZhbHVlKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gTk9MSU5UTkVYVExJTkUocGVyZm9ybWFuY2UtbW92ZS1jb25zdC1hcmcpCisgICAgICBzZXQ8bG9uZ1ZhbHVlPihzdGQ6Om1vdmUoX2FpZGxfdmFsdWUpKTsKKyAgICB9CisgICAgcmV0dXJuIDo6YW5kcm9pZDo6T0s7IH0KKyAgY2FzZSBmbG9hdFZhbHVlOiB7CisgICAgZmxvYXQgX2FpZGxfdmFsdWU7CisgICAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkRmxvYXQoJl9haWRsX3ZhbHVlKSkgIT0gOjphbmRyb2lkOjpPSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgICAgaWYgY29uc3RleHByIChzdGQ6OmlzX3RyaXZpYWxseV9jb3B5YWJsZV92PGZsb2F0PikgeworICAgICAgc2V0PGZsb2F0VmFsdWU+KF9haWRsX3ZhbHVlKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gTk9MSU5UTkVYVExJTkUocGVyZm9ybWFuY2UtbW92ZS1jb25zdC1hcmcpCisgICAgICBzZXQ8ZmxvYXRWYWx1ZT4oc3RkOjptb3ZlKF9haWRsX3ZhbHVlKSk7CisgICAgfQorICAgIHJldHVybiA6OmFuZHJvaWQ6Ok9LOyB9CisgIGNhc2UgZG91YmxlVmFsdWU6IHsKKyAgICBkb3VibGUgX2FpZGxfdmFsdWU7CisgICAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkRG91YmxlKCZfYWlkbF92YWx1ZSkpICE9IDo6YW5kcm9pZDo6T0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICAgIGlmIGNvbnN0ZXhwciAoc3RkOjppc190cml2aWFsbHlfY29weWFibGVfdjxkb3VibGU+KSB7CisgICAgICBzZXQ8ZG91YmxlVmFsdWU+KF9haWRsX3ZhbHVlKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gTk9MSU5UTkVYVExJTkUocGVyZm9ybWFuY2UtbW92ZS1jb25zdC1hcmcpCisgICAgICBzZXQ8ZG91YmxlVmFsdWU+KHN0ZDo6bW92ZShfYWlkbF92YWx1ZSkpOworICAgIH0KKyAgICByZXR1cm4gOjphbmRyb2lkOjpPSzsgfQorICBjYXNlIGVudW1WYWx1ZTogeworICAgIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtIF9haWRsX3ZhbHVlOworICAgIGlmICgoX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEludDY0KHJlaW50ZXJwcmV0X2Nhc3Q8aW50NjRfdCAqPigmX2FpZGxfdmFsdWUpKSkgIT0gOjphbmRyb2lkOjpPSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgICAgaWYgY29uc3RleHByIChzdGQ6OmlzX3RyaXZpYWxseV9jb3B5YWJsZV92PDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtPikgeworICAgICAgc2V0PGVudW1WYWx1ZT4oX2FpZGxfdmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBOT0xJTlRORVhUTElORShwZXJmb3JtYW5jZS1tb3ZlLWNvbnN0LWFyZykKKyAgICAgIHNldDxlbnVtVmFsdWU+KHN0ZDo6bW92ZShfYWlkbF92YWx1ZSkpOworICAgIH0KKyAgICByZXR1cm4gOjphbmRyb2lkOjpPSzsgfQorICB9CisgIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKK30KKzo6YW5kcm9pZDo6c3RhdHVzX3QgRml4ZWRTaXplOjpGaXhlZFVuaW9uOjp3cml0ZVRvUGFyY2VsKDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IHsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KGdldFRhZygpKSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IDo6YW5kcm9pZDo6T0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICBzd2l0Y2ggKGdldFRhZygpKSB7CisgIGNhc2UgYm9vbGVhblZhbHVlOiByZXR1cm4gX2FpZGxfcGFyY2VsLT53cml0ZUJvb2woZ2V0PGJvb2xlYW5WYWx1ZT4oKSk7CisgIGNhc2UgYnl0ZVZhbHVlOiByZXR1cm4gX2FpZGxfcGFyY2VsLT53cml0ZUJ5dGUoZ2V0PGJ5dGVWYWx1ZT4oKSk7CisgIGNhc2UgY2hhclZhbHVlOiByZXR1cm4gX2FpZGxfcGFyY2VsLT53cml0ZUNoYXIoZ2V0PGNoYXJWYWx1ZT4oKSk7CisgIGNhc2UgaW50VmFsdWU6IHJldHVybiBfYWlkbF9wYXJjZWwtPndyaXRlSW50MzIoZ2V0PGludFZhbHVlPigpKTsKKyAgY2FzZSBsb25nVmFsdWU6IHJldHVybiBfYWlkbF9wYXJjZWwtPndyaXRlSW50NjQoZ2V0PGxvbmdWYWx1ZT4oKSk7CisgIGNhc2UgZmxvYXRWYWx1ZTogcmV0dXJuIF9haWRsX3BhcmNlbC0+d3JpdGVGbG9hdChnZXQ8ZmxvYXRWYWx1ZT4oKSk7CisgIGNhc2UgZG91YmxlVmFsdWU6IHJldHVybiBfYWlkbF9wYXJjZWwtPndyaXRlRG91YmxlKGdldDxkb3VibGVWYWx1ZT4oKSk7CisgIGNhc2UgZW51bVZhbHVlOiByZXR1cm4gX2FpZGxfcGFyY2VsLT53cml0ZUludDY0KHN0YXRpY19jYXN0PGludDY0X3Q+KGdldDxlbnVtVmFsdWU+KCkpKTsKKyAgfQorICBfX2Fzc2VydDIoX19GSUxFX18sIF9fTElORV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fLCAiY2FuJ3QgcmVhY2ggaGVyZSIpOworfQorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvRml4ZWRTaXplLmNwcC5kIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9GaXhlZFNpemUuY3BwLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU2NDA0MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvRml4ZWRTaXplLmNwcC5kCkBAIC0wLDAgKzEsMyBAQAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0ZpeGVkU2l6ZS5jcHAgOiBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9GaXhlZFNpemUuYWlkbCBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9Mb25nRW51bS5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lEZXByZWNhdGVkLmNwcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSURlcHJlY2F0ZWQuY3BwCmluZGV4IDRhZGI0ZTcuLjhiZTA5YzIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSURlcHJlY2F0ZWQuY3BwCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSURlcHJlY2F0ZWQuY3BwCkBAIC0xLDE4ICsxLDExIEBACiAjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL0lEZXByZWNhdGVkLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL0JwRGVwcmVjYXRlZC5oPgotCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIG5hbWVzcGFjZSBhaWRsIHsKLQogbmFtZXNwYWNlIHRlc3RzIHsKLQogRE9fTk9UX0RJUkVDVExZX1VTRV9NRV9JTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoRGVwcmVjYXRlZCwgImFuZHJvaWQuYWlkbC50ZXN0cy5JRGVwcmVjYXRlZCIpCi0KIH0gIC8vIG5hbWVzcGFjZSB0ZXN0cwotCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9CcERlcHJlY2F0ZWQuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvQm5EZXByZWNhdGVkLmg+CkBAIC0yMCw5ICsxMyw3IEBACiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL21hY3Jvcy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIG5hbWVzcGFjZSBhaWRsIHsKLQogbmFtZXNwYWNlIHRlc3RzIHsKIAogQnBEZXByZWNhdGVkOjpCcERlcHJlY2F0ZWQoY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+JiBfYWlkbF9pbXBsKQpAQCAtMzAsMTggKzIxLDE0IEBACiB9CiAKIH0gIC8vIG5hbWVzcGFjZSB0ZXN0cwotCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9CbkRlcHJlY2F0ZWQuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAjaW5jbHVkZSA8YmluZGVyL1N0YWJpbGl0eS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIG5hbWVzcGFjZSBhaWRsIHsKLQogbmFtZXNwYWNlIHRlc3RzIHsKIAogQm5EZXByZWNhdGVkOjpCbkRlcHJlY2F0ZWQoKQpAQCAtNjIsNyArNDksNyBAQAogICBicmVhazsKICAgfQogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyA9PSA6OmFuZHJvaWQ6OlVORVhQRUNURURfTlVMTCkgewotICAgIF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tRXhjZXB0aW9uQ29kZSg6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpFWF9OVUxMX1BPSU5URVIpLndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgIF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tRXhjZXB0aW9uQ29kZSg6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpFWF9OVUxMX1BPSU5URVIpLndyaXRlT3ZlclBhcmNlbChfYWlkbF9yZXBseSk7CiAgIH0KICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CiB9CkBAIC03MCw3ICs1Nyw1IEBACiAjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCiAKIH0gIC8vIG5hbWVzcGFjZSB0ZXN0cwotCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JTmFtZWRDYWxsYmFjay5jcHAgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lOYW1lZENhbGxiYWNrLmNwcAppbmRleCBhMWJiNjUxLi4xYmMwNWRkIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lOYW1lZENhbGxiYWNrLmNwcAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lOYW1lZENhbGxiYWNrLmNwcApAQCAtMSwxOCArMSwxMSBAQAogI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9JTmFtZWRDYWxsYmFjay5oPgogI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9CcE5hbWVkQ2FsbGJhY2suaD4KLQogbmFtZXNwYWNlIGFuZHJvaWQgewotCiBuYW1lc3BhY2UgYWlkbCB7Ci0KIG5hbWVzcGFjZSB0ZXN0cyB7Ci0KIERPX05PVF9ESVJFQ1RMWV9VU0VfTUVfSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKE5hbWVkQ2FsbGJhY2ssICJhbmRyb2lkLmFpZGwudGVzdHMuSU5hbWVkQ2FsbGJhY2siKQotCiB9ICAvLyBuYW1lc3BhY2UgdGVzdHMKLQogfSAgLy8gbmFtZXNwYWNlIGFpZGwKLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKICNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvQnBOYW1lZENhbGxiYWNrLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL0JuTmFtZWRDYWxsYmFjay5oPgpAQCAtMjAsOSArMTMsNyBAQAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9tYWNyb3MuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotCiBuYW1lc3BhY2UgYWlkbCB7Ci0KIG5hbWVzcGFjZSB0ZXN0cyB7CiAKIEJwTmFtZWRDYWxsYmFjazo6QnBOYW1lZENhbGxiYWNrKGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiYgX2FpZGxfaW1wbCkKQEAgLTYzLDE4ICs1NCwxNCBAQAogfQogCiB9ICAvLyBuYW1lc3BhY2UgdGVzdHMKLQogfSAgLy8gbmFtZXNwYWNlIGFpZGwKLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKICNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvQm5OYW1lZENhbGxiYWNrLmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgogI2luY2x1ZGUgPGJpbmRlci9TdGFiaWxpdHkuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotCiBuYW1lc3BhY2UgYWlkbCB7Ci0KIG5hbWVzcGFjZSB0ZXN0cyB7CiAKIEJuTmFtZWRDYWxsYmFjazo6Qm5OYW1lZENhbGxiYWNrKCkKQEAgLTExMywxMyArMTAwLDExIEBACiAgIGJyZWFrOwogICB9CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzID09IDo6YW5kcm9pZDo6VU5FWFBFQ1RFRF9OVUxMKSB7Ci0gICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21FeGNlcHRpb25Db2RlKDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OkVYX05VTExfUE9JTlRFUikud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21FeGNlcHRpb25Db2RlKDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OkVYX05VTExfUE9JTlRFUikud3JpdGVPdmVyUGFyY2VsKF9haWRsX3JlcGx5KTsKICAgfQogICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIHRlc3RzCi0KIH0gIC8vIG5hbWVzcGFjZSBhaWRsCi0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lOZXdOYW1lLmNwcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSU5ld05hbWUuY3BwCmluZGV4IDdkY2M0NGYuLmIzMDg4NTYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSU5ld05hbWUuY3BwCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSU5ld05hbWUuY3BwCkBAIC0xLDE4ICsxLDExIEBACiAjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL0lOZXdOYW1lLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL0JwTmV3TmFtZS5oPgotCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIG5hbWVzcGFjZSBhaWRsIHsKLQogbmFtZXNwYWNlIHRlc3RzIHsKLQogRE9fTk9UX0RJUkVDVExZX1VTRV9NRV9JTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoTmV3TmFtZSwgImFuZHJvaWQuYWlkbC50ZXN0cy5JT2xkTmFtZSIpCi0KIH0gIC8vIG5hbWVzcGFjZSB0ZXN0cwotCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9CcE5ld05hbWUuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvQm5OZXdOYW1lLmg+CkBAIC0yMCw5ICsxMyw3IEBACiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL21hY3Jvcy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIG5hbWVzcGFjZSBhaWRsIHsKLQogbmFtZXNwYWNlIHRlc3RzIHsKIAogQnBOZXdOYW1lOjpCcE5ld05hbWUoY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+JiBfYWlkbF9pbXBsKQpAQCAtNjMsMTggKzU0LDE0IEBACiB9CiAKIH0gIC8vIG5hbWVzcGFjZSB0ZXN0cwotCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9Cbk5ld05hbWUuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAjaW5jbHVkZSA8YmluZGVyL1N0YWJpbGl0eS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIG5hbWVzcGFjZSBhaWRsIHsKLQogbmFtZXNwYWNlIHRlc3RzIHsKIAogQm5OZXdOYW1lOjpCbk5ld05hbWUoKQpAQCAtMTEzLDEzICsxMDAsMTEgQEAKICAgYnJlYWs7CiAgIH0KICAgaWYgKF9haWRsX3JldF9zdGF0dXMgPT0gOjphbmRyb2lkOjpVTkVYUEVDVEVEX05VTEwpIHsKLSAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbUV4Y2VwdGlvbkNvZGUoOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6RVhfTlVMTF9QT0lOVEVSKS53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbUV4Y2VwdGlvbkNvZGUoOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6RVhfTlVMTF9QT0lOVEVSKS53cml0ZU92ZXJQYXJjZWwoX2FpZGxfcmVwbHkpOwogICB9CiAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgdGVzdHMKLQogfSAgLy8gbmFtZXNwYWNlIGFpZGwKLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSU9sZE5hbWUuY3BwIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JT2xkTmFtZS5jcHAKaW5kZXggMjk4ODQwNy4uZWUwNGE0ZSAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JT2xkTmFtZS5jcHAKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JT2xkTmFtZS5jcHAKQEAgLTEsMTggKzEsMTEgQEAKICNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvSU9sZE5hbWUuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvQnBPbGROYW1lLmg+Ci0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogbmFtZXNwYWNlIGFpZGwgewotCiBuYW1lc3BhY2UgdGVzdHMgewotCiBET19OT1RfRElSRUNUTFlfVVNFX01FX0lNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShPbGROYW1lLCAiYW5kcm9pZC5haWRsLnRlc3RzLklPbGROYW1lIikKLQogfSAgLy8gbmFtZXNwYWNlIHRlc3RzCi0KIH0gIC8vIG5hbWVzcGFjZSBhaWRsCi0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL0JwT2xkTmFtZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9Cbk9sZE5hbWUuaD4KQEAgLTIwLDkgKzEzLDcgQEAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbWFjcm9zLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogbmFtZXNwYWNlIGFpZGwgewotCiBuYW1lc3BhY2UgdGVzdHMgewogCiBCcE9sZE5hbWU6OkJwT2xkTmFtZShjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4mIF9haWRsX2ltcGwpCkBAIC02MywxOCArNTQsMTQgQEAKIH0KIAogfSAgLy8gbmFtZXNwYWNlIHRlc3RzCi0KIH0gIC8vIG5hbWVzcGFjZSBhaWRsCi0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL0JuT2xkTmFtZS5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KICNpbmNsdWRlIDxiaW5kZXIvU3RhYmlsaXR5Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogbmFtZXNwYWNlIGFpZGwgewotCiBuYW1lc3BhY2UgdGVzdHMgewogCiBCbk9sZE5hbWU6OkJuT2xkTmFtZSgpCkBAIC0xMTMsMTMgKzEwMCwxMSBAQAogICBicmVhazsKICAgfQogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyA9PSA6OmFuZHJvaWQ6OlVORVhQRUNURURfTlVMTCkgewotICAgIF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tRXhjZXB0aW9uQ29kZSg6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpFWF9OVUxMX1BPSU5URVIpLndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgIF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tRXhjZXB0aW9uQ29kZSg6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpFWF9OVUxMX1BPSU5URVIpLndyaXRlT3ZlclBhcmNlbChfYWlkbF9yZXBseSk7CiAgIH0KICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSB0ZXN0cwotCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JVGVzdFNlcnZpY2UuY3BwIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JVGVzdFNlcnZpY2UuY3BwCmluZGV4IGYzY2QxOTguLmI3ZTExYWUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSVRlc3RTZXJ2aWNlLmNwcAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lUZXN0U2VydmljZS5jcHAKQEAgLTEsMzMgKzEsMjMgQEAKICNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvSVRlc3RTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL0JwVGVzdFNlcnZpY2UuaD4KLQogbmFtZXNwYWNlIGFuZHJvaWQgewotCiBuYW1lc3BhY2UgYWlkbCB7Ci0KIG5hbWVzcGFjZSB0ZXN0cyB7Ci0KIERPX05PVF9ESVJFQ1RMWV9VU0VfTUVfSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKFRlc3RTZXJ2aWNlLCAiYW5kcm9pZC5haWRsLnRlc3RzLklUZXN0U2VydmljZSIpCi0KIGNvbnN0IDo6YW5kcm9pZDo6U3RyaW5nMTYmIElUZXN0U2VydmljZTo6U1RSSU5HX1RFU1RfQ09OU1RBTlQoKSB7CiAgIHN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2IHZhbHVlKDo6YW5kcm9pZDo6U3RyaW5nMTYoImZvbyIpKTsKICAgcmV0dXJuIHZhbHVlOwogfQotCiBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiBJVGVzdFNlcnZpY2U6OlNUUklOR19URVNUX0NPTlNUQU5UMigpIHsKICAgc3RhdGljIGNvbnN0IDo6YW5kcm9pZDo6U3RyaW5nMTYgdmFsdWUoOjphbmRyb2lkOjpTdHJpbmcxNigiYmFyIikpOwogICByZXR1cm4gdmFsdWU7CiB9Ci0KIGNvbnN0IDo6c3RkOjpzdHJpbmcmIElUZXN0U2VydmljZTo6U1RSSU5HX1RFU1RfQ09OU1RBTlRfVVRGOCgpIHsKICAgc3RhdGljIGNvbnN0IDo6c3RkOjpzdHJpbmcgdmFsdWUoImJheiIpOwogICByZXR1cm4gdmFsdWU7CiB9Ci0KIH0gIC8vIG5hbWVzcGFjZSB0ZXN0cwotCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9CcFRlc3RTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL0JuVGVzdFNlcnZpY2UuaD4KQEAgLTM1LDkgKzI1LDcgQEAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbWFjcm9zLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogbmFtZXNwYWNlIGFpZGwgewotCiBuYW1lc3BhY2UgdGVzdHMgewogCiBCcFRlc3RTZXJ2aWNlOjpCcFRlc3RTZXJ2aWNlKGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiYgX2FpZGxfaW1wbCkKQEAgLTExMDgsNyArMTA5Niw3IEBACiAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKICAgICBnb3RvIF9haWRsX2Vycm9yOwogICB9Ci0gIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLndyaXRlU3Ryb25nQmluZGVyKDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrOjphc0JpbmRlcihzZXJ2aWNlKSk7CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLndyaXRlU3Ryb25nQmluZGVyKHNlcnZpY2UpOwogICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CiAgICAgZ290byBfYWlkbF9lcnJvcjsKICAgfQpAQCAtMTEzOSw2ICsxMTI3LDI0NiBAQAogICByZXR1cm4gX2FpZGxfc3RhdHVzOwogfQogCis6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEJwVGVzdFNlcnZpY2U6OkdldEludGVyZmFjZUFycmF5KGNvbnN0IDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpTdHJpbmcxNj4mIG5hbWVzLCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+PiogX2FpZGxfcmV0dXJuKSB7CisgIDo6YW5kcm9pZDo6UGFyY2VsIF9haWRsX2RhdGE7CisgIF9haWRsX2RhdGEubWFya1NlbnNpdGl2ZSgpOworICBfYWlkbF9kYXRhLm1hcmtGb3JCaW5kZXIocmVtb3RlU3Ryb25nKCkpOworICA6OmFuZHJvaWQ6OlBhcmNlbCBfYWlkbF9yZXBseTsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpPSzsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oZ2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVTdHJpbmcxNlZlY3RvcihuYW1lcyk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoQm5UZXN0U2VydmljZTo6VFJBTlNBQ1RJT05fR2V0SW50ZXJmYWNlQXJyYXksIF9haWRsX2RhdGEsICZfYWlkbF9yZXBseSwgOjphbmRyb2lkOjpJQmluZGVyOjpGTEFHX0NMRUFSX0JVRik7CisgIGlmIChVTkxJS0VMWShfYWlkbF9yZXRfc3RhdHVzID09IDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTiAmJiBJVGVzdFNlcnZpY2U6OmdldERlZmF1bHRJbXBsKCkpKSB7CisgICAgIHJldHVybiBJVGVzdFNlcnZpY2U6OmdldERlZmF1bHRJbXBsKCktPkdldEludGVyZmFjZUFycmF5KG5hbWVzLCBfYWlkbF9yZXR1cm4pOworICB9CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMucmVhZEZyb21QYXJjZWwoX2FpZGxfcmVwbHkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBpZiAoIV9haWRsX3N0YXR1cy5pc09rKCkpIHsKKyAgICByZXR1cm4gX2FpZGxfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS5yZWFkU3Ryb25nQmluZGVyVmVjdG9yKF9haWRsX3JldHVybik7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX2Vycm9yOgorICBfYWlkbF9zdGF0dXMuc2V0RnJvbVN0YXR1c1QoX2FpZGxfcmV0X3N0YXR1cyk7CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9CisKKzo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgQnBUZXN0U2VydmljZTo6VmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlQXJyYXkoY29uc3QgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPj4mIHNlcnZpY2VzLCBjb25zdCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6U3RyaW5nMTY+JiBuYW1lcywgYm9vbCogX2FpZGxfcmV0dXJuKSB7CisgIDo6YW5kcm9pZDo6UGFyY2VsIF9haWRsX2RhdGE7CisgIF9haWRsX2RhdGEubWFya1NlbnNpdGl2ZSgpOworICBfYWlkbF9kYXRhLm1hcmtGb3JCaW5kZXIocmVtb3RlU3Ryb25nKCkpOworICA6OmFuZHJvaWQ6OlBhcmNlbCBfYWlkbF9yZXBseTsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpPSzsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oZ2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVTdHJvbmdCaW5kZXJWZWN0b3Ioc2VydmljZXMpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZVN0cmluZzE2VmVjdG9yKG5hbWVzKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChCblRlc3RTZXJ2aWNlOjpUUkFOU0FDVElPTl9WZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VBcnJheSwgX2FpZGxfZGF0YSwgJl9haWRsX3JlcGx5LCA6OmFuZHJvaWQ6OklCaW5kZXI6OkZMQUdfQ0xFQVJfQlVGKTsKKyAgaWYgKFVOTElLRUxZKF9haWRsX3JldF9zdGF0dXMgPT0gOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OICYmIElUZXN0U2VydmljZTo6Z2V0RGVmYXVsdEltcGwoKSkpIHsKKyAgICAgcmV0dXJuIElUZXN0U2VydmljZTo6Z2V0RGVmYXVsdEltcGwoKS0+VmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlQXJyYXkoc2VydmljZXMsIG5hbWVzLCBfYWlkbF9yZXR1cm4pOworICB9CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMucmVhZEZyb21QYXJjZWwoX2FpZGxfcmVwbHkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBpZiAoIV9haWRsX3N0YXR1cy5pc09rKCkpIHsKKyAgICByZXR1cm4gX2FpZGxfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS5yZWFkQm9vbChfYWlkbF9yZXR1cm4pOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9lcnJvcjoKKyAgX2FpZGxfc3RhdHVzLnNldEZyb21TdGF0dXNUKF9haWRsX3JldF9zdGF0dXMpOworICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorCis6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEJwVGVzdFNlcnZpY2U6OkdldE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6U3RyaW5nMTY+Pj4mIG5hbWVzLCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPj4+KiBfYWlkbF9yZXR1cm4pIHsKKyAgOjphbmRyb2lkOjpQYXJjZWwgX2FpZGxfZGF0YTsKKyAgX2FpZGxfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgIF9haWRsX2RhdGEubWFya0ZvckJpbmRlcihyZW1vdGVTdHJvbmcoKSk7CisgIDo6YW5kcm9pZDo6UGFyY2VsIF9haWRsX3JlcGx5OworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1czsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZVN0cmluZzE2VmVjdG9yKG5hbWVzKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChCblRlc3RTZXJ2aWNlOjpUUkFOU0FDVElPTl9HZXROdWxsYWJsZUludGVyZmFjZUFycmF5LCBfYWlkbF9kYXRhLCAmX2FpZGxfcmVwbHksIDo6YW5kcm9pZDo6SUJpbmRlcjo6RkxBR19DTEVBUl9CVUYpOworICBpZiAoVU5MSUtFTFkoX2FpZGxfcmV0X3N0YXR1cyA9PSA6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04gJiYgSVRlc3RTZXJ2aWNlOjpnZXREZWZhdWx0SW1wbCgpKSkgeworICAgICByZXR1cm4gSVRlc3RTZXJ2aWNlOjpnZXREZWZhdWx0SW1wbCgpLT5HZXROdWxsYWJsZUludGVyZmFjZUFycmF5KG5hbWVzLCBfYWlkbF9yZXR1cm4pOworICB9CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMucmVhZEZyb21QYXJjZWwoX2FpZGxfcmVwbHkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBpZiAoIV9haWRsX3N0YXR1cy5pc09rKCkpIHsKKyAgICByZXR1cm4gX2FpZGxfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS5yZWFkU3Ryb25nQmluZGVyVmVjdG9yKF9haWRsX3JldHVybik7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX2Vycm9yOgorICBfYWlkbF9zdGF0dXMuc2V0RnJvbVN0YXR1c1QoX2FpZGxfcmV0X3N0YXR1cyk7CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9CisKKzo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgQnBUZXN0U2VydmljZTo6VmVyaWZ5TmFtZXNXaXRoTnVsbGFibGVJbnRlcmZhY2VBcnJheShjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPj4+JiBzZXJ2aWNlcywgY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6U3RyaW5nMTY+Pj4mIG5hbWVzLCBib29sKiBfYWlkbF9yZXR1cm4pIHsKKyAgOjphbmRyb2lkOjpQYXJjZWwgX2FpZGxfZGF0YTsKKyAgX2FpZGxfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgIF9haWRsX2RhdGEubWFya0ZvckJpbmRlcihyZW1vdGVTdHJvbmcoKSk7CisgIDo6YW5kcm9pZDo6UGFyY2VsIF9haWRsX3JlcGx5OworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1czsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZVN0cm9uZ0JpbmRlclZlY3RvcihzZXJ2aWNlcyk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLndyaXRlU3RyaW5nMTZWZWN0b3IobmFtZXMpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEJuVGVzdFNlcnZpY2U6OlRSQU5TQUNUSU9OX1ZlcmlmeU5hbWVzV2l0aE51bGxhYmxlSW50ZXJmYWNlQXJyYXksIF9haWRsX2RhdGEsICZfYWlkbF9yZXBseSwgOjphbmRyb2lkOjpJQmluZGVyOjpGTEFHX0NMRUFSX0JVRik7CisgIGlmIChVTkxJS0VMWShfYWlkbF9yZXRfc3RhdHVzID09IDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTiAmJiBJVGVzdFNlcnZpY2U6OmdldERlZmF1bHRJbXBsKCkpKSB7CisgICAgIHJldHVybiBJVGVzdFNlcnZpY2U6OmdldERlZmF1bHRJbXBsKCktPlZlcmlmeU5hbWVzV2l0aE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoc2VydmljZXMsIG5hbWVzLCBfYWlkbF9yZXR1cm4pOworICB9CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMucmVhZEZyb21QYXJjZWwoX2FpZGxfcmVwbHkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBpZiAoIV9haWRsX3N0YXR1cy5pc09rKCkpIHsKKyAgICByZXR1cm4gX2FpZGxfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS5yZWFkQm9vbChfYWlkbF9yZXR1cm4pOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9lcnJvcjoKKyAgX2FpZGxfc3RhdHVzLnNldEZyb21TdGF0dXNUKF9haWRsX3JldF9zdGF0dXMpOworICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorCis6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEJwVGVzdFNlcnZpY2U6OkdldEludGVyZmFjZUxpc3QoY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6U3RyaW5nMTY+Pj4mIG5hbWVzLCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPj4+KiBfYWlkbF9yZXR1cm4pIHsKKyAgOjphbmRyb2lkOjpQYXJjZWwgX2FpZGxfZGF0YTsKKyAgX2FpZGxfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgIF9haWRsX2RhdGEubWFya0ZvckJpbmRlcihyZW1vdGVTdHJvbmcoKSk7CisgIDo6YW5kcm9pZDo6UGFyY2VsIF9haWRsX3JlcGx5OworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1czsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZVN0cmluZzE2VmVjdG9yKG5hbWVzKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChCblRlc3RTZXJ2aWNlOjpUUkFOU0FDVElPTl9HZXRJbnRlcmZhY2VMaXN0LCBfYWlkbF9kYXRhLCAmX2FpZGxfcmVwbHksIDo6YW5kcm9pZDo6SUJpbmRlcjo6RkxBR19DTEVBUl9CVUYpOworICBpZiAoVU5MSUtFTFkoX2FpZGxfcmV0X3N0YXR1cyA9PSA6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04gJiYgSVRlc3RTZXJ2aWNlOjpnZXREZWZhdWx0SW1wbCgpKSkgeworICAgICByZXR1cm4gSVRlc3RTZXJ2aWNlOjpnZXREZWZhdWx0SW1wbCgpLT5HZXRJbnRlcmZhY2VMaXN0KG5hbWVzLCBfYWlkbF9yZXR1cm4pOworICB9CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMucmVhZEZyb21QYXJjZWwoX2FpZGxfcmVwbHkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBpZiAoIV9haWRsX3N0YXR1cy5pc09rKCkpIHsKKyAgICByZXR1cm4gX2FpZGxfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS5yZWFkU3Ryb25nQmluZGVyVmVjdG9yKF9haWRsX3JldHVybik7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX2Vycm9yOgorICBfYWlkbF9zdGF0dXMuc2V0RnJvbVN0YXR1c1QoX2FpZGxfcmV0X3N0YXR1cyk7CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9CisKKzo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgQnBUZXN0U2VydmljZTo6VmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlTGlzdChjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPj4+JiBzZXJ2aWNlcywgY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6U3RyaW5nMTY+Pj4mIG5hbWVzLCBib29sKiBfYWlkbF9yZXR1cm4pIHsKKyAgOjphbmRyb2lkOjpQYXJjZWwgX2FpZGxfZGF0YTsKKyAgX2FpZGxfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgIF9haWRsX2RhdGEubWFya0ZvckJpbmRlcihyZW1vdGVTdHJvbmcoKSk7CisgIDo6YW5kcm9pZDo6UGFyY2VsIF9haWRsX3JlcGx5OworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1czsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZVN0cm9uZ0JpbmRlclZlY3RvcihzZXJ2aWNlcyk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLndyaXRlU3RyaW5nMTZWZWN0b3IobmFtZXMpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEJuVGVzdFNlcnZpY2U6OlRSQU5TQUNUSU9OX1ZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUxpc3QsIF9haWRsX2RhdGEsICZfYWlkbF9yZXBseSwgOjphbmRyb2lkOjpJQmluZGVyOjpGTEFHX0NMRUFSX0JVRik7CisgIGlmIChVTkxJS0VMWShfYWlkbF9yZXRfc3RhdHVzID09IDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTiAmJiBJVGVzdFNlcnZpY2U6OmdldERlZmF1bHRJbXBsKCkpKSB7CisgICAgIHJldHVybiBJVGVzdFNlcnZpY2U6OmdldERlZmF1bHRJbXBsKCktPlZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUxpc3Qoc2VydmljZXMsIG5hbWVzLCBfYWlkbF9yZXR1cm4pOworICB9CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMucmVhZEZyb21QYXJjZWwoX2FpZGxfcmVwbHkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBpZiAoIV9haWRsX3N0YXR1cy5pc09rKCkpIHsKKyAgICByZXR1cm4gX2FpZGxfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS5yZWFkQm9vbChfYWlkbF9yZXR1cm4pOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9lcnJvcjoKKyAgX2FpZGxfc3RhdHVzLnNldEZyb21TdGF0dXNUKF9haWRsX3JldF9zdGF0dXMpOworICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorCiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEJwVGVzdFNlcnZpY2U6OlJldmVyc2VTdHJpbmdMaXN0KGNvbnN0IDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpTdHJpbmcxNj4mIGlucHV0LCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6U3RyaW5nMTY+KiByZXBlYXRlZCwgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OlN0cmluZzE2PiogX2FpZGxfcmV0dXJuKSB7CiAgIDo6YW5kcm9pZDo6UGFyY2VsIF9haWRsX2RhdGE7CiAgIF9haWRsX2RhdGEubWFya1NlbnNpdGl2ZSgpOwpAQCAtMTUyNyw3ICsxNzU1LDcgQEAKICAgcmV0dXJuIF9haWRsX3N0YXR1czsKIH0KIAotOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBCcFRlc3RTZXJ2aWNlOjpSZXBlYXROdWxsYWJsZVBhcmNlbGFibGUoY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlN0cnVjdHVyZWRQYXJjZWxhYmxlPiYgaW5wdXQsIDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpTdHJ1Y3R1cmVkUGFyY2VsYWJsZT4qIF9haWRsX3JldHVybikgeworOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBCcFRlc3RTZXJ2aWNlOjpSZXBlYXROdWxsYWJsZVBhcmNlbGFibGUoY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6RW1wdHk+JiBpbnB1dCwgOjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6RW1wdHk+KiBfYWlkbF9yZXR1cm4pIHsKICAgOjphbmRyb2lkOjpQYXJjZWwgX2FpZGxfZGF0YTsKICAgX2FpZGxfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CiAgIF9haWRsX2RhdGEubWFya0ZvckJpbmRlcihyZW1vdGVTdHJvbmcoKSk7CkBAIC0xNTY1LDYgKzE3OTMsODIgQEAKICAgcmV0dXJuIF9haWRsX3N0YXR1czsKIH0KIAorOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBCcFRlc3RTZXJ2aWNlOjpSZXBlYXROdWxsYWJsZVBhcmNlbGFibGVBcnJheShjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eT4+PiYgaW5wdXQsIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5Pj4+KiBfYWlkbF9yZXR1cm4pIHsKKyAgOjphbmRyb2lkOjpQYXJjZWwgX2FpZGxfZGF0YTsKKyAgX2FpZGxfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgIF9haWRsX2RhdGEubWFya0ZvckJpbmRlcihyZW1vdGVTdHJvbmcoKSk7CisgIDo6YW5kcm9pZDo6UGFyY2VsIF9haWRsX3JlcGx5OworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1czsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZVBhcmNlbGFibGVWZWN0b3IoaW5wdXQpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEJuVGVzdFNlcnZpY2U6OlRSQU5TQUNUSU9OX1JlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUFycmF5LCBfYWlkbF9kYXRhLCAmX2FpZGxfcmVwbHksIDo6YW5kcm9pZDo6SUJpbmRlcjo6RkxBR19DTEVBUl9CVUYpOworICBpZiAoVU5MSUtFTFkoX2FpZGxfcmV0X3N0YXR1cyA9PSA6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04gJiYgSVRlc3RTZXJ2aWNlOjpnZXREZWZhdWx0SW1wbCgpKSkgeworICAgICByZXR1cm4gSVRlc3RTZXJ2aWNlOjpnZXREZWZhdWx0SW1wbCgpLT5SZXBlYXROdWxsYWJsZVBhcmNlbGFibGVBcnJheShpbnB1dCwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLnJlYWRGcm9tUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgaWYgKCFfYWlkbF9zdGF0dXMuaXNPaygpKSB7CisgICAgcmV0dXJuIF9haWRsX3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHkucmVhZFBhcmNlbGFibGVWZWN0b3IoX2FpZGxfcmV0dXJuKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfZXJyb3I6CisgIF9haWRsX3N0YXR1cy5zZXRGcm9tU3RhdHVzVChfYWlkbF9yZXRfc3RhdHVzKTsKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKworOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBCcFRlc3RTZXJ2aWNlOjpSZXBlYXROdWxsYWJsZVBhcmNlbGFibGVMaXN0KGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5Pj4+JiBpbnB1dCwgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6RW1wdHk+Pj4qIF9haWRsX3JldHVybikgeworICA6OmFuZHJvaWQ6OlBhcmNlbCBfYWlkbF9kYXRhOworICBfYWlkbF9kYXRhLm1hcmtTZW5zaXRpdmUoKTsKKyAgX2FpZGxfZGF0YS5tYXJrRm9yQmluZGVyKHJlbW90ZVN0cm9uZygpKTsKKyAgOjphbmRyb2lkOjpQYXJjZWwgX2FpZGxfcmVwbHk7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzOworICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKGdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLndyaXRlUGFyY2VsYWJsZVZlY3RvcihpbnB1dCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoQm5UZXN0U2VydmljZTo6VFJBTlNBQ1RJT05fUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlTGlzdCwgX2FpZGxfZGF0YSwgJl9haWRsX3JlcGx5LCA6OmFuZHJvaWQ6OklCaW5kZXI6OkZMQUdfQ0xFQVJfQlVGKTsKKyAgaWYgKFVOTElLRUxZKF9haWRsX3JldF9zdGF0dXMgPT0gOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OICYmIElUZXN0U2VydmljZTo6Z2V0RGVmYXVsdEltcGwoKSkpIHsKKyAgICAgcmV0dXJuIElUZXN0U2VydmljZTo6Z2V0RGVmYXVsdEltcGwoKS0+UmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlTGlzdChpbnB1dCwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLnJlYWRGcm9tUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgaWYgKCFfYWlkbF9zdGF0dXMuaXNPaygpKSB7CisgICAgcmV0dXJuIF9haWRsX3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHkucmVhZFBhcmNlbGFibGVWZWN0b3IoX2FpZGxfcmV0dXJuKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfZXJyb3I6CisgIF9haWRsX3N0YXR1cy5zZXRGcm9tU3RhdHVzVChfYWlkbF9yZXRfc3RhdHVzKTsKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKwogOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBCcFRlc3RTZXJ2aWNlOjpUYWtlc0FuSUJpbmRlcihjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4mIGlucHV0KSB7CiAgIDo6YW5kcm9pZDo6UGFyY2VsIF9haWRsX2RhdGE7CiAgIF9haWRsX2RhdGEubWFya1NlbnNpdGl2ZSgpOwpAQCAtMTYzMyw2ICsxOTM3LDc0IEBACiAgIHJldHVybiBfYWlkbF9zdGF0dXM7CiB9CiAKKzo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgQnBUZXN0U2VydmljZTo6VGFrZXNBbklCaW5kZXJMaXN0KGNvbnN0IDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+PiYgaW5wdXQpIHsKKyAgOjphbmRyb2lkOjpQYXJjZWwgX2FpZGxfZGF0YTsKKyAgX2FpZGxfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgIF9haWRsX2RhdGEubWFya0ZvckJpbmRlcihyZW1vdGVTdHJvbmcoKSk7CisgIDo6YW5kcm9pZDo6UGFyY2VsIF9haWRsX3JlcGx5OworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1czsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZVN0cm9uZ0JpbmRlclZlY3RvcihpbnB1dCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoQm5UZXN0U2VydmljZTo6VFJBTlNBQ1RJT05fVGFrZXNBbklCaW5kZXJMaXN0LCBfYWlkbF9kYXRhLCAmX2FpZGxfcmVwbHksIDo6YW5kcm9pZDo6SUJpbmRlcjo6RkxBR19DTEVBUl9CVUYpOworICBpZiAoVU5MSUtFTFkoX2FpZGxfcmV0X3N0YXR1cyA9PSA6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04gJiYgSVRlc3RTZXJ2aWNlOjpnZXREZWZhdWx0SW1wbCgpKSkgeworICAgICByZXR1cm4gSVRlc3RTZXJ2aWNlOjpnZXREZWZhdWx0SW1wbCgpLT5UYWtlc0FuSUJpbmRlckxpc3QoaW5wdXQpOworICB9CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMucmVhZEZyb21QYXJjZWwoX2FpZGxfcmVwbHkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBpZiAoIV9haWRsX3N0YXR1cy5pc09rKCkpIHsKKyAgICByZXR1cm4gX2FpZGxfc3RhdHVzOworICB9CisgIF9haWRsX2Vycm9yOgorICBfYWlkbF9zdGF0dXMuc2V0RnJvbVN0YXR1c1QoX2FpZGxfcmV0X3N0YXR1cyk7CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9CisKKzo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgQnBUZXN0U2VydmljZTo6VGFrZXNBTnVsbGFibGVJQmluZGVyTGlzdChjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4+PiYgaW5wdXQpIHsKKyAgOjphbmRyb2lkOjpQYXJjZWwgX2FpZGxfZGF0YTsKKyAgX2FpZGxfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgIF9haWRsX2RhdGEubWFya0ZvckJpbmRlcihyZW1vdGVTdHJvbmcoKSk7CisgIDo6YW5kcm9pZDo6UGFyY2VsIF9haWRsX3JlcGx5OworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1czsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZVN0cm9uZ0JpbmRlclZlY3RvcihpbnB1dCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoQm5UZXN0U2VydmljZTo6VFJBTlNBQ1RJT05fVGFrZXNBTnVsbGFibGVJQmluZGVyTGlzdCwgX2FpZGxfZGF0YSwgJl9haWRsX3JlcGx5LCA6OmFuZHJvaWQ6OklCaW5kZXI6OkZMQUdfQ0xFQVJfQlVGKTsKKyAgaWYgKFVOTElLRUxZKF9haWRsX3JldF9zdGF0dXMgPT0gOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OICYmIElUZXN0U2VydmljZTo6Z2V0RGVmYXVsdEltcGwoKSkpIHsKKyAgICAgcmV0dXJuIElUZXN0U2VydmljZTo6Z2V0RGVmYXVsdEltcGwoKS0+VGFrZXNBTnVsbGFibGVJQmluZGVyTGlzdChpbnB1dCk7CisgIH0KKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy5yZWFkRnJvbVBhcmNlbChfYWlkbF9yZXBseSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIGlmICghX2FpZGxfc3RhdHVzLmlzT2soKSkgeworICAgIHJldHVybiBfYWlkbF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfZXJyb3I6CisgIF9haWRsX3N0YXR1cy5zZXRGcm9tU3RhdHVzVChfYWlkbF9yZXRfc3RhdHVzKTsKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKwogOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBCcFRlc3RTZXJ2aWNlOjpSZXBlYXRVdGY4Q3BwU3RyaW5nKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHRva2VuLCA6OnN0ZDo6c3RyaW5nKiBfYWlkbF9yZXR1cm4pIHsKICAgOjphbmRyb2lkOjpQYXJjZWwgX2FpZGxfZGF0YTsKICAgX2FpZGxfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CkBAIC0xOTE5LDYgKzIyOTEsMTc0IEBACiAgIHJldHVybiBfYWlkbF9zdGF0dXM7CiB9CiAKKzo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgQnBUZXN0U2VydmljZTo6UmVwZWF0RXh0ZW5kYWJsZVBhcmNlbGFibGUoY29uc3QgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6ZXh0ZW5zaW9uOjpFeHRlbmRhYmxlUGFyY2VsYWJsZSYgZXAsIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OmV4dGVuc2lvbjo6RXh0ZW5kYWJsZVBhcmNlbGFibGUqIGVwMikgeworICA6OmFuZHJvaWQ6OlBhcmNlbCBfYWlkbF9kYXRhOworICBfYWlkbF9kYXRhLm1hcmtTZW5zaXRpdmUoKTsKKyAgX2FpZGxfZGF0YS5tYXJrRm9yQmluZGVyKHJlbW90ZVN0cm9uZygpKTsKKyAgOjphbmRyb2lkOjpQYXJjZWwgX2FpZGxfcmVwbHk7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzOworICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKGdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLndyaXRlUGFyY2VsYWJsZShlcCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoQm5UZXN0U2VydmljZTo6VFJBTlNBQ1RJT05fUmVwZWF0RXh0ZW5kYWJsZVBhcmNlbGFibGUsIF9haWRsX2RhdGEsICZfYWlkbF9yZXBseSwgOjphbmRyb2lkOjpJQmluZGVyOjpGTEFHX0NMRUFSX0JVRik7CisgIGlmIChVTkxJS0VMWShfYWlkbF9yZXRfc3RhdHVzID09IDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTiAmJiBJVGVzdFNlcnZpY2U6OmdldERlZmF1bHRJbXBsKCkpKSB7CisgICAgIHJldHVybiBJVGVzdFNlcnZpY2U6OmdldERlZmF1bHRJbXBsKCktPlJlcGVhdEV4dGVuZGFibGVQYXJjZWxhYmxlKGVwLCBlcDIpOworICB9CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMucmVhZEZyb21QYXJjZWwoX2FpZGxfcmVwbHkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBpZiAoIV9haWRsX3N0YXR1cy5pc09rKCkpIHsKKyAgICByZXR1cm4gX2FpZGxfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS5yZWFkUGFyY2VsYWJsZShlcDIpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9lcnJvcjoKKyAgX2FpZGxfc3RhdHVzLnNldEZyb21TdGF0dXNUKF9haWRsX3JldF9zdGF0dXMpOworICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorCis6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEJwVGVzdFNlcnZpY2U6OlJldmVyc2VMaXN0KGNvbnN0IDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlJlY3Vyc2l2ZUxpc3QmIGxpc3QsIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlJlY3Vyc2l2ZUxpc3QqIF9haWRsX3JldHVybikgeworICA6OmFuZHJvaWQ6OlBhcmNlbCBfYWlkbF9kYXRhOworICBfYWlkbF9kYXRhLm1hcmtTZW5zaXRpdmUoKTsKKyAgX2FpZGxfZGF0YS5tYXJrRm9yQmluZGVyKHJlbW90ZVN0cm9uZygpKTsKKyAgOjphbmRyb2lkOjpQYXJjZWwgX2FpZGxfcmVwbHk7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzOworICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKGdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLndyaXRlUGFyY2VsYWJsZShsaXN0KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChCblRlc3RTZXJ2aWNlOjpUUkFOU0FDVElPTl9SZXZlcnNlTGlzdCwgX2FpZGxfZGF0YSwgJl9haWRsX3JlcGx5LCA6OmFuZHJvaWQ6OklCaW5kZXI6OkZMQUdfQ0xFQVJfQlVGKTsKKyAgaWYgKFVOTElLRUxZKF9haWRsX3JldF9zdGF0dXMgPT0gOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OICYmIElUZXN0U2VydmljZTo6Z2V0RGVmYXVsdEltcGwoKSkpIHsKKyAgICAgcmV0dXJuIElUZXN0U2VydmljZTo6Z2V0RGVmYXVsdEltcGwoKS0+UmV2ZXJzZUxpc3QobGlzdCwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLnJlYWRGcm9tUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgaWYgKCFfYWlkbF9zdGF0dXMuaXNPaygpKSB7CisgICAgcmV0dXJuIF9haWRsX3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHkucmVhZFBhcmNlbGFibGUoX2FpZGxfcmV0dXJuKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfZXJyb3I6CisgIF9haWRsX3N0YXR1cy5zZXRGcm9tU3RhdHVzVChfYWlkbF9yZXRfc3RhdHVzKTsKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKworOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBCcFRlc3RTZXJ2aWNlOjpSZXZlcnNlSUJpbmRlckFycmF5KGNvbnN0IDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+PiYgaW5wdXQsIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+PiogcmVwZWF0ZWQsIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+PiogX2FpZGxfcmV0dXJuKSB7CisgIDo6YW5kcm9pZDo6UGFyY2VsIF9haWRsX2RhdGE7CisgIF9haWRsX2RhdGEubWFya1NlbnNpdGl2ZSgpOworICBfYWlkbF9kYXRhLm1hcmtGb3JCaW5kZXIocmVtb3RlU3Ryb25nKCkpOworICA6OmFuZHJvaWQ6OlBhcmNlbCBfYWlkbF9yZXBseTsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpPSzsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oZ2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVTdHJvbmdCaW5kZXJWZWN0b3IoaW5wdXQpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZVZlY3RvclNpemUoKnJlcGVhdGVkKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChCblRlc3RTZXJ2aWNlOjpUUkFOU0FDVElPTl9SZXZlcnNlSUJpbmRlckFycmF5LCBfYWlkbF9kYXRhLCAmX2FpZGxfcmVwbHksIDo6YW5kcm9pZDo6SUJpbmRlcjo6RkxBR19DTEVBUl9CVUYpOworICBpZiAoVU5MSUtFTFkoX2FpZGxfcmV0X3N0YXR1cyA9PSA6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04gJiYgSVRlc3RTZXJ2aWNlOjpnZXREZWZhdWx0SW1wbCgpKSkgeworICAgICByZXR1cm4gSVRlc3RTZXJ2aWNlOjpnZXREZWZhdWx0SW1wbCgpLT5SZXZlcnNlSUJpbmRlckFycmF5KGlucHV0LCByZXBlYXRlZCwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLnJlYWRGcm9tUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgaWYgKCFfYWlkbF9zdGF0dXMuaXNPaygpKSB7CisgICAgcmV0dXJuIF9haWRsX3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHkucmVhZFN0cm9uZ0JpbmRlclZlY3RvcihfYWlkbF9yZXR1cm4pOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHkucmVhZFN0cm9uZ0JpbmRlclZlY3RvcihyZXBlYXRlZCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX2Vycm9yOgorICBfYWlkbF9zdGF0dXMuc2V0RnJvbVN0YXR1c1QoX2FpZGxfcmV0X3N0YXR1cyk7CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9CisKKzo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgQnBUZXN0U2VydmljZTo6UmV2ZXJzZU51bGxhYmxlSUJpbmRlckFycmF5KGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPj4+JiBpbnB1dCwgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+Pj4qIHJlcGVhdGVkLCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4+PiogX2FpZGxfcmV0dXJuKSB7CisgIDo6YW5kcm9pZDo6UGFyY2VsIF9haWRsX2RhdGE7CisgIF9haWRsX2RhdGEubWFya1NlbnNpdGl2ZSgpOworICBfYWlkbF9kYXRhLm1hcmtGb3JCaW5kZXIocmVtb3RlU3Ryb25nKCkpOworICA6OmFuZHJvaWQ6OlBhcmNlbCBfYWlkbF9yZXBseTsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpPSzsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oZ2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVTdHJvbmdCaW5kZXJWZWN0b3IoaW5wdXQpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZVZlY3RvclNpemUoKnJlcGVhdGVkKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChCblRlc3RTZXJ2aWNlOjpUUkFOU0FDVElPTl9SZXZlcnNlTnVsbGFibGVJQmluZGVyQXJyYXksIF9haWRsX2RhdGEsICZfYWlkbF9yZXBseSwgOjphbmRyb2lkOjpJQmluZGVyOjpGTEFHX0NMRUFSX0JVRik7CisgIGlmIChVTkxJS0VMWShfYWlkbF9yZXRfc3RhdHVzID09IDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTiAmJiBJVGVzdFNlcnZpY2U6OmdldERlZmF1bHRJbXBsKCkpKSB7CisgICAgIHJldHVybiBJVGVzdFNlcnZpY2U6OmdldERlZmF1bHRJbXBsKCktPlJldmVyc2VOdWxsYWJsZUlCaW5kZXJBcnJheShpbnB1dCwgcmVwZWF0ZWQsIF9haWRsX3JldHVybik7CisgIH0KKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy5yZWFkRnJvbVBhcmNlbChfYWlkbF9yZXBseSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIGlmICghX2FpZGxfc3RhdHVzLmlzT2soKSkgeworICAgIHJldHVybiBfYWlkbF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWRTdHJvbmdCaW5kZXJWZWN0b3IoX2FpZGxfcmV0dXJuKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWRTdHJvbmdCaW5kZXJWZWN0b3IocmVwZWF0ZWQpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9lcnJvcjoKKyAgX2FpZGxfc3RhdHVzLnNldEZyb21TdGF0dXNUKF9haWRsX3JldF9zdGF0dXMpOworICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorCiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEJwVGVzdFNlcnZpY2U6OkdldE9sZE5hbWVJbnRlcmZhY2UoOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJT2xkTmFtZT4qIF9haWRsX3JldHVybikgewogICA6OmFuZHJvaWQ6OlBhcmNlbCBfYWlkbF9kYXRhOwogICBfYWlkbF9kYXRhLm1hcmtTZW5zaXRpdmUoKTsKQEAgLTE5ODcsNiArMjUyNyw0NCBAQAogICByZXR1cm4gX2FpZGxfc3RhdHVzOwogfQogCis6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEJwVGVzdFNlcnZpY2U6OkdldFVuaW9uVGFncyhjb25zdCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlVuaW9uPiYgaW5wdXQsIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6VW5pb246OlRhZz4qIF9haWRsX3JldHVybikgeworICA6OmFuZHJvaWQ6OlBhcmNlbCBfYWlkbF9kYXRhOworICBfYWlkbF9kYXRhLm1hcmtTZW5zaXRpdmUoKTsKKyAgX2FpZGxfZGF0YS5tYXJrRm9yQmluZGVyKHJlbW90ZVN0cm9uZygpKTsKKyAgOjphbmRyb2lkOjpQYXJjZWwgX2FpZGxfcmVwbHk7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzOworICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKGdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLndyaXRlUGFyY2VsYWJsZVZlY3RvcihpbnB1dCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoQm5UZXN0U2VydmljZTo6VFJBTlNBQ1RJT05fR2V0VW5pb25UYWdzLCBfYWlkbF9kYXRhLCAmX2FpZGxfcmVwbHksIDo6YW5kcm9pZDo6SUJpbmRlcjo6RkxBR19DTEVBUl9CVUYpOworICBpZiAoVU5MSUtFTFkoX2FpZGxfcmV0X3N0YXR1cyA9PSA6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04gJiYgSVRlc3RTZXJ2aWNlOjpnZXREZWZhdWx0SW1wbCgpKSkgeworICAgICByZXR1cm4gSVRlc3RTZXJ2aWNlOjpnZXREZWZhdWx0SW1wbCgpLT5HZXRVbmlvblRhZ3MoaW5wdXQsIF9haWRsX3JldHVybik7CisgIH0KKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy5yZWFkRnJvbVBhcmNlbChfYWlkbF9yZXBseSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIGlmICghX2FpZGxfc3RhdHVzLmlzT2soKSkgeworICAgIHJldHVybiBfYWlkbF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWRFbnVtVmVjdG9yKF9haWRsX3JldHVybik7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX2Vycm9yOgorICBfYWlkbF9zdGF0dXMuc2V0RnJvbVN0YXR1c1QoX2FpZGxfcmV0X3N0YXR1cyk7CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9CisKIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgQnBUZXN0U2VydmljZTo6R2V0Q3BwSmF2YVRlc3RzKDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiogX2FpZGxfcmV0dXJuKSB7CiAgIDo6YW5kcm9pZDo6UGFyY2VsIF9haWRsX2RhdGE7CiAgIF9haWRsX2RhdGEubWFya1NlbnNpdGl2ZSgpOwpAQCAtMjA1NiwxOCArMjYzNCwxNCBAQAogfQogCiB9ICAvLyBuYW1lc3BhY2UgdGVzdHMKLQogfSAgLy8gbmFtZXNwYWNlIGFpZGwKLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKICNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvQm5UZXN0U2VydmljZS5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KICNpbmNsdWRlIDxiaW5kZXIvU3RhYmlsaXR5Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogbmFtZXNwYWNlIGFpZGwgewotCiBuYW1lc3BhY2UgdGVzdHMgewogCiBCblRlc3RTZXJ2aWNlOjpCblRlc3RTZXJ2aWNlKCkKQEAgLTIwOTMsNiArMjY2NywxMCBAQAogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKICAgICAgIGJyZWFrOwogICAgIH0KKyAgICBpZiAoYXV0byBzdCA9IF9haWRsX2RhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7ICFzdC5pc09rKCkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBzdC53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICAgIGJyZWFrOworICAgIH0KICAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1cyhVbmltcGxlbWVudGVkTWV0aG9kKGluX2FyZywgJl9haWRsX3JldHVybikpOwogICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewpAQCAtMjE0NCw2ICsyNzIyLDEwIEBACiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewogICAgICAgYnJlYWs7CiAgICAgfQorICAgIGlmIChhdXRvIHN0ID0gX2FpZGxfZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsgIXN0LmlzT2soKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IHN0LndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgICAgYnJlYWs7CisgICAgfQogICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzKFJlcGVhdEJvb2xlYW4oaW5fdG9rZW4sICZfYWlkbF9yZXR1cm4pKTsKICAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOwogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKQEAgLTIxNzAsNiArMjc1MiwxMCBAQAogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKICAgICAgIGJyZWFrOwogICAgIH0KKyAgICBpZiAoYXV0byBzdCA9IF9haWRsX2RhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7ICFzdC5pc09rKCkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBzdC53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICAgIGJyZWFrOworICAgIH0KICAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1cyhSZXBlYXRCeXRlKGluX3Rva2VuLCAmX2FpZGxfcmV0dXJuKSk7CiAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CkBAIC0yMTk2LDYgKzI3ODIsMTAgQEAKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CiAgICAgICBicmVhazsKICAgICB9CisgICAgaWYgKGF1dG8gc3QgPSBfYWlkbF9kYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOyAhc3QuaXNPaygpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gc3Qud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgICBicmVhazsKKyAgICB9CiAgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXMoUmVwZWF0Q2hhcihpbl90b2tlbiwgJl9haWRsX3JldHVybikpOwogICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewpAQCAtMjIyMiw2ICsyODEyLDEwIEBACiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewogICAgICAgYnJlYWs7CiAgICAgfQorICAgIGlmIChhdXRvIHN0ID0gX2FpZGxfZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsgIXN0LmlzT2soKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IHN0LndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgICAgYnJlYWs7CisgICAgfQogICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzKFJlcGVhdEludChpbl90b2tlbiwgJl9haWRsX3JldHVybikpOwogICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewpAQCAtMjI0OCw2ICsyODQyLDEwIEBACiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewogICAgICAgYnJlYWs7CiAgICAgfQorICAgIGlmIChhdXRvIHN0ID0gX2FpZGxfZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsgIXN0LmlzT2soKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IHN0LndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgICAgYnJlYWs7CisgICAgfQogICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzKFJlcGVhdExvbmcoaW5fdG9rZW4sICZfYWlkbF9yZXR1cm4pKTsKICAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOwogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKQEAgLTIyNzQsNiArMjg3MiwxMCBAQAogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKICAgICAgIGJyZWFrOwogICAgIH0KKyAgICBpZiAoYXV0byBzdCA9IF9haWRsX2RhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7ICFzdC5pc09rKCkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBzdC53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICAgIGJyZWFrOworICAgIH0KICAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1cyhSZXBlYXRGbG9hdChpbl90b2tlbiwgJl9haWRsX3JldHVybikpOwogICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewpAQCAtMjMwMCw2ICsyOTAyLDEwIEBACiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewogICAgICAgYnJlYWs7CiAgICAgfQorICAgIGlmIChhdXRvIHN0ID0gX2FpZGxfZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsgIXN0LmlzT2soKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IHN0LndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgICAgYnJlYWs7CisgICAgfQogICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzKFJlcGVhdERvdWJsZShpbl90b2tlbiwgJl9haWRsX3JldHVybikpOwogICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewpAQCAtMjMyNiw2ICsyOTMyLDEwIEBACiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewogICAgICAgYnJlYWs7CiAgICAgfQorICAgIGlmIChhdXRvIHN0ID0gX2FpZGxfZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsgIXN0LmlzT2soKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IHN0LndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgICAgYnJlYWs7CisgICAgfQogICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzKFJlcGVhdFN0cmluZyhpbl90b2tlbiwgJl9haWRsX3JldHVybikpOwogICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewpAQCAtMjM1Miw2ICsyOTYyLDEwIEBACiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewogICAgICAgYnJlYWs7CiAgICAgfQorICAgIGlmIChhdXRvIHN0ID0gX2FpZGxfZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsgIXN0LmlzT2soKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IHN0LndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgICAgYnJlYWs7CisgICAgfQogICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzKFJlcGVhdEJ5dGVFbnVtKGluX3Rva2VuLCAmX2FpZGxfcmV0dXJuKSk7CiAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CkBAIC0yMzc4LDYgKzI5OTIsMTAgQEAKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CiAgICAgICBicmVhazsKICAgICB9CisgICAgaWYgKGF1dG8gc3QgPSBfYWlkbF9kYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOyAhc3QuaXNPaygpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gc3Qud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgICBicmVhazsKKyAgICB9CiAgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXMoUmVwZWF0SW50RW51bShpbl90b2tlbiwgJl9haWRsX3JldHVybikpOwogICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewpAQCAtMjQwNCw2ICszMDIyLDEwIEBACiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewogICAgICAgYnJlYWs7CiAgICAgfQorICAgIGlmIChhdXRvIHN0ID0gX2FpZGxfZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsgIXN0LmlzT2soKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IHN0LndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgICAgYnJlYWs7CisgICAgfQogICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzKFJlcGVhdExvbmdFbnVtKGluX3Rva2VuLCAmX2FpZGxfcmV0dXJuKSk7CiAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CkBAIC0yNDM1LDYgKzMwNTcsMTAgQEAKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CiAgICAgICBicmVhazsKICAgICB9CisgICAgaWYgKGF1dG8gc3QgPSBfYWlkbF9kYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOyAhc3QuaXNPaygpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gc3Qud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgICBicmVhazsKKyAgICB9CiAgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXMoUmV2ZXJzZUJvb2xlYW4oaW5faW5wdXQsICZvdXRfcmVwZWF0ZWQsICZfYWlkbF9yZXR1cm4pKTsKICAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOwogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKQEAgLTI0NzAsNiArMzA5NiwxMCBAQAogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKICAgICAgIGJyZWFrOwogICAgIH0KKyAgICBpZiAoYXV0byBzdCA9IF9haWRsX2RhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7ICFzdC5pc09rKCkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBzdC53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICAgIGJyZWFrOworICAgIH0KICAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1cyhSZXZlcnNlQnl0ZShpbl9pbnB1dCwgJm91dF9yZXBlYXRlZCwgJl9haWRsX3JldHVybikpOwogICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewpAQCAtMjUwNSw2ICszMTM1LDEwIEBACiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewogICAgICAgYnJlYWs7CiAgICAgfQorICAgIGlmIChhdXRvIHN0ID0gX2FpZGxfZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsgIXN0LmlzT2soKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IHN0LndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgICAgYnJlYWs7CisgICAgfQogICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzKFJldmVyc2VDaGFyKGluX2lucHV0LCAmb3V0X3JlcGVhdGVkLCAmX2FpZGxfcmV0dXJuKSk7CiAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CkBAIC0yNTQwLDYgKzMxNzQsMTAgQEAKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CiAgICAgICBicmVhazsKICAgICB9CisgICAgaWYgKGF1dG8gc3QgPSBfYWlkbF9kYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOyAhc3QuaXNPaygpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gc3Qud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgICBicmVhazsKKyAgICB9CiAgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXMoUmV2ZXJzZUludChpbl9pbnB1dCwgJm91dF9yZXBlYXRlZCwgJl9haWRsX3JldHVybikpOwogICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewpAQCAtMjU3NSw2ICszMjEzLDEwIEBACiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewogICAgICAgYnJlYWs7CiAgICAgfQorICAgIGlmIChhdXRvIHN0ID0gX2FpZGxfZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsgIXN0LmlzT2soKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IHN0LndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgICAgYnJlYWs7CisgICAgfQogICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzKFJldmVyc2VMb25nKGluX2lucHV0LCAmb3V0X3JlcGVhdGVkLCAmX2FpZGxfcmV0dXJuKSk7CiAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CkBAIC0yNjEwLDYgKzMyNTIsMTAgQEAKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CiAgICAgICBicmVhazsKICAgICB9CisgICAgaWYgKGF1dG8gc3QgPSBfYWlkbF9kYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOyAhc3QuaXNPaygpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gc3Qud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgICBicmVhazsKKyAgICB9CiAgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXMoUmV2ZXJzZUZsb2F0KGluX2lucHV0LCAmb3V0X3JlcGVhdGVkLCAmX2FpZGxfcmV0dXJuKSk7CiAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CkBAIC0yNjQ1LDYgKzMyOTEsMTAgQEAKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CiAgICAgICBicmVhazsKICAgICB9CisgICAgaWYgKGF1dG8gc3QgPSBfYWlkbF9kYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOyAhc3QuaXNPaygpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gc3Qud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgICBicmVhazsKKyAgICB9CiAgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXMoUmV2ZXJzZURvdWJsZShpbl9pbnB1dCwgJm91dF9yZXBlYXRlZCwgJl9haWRsX3JldHVybikpOwogICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewpAQCAtMjY4MCw2ICszMzMwLDEwIEBACiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewogICAgICAgYnJlYWs7CiAgICAgfQorICAgIGlmIChhdXRvIHN0ID0gX2FpZGxfZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsgIXN0LmlzT2soKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IHN0LndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgICAgYnJlYWs7CisgICAgfQogICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzKFJldmVyc2VTdHJpbmcoaW5faW5wdXQsICZvdXRfcmVwZWF0ZWQsICZfYWlkbF9yZXR1cm4pKTsKICAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOwogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKQEAgLTI3MTUsNiArMzM2OSwxMCBAQAogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKICAgICAgIGJyZWFrOwogICAgIH0KKyAgICBpZiAoYXV0byBzdCA9IF9haWRsX2RhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7ICFzdC5pc09rKCkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBzdC53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICAgIGJyZWFrOworICAgIH0KICAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1cyhSZXZlcnNlQnl0ZUVudW0oaW5faW5wdXQsICZvdXRfcmVwZWF0ZWQsICZfYWlkbF9yZXR1cm4pKTsKICAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOwogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKQEAgLTI3NTAsNiArMzQwOCwxMCBAQAogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKICAgICAgIGJyZWFrOwogICAgIH0KKyAgICBpZiAoYXV0byBzdCA9IF9haWRsX2RhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7ICFzdC5pc09rKCkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBzdC53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICAgIGJyZWFrOworICAgIH0KICAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1cyhSZXZlcnNlSW50RW51bShpbl9pbnB1dCwgJm91dF9yZXBlYXRlZCwgJl9haWRsX3JldHVybikpOwogICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewpAQCAtMjc4NSw2ICszNDQ3LDEwIEBACiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewogICAgICAgYnJlYWs7CiAgICAgfQorICAgIGlmIChhdXRvIHN0ID0gX2FpZGxfZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsgIXN0LmlzT2soKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IHN0LndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgICAgYnJlYWs7CisgICAgfQogICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzKFJldmVyc2VMb25nRW51bShpbl9pbnB1dCwgJm91dF9yZXBlYXRlZCwgJl9haWRsX3JldHVybikpOwogICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewpAQCAtMjgxNSw2ICszNDgxLDEwIEBACiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewogICAgICAgYnJlYWs7CiAgICAgfQorICAgIGlmIChhdXRvIHN0ID0gX2FpZGxfZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsgIXN0LmlzT2soKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IHN0LndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgICAgYnJlYWs7CisgICAgfQogICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzKEdldE90aGVyVGVzdFNlcnZpY2UoaW5fbmFtZSwgJl9haWRsX3JldHVybikpOwogICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewpAQCAtMjgyMyw3ICszNDkzLDcgQEAKICAgICBpZiAoIV9haWRsX3N0YXR1cy5pc09rKCkpIHsKICAgICAgIGJyZWFrOwogICAgIH0KLSAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrOjphc0JpbmRlcihfYWlkbF9yZXR1cm4pKTsKKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKF9haWRsX3JldHVybik7CiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewogICAgICAgYnJlYWs7CiAgICAgfQpAQCAtMjg0Niw2ICszNTE2LDEwIEBACiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewogICAgICAgYnJlYWs7CiAgICAgfQorICAgIGlmIChhdXRvIHN0ID0gX2FpZGxfZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsgIXN0LmlzT2soKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IHN0LndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgICAgYnJlYWs7CisgICAgfQogICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzKFZlcmlmeU5hbWUoaW5fc2VydmljZSwgaW5fbmFtZSwgJl9haWRsX3JldHVybikpOwogICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewpAQCAtMjg2MCw2ICszNTM0LDIwMSBAQAogICAgIH0KICAgfQogICBicmVhazsKKyAgY2FzZSBCblRlc3RTZXJ2aWNlOjpUUkFOU0FDVElPTl9HZXRJbnRlcmZhY2VBcnJheToKKyAgeworICAgIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpTdHJpbmcxNj4gaW5fbmFtZXM7CisgICAgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPj4gX2FpZGxfcmV0dXJuOworICAgIGlmICghKF9haWRsX2RhdGEuY2hlY2tJbnRlcmZhY2UodGhpcykpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpCQURfVFlQRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS5yZWFkU3RyaW5nMTZWZWN0b3IoJmluX25hbWVzKTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGF1dG8gc3QgPSBfYWlkbF9kYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOyAhc3QuaXNPaygpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gc3Qud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXMoR2V0SW50ZXJmYWNlQXJyYXkoaW5fbmFtZXMsICZfYWlkbF9yZXR1cm4pKTsKKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoIV9haWRsX3N0YXR1cy5pc09rKCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHktPndyaXRlU3Ryb25nQmluZGVyVmVjdG9yKF9haWRsX3JldHVybik7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGJyZWFrOworICBjYXNlIEJuVGVzdFNlcnZpY2U6OlRSQU5TQUNUSU9OX1ZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUFycmF5OgorICB7CisgICAgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPj4gaW5fc2VydmljZXM7CisgICAgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OlN0cmluZzE2PiBpbl9uYW1lczsKKyAgICBib29sIF9haWRsX3JldHVybjsKKyAgICBpZiAoIShfYWlkbF9kYXRhLmNoZWNrSW50ZXJmYWNlKHRoaXMpKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6QkFEX1RZUEU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEucmVhZFN0cm9uZ0JpbmRlclZlY3RvcigmaW5fc2VydmljZXMpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS5yZWFkU3RyaW5nMTZWZWN0b3IoJmluX25hbWVzKTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGF1dG8gc3QgPSBfYWlkbF9kYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOyAhc3QuaXNPaygpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gc3Qud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXMoVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlQXJyYXkoaW5fc2VydmljZXMsIGluX25hbWVzLCAmX2FpZGxfcmV0dXJuKSk7CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKCFfYWlkbF9zdGF0dXMuaXNPaygpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LT53cml0ZUJvb2woX2FpZGxfcmV0dXJuKTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgYnJlYWs7CisgIGNhc2UgQm5UZXN0U2VydmljZTo6VFJBTlNBQ1RJT05fR2V0TnVsbGFibGVJbnRlcmZhY2VBcnJheToKKyAgeworICAgIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OlN0cmluZzE2Pj4+IGluX25hbWVzOworICAgIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+Pj4gX2FpZGxfcmV0dXJuOworICAgIGlmICghKF9haWRsX2RhdGEuY2hlY2tJbnRlcmZhY2UodGhpcykpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpCQURfVFlQRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS5yZWFkU3RyaW5nMTZWZWN0b3IoJmluX25hbWVzKTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGF1dG8gc3QgPSBfYWlkbF9kYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOyAhc3QuaXNPaygpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gc3Qud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXMoR2V0TnVsbGFibGVJbnRlcmZhY2VBcnJheShpbl9uYW1lcywgJl9haWRsX3JldHVybikpOworICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICghX2FpZGxfc3RhdHVzLmlzT2soKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS0+d3JpdGVTdHJvbmdCaW5kZXJWZWN0b3IoX2FpZGxfcmV0dXJuKTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgYnJlYWs7CisgIGNhc2UgQm5UZXN0U2VydmljZTo6VFJBTlNBQ1RJT05fVmVyaWZ5TmFtZXNXaXRoTnVsbGFibGVJbnRlcmZhY2VBcnJheToKKyAgeworICAgIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+Pj4gaW5fc2VydmljZXM7CisgICAgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6U3RyaW5nMTY+Pj4gaW5fbmFtZXM7CisgICAgYm9vbCBfYWlkbF9yZXR1cm47CisgICAgaWYgKCEoX2FpZGxfZGF0YS5jaGVja0ludGVyZmFjZSh0aGlzKSkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6OkJBRF9UWVBFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLnJlYWRTdHJvbmdCaW5kZXJWZWN0b3IoJmluX3NlcnZpY2VzKTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEucmVhZFN0cmluZzE2VmVjdG9yKCZpbl9uYW1lcyk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChhdXRvIHN0ID0gX2FpZGxfZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsgIXN0LmlzT2soKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IHN0LndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzKFZlcmlmeU5hbWVzV2l0aE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoaW5fc2VydmljZXMsIGluX25hbWVzLCAmX2FpZGxfcmV0dXJuKSk7CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKCFfYWlkbF9zdGF0dXMuaXNPaygpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LT53cml0ZUJvb2woX2FpZGxfcmV0dXJuKTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgYnJlYWs7CisgIGNhc2UgQm5UZXN0U2VydmljZTo6VFJBTlNBQ1RJT05fR2V0SW50ZXJmYWNlTGlzdDoKKyAgeworICAgIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OlN0cmluZzE2Pj4+IGluX25hbWVzOworICAgIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+Pj4gX2FpZGxfcmV0dXJuOworICAgIGlmICghKF9haWRsX2RhdGEuY2hlY2tJbnRlcmZhY2UodGhpcykpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpCQURfVFlQRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS5yZWFkU3RyaW5nMTZWZWN0b3IoJmluX25hbWVzKTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGF1dG8gc3QgPSBfYWlkbF9kYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOyAhc3QuaXNPaygpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gc3Qud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXMoR2V0SW50ZXJmYWNlTGlzdChpbl9uYW1lcywgJl9haWRsX3JldHVybikpOworICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICghX2FpZGxfc3RhdHVzLmlzT2soKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS0+d3JpdGVTdHJvbmdCaW5kZXJWZWN0b3IoX2FpZGxfcmV0dXJuKTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgYnJlYWs7CisgIGNhc2UgQm5UZXN0U2VydmljZTo6VFJBTlNBQ1RJT05fVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlTGlzdDoKKyAgeworICAgIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+Pj4gaW5fc2VydmljZXM7CisgICAgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6U3RyaW5nMTY+Pj4gaW5fbmFtZXM7CisgICAgYm9vbCBfYWlkbF9yZXR1cm47CisgICAgaWYgKCEoX2FpZGxfZGF0YS5jaGVja0ludGVyZmFjZSh0aGlzKSkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6OkJBRF9UWVBFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLnJlYWRTdHJvbmdCaW5kZXJWZWN0b3IoJmluX3NlcnZpY2VzKTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEucmVhZFN0cmluZzE2VmVjdG9yKCZpbl9uYW1lcyk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChhdXRvIHN0ID0gX2FpZGxfZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsgIXN0LmlzT2soKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IHN0LndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzKFZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUxpc3QoaW5fc2VydmljZXMsIGluX25hbWVzLCAmX2FpZGxfcmV0dXJuKSk7CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKCFfYWlkbF9zdGF0dXMuaXNPaygpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LT53cml0ZUJvb2woX2FpZGxfcmV0dXJuKTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgYnJlYWs7CiAgIGNhc2UgQm5UZXN0U2VydmljZTo6VFJBTlNBQ1RJT05fUmV2ZXJzZVN0cmluZ0xpc3Q6CiAgIHsKICAgICA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6U3RyaW5nMTY+IGluX2lucHV0OwpAQCAtMjg3Myw2ICszNzQyLDEwIEBACiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewogICAgICAgYnJlYWs7CiAgICAgfQorICAgIGlmIChhdXRvIHN0ID0gX2FpZGxfZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsgIXN0LmlzT2soKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IHN0LndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgICAgYnJlYWs7CisgICAgfQogICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzKFJldmVyc2VTdHJpbmdMaXN0KGluX2lucHV0LCAmb3V0X3JlcGVhdGVkLCAmX2FpZGxfcmV0dXJuKSk7CiAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CkBAIC0yOTAzLDYgKzM3NzYsMTAgQEAKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CiAgICAgICBicmVhazsKICAgICB9CisgICAgaWYgKGF1dG8gc3QgPSBfYWlkbF9kYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOyAhc3QuaXNPaygpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gc3Qud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgICBicmVhazsKKyAgICB9CiAgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXMoUmVwZWF0UGFyY2VsRmlsZURlc2NyaXB0b3IoaW5fcmVhZCwgJl9haWRsX3JldHVybikpOwogICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewpAQCAtMjkzNCw2ICszODExLDEwIEBACiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewogICAgICAgYnJlYWs7CiAgICAgfQorICAgIGlmIChhdXRvIHN0ID0gX2FpZGxfZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsgIXN0LmlzT2soKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IHN0LndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgICAgYnJlYWs7CisgICAgfQogICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzKFJldmVyc2VQYXJjZWxGaWxlRGVzY3JpcHRvckFycmF5KGluX2lucHV0LCAmb3V0X3JlcGVhdGVkLCAmX2FpZGxfcmV0dXJuKSk7CiAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CkBAIC0yOTYzLDYgKzM4NDQsMTAgQEAKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CiAgICAgICBicmVhazsKICAgICB9CisgICAgaWYgKGF1dG8gc3QgPSBfYWlkbF9kYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOyAhc3QuaXNPaygpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gc3Qud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgICBicmVhazsKKyAgICB9CiAgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXMoVGhyb3dTZXJ2aWNlRXhjZXB0aW9uKGluX2NvZGUpKTsKICAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOwogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKQEAgLTI5ODUsNiArMzg3MCwxMCBAQAogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKICAgICAgIGJyZWFrOwogICAgIH0KKyAgICBpZiAoYXV0byBzdCA9IF9haWRsX2RhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7ICFzdC5pc09rKCkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBzdC53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICAgIGJyZWFrOworICAgIH0KICAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1cyhSZXBlYXROdWxsYWJsZUludEFycmF5KGluX2lucHV0LCAmX2FpZGxfcmV0dXJuKSk7CiAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CkBAIC0zMDExLDYgKzM5MDAsMTAgQEAKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CiAgICAgICBicmVhazsKICAgICB9CisgICAgaWYgKGF1dG8gc3QgPSBfYWlkbF9kYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOyAhc3QuaXNPaygpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gc3Qud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgICBicmVhazsKKyAgICB9CiAgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXMoUmVwZWF0TnVsbGFibGVCeXRlRW51bUFycmF5KGluX2lucHV0LCAmX2FpZGxfcmV0dXJuKSk7CiAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CkBAIC0zMDM3LDYgKzM5MzAsMTAgQEAKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CiAgICAgICBicmVhazsKICAgICB9CisgICAgaWYgKGF1dG8gc3QgPSBfYWlkbF9kYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOyAhc3QuaXNPaygpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gc3Qud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgICBicmVhazsKKyAgICB9CiAgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXMoUmVwZWF0TnVsbGFibGVJbnRFbnVtQXJyYXkoaW5faW5wdXQsICZfYWlkbF9yZXR1cm4pKTsKICAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOwogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKQEAgLTMwNjMsNiArMzk2MCwxMCBAQAogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKICAgICAgIGJyZWFrOwogICAgIH0KKyAgICBpZiAoYXV0byBzdCA9IF9haWRsX2RhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7ICFzdC5pc09rKCkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBzdC53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICAgIGJyZWFrOworICAgIH0KICAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1cyhSZXBlYXROdWxsYWJsZUxvbmdFbnVtQXJyYXkoaW5faW5wdXQsICZfYWlkbF9yZXR1cm4pKTsKICAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOwogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKQEAgLTMwODksNiArMzk5MCwxMCBAQAogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKICAgICAgIGJyZWFrOwogICAgIH0KKyAgICBpZiAoYXV0byBzdCA9IF9haWRsX2RhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7ICFzdC5pc09rKCkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBzdC53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICAgIGJyZWFrOworICAgIH0KICAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1cyhSZXBlYXROdWxsYWJsZVN0cmluZyhpbl9pbnB1dCwgJl9haWRsX3JldHVybikpOwogICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewpAQCAtMzExNSw2ICs0MDIwLDEwIEBACiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewogICAgICAgYnJlYWs7CiAgICAgfQorICAgIGlmIChhdXRvIHN0ID0gX2FpZGxfZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsgIXN0LmlzT2soKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IHN0LndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgICAgYnJlYWs7CisgICAgfQogICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzKFJlcGVhdE51bGxhYmxlU3RyaW5nTGlzdChpbl9pbnB1dCwgJl9haWRsX3JldHVybikpOwogICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewpAQCAtMzEzMSw4ICs0MDQwLDggQEAKICAgYnJlYWs7CiAgIGNhc2UgQm5UZXN0U2VydmljZTo6VFJBTlNBQ1RJT05fUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlOgogICB7Ci0gICAgOjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlN0cnVjdHVyZWRQYXJjZWxhYmxlPiBpbl9pbnB1dDsKLSAgICA6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6U3RydWN0dXJlZFBhcmNlbGFibGU+IF9haWRsX3JldHVybjsKKyAgICA6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eT4gaW5faW5wdXQ7CisgICAgOjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6RW1wdHk+IF9haWRsX3JldHVybjsKICAgICBpZiAoIShfYWlkbF9kYXRhLmNoZWNrSW50ZXJmYWNlKHRoaXMpKSkgewogICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6QkFEX1RZUEU7CiAgICAgICBicmVhazsKQEAgLTMxNDEsNiArNDA1MCwxMCBAQAogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKICAgICAgIGJyZWFrOwogICAgIH0KKyAgICBpZiAoYXV0byBzdCA9IF9haWRsX2RhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7ICFzdC5pc09rKCkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBzdC53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICAgIGJyZWFrOworICAgIH0KICAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1cyhSZXBlYXROdWxsYWJsZVBhcmNlbGFibGUoaW5faW5wdXQsICZfYWlkbF9yZXR1cm4pKTsKICAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOwogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKQEAgLTMxNTUsNiArNDA2OCw2NiBAQAogICAgIH0KICAgfQogICBicmVhazsKKyAgY2FzZSBCblRlc3RTZXJ2aWNlOjpUUkFOU0FDVElPTl9SZXBlYXROdWxsYWJsZVBhcmNlbGFibGVBcnJheToKKyAgeworICAgIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5Pj4+IGluX2lucHV0OworICAgIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5Pj4+IF9haWRsX3JldHVybjsKKyAgICBpZiAoIShfYWlkbF9kYXRhLmNoZWNrSW50ZXJmYWNlKHRoaXMpKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6QkFEX1RZUEU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEucmVhZFBhcmNlbGFibGVWZWN0b3IoJmluX2lucHV0KTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGF1dG8gc3QgPSBfYWlkbF9kYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOyAhc3QuaXNPaygpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gc3Qud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXMoUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlQXJyYXkoaW5faW5wdXQsICZfYWlkbF9yZXR1cm4pKTsKKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoIV9haWRsX3N0YXR1cy5pc09rKCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHktPndyaXRlUGFyY2VsYWJsZVZlY3RvcihfYWlkbF9yZXR1cm4pOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBicmVhazsKKyAgY2FzZSBCblRlc3RTZXJ2aWNlOjpUUkFOU0FDVElPTl9SZXBlYXROdWxsYWJsZVBhcmNlbGFibGVMaXN0OgorICB7CisgICAgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6RW1wdHk+Pj4gaW5faW5wdXQ7CisgICAgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6RW1wdHk+Pj4gX2FpZGxfcmV0dXJuOworICAgIGlmICghKF9haWRsX2RhdGEuY2hlY2tJbnRlcmZhY2UodGhpcykpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpCQURfVFlQRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS5yZWFkUGFyY2VsYWJsZVZlY3RvcigmaW5faW5wdXQpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoYXV0byBzdCA9IF9haWRsX2RhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7ICFzdC5pc09rKCkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBzdC53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1cyhSZXBlYXROdWxsYWJsZVBhcmNlbGFibGVMaXN0KGluX2lucHV0LCAmX2FpZGxfcmV0dXJuKSk7CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKCFfYWlkbF9zdGF0dXMuaXNPaygpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LT53cml0ZVBhcmNlbGFibGVWZWN0b3IoX2FpZGxfcmV0dXJuKTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgYnJlYWs7CiAgIGNhc2UgQm5UZXN0U2VydmljZTo6VFJBTlNBQ1RJT05fVGFrZXNBbklCaW5kZXI6CiAgIHsKICAgICA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4gaW5faW5wdXQ7CkBAIC0zMTY2LDYgKzQxMzksMTAgQEAKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CiAgICAgICBicmVhazsKICAgICB9CisgICAgaWYgKGF1dG8gc3QgPSBfYWlkbF9kYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOyAhc3QuaXNPaygpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gc3Qud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgICBicmVhazsKKyAgICB9CiAgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXMoVGFrZXNBbklCaW5kZXIoaW5faW5wdXQpKTsKICAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOwogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKQEAgLTMxODcsNiArNDE2NCwxMCBAQAogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKICAgICAgIGJyZWFrOwogICAgIH0KKyAgICBpZiAoYXV0byBzdCA9IF9haWRsX2RhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7ICFzdC5pc09rKCkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBzdC53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICAgIGJyZWFrOworICAgIH0KICAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1cyhUYWtlc0FOdWxsYWJsZUlCaW5kZXIoaW5faW5wdXQpKTsKICAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOwogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKQEAgLTMxOTcsNiArNDE3OCw1NiBAQAogICAgIH0KICAgfQogICBicmVhazsKKyAgY2FzZSBCblRlc3RTZXJ2aWNlOjpUUkFOU0FDVElPTl9UYWtlc0FuSUJpbmRlckxpc3Q6CisgIHsKKyAgICA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPj4gaW5faW5wdXQ7CisgICAgaWYgKCEoX2FpZGxfZGF0YS5jaGVja0ludGVyZmFjZSh0aGlzKSkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6OkJBRF9UWVBFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLnJlYWRTdHJvbmdCaW5kZXJWZWN0b3IoJmluX2lucHV0KTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGF1dG8gc3QgPSBfYWlkbF9kYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOyAhc3QuaXNPaygpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gc3Qud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXMoVGFrZXNBbklCaW5kZXJMaXN0KGluX2lucHV0KSk7CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKCFfYWlkbF9zdGF0dXMuaXNPaygpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgYnJlYWs7CisgIGNhc2UgQm5UZXN0U2VydmljZTo6VFJBTlNBQ1RJT05fVGFrZXNBTnVsbGFibGVJQmluZGVyTGlzdDoKKyAgeworICAgIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPj4+IGluX2lucHV0OworICAgIGlmICghKF9haWRsX2RhdGEuY2hlY2tJbnRlcmZhY2UodGhpcykpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpCQURfVFlQRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS5yZWFkU3Ryb25nQmluZGVyVmVjdG9yKCZpbl9pbnB1dCk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChhdXRvIHN0ID0gX2FpZGxfZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsgIXN0LmlzT2soKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IHN0LndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzKFRha2VzQU51bGxhYmxlSUJpbmRlckxpc3QoaW5faW5wdXQpKTsKKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoIV9haWRsX3N0YXR1cy5pc09rKCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBicmVhazsKICAgY2FzZSBCblRlc3RTZXJ2aWNlOjpUUkFOU0FDVElPTl9SZXBlYXRVdGY4Q3BwU3RyaW5nOgogICB7CiAgICAgOjpzdGQ6OnN0cmluZyBpbl90b2tlbjsKQEAgLTMyMDksNiArNDI0MCwxMCBAQAogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKICAgICAgIGJyZWFrOwogICAgIH0KKyAgICBpZiAoYXV0byBzdCA9IF9haWRsX2RhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7ICFzdC5pc09rKCkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBzdC53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICAgIGJyZWFrOworICAgIH0KICAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1cyhSZXBlYXRVdGY4Q3BwU3RyaW5nKGluX3Rva2VuLCAmX2FpZGxfcmV0dXJuKSk7CiAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CkBAIC0zMjM1LDYgKzQyNzAsMTAgQEAKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CiAgICAgICBicmVhazsKICAgICB9CisgICAgaWYgKGF1dG8gc3QgPSBfYWlkbF9kYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOyAhc3QuaXNPaygpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gc3Qud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgICBicmVhazsKKyAgICB9CiAgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXMoUmVwZWF0TnVsbGFibGVVdGY4Q3BwU3RyaW5nKGluX3Rva2VuLCAmX2FpZGxfcmV0dXJuKSk7CiAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CkBAIC0zMjY2LDYgKzQzMDUsMTAgQEAKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CiAgICAgICBicmVhazsKICAgICB9CisgICAgaWYgKGF1dG8gc3QgPSBfYWlkbF9kYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOyAhc3QuaXNPaygpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gc3Qud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgICBicmVhazsKKyAgICB9CiAgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXMoUmV2ZXJzZVV0ZjhDcHBTdHJpbmcoaW5faW5wdXQsICZvdXRfcmVwZWF0ZWQsICZfYWlkbF9yZXR1cm4pKTsKICAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOwogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKQEAgLTMzMDEsNiArNDM0NCwxMCBAQAogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKICAgICAgIGJyZWFrOwogICAgIH0KKyAgICBpZiAoYXV0byBzdCA9IF9haWRsX2RhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7ICFzdC5pc09rKCkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBzdC53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICAgIGJyZWFrOworICAgIH0KICAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1cyhSZXZlcnNlTnVsbGFibGVVdGY4Q3BwU3RyaW5nKGluX2lucHV0LCAmb3V0X3JlcGVhdGVkLCAmX2FpZGxfcmV0dXJuKSk7CiAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CkBAIC0zMzMyLDYgKzQzNzksMTAgQEAKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CiAgICAgICBicmVhazsKICAgICB9CisgICAgaWYgKGF1dG8gc3QgPSBfYWlkbF9kYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOyAhc3QuaXNPaygpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gc3Qud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgICBicmVhazsKKyAgICB9CiAgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXMoUmV2ZXJzZVV0ZjhDcHBTdHJpbmdMaXN0KGluX2lucHV0LCAmb3V0X3JlcGVhdGVkLCAmX2FpZGxfcmV0dXJuKSk7CiAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CkBAIC0zMzYyLDYgKzQ0MTMsMTAgQEAKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CiAgICAgICBicmVhazsKICAgICB9CisgICAgaWYgKGF1dG8gc3QgPSBfYWlkbF9kYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOyAhc3QuaXNPaygpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gc3Qud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgICBicmVhazsKKyAgICB9CiAgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXMoR2V0Q2FsbGJhY2soaW5fcmV0dXJuX251bGwsICZfYWlkbF9yZXR1cm4pKTsKICAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOwogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKQEAgLTMzNzAsNyArNDQyNSw3IEBACiAgICAgaWYgKCFfYWlkbF9zdGF0dXMuaXNPaygpKSB7CiAgICAgICBicmVhazsKICAgICB9Ci0gICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcig6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjazo6YXNCaW5kZXIoX2FpZGxfcmV0dXJuKSk7CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihfYWlkbF9yZXR1cm4pOwogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKICAgICAgIGJyZWFrOwogICAgIH0KQEAgLTMzODcsNiArNDQ0MiwxMCBAQAogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKICAgICAgIGJyZWFrOwogICAgIH0KKyAgICBpZiAoYXV0byBzdCA9IF9haWRsX2RhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7ICFzdC5pc09rKCkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBzdC53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICAgIGJyZWFrOworICAgIH0KICAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1cyhGaWxsT3V0U3RydWN0dXJlZFBhcmNlbGFibGUoJmluX3BhcmNlbCkpOwogICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewpAQCAtMzQwMSw2ICs0NDYwLDE0NCBAQAogICAgIH0KICAgfQogICBicmVhazsKKyAgY2FzZSBCblRlc3RTZXJ2aWNlOjpUUkFOU0FDVElPTl9SZXBlYXRFeHRlbmRhYmxlUGFyY2VsYWJsZToKKyAgeworICAgIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OmV4dGVuc2lvbjo6RXh0ZW5kYWJsZVBhcmNlbGFibGUgaW5fZXA7CisgICAgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6ZXh0ZW5zaW9uOjpFeHRlbmRhYmxlUGFyY2VsYWJsZSBvdXRfZXAyOworICAgIGlmICghKF9haWRsX2RhdGEuY2hlY2tJbnRlcmZhY2UodGhpcykpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpCQURfVFlQRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS5yZWFkUGFyY2VsYWJsZSgmaW5fZXApOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoYXV0byBzdCA9IF9haWRsX2RhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7ICFzdC5pc09rKCkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBzdC53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1cyhSZXBlYXRFeHRlbmRhYmxlUGFyY2VsYWJsZShpbl9lcCwgJm91dF9lcDIpKTsKKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoIV9haWRsX3N0YXR1cy5pc09rKCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHktPndyaXRlUGFyY2VsYWJsZShvdXRfZXAyKTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgYnJlYWs7CisgIGNhc2UgQm5UZXN0U2VydmljZTo6VFJBTlNBQ1RJT05fUmV2ZXJzZUxpc3Q6CisgIHsKKyAgICA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpSZWN1cnNpdmVMaXN0IGluX2xpc3Q7CisgICAgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6UmVjdXJzaXZlTGlzdCBfYWlkbF9yZXR1cm47CisgICAgaWYgKCEoX2FpZGxfZGF0YS5jaGVja0ludGVyZmFjZSh0aGlzKSkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6OkJBRF9UWVBFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLnJlYWRQYXJjZWxhYmxlKCZpbl9saXN0KTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGF1dG8gc3QgPSBfYWlkbF9kYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOyAhc3QuaXNPaygpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gc3Qud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXMoUmV2ZXJzZUxpc3QoaW5fbGlzdCwgJl9haWRsX3JldHVybikpOworICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICghX2FpZGxfc3RhdHVzLmlzT2soKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS0+d3JpdGVQYXJjZWxhYmxlKF9haWRsX3JldHVybik7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGJyZWFrOworICBjYXNlIEJuVGVzdFNlcnZpY2U6OlRSQU5TQUNUSU9OX1JldmVyc2VJQmluZGVyQXJyYXk6CisgIHsKKyAgICA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPj4gaW5faW5wdXQ7CisgICAgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4+IG91dF9yZXBlYXRlZDsKKyAgICA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPj4gX2FpZGxfcmV0dXJuOworICAgIGlmICghKF9haWRsX2RhdGEuY2hlY2tJbnRlcmZhY2UodGhpcykpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpCQURfVFlQRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS5yZWFkU3Ryb25nQmluZGVyVmVjdG9yKCZpbl9pbnB1dCk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLnJlc2l6ZU91dFZlY3Rvcigmb3V0X3JlcGVhdGVkKTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGF1dG8gc3QgPSBfYWlkbF9kYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOyAhc3QuaXNPaygpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gc3Qud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXMoUmV2ZXJzZUlCaW5kZXJBcnJheShpbl9pbnB1dCwgJm91dF9yZXBlYXRlZCwgJl9haWRsX3JldHVybikpOworICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICghX2FpZGxfc3RhdHVzLmlzT2soKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS0+d3JpdGVTdHJvbmdCaW5kZXJWZWN0b3IoX2FpZGxfcmV0dXJuKTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LT53cml0ZVN0cm9uZ0JpbmRlclZlY3RvcihvdXRfcmVwZWF0ZWQpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBicmVhazsKKyAgY2FzZSBCblRlc3RTZXJ2aWNlOjpUUkFOU0FDVElPTl9SZXZlcnNlTnVsbGFibGVJQmluZGVyQXJyYXk6CisgIHsKKyAgICA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4+PiBpbl9pbnB1dDsKKyAgICA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4+PiBvdXRfcmVwZWF0ZWQ7CisgICAgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+Pj4gX2FpZGxfcmV0dXJuOworICAgIGlmICghKF9haWRsX2RhdGEuY2hlY2tJbnRlcmZhY2UodGhpcykpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpCQURfVFlQRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS5yZWFkU3Ryb25nQmluZGVyVmVjdG9yKCZpbl9pbnB1dCk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLnJlc2l6ZU91dFZlY3Rvcigmb3V0X3JlcGVhdGVkKTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGF1dG8gc3QgPSBfYWlkbF9kYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOyAhc3QuaXNPaygpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gc3Qud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXMoUmV2ZXJzZU51bGxhYmxlSUJpbmRlckFycmF5KGluX2lucHV0LCAmb3V0X3JlcGVhdGVkLCAmX2FpZGxfcmV0dXJuKSk7CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKCFfYWlkbF9zdGF0dXMuaXNPaygpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LT53cml0ZVN0cm9uZ0JpbmRlclZlY3RvcihfYWlkbF9yZXR1cm4pOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHktPndyaXRlU3Ryb25nQmluZGVyVmVjdG9yKG91dF9yZXBlYXRlZCk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGJyZWFrOwogICBjYXNlIEJuVGVzdFNlcnZpY2U6OlRSQU5TQUNUSU9OX0dldE9sZE5hbWVJbnRlcmZhY2U6CiAgIHsKICAgICA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklPbGROYW1lPiBfYWlkbF9yZXR1cm47CkBAIC0zNDE2LDcgKzQ2MTMsNyBAQAogICAgIGlmICghX2FpZGxfc3RhdHVzLmlzT2soKSkgewogICAgICAgYnJlYWs7CiAgICAgfQotICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU9sZE5hbWU6OmFzQmluZGVyKF9haWRsX3JldHVybikpOworICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoX2FpZGxfcmV0dXJuKTsKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CiAgICAgICBicmVhazsKICAgICB9CkBAIC0zNDM3LDcgKzQ2MzQsMzcgQEAKICAgICBpZiAoIV9haWRsX3N0YXR1cy5pc09rKCkpIHsKICAgICAgIGJyZWFrOwogICAgIH0KLSAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOZXdOYW1lOjphc0JpbmRlcihfYWlkbF9yZXR1cm4pKTsKKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKF9haWRsX3JldHVybik7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGJyZWFrOworICBjYXNlIEJuVGVzdFNlcnZpY2U6OlRSQU5TQUNUSU9OX0dldFVuaW9uVGFnczoKKyAgeworICAgIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6VW5pb24+IGluX2lucHV0OworICAgIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6VW5pb246OlRhZz4gX2FpZGxfcmV0dXJuOworICAgIGlmICghKF9haWRsX2RhdGEuY2hlY2tJbnRlcmZhY2UodGhpcykpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpCQURfVFlQRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS5yZWFkUGFyY2VsYWJsZVZlY3RvcigmaW5faW5wdXQpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoYXV0byBzdCA9IF9haWRsX2RhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7ICFzdC5pc09rKCkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBzdC53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1cyhHZXRVbmlvblRhZ3MoaW5faW5wdXQsICZfYWlkbF9yZXR1cm4pKTsKKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoIV9haWRsX3N0YXR1cy5pc09rKCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHktPndyaXRlRW51bVZlY3RvcihfYWlkbF9yZXR1cm4pOwogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKICAgICAgIGJyZWFrOwogICAgIH0KQEAgLTM0OTIsNyArNDcxOSw3IEBACiAgIGJyZWFrOwogICB9CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzID09IDo6YW5kcm9pZDo6VU5FWFBFQ1RFRF9OVUxMKSB7Ci0gICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21FeGNlcHRpb25Db2RlKDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OkVYX05VTExfUE9JTlRFUikud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21FeGNlcHRpb25Db2RlKDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OkVYX05VTExfUE9JTlRFUikud3JpdGVPdmVyUGFyY2VsKF9haWRsX3JlcGx5KTsKICAgfQogICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKIH0KQEAgLTM1MDAsNyArNDcyNywyODUgQEAKICNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKIAogfSAgLy8gbmFtZXNwYWNlIHRlc3RzCi0KIH0gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9JVGVzdFNlcnZpY2UuaD4KIAorbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKKzo6YW5kcm9pZDo6c3RhdHVzX3QgSVRlc3RTZXJ2aWNlOjpFbXB0eTo6cmVhZEZyb21QYXJjZWwoY29uc3QgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgeworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICBzaXplX3QgX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKKyAgaW50MzJfdCBfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplID0gMDsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEludDMyKCZfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplIDwgNCkgcmV0dXJuIDo6YW5kcm9pZDo6QkFEX1ZBTFVFOworICBzaXplX3QgX2FpZGxfcGFyY2VsYWJsZV9zaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplKTsKKyAgaWYgKF9haWRsX3N0YXJ0X3BvcyA+IFNJWkVfTUFYIC0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm4gOjphbmRyb2lkOjpCQURfVkFMVUU7CisgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorOjphbmRyb2lkOjpzdGF0dXNfdCBJVGVzdFNlcnZpY2U6OkVtcHR5Ojp3cml0ZVRvUGFyY2VsKDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IHsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpPSzsKKyAgYXV0byBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBfYWlkbF9wYXJjZWwtPndyaXRlSW50MzIoMCk7CisgIGF1dG8gX2FpZGxfZW5kX3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3Bvcyk7CisgIF9haWRsX3BhcmNlbC0+d3JpdGVJbnQzMihfYWlkbF9lbmRfcG9zIC0gX2FpZGxfc3RhcnRfcG9zKTsKKyAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfZW5kX3Bvcyk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvSVRlc3RTZXJ2aWNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7Cis6OmFuZHJvaWQ6OnN0YXR1c190IElUZXN0U2VydmljZTo6Q29tcGlsZXJDaGVja3M6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIHsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpPSzsKKyAgc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgIGludDMyX3QgX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSA9IDA7CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRJbnQzMigmX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSA8IDQpIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgc2l6ZV90IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4oX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSk7CisgIGlmIChfYWlkbF9zdGFydF9wb3MgPiBTSVpFX01BWCAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuIDo6YW5kcm9pZDo6QkFEX1ZBTFVFOworICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRTdHJvbmdCaW5kZXIoJmJpbmRlcik7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWROdWxsYWJsZVN0cm9uZ0JpbmRlcigmbnVsbGFibGVfYmluZGVyKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZFN0cm9uZ0JpbmRlclZlY3RvcigmYmluZGVyX2FycmF5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZFN0cm9uZ0JpbmRlclZlY3RvcigmbnVsbGFibGVfYmluZGVyX2FycmF5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZFN0cm9uZ0JpbmRlclZlY3RvcigmYmluZGVyX2xpc3QpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkU3Ryb25nQmluZGVyVmVjdG9yKCZudWxsYWJsZV9iaW5kZXJfbGlzdCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRQYXJjZWxhYmxlKCZwZmQpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkUGFyY2VsYWJsZSgmbnVsbGFibGVfcGZkKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZFBhcmNlbGFibGVWZWN0b3IoJnBmZF9hcnJheSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRQYXJjZWxhYmxlVmVjdG9yKCZudWxsYWJsZV9wZmRfYXJyYXkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkUGFyY2VsYWJsZVZlY3RvcigmcGZkX2xpc3QpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkUGFyY2VsYWJsZVZlY3RvcigmbnVsbGFibGVfcGZkX2xpc3QpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkUGFyY2VsYWJsZSgmcGFyY2VsKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZFBhcmNlbGFibGUoJm51bGxhYmxlX3BhcmNlbCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRQYXJjZWxhYmxlVmVjdG9yKCZwYXJjZWxfYXJyYXkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkUGFyY2VsYWJsZVZlY3RvcigmbnVsbGFibGVfcGFyY2VsX2FycmF5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZFBhcmNlbGFibGVWZWN0b3IoJnBhcmNlbF9saXN0KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZFBhcmNlbGFibGVWZWN0b3IoJm51bGxhYmxlX3BhcmNlbF9saXN0KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorOjphbmRyb2lkOjpzdGF0dXNfdCBJVGVzdFNlcnZpY2U6OkNvbXBpbGVyQ2hlY2tzOjp3cml0ZVRvUGFyY2VsKDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IHsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpPSzsKKyAgYXV0byBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBfYWlkbF9wYXJjZWwtPndyaXRlSW50MzIoMCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlU3Ryb25nQmluZGVyKGJpbmRlcik7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZVN0cm9uZ0JpbmRlcihudWxsYWJsZV9iaW5kZXIpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVTdHJvbmdCaW5kZXJWZWN0b3IoYmluZGVyX2FycmF5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlU3Ryb25nQmluZGVyVmVjdG9yKG51bGxhYmxlX2JpbmRlcl9hcnJheSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZVN0cm9uZ0JpbmRlclZlY3RvcihiaW5kZXJfbGlzdCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZVN0cm9uZ0JpbmRlclZlY3RvcihudWxsYWJsZV9iaW5kZXJfbGlzdCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZVBhcmNlbGFibGUocGZkKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlTnVsbGFibGVQYXJjZWxhYmxlKG51bGxhYmxlX3BmZCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZVBhcmNlbGFibGVWZWN0b3IocGZkX2FycmF5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlUGFyY2VsYWJsZVZlY3RvcihudWxsYWJsZV9wZmRfYXJyYXkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVQYXJjZWxhYmxlVmVjdG9yKHBmZF9saXN0KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlUGFyY2VsYWJsZVZlY3RvcihudWxsYWJsZV9wZmRfbGlzdCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZVBhcmNlbGFibGUocGFyY2VsKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlTnVsbGFibGVQYXJjZWxhYmxlKG51bGxhYmxlX3BhcmNlbCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZVBhcmNlbGFibGVWZWN0b3IocGFyY2VsX2FycmF5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlUGFyY2VsYWJsZVZlY3RvcihudWxsYWJsZV9wYXJjZWxfYXJyYXkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVQYXJjZWxhYmxlVmVjdG9yKHBhcmNlbF9saXN0KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlUGFyY2VsYWJsZVZlY3RvcihudWxsYWJsZV9wYXJjZWxfbGlzdCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBhdXRvIF9haWRsX2VuZF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MpOworICBfYWlkbF9wYXJjZWwtPndyaXRlSW50MzIoX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX2VuZF9wb3MpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lUZXN0U2VydmljZS5jcHAuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSVRlc3RTZXJ2aWNlLmNwcC5kCmluZGV4IGE4OGQ3YjMuLmRlNjYyMDIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSVRlc3RTZXJ2aWNlLmNwcC5kCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSVRlc3RTZXJ2aWNlLmNwcC5kCkBAIC03LDQgKzcsOCBAQAogICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvSU9sZE5hbWUuYWlkbCBcCiAgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9JbnRFbnVtLmFpZGwgXAogICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvTG9uZ0VudW0uYWlkbCBcCi0gIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5haWRsCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9SZWN1cnNpdmVMaXN0LmFpZGwgXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvU3RydWN0dXJlZFBhcmNlbGFibGUuYWlkbCBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9Vbmlvbi5haWRsIFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9FeHRlbmRhYmxlUGFyY2VsYWJsZS5haWRsIFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0NvbnN0YW50RXhwcmVzc2lvbkVudW0uYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9MaXN0T2ZJbnRlcmZhY2VzLmNwcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvTGlzdE9mSW50ZXJmYWNlcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZjYTY0MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvTGlzdE9mSW50ZXJmYWNlcy5jcHAKQEAgLTAsMCArMSw0MzcgQEAKKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvTGlzdE9mSW50ZXJmYWNlcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworOjphbmRyb2lkOjpzdGF0dXNfdCBMaXN0T2ZJbnRlcmZhY2VzOjpyZWFkRnJvbVBhcmNlbChjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSB7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIHNpemVfdCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPSAwOworICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkSW50MzIoJl9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPCA0KSByZXR1cm4gOjphbmRyb2lkOjpCQURfVkFMVUU7CisgIHNpemVfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUpOworICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gU0laRV9NQVggLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9Cis6OmFuZHJvaWQ6OnN0YXR1c190IExpc3RPZkludGVyZmFjZXM6OndyaXRlVG9QYXJjZWwoOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgeworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICBhdXRvIF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgIF9haWRsX3BhcmNlbC0+d3JpdGVJbnQzMigwKTsKKyAgYXV0byBfYWlkbF9lbmRfcG9zID0gX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKKyAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zKTsKKyAgX2FpZGxfcGFyY2VsLT53cml0ZUludDMyKF9haWRsX2VuZF9wb3MgLSBfYWlkbF9zdGFydF9wb3MpOworICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9lbmRfcG9zKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9Cit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9MaXN0T2ZJbnRlcmZhY2VzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL0xpc3RPZkludGVyZmFjZXMuaD4KK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CitET19OT1RfRElSRUNUTFlfVVNFX01FX0lNUExFTUVOVF9NRVRBX05FU1RFRF9JTlRFUkZBQ0UoTGlzdE9mSW50ZXJmYWNlcywgRW1wdHlJbnRlcmZhY2UsICJhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UiKQorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvTGlzdE9mSW50ZXJmYWNlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9MaXN0T2ZJbnRlcmZhY2VzLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9tYWNyb3MuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKKworTGlzdE9mSW50ZXJmYWNlczo6QnBFbXB0eUludGVyZmFjZTo6QnBFbXB0eUludGVyZmFjZShjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4mIF9haWRsX2ltcGwpCisgICAgOiBCcEludGVyZmFjZTxJRW1wdHlJbnRlcmZhY2U+KF9haWRsX2ltcGwpeworfQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9MaXN0T2ZJbnRlcmZhY2VzLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGJpbmRlci9TdGFiaWxpdHkuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKKworTGlzdE9mSW50ZXJmYWNlczo6Qm5FbXB0eUludGVyZmFjZTo6Qm5FbXB0eUludGVyZmFjZSgpCit7CisgIDo6YW5kcm9pZDo6aW50ZXJuYWw6OlN0YWJpbGl0eTo6bWFya0NvbXBpbGF0aW9uVW5pdCh0aGlzKTsKK30KKworOjphbmRyb2lkOjpzdGF0dXNfdCBMaXN0T2ZJbnRlcmZhY2VzOjpCbkVtcHR5SW50ZXJmYWNlOjpvblRyYW5zYWN0KHVpbnQzMl90IF9haWRsX2NvZGUsIGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsJiBfYWlkbF9kYXRhLCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcmVwbHksIHVpbnQzMl90IF9haWRsX2ZsYWdzKSB7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIHN3aXRjaCAoX2FpZGxfY29kZSkgeworICBkZWZhdWx0OgorICB7CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6QkJpbmRlcjo6b25UcmFuc2FjdChfYWlkbF9jb2RlLCBfYWlkbF9kYXRhLCBfYWlkbF9yZXBseSwgX2FpZGxfZmxhZ3MpOworICB9CisgIGJyZWFrOworICB9CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzID09IDo6YW5kcm9pZDo6VU5FWFBFQ1RFRF9OVUxMKSB7CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21FeGNlcHRpb25Db2RlKDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OkVYX05VTExfUE9JTlRFUikud3JpdGVPdmVyUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgfQorICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KKworfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvTGlzdE9mSW50ZXJmYWNlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9MaXN0T2ZJbnRlcmZhY2VzLmg+CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworRE9fTk9UX0RJUkVDVExZX1VTRV9NRV9JTVBMRU1FTlRfTUVUQV9ORVNURURfSU5URVJGQUNFKExpc3RPZkludGVyZmFjZXMsIE15SW50ZXJmYWNlLCAiYW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSU15SW50ZXJmYWNlIikKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL0xpc3RPZkludGVyZmFjZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvTGlzdE9mSW50ZXJmYWNlcy5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbWFjcm9zLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CisKK0xpc3RPZkludGVyZmFjZXM6OkJwTXlJbnRlcmZhY2U6OkJwTXlJbnRlcmZhY2UoY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+JiBfYWlkbF9pbXBsKQorICAgIDogQnBJbnRlcmZhY2U8SU15SW50ZXJmYWNlPihfYWlkbF9pbXBsKXsKK30KKworOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBMaXN0T2ZJbnRlcmZhY2VzOjpCcE15SW50ZXJmYWNlOjptZXRob2RXaXRoSW50ZXJmYWNlcyhjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4mIGlmYWNlLCBjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4mIG51bGxhYmxlX2lmYWNlLCBjb25zdCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4mIGlmYWNlX2xpc3RfaW4sIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+PiogaWZhY2VfbGlzdF9vdXQsIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+PiogaWZhY2VfbGlzdF9pbm91dCwgY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4mIG51bGxhYmxlX2lmYWNlX2xpc3RfaW4sIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+KiBudWxsYWJsZV9pZmFjZV9saXN0X291dCwgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4qIG51bGxhYmxlX2lmYWNlX2xpc3RfaW5vdXQsIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+KiBfYWlkbF9yZXR1cm4pIHsKKyAgOjphbmRyb2lkOjpQYXJjZWwgX2FpZGxfZGF0YTsKKyAgX2FpZGxfZGF0YS5tYXJrRm9yQmluZGVyKHJlbW90ZVN0cm9uZygpKTsKKyAgOjphbmRyb2lkOjpQYXJjZWwgX2FpZGxfcmVwbHk7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzOworICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKGdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLndyaXRlU3Ryb25nQmluZGVyKGlmYWNlKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVTdHJvbmdCaW5kZXIobnVsbGFibGVfaWZhY2UpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZVN0cm9uZ0JpbmRlclZlY3RvcihpZmFjZV9saXN0X2luKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVTdHJvbmdCaW5kZXJWZWN0b3IoKmlmYWNlX2xpc3RfaW5vdXQpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZVN0cm9uZ0JpbmRlclZlY3RvcihudWxsYWJsZV9pZmFjZV9saXN0X2luKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVTdHJvbmdCaW5kZXJWZWN0b3IoKm51bGxhYmxlX2lmYWNlX2xpc3RfaW5vdXQpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KExpc3RPZkludGVyZmFjZXM6OkJuTXlJbnRlcmZhY2U6OlRSQU5TQUNUSU9OX21ldGhvZFdpdGhJbnRlcmZhY2VzLCBfYWlkbF9kYXRhLCAmX2FpZGxfcmVwbHksIDApOworICBpZiAoVU5MSUtFTFkoX2FpZGxfcmV0X3N0YXR1cyA9PSA6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04gJiYgSU15SW50ZXJmYWNlOjpnZXREZWZhdWx0SW1wbCgpKSkgeworICAgICByZXR1cm4gSU15SW50ZXJmYWNlOjpnZXREZWZhdWx0SW1wbCgpLT5tZXRob2RXaXRoSW50ZXJmYWNlcyhpZmFjZSwgbnVsbGFibGVfaWZhY2UsIGlmYWNlX2xpc3RfaW4sIGlmYWNlX2xpc3Rfb3V0LCBpZmFjZV9saXN0X2lub3V0LCBudWxsYWJsZV9pZmFjZV9saXN0X2luLCBudWxsYWJsZV9pZmFjZV9saXN0X291dCwgbnVsbGFibGVfaWZhY2VfbGlzdF9pbm91dCwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLnJlYWRGcm9tUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgaWYgKCFfYWlkbF9zdGF0dXMuaXNPaygpKSB7CisgICAgcmV0dXJuIF9haWRsX3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHkucmVhZFN0cm9uZ0JpbmRlclZlY3RvcihfYWlkbF9yZXR1cm4pOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHkucmVhZFN0cm9uZ0JpbmRlclZlY3RvcihpZmFjZV9saXN0X291dCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS5yZWFkU3Ryb25nQmluZGVyVmVjdG9yKGlmYWNlX2xpc3RfaW5vdXQpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHkucmVhZFN0cm9uZ0JpbmRlclZlY3RvcihudWxsYWJsZV9pZmFjZV9saXN0X291dCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS5yZWFkU3Ryb25nQmluZGVyVmVjdG9yKG51bGxhYmxlX2lmYWNlX2xpc3RfaW5vdXQpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9lcnJvcjoKKyAgX2FpZGxfc3RhdHVzLnNldEZyb21TdGF0dXNUKF9haWRsX3JldF9zdGF0dXMpOworICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9MaXN0T2ZJbnRlcmZhY2VzLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGJpbmRlci9TdGFiaWxpdHkuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKKworTGlzdE9mSW50ZXJmYWNlczo6Qm5NeUludGVyZmFjZTo6Qm5NeUludGVyZmFjZSgpCit7CisgIDo6YW5kcm9pZDo6aW50ZXJuYWw6OlN0YWJpbGl0eTo6bWFya0NvbXBpbGF0aW9uVW5pdCh0aGlzKTsKK30KKworOjphbmRyb2lkOjpzdGF0dXNfdCBMaXN0T2ZJbnRlcmZhY2VzOjpCbk15SW50ZXJmYWNlOjpvblRyYW5zYWN0KHVpbnQzMl90IF9haWRsX2NvZGUsIGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsJiBfYWlkbF9kYXRhLCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcmVwbHksIHVpbnQzMl90IF9haWRsX2ZsYWdzKSB7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIHN3aXRjaCAoX2FpZGxfY29kZSkgeworICBjYXNlIEJuTXlJbnRlcmZhY2U6OlRSQU5TQUNUSU9OX21ldGhvZFdpdGhJbnRlcmZhY2VzOgorICB7CisgICAgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+IGluX2lmYWNlOworICAgIDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPiBpbl9udWxsYWJsZV9pZmFjZTsKKyAgICA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4gaW5faWZhY2VfbGlzdF9pbjsKKyAgICA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4gb3V0X2lmYWNlX2xpc3Rfb3V0OworICAgIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+PiBpbl9pZmFjZV9saXN0X2lub3V0OworICAgIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+IGluX251bGxhYmxlX2lmYWNlX2xpc3RfaW47CisgICAgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4gb3V0X251bGxhYmxlX2lmYWNlX2xpc3Rfb3V0OworICAgIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+IGluX251bGxhYmxlX2lmYWNlX2xpc3RfaW5vdXQ7CisgICAgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4gX2FpZGxfcmV0dXJuOworICAgIGlmICghKF9haWRsX2RhdGEuY2hlY2tJbnRlcmZhY2UodGhpcykpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpCQURfVFlQRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS5yZWFkU3Ryb25nQmluZGVyKCZpbl9pZmFjZSk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLnJlYWROdWxsYWJsZVN0cm9uZ0JpbmRlcigmaW5fbnVsbGFibGVfaWZhY2UpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS5yZWFkU3Ryb25nQmluZGVyVmVjdG9yKCZpbl9pZmFjZV9saXN0X2luKTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEucmVhZFN0cm9uZ0JpbmRlclZlY3RvcigmaW5faWZhY2VfbGlzdF9pbm91dCk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLnJlYWRTdHJvbmdCaW5kZXJWZWN0b3IoJmluX251bGxhYmxlX2lmYWNlX2xpc3RfaW4pOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS5yZWFkU3Ryb25nQmluZGVyVmVjdG9yKCZpbl9udWxsYWJsZV9pZmFjZV9saXN0X2lub3V0KTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGF1dG8gc3QgPSBfYWlkbF9kYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOyAhc3QuaXNPaygpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gc3Qud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXMobWV0aG9kV2l0aEludGVyZmFjZXMoaW5faWZhY2UsIGluX251bGxhYmxlX2lmYWNlLCBpbl9pZmFjZV9saXN0X2luLCAmb3V0X2lmYWNlX2xpc3Rfb3V0LCAmaW5faWZhY2VfbGlzdF9pbm91dCwgaW5fbnVsbGFibGVfaWZhY2VfbGlzdF9pbiwgJm91dF9udWxsYWJsZV9pZmFjZV9saXN0X291dCwgJmluX251bGxhYmxlX2lmYWNlX2xpc3RfaW5vdXQsICZfYWlkbF9yZXR1cm4pKTsKKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoIV9haWRsX3N0YXR1cy5pc09rKCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHktPndyaXRlU3Ryb25nQmluZGVyVmVjdG9yKF9haWRsX3JldHVybik7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS0+d3JpdGVTdHJvbmdCaW5kZXJWZWN0b3Iob3V0X2lmYWNlX2xpc3Rfb3V0KTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LT53cml0ZVN0cm9uZ0JpbmRlclZlY3Rvcihpbl9pZmFjZV9saXN0X2lub3V0KTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LT53cml0ZVN0cm9uZ0JpbmRlclZlY3RvcihvdXRfbnVsbGFibGVfaWZhY2VfbGlzdF9vdXQpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHktPndyaXRlU3Ryb25nQmluZGVyVmVjdG9yKGluX251bGxhYmxlX2lmYWNlX2xpc3RfaW5vdXQpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBicmVhazsKKyAgZGVmYXVsdDoKKyAgeworICAgIF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6OkJCaW5kZXI6Om9uVHJhbnNhY3QoX2FpZGxfY29kZSwgX2FpZGxfZGF0YSwgX2FpZGxfcmVwbHksIF9haWRsX2ZsYWdzKTsKKyAgfQorICBicmVhazsKKyAgfQorICBpZiAoX2FpZGxfcmV0X3N0YXR1cyA9PSA6OmFuZHJvaWQ6OlVORVhQRUNURURfTlVMTCkgeworICAgIF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tRXhjZXB0aW9uQ29kZSg6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpFWF9OVUxMX1BPSU5URVIpLndyaXRlT3ZlclBhcmNlbChfYWlkbF9yZXBseSk7CisgIH0KKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL0xpc3RPZkludGVyZmFjZXMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKKzo6YW5kcm9pZDo6c3RhdHVzX3QgTGlzdE9mSW50ZXJmYWNlczo6TXlQYXJjZWxhYmxlOjpyZWFkRnJvbVBhcmNlbChjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSB7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIHNpemVfdCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPSAwOworICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkSW50MzIoJl9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPCA0KSByZXR1cm4gOjphbmRyb2lkOjpCQURfVkFMVUU7CisgIHNpemVfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUpOworICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gU0laRV9NQVggLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkU3Ryb25nQmluZGVyKCZpZmFjZSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWROdWxsYWJsZVN0cm9uZ0JpbmRlcigmbnVsbGFibGVfaWZhY2UpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkU3Ryb25nQmluZGVyVmVjdG9yKCZpZmFjZV9saXN0KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZFN0cm9uZ0JpbmRlclZlY3RvcigmbnVsbGFibGVfaWZhY2VfbGlzdCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KKzo6YW5kcm9pZDo6c3RhdHVzX3QgTGlzdE9mSW50ZXJmYWNlczo6TXlQYXJjZWxhYmxlOjp3cml0ZVRvUGFyY2VsKDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IHsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpPSzsKKyAgYXV0byBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBfYWlkbF9wYXJjZWwtPndyaXRlSW50MzIoMCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlU3Ryb25nQmluZGVyKGlmYWNlKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlU3Ryb25nQmluZGVyKG51bGxhYmxlX2lmYWNlKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlU3Ryb25nQmluZGVyVmVjdG9yKGlmYWNlX2xpc3QpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVTdHJvbmdCaW5kZXJWZWN0b3IobnVsbGFibGVfaWZhY2VfbGlzdCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBhdXRvIF9haWRsX2VuZF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MpOworICBfYWlkbF9wYXJjZWwtPndyaXRlSW50MzIoX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX2VuZF9wb3MpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL0xpc3RPZkludGVyZmFjZXMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKKzo6YW5kcm9pZDo6c3RhdHVzX3QgTGlzdE9mSW50ZXJmYWNlczo6TXlVbmlvbjo6cmVhZEZyb21QYXJjZWwoY29uc3QgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgeworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXM7CisgIGludDMyX3QgX2FpZGxfdGFnOworICBpZiAoKF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRJbnQzMigmX2FpZGxfdGFnKSkgIT0gOjphbmRyb2lkOjpPSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIHN3aXRjaCAoc3RhdGljX2Nhc3Q8VGFnPihfYWlkbF90YWcpKSB7CisgIGNhc2UgaWZhY2U6IHsKKyAgICA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4gX2FpZGxfdmFsdWU7CisgICAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkU3Ryb25nQmluZGVyKCZfYWlkbF92YWx1ZSkpICE9IDo6YW5kcm9pZDo6T0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICAgIGlmIGNvbnN0ZXhwciAoc3RkOjppc190cml2aWFsbHlfY29weWFibGVfdjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+KSB7CisgICAgICBzZXQ8aWZhY2U+KF9haWRsX3ZhbHVlKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gTk9MSU5UTkVYVExJTkUocGVyZm9ybWFuY2UtbW92ZS1jb25zdC1hcmcpCisgICAgICBzZXQ8aWZhY2U+KHN0ZDo6bW92ZShfYWlkbF92YWx1ZSkpOworICAgIH0KKyAgICByZXR1cm4gOjphbmRyb2lkOjpPSzsgfQorICBjYXNlIG51bGxhYmxlX2lmYWNlOiB7CisgICAgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+IF9haWRsX3ZhbHVlOworICAgIGlmICgoX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZE51bGxhYmxlU3Ryb25nQmluZGVyKCZfYWlkbF92YWx1ZSkpICE9IDo6YW5kcm9pZDo6T0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICAgIGlmIGNvbnN0ZXhwciAoc3RkOjppc190cml2aWFsbHlfY29weWFibGVfdjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+KSB7CisgICAgICBzZXQ8bnVsbGFibGVfaWZhY2U+KF9haWRsX3ZhbHVlKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gTk9MSU5UTkVYVExJTkUocGVyZm9ybWFuY2UtbW92ZS1jb25zdC1hcmcpCisgICAgICBzZXQ8bnVsbGFibGVfaWZhY2U+KHN0ZDo6bW92ZShfYWlkbF92YWx1ZSkpOworICAgIH0KKyAgICByZXR1cm4gOjphbmRyb2lkOjpPSzsgfQorICBjYXNlIGlmYWNlX2xpc3Q6IHsKKyAgICA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4gX2FpZGxfdmFsdWU7CisgICAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkU3Ryb25nQmluZGVyVmVjdG9yKCZfYWlkbF92YWx1ZSkpICE9IDo6YW5kcm9pZDo6T0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICAgIGlmIGNvbnN0ZXhwciAoc3RkOjppc190cml2aWFsbHlfY29weWFibGVfdjw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+KSB7CisgICAgICBzZXQ8aWZhY2VfbGlzdD4oX2FpZGxfdmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBOT0xJTlRORVhUTElORShwZXJmb3JtYW5jZS1tb3ZlLWNvbnN0LWFyZykKKyAgICAgIHNldDxpZmFjZV9saXN0PihzdGQ6Om1vdmUoX2FpZGxfdmFsdWUpKTsKKyAgICB9CisgICAgcmV0dXJuIDo6YW5kcm9pZDo6T0s7IH0KKyAgY2FzZSBudWxsYWJsZV9pZmFjZV9saXN0OiB7CisgICAgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4gX2FpZGxfdmFsdWU7CisgICAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkU3Ryb25nQmluZGVyVmVjdG9yKCZfYWlkbF92YWx1ZSkpICE9IDo6YW5kcm9pZDo6T0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICAgIGlmIGNvbnN0ZXhwciAoc3RkOjppc190cml2aWFsbHlfY29weWFibGVfdjw6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+Pj4pIHsKKyAgICAgIHNldDxudWxsYWJsZV9pZmFjZV9saXN0PihfYWlkbF92YWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIE5PTElOVE5FWFRMSU5FKHBlcmZvcm1hbmNlLW1vdmUtY29uc3QtYXJnKQorICAgICAgc2V0PG51bGxhYmxlX2lmYWNlX2xpc3Q+KHN0ZDo6bW92ZShfYWlkbF92YWx1ZSkpOworICAgIH0KKyAgICByZXR1cm4gOjphbmRyb2lkOjpPSzsgfQorICB9CisgIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKK30KKzo6YW5kcm9pZDo6c3RhdHVzX3QgTGlzdE9mSW50ZXJmYWNlczo6TXlVbmlvbjo6d3JpdGVUb1BhcmNlbCg6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCB7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90PihnZXRUYWcoKSkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSA6OmFuZHJvaWQ6Ok9LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgc3dpdGNoIChnZXRUYWcoKSkgeworICBjYXNlIGlmYWNlOiByZXR1cm4gX2FpZGxfcGFyY2VsLT53cml0ZVN0cm9uZ0JpbmRlcihnZXQ8aWZhY2U+KCkpOworICBjYXNlIG51bGxhYmxlX2lmYWNlOiByZXR1cm4gX2FpZGxfcGFyY2VsLT53cml0ZVN0cm9uZ0JpbmRlcihnZXQ8bnVsbGFibGVfaWZhY2U+KCkpOworICBjYXNlIGlmYWNlX2xpc3Q6IHJldHVybiBfYWlkbF9wYXJjZWwtPndyaXRlU3Ryb25nQmluZGVyVmVjdG9yKGdldDxpZmFjZV9saXN0PigpKTsKKyAgY2FzZSBudWxsYWJsZV9pZmFjZV9saXN0OiByZXR1cm4gX2FpZGxfcGFyY2VsLT53cml0ZVN0cm9uZ0JpbmRlclZlY3RvcihnZXQ8bnVsbGFibGVfaWZhY2VfbGlzdD4oKSk7CisgIH0KKyAgX19hc3NlcnQyKF9fRklMRV9fLCBfX0xJTkVfXywgX19QUkVUVFlfRlVOQ1RJT05fXywgImNhbid0IHJlYWNoIGhlcmUiKTsKK30KK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0xpc3RPZkludGVyZmFjZXMuY3BwLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0xpc3RPZkludGVyZmFjZXMuY3BwLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ3OWQ1NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvTGlzdE9mSW50ZXJmYWNlcy5jcHAuZApAQCAtMCwwICsxLDIgQEAKK291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9MaXN0T2ZJbnRlcmZhY2VzLmNwcCA6IFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0xpc3RPZkludGVyZmFjZXMuYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9PdGhlclBhcmNlbGFibGVGb3JUb1N0cmluZy5jcHAgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL090aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nLmNwcAppbmRleCBkNmE3ZDY0Li5hNDdhMWI2IDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL090aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nLmNwcAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL090aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nLmNwcApAQCAtMSwxNyArMSwxOCBAQAogI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9PdGhlclBhcmNlbGFibGVGb3JUb1N0cmluZy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIG5hbWVzcGFjZSBhaWRsIHsKLQogbmFtZXNwYWNlIHRlc3RzIHsKLQogOjphbmRyb2lkOjpzdGF0dXNfdCBPdGhlclBhcmNlbGFibGVGb3JUb1N0cmluZzo6cmVhZEZyb21QYXJjZWwoY29uc3QgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgewogICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOwotICBbW21heWJlX3VudXNlZF1dIHNpemVfdCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOwotICBpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPSBfYWlkbF9wYXJjZWwtPnJlYWRJbnQzMigpOwotICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSA8IDApIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKLSAgW1ttYXliZV91bnVzZWRdXSBzaXplX3QgX2FpZGxfcGFyY2VsYWJsZV9zaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplKTsKKyAgc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgIGludDMyX3QgX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSA9IDA7CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRJbnQzMigmX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSA8IDQpIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgc2l6ZV90IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4oX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSk7CiAgIGlmIChfYWlkbF9zdGFydF9wb3MgPiBTSVpFX01BWCAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuIDo6YW5kcm9pZDo6QkFEX1ZBTFVFOwogICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKICAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwpAQCAtMjQsNyArMjUsNiBAQAogICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwogICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKIH0KLQogOjphbmRyb2lkOjpzdGF0dXNfdCBPdGhlclBhcmNlbGFibGVGb3JUb1N0cmluZzo6d3JpdGVUb1BhcmNlbCg6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCB7CiAgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CiAgIGF1dG8gX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKQEAgLTM5LDkgKzM5LDYgQEAKICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfZW5kX3Bvcyk7CiAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwogfQotCiB9ICAvLyBuYW1lc3BhY2UgdGVzdHMKLQogfSAgLy8gbmFtZXNwYWNlIGFpZGwKLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvUGFyY2VsYWJsZUZvclRvU3RyaW5nLmNwcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvUGFyY2VsYWJsZUZvclRvU3RyaW5nLmNwcAppbmRleCA3YjQwOTEwLi5iZDNiZGMyIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1BhcmNlbGFibGVGb3JUb1N0cmluZy5jcHAKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9QYXJjZWxhYmxlRm9yVG9TdHJpbmcuY3BwCkBAIC0xLDE3ICsxLDE4IEBACiAjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL1BhcmNlbGFibGVGb3JUb1N0cmluZy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIG5hbWVzcGFjZSBhaWRsIHsKLQogbmFtZXNwYWNlIHRlc3RzIHsKLQogOjphbmRyb2lkOjpzdGF0dXNfdCBQYXJjZWxhYmxlRm9yVG9TdHJpbmc6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIHsKICAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpPSzsKLSAgW1ttYXliZV91bnVzZWRdXSBzaXplX3QgX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKLSAgaW50MzJfdCBfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplID0gX2FpZGxfcGFyY2VsLT5yZWFkSW50MzIoKTsKLSAgaWYgKF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPCAwKSByZXR1cm4gOjphbmRyb2lkOjpCQURfVkFMVUU7Ci0gIFtbbWF5YmVfdW51c2VkXV0gc2l6ZV90IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4oX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSk7CisgIHNpemVfdCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPSAwOworICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkSW50MzIoJl9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPCA0KSByZXR1cm4gOjphbmRyb2lkOjpCQURfVkFMVUU7CisgIHNpemVfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUpOwogICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gU0laRV9NQVggLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKICAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CiAgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKQEAgLTIwMCw3ICsyMDEsNiBAQAogICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwogICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKIH0KLQogOjphbmRyb2lkOjpzdGF0dXNfdCBQYXJjZWxhYmxlRm9yVG9TdHJpbmc6OndyaXRlVG9QYXJjZWwoOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgewogICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOwogICBhdXRvIF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CkBAIC0zMDMsOSArMzAzLDYgQEAKICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfZW5kX3Bvcyk7CiAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwogfQotCiB9ICAvLyBuYW1lc3BhY2UgdGVzdHMKLQogfSAgLy8gbmFtZXNwYWNlIGFpZGwKLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvUGFyY2VsYWJsZUZvclRvU3RyaW5nLmNwcC5kIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9QYXJjZWxhYmxlRm9yVG9TdHJpbmcuY3BwLmQKaW5kZXggOTk1ZTU1YS4uNDA0M2ZkMSAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9QYXJjZWxhYmxlRm9yVG9TdHJpbmcuY3BwLmQKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9QYXJjZWxhYmxlRm9yVG9TdHJpbmcuY3BwLmQKQEAgLTQsNCArNCw3IEBACiAgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9JbnRFbnVtLmFpZGwgXAogICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmcuYWlkbCBcCiAgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5haWRsIFwKLSAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL1VuaW9uLmFpZGwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL1VuaW9uLmFpZGwgXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvQnl0ZUVudW0uYWlkbCBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9Mb25nRW51bS5haWRsIFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0NvbnN0YW50RXhwcmVzc2lvbkVudW0uYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9SZWN1cnNpdmVMaXN0LmNwcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvUmVjdXJzaXZlTGlzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc0MGNlMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvUmVjdXJzaXZlTGlzdC5jcHAKQEAgLTAsMCArMSw1NiBAQAorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9SZWN1cnNpdmVMaXN0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7Cis6OmFuZHJvaWQ6OnN0YXR1c190IFJlY3Vyc2l2ZUxpc3Q6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIHsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpPSzsKKyAgc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgIGludDMyX3QgX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSA9IDA7CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRJbnQzMigmX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSA8IDQpIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgc2l6ZV90IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4oX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSk7CisgIGlmIChfYWlkbF9zdGFydF9wb3MgPiBTSVpFX01BWCAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuIDo6YW5kcm9pZDo6QkFEX1ZBTFVFOworICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRJbnQzMigmdmFsdWUpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkUGFyY2VsYWJsZSgmbmV4dCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KKzo6YW5kcm9pZDo6c3RhdHVzX3QgUmVjdXJzaXZlTGlzdDo6d3JpdGVUb1BhcmNlbCg6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCB7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIGF1dG8gX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKKyAgX2FpZGxfcGFyY2VsLT53cml0ZUludDMyKDApOworICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUludDMyKHZhbHVlKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlTnVsbGFibGVQYXJjZWxhYmxlKG5leHQpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgYXV0byBfYWlkbF9lbmRfcG9zID0gX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKKyAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zKTsKKyAgX2FpZGxfcGFyY2VsLT53cml0ZUludDMyKF9haWRsX2VuZF9wb3MgLSBfYWlkbF9zdGFydF9wb3MpOworICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9lbmRfcG9zKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9Cit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9SZWN1cnNpdmVMaXN0LmNwcC5kIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9SZWN1cnNpdmVMaXN0LmNwcC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwZDFmZmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1JlY3Vyc2l2ZUxpc3QuY3BwLmQKQEAgLTAsMCArMSwyIEBACitvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvUmVjdXJzaXZlTGlzdC5jcHAgOiBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9SZWN1cnNpdmVMaXN0LmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvU3RydWN0dXJlZFBhcmNlbGFibGUuY3BwIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5jcHAKaW5kZXggY2MwZjJmMS4uNzNkOGVmZiAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5jcHAKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5jcHAKQEAgLTEsMTcgKzEsMTggQEAKICNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvU3RydWN0dXJlZFBhcmNlbGFibGUuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotCiBuYW1lc3BhY2UgYWlkbCB7Ci0KIG5hbWVzcGFjZSB0ZXN0cyB7Ci0KIDo6YW5kcm9pZDo6c3RhdHVzX3QgU3RydWN0dXJlZFBhcmNlbGFibGU6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIHsKICAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpPSzsKLSAgW1ttYXliZV91bnVzZWRdXSBzaXplX3QgX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKLSAgaW50MzJfdCBfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplID0gX2FpZGxfcGFyY2VsLT5yZWFkSW50MzIoKTsKLSAgaWYgKF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPCAwKSByZXR1cm4gOjphbmRyb2lkOjpCQURfVkFMVUU7Ci0gIFtbbWF5YmVfdW51c2VkXV0gc2l6ZV90IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4oX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSk7CisgIHNpemVfdCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPSAwOworICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkSW50MzIoJl9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPCA0KSByZXR1cm4gOjphbmRyb2lkOjpCQURfVkFMVUU7CisgIHNpemVfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUpOwogICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gU0laRV9NQVggLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKICAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CiAgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKQEAgLTI4MSw2ICsyODIsMjIgQEAKICAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwogICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwogICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRQYXJjZWxhYmxlKCZlbXB0eSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRCeXRlVmVjdG9yKCZpbnQ4XzEpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQogICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkSW50MzJWZWN0b3IoJmludDMyXzEpOwogICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CiAgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CkBAIC00NDAsNyArNDU3LDYgQEAKICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CiB9Ci0KIDo6YW5kcm9pZDo6c3RhdHVzX3QgU3RydWN0dXJlZFBhcmNlbGFibGU6OndyaXRlVG9QYXJjZWwoOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgewogICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOwogICBhdXRvIF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CkBAIC01NzcsNiArNTkzLDE0IEBACiAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKICAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKICAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZVBhcmNlbGFibGUoZW1wdHkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVCeXRlVmVjdG9yKGludDhfMSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQogICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUludDMyVmVjdG9yKGludDMyXzEpOwogICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CiAgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CkBAIC02NjMsOSArNjg3LDM4IEBACiAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX2VuZF9wb3MpOwogICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKIH0KLQogfSAgLy8gbmFtZXNwYWNlIHRlc3RzCi0KIH0gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5oPgogCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworOjphbmRyb2lkOjpzdGF0dXNfdCBTdHJ1Y3R1cmVkUGFyY2VsYWJsZTo6RW1wdHk6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIHsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpPSzsKKyAgc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgIGludDMyX3QgX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSA9IDA7CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRJbnQzMigmX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSA8IDQpIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgc2l6ZV90IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4oX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSk7CisgIGlmIChfYWlkbF9zdGFydF9wb3MgPiBTSVpFX01BWCAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuIDo6YW5kcm9pZDo6QkFEX1ZBTFVFOworICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KKzo6YW5kcm9pZDo6c3RhdHVzX3QgU3RydWN0dXJlZFBhcmNlbGFibGU6OkVtcHR5Ojp3cml0ZVRvUGFyY2VsKDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IHsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpPSzsKKyAgYXV0byBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBfYWlkbF9wYXJjZWwtPndyaXRlSW50MzIoMCk7CisgIGF1dG8gX2FpZGxfZW5kX3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3Bvcyk7CisgIF9haWRsX3BhcmNlbC0+d3JpdGVJbnQzMihfYWlkbF9lbmRfcG9zIC0gX2FpZGxfc3RhcnRfcG9zKTsKKyAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfZW5kX3Bvcyk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb24uY3BwIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9Vbmlvbi5jcHAKaW5kZXggMDZhM2YzNy4uYmQ0ZWVmMSAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9Vbmlvbi5jcHAKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9Vbmlvbi5jcHAKQEAgLTEsMjEgKzEsMTcgQEAKICNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvVW5pb24uaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotCiBuYW1lc3BhY2UgYWlkbCB7Ci0KIG5hbWVzcGFjZSB0ZXN0cyB7Ci0KIGNvbnN0IDo6c3RkOjpzdHJpbmcmIFVuaW9uOjpTMSgpIHsKICAgc3RhdGljIGNvbnN0IDo6c3RkOjpzdHJpbmcgdmFsdWUoImEgc3RyaW5nIGNvbnN0YW50IGluIHVuaW9uIik7CiAgIHJldHVybiB2YWx1ZTsKIH0KLQogOjphbmRyb2lkOjpzdGF0dXNfdCBVbmlvbjo6cmVhZEZyb21QYXJjZWwoY29uc3QgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgewogICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXM7CiAgIGludDMyX3QgX2FpZGxfdGFnOwogICBpZiAoKF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRJbnQzMigmX2FpZGxfdGFnKSkgIT0gOjphbmRyb2lkOjpPSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIHN3aXRjaCAoX2FpZGxfdGFnKSB7CisgIHN3aXRjaCAoc3RhdGljX2Nhc3Q8VGFnPihfYWlkbF90YWcpKSB7CiAgIGNhc2UgbnM6IHsKICAgICA6OnN0ZDo6dmVjdG9yPGludDMyX3Q+IF9haWRsX3ZhbHVlOwogICAgIGlmICgoX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEludDMyVmVjdG9yKCZfYWlkbF92YWx1ZSkpICE9IDo6YW5kcm9pZDo6T0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwpAQCAtODksOSArODUsOCBAQAogICB9CiAgIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKIH0KLQogOjphbmRyb2lkOjpzdGF0dXNfdCBVbmlvbjo6d3JpdGVUb1BhcmNlbCg6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCB7Ci0gIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVJbnQzMihnZXRUYWcoKSk7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90PihnZXRUYWcoKSkpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSA6OmFuZHJvaWQ6Ok9LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKICAgc3dpdGNoIChnZXRUYWcoKSkgewogICBjYXNlIG5zOiByZXR1cm4gX2FpZGxfcGFyY2VsLT53cml0ZUludDMyVmVjdG9yKGdldDxucz4oKSk7CkBAIC0xMDQsOSArOTksNiBAQAogICB9CiAgIF9fYXNzZXJ0MihfX0ZJTEVfXywgX19MSU5FX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18sICJjYW4ndCByZWFjaCBoZXJlIik7CiB9Ci0KIH0gIC8vIG5hbWVzcGFjZSB0ZXN0cwotCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9VbmlvbldpdGhGZC5jcHAgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1VuaW9uV2l0aEZkLmNwcAppbmRleCA1ZmIyZGRmLi5kOGY0MTAzIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1VuaW9uV2l0aEZkLmNwcAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1VuaW9uV2l0aEZkLmNwcApAQCAtMSwxNiArMSwxMyBAQAogI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9VbmlvbldpdGhGZC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIG5hbWVzcGFjZSBhaWRsIHsKLQogbmFtZXNwYWNlIHRlc3RzIHsKLQogOjphbmRyb2lkOjpzdGF0dXNfdCBVbmlvbldpdGhGZDo6cmVhZEZyb21QYXJjZWwoY29uc3QgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgewogICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXM7CiAgIGludDMyX3QgX2FpZGxfdGFnOwogICBpZiAoKF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRJbnQzMigmX2FpZGxfdGFnKSkgIT0gOjphbmRyb2lkOjpPSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIHN3aXRjaCAoX2FpZGxfdGFnKSB7CisgIHN3aXRjaCAoc3RhdGljX2Nhc3Q8VGFnPihfYWlkbF90YWcpKSB7CiAgIGNhc2UgbnVtOiB7CiAgICAgaW50MzJfdCBfYWlkbF92YWx1ZTsKICAgICBpZiAoKF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRJbnQzMigmX2FpZGxfdmFsdWUpKSAhPSA6OmFuZHJvaWQ6Ok9LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKQEAgLTM0LDkgKzMxLDggQEAKICAgfQogICByZXR1cm4gOjphbmRyb2lkOjpCQURfVkFMVUU7CiB9Ci0KIDo6YW5kcm9pZDo6c3RhdHVzX3QgVW5pb25XaXRoRmQ6OndyaXRlVG9QYXJjZWwoOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgewotICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlSW50MzIoZ2V0VGFnKCkpOworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4oZ2V0VGFnKCkpKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gOjphbmRyb2lkOjpPSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CiAgIHN3aXRjaCAoZ2V0VGFnKCkpIHsKICAgY2FzZSBudW06IHJldHVybiBfYWlkbF9wYXJjZWwtPndyaXRlSW50MzIoZ2V0PG51bT4oKSk7CkBAIC00NCw5ICs0MCw2IEBACiAgIH0KICAgX19hc3NlcnQyKF9fRklMRV9fLCBfX0xJTkVfXywgX19QUkVUVFlfRlVOQ1RJT05fXywgImNhbid0IHJlYWNoIGhlcmUiKTsKIH0KLQogfSAgLy8gbmFtZXNwYWNlIHRlc3RzCi0KIH0gIC8vIG5hbWVzcGFjZSBhaWRsCi0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9FeHRlbmRhYmxlUGFyY2VsYWJsZS5jcHAgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9FeHRlbmRhYmxlUGFyY2VsYWJsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkzNWIwOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0V4dGVuZGFibGVQYXJjZWxhYmxlLmNwcApAQCAtMCwwICsxLDk0IEBACisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9FeHRlbmRhYmxlUGFyY2VsYWJsZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworbmFtZXNwYWNlIGV4dGVuc2lvbiB7Cis6OmFuZHJvaWQ6OnN0YXR1c190IEV4dGVuZGFibGVQYXJjZWxhYmxlOjpyZWFkRnJvbVBhcmNlbChjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSB7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIHNpemVfdCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPSAwOworICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkSW50MzIoJl9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPCA0KSByZXR1cm4gOjphbmRyb2lkOjpCQURfVkFMVUU7CisgIHNpemVfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUpOworICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gU0laRV9NQVggLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkSW50MzIoJmEpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkVXRmOEZyb21VdGYxNigmYik7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRQYXJjZWxhYmxlKCZleHQpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkSW50NjQoJmMpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkUGFyY2VsYWJsZSgmZXh0Mik7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KKzo6YW5kcm9pZDo6c3RhdHVzX3QgRXh0ZW5kYWJsZVBhcmNlbGFibGU6OndyaXRlVG9QYXJjZWwoOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgeworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICBhdXRvIF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgIF9haWRsX3BhcmNlbC0+d3JpdGVJbnQzMigwKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVJbnQzMihhKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlVXRmOEFzVXRmMTYoYik7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZVBhcmNlbGFibGUoZXh0KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlSW50NjQoYyk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZVBhcmNlbGFibGUoZXh0Mik7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBhdXRvIF9haWRsX2VuZF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MpOworICBfYWlkbF9wYXJjZWwtPndyaXRlSW50MzIoX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX2VuZF9wb3MpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KK30gIC8vIG5hbWVzcGFjZSBleHRlbnNpb24KK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9FeHRlbmRhYmxlUGFyY2VsYWJsZS5jcHAuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0V4dGVuZGFibGVQYXJjZWxhYmxlLmNwcC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmY2U5MDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9FeHRlbmRhYmxlUGFyY2VsYWJsZS5jcHAuZApAQCAtMCwwICsxLDIgQEAKK291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vRXh0ZW5kYWJsZVBhcmNlbGFibGUuY3BwIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0V4dGVuZGFibGVQYXJjZWxhYmxlLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0LmNwcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTRhNmVhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQuY3BwCkBAIC0wLDAgKzEsNTggQEAKKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CituYW1lc3BhY2UgZXh0ZW5zaW9uIHsKKzo6YW5kcm9pZDo6c3RhdHVzX3QgTXlFeHQ6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIHsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpPSzsKKyAgc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgIGludDMyX3QgX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSA9IDA7CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRJbnQzMigmX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSA8IDQpIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgc2l6ZV90IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4oX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSk7CisgIGlmIChfYWlkbF9zdGFydF9wb3MgPiBTSVpFX01BWCAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuIDo6YW5kcm9pZDo6QkFEX1ZBTFVFOworICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRJbnQzMigmYSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRVdGY4RnJvbVV0ZjE2KCZiKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorOjphbmRyb2lkOjpzdGF0dXNfdCBNeUV4dDo6d3JpdGVUb1BhcmNlbCg6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCB7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIGF1dG8gX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKKyAgX2FpZGxfcGFyY2VsLT53cml0ZUludDMyKDApOworICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUludDMyKGEpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVVdGY4QXNVdGYxNihiKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGF1dG8gX2FpZGxfZW5kX3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3Bvcyk7CisgIF9haWRsX3BhcmNlbC0+d3JpdGVJbnQzMihfYWlkbF9lbmRfcG9zIC0gX2FpZGxfc3RhcnRfcG9zKTsKKyAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfZW5kX3Bvcyk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorfSAgLy8gbmFtZXNwYWNlIGV4dGVuc2lvbgorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0LmNwcC5kIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQuY3BwLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdlMzRkMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0LmNwcC5kCkBAIC0wLDAgKzEsMiBAQAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dC5jcHAgOiBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQuYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQyLmNwcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0Mi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM1YzU5MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0Mi5jcHAKQEAgLTAsMCArMSw3MCBAQAorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CituYW1lc3BhY2UgZXh0ZW5zaW9uIHsKKzo6YW5kcm9pZDo6c3RhdHVzX3QgTXlFeHQyOjpyZWFkRnJvbVBhcmNlbChjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSB7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIHNpemVfdCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPSAwOworICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkSW50MzIoJl9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPCA0KSByZXR1cm4gOjphbmRyb2lkOjpCQURfVkFMVUU7CisgIHNpemVfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUpOworICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gU0laRV9NQVggLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkSW50MzIoJmEpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkUGFyY2VsYWJsZSgmYik7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRVdGY4RnJvbVV0ZjE2KCZjKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorOjphbmRyb2lkOjpzdGF0dXNfdCBNeUV4dDI6OndyaXRlVG9QYXJjZWwoOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgeworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICBhdXRvIF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgIF9haWRsX3BhcmNlbC0+d3JpdGVJbnQzMigwKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVJbnQzMihhKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlUGFyY2VsYWJsZShiKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlVXRmOEFzVXRmMTYoYyk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBhdXRvIF9haWRsX2VuZF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MpOworICBfYWlkbF9wYXJjZWwtPndyaXRlSW50MzIoX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX2VuZF9wb3MpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KK30gIC8vIG5hbWVzcGFjZSBleHRlbnNpb24KK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dDIuY3BwLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dDIuY3BwLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM5ZTE2NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0Mi5jcHAuZApAQCAtMCwwICsxLDMgQEAKK291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQyLmNwcCA6IFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dDIuYWlkbCBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQuYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHRMaWtlLmNwcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0TGlrZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzczYmI2ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0TGlrZS5jcHAKQEAgLTAsMCArMSw1OCBAQAorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHRMaWtlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CituYW1lc3BhY2UgZXh0ZW5zaW9uIHsKKzo6YW5kcm9pZDo6c3RhdHVzX3QgTXlFeHRMaWtlOjpyZWFkRnJvbVBhcmNlbChjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSB7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIHNpemVfdCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPSAwOworICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkSW50MzIoJl9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPCA0KSByZXR1cm4gOjphbmRyb2lkOjpCQURfVkFMVUU7CisgIHNpemVfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUpOworICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gU0laRV9NQVggLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkSW50MzIoJmEpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkU3RyaW5nMTYoJmIpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9Cis6OmFuZHJvaWQ6OnN0YXR1c190IE15RXh0TGlrZTo6d3JpdGVUb1BhcmNlbCg6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCB7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIGF1dG8gX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKKyAgX2FpZGxfcGFyY2VsLT53cml0ZUludDMyKDApOworICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUludDMyKGEpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVTdHJpbmcxNihiKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGF1dG8gX2FpZGxfZW5kX3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3Bvcyk7CisgIF9haWRsX3BhcmNlbC0+d3JpdGVJbnQzMihfYWlkbF9lbmRfcG9zIC0gX2FpZGxfc3RhcnRfcG9zKTsKKyAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfZW5kX3Bvcyk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorfSAgLy8gbmFtZXNwYWNlIGV4dGVuc2lvbgorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0TGlrZS5jcHAuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0TGlrZS5jcHAuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTgxMTI4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHRMaWtlLmNwcC5kCkBAIC0wLDAgKzEsMiBAQAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dExpa2UuY3BwIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0TGlrZS5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9EZWVwbHlOZXN0ZWQuY3BwIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvRGVlcGx5TmVzdGVkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDQzODhkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvRGVlcGx5TmVzdGVkLmNwcApAQCAtMCwwICsxLDE4MiBAQAorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvRGVlcGx5TmVzdGVkLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CituYW1lc3BhY2UgbmVzdGVkIHsKKzo6YW5kcm9pZDo6c3RhdHVzX3QgRGVlcGx5TmVzdGVkOjpyZWFkRnJvbVBhcmNlbChjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSB7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIHNpemVfdCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPSAwOworICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkSW50MzIoJl9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPCA0KSByZXR1cm4gOjphbmRyb2lkOjpCQURfVkFMVUU7CisgIHNpemVfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUpOworICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gU0laRV9NQVggLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9Cis6OmFuZHJvaWQ6OnN0YXR1c190IERlZXBseU5lc3RlZDo6d3JpdGVUb1BhcmNlbCg6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCB7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIGF1dG8gX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKKyAgX2FpZGxfcGFyY2VsLT53cml0ZUludDMyKDApOworICBhdXRvIF9haWRsX2VuZF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MpOworICBfYWlkbF9wYXJjZWwtPndyaXRlSW50MzIoX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX2VuZF9wb3MpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KK30gIC8vIG5hbWVzcGFjZSBuZXN0ZWQKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9EZWVwbHlOZXN0ZWQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK25hbWVzcGFjZSBuZXN0ZWQgeworOjphbmRyb2lkOjpzdGF0dXNfdCBEZWVwbHlOZXN0ZWQ6OkE6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIHsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpPSzsKKyAgc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgIGludDMyX3QgX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSA9IDA7CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRJbnQzMigmX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSA8IDQpIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgc2l6ZV90IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4oX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSk7CisgIGlmIChfYWlkbF9zdGFydF9wb3MgPiBTSVpFX01BWCAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuIDo6YW5kcm9pZDo6QkFEX1ZBTFVFOworICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRCeXRlKHJlaW50ZXJwcmV0X2Nhc3Q8aW50OF90ICo+KCZlKSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KKzo6YW5kcm9pZDo6c3RhdHVzX3QgRGVlcGx5TmVzdGVkOjpBOjp3cml0ZVRvUGFyY2VsKDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IHsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpPSzsKKyAgYXV0byBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBfYWlkbF9wYXJjZWwtPndyaXRlSW50MzIoMCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlQnl0ZShzdGF0aWNfY2FzdDxpbnQ4X3Q+KGUpKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGF1dG8gX2FpZGxfZW5kX3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3Bvcyk7CisgIF9haWRsX3BhcmNlbC0+d3JpdGVJbnQzMihfYWlkbF9lbmRfcG9zIC0gX2FpZGxfc3RhcnRfcG9zKTsKKyAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfZW5kX3Bvcyk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorfSAgLy8gbmFtZXNwYWNlIG5lc3RlZAorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0RlZXBseU5lc3RlZC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworbmFtZXNwYWNlIG5lc3RlZCB7Cis6OmFuZHJvaWQ6OnN0YXR1c190IERlZXBseU5lc3RlZDo6Qjo6cmVhZEZyb21QYXJjZWwoY29uc3QgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgeworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICBzaXplX3QgX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKKyAgaW50MzJfdCBfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplID0gMDsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEludDMyKCZfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplIDwgNCkgcmV0dXJuIDo6YW5kcm9pZDo6QkFEX1ZBTFVFOworICBzaXplX3QgX2FpZGxfcGFyY2VsYWJsZV9zaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplKTsKKyAgaWYgKF9haWRsX3N0YXJ0X3BvcyA+IFNJWkVfTUFYIC0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm4gOjphbmRyb2lkOjpCQURfVkFMVUU7CisgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorOjphbmRyb2lkOjpzdGF0dXNfdCBEZWVwbHlOZXN0ZWQ6OkI6OndyaXRlVG9QYXJjZWwoOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgeworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICBhdXRvIF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgIF9haWRsX3BhcmNlbC0+d3JpdGVJbnQzMigwKTsKKyAgYXV0byBfYWlkbF9lbmRfcG9zID0gX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKKyAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zKTsKKyAgX2FpZGxfcGFyY2VsLT53cml0ZUludDMyKF9haWRsX2VuZF9wb3MgLSBfYWlkbF9zdGFydF9wb3MpOworICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9lbmRfcG9zKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9Cit9ICAvLyBuYW1lc3BhY2UgbmVzdGVkCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvRGVlcGx5TmVzdGVkLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CituYW1lc3BhY2UgbmVzdGVkIHsKKzo6YW5kcm9pZDo6c3RhdHVzX3QgRGVlcGx5TmVzdGVkOjpCOjpDOjpyZWFkRnJvbVBhcmNlbChjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSB7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIHNpemVfdCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPSAwOworICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkSW50MzIoJl9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPCA0KSByZXR1cm4gOjphbmRyb2lkOjpCQURfVkFMVUU7CisgIHNpemVfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUpOworICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gU0laRV9NQVggLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9Cis6OmFuZHJvaWQ6OnN0YXR1c190IERlZXBseU5lc3RlZDo6Qjo6Qzo6d3JpdGVUb1BhcmNlbCg6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCB7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIGF1dG8gX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKKyAgX2FpZGxfcGFyY2VsLT53cml0ZUludDMyKDApOworICBhdXRvIF9haWRsX2VuZF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MpOworICBfYWlkbF9wYXJjZWwtPndyaXRlSW50MzIoX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX2VuZF9wb3MpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KK30gIC8vIG5hbWVzcGFjZSBuZXN0ZWQKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9EZWVwbHlOZXN0ZWQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK25hbWVzcGFjZSBuZXN0ZWQgeworOjphbmRyb2lkOjpzdGF0dXNfdCBEZWVwbHlOZXN0ZWQ6OkI6OkM6OkQ6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIHsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpPSzsKKyAgc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgIGludDMyX3QgX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSA9IDA7CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRJbnQzMigmX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSA8IDQpIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgc2l6ZV90IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4oX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSk7CisgIGlmIChfYWlkbF9zdGFydF9wb3MgPiBTSVpFX01BWCAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuIDo6YW5kcm9pZDo6QkFEX1ZBTFVFOworICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KKzo6YW5kcm9pZDo6c3RhdHVzX3QgRGVlcGx5TmVzdGVkOjpCOjpDOjpEOjp3cml0ZVRvUGFyY2VsKDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IHsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpPSzsKKyAgYXV0byBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBfYWlkbF9wYXJjZWwtPndyaXRlSW50MzIoMCk7CisgIGF1dG8gX2FpZGxfZW5kX3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3Bvcyk7CisgIF9haWRsX3BhcmNlbC0+d3JpdGVJbnQzMihfYWlkbF9lbmRfcG9zIC0gX2FpZGxfc3RhcnRfcG9zKTsKKyAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfZW5kX3Bvcyk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorfSAgLy8gbmFtZXNwYWNlIG5lc3RlZAorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0RlZXBseU5lc3RlZC5jcHAuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0RlZXBseU5lc3RlZC5jcHAuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjg0MTkwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvRGVlcGx5TmVzdGVkLmNwcC5kCkBAIC0wLDAgKzEsMiBAQAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9EZWVwbHlOZXN0ZWQuY3BwIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0RlZXBseU5lc3RlZC5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9JTmVzdGVkU2VydmljZS5jcHAgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9JTmVzdGVkU2VydmljZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc3NTkwMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0lOZXN0ZWRTZXJ2aWNlLmNwcApAQCAtMCwwICsxLDM2MiBAQAorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvSU5lc3RlZFNlcnZpY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0JwTmVzdGVkU2VydmljZS5oPgorbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK25hbWVzcGFjZSBuZXN0ZWQgeworRE9fTk9UX0RJUkVDVExZX1VTRV9NRV9JTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoTmVzdGVkU2VydmljZSwgImFuZHJvaWQuYWlkbC50ZXN0cy5uZXN0ZWQuSU5lc3RlZFNlcnZpY2UiKQorfSAgLy8gbmFtZXNwYWNlIG5lc3RlZAorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0JwTmVzdGVkU2VydmljZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvQm5OZXN0ZWRTZXJ2aWNlLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9tYWNyb3MuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK25hbWVzcGFjZSBuZXN0ZWQgeworCitCcE5lc3RlZFNlcnZpY2U6OkJwTmVzdGVkU2VydmljZShjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4mIF9haWRsX2ltcGwpCisgICAgOiBCcEludGVyZmFjZTxJTmVzdGVkU2VydmljZT4oX2FpZGxfaW1wbCl7Cit9CisKKzo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgQnBOZXN0ZWRTZXJ2aWNlOjpmbGlwU3RhdHVzKGNvbnN0IDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6UGFyY2VsYWJsZVdpdGhOZXN0ZWQmIHAsIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6SU5lc3RlZFNlcnZpY2U6OlJlc3VsdCogX2FpZGxfcmV0dXJuKSB7CisgIDo6YW5kcm9pZDo6UGFyY2VsIF9haWRsX2RhdGE7CisgIF9haWRsX2RhdGEubWFya0ZvckJpbmRlcihyZW1vdGVTdHJvbmcoKSk7CisgIDo6YW5kcm9pZDo6UGFyY2VsIF9haWRsX3JlcGx5OworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1czsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZVBhcmNlbGFibGUocCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoQm5OZXN0ZWRTZXJ2aWNlOjpUUkFOU0FDVElPTl9mbGlwU3RhdHVzLCBfYWlkbF9kYXRhLCAmX2FpZGxfcmVwbHksIDApOworICBpZiAoVU5MSUtFTFkoX2FpZGxfcmV0X3N0YXR1cyA9PSA6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04gJiYgSU5lc3RlZFNlcnZpY2U6OmdldERlZmF1bHRJbXBsKCkpKSB7CisgICAgIHJldHVybiBJTmVzdGVkU2VydmljZTo6Z2V0RGVmYXVsdEltcGwoKS0+ZmxpcFN0YXR1cyhwLCBfYWlkbF9yZXR1cm4pOworICB9CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMucmVhZEZyb21QYXJjZWwoX2FpZGxfcmVwbHkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBpZiAoIV9haWRsX3N0YXR1cy5pc09rKCkpIHsKKyAgICByZXR1cm4gX2FpZGxfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS5yZWFkUGFyY2VsYWJsZShfYWlkbF9yZXR1cm4pOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9lcnJvcjoKKyAgX2FpZGxfc3RhdHVzLnNldEZyb21TdGF0dXNUKF9haWRsX3JldF9zdGF0dXMpOworICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorCis6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEJwTmVzdGVkU2VydmljZTo6ZmxpcFN0YXR1c1dpdGhDYWxsYmFjayg6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OlBhcmNlbGFibGVXaXRoTmVzdGVkOjpTdGF0dXMgc3RhdHVzLCBjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6SU5lc3RlZFNlcnZpY2U6OklDYWxsYmFjaz4mIGNiKSB7CisgIDo6YW5kcm9pZDo6UGFyY2VsIF9haWRsX2RhdGE7CisgIF9haWRsX2RhdGEubWFya0ZvckJpbmRlcihyZW1vdGVTdHJvbmcoKSk7CisgIDo6YW5kcm9pZDo6UGFyY2VsIF9haWRsX3JlcGx5OworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1czsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZUJ5dGUoc3RhdGljX2Nhc3Q8aW50OF90PihzdGF0dXMpKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVTdHJvbmdCaW5kZXIoY2IpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEJuTmVzdGVkU2VydmljZTo6VFJBTlNBQ1RJT05fZmxpcFN0YXR1c1dpdGhDYWxsYmFjaywgX2FpZGxfZGF0YSwgJl9haWRsX3JlcGx5LCAwKTsKKyAgaWYgKFVOTElLRUxZKF9haWRsX3JldF9zdGF0dXMgPT0gOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OICYmIElOZXN0ZWRTZXJ2aWNlOjpnZXREZWZhdWx0SW1wbCgpKSkgeworICAgICByZXR1cm4gSU5lc3RlZFNlcnZpY2U6OmdldERlZmF1bHRJbXBsKCktPmZsaXBTdGF0dXNXaXRoQ2FsbGJhY2soc3RhdHVzLCBjYik7CisgIH0KKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy5yZWFkRnJvbVBhcmNlbChfYWlkbF9yZXBseSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIGlmICghX2FpZGxfc3RhdHVzLmlzT2soKSkgeworICAgIHJldHVybiBfYWlkbF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfZXJyb3I6CisgIF9haWRsX3N0YXR1cy5zZXRGcm9tU3RhdHVzVChfYWlkbF9yZXRfc3RhdHVzKTsKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKworfSAgLy8gbmFtZXNwYWNlIG5lc3RlZAorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0JuTmVzdGVkU2VydmljZS5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxiaW5kZXIvU3RhYmlsaXR5Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CituYW1lc3BhY2UgbmVzdGVkIHsKKworQm5OZXN0ZWRTZXJ2aWNlOjpCbk5lc3RlZFNlcnZpY2UoKQoreworICA6OmFuZHJvaWQ6OmludGVybmFsOjpTdGFiaWxpdHk6Om1hcmtDb21waWxhdGlvblVuaXQodGhpcyk7Cit9CisKKzo6YW5kcm9pZDo6c3RhdHVzX3QgQm5OZXN0ZWRTZXJ2aWNlOjpvblRyYW5zYWN0KHVpbnQzMl90IF9haWRsX2NvZGUsIGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsJiBfYWlkbF9kYXRhLCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcmVwbHksIHVpbnQzMl90IF9haWRsX2ZsYWdzKSB7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIHN3aXRjaCAoX2FpZGxfY29kZSkgeworICBjYXNlIEJuTmVzdGVkU2VydmljZTo6VFJBTlNBQ1RJT05fZmxpcFN0YXR1czoKKyAgeworICAgIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6UGFyY2VsYWJsZVdpdGhOZXN0ZWQgaW5fcDsKKyAgICA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OklOZXN0ZWRTZXJ2aWNlOjpSZXN1bHQgX2FpZGxfcmV0dXJuOworICAgIGlmICghKF9haWRsX2RhdGEuY2hlY2tJbnRlcmZhY2UodGhpcykpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpCQURfVFlQRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS5yZWFkUGFyY2VsYWJsZSgmaW5fcCk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChhdXRvIHN0ID0gX2FpZGxfZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsgIXN0LmlzT2soKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IHN0LndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzKGZsaXBTdGF0dXMoaW5fcCwgJl9haWRsX3JldHVybikpOworICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICghX2FpZGxfc3RhdHVzLmlzT2soKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS0+d3JpdGVQYXJjZWxhYmxlKF9haWRsX3JldHVybik7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGJyZWFrOworICBjYXNlIEJuTmVzdGVkU2VydmljZTo6VFJBTlNBQ1RJT05fZmxpcFN0YXR1c1dpdGhDYWxsYmFjazoKKyAgeworICAgIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6UGFyY2VsYWJsZVdpdGhOZXN0ZWQ6OlN0YXR1cyBpbl9zdGF0dXM7CisgICAgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OklOZXN0ZWRTZXJ2aWNlOjpJQ2FsbGJhY2s+IGluX2NiOworICAgIGlmICghKF9haWRsX2RhdGEuY2hlY2tJbnRlcmZhY2UodGhpcykpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpCQURfVFlQRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS5yZWFkQnl0ZShyZWludGVycHJldF9jYXN0PGludDhfdCAqPigmaW5fc3RhdHVzKSk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLnJlYWRTdHJvbmdCaW5kZXIoJmluX2NiKTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGF1dG8gc3QgPSBfYWlkbF9kYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOyAhc3QuaXNPaygpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gc3Qud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXMoZmxpcFN0YXR1c1dpdGhDYWxsYmFjayhpbl9zdGF0dXMsIGluX2NiKSk7CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKCFfYWlkbF9zdGF0dXMuaXNPaygpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgYnJlYWs7CisgIGRlZmF1bHQ6CisgIHsKKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpCQmluZGVyOjpvblRyYW5zYWN0KF9haWRsX2NvZGUsIF9haWRsX2RhdGEsIF9haWRsX3JlcGx5LCBfYWlkbF9mbGFncyk7CisgIH0KKyAgYnJlYWs7CisgIH0KKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgPT0gOjphbmRyb2lkOjpVTkVYUEVDVEVEX05VTEwpIHsKKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbUV4Y2VwdGlvbkNvZGUoOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6RVhfTlVMTF9QT0lOVEVSKS53cml0ZU92ZXJQYXJjZWwoX2FpZGxfcmVwbHkpOworICB9CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorCit9ICAvLyBuYW1lc3BhY2UgbmVzdGVkCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvSU5lc3RlZFNlcnZpY2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK25hbWVzcGFjZSBuZXN0ZWQgeworOjphbmRyb2lkOjpzdGF0dXNfdCBJTmVzdGVkU2VydmljZTo6UmVzdWx0OjpyZWFkRnJvbVBhcmNlbChjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSB7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIHNpemVfdCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPSAwOworICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkSW50MzIoJl9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPCA0KSByZXR1cm4gOjphbmRyb2lkOjpCQURfVkFMVUU7CisgIHNpemVfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUpOworICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gU0laRV9NQVggLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkQnl0ZShyZWludGVycHJldF9jYXN0PGludDhfdCAqPigmc3RhdHVzKSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KKzo6YW5kcm9pZDo6c3RhdHVzX3QgSU5lc3RlZFNlcnZpY2U6OlJlc3VsdDo6d3JpdGVUb1BhcmNlbCg6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCB7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIGF1dG8gX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKKyAgX2FpZGxfcGFyY2VsLT53cml0ZUludDMyKDApOworICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUJ5dGUoc3RhdGljX2Nhc3Q8aW50OF90PihzdGF0dXMpKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGF1dG8gX2FpZGxfZW5kX3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3Bvcyk7CisgIF9haWRsX3BhcmNlbC0+d3JpdGVJbnQzMihfYWlkbF9lbmRfcG9zIC0gX2FpZGxfc3RhcnRfcG9zKTsKKyAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfZW5kX3Bvcyk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorfSAgLy8gbmFtZXNwYWNlIG5lc3RlZAorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0lOZXN0ZWRTZXJ2aWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9JTmVzdGVkU2VydmljZS5oPgorbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK25hbWVzcGFjZSBuZXN0ZWQgeworRE9fTk9UX0RJUkVDVExZX1VTRV9NRV9JTVBMRU1FTlRfTUVUQV9ORVNURURfSU5URVJGQUNFKElOZXN0ZWRTZXJ2aWNlLCBDYWxsYmFjaywgImFuZHJvaWQuYWlkbC50ZXN0cy5uZXN0ZWQuSU5lc3RlZFNlcnZpY2UuSUNhbGxiYWNrIikKK30gIC8vIG5hbWVzcGFjZSBuZXN0ZWQKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9JTmVzdGVkU2VydmljZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvSU5lc3RlZFNlcnZpY2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL21hY3Jvcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworbmFtZXNwYWNlIG5lc3RlZCB7CisKK0lOZXN0ZWRTZXJ2aWNlOjpCcENhbGxiYWNrOjpCcENhbGxiYWNrKGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiYgX2FpZGxfaW1wbCkKKyAgICA6IEJwSW50ZXJmYWNlPElDYWxsYmFjaz4oX2FpZGxfaW1wbCl7Cit9CisKKzo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgSU5lc3RlZFNlcnZpY2U6OkJwQ2FsbGJhY2s6OmRvbmUoOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpQYXJjZWxhYmxlV2l0aE5lc3RlZDo6U3RhdHVzIHN0YXR1cykgeworICA6OmFuZHJvaWQ6OlBhcmNlbCBfYWlkbF9kYXRhOworICBfYWlkbF9kYXRhLm1hcmtGb3JCaW5kZXIocmVtb3RlU3Ryb25nKCkpOworICA6OmFuZHJvaWQ6OlBhcmNlbCBfYWlkbF9yZXBseTsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpPSzsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oZ2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVCeXRlKHN0YXRpY19jYXN0PGludDhfdD4oc3RhdHVzKSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoSU5lc3RlZFNlcnZpY2U6OkJuQ2FsbGJhY2s6OlRSQU5TQUNUSU9OX2RvbmUsIF9haWRsX2RhdGEsICZfYWlkbF9yZXBseSwgMCk7CisgIGlmIChVTkxJS0VMWShfYWlkbF9yZXRfc3RhdHVzID09IDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTiAmJiBJQ2FsbGJhY2s6OmdldERlZmF1bHRJbXBsKCkpKSB7CisgICAgIHJldHVybiBJQ2FsbGJhY2s6OmdldERlZmF1bHRJbXBsKCktPmRvbmUoc3RhdHVzKTsKKyAgfQorICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLnJlYWRGcm9tUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgaWYgKCFfYWlkbF9zdGF0dXMuaXNPaygpKSB7CisgICAgcmV0dXJuIF9haWRsX3N0YXR1czsKKyAgfQorICBfYWlkbF9lcnJvcjoKKyAgX2FpZGxfc3RhdHVzLnNldEZyb21TdGF0dXNUKF9haWRsX3JldF9zdGF0dXMpOworICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorCit9ICAvLyBuYW1lc3BhY2UgbmVzdGVkCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvSU5lc3RlZFNlcnZpY2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8YmluZGVyL1N0YWJpbGl0eS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworbmFtZXNwYWNlIG5lc3RlZCB7CisKK0lOZXN0ZWRTZXJ2aWNlOjpCbkNhbGxiYWNrOjpCbkNhbGxiYWNrKCkKK3sKKyAgOjphbmRyb2lkOjppbnRlcm5hbDo6U3RhYmlsaXR5OjptYXJrQ29tcGlsYXRpb25Vbml0KHRoaXMpOworfQorCis6OmFuZHJvaWQ6OnN0YXR1c190IElOZXN0ZWRTZXJ2aWNlOjpCbkNhbGxiYWNrOjpvblRyYW5zYWN0KHVpbnQzMl90IF9haWRsX2NvZGUsIGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsJiBfYWlkbF9kYXRhLCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcmVwbHksIHVpbnQzMl90IF9haWRsX2ZsYWdzKSB7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIHN3aXRjaCAoX2FpZGxfY29kZSkgeworICBjYXNlIEJuQ2FsbGJhY2s6OlRSQU5TQUNUSU9OX2RvbmU6CisgIHsKKyAgICA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OlBhcmNlbGFibGVXaXRoTmVzdGVkOjpTdGF0dXMgaW5fc3RhdHVzOworICAgIGlmICghKF9haWRsX2RhdGEuY2hlY2tJbnRlcmZhY2UodGhpcykpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpCQURfVFlQRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS5yZWFkQnl0ZShyZWludGVycHJldF9jYXN0PGludDhfdCAqPigmaW5fc3RhdHVzKSk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChhdXRvIHN0ID0gX2FpZGxfZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsgIXN0LmlzT2soKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IHN0LndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzKGRvbmUoaW5fc3RhdHVzKSk7CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKCFfYWlkbF9zdGF0dXMuaXNPaygpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgYnJlYWs7CisgIGRlZmF1bHQ6CisgIHsKKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpCQmluZGVyOjpvblRyYW5zYWN0KF9haWRsX2NvZGUsIF9haWRsX2RhdGEsIF9haWRsX3JlcGx5LCBfYWlkbF9mbGFncyk7CisgIH0KKyAgYnJlYWs7CisgIH0KKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgPT0gOjphbmRyb2lkOjpVTkVYUEVDVEVEX05VTEwpIHsKKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbUV4Y2VwdGlvbkNvZGUoOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6RVhfTlVMTF9QT0lOVEVSKS53cml0ZU92ZXJQYXJjZWwoX2FpZGxfcmVwbHkpOworICB9CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorCit9ICAvLyBuYW1lc3BhY2UgbmVzdGVkCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvSU5lc3RlZFNlcnZpY2UuY3BwLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9JTmVzdGVkU2VydmljZS5jcHAuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDE3N2QzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvSU5lc3RlZFNlcnZpY2UuY3BwLmQKQEAgLTAsMCArMSwzIEBACitvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0lOZXN0ZWRTZXJ2aWNlLmNwcCA6IFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9JTmVzdGVkU2VydmljZS5haWRsIFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9QYXJjZWxhYmxlV2l0aE5lc3RlZC5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9QYXJjZWxhYmxlV2l0aE5lc3RlZC5jcHAgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9QYXJjZWxhYmxlV2l0aE5lc3RlZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRhNTE1ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL1BhcmNlbGFibGVXaXRoTmVzdGVkLmNwcApAQCAtMCwwICsxLDQ2IEBACisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9QYXJjZWxhYmxlV2l0aE5lc3RlZC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworbmFtZXNwYWNlIG5lc3RlZCB7Cis6OmFuZHJvaWQ6OnN0YXR1c190IFBhcmNlbGFibGVXaXRoTmVzdGVkOjpyZWFkRnJvbVBhcmNlbChjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSB7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIHNpemVfdCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPSAwOworICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkSW50MzIoJl9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPCA0KSByZXR1cm4gOjphbmRyb2lkOjpCQURfVkFMVUU7CisgIHNpemVfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUpOworICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gU0laRV9NQVggLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkQnl0ZShyZWludGVycHJldF9jYXN0PGludDhfdCAqPigmc3RhdHVzKSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KKzo6YW5kcm9pZDo6c3RhdHVzX3QgUGFyY2VsYWJsZVdpdGhOZXN0ZWQ6OndyaXRlVG9QYXJjZWwoOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgeworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICBhdXRvIF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgIF9haWRsX3BhcmNlbC0+d3JpdGVJbnQzMigwKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVCeXRlKHN0YXRpY19jYXN0PGludDhfdD4oc3RhdHVzKSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBhdXRvIF9haWRsX2VuZF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MpOworICBfYWlkbF9wYXJjZWwtPndyaXRlSW50MzIoX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX2VuZF9wb3MpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KK30gIC8vIG5hbWVzcGFjZSBuZXN0ZWQKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9QYXJjZWxhYmxlV2l0aE5lc3RlZC5jcHAuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL1BhcmNlbGFibGVXaXRoTmVzdGVkLmNwcC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0YzIxZjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9QYXJjZWxhYmxlV2l0aE5lc3RlZC5jcHAuZApAQCAtMCwwICsxLDIgQEAKK291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvUGFyY2VsYWJsZVdpdGhOZXN0ZWQuY3BwIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL1BhcmNlbGFibGVXaXRoTmVzdGVkLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL0VudW1Vbmlvbi5jcHAgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9FbnVtVW5pb24uY3BwCmluZGV4IDljMzQ5M2EuLjAyNjFmMjUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL0VudW1Vbmlvbi5jcHAKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvRW51bVVuaW9uLmNwcApAQCAtMSwxOCArMSwxNCBAQAogI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvRW51bVVuaW9uLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogbmFtZXNwYWNlIGFpZGwgewotCiBuYW1lc3BhY2UgdGVzdHMgewotCiBuYW1lc3BhY2UgdW5pb25zIHsKLQogOjphbmRyb2lkOjpzdGF0dXNfdCBFbnVtVW5pb246OnJlYWRGcm9tUGFyY2VsKGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIHsKICAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzOwogICBpbnQzMl90IF9haWRsX3RhZzsKICAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkSW50MzIoJl9haWRsX3RhZykpICE9IDo6YW5kcm9pZDo6T0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotICBzd2l0Y2ggKF9haWRsX3RhZykgeworICBzd2l0Y2ggKHN0YXRpY19jYXN0PFRhZz4oX2FpZGxfdGFnKSkgewogICBjYXNlIGludEVudW06IHsKICAgICA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtIF9haWRsX3ZhbHVlOwogICAgIGlmICgoX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEludDMyKHJlaW50ZXJwcmV0X2Nhc3Q8aW50MzJfdCAqPigmX2FpZGxfdmFsdWUpKSkgIT0gOjphbmRyb2lkOjpPSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CkBAIC0zMywyNCArMjksMzYgQEAKICAgICAgIHNldDxsb25nRW51bT4oc3RkOjptb3ZlKF9haWRsX3ZhbHVlKSk7CiAgICAgfQogICAgIHJldHVybiA6OmFuZHJvaWQ6Ok9LOyB9CisgICNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCisgICNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2RlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIgorICBjYXNlIGRlcHJlY2F0ZWRGaWVsZDogeworICAgIGludDMyX3QgX2FpZGxfdmFsdWU7CisgICAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkSW50MzIoJl9haWRsX3ZhbHVlKSkgIT0gOjphbmRyb2lkOjpPSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgICAgaWYgY29uc3RleHByIChzdGQ6OmlzX3RyaXZpYWxseV9jb3B5YWJsZV92PGludDMyX3Q+KSB7CisgICAgICBzZXQ8ZGVwcmVjYXRlZEZpZWxkPihfYWlkbF92YWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIE5PTElOVE5FWFRMSU5FKHBlcmZvcm1hbmNlLW1vdmUtY29uc3QtYXJnKQorICAgICAgc2V0PGRlcHJlY2F0ZWRGaWVsZD4oc3RkOjptb3ZlKF9haWRsX3ZhbHVlKSk7CisgICAgfQorICAgIHJldHVybiA6OmFuZHJvaWQ6Ok9LOyB9CisgICNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKICAgfQogICByZXR1cm4gOjphbmRyb2lkOjpCQURfVkFMVUU7CiB9Ci0KIDo6YW5kcm9pZDo6c3RhdHVzX3QgRW51bVVuaW9uOjp3cml0ZVRvUGFyY2VsKDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IHsKLSAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUludDMyKGdldFRhZygpKTsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KGdldFRhZygpKSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IDo6YW5kcm9pZDo6T0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwogICBzd2l0Y2ggKGdldFRhZygpKSB7CiAgIGNhc2UgaW50RW51bTogcmV0dXJuIF9haWRsX3BhcmNlbC0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90PihnZXQ8aW50RW51bT4oKSkpOwogICBjYXNlIGxvbmdFbnVtOiByZXR1cm4gX2FpZGxfcGFyY2VsLT53cml0ZUludDY0KHN0YXRpY19jYXN0PGludDY0X3Q+KGdldDxsb25nRW51bT4oKSkpOworICAjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorICAjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdkZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIKKyAgY2FzZSBkZXByZWNhdGVkRmllbGQ6IHJldHVybiBfYWlkbF9wYXJjZWwtPndyaXRlSW50MzIoZ2V0PGRlcHJlY2F0ZWRGaWVsZD4oKSk7CisgICNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKICAgfQogICBfX2Fzc2VydDIoX19GSUxFX18sIF9fTElORV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fLCAiY2FuJ3QgcmVhY2ggaGVyZSIpOwogfQotCiB9ICAvLyBuYW1lc3BhY2UgdW5pb25zCi0KIH0gIC8vIG5hbWVzcGFjZSB0ZXN0cwotCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvVW5pb25JblVuaW9uLmNwcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL1VuaW9uSW5Vbmlvbi5jcHAKaW5kZXggODI2OGRlOC4uMTAwZGRhMiAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvVW5pb25JblVuaW9uLmNwcAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9VbmlvbkluVW5pb24uY3BwCkBAIC0xLDE4ICsxLDE0IEBACiAjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9VbmlvbkluVW5pb24uaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotCiBuYW1lc3BhY2UgYWlkbCB7Ci0KIG5hbWVzcGFjZSB0ZXN0cyB7Ci0KIG5hbWVzcGFjZSB1bmlvbnMgewotCiA6OmFuZHJvaWQ6OnN0YXR1c190IFVuaW9uSW5Vbmlvbjo6cmVhZEZyb21QYXJjZWwoY29uc3QgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgewogICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXM7CiAgIGludDMyX3QgX2FpZGxfdGFnOwogICBpZiAoKF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRJbnQzMigmX2FpZGxfdGFnKSkgIT0gOjphbmRyb2lkOjpPSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIHN3aXRjaCAoX2FpZGxfdGFnKSB7CisgIHN3aXRjaCAoc3RhdGljX2Nhc3Q8VGFnPihfYWlkbF90YWcpKSB7CiAgIGNhc2UgZmlyc3Q6IHsKICAgICA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjp1bmlvbnM6OkVudW1VbmlvbiBfYWlkbF92YWx1ZTsKICAgICBpZiAoKF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRQYXJjZWxhYmxlKCZfYWlkbF92YWx1ZSkpICE9IDo6YW5kcm9pZDo6T0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwpAQCAtMzYsOSArMzIsOCBAQAogICB9CiAgIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKIH0KLQogOjphbmRyb2lkOjpzdGF0dXNfdCBVbmlvbkluVW5pb246OndyaXRlVG9QYXJjZWwoOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgewotICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlSW50MzIoZ2V0VGFnKCkpOworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4oZ2V0VGFnKCkpKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gOjphbmRyb2lkOjpPSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CiAgIHN3aXRjaCAoZ2V0VGFnKCkpIHsKICAgY2FzZSBmaXJzdDogcmV0dXJuIF9haWRsX3BhcmNlbC0+d3JpdGVQYXJjZWxhYmxlKGdldDxmaXJzdD4oKSk7CkBAIC00NiwxMSArNDEsNyBAQAogICB9CiAgIF9fYXNzZXJ0MihfX0ZJTEVfXywgX19MSU5FX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18sICJjYW4ndCByZWFjaCBoZXJlIik7CiB9Ci0KIH0gIC8vIG5hbWVzcGFjZSB1bmlvbnMKLQogfSAgLy8gbmFtZXNwYWNlIHRlc3RzCi0KIH0gIC8vIG5hbWVzcGFjZSBhaWRsCi0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9VbmlvbkluVW5pb24uY3BwLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9VbmlvbkluVW5pb24uY3BwLmQKaW5kZXggNmRmNjRiNS4uNDcwZDllYSAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvVW5pb25JblVuaW9uLmNwcC5kCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL1VuaW9uSW5Vbmlvbi5jcHAuZApAQCAtMSwzICsxLDUgQEAKIG91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvVW5pb25JblVuaW9uLmNwcCA6IFwKICAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9VbmlvbkluVW5pb24uYWlkbCBcCi0gIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvRW51bVVuaW9uLmFpZGwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9FbnVtVW5pb24uYWlkbCBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9JbnRFbnVtLmFpZGwgXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvTG9uZ0VudW0uYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0FycmF5T2ZJbnRlcmZhY2VzLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvQXJyYXlPZkludGVyZmFjZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWMwYTZjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0FycmF5T2ZJbnRlcmZhY2VzLmgKQEAgLTAsMCArMSwzMDggQEAKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL0FycmF5T2ZJbnRlcmZhY2VzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfdG9fc3RyaW5nLmg+CisjaW5jbHVkZSA8YXJyYXk+CisjaW5jbHVkZSA8YmluZGVyL0VudW1zLmg+CisjaW5jbHVkZSA8YmluZGVyL0lCaW5kZXIuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxiaW5kZXIvU3RhdHVzLmg+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG9wdGlvbmFsPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0dXBsZT4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorI2luY2x1ZGUgPHZhcmlhbnQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaWZuZGVmIF9fQklPTklDX18KKyNkZWZpbmUgX19hc3NlcnQyKGEsYixjLGQpICgodm9pZCkwKQorI2VuZGlmCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CitjbGFzcyBBcnJheU9mSW50ZXJmYWNlcyA6IHB1YmxpYyA6OmFuZHJvaWQ6OlBhcmNlbGFibGUgeworcHVibGljOgorICBjbGFzcyBJRW1wdHlJbnRlcmZhY2UgOiBwdWJsaWMgOjphbmRyb2lkOjpJSW50ZXJmYWNlIHsKKyAgcHVibGljOgorICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoRW1wdHlJbnRlcmZhY2UpCisgIH07ICAvLyBjbGFzcyBJRW1wdHlJbnRlcmZhY2UKKworICBjbGFzcyBJRW1wdHlJbnRlcmZhY2VEZWZhdWx0IDogcHVibGljIElFbXB0eUludGVyZmFjZSB7CisgIHB1YmxpYzoKKyAgICA6OmFuZHJvaWQ6OklCaW5kZXIqIG9uQXNCaW5kZXIoKSBvdmVycmlkZSB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgIH07ICAvLyBjbGFzcyBJRW1wdHlJbnRlcmZhY2VEZWZhdWx0CisgIGNsYXNzIEJwRW1wdHlJbnRlcmZhY2UgOiBwdWJsaWMgOjphbmRyb2lkOjpCcEludGVyZmFjZTxJRW1wdHlJbnRlcmZhY2U+IHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IEJwRW1wdHlJbnRlcmZhY2UoY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+JiBfYWlkbF9pbXBsKTsKKyAgICB2aXJ0dWFsIH5CcEVtcHR5SW50ZXJmYWNlKCkgPSBkZWZhdWx0OworICB9OyAgLy8gY2xhc3MgQnBFbXB0eUludGVyZmFjZQorICBjbGFzcyBCbkVtcHR5SW50ZXJmYWNlIDogcHVibGljIDo6YW5kcm9pZDo6Qm5JbnRlcmZhY2U8SUVtcHR5SW50ZXJmYWNlPiB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBCbkVtcHR5SW50ZXJmYWNlKCk7CisgICAgOjphbmRyb2lkOjpzdGF0dXNfdCBvblRyYW5zYWN0KHVpbnQzMl90IF9haWRsX2NvZGUsIGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsJiBfYWlkbF9kYXRhLCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcmVwbHksIHVpbnQzMl90IF9haWRsX2ZsYWdzKSBvdmVycmlkZTsKKyAgfTsgIC8vIGNsYXNzIEJuRW1wdHlJbnRlcmZhY2UKKworICBjbGFzcyBJRW1wdHlJbnRlcmZhY2VEZWxlZ2F0b3IgOiBwdWJsaWMgQm5FbXB0eUludGVyZmFjZSB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBJRW1wdHlJbnRlcmZhY2VEZWxlZ2F0b3IoOjphbmRyb2lkOjpzcDxJRW1wdHlJbnRlcmZhY2U+ICZpbXBsKSA6IF9haWRsX2RlbGVnYXRlKGltcGwpIHt9CisKKyAgcHJpdmF0ZToKKyAgICA6OmFuZHJvaWQ6OnNwPElFbXB0eUludGVyZmFjZT4gX2FpZGxfZGVsZWdhdGU7CisgIH07ICAvLyBjbGFzcyBJRW1wdHlJbnRlcmZhY2VEZWxlZ2F0b3IKKyAgY2xhc3MgSU15SW50ZXJmYWNlIDogcHVibGljIDo6YW5kcm9pZDo6SUludGVyZmFjZSB7CisgIHB1YmxpYzoKKyAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKE15SW50ZXJmYWNlKQorICAgIHZpcnR1YWwgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBtZXRob2RXaXRoSW50ZXJmYWNlcyhjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+JiBpZmFjZSwgY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPiYgbnVsbGFibGVfaWZhY2UsIGNvbnN0IDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4mIGlmYWNlX2FycmF5X2luLCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+KiBpZmFjZV9hcnJheV9vdXQsIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4qIGlmYWNlX2FycmF5X2lub3V0LCBjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4mIG51bGxhYmxlX2lmYWNlX2FycmF5X2luLCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4qIG51bGxhYmxlX2lmYWNlX2FycmF5X291dCwgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+KiBudWxsYWJsZV9pZmFjZV9hcnJheV9pbm91dCwgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+KiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgfTsgIC8vIGNsYXNzIElNeUludGVyZmFjZQorCisgIGNsYXNzIElNeUludGVyZmFjZURlZmF1bHQgOiBwdWJsaWMgSU15SW50ZXJmYWNlIHsKKyAgcHVibGljOgorICAgIDo6YW5kcm9pZDo6SUJpbmRlciogb25Bc0JpbmRlcigpIG92ZXJyaWRlIHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIG1ldGhvZFdpdGhJbnRlcmZhY2VzKGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4mIC8qaWZhY2UqLywgY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPiYgLypudWxsYWJsZV9pZmFjZSovLCBjb25zdCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+JiAvKmlmYWNlX2FycmF5X2luKi8sIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4qIC8qaWZhY2VfYXJyYXlfb3V0Ki8sIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4qIC8qaWZhY2VfYXJyYXlfaW5vdXQqLywgY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+JiAvKm51bGxhYmxlX2lmYWNlX2FycmF5X2luKi8sIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PiogLypudWxsYWJsZV9pZmFjZV9hcnJheV9vdXQqLywgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+KiAvKm51bGxhYmxlX2lmYWNlX2FycmF5X2lub3V0Ki8sIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PiogLypfYWlkbF9yZXR1cm4qLykgb3ZlcnJpZGUgeworICAgICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTik7CisgICAgfQorICB9OyAgLy8gY2xhc3MgSU15SW50ZXJmYWNlRGVmYXVsdAorICBjbGFzcyBCcE15SW50ZXJmYWNlIDogcHVibGljIDo6YW5kcm9pZDo6QnBJbnRlcmZhY2U8SU15SW50ZXJmYWNlPiB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBCcE15SW50ZXJmYWNlKGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiYgX2FpZGxfaW1wbCk7CisgICAgdmlydHVhbCB+QnBNeUludGVyZmFjZSgpID0gZGVmYXVsdDsKKyAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIG1ldGhvZFdpdGhJbnRlcmZhY2VzKGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4mIGlmYWNlLCBjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+JiBudWxsYWJsZV9pZmFjZSwgY29uc3QgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+PiYgaWZhY2VfYXJyYXlfaW4sIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4qIGlmYWNlX2FycmF5X291dCwgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+PiogaWZhY2VfYXJyYXlfaW5vdXQsIGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PiYgbnVsbGFibGVfaWZhY2VfYXJyYXlfaW4sIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PiogbnVsbGFibGVfaWZhY2VfYXJyYXlfb3V0LCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4qIG51bGxhYmxlX2lmYWNlX2FycmF5X2lub3V0LCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIH07ICAvLyBjbGFzcyBCcE15SW50ZXJmYWNlCisgIGNsYXNzIEJuTXlJbnRlcmZhY2UgOiBwdWJsaWMgOjphbmRyb2lkOjpCbkludGVyZmFjZTxJTXlJbnRlcmZhY2U+IHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fbWV0aG9kV2l0aEludGVyZmFjZXMgPSA6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAwOworICAgIGV4cGxpY2l0IEJuTXlJbnRlcmZhY2UoKTsKKyAgICA6OmFuZHJvaWQ6OnN0YXR1c190IG9uVHJhbnNhY3QodWludDMyX3QgX2FpZGxfY29kZSwgY29uc3QgOjphbmRyb2lkOjpQYXJjZWwmIF9haWRsX2RhdGEsIDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9yZXBseSwgdWludDMyX3QgX2FpZGxfZmxhZ3MpIG92ZXJyaWRlOworICB9OyAgLy8gY2xhc3MgQm5NeUludGVyZmFjZQorCisgIGNsYXNzIElNeUludGVyZmFjZURlbGVnYXRvciA6IHB1YmxpYyBCbk15SW50ZXJmYWNlIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IElNeUludGVyZmFjZURlbGVnYXRvcig6OmFuZHJvaWQ6OnNwPElNeUludGVyZmFjZT4gJmltcGwpIDogX2FpZGxfZGVsZWdhdGUoaW1wbCkge30KKworICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgbWV0aG9kV2l0aEludGVyZmFjZXMoY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPiYgaWZhY2UsIGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4mIG51bGxhYmxlX2lmYWNlLCBjb25zdCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+JiBpZmFjZV9hcnJheV9pbiwgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+PiogaWZhY2VfYXJyYXlfb3V0LCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+KiBpZmFjZV9hcnJheV9pbm91dCwgY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+JiBudWxsYWJsZV9pZmFjZV9hcnJheV9pbiwgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+KiBudWxsYWJsZV9pZmFjZV9hcnJheV9vdXQsIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PiogbnVsbGFibGVfaWZhY2VfYXJyYXlfaW5vdXQsIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPm1ldGhvZFdpdGhJbnRlcmZhY2VzKGlmYWNlLCBudWxsYWJsZV9pZmFjZSwgaWZhY2VfYXJyYXlfaW4sIGlmYWNlX2FycmF5X291dCwgaWZhY2VfYXJyYXlfaW5vdXQsIG51bGxhYmxlX2lmYWNlX2FycmF5X2luLCBudWxsYWJsZV9pZmFjZV9hcnJheV9vdXQsIG51bGxhYmxlX2lmYWNlX2FycmF5X2lub3V0LCBfYWlkbF9yZXR1cm4pOworICAgIH0KKyAgcHJpdmF0ZToKKyAgICA6OmFuZHJvaWQ6OnNwPElNeUludGVyZmFjZT4gX2FpZGxfZGVsZWdhdGU7CisgIH07ICAvLyBjbGFzcyBJTXlJbnRlcmZhY2VEZWxlZ2F0b3IKKyAgY2xhc3MgTXlQYXJjZWxhYmxlIDogcHVibGljIDo6YW5kcm9pZDo6UGFyY2VsYWJsZSB7CisgIHB1YmxpYzoKKyAgICA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+IGlmYWNlOworICAgIDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4gbnVsbGFibGVfaWZhY2U7CisgICAgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+PiBpZmFjZV9hcnJheTsKKyAgICA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4gbnVsbGFibGVfaWZhY2VfYXJyYXk7CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBNeVBhcmNlbGFibGUmIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKGlmYWNlLCBudWxsYWJsZV9pZmFjZSwgaWZhY2VfYXJyYXksIG51bGxhYmxlX2lmYWNlX2FycmF5KSAhPSBzdGQ6OnRpZShyaHMuaWZhY2UsIHJocy5udWxsYWJsZV9pZmFjZSwgcmhzLmlmYWNlX2FycmF5LCByaHMubnVsbGFibGVfaWZhY2VfYXJyYXkpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgTXlQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZShpZmFjZSwgbnVsbGFibGVfaWZhY2UsIGlmYWNlX2FycmF5LCBudWxsYWJsZV9pZmFjZV9hcnJheSkgPCBzdGQ6OnRpZShyaHMuaWZhY2UsIHJocy5udWxsYWJsZV9pZmFjZSwgcmhzLmlmYWNlX2FycmF5LCByaHMubnVsbGFibGVfaWZhY2VfYXJyYXkpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IE15UGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoaWZhY2UsIG51bGxhYmxlX2lmYWNlLCBpZmFjZV9hcnJheSwgbnVsbGFibGVfaWZhY2VfYXJyYXkpIDw9IHN0ZDo6dGllKHJocy5pZmFjZSwgcmhzLm51bGxhYmxlX2lmYWNlLCByaHMuaWZhY2VfYXJyYXksIHJocy5udWxsYWJsZV9pZmFjZV9hcnJheSk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgTXlQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZShpZmFjZSwgbnVsbGFibGVfaWZhY2UsIGlmYWNlX2FycmF5LCBudWxsYWJsZV9pZmFjZV9hcnJheSkgPT0gc3RkOjp0aWUocmhzLmlmYWNlLCByaHMubnVsbGFibGVfaWZhY2UsIHJocy5pZmFjZV9hcnJheSwgcmhzLm51bGxhYmxlX2lmYWNlX2FycmF5KTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IE15UGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoaWZhY2UsIG51bGxhYmxlX2lmYWNlLCBpZmFjZV9hcnJheSwgbnVsbGFibGVfaWZhY2VfYXJyYXkpID4gc3RkOjp0aWUocmhzLmlmYWNlLCByaHMubnVsbGFibGVfaWZhY2UsIHJocy5pZmFjZV9hcnJheSwgcmhzLm51bGxhYmxlX2lmYWNlX2FycmF5KTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBNeVBhcmNlbGFibGUmIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKGlmYWNlLCBudWxsYWJsZV9pZmFjZSwgaWZhY2VfYXJyYXksIG51bGxhYmxlX2lmYWNlX2FycmF5KSA+PSBzdGQ6OnRpZShyaHMuaWZhY2UsIHJocy5udWxsYWJsZV9pZmFjZSwgcmhzLmlmYWNlX2FycmF5LCByaHMubnVsbGFibGVfaWZhY2VfYXJyYXkpOworICAgIH0KKworICAgIDo6YW5kcm9pZDo6c3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgZmluYWw7CisgICAgOjphbmRyb2lkOjpzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IGZpbmFsOworICAgIHN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiBnZXRQYXJjZWxhYmxlRGVzY3JpcHRvcigpIHsKKyAgICAgIHN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0YXRpY1N0cmluZzE2IERFU0NJUFRPUiAodSJhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuTXlQYXJjZWxhYmxlIik7CisgICAgICByZXR1cm4gREVTQ0lQVE9SOworICAgIH0KKyAgICBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7CisgICAgICBvcyA8PCAiTXlQYXJjZWxhYmxleyI7CisgICAgICBvcyA8PCAiaWZhY2U6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaWZhY2UpOworICAgICAgb3MgPDwgIiwgbnVsbGFibGVfaWZhY2U6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcobnVsbGFibGVfaWZhY2UpOworICAgICAgb3MgPDwgIiwgaWZhY2VfYXJyYXk6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaWZhY2VfYXJyYXkpOworICAgICAgb3MgPDwgIiwgbnVsbGFibGVfaWZhY2VfYXJyYXk6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcobnVsbGFibGVfaWZhY2VfYXJyYXkpOworICAgICAgb3MgPDwgIn0iOworICAgICAgcmV0dXJuIG9zLnN0cigpOworICAgIH0KKyAgfTsgIC8vIGNsYXNzIE15UGFyY2VsYWJsZQorICBjbGFzcyBNeVVuaW9uIDogcHVibGljIDo6YW5kcm9pZDo6UGFyY2VsYWJsZSB7CisgIHB1YmxpYzoKKyAgICBlbnVtIGNsYXNzIFRhZyA6IGludDMyX3QgeworICAgICAgaWZhY2UgPSAwLAorICAgICAgbnVsbGFibGVfaWZhY2UgPSAxLAorICAgICAgaWZhY2VfYXJyYXkgPSAyLAorICAgICAgbnVsbGFibGVfaWZhY2VfYXJyYXkgPSAzLAorICAgIH07CisgICAgLy8gRXhwb3NlIHRhZyBzeW1ib2xzIGZvciBsZWdhY3kgY29kZQorICAgIHN0YXRpYyBjb25zdCBpbmxpbmUgVGFnIGlmYWNlID0gVGFnOjppZmFjZTsKKyAgICBzdGF0aWMgY29uc3QgaW5saW5lIFRhZyBudWxsYWJsZV9pZmFjZSA9IFRhZzo6bnVsbGFibGVfaWZhY2U7CisgICAgc3RhdGljIGNvbnN0IGlubGluZSBUYWcgaWZhY2VfYXJyYXkgPSBUYWc6OmlmYWNlX2FycmF5OworICAgIHN0YXRpYyBjb25zdCBpbmxpbmUgVGFnIG51bGxhYmxlX2lmYWNlX2FycmF5ID0gVGFnOjpudWxsYWJsZV9pZmFjZV9hcnJheTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgX25vdF9zZWxmID0gIXN0ZDo6aXNfc2FtZV92PHN0ZDo6cmVtb3ZlX2N2X3Q8c3RkOjpyZW1vdmVfcmVmZXJlbmNlX3Q8X1RwPj4sIE15VW5pb24+OworCisgICAgTXlVbmlvbigpIDogX3ZhbHVlKHN0ZDo6aW5fcGxhY2VfaW5kZXg8c3RhdGljX2Nhc3Q8c2l6ZV90PihpZmFjZSk+LCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+KCkpIHsgfQorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgPSBzdGQ6OmVuYWJsZV9pZl90PF9ub3Rfc2VsZjxfVHA+Pj4KKyAgICAvLyBOT0xJTlRORVhUTElORShnb29nbGUtZXhwbGljaXQtY29uc3RydWN0b3IpCisgICAgY29uc3RleHByIE15VW5pb24oX1RwJiYgX2FyZykKKyAgICAgICAgOiBfdmFsdWUoc3RkOjpmb3J3YXJkPF9UcD4oX2FyZykpIHt9CisKKyAgICB0ZW1wbGF0ZSA8c2l6ZV90IF9OcCwgdHlwZW5hbWUuLi4gX1RwPgorICAgIGNvbnN0ZXhwciBleHBsaWNpdCBNeVVuaW9uKHN0ZDo6aW5fcGxhY2VfaW5kZXhfdDxfTnA+LCBfVHAmJi4uLiBfYXJncykKKyAgICAgICAgOiBfdmFsdWUoc3RkOjppbl9wbGFjZV9pbmRleDxfTnA+LCBzdGQ6OmZvcndhcmQ8X1RwPihfYXJncykuLi4pIHt9CisKKyAgICB0ZW1wbGF0ZSA8VGFnIF90YWcsIHR5cGVuYW1lLi4uIF9UcD4KKyAgICBzdGF0aWMgTXlVbmlvbiBtYWtlKF9UcCYmLi4uIF9hcmdzKSB7CisgICAgICByZXR1cm4gTXlVbmlvbihzdGQ6OmluX3BsYWNlX2luZGV4PHN0YXRpY19jYXN0PHNpemVfdD4oX3RhZyk+LCBzdGQ6OmZvcndhcmQ8X1RwPihfYXJncykuLi4pOworICAgIH0KKworICAgIHRlbXBsYXRlIDxUYWcgX3RhZywgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZS4uLiBfVXA+CisgICAgc3RhdGljIE15VW5pb24gbWFrZShzdGQ6OmluaXRpYWxpemVyX2xpc3Q8X1RwPiBfaWwsIF9VcCYmLi4uIF9hcmdzKSB7CisgICAgICByZXR1cm4gTXlVbmlvbihzdGQ6OmluX3BsYWNlX2luZGV4PHN0YXRpY19jYXN0PHNpemVfdD4oX3RhZyk+LCBzdGQ6Om1vdmUoX2lsKSwgc3RkOjpmb3J3YXJkPF9VcD4oX2FyZ3MpLi4uKTsKKyAgICB9CisKKyAgICBUYWcgZ2V0VGFnKCkgY29uc3QgeworICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFRhZz4oX3ZhbHVlLmluZGV4KCkpOworICAgIH0KKworICAgIHRlbXBsYXRlIDxUYWcgX3RhZz4KKyAgICBjb25zdCBhdXRvJiBnZXQoKSBjb25zdCB7CisgICAgICBpZiAoZ2V0VGFnKCkgIT0gX3RhZykgeyBfX2Fzc2VydDIoX19GSUxFX18sIF9fTElORV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fLCAiYmFkIGFjY2VzczogYSB3cm9uZyB0YWciKTsgfQorICAgICAgcmV0dXJuIHN0ZDo6Z2V0PHN0YXRpY19jYXN0PHNpemVfdD4oX3RhZyk+KF92YWx1ZSk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPFRhZyBfdGFnPgorICAgIGF1dG8mIGdldCgpIHsKKyAgICAgIGlmIChnZXRUYWcoKSAhPSBfdGFnKSB7IF9fYXNzZXJ0MihfX0ZJTEVfXywgX19MSU5FX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18sICJiYWQgYWNjZXNzOiBhIHdyb25nIHRhZyIpOyB9CisgICAgICByZXR1cm4gc3RkOjpnZXQ8c3RhdGljX2Nhc3Q8c2l6ZV90PihfdGFnKT4oX3ZhbHVlKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8VGFnIF90YWcsIHR5cGVuYW1lLi4uIF9UcD4KKyAgICB2b2lkIHNldChfVHAmJi4uLiBfYXJncykgeworICAgICAgX3ZhbHVlLmVtcGxhY2U8c3RhdGljX2Nhc3Q8c2l6ZV90PihfdGFnKT4oc3RkOjpmb3J3YXJkPF9UcD4oX2FyZ3MpLi4uKTsKKyAgICB9CisKKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IE15VW5pb24mIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIF92YWx1ZSAhPSByaHMuX3ZhbHVlOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgTXlVbmlvbiYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gX3ZhbHVlIDwgcmhzLl92YWx1ZTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBNeVVuaW9uJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBfdmFsdWUgPD0gcmhzLl92YWx1ZTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBNeVVuaW9uJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBfdmFsdWUgPT0gcmhzLl92YWx1ZTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IE15VW5pb24mIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIF92YWx1ZSA+IHJocy5fdmFsdWU7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgTXlVbmlvbiYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gX3ZhbHVlID49IHJocy5fdmFsdWU7CisgICAgfQorCisgICAgOjphbmRyb2lkOjpzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBmaW5hbDsKKyAgICA6OmFuZHJvaWQ6OnN0YXR1c190IHdyaXRlVG9QYXJjZWwoOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgZmluYWw7CisgICAgc3RhdGljIGNvbnN0IDo6YW5kcm9pZDo6U3RyaW5nMTYmIGdldFBhcmNlbGFibGVEZXNjcmlwdG9yKCkgeworICAgICAgc3RhdGljIGNvbnN0IDo6YW5kcm9pZDo6U3RhdGljU3RyaW5nMTYgREVTQ0lQVE9SICh1ImFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5NeVVuaW9uIik7CisgICAgICByZXR1cm4gREVTQ0lQVE9SOworICAgIH0KKyAgICBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7CisgICAgICBvcyA8PCAiTXlVbmlvbnsiOworICAgICAgc3dpdGNoIChnZXRUYWcoKSkgeworICAgICAgY2FzZSBpZmFjZTogb3MgPDwgImlmYWNlOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGdldDxpZmFjZT4oKSk7IGJyZWFrOworICAgICAgY2FzZSBudWxsYWJsZV9pZmFjZTogb3MgPDwgIm51bGxhYmxlX2lmYWNlOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGdldDxudWxsYWJsZV9pZmFjZT4oKSk7IGJyZWFrOworICAgICAgY2FzZSBpZmFjZV9hcnJheTogb3MgPDwgImlmYWNlX2FycmF5OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGdldDxpZmFjZV9hcnJheT4oKSk7IGJyZWFrOworICAgICAgY2FzZSBudWxsYWJsZV9pZmFjZV9hcnJheTogb3MgPDwgIm51bGxhYmxlX2lmYWNlX2FycmF5OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGdldDxudWxsYWJsZV9pZmFjZV9hcnJheT4oKSk7IGJyZWFrOworICAgICAgfQorICAgICAgb3MgPDwgIn0iOworICAgICAgcmV0dXJuIG9zLnN0cigpOworICAgIH0KKyAgcHJpdmF0ZToKKyAgICBzdGQ6OnZhcmlhbnQ8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPiwgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPiwgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+PiwgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+PiBfdmFsdWU7CisgIH07ICAvLyBjbGFzcyBNeVVuaW9uCisgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgQXJyYXlPZkludGVyZmFjZXMmKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKCkgIT0gc3RkOjp0aWUoKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgQXJyYXlPZkludGVyZmFjZXMmKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKCkgPCBzdGQ6OnRpZSgpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgQXJyYXlPZkludGVyZmFjZXMmKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKCkgPD0gc3RkOjp0aWUoKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEFycmF5T2ZJbnRlcmZhY2VzJikgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZSgpID09IHN0ZDo6dGllKCk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IEFycmF5T2ZJbnRlcmZhY2VzJikgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZSgpID4gc3RkOjp0aWUoKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IEFycmF5T2ZJbnRlcmZhY2VzJikgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZSgpID49IHN0ZDo6dGllKCk7CisgIH0KKworICA6OmFuZHJvaWQ6OnN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGZpbmFsOworICA6OmFuZHJvaWQ6OnN0YXR1c190IHdyaXRlVG9QYXJjZWwoOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgZmluYWw7CisgIHN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiBnZXRQYXJjZWxhYmxlRGVzY3JpcHRvcigpIHsKKyAgICBzdGF0aWMgY29uc3QgOjphbmRyb2lkOjpTdGF0aWNTdHJpbmcxNiBERVNDSVBUT1IgKHUiYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzIik7CisgICAgcmV0dXJuIERFU0NJUFRPUjsKKyAgfQorICBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOworICAgIG9zIDw8ICJBcnJheU9mSW50ZXJmYWNlc3siOworICAgIG9zIDw8ICJ9IjsKKyAgICByZXR1cm4gb3Muc3RyKCk7CisgIH0KK307ICAvLyBjbGFzcyBBcnJheU9mSW50ZXJmYWNlcworfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CitbW25vZGlzY2FyZF1dIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoQXJyYXlPZkludGVyZmFjZXM6Ok15VW5pb246OlRhZyB2YWwpIHsKKyAgc3dpdGNoKHZhbCkgeworICBjYXNlIEFycmF5T2ZJbnRlcmZhY2VzOjpNeVVuaW9uOjpUYWc6OmlmYWNlOgorICAgIHJldHVybiAiaWZhY2UiOworICBjYXNlIEFycmF5T2ZJbnRlcmZhY2VzOjpNeVVuaW9uOjpUYWc6Om51bGxhYmxlX2lmYWNlOgorICAgIHJldHVybiAibnVsbGFibGVfaWZhY2UiOworICBjYXNlIEFycmF5T2ZJbnRlcmZhY2VzOjpNeVVuaW9uOjpUYWc6OmlmYWNlX2FycmF5OgorICAgIHJldHVybiAiaWZhY2VfYXJyYXkiOworICBjYXNlIEFycmF5T2ZJbnRlcmZhY2VzOjpNeVVuaW9uOjpUYWc6Om51bGxhYmxlX2lmYWNlX2FycmF5OgorICAgIHJldHVybiAibnVsbGFibGVfaWZhY2VfYXJyYXkiOworICBkZWZhdWx0OgorICAgIHJldHVybiBzdGQ6OnRvX3N0cmluZyhzdGF0aWNfY2FzdDxpbnQzMl90Pih2YWwpKTsKKyAgfQorfQorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XYysrMTctZXh0ZW5zaW9ucyIKK3RlbXBsYXRlIDw+Citjb25zdGV4cHIgaW5saW5lIHN0ZDo6YXJyYXk8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6Ok15VW5pb246OlRhZywgND4gZW51bV92YWx1ZXM8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6Ok15VW5pb246OlRhZz4gPSB7CisgIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpNeVVuaW9uOjpUYWc6OmlmYWNlLAorICA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6TXlVbmlvbjo6VGFnOjpudWxsYWJsZV9pZmFjZSwKKyAgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6Ok15VW5pb246OlRhZzo6aWZhY2VfYXJyYXksCisgIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpNeVVuaW9uOjpUYWc6Om51bGxhYmxlX2lmYWNlX2FycmF5LAorfTsKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9CYWNrZW5kVHlwZS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0JhY2tlbmRUeXBlLmgKaW5kZXggYTg3ZGMyZS4uNWZhMmEyOSAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0JhY2tlbmRUeXBlLmgKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0JhY2tlbmRUeXBlLmgKQEAgLTYsMTggKzYsMjAgQEAKICNpbmNsdWRlIDxzdHJpbmc+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogbmFtZXNwYWNlIGFpZGwgewotCiBuYW1lc3BhY2UgdGVzdHMgewotCiBlbnVtIGNsYXNzIEJhY2tlbmRUeXBlIDogaW50OF90IHsKICAgQ1BQID0gMCwKICAgSkFWQSA9IDEsCiAgIE5ESyA9IDIsCiAgIFJVU1QgPSAzLAogfTsKLQorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CiBbW25vZGlzY2FyZF1dIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoQmFja2VuZFR5cGUgdmFsKSB7CiAgIHN3aXRjaCh2YWwpIHsKICAgY2FzZSBCYWNrZW5kVHlwZTo6Q1BQOgpAQCAtMzIsMTYgKzM0LDExIEBACiAgICAgcmV0dXJuIHN0ZDo6dG9fc3RyaW5nKHN0YXRpY19jYXN0PGludDhfdD4odmFsKSk7CiAgIH0KIH0KLQogfSAgLy8gbmFtZXNwYWNlIHRlc3RzCi0KIH0gIC8vIG5hbWVzcGFjZSBhaWRsCi0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIG5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KICNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCiAjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdjKysxNy1leHRlbnNpb25zIgogdGVtcGxhdGUgPD4KQEAgLTUyLDcgKzQ5LDUgQEAKICAgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QmFja2VuZFR5cGU6OlJVU1QsCiB9OwogI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAotCiB9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9CbkFycmF5T2ZJbnRlcmZhY2VzLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvQm5BcnJheU9mSW50ZXJmYWNlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNzJhYTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvQm5BcnJheU9mSW50ZXJmYWNlcy5oCkBAIC0wLDAgKzEgQEAKKyNlcnJvciBUT0RPKGIvMTExMzYyNTkzKSBwYXJjZWxhYmxlcyBkbyBub3QgaGF2ZSBibiBjbGFzc2VzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0JuRGVwcmVjYXRlZC5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0JuRGVwcmVjYXRlZC5oCmluZGV4IGZjODJkOGIuLjM2ZjQyZWYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9CbkRlcHJlY2F0ZWQuaAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvQm5EZXByZWNhdGVkLmgKQEAgLTQsMTkgKzQsMjEgQEAKICNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvSURlcHJlY2F0ZWQuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotCiBuYW1lc3BhY2UgYWlkbCB7Ci0KIG5hbWVzcGFjZSB0ZXN0cyB7Ci0KIGNsYXNzIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQoInRlc3QiKSkpIEJuRGVwcmVjYXRlZCA6IHB1YmxpYyA6OmFuZHJvaWQ6OkJuSW50ZXJmYWNlPElEZXByZWNhdGVkPiB7CiBwdWJsaWM6CiAgIGV4cGxpY2l0IEJuRGVwcmVjYXRlZCgpOwogICA6OmFuZHJvaWQ6OnN0YXR1c190IG9uVHJhbnNhY3QodWludDMyX3QgX2FpZGxfY29kZSwgY29uc3QgOjphbmRyb2lkOjpQYXJjZWwmIF9haWRsX2RhdGEsIDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9yZXBseSwgdWludDMyX3QgX2FpZGxfZmxhZ3MpIG92ZXJyaWRlOwogfTsgIC8vIGNsYXNzIEJuRGVwcmVjYXRlZAogCitjbGFzcyBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKCJ0ZXN0IikpKSBJRGVwcmVjYXRlZERlbGVnYXRvciA6IHB1YmxpYyBCbkRlcHJlY2F0ZWQgeworcHVibGljOgorICBleHBsaWNpdCBJRGVwcmVjYXRlZERlbGVnYXRvcig6OmFuZHJvaWQ6OnNwPElEZXByZWNhdGVkPiAmaW1wbCkgOiBfYWlkbF9kZWxlZ2F0ZShpbXBsKSB7fQorCitwcml2YXRlOgorICA6OmFuZHJvaWQ6OnNwPElEZXByZWNhdGVkPiBfYWlkbF9kZWxlZ2F0ZTsKK307ICAvLyBjbGFzcyBJRGVwcmVjYXRlZERlbGVnYXRvcgogfSAgLy8gbmFtZXNwYWNlIHRlc3RzCi0KIH0gIC8vIG5hbWVzcGFjZSBhaWRsCi0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvQm5GaXhlZFNpemUuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9CbkZpeGVkU2l6ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNzJhYTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvQm5GaXhlZFNpemUuaApAQCAtMCwwICsxIEBACisjZXJyb3IgVE9ETyhiLzExMTM2MjU5MykgcGFyY2VsYWJsZXMgZG8gbm90IGhhdmUgYm4gY2xhc3NlcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9Cbkxpc3RPZkludGVyZmFjZXMuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9Cbkxpc3RPZkludGVyZmFjZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTcyYWEzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0JuTGlzdE9mSW50ZXJmYWNlcy5oCkBAIC0wLDAgKzEgQEAKKyNlcnJvciBUT0RPKGIvMTExMzYyNTkzKSBwYXJjZWxhYmxlcyBkbyBub3QgaGF2ZSBibiBjbGFzc2VzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0JuTmFtZWRDYWxsYmFjay5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0JuTmFtZWRDYWxsYmFjay5oCmluZGV4IDg1YzA0NDMuLjQwNDRkZTggMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9Cbk5hbWVkQ2FsbGJhY2suaAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvQm5OYW1lZENhbGxiYWNrLmgKQEAgLTQsMTEgKzQsOCBAQAogI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9JTmFtZWRDYWxsYmFjay5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIG5hbWVzcGFjZSBhaWRsIHsKLQogbmFtZXNwYWNlIHRlc3RzIHsKLQogY2xhc3MgQm5OYW1lZENhbGxiYWNrIDogcHVibGljIDo6YW5kcm9pZDo6Qm5JbnRlcmZhY2U8SU5hbWVkQ2FsbGJhY2s+IHsKIHB1YmxpYzoKICAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9HZXROYW1lID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMDsKQEAgLTE2LDggKzEzLDE2IEBACiAgIDo6YW5kcm9pZDo6c3RhdHVzX3Qgb25UcmFuc2FjdCh1aW50MzJfdCBfYWlkbF9jb2RlLCBjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCYgX2FpZGxfZGF0YSwgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3JlcGx5LCB1aW50MzJfdCBfYWlkbF9mbGFncykgb3ZlcnJpZGU7CiB9OyAgLy8gY2xhc3MgQm5OYW1lZENhbGxiYWNrCiAKK2NsYXNzIElOYW1lZENhbGxiYWNrRGVsZWdhdG9yIDogcHVibGljIEJuTmFtZWRDYWxsYmFjayB7CitwdWJsaWM6CisgIGV4cGxpY2l0IElOYW1lZENhbGxiYWNrRGVsZWdhdG9yKDo6YW5kcm9pZDo6c3A8SU5hbWVkQ2FsbGJhY2s+ICZpbXBsKSA6IF9haWRsX2RlbGVnYXRlKGltcGwpIHt9CisKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBHZXROYW1lKDo6YW5kcm9pZDo6U3RyaW5nMTYqIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+R2V0TmFtZShfYWlkbF9yZXR1cm4pOworICB9Citwcml2YXRlOgorICA6OmFuZHJvaWQ6OnNwPElOYW1lZENhbGxiYWNrPiBfYWlkbF9kZWxlZ2F0ZTsKK307ICAvLyBjbGFzcyBJTmFtZWRDYWxsYmFja0RlbGVnYXRvcgogfSAgLy8gbmFtZXNwYWNlIHRlc3RzCi0KIH0gIC8vIG5hbWVzcGFjZSBhaWRsCi0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvQm5OZXdOYW1lLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvQm5OZXdOYW1lLmgKaW5kZXggZmVjZjFhNi4uMGRiNjUyNCAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0JuTmV3TmFtZS5oCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9Cbk5ld05hbWUuaApAQCAtNCwxMSArNCw4IEBACiAjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL0lOZXdOYW1lLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogbmFtZXNwYWNlIGFpZGwgewotCiBuYW1lc3BhY2UgdGVzdHMgewotCiBjbGFzcyBCbk5ld05hbWUgOiBwdWJsaWMgOjphbmRyb2lkOjpCbkludGVyZmFjZTxJTmV3TmFtZT4gewogcHVibGljOgogICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlYWxOYW1lID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMDsKQEAgLTE2LDggKzEzLDE2IEBACiAgIDo6YW5kcm9pZDo6c3RhdHVzX3Qgb25UcmFuc2FjdCh1aW50MzJfdCBfYWlkbF9jb2RlLCBjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCYgX2FpZGxfZGF0YSwgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3JlcGx5LCB1aW50MzJfdCBfYWlkbF9mbGFncykgb3ZlcnJpZGU7CiB9OyAgLy8gY2xhc3MgQm5OZXdOYW1lCiAKK2NsYXNzIElOZXdOYW1lRGVsZWdhdG9yIDogcHVibGljIEJuTmV3TmFtZSB7CitwdWJsaWM6CisgIGV4cGxpY2l0IElOZXdOYW1lRGVsZWdhdG9yKDo6YW5kcm9pZDo6c3A8SU5ld05hbWU+ICZpbXBsKSA6IF9haWRsX2RlbGVnYXRlKGltcGwpIHt9CisKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZWFsTmFtZSg6OmFuZHJvaWQ6OlN0cmluZzE2KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPlJlYWxOYW1lKF9haWRsX3JldHVybik7CisgIH0KK3ByaXZhdGU6CisgIDo6YW5kcm9pZDo6c3A8SU5ld05hbWU+IF9haWRsX2RlbGVnYXRlOworfTsgIC8vIGNsYXNzIElOZXdOYW1lRGVsZWdhdG9yCiB9ICAvLyBuYW1lc3BhY2UgdGVzdHMKLQogfSAgLy8gbmFtZXNwYWNlIGFpZGwKLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9Cbk9sZE5hbWUuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9Cbk9sZE5hbWUuaAppbmRleCBhMDM4MWFjLi5hYTllM2IwIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvQm5PbGROYW1lLmgKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0JuT2xkTmFtZS5oCkBAIC00LDExICs0LDggQEAKICNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvSU9sZE5hbWUuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotCiBuYW1lc3BhY2UgYWlkbCB7Ci0KIG5hbWVzcGFjZSB0ZXN0cyB7Ci0KIGNsYXNzIEJuT2xkTmFtZSA6IHB1YmxpYyA6OmFuZHJvaWQ6OkJuSW50ZXJmYWNlPElPbGROYW1lPiB7CiBwdWJsaWM6CiAgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVhbE5hbWUgPSA6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAwOwpAQCAtMTYsOCArMTMsMTYgQEAKICAgOjphbmRyb2lkOjpzdGF0dXNfdCBvblRyYW5zYWN0KHVpbnQzMl90IF9haWRsX2NvZGUsIGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsJiBfYWlkbF9kYXRhLCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcmVwbHksIHVpbnQzMl90IF9haWRsX2ZsYWdzKSBvdmVycmlkZTsKIH07ICAvLyBjbGFzcyBCbk9sZE5hbWUKIAorY2xhc3MgSU9sZE5hbWVEZWxlZ2F0b3IgOiBwdWJsaWMgQm5PbGROYW1lIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgSU9sZE5hbWVEZWxlZ2F0b3IoOjphbmRyb2lkOjpzcDxJT2xkTmFtZT4gJmltcGwpIDogX2FpZGxfZGVsZWdhdGUoaW1wbCkge30KKworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlYWxOYW1lKDo6YW5kcm9pZDo6U3RyaW5nMTYqIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+UmVhbE5hbWUoX2FpZGxfcmV0dXJuKTsKKyAgfQorcHJpdmF0ZToKKyAgOjphbmRyb2lkOjpzcDxJT2xkTmFtZT4gX2FpZGxfZGVsZWdhdGU7Cit9OyAgLy8gY2xhc3MgSU9sZE5hbWVEZWxlZ2F0b3IKIH0gIC8vIG5hbWVzcGFjZSB0ZXN0cwotCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0JuUmVjdXJzaXZlTGlzdC5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0JuUmVjdXJzaXZlTGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNzJhYTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvQm5SZWN1cnNpdmVMaXN0LmgKQEAgLTAsMCArMSBAQAorI2Vycm9yIFRPRE8oYi8xMTEzNjI1OTMpIHBhcmNlbGFibGVzIGRvIG5vdCBoYXZlIGJuIGNsYXNzZXMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvQm5UZXN0U2VydmljZS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0JuVGVzdFNlcnZpY2UuaAppbmRleCA3MDM1NjE2Li4zY2I4YWQwIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvQm5UZXN0U2VydmljZS5oCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9CblRlc3RTZXJ2aWNlLmgKQEAgLTQsMTEgKzQsOCBAQAogI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9JVGVzdFNlcnZpY2UuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotCiBuYW1lc3BhY2UgYWlkbCB7Ci0KIG5hbWVzcGFjZSB0ZXN0cyB7Ci0KIGNsYXNzIEJuVGVzdFNlcnZpY2UgOiBwdWJsaWMgOjphbmRyb2lkOjpCbkludGVyZmFjZTxJVGVzdFNlcnZpY2U+IHsKIHB1YmxpYzoKICAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9VbmltcGxlbWVudGVkTWV0aG9kID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMDsKQEAgLTM4LDM2ICszNSwyNTQgQEAKICAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXZlcnNlTG9uZ0VudW0gPSA6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyNDsKICAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9HZXRPdGhlclRlc3RTZXJ2aWNlID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMjU7CiAgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fVmVyaWZ5TmFtZSA9IDo6YW5kcm9pZDo6SUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDI2OwotICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JldmVyc2VTdHJpbmdMaXN0ID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMjc7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0UGFyY2VsRmlsZURlc2NyaXB0b3IgPSA6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyODsKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXZlcnNlUGFyY2VsRmlsZURlc2NyaXB0b3JBcnJheSA9IDo6YW5kcm9pZDo6SUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDI5OwotICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1Rocm93U2VydmljZUV4Y2VwdGlvbiA9IDo6YW5kcm9pZDo6SUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDMwOwotICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdE51bGxhYmxlSW50QXJyYXkgPSA6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzMTsKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXBlYXROdWxsYWJsZUJ5dGVFbnVtQXJyYXkgPSA6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzMjsKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXBlYXROdWxsYWJsZUludEVudW1BcnJheSA9IDo6YW5kcm9pZDo6SUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDMzOwotICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdE51bGxhYmxlTG9uZ0VudW1BcnJheSA9IDo6YW5kcm9pZDo6SUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDM0OwotICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdE51bGxhYmxlU3RyaW5nID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzU7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0TnVsbGFibGVTdHJpbmdMaXN0ID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzY7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzc7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fVGFrZXNBbklCaW5kZXIgPSA6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzODsKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9UYWtlc0FOdWxsYWJsZUlCaW5kZXIgPSA6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzOTsKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXBlYXRVdGY4Q3BwU3RyaW5nID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDA7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0TnVsbGFibGVVdGY4Q3BwU3RyaW5nID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDE7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmV2ZXJzZVV0ZjhDcHBTdHJpbmcgPSA6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0MjsKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXZlcnNlTnVsbGFibGVVdGY4Q3BwU3RyaW5nID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDM7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmV2ZXJzZVV0ZjhDcHBTdHJpbmdMaXN0ID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDQ7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fR2V0Q2FsbGJhY2sgPSA6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0NTsKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9GaWxsT3V0U3RydWN0dXJlZFBhcmNlbGFibGUgPSA6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0NjsKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9HZXRPbGROYW1lSW50ZXJmYWNlID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDc7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fR2V0TmV3TmFtZUludGVyZmFjZSA9IDo6YW5kcm9pZDo6SUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQ4OwotICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX0dldENwcEphdmFUZXN0cyA9IDo6YW5kcm9pZDo6SUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQ5OwotICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX2dldEJhY2tlbmRUeXBlID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNTA7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fR2V0SW50ZXJmYWNlQXJyYXkgPSA6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyNzsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9WZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VBcnJheSA9IDo6YW5kcm9pZDo6SUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDI4OworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX0dldE51bGxhYmxlSW50ZXJmYWNlQXJyYXkgPSA6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyOTsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9WZXJpZnlOYW1lc1dpdGhOdWxsYWJsZUludGVyZmFjZUFycmF5ID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzA7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fR2V0SW50ZXJmYWNlTGlzdCA9IDo6YW5kcm9pZDo6SUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDMxOworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1ZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUxpc3QgPSA6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzMjsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXZlcnNlU3RyaW5nTGlzdCA9IDo6YW5kcm9pZDo6SUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDMzOworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdFBhcmNlbEZpbGVEZXNjcmlwdG9yID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzQ7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmV2ZXJzZVBhcmNlbEZpbGVEZXNjcmlwdG9yQXJyYXkgPSA6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzNTsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9UaHJvd1NlcnZpY2VFeGNlcHRpb24gPSA6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzNjsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXBlYXROdWxsYWJsZUludEFycmF5ID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzc7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0TnVsbGFibGVCeXRlRW51bUFycmF5ID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzg7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0TnVsbGFibGVJbnRFbnVtQXJyYXkgPSA6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzOTsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXBlYXROdWxsYWJsZUxvbmdFbnVtQXJyYXkgPSA6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0MDsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXBlYXROdWxsYWJsZVN0cmluZyA9IDo6YW5kcm9pZDo6SUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQxOworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdE51bGxhYmxlU3RyaW5nTGlzdCA9IDo6YW5kcm9pZDo6SUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQyOworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdE51bGxhYmxlUGFyY2VsYWJsZSA9IDo6YW5kcm9pZDo6SUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQzOworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUFycmF5ID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDQ7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlTGlzdCA9IDo6YW5kcm9pZDo6SUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQ1OworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1Rha2VzQW5JQmluZGVyID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDY7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fVGFrZXNBTnVsbGFibGVJQmluZGVyID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDc7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fVGFrZXNBbklCaW5kZXJMaXN0ID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDg7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fVGFrZXNBTnVsbGFibGVJQmluZGVyTGlzdCA9IDo6YW5kcm9pZDo6SUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQ5OworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdFV0ZjhDcHBTdHJpbmcgPSA6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1MDsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXBlYXROdWxsYWJsZVV0ZjhDcHBTdHJpbmcgPSA6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1MTsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXZlcnNlVXRmOENwcFN0cmluZyA9IDo6YW5kcm9pZDo6SUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDUyOworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JldmVyc2VOdWxsYWJsZVV0ZjhDcHBTdHJpbmcgPSA6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1MzsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXZlcnNlVXRmOENwcFN0cmluZ0xpc3QgPSA6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1NDsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9HZXRDYWxsYmFjayA9IDo6YW5kcm9pZDo6SUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDU1OworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX0ZpbGxPdXRTdHJ1Y3R1cmVkUGFyY2VsYWJsZSA9IDo6YW5kcm9pZDo6SUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDU2OworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdEV4dGVuZGFibGVQYXJjZWxhYmxlID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNTc7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmV2ZXJzZUxpc3QgPSA6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1ODsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXZlcnNlSUJpbmRlckFycmF5ID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNTk7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmV2ZXJzZU51bGxhYmxlSUJpbmRlckFycmF5ID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNjA7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fR2V0T2xkTmFtZUludGVyZmFjZSA9IDo6YW5kcm9pZDo6SUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDYxOworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX0dldE5ld05hbWVJbnRlcmZhY2UgPSA6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA2MjsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9HZXRVbmlvblRhZ3MgPSA6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA2MzsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9HZXRDcHBKYXZhVGVzdHMgPSA6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA2NDsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9nZXRCYWNrZW5kVHlwZSA9IDo6YW5kcm9pZDo6SUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDY1OwogICBleHBsaWNpdCBCblRlc3RTZXJ2aWNlKCk7CiAgIDo6YW5kcm9pZDo6c3RhdHVzX3Qgb25UcmFuc2FjdCh1aW50MzJfdCBfYWlkbF9jb2RlLCBjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCYgX2FpZGxfZGF0YSwgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3JlcGx5LCB1aW50MzJfdCBfYWlkbF9mbGFncykgb3ZlcnJpZGU7CiB9OyAgLy8gY2xhc3MgQm5UZXN0U2VydmljZQogCitjbGFzcyBJVGVzdFNlcnZpY2VEZWxlZ2F0b3IgOiBwdWJsaWMgQm5UZXN0U2VydmljZSB7CitwdWJsaWM6CisgIGV4cGxpY2l0IElUZXN0U2VydmljZURlbGVnYXRvcig6OmFuZHJvaWQ6OnNwPElUZXN0U2VydmljZT4gJmltcGwpIDogX2FpZGxfZGVsZWdhdGUoaW1wbCkge30KKworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFVuaW1wbGVtZW50ZWRNZXRob2QoaW50MzJfdCBhcmcsIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+VW5pbXBsZW1lbnRlZE1ldGhvZChhcmcsIF9haWRsX3JldHVybik7CisgIH0KKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBEZXByZWNhdGVkKCkgb3ZlcnJpZGUgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCgidG8gbWFrZSBzdXJlIHdlIGhhdmUgc29tZXRoaW5nIGluIHN5c3RlbS90b29scy9haWRsIHdoaWNoIGRvZXMgYSBjb21waWxlIGNoZWNrIG9mIGRlcHJlY2F0ZWQgYW5kIG1ha2Ugc3VyZSB0aGlzIGlzIHJlZmxlY3RlZCBpbiBnb2xkZW5zIikpKSB7CisgICAgcmV0dXJuIF9haWRsX2RlbGVnYXRlLT5EZXByZWNhdGVkKCk7CisgIH0KKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBUZXN0T25ld2F5KCkgb3ZlcnJpZGUgeworICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+VGVzdE9uZXdheSgpOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0Qm9vbGVhbihib29sIHRva2VuLCBib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPlJlcGVhdEJvb2xlYW4odG9rZW4sIF9haWRsX3JldHVybik7CisgIH0KKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXRCeXRlKGludDhfdCB0b2tlbiwgaW50OF90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPlJlcGVhdEJ5dGUodG9rZW4sIF9haWRsX3JldHVybik7CisgIH0KKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXRDaGFyKGNoYXIxNl90IHRva2VuLCBjaGFyMTZfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9haWRsX2RlbGVnYXRlLT5SZXBlYXRDaGFyKHRva2VuLCBfYWlkbF9yZXR1cm4pOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0SW50KGludDMyX3QgdG9rZW4sIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+UmVwZWF0SW50KHRva2VuLCBfYWlkbF9yZXR1cm4pOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0TG9uZyhpbnQ2NF90IHRva2VuLCBpbnQ2NF90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPlJlcGVhdExvbmcodG9rZW4sIF9haWRsX3JldHVybik7CisgIH0KKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXRGbG9hdChmbG9hdCB0b2tlbiwgZmxvYXQqIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+UmVwZWF0RmxvYXQodG9rZW4sIF9haWRsX3JldHVybik7CisgIH0KKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXREb3VibGUoZG91YmxlIHRva2VuLCBkb3VibGUqIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+UmVwZWF0RG91YmxlKHRva2VuLCBfYWlkbF9yZXR1cm4pOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0U3RyaW5nKGNvbnN0IDo6YW5kcm9pZDo6U3RyaW5nMTYmIHRva2VuLCA6OmFuZHJvaWQ6OlN0cmluZzE2KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPlJlcGVhdFN0cmluZyh0b2tlbiwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdEJ5dGVFbnVtKDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJ5dGVFbnVtIHRva2VuLCA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCeXRlRW51bSogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9haWRsX2RlbGVnYXRlLT5SZXBlYXRCeXRlRW51bSh0b2tlbiwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdEludEVudW0oOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bSB0b2tlbiwgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bSogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9haWRsX2RlbGVnYXRlLT5SZXBlYXRJbnRFbnVtKHRva2VuLCBfYWlkbF9yZXR1cm4pOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0TG9uZ0VudW0oOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0gdG9rZW4sIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPlJlcGVhdExvbmdFbnVtKHRva2VuLCBfYWlkbF9yZXR1cm4pOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmV2ZXJzZUJvb2xlYW4oY29uc3QgOjpzdGQ6OnZlY3Rvcjxib29sPiYgaW5wdXQsIDo6c3RkOjp2ZWN0b3I8Ym9vbD4qIHJlcGVhdGVkLCA6OnN0ZDo6dmVjdG9yPGJvb2w+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPlJldmVyc2VCb29sZWFuKGlucHV0LCByZXBlYXRlZCwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJldmVyc2VCeXRlKGNvbnN0IDo6c3RkOjp2ZWN0b3I8dWludDhfdD4mIGlucHV0LCA6OnN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiByZXBlYXRlZCwgOjpzdGQ6OnZlY3Rvcjx1aW50OF90PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9haWRsX2RlbGVnYXRlLT5SZXZlcnNlQnl0ZShpbnB1dCwgcmVwZWF0ZWQsIF9haWRsX3JldHVybik7CisgIH0KKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXZlcnNlQ2hhcihjb25zdCA6OnN0ZDo6dmVjdG9yPGNoYXIxNl90PiYgaW5wdXQsIDo6c3RkOjp2ZWN0b3I8Y2hhcjE2X3Q+KiByZXBlYXRlZCwgOjpzdGQ6OnZlY3RvcjxjaGFyMTZfdD4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+UmV2ZXJzZUNoYXIoaW5wdXQsIHJlcGVhdGVkLCBfYWlkbF9yZXR1cm4pOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmV2ZXJzZUludChjb25zdCA6OnN0ZDo6dmVjdG9yPGludDMyX3Q+JiBpbnB1dCwgOjpzdGQ6OnZlY3RvcjxpbnQzMl90PiogcmVwZWF0ZWQsIDo6c3RkOjp2ZWN0b3I8aW50MzJfdD4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+UmV2ZXJzZUludChpbnB1dCwgcmVwZWF0ZWQsIF9haWRsX3JldHVybik7CisgIH0KKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXZlcnNlTG9uZyhjb25zdCA6OnN0ZDo6dmVjdG9yPGludDY0X3Q+JiBpbnB1dCwgOjpzdGQ6OnZlY3RvcjxpbnQ2NF90PiogcmVwZWF0ZWQsIDo6c3RkOjp2ZWN0b3I8aW50NjRfdD4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+UmV2ZXJzZUxvbmcoaW5wdXQsIHJlcGVhdGVkLCBfYWlkbF9yZXR1cm4pOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmV2ZXJzZUZsb2F0KGNvbnN0IDo6c3RkOjp2ZWN0b3I8ZmxvYXQ+JiBpbnB1dCwgOjpzdGQ6OnZlY3RvcjxmbG9hdD4qIHJlcGVhdGVkLCA6OnN0ZDo6dmVjdG9yPGZsb2F0PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9haWRsX2RlbGVnYXRlLT5SZXZlcnNlRmxvYXQoaW5wdXQsIHJlcGVhdGVkLCBfYWlkbF9yZXR1cm4pOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmV2ZXJzZURvdWJsZShjb25zdCA6OnN0ZDo6dmVjdG9yPGRvdWJsZT4mIGlucHV0LCA6OnN0ZDo6dmVjdG9yPGRvdWJsZT4qIHJlcGVhdGVkLCA6OnN0ZDo6dmVjdG9yPGRvdWJsZT4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+UmV2ZXJzZURvdWJsZShpbnB1dCwgcmVwZWF0ZWQsIF9haWRsX3JldHVybik7CisgIH0KKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXZlcnNlU3RyaW5nKGNvbnN0IDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpTdHJpbmcxNj4mIGlucHV0LCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6U3RyaW5nMTY+KiByZXBlYXRlZCwgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OlN0cmluZzE2PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9haWRsX2RlbGVnYXRlLT5SZXZlcnNlU3RyaW5nKGlucHV0LCByZXBlYXRlZCwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJldmVyc2VCeXRlRW51bShjb25zdCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJ5dGVFbnVtPiYgaW5wdXQsIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Qnl0ZUVudW0+KiByZXBlYXRlZCwgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCeXRlRW51bT4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+UmV2ZXJzZUJ5dGVFbnVtKGlucHV0LCByZXBlYXRlZCwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJldmVyc2VJbnRFbnVtKGNvbnN0IDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bT4mIGlucHV0LCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0+KiByZXBlYXRlZCwgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9haWRsX2RlbGVnYXRlLT5SZXZlcnNlSW50RW51bShpbnB1dCwgcmVwZWF0ZWQsIF9haWRsX3JldHVybik7CisgIH0KKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXZlcnNlTG9uZ0VudW0oY29uc3QgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMb25nRW51bT4mIGlucHV0LCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtPiogcmVwZWF0ZWQsIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPlJldmVyc2VMb25nRW51bShpbnB1dCwgcmVwZWF0ZWQsIF9haWRsX3JldHVybik7CisgIH0KKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBHZXRPdGhlclRlc3RTZXJ2aWNlKGNvbnN0IDo6YW5kcm9pZDo6U3RyaW5nMTYmIG5hbWUsIDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPkdldE90aGVyVGVzdFNlcnZpY2UobmFtZSwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFZlcmlmeU5hbWUoY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4mIHNlcnZpY2UsIGNvbnN0IDo6YW5kcm9pZDo6U3RyaW5nMTYmIG5hbWUsIGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+VmVyaWZ5TmFtZShzZXJ2aWNlLCBuYW1lLCBfYWlkbF9yZXR1cm4pOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgR2V0SW50ZXJmYWNlQXJyYXkoY29uc3QgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OlN0cmluZzE2PiYgbmFtZXMsIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPkdldEludGVyZmFjZUFycmF5KG5hbWVzLCBfYWlkbF9yZXR1cm4pOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlQXJyYXkoY29uc3QgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPj4mIHNlcnZpY2VzLCBjb25zdCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6U3RyaW5nMTY+JiBuYW1lcywgYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9haWRsX2RlbGVnYXRlLT5WZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VBcnJheShzZXJ2aWNlcywgbmFtZXMsIF9haWRsX3JldHVybik7CisgIH0KKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBHZXROdWxsYWJsZUludGVyZmFjZUFycmF5KGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OlN0cmluZzE2Pj4+JiBuYW1lcywgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4+PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9haWRsX2RlbGVnYXRlLT5HZXROdWxsYWJsZUludGVyZmFjZUFycmF5KG5hbWVzLCBfYWlkbF9yZXR1cm4pOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgVmVyaWZ5TmFtZXNXaXRoTnVsbGFibGVJbnRlcmZhY2VBcnJheShjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPj4+JiBzZXJ2aWNlcywgY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6U3RyaW5nMTY+Pj4mIG5hbWVzLCBib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPlZlcmlmeU5hbWVzV2l0aE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoc2VydmljZXMsIG5hbWVzLCBfYWlkbF9yZXR1cm4pOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgR2V0SW50ZXJmYWNlTGlzdChjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjpTdHJpbmcxNj4+PiYgbmFtZXMsIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+Pj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+R2V0SW50ZXJmYWNlTGlzdChuYW1lcywgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUxpc3QoY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4+PiYgc2VydmljZXMsIGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OlN0cmluZzE2Pj4+JiBuYW1lcywgYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9haWRsX2RlbGVnYXRlLT5WZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VMaXN0KHNlcnZpY2VzLCBuYW1lcywgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJldmVyc2VTdHJpbmdMaXN0KGNvbnN0IDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpTdHJpbmcxNj4mIGlucHV0LCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6U3RyaW5nMTY+KiByZXBlYXRlZCwgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OlN0cmluZzE2PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9haWRsX2RlbGVnYXRlLT5SZXZlcnNlU3RyaW5nTGlzdChpbnB1dCwgcmVwZWF0ZWQsIF9haWRsX3JldHVybik7CisgIH0KKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXRQYXJjZWxGaWxlRGVzY3JpcHRvcihjb25zdCA6OmFuZHJvaWQ6Om9zOjpQYXJjZWxGaWxlRGVzY3JpcHRvciYgcmVhZCwgOjphbmRyb2lkOjpvczo6UGFyY2VsRmlsZURlc2NyaXB0b3IqIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+UmVwZWF0UGFyY2VsRmlsZURlc2NyaXB0b3IocmVhZCwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJldmVyc2VQYXJjZWxGaWxlRGVzY3JpcHRvckFycmF5KGNvbnN0IDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpvczo6UGFyY2VsRmlsZURlc2NyaXB0b3I+JiBpbnB1dCwgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6Om9zOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj4qIHJlcGVhdGVkLCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6b3M6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9haWRsX2RlbGVnYXRlLT5SZXZlcnNlUGFyY2VsRmlsZURlc2NyaXB0b3JBcnJheShpbnB1dCwgcmVwZWF0ZWQsIF9haWRsX3JldHVybik7CisgIH0KKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBUaHJvd1NlcnZpY2VFeGNlcHRpb24oaW50MzJfdCBjb2RlKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9haWRsX2RlbGVnYXRlLT5UaHJvd1NlcnZpY2VFeGNlcHRpb24oY29kZSk7CisgIH0KKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXROdWxsYWJsZUludEFycmF5KGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPGludDMyX3Q+PiYgaW5wdXQsIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPGludDMyX3Q+PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9haWRsX2RlbGVnYXRlLT5SZXBlYXROdWxsYWJsZUludEFycmF5KGlucHV0LCBfYWlkbF9yZXR1cm4pOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0TnVsbGFibGVCeXRlRW51bUFycmF5KGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJ5dGVFbnVtPj4mIGlucHV0LCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCeXRlRW51bT4+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPlJlcGVhdE51bGxhYmxlQnl0ZUVudW1BcnJheShpbnB1dCwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdE51bGxhYmxlSW50RW51bUFycmF5KGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0+PiYgaW5wdXQsIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0+PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9haWRsX2RlbGVnYXRlLT5SZXBlYXROdWxsYWJsZUludEVudW1BcnJheShpbnB1dCwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdE51bGxhYmxlTG9uZ0VudW1BcnJheShjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMb25nRW51bT4+JiBpbnB1dCwgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0+PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9haWRsX2RlbGVnYXRlLT5SZXBlYXROdWxsYWJsZUxvbmdFbnVtQXJyYXkoaW5wdXQsIF9haWRsX3JldHVybik7CisgIH0KKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXROdWxsYWJsZVN0cmluZyhjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjpTdHJpbmcxNj4mIGlucHV0LCA6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjpTdHJpbmcxNj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+UmVwZWF0TnVsbGFibGVTdHJpbmcoaW5wdXQsIF9haWRsX3JldHVybik7CisgIH0KKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXROdWxsYWJsZVN0cmluZ0xpc3QoY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6U3RyaW5nMTY+Pj4mIGlucHV0LCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjpTdHJpbmcxNj4+PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9haWRsX2RlbGVnYXRlLT5SZXBlYXROdWxsYWJsZVN0cmluZ0xpc3QoaW5wdXQsIF9haWRsX3JldHVybik7CisgIH0KKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXROdWxsYWJsZVBhcmNlbGFibGUoY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6RW1wdHk+JiBpbnB1dCwgOjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6RW1wdHk+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPlJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZShpbnB1dCwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUFycmF5KGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5Pj4+JiBpbnB1dCwgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6RW1wdHk+Pj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+UmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlQXJyYXkoaW5wdXQsIF9haWRsX3JldHVybik7CisgIH0KKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXROdWxsYWJsZVBhcmNlbGFibGVMaXN0KGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5Pj4+JiBpbnB1dCwgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6RW1wdHk+Pj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+UmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlTGlzdChpbnB1dCwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFRha2VzQW5JQmluZGVyKGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiYgaW5wdXQpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPlRha2VzQW5JQmluZGVyKGlucHV0KTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFRha2VzQU51bGxhYmxlSUJpbmRlcihjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4mIGlucHV0KSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9haWRsX2RlbGVnYXRlLT5UYWtlc0FOdWxsYWJsZUlCaW5kZXIoaW5wdXQpOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgVGFrZXNBbklCaW5kZXJMaXN0KGNvbnN0IDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+PiYgaW5wdXQpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPlRha2VzQW5JQmluZGVyTGlzdChpbnB1dCk7CisgIH0KKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBUYWtlc0FOdWxsYWJsZUlCaW5kZXJMaXN0KGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPj4+JiBpbnB1dCkgb3ZlcnJpZGUgeworICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+VGFrZXNBTnVsbGFibGVJQmluZGVyTGlzdChpbnB1dCk7CisgIH0KKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXRVdGY4Q3BwU3RyaW5nKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHRva2VuLCA6OnN0ZDo6c3RyaW5nKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPlJlcGVhdFV0ZjhDcHBTdHJpbmcodG9rZW4sIF9haWRsX3JldHVybik7CisgIH0KKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXROdWxsYWJsZVV0ZjhDcHBTdHJpbmcoY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjpzdHJpbmc+JiB0b2tlbiwgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjpzdHJpbmc+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPlJlcGVhdE51bGxhYmxlVXRmOENwcFN0cmluZyh0b2tlbiwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJldmVyc2VVdGY4Q3BwU3RyaW5nKGNvbnN0IDo6c3RkOjp2ZWN0b3I8OjpzdGQ6OnN0cmluZz4mIGlucHV0LCA6OnN0ZDo6dmVjdG9yPDo6c3RkOjpzdHJpbmc+KiByZXBlYXRlZCwgOjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6c3RyaW5nPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9haWRsX2RlbGVnYXRlLT5SZXZlcnNlVXRmOENwcFN0cmluZyhpbnB1dCwgcmVwZWF0ZWQsIF9haWRsX3JldHVybik7CisgIH0KKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXZlcnNlTnVsbGFibGVVdGY4Q3BwU3RyaW5nKGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6c3RyaW5nPj4+JiBpbnB1dCwgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjpzdHJpbmc+Pj4qIHJlcGVhdGVkLCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnN0cmluZz4+PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9haWRsX2RlbGVnYXRlLT5SZXZlcnNlTnVsbGFibGVVdGY4Q3BwU3RyaW5nKGlucHV0LCByZXBlYXRlZCwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJldmVyc2VVdGY4Q3BwU3RyaW5nTGlzdChjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnN0cmluZz4+PiYgaW5wdXQsIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6c3RyaW5nPj4+KiByZXBlYXRlZCwgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjpzdHJpbmc+Pj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+UmV2ZXJzZVV0ZjhDcHBTdHJpbmdMaXN0KGlucHV0LCByZXBlYXRlZCwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEdldENhbGxiYWNrKGJvb2wgcmV0dXJuX251bGwsIDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPkdldENhbGxiYWNrKHJldHVybl9udWxsLCBfYWlkbF9yZXR1cm4pOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgRmlsbE91dFN0cnVjdHVyZWRQYXJjZWxhYmxlKDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlN0cnVjdHVyZWRQYXJjZWxhYmxlKiBwYXJjZWwpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPkZpbGxPdXRTdHJ1Y3R1cmVkUGFyY2VsYWJsZShwYXJjZWwpOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0RXh0ZW5kYWJsZVBhcmNlbGFibGUoY29uc3QgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6ZXh0ZW5zaW9uOjpFeHRlbmRhYmxlUGFyY2VsYWJsZSYgZXAsIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OmV4dGVuc2lvbjo6RXh0ZW5kYWJsZVBhcmNlbGFibGUqIGVwMikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+UmVwZWF0RXh0ZW5kYWJsZVBhcmNlbGFibGUoZXAsIGVwMik7CisgIH0KKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXZlcnNlTGlzdChjb25zdCA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpSZWN1cnNpdmVMaXN0JiBsaXN0LCA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpSZWN1cnNpdmVMaXN0KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPlJldmVyc2VMaXN0KGxpc3QsIF9haWRsX3JldHVybik7CisgIH0KKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXZlcnNlSUJpbmRlckFycmF5KGNvbnN0IDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+PiYgaW5wdXQsIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+PiogcmVwZWF0ZWQsIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9haWRsX2RlbGVnYXRlLT5SZXZlcnNlSUJpbmRlckFycmF5KGlucHV0LCByZXBlYXRlZCwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJldmVyc2VOdWxsYWJsZUlCaW5kZXJBcnJheShjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4+PiYgaW5wdXQsIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPj4+KiByZXBlYXRlZCwgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+Pj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+UmV2ZXJzZU51bGxhYmxlSUJpbmRlckFycmF5KGlucHV0LCByZXBlYXRlZCwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEdldE9sZE5hbWVJbnRlcmZhY2UoOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJT2xkTmFtZT4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+R2V0T2xkTmFtZUludGVyZmFjZShfYWlkbF9yZXR1cm4pOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgR2V0TmV3TmFtZUludGVyZmFjZSg6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOZXdOYW1lPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9haWRsX2RlbGVnYXRlLT5HZXROZXdOYW1lSW50ZXJmYWNlKF9haWRsX3JldHVybik7CisgIH0KKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBHZXRVbmlvblRhZ3MoY29uc3QgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpVbmlvbj4mIGlucHV0LCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlVuaW9uOjpUYWc+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPkdldFVuaW9uVGFncyhpbnB1dCwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEdldENwcEphdmFUZXN0cyg6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+R2V0Q3BwSmF2YVRlc3RzKF9haWRsX3JldHVybik7CisgIH0KKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBnZXRCYWNrZW5kVHlwZSg6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCYWNrZW5kVHlwZSogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9haWRsX2RlbGVnYXRlLT5nZXRCYWNrZW5kVHlwZShfYWlkbF9yZXR1cm4pOworICB9Citwcml2YXRlOgorICA6OmFuZHJvaWQ6OnNwPElUZXN0U2VydmljZT4gX2FpZGxfZGVsZWdhdGU7Cit9OyAgLy8gY2xhc3MgSVRlc3RTZXJ2aWNlRGVsZWdhdG9yCiB9ICAvLyBuYW1lc3BhY2UgdGVzdHMKLQogfSAgLy8gbmFtZXNwYWNlIGFpZGwKLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9CcEFycmF5T2ZJbnRlcmZhY2VzLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvQnBBcnJheU9mSW50ZXJmYWNlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YWY2YjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvQnBBcnJheU9mSW50ZXJmYWNlcy5oCkBAIC0wLDAgKzEgQEAKKyNlcnJvciBUT0RPKGIvMTExMzYyNTkzKSBwYXJjZWxhYmxlcyBkbyBub3QgaGF2ZSBicCBjbGFzc2VzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0JwRGVwcmVjYXRlZC5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0JwRGVwcmVjYXRlZC5oCmluZGV4IDg4ZmI2MmQuLjYyOGM1NzAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9CcERlcHJlY2F0ZWQuaAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvQnBEZXByZWNhdGVkLmgKQEAgLTYsMTkgKzYsMTMgQEAKICNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvSURlcHJlY2F0ZWQuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotCiBuYW1lc3BhY2UgYWlkbCB7Ci0KIG5hbWVzcGFjZSB0ZXN0cyB7Ci0KIGNsYXNzIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQoInRlc3QiKSkpIEJwRGVwcmVjYXRlZCA6IHB1YmxpYyA6OmFuZHJvaWQ6OkJwSW50ZXJmYWNlPElEZXByZWNhdGVkPiB7CiBwdWJsaWM6CiAgIGV4cGxpY2l0IEJwRGVwcmVjYXRlZChjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4mIF9haWRsX2ltcGwpOwogICB2aXJ0dWFsIH5CcERlcHJlY2F0ZWQoKSA9IGRlZmF1bHQ7CiB9OyAgLy8gY2xhc3MgQnBEZXByZWNhdGVkCi0KIH0gIC8vIG5hbWVzcGFjZSB0ZXN0cwotCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0JwRml4ZWRTaXplLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvQnBGaXhlZFNpemUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2FmNmIxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0JwRml4ZWRTaXplLmgKQEAgLTAsMCArMSBAQAorI2Vycm9yIFRPRE8oYi8xMTEzNjI1OTMpIHBhcmNlbGFibGVzIGRvIG5vdCBoYXZlIGJwIGNsYXNzZXMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvQnBMaXN0T2ZJbnRlcmZhY2VzLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvQnBMaXN0T2ZJbnRlcmZhY2VzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdhZjZiMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9CcExpc3RPZkludGVyZmFjZXMuaApAQCAtMCwwICsxIEBACisjZXJyb3IgVE9ETyhiLzExMTM2MjU5MykgcGFyY2VsYWJsZXMgZG8gbm90IGhhdmUgYnAgY2xhc3NlcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9CcE5hbWVkQ2FsbGJhY2suaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9CcE5hbWVkQ2FsbGJhY2suaAppbmRleCA0YzNlYjkxLi45MDcyMzEzIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvQnBOYW1lZENhbGxiYWNrLmgKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0JwTmFtZWRDYWxsYmFjay5oCkBAIC02LDIwICs2LDE0IEBACiAjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL0lOYW1lZENhbGxiYWNrLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogbmFtZXNwYWNlIGFpZGwgewotCiBuYW1lc3BhY2UgdGVzdHMgewotCiBjbGFzcyBCcE5hbWVkQ2FsbGJhY2sgOiBwdWJsaWMgOjphbmRyb2lkOjpCcEludGVyZmFjZTxJTmFtZWRDYWxsYmFjaz4gewogcHVibGljOgogICBleHBsaWNpdCBCcE5hbWVkQ2FsbGJhY2soY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+JiBfYWlkbF9pbXBsKTsKICAgdmlydHVhbCB+QnBOYW1lZENhbGxiYWNrKCkgPSBkZWZhdWx0OwogICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEdldE5hbWUoOjphbmRyb2lkOjpTdHJpbmcxNiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKIH07ICAvLyBjbGFzcyBCcE5hbWVkQ2FsbGJhY2sKLQogfSAgLy8gbmFtZXNwYWNlIHRlc3RzCi0KIH0gIC8vIG5hbWVzcGFjZSBhaWRsCi0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvQnBOZXdOYW1lLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvQnBOZXdOYW1lLmgKaW5kZXggZDliYTkwZS4uMDcwMmJlNSAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0JwTmV3TmFtZS5oCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9CcE5ld05hbWUuaApAQCAtNiwyMCArNiwxNCBAQAogI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9JTmV3TmFtZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIG5hbWVzcGFjZSBhaWRsIHsKLQogbmFtZXNwYWNlIHRlc3RzIHsKLQogY2xhc3MgQnBOZXdOYW1lIDogcHVibGljIDo6YW5kcm9pZDo6QnBJbnRlcmZhY2U8SU5ld05hbWU+IHsKIHB1YmxpYzoKICAgZXhwbGljaXQgQnBOZXdOYW1lKGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiYgX2FpZGxfaW1wbCk7CiAgIHZpcnR1YWwgfkJwTmV3TmFtZSgpID0gZGVmYXVsdDsKICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZWFsTmFtZSg6OmFuZHJvaWQ6OlN0cmluZzE2KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogfTsgIC8vIGNsYXNzIEJwTmV3TmFtZQotCiB9ICAvLyBuYW1lc3BhY2UgdGVzdHMKLQogfSAgLy8gbmFtZXNwYWNlIGFpZGwKLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9CcE9sZE5hbWUuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9CcE9sZE5hbWUuaAppbmRleCBhMzYyNjY0Li41ZWU4NWIyIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvQnBPbGROYW1lLmgKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0JwT2xkTmFtZS5oCkBAIC02LDIwICs2LDE0IEBACiAjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL0lPbGROYW1lLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogbmFtZXNwYWNlIGFpZGwgewotCiBuYW1lc3BhY2UgdGVzdHMgewotCiBjbGFzcyBCcE9sZE5hbWUgOiBwdWJsaWMgOjphbmRyb2lkOjpCcEludGVyZmFjZTxJT2xkTmFtZT4gewogcHVibGljOgogICBleHBsaWNpdCBCcE9sZE5hbWUoY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+JiBfYWlkbF9pbXBsKTsKICAgdmlydHVhbCB+QnBPbGROYW1lKCkgPSBkZWZhdWx0OwogICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlYWxOYW1lKDo6YW5kcm9pZDo6U3RyaW5nMTYqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiB9OyAgLy8gY2xhc3MgQnBPbGROYW1lCi0KIH0gIC8vIG5hbWVzcGFjZSB0ZXN0cwotCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0JwUmVjdXJzaXZlTGlzdC5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0JwUmVjdXJzaXZlTGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YWY2YjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvQnBSZWN1cnNpdmVMaXN0LmgKQEAgLTAsMCArMSBAQAorI2Vycm9yIFRPRE8oYi8xMTEzNjI1OTMpIHBhcmNlbGFibGVzIGRvIG5vdCBoYXZlIGJwIGNsYXNzZXMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvQnBUZXN0U2VydmljZS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0JwVGVzdFNlcnZpY2UuaAppbmRleCBiZWUyNWJmLi4zODI5ZDliIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvQnBUZXN0U2VydmljZS5oCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9CcFRlc3RTZXJ2aWNlLmgKQEAgLTYsMTEgKzYsOCBAQAogI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9JVGVzdFNlcnZpY2UuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotCiBuYW1lc3BhY2UgYWlkbCB7Ci0KIG5hbWVzcGFjZSB0ZXN0cyB7Ci0KIGNsYXNzIEJwVGVzdFNlcnZpY2UgOiBwdWJsaWMgOjphbmRyb2lkOjpCcEludGVyZmFjZTxJVGVzdFNlcnZpY2U+IHsKIHB1YmxpYzoKICAgZXhwbGljaXQgQnBUZXN0U2VydmljZShjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4mIF9haWRsX2ltcGwpOwpAQCAtNDIsNiArMzksMTIgQEAKICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXZlcnNlTG9uZ0VudW0oY29uc3QgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMb25nRW51bT4mIGlucHV0LCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtPiogcmVwZWF0ZWQsIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEdldE90aGVyVGVzdFNlcnZpY2UoY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiYgbmFtZSwgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgVmVyaWZ5TmFtZShjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPiYgc2VydmljZSwgY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiYgbmFtZSwgYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBHZXRJbnRlcmZhY2VBcnJheShjb25zdCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6U3RyaW5nMTY+JiBuYW1lcywgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlQXJyYXkoY29uc3QgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPj4mIHNlcnZpY2VzLCBjb25zdCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6U3RyaW5nMTY+JiBuYW1lcywgYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBHZXROdWxsYWJsZUludGVyZmFjZUFycmF5KGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OlN0cmluZzE2Pj4+JiBuYW1lcywgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4+PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBWZXJpZnlOYW1lc1dpdGhOdWxsYWJsZUludGVyZmFjZUFycmF5KGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+Pj4mIHNlcnZpY2VzLCBjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjpTdHJpbmcxNj4+PiYgbmFtZXMsIGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgR2V0SW50ZXJmYWNlTGlzdChjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjpTdHJpbmcxNj4+PiYgbmFtZXMsIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+Pj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlTGlzdChjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPj4+JiBzZXJ2aWNlcywgY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6U3RyaW5nMTY+Pj4mIG5hbWVzLCBib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJldmVyc2VTdHJpbmdMaXN0KGNvbnN0IDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpTdHJpbmcxNj4mIGlucHV0LCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6U3RyaW5nMTY+KiByZXBlYXRlZCwgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OlN0cmluZzE2PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXRQYXJjZWxGaWxlRGVzY3JpcHRvcihjb25zdCA6OmFuZHJvaWQ6Om9zOjpQYXJjZWxGaWxlRGVzY3JpcHRvciYgcmVhZCwgOjphbmRyb2lkOjpvczo6UGFyY2VsRmlsZURlc2NyaXB0b3IqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmV2ZXJzZVBhcmNlbEZpbGVEZXNjcmlwdG9yQXJyYXkoY29uc3QgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6Om9zOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj4mIGlucHV0LCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6b3M6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPiogcmVwZWF0ZWQsIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpvczo6UGFyY2VsRmlsZURlc2NyaXB0b3I+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwpAQCAtNTIsOSArNTUsMTMgQEAKICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXROdWxsYWJsZUxvbmdFbnVtQXJyYXkoY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0+PiYgaW5wdXQsIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtPj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0TnVsbGFibGVTdHJpbmcoY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6U3RyaW5nMTY+JiBpbnB1dCwgOjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6U3RyaW5nMTY+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdE51bGxhYmxlU3RyaW5nTGlzdChjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjpTdHJpbmcxNj4+PiYgaW5wdXQsIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OlN0cmluZzE2Pj4+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZShjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6U3RydWN0dXJlZFBhcmNlbGFibGU+JiBpbnB1dCwgOjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlN0cnVjdHVyZWRQYXJjZWxhYmxlPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXROdWxsYWJsZVBhcmNlbGFibGUoY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6RW1wdHk+JiBpbnB1dCwgOjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6RW1wdHk+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUFycmF5KGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5Pj4+JiBpbnB1dCwgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6RW1wdHk+Pj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlTGlzdChjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eT4+PiYgaW5wdXQsIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5Pj4+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFRha2VzQW5JQmluZGVyKGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiYgaW5wdXQpIG92ZXJyaWRlOwogICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFRha2VzQU51bGxhYmxlSUJpbmRlcihjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4mIGlucHV0KSBvdmVycmlkZTsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBUYWtlc0FuSUJpbmRlckxpc3QoY29uc3QgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4+JiBpbnB1dCkgb3ZlcnJpZGU7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgVGFrZXNBTnVsbGFibGVJQmluZGVyTGlzdChjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4+PiYgaW5wdXQpIG92ZXJyaWRlOwogICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdFV0ZjhDcHBTdHJpbmcoY29uc3QgOjpzdGQ6OnN0cmluZyYgdG9rZW4sIDo6c3RkOjpzdHJpbmcqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0TnVsbGFibGVVdGY4Q3BwU3RyaW5nKGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6c3RyaW5nPiYgdG9rZW4sIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6c3RyaW5nPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXZlcnNlVXRmOENwcFN0cmluZyhjb25zdCA6OnN0ZDo6dmVjdG9yPDo6c3RkOjpzdHJpbmc+JiBpbnB1dCwgOjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6c3RyaW5nPiogcmVwZWF0ZWQsIDo6c3RkOjp2ZWN0b3I8OjpzdGQ6OnN0cmluZz4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CkBAIC02MiwxNCArNjksMTYgQEAKICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXZlcnNlVXRmOENwcFN0cmluZ0xpc3QoY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjpzdHJpbmc+Pj4mIGlucHV0LCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnN0cmluZz4+PiogcmVwZWF0ZWQsIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6c3RyaW5nPj4+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEdldENhbGxiYWNrKGJvb2wgcmV0dXJuX251bGwsIDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEZpbGxPdXRTdHJ1Y3R1cmVkUGFyY2VsYWJsZSg6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpTdHJ1Y3R1cmVkUGFyY2VsYWJsZSogcGFyY2VsKSBvdmVycmlkZTsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXRFeHRlbmRhYmxlUGFyY2VsYWJsZShjb25zdCA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpleHRlbnNpb246OkV4dGVuZGFibGVQYXJjZWxhYmxlJiBlcCwgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6ZXh0ZW5zaW9uOjpFeHRlbmRhYmxlUGFyY2VsYWJsZSogZXAyKSBvdmVycmlkZTsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXZlcnNlTGlzdChjb25zdCA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpSZWN1cnNpdmVMaXN0JiBsaXN0LCA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpSZWN1cnNpdmVMaXN0KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJldmVyc2VJQmluZGVyQXJyYXkoY29uc3QgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4+JiBpbnB1dCwgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4+KiByZXBlYXRlZCwgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJldmVyc2VOdWxsYWJsZUlCaW5kZXJBcnJheShjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4+PiYgaW5wdXQsIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPj4+KiByZXBlYXRlZCwgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+Pj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgR2V0T2xkTmFtZUludGVyZmFjZSg6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklPbGROYW1lPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBHZXROZXdOYW1lSW50ZXJmYWNlKDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5ld05hbWU+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEdldFVuaW9uVGFncyhjb25zdCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlVuaW9uPiYgaW5wdXQsIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6VW5pb246OlRhZz4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgR2V0Q3BwSmF2YVRlc3RzKDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBnZXRCYWNrZW5kVHlwZSg6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCYWNrZW5kVHlwZSogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKIH07ICAvLyBjbGFzcyBCcFRlc3RTZXJ2aWNlCi0KIH0gIC8vIG5hbWVzcGFjZSB0ZXN0cwotCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0J5dGVFbnVtLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvQnl0ZUVudW0uaAppbmRleCA3YjUwMDEwLi42ZWUwOWQ4IDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvQnl0ZUVudW0uaAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvQnl0ZUVudW0uaApAQCAtNiwxNyArNiwxOSBAQAogI2luY2x1ZGUgPHN0cmluZz4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotCiBuYW1lc3BhY2UgYWlkbCB7Ci0KIG5hbWVzcGFjZSB0ZXN0cyB7Ci0KIGVudW0gY2xhc3MgQnl0ZUVudW0gOiBpbnQ4X3QgewogICBGT08gPSAxLAogICBCQVIgPSAyLAogICBCQVogPSAzLAogfTsKLQorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CiBbW25vZGlzY2FyZF1dIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoQnl0ZUVudW0gdmFsKSB7CiAgIHN3aXRjaCh2YWwpIHsKICAgY2FzZSBCeXRlRW51bTo6Rk9POgpAQCAtMjksMTYgKzMxLDExIEBACiAgICAgcmV0dXJuIHN0ZDo6dG9fc3RyaW5nKHN0YXRpY19jYXN0PGludDhfdD4odmFsKSk7CiAgIH0KIH0KLQogfSAgLy8gbmFtZXNwYWNlIHRlc3RzCi0KIH0gIC8vIG5hbWVzcGFjZSBhaWRsCi0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIG5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KICNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCiAjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdjKysxNy1leHRlbnNpb25zIgogdGVtcGxhdGUgPD4KQEAgLTQ4LDcgKzQ1LDUgQEAKICAgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Qnl0ZUVudW06OkJBWiwKIH07CiAjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCi0KIH0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0NvbnN0YW50RXhwcmVzc2lvbkVudW0uaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9Db25zdGFudEV4cHJlc3Npb25FbnVtLmgKaW5kZXggYjlhYmNiMy4uNjUxMzFhMCAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0NvbnN0YW50RXhwcmVzc2lvbkVudW0uaAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvQ29uc3RhbnRFeHByZXNzaW9uRW51bS5oCkBAIC02LDExICs2LDggQEAKICNpbmNsdWRlIDxzdHJpbmc+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogbmFtZXNwYWNlIGFpZGwgewotCiBuYW1lc3BhY2UgdGVzdHMgewotCiBlbnVtIGNsYXNzIENvbnN0YW50RXhwcmVzc2lvbkVudW0gOiBpbnQzMl90IHsKICAgZGVjSW50MzJfMSA9IDEsCiAgIGRlY0ludDMyXzIgPSAxLApAQCAtMjMsNyArMjAsMTIgQEAKICAgaGV4SW50MzJfMyA9IDEsCiAgIGhleEludDY0XzEgPSAxLAogfTsKLQorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CiBbW25vZGlzY2FyZF1dIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoQ29uc3RhbnRFeHByZXNzaW9uRW51bSB2YWwpIHsKICAgc3dpdGNoKHZhbCkgewogICBjYXNlIENvbnN0YW50RXhwcmVzc2lvbkVudW06OmRlY0ludDMyXzE6CkBAIC0zMiwxNiArMzQsMTEgQEAKICAgICByZXR1cm4gc3RkOjp0b19zdHJpbmcoc3RhdGljX2Nhc3Q8aW50MzJfdD4odmFsKSk7CiAgIH0KIH0KLQogfSAgLy8gbmFtZXNwYWNlIHRlc3RzCi0KIH0gIC8vIG5hbWVzcGFjZSBhaWRsCi0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIG5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KICNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCiAjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdjKysxNy1leHRlbnNpb25zIgogdGVtcGxhdGUgPD4KQEAgLTU4LDcgKzU1LDUgQEAKICAgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bTo6aGV4SW50NjRfMSwKIH07CiAjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCi0KIH0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0RlcHJlY2F0ZWRFbnVtLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvRGVwcmVjYXRlZEVudW0uaAppbmRleCA4ZGU1M2NmLi41OTNlYWVhIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvRGVwcmVjYXRlZEVudW0uaAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvRGVwcmVjYXRlZEVudW0uaApAQCAtNiwxOCArNiwyMiBAQAogI2luY2x1ZGUgPHN0cmluZz4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotCiBuYW1lc3BhY2UgYWlkbCB7Ci0KIG5hbWVzcGFjZSB0ZXN0cyB7Ci0KIGVudW0gY2xhc3MgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCgidGVzdCIpKSkgRGVwcmVjYXRlZEVudW0gOiBpbnQzMl90IHsKICAgQSA9IDAsCiAgIEIgPSAxLAogICBDID0gMiwKIH07Ci0KLVtbbm9kaXNjYXJkXV0gX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCgidGVzdCIpKSkgc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZyhEZXByZWNhdGVkRW51bSB2YWwpIHsKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2RlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIgorW1tub2Rpc2NhcmRdXSBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKERlcHJlY2F0ZWRFbnVtIHZhbCkgewogICBzd2l0Y2godmFsKSB7CiAgIGNhc2UgRGVwcmVjYXRlZEVudW06OkE6CiAgICAgcmV0dXJuICJBIjsKQEAgLTI5LDI2ICszMywyMSBAQAogICAgIHJldHVybiBzdGQ6OnRvX3N0cmluZyhzdGF0aWNfY2FzdDxpbnQzMl90Pih2YWwpKTsKICAgfQogfQotCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCiB9ICAvLyBuYW1lc3BhY2UgdGVzdHMKLQogfSAgLy8gbmFtZXNwYWNlIGFpZGwKLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogbmFtZXNwYWNlIGludGVybmFsIHsKLQogI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKICNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2MrKzE3LWV4dGVuc2lvbnMiCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdkZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIKIHRlbXBsYXRlIDw+Ci1jb25zdGV4cHIgaW5saW5lIHN0ZDo6YXJyYXk8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6RGVwcmVjYXRlZEVudW0sIDM+IF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQoInRlc3QiKSkpIGVudW1fdmFsdWVzPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkRlcHJlY2F0ZWRFbnVtPiA9IHsKK2NvbnN0ZXhwciBpbmxpbmUgc3RkOjphcnJheTw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpEZXByZWNhdGVkRW51bSwgMz4gZW51bV92YWx1ZXM8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6RGVwcmVjYXRlZEVudW0+ID0gewogICA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpEZXByZWNhdGVkRW51bTo6QSwKICAgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6RGVwcmVjYXRlZEVudW06OkIsCiAgIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkRlcHJlY2F0ZWRFbnVtOjpDLAogfTsKICNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKLQogfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvRGVwcmVjYXRlZFBhcmNlbGFibGUuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9EZXByZWNhdGVkUGFyY2VsYWJsZS5oCmluZGV4IDU5YzdmMjAuLmFhYjUwODkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9EZXByZWNhdGVkUGFyY2VsYWJsZS5oCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9EZXByZWNhdGVkUGFyY2VsYWJsZS5oCkBAIC03LDExICs3LDggQEAKICNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIG5hbWVzcGFjZSBhaWRsIHsKLQogbmFtZXNwYWNlIHRlc3RzIHsKLQogY2xhc3MgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCgidGVzdCIpKSkgRGVwcmVjYXRlZFBhcmNlbGFibGUgOiBwdWJsaWMgOjphbmRyb2lkOjpQYXJjZWxhYmxlIHsKIHB1YmxpYzoKICAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBEZXByZWNhdGVkUGFyY2VsYWJsZSYpIGNvbnN0IHsKQEAgLTQ2LDkgKzQzLDYgQEAKICAgICByZXR1cm4gb3Muc3RyKCk7CiAgIH0KIH07ICAvLyBjbGFzcyBEZXByZWNhdGVkUGFyY2VsYWJsZQotCiB9ICAvLyBuYW1lc3BhY2UgdGVzdHMKLQogfSAgLy8gbmFtZXNwYWNlIGFpZGwKLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9GaXhlZFNpemUuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9GaXhlZFNpemUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWY2NzExCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0ZpeGVkU2l6ZS5oCkBAIC0wLDAgKzEsMjgwIEBACisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9GaXhlZFNpemUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvTG9uZ0VudW0uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl90b19zdHJpbmcuaD4KKyNpbmNsdWRlIDxhcnJheT4KKyNpbmNsdWRlIDxiaW5kZXIvRW51bXMuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8YmluZGVyL1N0YXR1cy5oPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dHVwbGU+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgorI2luY2x1ZGUgPHZhcmlhbnQ+CisKKyNpZm5kZWYgX19CSU9OSUNfXworI2RlZmluZSBfX2Fzc2VydDIoYSxiLGMsZCkgKCh2b2lkKTApCisjZW5kaWYKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK2NsYXNzIEZpeGVkU2l6ZSA6IHB1YmxpYyA6OmFuZHJvaWQ6OlBhcmNlbGFibGUgeworcHVibGljOgorICBjbGFzcyBGaXhlZFVuaW9uIDogcHVibGljIDo6YW5kcm9pZDo6UGFyY2VsYWJsZSB7CisgIHB1YmxpYzoKKyAgICBlbnVtIGNsYXNzIFRhZyA6IGludDhfdCB7CisgICAgICBib29sZWFuVmFsdWUgPSAwLAorICAgICAgYnl0ZVZhbHVlID0gMSwKKyAgICAgIGNoYXJWYWx1ZSA9IDIsCisgICAgICBpbnRWYWx1ZSA9IDMsCisgICAgICBsb25nVmFsdWUgPSA0LAorICAgICAgZmxvYXRWYWx1ZSA9IDUsCisgICAgICBkb3VibGVWYWx1ZSA9IDYsCisgICAgICBlbnVtVmFsdWUgPSA3LAorICAgIH07CisgICAgLy8gRXhwb3NlIHRhZyBzeW1ib2xzIGZvciBsZWdhY3kgY29kZQorICAgIHN0YXRpYyBjb25zdCBpbmxpbmUgVGFnIGJvb2xlYW5WYWx1ZSA9IFRhZzo6Ym9vbGVhblZhbHVlOworICAgIHN0YXRpYyBjb25zdCBpbmxpbmUgVGFnIGJ5dGVWYWx1ZSA9IFRhZzo6Ynl0ZVZhbHVlOworICAgIHN0YXRpYyBjb25zdCBpbmxpbmUgVGFnIGNoYXJWYWx1ZSA9IFRhZzo6Y2hhclZhbHVlOworICAgIHN0YXRpYyBjb25zdCBpbmxpbmUgVGFnIGludFZhbHVlID0gVGFnOjppbnRWYWx1ZTsKKyAgICBzdGF0aWMgY29uc3QgaW5saW5lIFRhZyBsb25nVmFsdWUgPSBUYWc6OmxvbmdWYWx1ZTsKKyAgICBzdGF0aWMgY29uc3QgaW5saW5lIFRhZyBmbG9hdFZhbHVlID0gVGFnOjpmbG9hdFZhbHVlOworICAgIHN0YXRpYyBjb25zdCBpbmxpbmUgVGFnIGRvdWJsZVZhbHVlID0gVGFnOjpkb3VibGVWYWx1ZTsKKyAgICBzdGF0aWMgY29uc3QgaW5saW5lIFRhZyBlbnVtVmFsdWUgPSBUYWc6OmVudW1WYWx1ZTsKKworICAgIHRlbXBsYXRlIDxUYWcgX1RhZz4KKyAgICB1c2luZyBfYXQgPSB0eXBlbmFtZSBzdGQ6OnR1cGxlX2VsZW1lbnQ8c3RhdGljX2Nhc3Q8c2l6ZV90PihfVGFnKSwgc3RkOjp0dXBsZTxib29sLCBpbnQ4X3QsIGNoYXIxNl90LCBpbnQzMl90LCBpbnQ2NF90LCBmbG9hdCwgZG91YmxlLCA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMb25nRW51bT4+Ojp0eXBlOworICAgIHRlbXBsYXRlIDxUYWcgX1RhZywgdHlwZW5hbWUgX1R5cGU+CisgICAgc3RhdGljIEZpeGVkVW5pb24gbWFrZShfVHlwZSYmIF9hcmcpIHsKKyAgICAgIEZpeGVkVW5pb24gX2luc3Q7CisgICAgICBfaW5zdC5zZXQ8X1RhZz4oc3RkOjpmb3J3YXJkPF9UeXBlPihfYXJnKSk7CisgICAgICByZXR1cm4gX2luc3Q7CisgICAgfQorICAgIGNvbnN0ZXhwciBUYWcgZ2V0VGFnKCkgY29uc3QgeworICAgICAgcmV0dXJuIF90YWc7CisgICAgfQorICAgIHRlbXBsYXRlIDxUYWcgX1RhZz4KKyAgICBjb25zdCBfYXQ8X1RhZz4mIGdldCgpIGNvbnN0IHsKKyAgICAgIGlmIChfVGFnICE9IF90YWcpIHsgX19hc3NlcnQyKF9fRklMRV9fLCBfX0xJTkVfXywgX19QUkVUVFlfRlVOQ1RJT05fXywgImJhZCBhY2Nlc3M6IGEgd3JvbmcgdGFnIik7IH0KKyAgICAgIHJldHVybiAqKF9hdDxfVGFnPiopKCZfdmFsdWUpOworICAgIH0KKyAgICB0ZW1wbGF0ZSA8VGFnIF9UYWc+CisgICAgX2F0PF9UYWc+JiBnZXQoKSB7CisgICAgICBpZiAoX1RhZyAhPSBfdGFnKSB7IF9fYXNzZXJ0MihfX0ZJTEVfXywgX19MSU5FX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18sICJiYWQgYWNjZXNzOiBhIHdyb25nIHRhZyIpOyB9CisgICAgICByZXR1cm4gKihfYXQ8X1RhZz4qKSgmX3ZhbHVlKTsKKyAgICB9CisgICAgdGVtcGxhdGUgPFRhZyBfVGFnLCB0eXBlbmFtZSBfVHlwZT4KKyAgICB2b2lkIHNldChfVHlwZSYmIF9hcmcpIHsKKyAgICAgIF90YWcgPSBfVGFnOworICAgICAgZ2V0PF9UYWc+KCkgPSBzdGQ6OmZvcndhcmQ8X1R5cGU+KF9hcmcpOworICAgIH0KKyAgICBzdGF0aWMgaW50IF9jbXAoY29uc3QgRml4ZWRVbmlvbiYgX2xocywgY29uc3QgRml4ZWRVbmlvbiYgX3JocykgeworICAgICAgcmV0dXJuIF9jbXBfdmFsdWUoX2xocy5nZXRUYWcoKSwgX3Jocy5nZXRUYWcoKSkgfHwgX2NtcF92YWx1ZV9hdDxlbnVtVmFsdWU+KF9saHMsIF9yaHMpOworICAgIH0KKyAgICB0ZW1wbGF0ZSA8VGFnIF9UYWc+CisgICAgc3RhdGljIGludCBfY21wX3ZhbHVlX2F0KGNvbnN0IEZpeGVkVW5pb24mIF9saHMsIGNvbnN0IEZpeGVkVW5pb24mIF9yaHMpIHsKKyAgICAgIGlmIGNvbnN0ZXhwciAoX1RhZyA9PSBib29sZWFuVmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIF9jbXBfdmFsdWUoX2xocy5nZXQ8X1RhZz4oKSwgX3Jocy5nZXQ8X1RhZz4oKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gKF9saHMuZ2V0VGFnKCkgPT0gX1RhZykKKyAgICAgICAgICA/IF9jbXBfdmFsdWUoX2xocy5nZXQ8X1RhZz4oKSwgX3Jocy5nZXQ8X1RhZz4oKSkKKyAgICAgICAgICA6IF9jbXBfdmFsdWVfYXQ8c3RhdGljX2Nhc3Q8VGFnPihzdGF0aWNfY2FzdDxzaXplX3Q+KF9UYWcpLTEpPihfbGhzLCBfcmhzKTsKKyAgICAgIH0KKyAgICB9CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UeXBlPgorICAgIHN0YXRpYyBpbnQgX2NtcF92YWx1ZShjb25zdCBfVHlwZSYgX2xocywgY29uc3QgX1R5cGUmIF9yaHMpIHsKKyAgICAgIHJldHVybiAoX2xocyA9PSBfcmhzKSA/IDAgOiAoX2xocyA8IF9yaHMpID8gLTEgOiAxOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEZpeGVkVW5pb24mX3JocykgY29uc3QgeworICAgICAgcmV0dXJuIF9jbXAoKnRoaXMsIF9yaHMpICE9IDA7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBGaXhlZFVuaW9uJl9yaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBfY21wKCp0aGlzLCBfcmhzKSA8IDA7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgRml4ZWRVbmlvbiZfcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gX2NtcCgqdGhpcywgX3JocykgPD0gMDsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBGaXhlZFVuaW9uJl9yaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBfY21wKCp0aGlzLCBfcmhzKSA9PSAwOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgRml4ZWRVbmlvbiZfcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gX2NtcCgqdGhpcywgX3JocykgPiAwOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IEZpeGVkVW5pb24mX3JocykgY29uc3QgeworICAgICAgcmV0dXJuIF9jbXAoKnRoaXMsIF9yaHMpID49IDA7CisgICAgfQorICAgIDo6YW5kcm9pZDo6c3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgZmluYWw7CisgICAgOjphbmRyb2lkOjpzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IGZpbmFsOworICAgIHN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiBnZXRQYXJjZWxhYmxlRGVzY3JpcHRvcigpIHsKKyAgICAgIHN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0YXRpY1N0cmluZzE2IERFU0NJUFRPUiAodSJhbmRyb2lkLmFpZGwudGVzdHMuRml4ZWRTaXplLkZpeGVkVW5pb24iKTsKKyAgICAgIHJldHVybiBERVNDSVBUT1I7CisgICAgfQorICAgIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsKKyAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvczsKKyAgICAgIG9zIDw8ICJGaXhlZFVuaW9ueyI7CisgICAgICBzd2l0Y2ggKGdldFRhZygpKSB7CisgICAgICBjYXNlIGJvb2xlYW5WYWx1ZTogb3MgPDwgImJvb2xlYW5WYWx1ZTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhnZXQ8Ym9vbGVhblZhbHVlPigpKTsgYnJlYWs7CisgICAgICBjYXNlIGJ5dGVWYWx1ZTogb3MgPDwgImJ5dGVWYWx1ZTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhnZXQ8Ynl0ZVZhbHVlPigpKTsgYnJlYWs7CisgICAgICBjYXNlIGNoYXJWYWx1ZTogb3MgPDwgImNoYXJWYWx1ZTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhnZXQ8Y2hhclZhbHVlPigpKTsgYnJlYWs7CisgICAgICBjYXNlIGludFZhbHVlOiBvcyA8PCAiaW50VmFsdWU6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoZ2V0PGludFZhbHVlPigpKTsgYnJlYWs7CisgICAgICBjYXNlIGxvbmdWYWx1ZTogb3MgPDwgImxvbmdWYWx1ZTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhnZXQ8bG9uZ1ZhbHVlPigpKTsgYnJlYWs7CisgICAgICBjYXNlIGZsb2F0VmFsdWU6IG9zIDw8ICJmbG9hdFZhbHVlOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGdldDxmbG9hdFZhbHVlPigpKTsgYnJlYWs7CisgICAgICBjYXNlIGRvdWJsZVZhbHVlOiBvcyA8PCAiZG91YmxlVmFsdWU6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoZ2V0PGRvdWJsZVZhbHVlPigpKTsgYnJlYWs7CisgICAgICBjYXNlIGVudW1WYWx1ZTogb3MgPDwgImVudW1WYWx1ZTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhnZXQ8ZW51bVZhbHVlPigpKTsgYnJlYWs7CisgICAgICB9CisgICAgICBvcyA8PCAifSI7CisgICAgICByZXR1cm4gb3Muc3RyKCk7CisgICAgfQorICBwcml2YXRlOgorICAgIFRhZyBfdGFnID0gYm9vbGVhblZhbHVlOworICAgIHVuaW9uIF92YWx1ZV90IHsKKyAgICAgIF92YWx1ZV90KCkge30KKyAgICAgIH5fdmFsdWVfdCgpIHt9CisgICAgICBib29sIGJvb2xlYW5WYWx1ZSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkICgxKSkpID0gYm9vbChmYWxzZSk7CisgICAgICBpbnQ4X3QgYnl0ZVZhbHVlIF9fYXR0cmlidXRlX18oKGFsaWduZWQgKDEpKSk7CisgICAgICBjaGFyMTZfdCBjaGFyVmFsdWUgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCAoMikpKTsKKyAgICAgIGludDMyX3QgaW50VmFsdWUgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCAoNCkpKTsKKyAgICAgIGludDY0X3QgbG9uZ1ZhbHVlIF9fYXR0cmlidXRlX18oKGFsaWduZWQgKDgpKSk7CisgICAgICBmbG9hdCBmbG9hdFZhbHVlIF9fYXR0cmlidXRlX18oKGFsaWduZWQgKDQpKSk7CisgICAgICBkb3VibGUgZG91YmxlVmFsdWUgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCAoOCkpKTsKKyAgICAgIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtIGVudW1WYWx1ZSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkICg4KSkpOworICAgIH0gX3ZhbHVlOworICB9OyAgLy8gY2xhc3MgRml4ZWRVbmlvbgorICBjbGFzcyBGaXhlZFBhcmNlbGFibGUgOiBwdWJsaWMgOjphbmRyb2lkOjpQYXJjZWxhYmxlIHsKKyAgcHVibGljOgorICAgIGJvb2wgYm9vbGVhblZhbHVlID0gZmFsc2U7CisgICAgaW50OF90IGJ5dGVWYWx1ZSA9IDA7CisgICAgY2hhcjE2X3QgY2hhclZhbHVlID0gJ1wwJzsKKyAgICBpbnQzMl90IGludFZhbHVlID0gMDsKKyAgICBpbnQ2NF90IGxvbmdWYWx1ZSA9IDBMOworICAgIGZsb2F0IGZsb2F0VmFsdWUgPSAwLjAwMDAwMGY7CisgICAgZG91YmxlIGRvdWJsZVZhbHVlID0gMC4wMDAwMDA7CisgICAgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0gZW51bVZhbHVlID0gOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW06OkZPTzsKKyAgICA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpGaXhlZFNpemU6OkZpeGVkVW5pb24gcGFyY2VsYWJsZVZhbHVlOworICAgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgRml4ZWRQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZShib29sZWFuVmFsdWUsIGJ5dGVWYWx1ZSwgY2hhclZhbHVlLCBpbnRWYWx1ZSwgbG9uZ1ZhbHVlLCBmbG9hdFZhbHVlLCBkb3VibGVWYWx1ZSwgZW51bVZhbHVlLCBwYXJjZWxhYmxlVmFsdWUpICE9IHN0ZDo6dGllKHJocy5ib29sZWFuVmFsdWUsIHJocy5ieXRlVmFsdWUsIHJocy5jaGFyVmFsdWUsIHJocy5pbnRWYWx1ZSwgcmhzLmxvbmdWYWx1ZSwgcmhzLmZsb2F0VmFsdWUsIHJocy5kb3VibGVWYWx1ZSwgcmhzLmVudW1WYWx1ZSwgcmhzLnBhcmNlbGFibGVWYWx1ZSk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBGaXhlZFBhcmNlbGFibGUmIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKGJvb2xlYW5WYWx1ZSwgYnl0ZVZhbHVlLCBjaGFyVmFsdWUsIGludFZhbHVlLCBsb25nVmFsdWUsIGZsb2F0VmFsdWUsIGRvdWJsZVZhbHVlLCBlbnVtVmFsdWUsIHBhcmNlbGFibGVWYWx1ZSkgPCBzdGQ6OnRpZShyaHMuYm9vbGVhblZhbHVlLCByaHMuYnl0ZVZhbHVlLCByaHMuY2hhclZhbHVlLCByaHMuaW50VmFsdWUsIHJocy5sb25nVmFsdWUsIHJocy5mbG9hdFZhbHVlLCByaHMuZG91YmxlVmFsdWUsIHJocy5lbnVtVmFsdWUsIHJocy5wYXJjZWxhYmxlVmFsdWUpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IEZpeGVkUGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoYm9vbGVhblZhbHVlLCBieXRlVmFsdWUsIGNoYXJWYWx1ZSwgaW50VmFsdWUsIGxvbmdWYWx1ZSwgZmxvYXRWYWx1ZSwgZG91YmxlVmFsdWUsIGVudW1WYWx1ZSwgcGFyY2VsYWJsZVZhbHVlKSA8PSBzdGQ6OnRpZShyaHMuYm9vbGVhblZhbHVlLCByaHMuYnl0ZVZhbHVlLCByaHMuY2hhclZhbHVlLCByaHMuaW50VmFsdWUsIHJocy5sb25nVmFsdWUsIHJocy5mbG9hdFZhbHVlLCByaHMuZG91YmxlVmFsdWUsIHJocy5lbnVtVmFsdWUsIHJocy5wYXJjZWxhYmxlVmFsdWUpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEZpeGVkUGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoYm9vbGVhblZhbHVlLCBieXRlVmFsdWUsIGNoYXJWYWx1ZSwgaW50VmFsdWUsIGxvbmdWYWx1ZSwgZmxvYXRWYWx1ZSwgZG91YmxlVmFsdWUsIGVudW1WYWx1ZSwgcGFyY2VsYWJsZVZhbHVlKSA9PSBzdGQ6OnRpZShyaHMuYm9vbGVhblZhbHVlLCByaHMuYnl0ZVZhbHVlLCByaHMuY2hhclZhbHVlLCByaHMuaW50VmFsdWUsIHJocy5sb25nVmFsdWUsIHJocy5mbG9hdFZhbHVlLCByaHMuZG91YmxlVmFsdWUsIHJocy5lbnVtVmFsdWUsIHJocy5wYXJjZWxhYmxlVmFsdWUpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgRml4ZWRQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZShib29sZWFuVmFsdWUsIGJ5dGVWYWx1ZSwgY2hhclZhbHVlLCBpbnRWYWx1ZSwgbG9uZ1ZhbHVlLCBmbG9hdFZhbHVlLCBkb3VibGVWYWx1ZSwgZW51bVZhbHVlLCBwYXJjZWxhYmxlVmFsdWUpID4gc3RkOjp0aWUocmhzLmJvb2xlYW5WYWx1ZSwgcmhzLmJ5dGVWYWx1ZSwgcmhzLmNoYXJWYWx1ZSwgcmhzLmludFZhbHVlLCByaHMubG9uZ1ZhbHVlLCByaHMuZmxvYXRWYWx1ZSwgcmhzLmRvdWJsZVZhbHVlLCByaHMuZW51bVZhbHVlLCByaHMucGFyY2VsYWJsZVZhbHVlKTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBGaXhlZFBhcmNlbGFibGUmIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKGJvb2xlYW5WYWx1ZSwgYnl0ZVZhbHVlLCBjaGFyVmFsdWUsIGludFZhbHVlLCBsb25nVmFsdWUsIGZsb2F0VmFsdWUsIGRvdWJsZVZhbHVlLCBlbnVtVmFsdWUsIHBhcmNlbGFibGVWYWx1ZSkgPj0gc3RkOjp0aWUocmhzLmJvb2xlYW5WYWx1ZSwgcmhzLmJ5dGVWYWx1ZSwgcmhzLmNoYXJWYWx1ZSwgcmhzLmludFZhbHVlLCByaHMubG9uZ1ZhbHVlLCByaHMuZmxvYXRWYWx1ZSwgcmhzLmRvdWJsZVZhbHVlLCByaHMuZW51bVZhbHVlLCByaHMucGFyY2VsYWJsZVZhbHVlKTsKKyAgICB9CisKKyAgICA6OmFuZHJvaWQ6OnN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGZpbmFsOworICAgIDo6YW5kcm9pZDo6c3RhdHVzX3Qgd3JpdGVUb1BhcmNlbCg6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCBmaW5hbDsKKyAgICBzdGF0aWMgY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiYgZ2V0UGFyY2VsYWJsZURlc2NyaXB0b3IoKSB7CisgICAgICBzdGF0aWMgY29uc3QgOjphbmRyb2lkOjpTdGF0aWNTdHJpbmcxNiBERVNDSVBUT1IgKHUiYW5kcm9pZC5haWRsLnRlc3RzLkZpeGVkU2l6ZS5GaXhlZFBhcmNlbGFibGUiKTsKKyAgICAgIHJldHVybiBERVNDSVBUT1I7CisgICAgfQorICAgIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsKKyAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvczsKKyAgICAgIG9zIDw8ICJGaXhlZFBhcmNlbGFibGV7IjsKKyAgICAgIG9zIDw8ICJib29sZWFuVmFsdWU6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoYm9vbGVhblZhbHVlKTsKKyAgICAgIG9zIDw8ICIsIGJ5dGVWYWx1ZTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhieXRlVmFsdWUpOworICAgICAgb3MgPDwgIiwgY2hhclZhbHVlOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGNoYXJWYWx1ZSk7CisgICAgICBvcyA8PCAiLCBpbnRWYWx1ZTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbnRWYWx1ZSk7CisgICAgICBvcyA8PCAiLCBsb25nVmFsdWU6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcobG9uZ1ZhbHVlKTsKKyAgICAgIG9zIDw8ICIsIGZsb2F0VmFsdWU6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoZmxvYXRWYWx1ZSk7CisgICAgICBvcyA8PCAiLCBkb3VibGVWYWx1ZTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhkb3VibGVWYWx1ZSk7CisgICAgICBvcyA8PCAiLCBlbnVtVmFsdWU6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoZW51bVZhbHVlKTsKKyAgICAgIG9zIDw8ICIsIHBhcmNlbGFibGVWYWx1ZTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhwYXJjZWxhYmxlVmFsdWUpOworICAgICAgb3MgPDwgIn0iOworICAgICAgcmV0dXJuIG9zLnN0cigpOworICAgIH0KKyAgfTsgIC8vIGNsYXNzIEZpeGVkUGFyY2VsYWJsZQorICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEZpeGVkU2l6ZSYpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoKSAhPSBzdGQ6OnRpZSgpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBGaXhlZFNpemUmKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKCkgPCBzdGQ6OnRpZSgpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgRml4ZWRTaXplJikgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZSgpIDw9IHN0ZDo6dGllKCk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBGaXhlZFNpemUmKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKCkgPT0gc3RkOjp0aWUoKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgRml4ZWRTaXplJikgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZSgpID4gc3RkOjp0aWUoKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IEZpeGVkU2l6ZSYpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoKSA+PSBzdGQ6OnRpZSgpOworICB9CisKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBmaW5hbDsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IGZpbmFsOworICBzdGF0aWMgY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiYgZ2V0UGFyY2VsYWJsZURlc2NyaXB0b3IoKSB7CisgICAgc3RhdGljIGNvbnN0IDo6YW5kcm9pZDo6U3RhdGljU3RyaW5nMTYgREVTQ0lQVE9SICh1ImFuZHJvaWQuYWlkbC50ZXN0cy5GaXhlZFNpemUiKTsKKyAgICByZXR1cm4gREVTQ0lQVE9SOworICB9CisgIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7CisgICAgb3MgPDwgIkZpeGVkU2l6ZXsiOworICAgIG9zIDw8ICJ9IjsKKyAgICByZXR1cm4gb3Muc3RyKCk7CisgIH0KK307ICAvLyBjbGFzcyBGaXhlZFNpemUKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworW1tub2Rpc2NhcmRdXSBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKEZpeGVkU2l6ZTo6Rml4ZWRVbmlvbjo6VGFnIHZhbCkgeworICBzd2l0Y2godmFsKSB7CisgIGNhc2UgRml4ZWRTaXplOjpGaXhlZFVuaW9uOjpUYWc6OmJvb2xlYW5WYWx1ZToKKyAgICByZXR1cm4gImJvb2xlYW5WYWx1ZSI7CisgIGNhc2UgRml4ZWRTaXplOjpGaXhlZFVuaW9uOjpUYWc6OmJ5dGVWYWx1ZToKKyAgICByZXR1cm4gImJ5dGVWYWx1ZSI7CisgIGNhc2UgRml4ZWRTaXplOjpGaXhlZFVuaW9uOjpUYWc6OmNoYXJWYWx1ZToKKyAgICByZXR1cm4gImNoYXJWYWx1ZSI7CisgIGNhc2UgRml4ZWRTaXplOjpGaXhlZFVuaW9uOjpUYWc6OmludFZhbHVlOgorICAgIHJldHVybiAiaW50VmFsdWUiOworICBjYXNlIEZpeGVkU2l6ZTo6Rml4ZWRVbmlvbjo6VGFnOjpsb25nVmFsdWU6CisgICAgcmV0dXJuICJsb25nVmFsdWUiOworICBjYXNlIEZpeGVkU2l6ZTo6Rml4ZWRVbmlvbjo6VGFnOjpmbG9hdFZhbHVlOgorICAgIHJldHVybiAiZmxvYXRWYWx1ZSI7CisgIGNhc2UgRml4ZWRTaXplOjpGaXhlZFVuaW9uOjpUYWc6OmRvdWJsZVZhbHVlOgorICAgIHJldHVybiAiZG91YmxlVmFsdWUiOworICBjYXNlIEZpeGVkU2l6ZTo6Rml4ZWRVbmlvbjo6VGFnOjplbnVtVmFsdWU6CisgICAgcmV0dXJuICJlbnVtVmFsdWUiOworICBkZWZhdWx0OgorICAgIHJldHVybiBzdGQ6OnRvX3N0cmluZyhzdGF0aWNfY2FzdDxpbnQ4X3Q+KHZhbCkpOworICB9Cit9Cit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGludGVybmFsIHsKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdjKysxNy1leHRlbnNpb25zIgordGVtcGxhdGUgPD4KK2NvbnN0ZXhwciBpbmxpbmUgc3RkOjphcnJheTw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpGaXhlZFNpemU6OkZpeGVkVW5pb246OlRhZywgOD4gZW51bV92YWx1ZXM8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Rml4ZWRTaXplOjpGaXhlZFVuaW9uOjpUYWc+ID0geworICA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpGaXhlZFNpemU6OkZpeGVkVW5pb246OlRhZzo6Ym9vbGVhblZhbHVlLAorICA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpGaXhlZFNpemU6OkZpeGVkVW5pb246OlRhZzo6Ynl0ZVZhbHVlLAorICA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpGaXhlZFNpemU6OkZpeGVkVW5pb246OlRhZzo6Y2hhclZhbHVlLAorICA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpGaXhlZFNpemU6OkZpeGVkVW5pb246OlRhZzo6aW50VmFsdWUsCisgIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkZpeGVkU2l6ZTo6Rml4ZWRVbmlvbjo6VGFnOjpsb25nVmFsdWUsCisgIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkZpeGVkU2l6ZTo6Rml4ZWRVbmlvbjo6VGFnOjpmbG9hdFZhbHVlLAorICA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpGaXhlZFNpemU6OkZpeGVkVW5pb246OlRhZzo6ZG91YmxlVmFsdWUsCisgIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkZpeGVkU2l6ZTo6Rml4ZWRVbmlvbjo6VGFnOjplbnVtVmFsdWUsCit9OworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAorfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0dlbmVyaWNTdHJ1Y3R1cmVkUGFyY2VsYWJsZS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0dlbmVyaWNTdHJ1Y3R1cmVkUGFyY2VsYWJsZS5oCmluZGV4IGU2NTVlZTEuLjdhODZmODEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9HZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGUuaAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvR2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxlLmgKQEAgLTgsMTQgKzgsMTMgQEAKICNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIG5hbWVzcGFjZSBhaWRsIHsKLQogbmFtZXNwYWNlIHRlc3RzIHsKLQogdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFUsIHR5cGVuYW1lIEI+CiBjbGFzcyBHZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGUgOiBwdWJsaWMgOjphbmRyb2lkOjpQYXJjZWxhYmxlIHsKIHB1YmxpYzoKKyAgaW50MzJfdCBhID0gMDsKKyAgaW50MzJfdCBiID0gMDsKICAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBHZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGUmIHJocykgY29uc3QgewogICAgIHJldHVybiBzdGQ6OnRpZShhLCBiKSAhPSBzdGQ6OnRpZShyaHMuYSwgcmhzLmIpOwogICB9CkBAIC0zNSw4ICszNCw2IEBACiAgICAgcmV0dXJuIHN0ZDo6dGllKGEsIGIpID49IHN0ZDo6dGllKHJocy5hLCByaHMuYik7CiAgIH0KIAotICBpbnQzMl90IGEgPSBpbnQzMl90KDApOwotICBpbnQzMl90IGIgPSBpbnQzMl90KDApOwogICA6OmFuZHJvaWQ6OnN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGZpbmFsOwogICA6OmFuZHJvaWQ6OnN0YXR1c190IHdyaXRlVG9QYXJjZWwoOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgZmluYWw7CiAgIHN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiBnZXRQYXJjZWxhYmxlRGVzY3JpcHRvcigpIHsKQEAgLTUyLDI3ICs0OSwyNSBAQAogICAgIHJldHVybiBvcy5zdHIoKTsKICAgfQogfTsgIC8vIGNsYXNzIEdlbmVyaWNTdHJ1Y3R1cmVkUGFyY2VsYWJsZQotCiB9ICAvLyBuYW1lc3BhY2UgdGVzdHMKLQogfSAgLy8gbmFtZXNwYWNlIGFpZGwKLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKICNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvR2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxlLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogbmFtZXNwYWNlIGFpZGwgewotCiBuYW1lc3BhY2UgdGVzdHMgewotCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVSwgdHlwZW5hbWUgQj4KIDo6YW5kcm9pZDo6c3RhdHVzX3QgR2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxlPFQsVSxCPjo6cmVhZEZyb21QYXJjZWwoY29uc3QgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgewogICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOwotICBbW21heWJlX3VudXNlZF1dIHNpemVfdCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOwotICBpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPSBfYWlkbF9wYXJjZWwtPnJlYWRJbnQzMigpOwotICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSA8IDApIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKLSAgW1ttYXliZV91bnVzZWRdXSBzaXplX3QgX2FpZGxfcGFyY2VsYWJsZV9zaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplKTsKKyAgc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgIGludDMyX3QgX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSA9IDA7CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRJbnQzMigmX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSA8IDQpIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgc2l6ZV90IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4oX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSk7CiAgIGlmIChfYWlkbF9zdGFydF9wb3MgPiBTSVpFX01BWCAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuIDo6YW5kcm9pZDo6QkFEX1ZBTFVFOwogICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKICAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwpAQCAtOTMsNyArODgsNiBAQAogICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwogICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKIH0KLQogdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFUsIHR5cGVuYW1lIEI+CiA6OmFuZHJvaWQ6OnN0YXR1c190IEdlbmVyaWNTdHJ1Y3R1cmVkUGFyY2VsYWJsZTxULFUsQj46OndyaXRlVG9QYXJjZWwoOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgewogICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOwpAQCAtMTEzLDkgKzEwNyw2IEBACiAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX2VuZF9wb3MpOwogICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKIH0KLQogfSAgLy8gbmFtZXNwYWNlIHRlc3RzCi0KIH0gIC8vIG5hbWVzcGFjZSBhaWRsCi0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvSURlcHJlY2F0ZWQuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9JRGVwcmVjYXRlZC5oCmluZGV4IDczOTMxZWEuLjE5NWI0N2MgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9JRGVwcmVjYXRlZC5oCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9JRGVwcmVjYXRlZC5oCkBAIC02LDExICs2LDggQEAKICNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogbmFtZXNwYWNlIGFpZGwgewotCiBuYW1lc3BhY2UgdGVzdHMgewotCiBjbGFzcyBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKCJ0ZXN0IikpKSBJRGVwcmVjYXRlZCA6IHB1YmxpYyA6OmFuZHJvaWQ6OklJbnRlcmZhY2UgewogcHVibGljOgogICBERUNMQVJFX01FVEFfSU5URVJGQUNFKERlcHJlY2F0ZWQpCkBAIC0yMiw5ICsxOSw2IEBACiAgICAgcmV0dXJuIG51bGxwdHI7CiAgIH0KIH07ICAvLyBjbGFzcyBJRGVwcmVjYXRlZERlZmF1bHQKLQogfSAgLy8gbmFtZXNwYWNlIHRlc3RzCi0KIH0gIC8vIG5hbWVzcGFjZSBhaWRsCi0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvSU5hbWVkQ2FsbGJhY2suaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9JTmFtZWRDYWxsYmFjay5oCmluZGV4IDkxMDI5NGMuLjJiMjc3NzQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9JTmFtZWRDYWxsYmFjay5oCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9JTmFtZWRDYWxsYmFjay5oCkBAIC03LDExICs3LDggQEAKICNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogbmFtZXNwYWNlIGFpZGwgewotCiBuYW1lc3BhY2UgdGVzdHMgewotCiBjbGFzcyBJTmFtZWRDYWxsYmFjayA6IHB1YmxpYyA6OmFuZHJvaWQ6OklJbnRlcmZhY2UgewogcHVibGljOgogICBERUNMQVJFX01FVEFfSU5URVJGQUNFKE5hbWVkQ2FsbGJhY2spCkBAIC0yMywxMyArMjAsMTAgQEAKICAgOjphbmRyb2lkOjpJQmluZGVyKiBvbkFzQmluZGVyKCkgb3ZlcnJpZGUgewogICAgIHJldHVybiBudWxscHRyOwogICB9Ci0gIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgR2V0TmFtZSg6OmFuZHJvaWQ6OlN0cmluZzE2Kikgb3ZlcnJpZGUgeworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEdldE5hbWUoOjphbmRyb2lkOjpTdHJpbmcxNiogLypfYWlkbF9yZXR1cm4qLykgb3ZlcnJpZGUgewogICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOwogICB9CiB9OyAgLy8gY2xhc3MgSU5hbWVkQ2FsbGJhY2tEZWZhdWx0Ci0KIH0gIC8vIG5hbWVzcGFjZSB0ZXN0cwotCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0lOZXdOYW1lLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvSU5ld05hbWUuaAppbmRleCBhM2Q5MTFjLi42OTNmODhiIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvSU5ld05hbWUuaAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvSU5ld05hbWUuaApAQCAtNywxMSArNyw4IEBACiAjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIG5hbWVzcGFjZSBhaWRsIHsKLQogbmFtZXNwYWNlIHRlc3RzIHsKLQogY2xhc3MgSU5ld05hbWUgOiBwdWJsaWMgOjphbmRyb2lkOjpJSW50ZXJmYWNlIHsKIHB1YmxpYzoKICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShOZXdOYW1lKQpAQCAtMjMsMTMgKzIwLDEwIEBACiAgIDo6YW5kcm9pZDo6SUJpbmRlciogb25Bc0JpbmRlcigpIG92ZXJyaWRlIHsKICAgICByZXR1cm4gbnVsbHB0cjsKICAgfQotICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlYWxOYW1lKDo6YW5kcm9pZDo6U3RyaW5nMTYqKSBvdmVycmlkZSB7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVhbE5hbWUoOjphbmRyb2lkOjpTdHJpbmcxNiogLypfYWlkbF9yZXR1cm4qLykgb3ZlcnJpZGUgewogICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOwogICB9CiB9OyAgLy8gY2xhc3MgSU5ld05hbWVEZWZhdWx0Ci0KIH0gIC8vIG5hbWVzcGFjZSB0ZXN0cwotCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0lPbGROYW1lLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvSU9sZE5hbWUuaAppbmRleCBhYjU1MzBiLi4yMTQyZDg4IDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvSU9sZE5hbWUuaAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvSU9sZE5hbWUuaApAQCAtNywxMSArNyw4IEBACiAjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIG5hbWVzcGFjZSBhaWRsIHsKLQogbmFtZXNwYWNlIHRlc3RzIHsKLQogY2xhc3MgSU9sZE5hbWUgOiBwdWJsaWMgOjphbmRyb2lkOjpJSW50ZXJmYWNlIHsKIHB1YmxpYzoKICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShPbGROYW1lKQpAQCAtMjMsMTMgKzIwLDEwIEBACiAgIDo6YW5kcm9pZDo6SUJpbmRlciogb25Bc0JpbmRlcigpIG92ZXJyaWRlIHsKICAgICByZXR1cm4gbnVsbHB0cjsKICAgfQotICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlYWxOYW1lKDo6YW5kcm9pZDo6U3RyaW5nMTYqKSBvdmVycmlkZSB7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVhbE5hbWUoOjphbmRyb2lkOjpTdHJpbmcxNiogLypfYWlkbF9yZXR1cm4qLykgb3ZlcnJpZGUgewogICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOwogICB9CiB9OyAgLy8gY2xhc3MgSU9sZE5hbWVEZWZhdWx0Ci0KIH0gIC8vIG5hbWVzcGFjZSB0ZXN0cwotCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0lUZXN0U2VydmljZS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0lUZXN0U2VydmljZS5oCmluZGV4IDlkOTFlMGUuLjkyNDZhODcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9JVGVzdFNlcnZpY2UuaAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvSVRlc3RTZXJ2aWNlLmgKQEAgLTUsMTA5ICs1LDIxMSBAQAogI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9JTmFtZWRDYWxsYmFjay5oPgogI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9JTmV3TmFtZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9JT2xkTmFtZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9JVGVzdFNlcnZpY2UuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvSW50RW51bS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9Mb25nRW51bS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9SZWN1cnNpdmVMaXN0Lmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL1N0cnVjdHVyZWRQYXJjZWxhYmxlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL1VuaW9uLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9FeHRlbmRhYmxlUGFyY2VsYWJsZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3RvX3N0cmluZy5oPgogI2luY2x1ZGUgPGJpbmRlci9JQmluZGVyLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbEZpbGVEZXNjcmlwdG9yLmg+CiAjaW5jbHVkZSA8YmluZGVyL1N0YXR1cy5oPgogI2luY2x1ZGUgPGNzdGRpbnQ+CiAjaW5jbHVkZSA8b3B0aW9uYWw+CiAjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHR1cGxlPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CiAjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgogI2luY2x1ZGUgPHZlY3Rvcj4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotCiBuYW1lc3BhY2UgYWlkbCB7Ci0KIG5hbWVzcGFjZSB0ZXN0cyB7Ci0KIGNsYXNzIElUZXN0U2VydmljZSA6IHB1YmxpYyA6OmFuZHJvaWQ6OklJbnRlcmZhY2UgewogcHVibGljOgogICBERUNMQVJFX01FVEFfSU5URVJGQUNFKFRlc3RTZXJ2aWNlKQotICBlbnVtICA6IGludDhfdCB7Ci0gICAgQllURV9URVNUX0NPTlNUQU5UID0gMTcsCi0gIH07Ci0gIGVudW0gIDogaW50MzJfdCB7Ci0gICAgVEVTVF9DT05TVEFOVCA9IDQyLAotICAgIFRFU1RfQ09OU1RBTlQyID0gLTQyLAotICAgIFRFU1RfQ09OU1RBTlQzID0gNDIsCi0gICAgVEVTVF9DT05TVEFOVDQgPSA0LAotICAgIFRFU1RfQ09OU1RBTlQ1ID0gLTQsCi0gICAgVEVTVF9DT05TVEFOVDYgPSAwLAotICAgIFRFU1RfQ09OU1RBTlQ3ID0gMCwKLSAgICBURVNUX0NPTlNUQU5UOCA9IDAsCi0gICAgVEVTVF9DT05TVEFOVDkgPSA4NiwKLSAgICBURVNUX0NPTlNUQU5UMTAgPSAxNjUsCi0gICAgVEVTVF9DT05TVEFOVDExID0gMjUwLAotICAgIFRFU1RfQ09OU1RBTlQxMiA9IC0xLAotICAgIEExID0gMSwKLSAgICBBMiA9IDEsCi0gICAgQTMgPSAxLAotICAgIEE0ID0gMSwKLSAgICBBNSA9IDEsCi0gICAgQTYgPSAxLAotICAgIEE3ID0gMSwKLSAgICBBOCA9IDEsCi0gICAgQTkgPSAxLAotICAgIEExMCA9IDEsCi0gICAgQTExID0gMSwKLSAgICBBMTIgPSAxLAotICAgIEExMyA9IDEsCi0gICAgQTE0ID0gMSwKLSAgICBBMTUgPSAxLAotICAgIEExNiA9IDEsCi0gICAgQTE3ID0gMSwKLSAgICBBMTggPSAxLAotICAgIEExOSA9IDEsCi0gICAgQTIwID0gMSwKLSAgICBBMjEgPSAxLAotICAgIEEyMiA9IDEsCi0gICAgQTIzID0gMSwKLSAgICBBMjQgPSAxLAotICAgIEEyNSA9IDEsCi0gICAgQTI2ID0gMSwKLSAgICBBMjcgPSAxLAotICAgIEEyOCA9IDEsCi0gICAgQTI5ID0gMSwKLSAgICBBMzAgPSAxLAotICAgIEEzMSA9IDEsCi0gICAgQTMyID0gMSwKLSAgICBBMzMgPSAxLAotICAgIEEzNCA9IDEsCi0gICAgQTM1ID0gMSwKLSAgICBBMzYgPSAxLAotICAgIEEzNyA9IDEsCi0gICAgQTM4ID0gMSwKLSAgICBBMzkgPSAxLAotICAgIEE0MCA9IDEsCi0gICAgQTQxID0gMSwKLSAgICBBNDIgPSAxLAotICAgIEE0MyA9IDEsCi0gICAgQTQ0ID0gMSwKLSAgICBBNDUgPSAxLAotICAgIEE0NiA9IDEsCi0gICAgQTQ3ID0gMSwKLSAgICBBNDggPSAxLAotICAgIEE0OSA9IDEsCi0gICAgQTUwID0gMSwKLSAgICBBNTEgPSAxLAotICAgIEE1MiA9IDEsCi0gICAgQTUzID0gMSwKLSAgICBBNTQgPSAxLAotICAgIEE1NSA9IDEsCi0gICAgQTU2ID0gMSwKLSAgICBBNTcgPSAxLAotICB9OwotICBlbnVtICA6IGludDY0X3QgewotICAgIExPTkdfVEVTVF9DT05TVEFOVCA9IDEwOTk1MTE2Mjc3NzZMLAotICB9OworICBjbGFzcyBFbXB0eSA6IHB1YmxpYyA6OmFuZHJvaWQ6OlBhcmNlbGFibGUgeworICBwdWJsaWM6CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBFbXB0eSYpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZSgpICE9IHN0ZDo6dGllKCk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBFbXB0eSYpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZSgpIDwgc3RkOjp0aWUoKTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBFbXB0eSYpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZSgpIDw9IHN0ZDo6dGllKCk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgRW1wdHkmKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoKSA9PSBzdGQ6OnRpZSgpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgRW1wdHkmKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoKSA+IHN0ZDo6dGllKCk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgRW1wdHkmKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoKSA+PSBzdGQ6OnRpZSgpOworICAgIH0KKworICAgIDo6YW5kcm9pZDo6c3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgZmluYWw7CisgICAgOjphbmRyb2lkOjpzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IGZpbmFsOworICAgIHN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiBnZXRQYXJjZWxhYmxlRGVzY3JpcHRvcigpIHsKKyAgICAgIHN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0YXRpY1N0cmluZzE2IERFU0NJUFRPUiAodSJhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlLkVtcHR5Iik7CisgICAgICByZXR1cm4gREVTQ0lQVE9SOworICAgIH0KKyAgICBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7CisgICAgICBvcyA8PCAiRW1wdHl7IjsKKyAgICAgIG9zIDw8ICJ9IjsKKyAgICAgIHJldHVybiBvcy5zdHIoKTsKKyAgICB9CisgIH07ICAvLyBjbGFzcyBFbXB0eQorICBjbGFzcyBDb21waWxlckNoZWNrcyA6IHB1YmxpYyA6OmFuZHJvaWQ6OlBhcmNlbGFibGUgeworICBwdWJsaWM6CisgICAgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+IGJpbmRlcjsKKyAgICA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4gbnVsbGFibGVfYmluZGVyOworICAgIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+PiBiaW5kZXJfYXJyYXk7CisgICAgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+Pj4gbnVsbGFibGVfYmluZGVyX2FycmF5OworICAgIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+PiBiaW5kZXJfbGlzdDsKKyAgICA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4+PiBudWxsYWJsZV9iaW5kZXJfbGlzdDsKKyAgICA6OmFuZHJvaWQ6Om9zOjpQYXJjZWxGaWxlRGVzY3JpcHRvciBwZmQ7CisgICAgOjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6b3M6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPiBudWxsYWJsZV9wZmQ7CisgICAgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6Om9zOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj4gcGZkX2FycmF5OworICAgIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6Om9zOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj4+PiBudWxsYWJsZV9wZmRfYXJyYXk7CisgICAgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6Om9zOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj4gcGZkX2xpc3Q7CisgICAgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6b3M6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPj4+IG51bGxhYmxlX3BmZF9saXN0OworICAgIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6RW1wdHkgcGFyY2VsOworICAgIDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5PiBudWxsYWJsZV9wYXJjZWw7CisgICAgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5PiBwYXJjZWxfYXJyYXk7CisgICAgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6RW1wdHk+Pj4gbnVsbGFibGVfcGFyY2VsX2FycmF5OworICAgIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eT4gcGFyY2VsX2xpc3Q7CisgICAgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6RW1wdHk+Pj4gbnVsbGFibGVfcGFyY2VsX2xpc3Q7CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBDb21waWxlckNoZWNrcyYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoYmluZGVyLCBudWxsYWJsZV9iaW5kZXIsIGJpbmRlcl9hcnJheSwgbnVsbGFibGVfYmluZGVyX2FycmF5LCBiaW5kZXJfbGlzdCwgbnVsbGFibGVfYmluZGVyX2xpc3QsIHBmZCwgbnVsbGFibGVfcGZkLCBwZmRfYXJyYXksIG51bGxhYmxlX3BmZF9hcnJheSwgcGZkX2xpc3QsIG51bGxhYmxlX3BmZF9saXN0LCBwYXJjZWwsIG51bGxhYmxlX3BhcmNlbCwgcGFyY2VsX2FycmF5LCBudWxsYWJsZV9wYXJjZWxfYXJyYXksIHBhcmNlbF9saXN0LCBudWxsYWJsZV9wYXJjZWxfbGlzdCkgIT0gc3RkOjp0aWUocmhzLmJpbmRlciwgcmhzLm51bGxhYmxlX2JpbmRlciwgcmhzLmJpbmRlcl9hcnJheSwgcmhzLm51bGxhYmxlX2JpbmRlcl9hcnJheSwgcmhzLmJpbmRlcl9saXN0LCByaHMubnVsbGFibGVfYmluZGVyX2xpc3QsIHJocy5wZmQsIHJocy5udWxsYWJsZV9wZmQsIHJocy5wZmRfYXJyYXksIHJocy5udWxsYWJsZV9wZmRfYXJyYXksIHJocy5wZmRfbGlzdCwgcmhzLm51bGxhYmxlX3BmZF9saXN0LCByaHMucGFyY2VsLCByaHMubnVsbGFibGVfcGFyY2VsLCByaHMucGFyY2VsX2FycmF5LCByaHMubnVsbGFibGVfcGFyY2VsX2FycmF5LCByaHMucGFyY2VsX2xpc3QsIHJocy5udWxsYWJsZV9wYXJjZWxfbGlzdCk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBDb21waWxlckNoZWNrcyYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoYmluZGVyLCBudWxsYWJsZV9iaW5kZXIsIGJpbmRlcl9hcnJheSwgbnVsbGFibGVfYmluZGVyX2FycmF5LCBiaW5kZXJfbGlzdCwgbnVsbGFibGVfYmluZGVyX2xpc3QsIHBmZCwgbnVsbGFibGVfcGZkLCBwZmRfYXJyYXksIG51bGxhYmxlX3BmZF9hcnJheSwgcGZkX2xpc3QsIG51bGxhYmxlX3BmZF9saXN0LCBwYXJjZWwsIG51bGxhYmxlX3BhcmNlbCwgcGFyY2VsX2FycmF5LCBudWxsYWJsZV9wYXJjZWxfYXJyYXksIHBhcmNlbF9saXN0LCBudWxsYWJsZV9wYXJjZWxfbGlzdCkgPCBzdGQ6OnRpZShyaHMuYmluZGVyLCByaHMubnVsbGFibGVfYmluZGVyLCByaHMuYmluZGVyX2FycmF5LCByaHMubnVsbGFibGVfYmluZGVyX2FycmF5LCByaHMuYmluZGVyX2xpc3QsIHJocy5udWxsYWJsZV9iaW5kZXJfbGlzdCwgcmhzLnBmZCwgcmhzLm51bGxhYmxlX3BmZCwgcmhzLnBmZF9hcnJheSwgcmhzLm51bGxhYmxlX3BmZF9hcnJheSwgcmhzLnBmZF9saXN0LCByaHMubnVsbGFibGVfcGZkX2xpc3QsIHJocy5wYXJjZWwsIHJocy5udWxsYWJsZV9wYXJjZWwsIHJocy5wYXJjZWxfYXJyYXksIHJocy5udWxsYWJsZV9wYXJjZWxfYXJyYXksIHJocy5wYXJjZWxfbGlzdCwgcmhzLm51bGxhYmxlX3BhcmNlbF9saXN0KTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBDb21waWxlckNoZWNrcyYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoYmluZGVyLCBudWxsYWJsZV9iaW5kZXIsIGJpbmRlcl9hcnJheSwgbnVsbGFibGVfYmluZGVyX2FycmF5LCBiaW5kZXJfbGlzdCwgbnVsbGFibGVfYmluZGVyX2xpc3QsIHBmZCwgbnVsbGFibGVfcGZkLCBwZmRfYXJyYXksIG51bGxhYmxlX3BmZF9hcnJheSwgcGZkX2xpc3QsIG51bGxhYmxlX3BmZF9saXN0LCBwYXJjZWwsIG51bGxhYmxlX3BhcmNlbCwgcGFyY2VsX2FycmF5LCBudWxsYWJsZV9wYXJjZWxfYXJyYXksIHBhcmNlbF9saXN0LCBudWxsYWJsZV9wYXJjZWxfbGlzdCkgPD0gc3RkOjp0aWUocmhzLmJpbmRlciwgcmhzLm51bGxhYmxlX2JpbmRlciwgcmhzLmJpbmRlcl9hcnJheSwgcmhzLm51bGxhYmxlX2JpbmRlcl9hcnJheSwgcmhzLmJpbmRlcl9saXN0LCByaHMubnVsbGFibGVfYmluZGVyX2xpc3QsIHJocy5wZmQsIHJocy5udWxsYWJsZV9wZmQsIHJocy5wZmRfYXJyYXksIHJocy5udWxsYWJsZV9wZmRfYXJyYXksIHJocy5wZmRfbGlzdCwgcmhzLm51bGxhYmxlX3BmZF9saXN0LCByaHMucGFyY2VsLCByaHMubnVsbGFibGVfcGFyY2VsLCByaHMucGFyY2VsX2FycmF5LCByaHMubnVsbGFibGVfcGFyY2VsX2FycmF5LCByaHMucGFyY2VsX2xpc3QsIHJocy5udWxsYWJsZV9wYXJjZWxfbGlzdCk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgQ29tcGlsZXJDaGVja3MmIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKGJpbmRlciwgbnVsbGFibGVfYmluZGVyLCBiaW5kZXJfYXJyYXksIG51bGxhYmxlX2JpbmRlcl9hcnJheSwgYmluZGVyX2xpc3QsIG51bGxhYmxlX2JpbmRlcl9saXN0LCBwZmQsIG51bGxhYmxlX3BmZCwgcGZkX2FycmF5LCBudWxsYWJsZV9wZmRfYXJyYXksIHBmZF9saXN0LCBudWxsYWJsZV9wZmRfbGlzdCwgcGFyY2VsLCBudWxsYWJsZV9wYXJjZWwsIHBhcmNlbF9hcnJheSwgbnVsbGFibGVfcGFyY2VsX2FycmF5LCBwYXJjZWxfbGlzdCwgbnVsbGFibGVfcGFyY2VsX2xpc3QpID09IHN0ZDo6dGllKHJocy5iaW5kZXIsIHJocy5udWxsYWJsZV9iaW5kZXIsIHJocy5iaW5kZXJfYXJyYXksIHJocy5udWxsYWJsZV9iaW5kZXJfYXJyYXksIHJocy5iaW5kZXJfbGlzdCwgcmhzLm51bGxhYmxlX2JpbmRlcl9saXN0LCByaHMucGZkLCByaHMubnVsbGFibGVfcGZkLCByaHMucGZkX2FycmF5LCByaHMubnVsbGFibGVfcGZkX2FycmF5LCByaHMucGZkX2xpc3QsIHJocy5udWxsYWJsZV9wZmRfbGlzdCwgcmhzLnBhcmNlbCwgcmhzLm51bGxhYmxlX3BhcmNlbCwgcmhzLnBhcmNlbF9hcnJheSwgcmhzLm51bGxhYmxlX3BhcmNlbF9hcnJheSwgcmhzLnBhcmNlbF9saXN0LCByaHMubnVsbGFibGVfcGFyY2VsX2xpc3QpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgQ29tcGlsZXJDaGVja3MmIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKGJpbmRlciwgbnVsbGFibGVfYmluZGVyLCBiaW5kZXJfYXJyYXksIG51bGxhYmxlX2JpbmRlcl9hcnJheSwgYmluZGVyX2xpc3QsIG51bGxhYmxlX2JpbmRlcl9saXN0LCBwZmQsIG51bGxhYmxlX3BmZCwgcGZkX2FycmF5LCBudWxsYWJsZV9wZmRfYXJyYXksIHBmZF9saXN0LCBudWxsYWJsZV9wZmRfbGlzdCwgcGFyY2VsLCBudWxsYWJsZV9wYXJjZWwsIHBhcmNlbF9hcnJheSwgbnVsbGFibGVfcGFyY2VsX2FycmF5LCBwYXJjZWxfbGlzdCwgbnVsbGFibGVfcGFyY2VsX2xpc3QpID4gc3RkOjp0aWUocmhzLmJpbmRlciwgcmhzLm51bGxhYmxlX2JpbmRlciwgcmhzLmJpbmRlcl9hcnJheSwgcmhzLm51bGxhYmxlX2JpbmRlcl9hcnJheSwgcmhzLmJpbmRlcl9saXN0LCByaHMubnVsbGFibGVfYmluZGVyX2xpc3QsIHJocy5wZmQsIHJocy5udWxsYWJsZV9wZmQsIHJocy5wZmRfYXJyYXksIHJocy5udWxsYWJsZV9wZmRfYXJyYXksIHJocy5wZmRfbGlzdCwgcmhzLm51bGxhYmxlX3BmZF9saXN0LCByaHMucGFyY2VsLCByaHMubnVsbGFibGVfcGFyY2VsLCByaHMucGFyY2VsX2FycmF5LCByaHMubnVsbGFibGVfcGFyY2VsX2FycmF5LCByaHMucGFyY2VsX2xpc3QsIHJocy5udWxsYWJsZV9wYXJjZWxfbGlzdCk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgQ29tcGlsZXJDaGVja3MmIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKGJpbmRlciwgbnVsbGFibGVfYmluZGVyLCBiaW5kZXJfYXJyYXksIG51bGxhYmxlX2JpbmRlcl9hcnJheSwgYmluZGVyX2xpc3QsIG51bGxhYmxlX2JpbmRlcl9saXN0LCBwZmQsIG51bGxhYmxlX3BmZCwgcGZkX2FycmF5LCBudWxsYWJsZV9wZmRfYXJyYXksIHBmZF9saXN0LCBudWxsYWJsZV9wZmRfbGlzdCwgcGFyY2VsLCBudWxsYWJsZV9wYXJjZWwsIHBhcmNlbF9hcnJheSwgbnVsbGFibGVfcGFyY2VsX2FycmF5LCBwYXJjZWxfbGlzdCwgbnVsbGFibGVfcGFyY2VsX2xpc3QpID49IHN0ZDo6dGllKHJocy5iaW5kZXIsIHJocy5udWxsYWJsZV9iaW5kZXIsIHJocy5iaW5kZXJfYXJyYXksIHJocy5udWxsYWJsZV9iaW5kZXJfYXJyYXksIHJocy5iaW5kZXJfbGlzdCwgcmhzLm51bGxhYmxlX2JpbmRlcl9saXN0LCByaHMucGZkLCByaHMubnVsbGFibGVfcGZkLCByaHMucGZkX2FycmF5LCByaHMubnVsbGFibGVfcGZkX2FycmF5LCByaHMucGZkX2xpc3QsIHJocy5udWxsYWJsZV9wZmRfbGlzdCwgcmhzLnBhcmNlbCwgcmhzLm51bGxhYmxlX3BhcmNlbCwgcmhzLnBhcmNlbF9hcnJheSwgcmhzLm51bGxhYmxlX3BhcmNlbF9hcnJheSwgcmhzLnBhcmNlbF9saXN0LCByaHMubnVsbGFibGVfcGFyY2VsX2xpc3QpOworICAgIH0KKworICAgIDo6YW5kcm9pZDo6c3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgZmluYWw7CisgICAgOjphbmRyb2lkOjpzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IGZpbmFsOworICAgIHN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiBnZXRQYXJjZWxhYmxlRGVzY3JpcHRvcigpIHsKKyAgICAgIHN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0YXRpY1N0cmluZzE2IERFU0NJUFRPUiAodSJhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlLkNvbXBpbGVyQ2hlY2tzIik7CisgICAgICByZXR1cm4gREVTQ0lQVE9SOworICAgIH0KKyAgICBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7CisgICAgICBvcyA8PCAiQ29tcGlsZXJDaGVja3N7IjsKKyAgICAgIG9zIDw8ICJiaW5kZXI6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoYmluZGVyKTsKKyAgICAgIG9zIDw8ICIsIG51bGxhYmxlX2JpbmRlcjogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhudWxsYWJsZV9iaW5kZXIpOworICAgICAgb3MgPDwgIiwgYmluZGVyX2FycmF5OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGJpbmRlcl9hcnJheSk7CisgICAgICBvcyA8PCAiLCBudWxsYWJsZV9iaW5kZXJfYXJyYXk6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcobnVsbGFibGVfYmluZGVyX2FycmF5KTsKKyAgICAgIG9zIDw8ICIsIGJpbmRlcl9saXN0OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGJpbmRlcl9saXN0KTsKKyAgICAgIG9zIDw8ICIsIG51bGxhYmxlX2JpbmRlcl9saXN0OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKG51bGxhYmxlX2JpbmRlcl9saXN0KTsKKyAgICAgIG9zIDw8ICIsIHBmZDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhwZmQpOworICAgICAgb3MgPDwgIiwgbnVsbGFibGVfcGZkOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKG51bGxhYmxlX3BmZCk7CisgICAgICBvcyA8PCAiLCBwZmRfYXJyYXk6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcocGZkX2FycmF5KTsKKyAgICAgIG9zIDw8ICIsIG51bGxhYmxlX3BmZF9hcnJheTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhudWxsYWJsZV9wZmRfYXJyYXkpOworICAgICAgb3MgPDwgIiwgcGZkX2xpc3Q6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcocGZkX2xpc3QpOworICAgICAgb3MgPDwgIiwgbnVsbGFibGVfcGZkX2xpc3Q6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcobnVsbGFibGVfcGZkX2xpc3QpOworICAgICAgb3MgPDwgIiwgcGFyY2VsOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKHBhcmNlbCk7CisgICAgICBvcyA8PCAiLCBudWxsYWJsZV9wYXJjZWw6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcobnVsbGFibGVfcGFyY2VsKTsKKyAgICAgIG9zIDw8ICIsIHBhcmNlbF9hcnJheTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhwYXJjZWxfYXJyYXkpOworICAgICAgb3MgPDwgIiwgbnVsbGFibGVfcGFyY2VsX2FycmF5OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKG51bGxhYmxlX3BhcmNlbF9hcnJheSk7CisgICAgICBvcyA8PCAiLCBwYXJjZWxfbGlzdDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhwYXJjZWxfbGlzdCk7CisgICAgICBvcyA8PCAiLCBudWxsYWJsZV9wYXJjZWxfbGlzdDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhudWxsYWJsZV9wYXJjZWxfbGlzdCk7CisgICAgICBvcyA8PCAifSI7CisgICAgICByZXR1cm4gb3Muc3RyKCk7CisgICAgfQorICB9OyAgLy8gY2xhc3MgQ29tcGlsZXJDaGVja3MKKyAgZW51bSA6IGludDMyX3QgeyBURVNUX0NPTlNUQU5UID0gNDIgfTsKKyAgZW51bSA6IGludDMyX3QgeyBURVNUX0NPTlNUQU5UMiA9IC00MiB9OworICBlbnVtIDogaW50MzJfdCB7IFRFU1RfQ09OU1RBTlQzID0gNDIgfTsKKyAgZW51bSA6IGludDMyX3QgeyBURVNUX0NPTlNUQU5UNCA9IDQgfTsKKyAgZW51bSA6IGludDMyX3QgeyBURVNUX0NPTlNUQU5UNSA9IC00IH07CisgIGVudW0gOiBpbnQzMl90IHsgVEVTVF9DT05TVEFOVDYgPSAwIH07CisgIGVudW0gOiBpbnQzMl90IHsgVEVTVF9DT05TVEFOVDcgPSAwIH07CisgIGVudW0gOiBpbnQzMl90IHsgVEVTVF9DT05TVEFOVDggPSAwIH07CisgIGVudW0gOiBpbnQzMl90IHsgVEVTVF9DT05TVEFOVDkgPSA4NiB9OworICBlbnVtIDogaW50MzJfdCB7IFRFU1RfQ09OU1RBTlQxMCA9IDE2NSB9OworICBlbnVtIDogaW50MzJfdCB7IFRFU1RfQ09OU1RBTlQxMSA9IDI1MCB9OworICBlbnVtIDogaW50MzJfdCB7IFRFU1RfQ09OU1RBTlQxMiA9IC0xIH07CisgIGVudW0gOiBpbnQ4X3QgeyBCWVRFX1RFU1RfQ09OU1RBTlQgPSAxNyB9OworICBlbnVtIDogaW50NjRfdCB7IExPTkdfVEVTVF9DT05TVEFOVCA9IDEwOTk1MTE2Mjc3NzZMIH07CiAgIHN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiBTVFJJTkdfVEVTVF9DT05TVEFOVCgpOwogICBzdGF0aWMgY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiYgU1RSSU5HX1RFU1RfQ09OU1RBTlQyKCk7CiAgIHN0YXRpYyBjb25zdCA6OnN0ZDo6c3RyaW5nJiBTVFJJTkdfVEVTVF9DT05TVEFOVF9VVEY4KCk7CisgIGVudW0gOiBpbnQzMl90IHsgQTEgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTIgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTMgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTQgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTUgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTYgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTcgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTggPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTkgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTEwID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEExMSA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBMTIgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTEzID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEExNCA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBMTUgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTE2ID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEExNyA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBMTggPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTE5ID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEEyMCA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBMjEgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTIyID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEEyMyA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBMjQgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTI1ID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEEyNiA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBMjcgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTI4ID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEEyOSA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBMzAgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTMxID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEEzMiA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBMzMgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTM0ID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEEzNSA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBMzYgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTM3ID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEEzOCA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBMzkgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTQwID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEE0MSA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBNDIgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTQzID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEE0NCA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBNDUgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTQ2ID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEE0NyA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBNDggPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTQ5ID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEE1MCA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBNTEgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTUyID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEE1MyA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBNTQgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTU1ID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEE1NiA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBNTcgPSAxIH07CiAgIHZpcnR1YWwgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBVbmltcGxlbWVudGVkTWV0aG9kKGludDMyX3QgYXJnLCBpbnQzMl90KiBfYWlkbF9yZXR1cm4pID0gMDsKICAgdmlydHVhbCA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIERlcHJlY2F0ZWQoKSBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKCJ0byBtYWtlIHN1cmUgd2UgaGF2ZSBzb21ldGhpbmcgaW4gc3lzdGVtL3Rvb2xzL2FpZGwgd2hpY2ggZG9lcyBhIGNvbXBpbGUgY2hlY2sgb2YgZGVwcmVjYXRlZCBhbmQgbWFrZSBzdXJlIHRoaXMgaXMgcmVmbGVjdGVkIGluIGdvbGRlbnMiKSkpID0gMDsKICAgdmlydHVhbCA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFRlc3RPbmV3YXkoKSA9IDA7CkBAIC0xMzUsNiArMjM3LDEyIEBACiAgIHZpcnR1YWwgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXZlcnNlTG9uZ0VudW0oY29uc3QgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMb25nRW51bT4mIGlucHV0LCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtPiogcmVwZWF0ZWQsIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0+KiBfYWlkbF9yZXR1cm4pID0gMDsKICAgdmlydHVhbCA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEdldE90aGVyVGVzdFNlcnZpY2UoY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiYgbmFtZSwgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4qIF9haWRsX3JldHVybikgPSAwOwogICB2aXJ0dWFsIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgVmVyaWZ5TmFtZShjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPiYgc2VydmljZSwgY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiYgbmFtZSwgYm9vbCogX2FpZGxfcmV0dXJuKSA9IDA7CisgIHZpcnR1YWwgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBHZXRJbnRlcmZhY2VBcnJheShjb25zdCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6U3RyaW5nMTY+JiBuYW1lcywgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPj4qIF9haWRsX3JldHVybikgPSAwOworICB2aXJ0dWFsIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlQXJyYXkoY29uc3QgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPj4mIHNlcnZpY2VzLCBjb25zdCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6U3RyaW5nMTY+JiBuYW1lcywgYm9vbCogX2FpZGxfcmV0dXJuKSA9IDA7CisgIHZpcnR1YWwgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBHZXROdWxsYWJsZUludGVyZmFjZUFycmF5KGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OlN0cmluZzE2Pj4+JiBuYW1lcywgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4+PiogX2FpZGxfcmV0dXJuKSA9IDA7CisgIHZpcnR1YWwgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBWZXJpZnlOYW1lc1dpdGhOdWxsYWJsZUludGVyZmFjZUFycmF5KGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+Pj4mIHNlcnZpY2VzLCBjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjpTdHJpbmcxNj4+PiYgbmFtZXMsIGJvb2wqIF9haWRsX3JldHVybikgPSAwOworICB2aXJ0dWFsIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgR2V0SW50ZXJmYWNlTGlzdChjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjpTdHJpbmcxNj4+PiYgbmFtZXMsIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+Pj4qIF9haWRsX3JldHVybikgPSAwOworICB2aXJ0dWFsIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlTGlzdChjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPj4+JiBzZXJ2aWNlcywgY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6U3RyaW5nMTY+Pj4mIG5hbWVzLCBib29sKiBfYWlkbF9yZXR1cm4pID0gMDsKICAgdmlydHVhbCA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJldmVyc2VTdHJpbmdMaXN0KGNvbnN0IDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpTdHJpbmcxNj4mIGlucHV0LCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6U3RyaW5nMTY+KiByZXBlYXRlZCwgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OlN0cmluZzE2PiogX2FpZGxfcmV0dXJuKSA9IDA7CiAgIHZpcnR1YWwgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXRQYXJjZWxGaWxlRGVzY3JpcHRvcihjb25zdCA6OmFuZHJvaWQ6Om9zOjpQYXJjZWxGaWxlRGVzY3JpcHRvciYgcmVhZCwgOjphbmRyb2lkOjpvczo6UGFyY2VsRmlsZURlc2NyaXB0b3IqIF9haWRsX3JldHVybikgPSAwOwogICB2aXJ0dWFsIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmV2ZXJzZVBhcmNlbEZpbGVEZXNjcmlwdG9yQXJyYXkoY29uc3QgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6Om9zOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj4mIGlucHV0LCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6b3M6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPiogcmVwZWF0ZWQsIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpvczo6UGFyY2VsRmlsZURlc2NyaXB0b3I+KiBfYWlkbF9yZXR1cm4pID0gMDsKQEAgLTE0NSw5ICsyNTMsMTMgQEAKICAgdmlydHVhbCA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdE51bGxhYmxlTG9uZ0VudW1BcnJheShjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMb25nRW51bT4+JiBpbnB1dCwgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0+PiogX2FpZGxfcmV0dXJuKSA9IDA7CiAgIHZpcnR1YWwgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXROdWxsYWJsZVN0cmluZyhjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjpTdHJpbmcxNj4mIGlucHV0LCA6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjpTdHJpbmcxNj4qIF9haWRsX3JldHVybikgPSAwOwogICB2aXJ0dWFsIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0TnVsbGFibGVTdHJpbmdMaXN0KGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OlN0cmluZzE2Pj4+JiBpbnB1dCwgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6U3RyaW5nMTY+Pj4qIF9haWRsX3JldHVybikgPSAwOwotICB2aXJ0dWFsIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlKGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpTdHJ1Y3R1cmVkUGFyY2VsYWJsZT4mIGlucHV0LCA6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6U3RydWN0dXJlZFBhcmNlbGFibGU+KiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgdmlydHVhbCA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZShjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eT4mIGlucHV0LCA6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eT4qIF9haWRsX3JldHVybikgPSAwOworICB2aXJ0dWFsIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlQXJyYXkoY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6RW1wdHk+Pj4mIGlucHV0LCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eT4+PiogX2FpZGxfcmV0dXJuKSA9IDA7CisgIHZpcnR1YWwgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXROdWxsYWJsZVBhcmNlbGFibGVMaXN0KGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5Pj4+JiBpbnB1dCwgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6RW1wdHk+Pj4qIF9haWRsX3JldHVybikgPSAwOwogICB2aXJ0dWFsIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgVGFrZXNBbklCaW5kZXIoY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+JiBpbnB1dCkgPSAwOwogICB2aXJ0dWFsIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgVGFrZXNBTnVsbGFibGVJQmluZGVyKGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiYgaW5wdXQpID0gMDsKKyAgdmlydHVhbCA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFRha2VzQW5JQmluZGVyTGlzdChjb25zdCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPj4mIGlucHV0KSA9IDA7CisgIHZpcnR1YWwgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBUYWtlc0FOdWxsYWJsZUlCaW5kZXJMaXN0KGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPj4+JiBpbnB1dCkgPSAwOwogICB2aXJ0dWFsIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0VXRmOENwcFN0cmluZyhjb25zdCA6OnN0ZDo6c3RyaW5nJiB0b2tlbiwgOjpzdGQ6OnN0cmluZyogX2FpZGxfcmV0dXJuKSA9IDA7CiAgIHZpcnR1YWwgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXROdWxsYWJsZVV0ZjhDcHBTdHJpbmcoY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjpzdHJpbmc+JiB0b2tlbiwgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjpzdHJpbmc+KiBfYWlkbF9yZXR1cm4pID0gMDsKICAgdmlydHVhbCA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJldmVyc2VVdGY4Q3BwU3RyaW5nKGNvbnN0IDo6c3RkOjp2ZWN0b3I8OjpzdGQ6OnN0cmluZz4mIGlucHV0LCA6OnN0ZDo6dmVjdG9yPDo6c3RkOjpzdHJpbmc+KiByZXBlYXRlZCwgOjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6c3RyaW5nPiogX2FpZGxfcmV0dXJuKSA9IDA7CkBAIC0xNTUsOCArMjY3LDEzIEBACiAgIHZpcnR1YWwgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXZlcnNlVXRmOENwcFN0cmluZ0xpc3QoY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjpzdHJpbmc+Pj4mIGlucHV0LCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnN0cmluZz4+PiogcmVwZWF0ZWQsIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6c3RyaW5nPj4+KiBfYWlkbF9yZXR1cm4pID0gMDsKICAgdmlydHVhbCA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEdldENhbGxiYWNrKGJvb2wgcmV0dXJuX251bGwsIDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+KiBfYWlkbF9yZXR1cm4pID0gMDsKICAgdmlydHVhbCA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEZpbGxPdXRTdHJ1Y3R1cmVkUGFyY2VsYWJsZSg6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpTdHJ1Y3R1cmVkUGFyY2VsYWJsZSogcGFyY2VsKSA9IDA7CisgIHZpcnR1YWwgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXRFeHRlbmRhYmxlUGFyY2VsYWJsZShjb25zdCA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpleHRlbnNpb246OkV4dGVuZGFibGVQYXJjZWxhYmxlJiBlcCwgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6ZXh0ZW5zaW9uOjpFeHRlbmRhYmxlUGFyY2VsYWJsZSogZXAyKSA9IDA7CisgIHZpcnR1YWwgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXZlcnNlTGlzdChjb25zdCA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpSZWN1cnNpdmVMaXN0JiBsaXN0LCA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpSZWN1cnNpdmVMaXN0KiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgdmlydHVhbCA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJldmVyc2VJQmluZGVyQXJyYXkoY29uc3QgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4+JiBpbnB1dCwgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4+KiByZXBlYXRlZCwgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4+KiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgdmlydHVhbCA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJldmVyc2VOdWxsYWJsZUlCaW5kZXJBcnJheShjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4+PiYgaW5wdXQsIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPj4+KiByZXBlYXRlZCwgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+Pj4qIF9haWRsX3JldHVybikgPSAwOwogICB2aXJ0dWFsIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgR2V0T2xkTmFtZUludGVyZmFjZSg6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklPbGROYW1lPiogX2FpZGxfcmV0dXJuKSA9IDA7CiAgIHZpcnR1YWwgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBHZXROZXdOYW1lSW50ZXJmYWNlKDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5ld05hbWU+KiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgdmlydHVhbCA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEdldFVuaW9uVGFncyhjb25zdCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlVuaW9uPiYgaW5wdXQsIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6VW5pb246OlRhZz4qIF9haWRsX3JldHVybikgPSAwOwogICB2aXJ0dWFsIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgR2V0Q3BwSmF2YVRlc3RzKDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiogX2FpZGxfcmV0dXJuKSA9IDA7CiAgIHZpcnR1YWwgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBnZXRCYWNrZW5kVHlwZSg6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCYWNrZW5kVHlwZSogX2FpZGxfcmV0dXJuKSA9IDA7CiB9OyAgLy8gY2xhc3MgSVRlc3RTZXJ2aWNlCkBAIC0xNjYsNyArMjgzLDcgQEAKICAgOjphbmRyb2lkOjpJQmluZGVyKiBvbkFzQmluZGVyKCkgb3ZlcnJpZGUgewogICAgIHJldHVybiBudWxscHRyOwogICB9Ci0gIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgVW5pbXBsZW1lbnRlZE1ldGhvZChpbnQzMl90LCBpbnQzMl90Kikgb3ZlcnJpZGUgeworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFVuaW1wbGVtZW50ZWRNZXRob2QoaW50MzJfdCAvKmFyZyovLCBpbnQzMl90KiAvKl9haWRsX3JldHVybiovKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTik7CiAgIH0KICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBEZXByZWNhdGVkKCkgb3ZlcnJpZGUgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCgidG8gbWFrZSBzdXJlIHdlIGhhdmUgc29tZXRoaW5nIGluIHN5c3RlbS90b29scy9haWRsIHdoaWNoIGRvZXMgYSBjb21waWxlIGNoZWNrIG9mIGRlcHJlY2F0ZWQgYW5kIG1ha2Ugc3VyZSB0aGlzIGlzIHJlZmxlY3RlZCBpbiBnb2xkZW5zIikpKSB7CkBAIC0xNzUsMTU0ICsyOTIsMTk2IEBACiAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgVGVzdE9uZXdheSgpIG92ZXJyaWRlIHsKICAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTsKICAgfQotICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdEJvb2xlYW4oYm9vbCwgYm9vbCopIG92ZXJyaWRlIHsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXRCb29sZWFuKGJvb2wgLyp0b2tlbiovLCBib29sKiAvKl9haWRsX3JldHVybiovKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTik7CiAgIH0KLSAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXRCeXRlKGludDhfdCwgaW50OF90Kikgb3ZlcnJpZGUgeworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdEJ5dGUoaW50OF90IC8qdG9rZW4qLywgaW50OF90KiAvKl9haWRsX3JldHVybiovKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTik7CiAgIH0KLSAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXRDaGFyKGNoYXIxNl90LCBjaGFyMTZfdCopIG92ZXJyaWRlIHsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXRDaGFyKGNoYXIxNl90IC8qdG9rZW4qLywgY2hhcjE2X3QqIC8qX2FpZGxfcmV0dXJuKi8pIG92ZXJyaWRlIHsKICAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTsKICAgfQotICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdEludChpbnQzMl90LCBpbnQzMl90Kikgb3ZlcnJpZGUgeworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdEludChpbnQzMl90IC8qdG9rZW4qLywgaW50MzJfdCogLypfYWlkbF9yZXR1cm4qLykgb3ZlcnJpZGUgewogICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOwogICB9Ci0gIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0TG9uZyhpbnQ2NF90LCBpbnQ2NF90Kikgb3ZlcnJpZGUgeworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdExvbmcoaW50NjRfdCAvKnRva2VuKi8sIGludDY0X3QqIC8qX2FpZGxfcmV0dXJuKi8pIG92ZXJyaWRlIHsKICAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTsKICAgfQotICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdEZsb2F0KGZsb2F0LCBmbG9hdCopIG92ZXJyaWRlIHsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXRGbG9hdChmbG9hdCAvKnRva2VuKi8sIGZsb2F0KiAvKl9haWRsX3JldHVybiovKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTik7CiAgIH0KLSAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXREb3VibGUoZG91YmxlLCBkb3VibGUqKSBvdmVycmlkZSB7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0RG91YmxlKGRvdWJsZSAvKnRva2VuKi8sIGRvdWJsZSogLypfYWlkbF9yZXR1cm4qLykgb3ZlcnJpZGUgewogICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOwogICB9Ci0gIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0U3RyaW5nKGNvbnN0IDo6YW5kcm9pZDo6U3RyaW5nMTYmLCA6OmFuZHJvaWQ6OlN0cmluZzE2Kikgb3ZlcnJpZGUgeworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdFN0cmluZyhjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiAvKnRva2VuKi8sIDo6YW5kcm9pZDo6U3RyaW5nMTYqIC8qX2FpZGxfcmV0dXJuKi8pIG92ZXJyaWRlIHsKICAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTsKICAgfQotICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdEJ5dGVFbnVtKDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJ5dGVFbnVtLCA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCeXRlRW51bSopIG92ZXJyaWRlIHsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXRCeXRlRW51bSg6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCeXRlRW51bSAvKnRva2VuKi8sIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJ5dGVFbnVtKiAvKl9haWRsX3JldHVybiovKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTik7CiAgIH0KLSAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXRJbnRFbnVtKDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0sIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0qKSBvdmVycmlkZSB7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0SW50RW51bSg6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtIC8qdG9rZW4qLywgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bSogLypfYWlkbF9yZXR1cm4qLykgb3ZlcnJpZGUgewogICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOwogICB9Ci0gIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0TG9uZ0VudW0oOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0sIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtKikgb3ZlcnJpZGUgeworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdExvbmdFbnVtKDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtIC8qdG9rZW4qLywgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0qIC8qX2FpZGxfcmV0dXJuKi8pIG92ZXJyaWRlIHsKICAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTsKICAgfQotICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJldmVyc2VCb29sZWFuKGNvbnN0IDo6c3RkOjp2ZWN0b3I8Ym9vbD4mLCA6OnN0ZDo6dmVjdG9yPGJvb2w+KiwgOjpzdGQ6OnZlY3Rvcjxib29sPiopIG92ZXJyaWRlIHsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXZlcnNlQm9vbGVhbihjb25zdCA6OnN0ZDo6dmVjdG9yPGJvb2w+JiAvKmlucHV0Ki8sIDo6c3RkOjp2ZWN0b3I8Ym9vbD4qIC8qcmVwZWF0ZWQqLywgOjpzdGQ6OnZlY3Rvcjxib29sPiogLypfYWlkbF9yZXR1cm4qLykgb3ZlcnJpZGUgewogICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOwogICB9Ci0gIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmV2ZXJzZUJ5dGUoY29uc3QgOjpzdGQ6OnZlY3Rvcjx1aW50OF90PiYsIDo6c3RkOjp2ZWN0b3I8dWludDhfdD4qLCA6OnN0ZDo6dmVjdG9yPHVpbnQ4X3Q+Kikgb3ZlcnJpZGUgeworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJldmVyc2VCeXRlKGNvbnN0IDo6c3RkOjp2ZWN0b3I8dWludDhfdD4mIC8qaW5wdXQqLywgOjpzdGQ6OnZlY3Rvcjx1aW50OF90PiogLypyZXBlYXRlZCovLCA6OnN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiAvKl9haWRsX3JldHVybiovKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTik7CiAgIH0KLSAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXZlcnNlQ2hhcihjb25zdCA6OnN0ZDo6dmVjdG9yPGNoYXIxNl90PiYsIDo6c3RkOjp2ZWN0b3I8Y2hhcjE2X3Q+KiwgOjpzdGQ6OnZlY3RvcjxjaGFyMTZfdD4qKSBvdmVycmlkZSB7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmV2ZXJzZUNoYXIoY29uc3QgOjpzdGQ6OnZlY3RvcjxjaGFyMTZfdD4mIC8qaW5wdXQqLywgOjpzdGQ6OnZlY3RvcjxjaGFyMTZfdD4qIC8qcmVwZWF0ZWQqLywgOjpzdGQ6OnZlY3RvcjxjaGFyMTZfdD4qIC8qX2FpZGxfcmV0dXJuKi8pIG92ZXJyaWRlIHsKICAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTsKICAgfQotICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJldmVyc2VJbnQoY29uc3QgOjpzdGQ6OnZlY3RvcjxpbnQzMl90PiYsIDo6c3RkOjp2ZWN0b3I8aW50MzJfdD4qLCA6OnN0ZDo6dmVjdG9yPGludDMyX3Q+Kikgb3ZlcnJpZGUgeworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJldmVyc2VJbnQoY29uc3QgOjpzdGQ6OnZlY3RvcjxpbnQzMl90PiYgLyppbnB1dCovLCA6OnN0ZDo6dmVjdG9yPGludDMyX3Q+KiAvKnJlcGVhdGVkKi8sIDo6c3RkOjp2ZWN0b3I8aW50MzJfdD4qIC8qX2FpZGxfcmV0dXJuKi8pIG92ZXJyaWRlIHsKICAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTsKICAgfQotICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJldmVyc2VMb25nKGNvbnN0IDo6c3RkOjp2ZWN0b3I8aW50NjRfdD4mLCA6OnN0ZDo6dmVjdG9yPGludDY0X3Q+KiwgOjpzdGQ6OnZlY3RvcjxpbnQ2NF90PiopIG92ZXJyaWRlIHsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXZlcnNlTG9uZyhjb25zdCA6OnN0ZDo6dmVjdG9yPGludDY0X3Q+JiAvKmlucHV0Ki8sIDo6c3RkOjp2ZWN0b3I8aW50NjRfdD4qIC8qcmVwZWF0ZWQqLywgOjpzdGQ6OnZlY3RvcjxpbnQ2NF90PiogLypfYWlkbF9yZXR1cm4qLykgb3ZlcnJpZGUgewogICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOwogICB9Ci0gIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmV2ZXJzZUZsb2F0KGNvbnN0IDo6c3RkOjp2ZWN0b3I8ZmxvYXQ+JiwgOjpzdGQ6OnZlY3RvcjxmbG9hdD4qLCA6OnN0ZDo6dmVjdG9yPGZsb2F0PiopIG92ZXJyaWRlIHsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXZlcnNlRmxvYXQoY29uc3QgOjpzdGQ6OnZlY3RvcjxmbG9hdD4mIC8qaW5wdXQqLywgOjpzdGQ6OnZlY3RvcjxmbG9hdD4qIC8qcmVwZWF0ZWQqLywgOjpzdGQ6OnZlY3RvcjxmbG9hdD4qIC8qX2FpZGxfcmV0dXJuKi8pIG92ZXJyaWRlIHsKICAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTsKICAgfQotICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJldmVyc2VEb3VibGUoY29uc3QgOjpzdGQ6OnZlY3Rvcjxkb3VibGU+JiwgOjpzdGQ6OnZlY3Rvcjxkb3VibGU+KiwgOjpzdGQ6OnZlY3Rvcjxkb3VibGU+Kikgb3ZlcnJpZGUgeworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJldmVyc2VEb3VibGUoY29uc3QgOjpzdGQ6OnZlY3Rvcjxkb3VibGU+JiAvKmlucHV0Ki8sIDo6c3RkOjp2ZWN0b3I8ZG91YmxlPiogLypyZXBlYXRlZCovLCA6OnN0ZDo6dmVjdG9yPGRvdWJsZT4qIC8qX2FpZGxfcmV0dXJuKi8pIG92ZXJyaWRlIHsKICAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTsKICAgfQotICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJldmVyc2VTdHJpbmcoY29uc3QgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OlN0cmluZzE2PiYsIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpTdHJpbmcxNj4qLCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6U3RyaW5nMTY+Kikgb3ZlcnJpZGUgeworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJldmVyc2VTdHJpbmcoY29uc3QgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OlN0cmluZzE2PiYgLyppbnB1dCovLCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6U3RyaW5nMTY+KiAvKnJlcGVhdGVkKi8sIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpTdHJpbmcxNj4qIC8qX2FpZGxfcmV0dXJuKi8pIG92ZXJyaWRlIHsKICAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTsKICAgfQotICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJldmVyc2VCeXRlRW51bShjb25zdCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJ5dGVFbnVtPiYsIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Qnl0ZUVudW0+KiwgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCeXRlRW51bT4qKSBvdmVycmlkZSB7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmV2ZXJzZUJ5dGVFbnVtKGNvbnN0IDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Qnl0ZUVudW0+JiAvKmlucHV0Ki8sIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Qnl0ZUVudW0+KiAvKnJlcGVhdGVkKi8sIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Qnl0ZUVudW0+KiAvKl9haWRsX3JldHVybiovKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTik7CiAgIH0KLSAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXZlcnNlSW50RW51bShjb25zdCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0+JiwgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtPiosIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bT4qKSBvdmVycmlkZSB7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmV2ZXJzZUludEVudW0oY29uc3QgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtPiYgLyppbnB1dCovLCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0+KiAvKnJlcGVhdGVkKi8sIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bT4qIC8qX2FpZGxfcmV0dXJuKi8pIG92ZXJyaWRlIHsKICAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTsKICAgfQotICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJldmVyc2VMb25nRW51bShjb25zdCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtPiYsIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0+KiwgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMb25nRW51bT4qKSBvdmVycmlkZSB7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmV2ZXJzZUxvbmdFbnVtKGNvbnN0IDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0+JiAvKmlucHV0Ki8sIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0+KiAvKnJlcGVhdGVkKi8sIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0+KiAvKl9haWRsX3JldHVybiovKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTik7CiAgIH0KLSAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBHZXRPdGhlclRlc3RTZXJ2aWNlKGNvbnN0IDo6YW5kcm9pZDo6U3RyaW5nMTYmLCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPiopIG92ZXJyaWRlIHsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBHZXRPdGhlclRlc3RTZXJ2aWNlKGNvbnN0IDo6YW5kcm9pZDo6U3RyaW5nMTYmIC8qbmFtZSovLCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPiogLypfYWlkbF9yZXR1cm4qLykgb3ZlcnJpZGUgewogICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOwogICB9Ci0gIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgVmVyaWZ5TmFtZShjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPiYsIGNvbnN0IDo6YW5kcm9pZDo6U3RyaW5nMTYmLCBib29sKikgb3ZlcnJpZGUgeworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFZlcmlmeU5hbWUoY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4mIC8qc2VydmljZSovLCBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiAvKm5hbWUqLywgYm9vbCogLypfYWlkbF9yZXR1cm4qLykgb3ZlcnJpZGUgewogICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOwogICB9Ci0gIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmV2ZXJzZVN0cmluZ0xpc3QoY29uc3QgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OlN0cmluZzE2PiYsIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpTdHJpbmcxNj4qLCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6U3RyaW5nMTY+Kikgb3ZlcnJpZGUgeworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEdldEludGVyZmFjZUFycmF5KGNvbnN0IDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpTdHJpbmcxNj4mIC8qbmFtZXMqLywgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPj4qIC8qX2FpZGxfcmV0dXJuKi8pIG92ZXJyaWRlIHsKICAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTsKICAgfQotICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdFBhcmNlbEZpbGVEZXNjcmlwdG9yKGNvbnN0IDo6YW5kcm9pZDo6b3M6OlBhcmNlbEZpbGVEZXNjcmlwdG9yJiwgOjphbmRyb2lkOjpvczo6UGFyY2VsRmlsZURlc2NyaXB0b3IqKSBvdmVycmlkZSB7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlQXJyYXkoY29uc3QgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPj4mIC8qc2VydmljZXMqLywgY29uc3QgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OlN0cmluZzE2PiYgLypuYW1lcyovLCBib29sKiAvKl9haWRsX3JldHVybiovKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTik7CiAgIH0KLSAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXZlcnNlUGFyY2VsRmlsZURlc2NyaXB0b3JBcnJheShjb25zdCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6b3M6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPiYsIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpvczo6UGFyY2VsRmlsZURlc2NyaXB0b3I+KiwgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6Om9zOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj4qKSBvdmVycmlkZSB7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgR2V0TnVsbGFibGVJbnRlcmZhY2VBcnJheShjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjpTdHJpbmcxNj4+PiYgLypuYW1lcyovLCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPj4+KiAvKl9haWRsX3JldHVybiovKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTik7CiAgIH0KLSAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBUaHJvd1NlcnZpY2VFeGNlcHRpb24oaW50MzJfdCkgb3ZlcnJpZGUgeworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFZlcmlmeU5hbWVzV2l0aE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4+PiYgLypzZXJ2aWNlcyovLCBjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjpTdHJpbmcxNj4+PiYgLypuYW1lcyovLCBib29sKiAvKl9haWRsX3JldHVybiovKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTik7CiAgIH0KLSAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXROdWxsYWJsZUludEFycmF5KGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPGludDMyX3Q+PiYsIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPGludDMyX3Q+PiopIG92ZXJyaWRlIHsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBHZXRJbnRlcmZhY2VMaXN0KGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OlN0cmluZzE2Pj4+JiAvKm5hbWVzKi8sIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+Pj4qIC8qX2FpZGxfcmV0dXJuKi8pIG92ZXJyaWRlIHsKICAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTsKICAgfQotICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdE51bGxhYmxlQnl0ZUVudW1BcnJheShjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCeXRlRW51bT4+JiwgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Qnl0ZUVudW0+PiopIG92ZXJyaWRlIHsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBWZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VMaXN0KGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+Pj4mIC8qc2VydmljZXMqLywgY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6U3RyaW5nMTY+Pj4mIC8qbmFtZXMqLywgYm9vbCogLypfYWlkbF9yZXR1cm4qLykgb3ZlcnJpZGUgewogICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOwogICB9Ci0gIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0TnVsbGFibGVJbnRFbnVtQXJyYXkoY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bT4+JiwgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bT4+Kikgb3ZlcnJpZGUgeworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJldmVyc2VTdHJpbmdMaXN0KGNvbnN0IDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpTdHJpbmcxNj4mIC8qaW5wdXQqLywgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OlN0cmluZzE2PiogLypyZXBlYXRlZCovLCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6U3RyaW5nMTY+KiAvKl9haWRsX3JldHVybiovKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTik7CiAgIH0KLSAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXROdWxsYWJsZUxvbmdFbnVtQXJyYXkoY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0+PiYsIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtPj4qKSBvdmVycmlkZSB7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0UGFyY2VsRmlsZURlc2NyaXB0b3IoY29uc3QgOjphbmRyb2lkOjpvczo6UGFyY2VsRmlsZURlc2NyaXB0b3ImIC8qcmVhZCovLCA6OmFuZHJvaWQ6Om9zOjpQYXJjZWxGaWxlRGVzY3JpcHRvciogLypfYWlkbF9yZXR1cm4qLykgb3ZlcnJpZGUgewogICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOwogICB9Ci0gIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0TnVsbGFibGVTdHJpbmcoY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6U3RyaW5nMTY+JiwgOjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6U3RyaW5nMTY+Kikgb3ZlcnJpZGUgeworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJldmVyc2VQYXJjZWxGaWxlRGVzY3JpcHRvckFycmF5KGNvbnN0IDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpvczo6UGFyY2VsRmlsZURlc2NyaXB0b3I+JiAvKmlucHV0Ki8sIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpvczo6UGFyY2VsRmlsZURlc2NyaXB0b3I+KiAvKnJlcGVhdGVkKi8sIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpvczo6UGFyY2VsRmlsZURlc2NyaXB0b3I+KiAvKl9haWRsX3JldHVybiovKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTik7CiAgIH0KLSAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXROdWxsYWJsZVN0cmluZ0xpc3QoY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6U3RyaW5nMTY+Pj4mLCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjpTdHJpbmcxNj4+PiopIG92ZXJyaWRlIHsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBUaHJvd1NlcnZpY2VFeGNlcHRpb24oaW50MzJfdCAvKmNvZGUqLykgb3ZlcnJpZGUgewogICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOwogICB9Ci0gIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlKGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpTdHJ1Y3R1cmVkUGFyY2VsYWJsZT4mLCA6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6U3RydWN0dXJlZFBhcmNlbGFibGU+Kikgb3ZlcnJpZGUgeworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdE51bGxhYmxlSW50QXJyYXkoY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8aW50MzJfdD4+JiAvKmlucHV0Ki8sIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPGludDMyX3Q+PiogLypfYWlkbF9yZXR1cm4qLykgb3ZlcnJpZGUgewogICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOwogICB9Ci0gIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgVGFrZXNBbklCaW5kZXIoY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+Jikgb3ZlcnJpZGUgeworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdE51bGxhYmxlQnl0ZUVudW1BcnJheShjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCeXRlRW51bT4+JiAvKmlucHV0Ki8sIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJ5dGVFbnVtPj4qIC8qX2FpZGxfcmV0dXJuKi8pIG92ZXJyaWRlIHsKICAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTsKICAgfQotICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFRha2VzQU51bGxhYmxlSUJpbmRlcihjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4mKSBvdmVycmlkZSB7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0TnVsbGFibGVJbnRFbnVtQXJyYXkoY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bT4+JiAvKmlucHV0Ki8sIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0+PiogLypfYWlkbF9yZXR1cm4qLykgb3ZlcnJpZGUgewogICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOwogICB9Ci0gIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0VXRmOENwcFN0cmluZyhjb25zdCA6OnN0ZDo6c3RyaW5nJiwgOjpzdGQ6OnN0cmluZyopIG92ZXJyaWRlIHsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXROdWxsYWJsZUxvbmdFbnVtQXJyYXkoY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0+PiYgLyppbnB1dCovLCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMb25nRW51bT4+KiAvKl9haWRsX3JldHVybiovKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTik7CiAgIH0KLSAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXROdWxsYWJsZVV0ZjhDcHBTdHJpbmcoY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjpzdHJpbmc+JiwgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjpzdHJpbmc+Kikgb3ZlcnJpZGUgeworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdE51bGxhYmxlU3RyaW5nKGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OlN0cmluZzE2PiYgLyppbnB1dCovLCA6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjpTdHJpbmcxNj4qIC8qX2FpZGxfcmV0dXJuKi8pIG92ZXJyaWRlIHsKICAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTsKICAgfQotICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJldmVyc2VVdGY4Q3BwU3RyaW5nKGNvbnN0IDo6c3RkOjp2ZWN0b3I8OjpzdGQ6OnN0cmluZz4mLCA6OnN0ZDo6dmVjdG9yPDo6c3RkOjpzdHJpbmc+KiwgOjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6c3RyaW5nPiopIG92ZXJyaWRlIHsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXROdWxsYWJsZVN0cmluZ0xpc3QoY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6U3RyaW5nMTY+Pj4mIC8qaW5wdXQqLywgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6U3RyaW5nMTY+Pj4qIC8qX2FpZGxfcmV0dXJuKi8pIG92ZXJyaWRlIHsKICAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTsKICAgfQotICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJldmVyc2VOdWxsYWJsZVV0ZjhDcHBTdHJpbmcoY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjpzdHJpbmc+Pj4mLCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnN0cmluZz4+PiosIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6c3RyaW5nPj4+Kikgb3ZlcnJpZGUgeworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZShjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eT4mIC8qaW5wdXQqLywgOjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6RW1wdHk+KiAvKl9haWRsX3JldHVybiovKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTik7CiAgIH0KLSAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXZlcnNlVXRmOENwcFN0cmluZ0xpc3QoY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjpzdHJpbmc+Pj4mLCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnN0cmluZz4+PiosIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6c3RyaW5nPj4+Kikgb3ZlcnJpZGUgeworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUFycmF5KGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5Pj4+JiAvKmlucHV0Ki8sIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5Pj4+KiAvKl9haWRsX3JldHVybiovKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTik7CiAgIH0KLSAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBHZXRDYWxsYmFjayhib29sLCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPiopIG92ZXJyaWRlIHsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXROdWxsYWJsZVBhcmNlbGFibGVMaXN0KGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5Pj4+JiAvKmlucHV0Ki8sIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5Pj4+KiAvKl9haWRsX3JldHVybiovKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTik7CiAgIH0KLSAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBGaWxsT3V0U3RydWN0dXJlZFBhcmNlbGFibGUoOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6U3RydWN0dXJlZFBhcmNlbGFibGUqKSBvdmVycmlkZSB7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgVGFrZXNBbklCaW5kZXIoY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+JiAvKmlucHV0Ki8pIG92ZXJyaWRlIHsKICAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTsKICAgfQotICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEdldE9sZE5hbWVJbnRlcmZhY2UoOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJT2xkTmFtZT4qKSBvdmVycmlkZSB7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgVGFrZXNBTnVsbGFibGVJQmluZGVyKGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiYgLyppbnB1dCovKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTik7CiAgIH0KLSAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBHZXROZXdOYW1lSW50ZXJmYWNlKDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5ld05hbWU+Kikgb3ZlcnJpZGUgeworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFRha2VzQW5JQmluZGVyTGlzdChjb25zdCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPj4mIC8qaW5wdXQqLykgb3ZlcnJpZGUgewogICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOwogICB9Ci0gIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgR2V0Q3BwSmF2YVRlc3RzKDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiopIG92ZXJyaWRlIHsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBUYWtlc0FOdWxsYWJsZUlCaW5kZXJMaXN0KGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPj4+JiAvKmlucHV0Ki8pIG92ZXJyaWRlIHsKICAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTsKICAgfQotICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIGdldEJhY2tlbmRUeXBlKDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJhY2tlbmRUeXBlKikgb3ZlcnJpZGUgeworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdFV0ZjhDcHBTdHJpbmcoY29uc3QgOjpzdGQ6OnN0cmluZyYgLyp0b2tlbiovLCA6OnN0ZDo6c3RyaW5nKiAvKl9haWRsX3JldHVybiovKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTik7CisgIH0KKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXROdWxsYWJsZVV0ZjhDcHBTdHJpbmcoY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjpzdHJpbmc+JiAvKnRva2VuKi8sIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6c3RyaW5nPiogLypfYWlkbF9yZXR1cm4qLykgb3ZlcnJpZGUgeworICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmV2ZXJzZVV0ZjhDcHBTdHJpbmcoY29uc3QgOjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6c3RyaW5nPiYgLyppbnB1dCovLCA6OnN0ZDo6dmVjdG9yPDo6c3RkOjpzdHJpbmc+KiAvKnJlcGVhdGVkKi8sIDo6c3RkOjp2ZWN0b3I8OjpzdGQ6OnN0cmluZz4qIC8qX2FpZGxfcmV0dXJuKi8pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJldmVyc2VOdWxsYWJsZVV0ZjhDcHBTdHJpbmcoY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjpzdHJpbmc+Pj4mIC8qaW5wdXQqLywgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjpzdHJpbmc+Pj4qIC8qcmVwZWF0ZWQqLywgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjpzdHJpbmc+Pj4qIC8qX2FpZGxfcmV0dXJuKi8pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJldmVyc2VVdGY4Q3BwU3RyaW5nTGlzdChjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnN0cmluZz4+PiYgLyppbnB1dCovLCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnN0cmluZz4+PiogLypyZXBlYXRlZCovLCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnN0cmluZz4+PiogLypfYWlkbF9yZXR1cm4qLykgb3ZlcnJpZGUgeworICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgR2V0Q2FsbGJhY2soYm9vbCAvKnJldHVybl9udWxsKi8sIDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+KiAvKl9haWRsX3JldHVybiovKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTik7CisgIH0KKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBGaWxsT3V0U3RydWN0dXJlZFBhcmNlbGFibGUoOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6U3RydWN0dXJlZFBhcmNlbGFibGUqIC8qcGFyY2VsKi8pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdEV4dGVuZGFibGVQYXJjZWxhYmxlKGNvbnN0IDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OmV4dGVuc2lvbjo6RXh0ZW5kYWJsZVBhcmNlbGFibGUmIC8qZXAqLywgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6ZXh0ZW5zaW9uOjpFeHRlbmRhYmxlUGFyY2VsYWJsZSogLyplcDIqLykgb3ZlcnJpZGUgeworICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmV2ZXJzZUxpc3QoY29uc3QgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6UmVjdXJzaXZlTGlzdCYgLypsaXN0Ki8sIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlJlY3Vyc2l2ZUxpc3QqIC8qX2FpZGxfcmV0dXJuKi8pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJldmVyc2VJQmluZGVyQXJyYXkoY29uc3QgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4+JiAvKmlucHV0Ki8sIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+PiogLypyZXBlYXRlZCovLCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPj4qIC8qX2FpZGxfcmV0dXJuKi8pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJldmVyc2VOdWxsYWJsZUlCaW5kZXJBcnJheShjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4+PiYgLyppbnB1dCovLCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4+PiogLypyZXBlYXRlZCovLCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4+PiogLypfYWlkbF9yZXR1cm4qLykgb3ZlcnJpZGUgeworICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgR2V0T2xkTmFtZUludGVyZmFjZSg6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklPbGROYW1lPiogLypfYWlkbF9yZXR1cm4qLykgb3ZlcnJpZGUgeworICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgR2V0TmV3TmFtZUludGVyZmFjZSg6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOZXdOYW1lPiogLypfYWlkbF9yZXR1cm4qLykgb3ZlcnJpZGUgeworICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgR2V0VW5pb25UYWdzKGNvbnN0IDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6VW5pb24+JiAvKmlucHV0Ki8sIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6VW5pb246OlRhZz4qIC8qX2FpZGxfcmV0dXJuKi8pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEdldENwcEphdmFUZXN0cyg6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4qIC8qX2FpZGxfcmV0dXJuKi8pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIGdldEJhY2tlbmRUeXBlKDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJhY2tlbmRUeXBlKiAvKl9haWRsX3JldHVybiovKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTik7CiAgIH0KIH07ICAvLyBjbGFzcyBJVGVzdFNlcnZpY2VEZWZhdWx0Ci0KIH0gIC8vIG5hbWVzcGFjZSB0ZXN0cwotCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0ludEVudW0uaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9JbnRFbnVtLmgKaW5kZXggNTBiMWI2MC4uMmU1NzY3OCAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0ludEVudW0uaAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvSW50RW51bS5oCkBAIC02LDE3ICs2LDIyIEBACiAjaW5jbHVkZSA8c3RyaW5nPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIG5hbWVzcGFjZSBhaWRsIHsKLQogbmFtZXNwYWNlIHRlc3RzIHsKLQogZW51bSBjbGFzcyBJbnRFbnVtIDogaW50MzJfdCB7CiAgIEZPTyA9IDEwMDAsCiAgIEJBUiA9IDIwMDAsCiAgIEJBWiA9IDIwMDEsCisgIFFVWCBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKCJkbyBub3QgdXNlIHRoaXMiKSkpID0gMjAwMiwKIH07Ci0KK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2RlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIgogW1tub2Rpc2NhcmRdXSBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKEludEVudW0gdmFsKSB7CiAgIHN3aXRjaCh2YWwpIHsKICAgY2FzZSBJbnRFbnVtOjpGT086CkBAIC0yNSwzMCArMzAsMjggQEAKICAgICByZXR1cm4gIkJBUiI7CiAgIGNhc2UgSW50RW51bTo6QkFaOgogICAgIHJldHVybiAiQkFaIjsKKyAgY2FzZSBJbnRFbnVtOjpRVVg6CisgICAgcmV0dXJuICJRVVgiOwogICBkZWZhdWx0OgogICAgIHJldHVybiBzdGQ6OnRvX3N0cmluZyhzdGF0aWNfY2FzdDxpbnQzMl90Pih2YWwpKTsKICAgfQogfQotCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCiB9ICAvLyBuYW1lc3BhY2UgdGVzdHMKLQogfSAgLy8gbmFtZXNwYWNlIGFpZGwKLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogbmFtZXNwYWNlIGludGVybmFsIHsKLQogI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKICNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2MrKzE3LWV4dGVuc2lvbnMiCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdkZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIKIHRlbXBsYXRlIDw+Ci1jb25zdGV4cHIgaW5saW5lIHN0ZDo6YXJyYXk8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bSwgMz4gZW51bV92YWx1ZXM8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bT4gPSB7Citjb25zdGV4cHIgaW5saW5lIHN0ZDo6YXJyYXk8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bSwgND4gZW51bV92YWx1ZXM8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bT4gPSB7CiAgIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW06OkZPTywKICAgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bTo6QkFSLAogICA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtOjpCQVosCisgIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW06OlFVWCwKIH07CiAjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCi0KIH0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0xpc3RPZkludGVyZmFjZXMuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9MaXN0T2ZJbnRlcmZhY2VzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU1YmY0YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9MaXN0T2ZJbnRlcmZhY2VzLmgKQEAgLTAsMCArMSwzMDggQEAKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL0xpc3RPZkludGVyZmFjZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl90b19zdHJpbmcuaD4KKyNpbmNsdWRlIDxhcnJheT4KKyNpbmNsdWRlIDxiaW5kZXIvRW51bXMuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSUJpbmRlci5oPgorI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGJpbmRlci9TdGF0dXMuaD4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8b3B0aW9uYWw+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHR1cGxlPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisjaW5jbHVkZSA8dmFyaWFudD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpZm5kZWYgX19CSU9OSUNfXworI2RlZmluZSBfX2Fzc2VydDIoYSxiLGMsZCkgKCh2b2lkKTApCisjZW5kaWYKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK2NsYXNzIExpc3RPZkludGVyZmFjZXMgOiBwdWJsaWMgOjphbmRyb2lkOjpQYXJjZWxhYmxlIHsKK3B1YmxpYzoKKyAgY2xhc3MgSUVtcHR5SW50ZXJmYWNlIDogcHVibGljIDo6YW5kcm9pZDo6SUludGVyZmFjZSB7CisgIHB1YmxpYzoKKyAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKEVtcHR5SW50ZXJmYWNlKQorICB9OyAgLy8gY2xhc3MgSUVtcHR5SW50ZXJmYWNlCisKKyAgY2xhc3MgSUVtcHR5SW50ZXJmYWNlRGVmYXVsdCA6IHB1YmxpYyBJRW1wdHlJbnRlcmZhY2UgeworICBwdWJsaWM6CisgICAgOjphbmRyb2lkOjpJQmluZGVyKiBvbkFzQmluZGVyKCkgb3ZlcnJpZGUgeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICB9OyAgLy8gY2xhc3MgSUVtcHR5SW50ZXJmYWNlRGVmYXVsdAorICBjbGFzcyBCcEVtcHR5SW50ZXJmYWNlIDogcHVibGljIDo6YW5kcm9pZDo6QnBJbnRlcmZhY2U8SUVtcHR5SW50ZXJmYWNlPiB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBCcEVtcHR5SW50ZXJmYWNlKGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiYgX2FpZGxfaW1wbCk7CisgICAgdmlydHVhbCB+QnBFbXB0eUludGVyZmFjZSgpID0gZGVmYXVsdDsKKyAgfTsgIC8vIGNsYXNzIEJwRW1wdHlJbnRlcmZhY2UKKyAgY2xhc3MgQm5FbXB0eUludGVyZmFjZSA6IHB1YmxpYyA6OmFuZHJvaWQ6OkJuSW50ZXJmYWNlPElFbXB0eUludGVyZmFjZT4geworICBwdWJsaWM6CisgICAgZXhwbGljaXQgQm5FbXB0eUludGVyZmFjZSgpOworICAgIDo6YW5kcm9pZDo6c3RhdHVzX3Qgb25UcmFuc2FjdCh1aW50MzJfdCBfYWlkbF9jb2RlLCBjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCYgX2FpZGxfZGF0YSwgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3JlcGx5LCB1aW50MzJfdCBfYWlkbF9mbGFncykgb3ZlcnJpZGU7CisgIH07ICAvLyBjbGFzcyBCbkVtcHR5SW50ZXJmYWNlCisKKyAgY2xhc3MgSUVtcHR5SW50ZXJmYWNlRGVsZWdhdG9yIDogcHVibGljIEJuRW1wdHlJbnRlcmZhY2UgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQgSUVtcHR5SW50ZXJmYWNlRGVsZWdhdG9yKDo6YW5kcm9pZDo6c3A8SUVtcHR5SW50ZXJmYWNlPiAmaW1wbCkgOiBfYWlkbF9kZWxlZ2F0ZShpbXBsKSB7fQorCisgIHByaXZhdGU6CisgICAgOjphbmRyb2lkOjpzcDxJRW1wdHlJbnRlcmZhY2U+IF9haWRsX2RlbGVnYXRlOworICB9OyAgLy8gY2xhc3MgSUVtcHR5SW50ZXJmYWNlRGVsZWdhdG9yCisgIGNsYXNzIElNeUludGVyZmFjZSA6IHB1YmxpYyA6OmFuZHJvaWQ6OklJbnRlcmZhY2UgeworICBwdWJsaWM6CisgICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShNeUludGVyZmFjZSkKKyAgICB2aXJ0dWFsIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgbWV0aG9kV2l0aEludGVyZmFjZXMoY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+JiBpZmFjZSwgY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+JiBudWxsYWJsZV9pZmFjZSwgY29uc3QgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+JiBpZmFjZV9saXN0X2luLCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4qIGlmYWNlX2xpc3Rfb3V0LCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4qIGlmYWNlX2xpc3RfaW5vdXQsIGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+JiBudWxsYWJsZV9pZmFjZV9saXN0X2luLCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PiogbnVsbGFibGVfaWZhY2VfbGlzdF9vdXQsIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+KiBudWxsYWJsZV9pZmFjZV9saXN0X2lub3V0LCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PiogX2FpZGxfcmV0dXJuKSA9IDA7CisgIH07ICAvLyBjbGFzcyBJTXlJbnRlcmZhY2UKKworICBjbGFzcyBJTXlJbnRlcmZhY2VEZWZhdWx0IDogcHVibGljIElNeUludGVyZmFjZSB7CisgIHB1YmxpYzoKKyAgICA6OmFuZHJvaWQ6OklCaW5kZXIqIG9uQXNCaW5kZXIoKSBvdmVycmlkZSB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBtZXRob2RXaXRoSW50ZXJmYWNlcyhjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4mIC8qaWZhY2UqLywgY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+JiAvKm51bGxhYmxlX2lmYWNlKi8sIGNvbnN0IDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+PiYgLyppZmFjZV9saXN0X2luKi8sIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+PiogLyppZmFjZV9saXN0X291dCovLCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4qIC8qaWZhY2VfbGlzdF9pbm91dCovLCBjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PiYgLypudWxsYWJsZV9pZmFjZV9saXN0X2luKi8sIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+KiAvKm51bGxhYmxlX2lmYWNlX2xpc3Rfb3V0Ki8sIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+KiAvKm51bGxhYmxlX2lmYWNlX2xpc3RfaW5vdXQqLywgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4qIC8qX2FpZGxfcmV0dXJuKi8pIG92ZXJyaWRlIHsKKyAgICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOworICAgIH0KKyAgfTsgIC8vIGNsYXNzIElNeUludGVyZmFjZURlZmF1bHQKKyAgY2xhc3MgQnBNeUludGVyZmFjZSA6IHB1YmxpYyA6OmFuZHJvaWQ6OkJwSW50ZXJmYWNlPElNeUludGVyZmFjZT4geworICBwdWJsaWM6CisgICAgZXhwbGljaXQgQnBNeUludGVyZmFjZShjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4mIF9haWRsX2ltcGwpOworICAgIHZpcnR1YWwgfkJwTXlJbnRlcmZhY2UoKSA9IGRlZmF1bHQ7CisgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBtZXRob2RXaXRoSW50ZXJmYWNlcyhjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4mIGlmYWNlLCBjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4mIG51bGxhYmxlX2lmYWNlLCBjb25zdCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4mIGlmYWNlX2xpc3RfaW4sIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+PiogaWZhY2VfbGlzdF9vdXQsIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+PiogaWZhY2VfbGlzdF9pbm91dCwgY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4mIG51bGxhYmxlX2lmYWNlX2xpc3RfaW4sIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+KiBudWxsYWJsZV9pZmFjZV9saXN0X291dCwgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4qIG51bGxhYmxlX2lmYWNlX2xpc3RfaW5vdXQsIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICB9OyAgLy8gY2xhc3MgQnBNeUludGVyZmFjZQorICBjbGFzcyBCbk15SW50ZXJmYWNlIDogcHVibGljIDo6YW5kcm9pZDo6Qm5JbnRlcmZhY2U8SU15SW50ZXJmYWNlPiB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX21ldGhvZFdpdGhJbnRlcmZhY2VzID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMDsKKyAgICBleHBsaWNpdCBCbk15SW50ZXJmYWNlKCk7CisgICAgOjphbmRyb2lkOjpzdGF0dXNfdCBvblRyYW5zYWN0KHVpbnQzMl90IF9haWRsX2NvZGUsIGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsJiBfYWlkbF9kYXRhLCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcmVwbHksIHVpbnQzMl90IF9haWRsX2ZsYWdzKSBvdmVycmlkZTsKKyAgfTsgIC8vIGNsYXNzIEJuTXlJbnRlcmZhY2UKKworICBjbGFzcyBJTXlJbnRlcmZhY2VEZWxlZ2F0b3IgOiBwdWJsaWMgQm5NeUludGVyZmFjZSB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBJTXlJbnRlcmZhY2VEZWxlZ2F0b3IoOjphbmRyb2lkOjpzcDxJTXlJbnRlcmZhY2U+ICZpbXBsKSA6IF9haWRsX2RlbGVnYXRlKGltcGwpIHt9CisKKyAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIG1ldGhvZFdpdGhJbnRlcmZhY2VzKGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPiYgaWZhY2UsIGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPiYgbnVsbGFibGVfaWZhY2UsIGNvbnN0IDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+PiYgaWZhY2VfbGlzdF9pbiwgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+KiBpZmFjZV9saXN0X291dCwgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+KiBpZmFjZV9saXN0X2lub3V0LCBjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PiYgbnVsbGFibGVfaWZhY2VfbGlzdF9pbiwgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4qIG51bGxhYmxlX2lmYWNlX2xpc3Rfb3V0LCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PiogbnVsbGFibGVfaWZhY2VfbGlzdF9pbm91dCwgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgICAgcmV0dXJuIF9haWRsX2RlbGVnYXRlLT5tZXRob2RXaXRoSW50ZXJmYWNlcyhpZmFjZSwgbnVsbGFibGVfaWZhY2UsIGlmYWNlX2xpc3RfaW4sIGlmYWNlX2xpc3Rfb3V0LCBpZmFjZV9saXN0X2lub3V0LCBudWxsYWJsZV9pZmFjZV9saXN0X2luLCBudWxsYWJsZV9pZmFjZV9saXN0X291dCwgbnVsbGFibGVfaWZhY2VfbGlzdF9pbm91dCwgX2FpZGxfcmV0dXJuKTsKKyAgICB9CisgIHByaXZhdGU6CisgICAgOjphbmRyb2lkOjpzcDxJTXlJbnRlcmZhY2U+IF9haWRsX2RlbGVnYXRlOworICB9OyAgLy8gY2xhc3MgSU15SW50ZXJmYWNlRGVsZWdhdG9yCisgIGNsYXNzIE15UGFyY2VsYWJsZSA6IHB1YmxpYyA6OmFuZHJvaWQ6OlBhcmNlbGFibGUgeworICBwdWJsaWM6CisgICAgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+IGlmYWNlOworICAgIDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPiBudWxsYWJsZV9pZmFjZTsKKyAgICA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4gaWZhY2VfbGlzdDsKKyAgICA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PiBudWxsYWJsZV9pZmFjZV9saXN0OworICAgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgTXlQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZShpZmFjZSwgbnVsbGFibGVfaWZhY2UsIGlmYWNlX2xpc3QsIG51bGxhYmxlX2lmYWNlX2xpc3QpICE9IHN0ZDo6dGllKHJocy5pZmFjZSwgcmhzLm51bGxhYmxlX2lmYWNlLCByaHMuaWZhY2VfbGlzdCwgcmhzLm51bGxhYmxlX2lmYWNlX2xpc3QpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgTXlQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZShpZmFjZSwgbnVsbGFibGVfaWZhY2UsIGlmYWNlX2xpc3QsIG51bGxhYmxlX2lmYWNlX2xpc3QpIDwgc3RkOjp0aWUocmhzLmlmYWNlLCByaHMubnVsbGFibGVfaWZhY2UsIHJocy5pZmFjZV9saXN0LCByaHMubnVsbGFibGVfaWZhY2VfbGlzdCk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgTXlQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZShpZmFjZSwgbnVsbGFibGVfaWZhY2UsIGlmYWNlX2xpc3QsIG51bGxhYmxlX2lmYWNlX2xpc3QpIDw9IHN0ZDo6dGllKHJocy5pZmFjZSwgcmhzLm51bGxhYmxlX2lmYWNlLCByaHMuaWZhY2VfbGlzdCwgcmhzLm51bGxhYmxlX2lmYWNlX2xpc3QpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE15UGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoaWZhY2UsIG51bGxhYmxlX2lmYWNlLCBpZmFjZV9saXN0LCBudWxsYWJsZV9pZmFjZV9saXN0KSA9PSBzdGQ6OnRpZShyaHMuaWZhY2UsIHJocy5udWxsYWJsZV9pZmFjZSwgcmhzLmlmYWNlX2xpc3QsIHJocy5udWxsYWJsZV9pZmFjZV9saXN0KTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IE15UGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoaWZhY2UsIG51bGxhYmxlX2lmYWNlLCBpZmFjZV9saXN0LCBudWxsYWJsZV9pZmFjZV9saXN0KSA+IHN0ZDo6dGllKHJocy5pZmFjZSwgcmhzLm51bGxhYmxlX2lmYWNlLCByaHMuaWZhY2VfbGlzdCwgcmhzLm51bGxhYmxlX2lmYWNlX2xpc3QpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IE15UGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoaWZhY2UsIG51bGxhYmxlX2lmYWNlLCBpZmFjZV9saXN0LCBudWxsYWJsZV9pZmFjZV9saXN0KSA+PSBzdGQ6OnRpZShyaHMuaWZhY2UsIHJocy5udWxsYWJsZV9pZmFjZSwgcmhzLmlmYWNlX2xpc3QsIHJocy5udWxsYWJsZV9pZmFjZV9saXN0KTsKKyAgICB9CisKKyAgICA6OmFuZHJvaWQ6OnN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGZpbmFsOworICAgIDo6YW5kcm9pZDo6c3RhdHVzX3Qgd3JpdGVUb1BhcmNlbCg6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCBmaW5hbDsKKyAgICBzdGF0aWMgY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiYgZ2V0UGFyY2VsYWJsZURlc2NyaXB0b3IoKSB7CisgICAgICBzdGF0aWMgY29uc3QgOjphbmRyb2lkOjpTdGF0aWNTdHJpbmcxNiBERVNDSVBUT1IgKHUiYW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuTXlQYXJjZWxhYmxlIik7CisgICAgICByZXR1cm4gREVTQ0lQVE9SOworICAgIH0KKyAgICBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7CisgICAgICBvcyA8PCAiTXlQYXJjZWxhYmxleyI7CisgICAgICBvcyA8PCAiaWZhY2U6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaWZhY2UpOworICAgICAgb3MgPDwgIiwgbnVsbGFibGVfaWZhY2U6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcobnVsbGFibGVfaWZhY2UpOworICAgICAgb3MgPDwgIiwgaWZhY2VfbGlzdDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpZmFjZV9saXN0KTsKKyAgICAgIG9zIDw8ICIsIG51bGxhYmxlX2lmYWNlX2xpc3Q6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcobnVsbGFibGVfaWZhY2VfbGlzdCk7CisgICAgICBvcyA8PCAifSI7CisgICAgICByZXR1cm4gb3Muc3RyKCk7CisgICAgfQorICB9OyAgLy8gY2xhc3MgTXlQYXJjZWxhYmxlCisgIGNsYXNzIE15VW5pb24gOiBwdWJsaWMgOjphbmRyb2lkOjpQYXJjZWxhYmxlIHsKKyAgcHVibGljOgorICAgIGVudW0gY2xhc3MgVGFnIDogaW50MzJfdCB7CisgICAgICBpZmFjZSA9IDAsCisgICAgICBudWxsYWJsZV9pZmFjZSA9IDEsCisgICAgICBpZmFjZV9saXN0ID0gMiwKKyAgICAgIG51bGxhYmxlX2lmYWNlX2xpc3QgPSAzLAorICAgIH07CisgICAgLy8gRXhwb3NlIHRhZyBzeW1ib2xzIGZvciBsZWdhY3kgY29kZQorICAgIHN0YXRpYyBjb25zdCBpbmxpbmUgVGFnIGlmYWNlID0gVGFnOjppZmFjZTsKKyAgICBzdGF0aWMgY29uc3QgaW5saW5lIFRhZyBudWxsYWJsZV9pZmFjZSA9IFRhZzo6bnVsbGFibGVfaWZhY2U7CisgICAgc3RhdGljIGNvbnN0IGlubGluZSBUYWcgaWZhY2VfbGlzdCA9IFRhZzo6aWZhY2VfbGlzdDsKKyAgICBzdGF0aWMgY29uc3QgaW5saW5lIFRhZyBudWxsYWJsZV9pZmFjZV9saXN0ID0gVGFnOjpudWxsYWJsZV9pZmFjZV9saXN0OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBfbm90X3NlbGYgPSAhc3RkOjppc19zYW1lX3Y8c3RkOjpyZW1vdmVfY3ZfdDxzdGQ6OnJlbW92ZV9yZWZlcmVuY2VfdDxfVHA+PiwgTXlVbmlvbj47CisKKyAgICBNeVVuaW9uKCkgOiBfdmFsdWUoc3RkOjppbl9wbGFjZV9pbmRleDxzdGF0aWNfY2FzdDxzaXplX3Q+KGlmYWNlKT4sIDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPigpKSB7IH0KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lID0gc3RkOjplbmFibGVfaWZfdDxfbm90X3NlbGY8X1RwPj4+CisgICAgLy8gTk9MSU5UTkVYVExJTkUoZ29vZ2xlLWV4cGxpY2l0LWNvbnN0cnVjdG9yKQorICAgIGNvbnN0ZXhwciBNeVVuaW9uKF9UcCYmIF9hcmcpCisgICAgICAgIDogX3ZhbHVlKHN0ZDo6Zm9yd2FyZDxfVHA+KF9hcmcpKSB7fQorCisgICAgdGVtcGxhdGUgPHNpemVfdCBfTnAsIHR5cGVuYW1lLi4uIF9UcD4KKyAgICBjb25zdGV4cHIgZXhwbGljaXQgTXlVbmlvbihzdGQ6OmluX3BsYWNlX2luZGV4X3Q8X05wPiwgX1RwJiYuLi4gX2FyZ3MpCisgICAgICAgIDogX3ZhbHVlKHN0ZDo6aW5fcGxhY2VfaW5kZXg8X05wPiwgc3RkOjpmb3J3YXJkPF9UcD4oX2FyZ3MpLi4uKSB7fQorCisgICAgdGVtcGxhdGUgPFRhZyBfdGFnLCB0eXBlbmFtZS4uLiBfVHA+CisgICAgc3RhdGljIE15VW5pb24gbWFrZShfVHAmJi4uLiBfYXJncykgeworICAgICAgcmV0dXJuIE15VW5pb24oc3RkOjppbl9wbGFjZV9pbmRleDxzdGF0aWNfY2FzdDxzaXplX3Q+KF90YWcpPiwgc3RkOjpmb3J3YXJkPF9UcD4oX2FyZ3MpLi4uKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8VGFnIF90YWcsIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUuLi4gX1VwPgorICAgIHN0YXRpYyBNeVVuaW9uIG1ha2Uoc3RkOjppbml0aWFsaXplcl9saXN0PF9UcD4gX2lsLCBfVXAmJi4uLiBfYXJncykgeworICAgICAgcmV0dXJuIE15VW5pb24oc3RkOjppbl9wbGFjZV9pbmRleDxzdGF0aWNfY2FzdDxzaXplX3Q+KF90YWcpPiwgc3RkOjptb3ZlKF9pbCksIHN0ZDo6Zm9yd2FyZDxfVXA+KF9hcmdzKS4uLik7CisgICAgfQorCisgICAgVGFnIGdldFRhZygpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxUYWc+KF92YWx1ZS5pbmRleCgpKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8VGFnIF90YWc+CisgICAgY29uc3QgYXV0byYgZ2V0KCkgY29uc3QgeworICAgICAgaWYgKGdldFRhZygpICE9IF90YWcpIHsgX19hc3NlcnQyKF9fRklMRV9fLCBfX0xJTkVfXywgX19QUkVUVFlfRlVOQ1RJT05fXywgImJhZCBhY2Nlc3M6IGEgd3JvbmcgdGFnIik7IH0KKyAgICAgIHJldHVybiBzdGQ6OmdldDxzdGF0aWNfY2FzdDxzaXplX3Q+KF90YWcpPihfdmFsdWUpOworICAgIH0KKworICAgIHRlbXBsYXRlIDxUYWcgX3RhZz4KKyAgICBhdXRvJiBnZXQoKSB7CisgICAgICBpZiAoZ2V0VGFnKCkgIT0gX3RhZykgeyBfX2Fzc2VydDIoX19GSUxFX18sIF9fTElORV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fLCAiYmFkIGFjY2VzczogYSB3cm9uZyB0YWciKTsgfQorICAgICAgcmV0dXJuIHN0ZDo6Z2V0PHN0YXRpY19jYXN0PHNpemVfdD4oX3RhZyk+KF92YWx1ZSk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPFRhZyBfdGFnLCB0eXBlbmFtZS4uLiBfVHA+CisgICAgdm9pZCBzZXQoX1RwJiYuLi4gX2FyZ3MpIHsKKyAgICAgIF92YWx1ZS5lbXBsYWNlPHN0YXRpY19jYXN0PHNpemVfdD4oX3RhZyk+KHN0ZDo6Zm9yd2FyZDxfVHA+KF9hcmdzKS4uLik7CisgICAgfQorCisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBNeVVuaW9uJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBfdmFsdWUgIT0gcmhzLl92YWx1ZTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IE15VW5pb24mIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIF92YWx1ZSA8IHJocy5fdmFsdWU7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgTXlVbmlvbiYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gX3ZhbHVlIDw9IHJocy5fdmFsdWU7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgTXlVbmlvbiYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gX3ZhbHVlID09IHJocy5fdmFsdWU7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPihjb25zdCBNeVVuaW9uJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBfdmFsdWUgPiByaHMuX3ZhbHVlOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IE15VW5pb24mIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIF92YWx1ZSA+PSByaHMuX3ZhbHVlOworICAgIH0KKworICAgIDo6YW5kcm9pZDo6c3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgZmluYWw7CisgICAgOjphbmRyb2lkOjpzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IGZpbmFsOworICAgIHN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiBnZXRQYXJjZWxhYmxlRGVzY3JpcHRvcigpIHsKKyAgICAgIHN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0YXRpY1N0cmluZzE2IERFU0NJUFRPUiAodSJhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5NeVVuaW9uIik7CisgICAgICByZXR1cm4gREVTQ0lQVE9SOworICAgIH0KKyAgICBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7CisgICAgICBvcyA8PCAiTXlVbmlvbnsiOworICAgICAgc3dpdGNoIChnZXRUYWcoKSkgeworICAgICAgY2FzZSBpZmFjZTogb3MgPDwgImlmYWNlOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGdldDxpZmFjZT4oKSk7IGJyZWFrOworICAgICAgY2FzZSBudWxsYWJsZV9pZmFjZTogb3MgPDwgIm51bGxhYmxlX2lmYWNlOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGdldDxudWxsYWJsZV9pZmFjZT4oKSk7IGJyZWFrOworICAgICAgY2FzZSBpZmFjZV9saXN0OiBvcyA8PCAiaWZhY2VfbGlzdDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhnZXQ8aWZhY2VfbGlzdD4oKSk7IGJyZWFrOworICAgICAgY2FzZSBudWxsYWJsZV9pZmFjZV9saXN0OiBvcyA8PCAibnVsbGFibGVfaWZhY2VfbGlzdDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhnZXQ8bnVsbGFibGVfaWZhY2VfbGlzdD4oKSk7IGJyZWFrOworICAgICAgfQorICAgICAgb3MgPDwgIn0iOworICAgICAgcmV0dXJuIG9zLnN0cigpOworICAgIH0KKyAgcHJpdmF0ZToKKyAgICBzdGQ6OnZhcmlhbnQ8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+LCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4sIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+PiwgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4+IF92YWx1ZTsKKyAgfTsgIC8vIGNsYXNzIE15VW5pb24KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBMaXN0T2ZJbnRlcmZhY2VzJikgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZSgpICE9IHN0ZDo6dGllKCk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IExpc3RPZkludGVyZmFjZXMmKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKCkgPCBzdGQ6OnRpZSgpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgTGlzdE9mSW50ZXJmYWNlcyYpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoKSA8PSBzdGQ6OnRpZSgpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgTGlzdE9mSW50ZXJmYWNlcyYpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoKSA9PSBzdGQ6OnRpZSgpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPihjb25zdCBMaXN0T2ZJbnRlcmZhY2VzJikgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZSgpID4gc3RkOjp0aWUoKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IExpc3RPZkludGVyZmFjZXMmKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKCkgPj0gc3RkOjp0aWUoKTsKKyAgfQorCisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgZmluYWw7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3Qgd3JpdGVUb1BhcmNlbCg6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCBmaW5hbDsKKyAgc3RhdGljIGNvbnN0IDo6YW5kcm9pZDo6U3RyaW5nMTYmIGdldFBhcmNlbGFibGVEZXNjcmlwdG9yKCkgeworICAgIHN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0YXRpY1N0cmluZzE2IERFU0NJUFRPUiAodSJhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcyIpOworICAgIHJldHVybiBERVNDSVBUT1I7CisgIH0KKyAgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvczsKKyAgICBvcyA8PCAiTGlzdE9mSW50ZXJmYWNlc3siOworICAgIG9zIDw8ICJ9IjsKKyAgICByZXR1cm4gb3Muc3RyKCk7CisgIH0KK307ICAvLyBjbGFzcyBMaXN0T2ZJbnRlcmZhY2VzCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK1tbbm9kaXNjYXJkXV0gc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZyhMaXN0T2ZJbnRlcmZhY2VzOjpNeVVuaW9uOjpUYWcgdmFsKSB7CisgIHN3aXRjaCh2YWwpIHsKKyAgY2FzZSBMaXN0T2ZJbnRlcmZhY2VzOjpNeVVuaW9uOjpUYWc6OmlmYWNlOgorICAgIHJldHVybiAiaWZhY2UiOworICBjYXNlIExpc3RPZkludGVyZmFjZXM6Ok15VW5pb246OlRhZzo6bnVsbGFibGVfaWZhY2U6CisgICAgcmV0dXJuICJudWxsYWJsZV9pZmFjZSI7CisgIGNhc2UgTGlzdE9mSW50ZXJmYWNlczo6TXlVbmlvbjo6VGFnOjppZmFjZV9saXN0OgorICAgIHJldHVybiAiaWZhY2VfbGlzdCI7CisgIGNhc2UgTGlzdE9mSW50ZXJmYWNlczo6TXlVbmlvbjo6VGFnOjpudWxsYWJsZV9pZmFjZV9saXN0OgorICAgIHJldHVybiAibnVsbGFibGVfaWZhY2VfbGlzdCI7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIHN0ZDo6dG9fc3RyaW5nKHN0YXRpY19jYXN0PGludDMyX3Q+KHZhbCkpOworICB9Cit9Cit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGludGVybmFsIHsKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdjKysxNy1leHRlbnNpb25zIgordGVtcGxhdGUgPD4KK2NvbnN0ZXhwciBpbmxpbmUgc3RkOjphcnJheTw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpNeVVuaW9uOjpUYWcsIDQ+IGVudW1fdmFsdWVzPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6Ok15VW5pb246OlRhZz4gPSB7CisgIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6Ok15VW5pb246OlRhZzo6aWZhY2UsCisgIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6Ok15VW5pb246OlRhZzo6bnVsbGFibGVfaWZhY2UsCisgIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6Ok15VW5pb246OlRhZzo6aWZhY2VfbGlzdCwKKyAgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6TXlVbmlvbjo6VGFnOjpudWxsYWJsZV9pZmFjZV9saXN0LAorfTsKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9Mb25nRW51bS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0xvbmdFbnVtLmgKaW5kZXggOGNhYTNhYS4uODAyMmY2YiAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0xvbmdFbnVtLmgKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0xvbmdFbnVtLmgKQEAgLTYsMTcgKzYsMTkgQEAKICNpbmNsdWRlIDxzdHJpbmc+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogbmFtZXNwYWNlIGFpZGwgewotCiBuYW1lc3BhY2UgdGVzdHMgewotCiBlbnVtIGNsYXNzIExvbmdFbnVtIDogaW50NjRfdCB7CiAgIEZPTyA9IDEwMDAwMDAwMDAwMEwsCiAgIEJBUiA9IDIwMDAwMDAwMDAwMEwsCiAgIEJBWiA9IDIwMDAwMDAwMDAwMUwsCiB9OwotCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKIFtbbm9kaXNjYXJkXV0gc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZyhMb25nRW51bSB2YWwpIHsKICAgc3dpdGNoKHZhbCkgewogICBjYXNlIExvbmdFbnVtOjpGT086CkBAIC0yOSwxNiArMzEsMTEgQEAKICAgICByZXR1cm4gc3RkOjp0b19zdHJpbmcoc3RhdGljX2Nhc3Q8aW50NjRfdD4odmFsKSk7CiAgIH0KIH0KLQogfSAgLy8gbmFtZXNwYWNlIHRlc3RzCi0KIH0gIC8vIG5hbWVzcGFjZSBhaWRsCi0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIG5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KICNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCiAjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdjKysxNy1leHRlbnNpb25zIgogdGVtcGxhdGUgPD4KQEAgLTQ4LDcgKzQ1LDUgQEAKICAgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW06OkJBWiwKIH07CiAjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCi0KIH0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL090aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmcuaAppbmRleCA3ZWI3MmU5Li5mYTA1YjE1IDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmcuaAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmcuaApAQCAtNywxMyArNywxMSBAQAogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogbmFtZXNwYWNlIGFpZGwgewotCiBuYW1lc3BhY2UgdGVzdHMgewotCiBjbGFzcyBPdGhlclBhcmNlbGFibGVGb3JUb1N0cmluZyA6IHB1YmxpYyA6OmFuZHJvaWQ6OlBhcmNlbGFibGUgewogcHVibGljOgorICA6OmFuZHJvaWQ6OlN0cmluZzE2IGZpZWxkOwogICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IE90aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nJiByaHMpIGNvbnN0IHsKICAgICByZXR1cm4gc3RkOjp0aWUoZmllbGQpICE9IHN0ZDo6dGllKHJocy5maWVsZCk7CiAgIH0KQEAgLTMzLDcgKzMxLDYgQEAKICAgICByZXR1cm4gc3RkOjp0aWUoZmllbGQpID49IHN0ZDo6dGllKHJocy5maWVsZCk7CiAgIH0KIAotICA6OmFuZHJvaWQ6OlN0cmluZzE2IGZpZWxkOwogICA6OmFuZHJvaWQ6OnN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGZpbmFsOwogICA6OmFuZHJvaWQ6OnN0YXR1c190IHdyaXRlVG9QYXJjZWwoOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgZmluYWw7CiAgIHN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiBnZXRQYXJjZWxhYmxlRGVzY3JpcHRvcigpIHsKQEAgLTQ4LDkgKzQ1LDYgQEAKICAgICByZXR1cm4gb3Muc3RyKCk7CiAgIH0KIH07ICAvLyBjbGFzcyBPdGhlclBhcmNlbGFibGVGb3JUb1N0cmluZwotCiB9ICAvLyBuYW1lc3BhY2UgdGVzdHMKLQogfSAgLy8gbmFtZXNwYWNlIGFpZGwKLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9QYXJjZWxhYmxlRm9yVG9TdHJpbmcuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9QYXJjZWxhYmxlRm9yVG9TdHJpbmcuaAppbmRleCAzOWU2NGJlLi43ZjNhZGY3IDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvUGFyY2VsYWJsZUZvclRvU3RyaW5nLmgKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL1BhcmNlbGFibGVGb3JUb1N0cmluZy5oCkBAIC0xNCwxMyArMTQsMzMgQEAKICNpbmNsdWRlIDx2ZWN0b3I+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogbmFtZXNwYWNlIGFpZGwgewotCiBuYW1lc3BhY2UgdGVzdHMgewotCiBjbGFzcyBQYXJjZWxhYmxlRm9yVG9TdHJpbmcgOiBwdWJsaWMgOjphbmRyb2lkOjpQYXJjZWxhYmxlIHsKIHB1YmxpYzoKKyAgaW50MzJfdCBpbnRWYWx1ZSA9IDA7CisgIDo6c3RkOjp2ZWN0b3I8aW50MzJfdD4gaW50QXJyYXk7CisgIGludDY0X3QgbG9uZ1ZhbHVlID0gMEw7CisgIDo6c3RkOjp2ZWN0b3I8aW50NjRfdD4gbG9uZ0FycmF5OworICBkb3VibGUgZG91YmxlVmFsdWUgPSAwLjAwMDAwMDsKKyAgOjpzdGQ6OnZlY3Rvcjxkb3VibGU+IGRvdWJsZUFycmF5OworICBmbG9hdCBmbG9hdFZhbHVlID0gMC4wMDAwMDBmOworICA6OnN0ZDo6dmVjdG9yPGZsb2F0PiBmbG9hdEFycmF5OworICBpbnQ4X3QgYnl0ZVZhbHVlID0gMDsKKyAgOjpzdGQ6OnZlY3Rvcjx1aW50OF90PiBieXRlQXJyYXk7CisgIGJvb2wgYm9vbGVhblZhbHVlID0gZmFsc2U7CisgIDo6c3RkOjp2ZWN0b3I8Ym9vbD4gYm9vbGVhbkFycmF5OworICA6OmFuZHJvaWQ6OlN0cmluZzE2IHN0cmluZ1ZhbHVlOworICA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6U3RyaW5nMTY+IHN0cmluZ0FycmF5OworICA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6U3RyaW5nMTY+IHN0cmluZ0xpc3Q7CisgIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Ok90aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nIHBhcmNlbGFibGVWYWx1ZTsKKyAgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpPdGhlclBhcmNlbGFibGVGb3JUb1N0cmluZz4gcGFyY2VsYWJsZUFycmF5OworICA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtIGVudW1WYWx1ZSA9IDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW06OkZPTzsKKyAgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtPiBlbnVtQXJyYXk7CisgIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpTdHJpbmcxNj4gbnVsbEFycmF5OworICA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6U3RyaW5nMTY+IG51bGxMaXN0OworICA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpHZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGU8aW50MzJfdCwgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6U3RydWN0dXJlZFBhcmNlbGFibGUsIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0+IHBhcmNlbGFibGVHZW5lcmljOworICA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpVbmlvbiB1bmlvblZhbHVlOwogICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFBhcmNlbGFibGVGb3JUb1N0cmluZyYgcmhzKSBjb25zdCB7CiAgICAgcmV0dXJuIHN0ZDo6dGllKGludFZhbHVlLCBpbnRBcnJheSwgbG9uZ1ZhbHVlLCBsb25nQXJyYXksIGRvdWJsZVZhbHVlLCBkb3VibGVBcnJheSwgZmxvYXRWYWx1ZSwgZmxvYXRBcnJheSwgYnl0ZVZhbHVlLCBieXRlQXJyYXksIGJvb2xlYW5WYWx1ZSwgYm9vbGVhbkFycmF5LCBzdHJpbmdWYWx1ZSwgc3RyaW5nQXJyYXksIHN0cmluZ0xpc3QsIHBhcmNlbGFibGVWYWx1ZSwgcGFyY2VsYWJsZUFycmF5LCBlbnVtVmFsdWUsIGVudW1BcnJheSwgbnVsbEFycmF5LCBudWxsTGlzdCwgcGFyY2VsYWJsZUdlbmVyaWMsIHVuaW9uVmFsdWUpICE9IHN0ZDo6dGllKHJocy5pbnRWYWx1ZSwgcmhzLmludEFycmF5LCByaHMubG9uZ1ZhbHVlLCByaHMubG9uZ0FycmF5LCByaHMuZG91YmxlVmFsdWUsIHJocy5kb3VibGVBcnJheSwgcmhzLmZsb2F0VmFsdWUsIHJocy5mbG9hdEFycmF5LCByaHMuYnl0ZVZhbHVlLCByaHMuYnl0ZUFycmF5LCByaHMuYm9vbGVhblZhbHVlLCByaHMuYm9vbGVhbkFycmF5LCByaHMuc3RyaW5nVmFsdWUsIHJocy5zdHJpbmdBcnJheSwgcmhzLnN0cmluZ0xpc3QsIHJocy5wYXJjZWxhYmxlVmFsdWUsIHJocy5wYXJjZWxhYmxlQXJyYXksIHJocy5lbnVtVmFsdWUsIHJocy5lbnVtQXJyYXksIHJocy5udWxsQXJyYXksIHJocy5udWxsTGlzdCwgcmhzLnBhcmNlbGFibGVHZW5lcmljLCByaHMudW5pb25WYWx1ZSk7CiAgIH0KQEAgLTQwLDI5ICs2MCw2IEBACiAgICAgcmV0dXJuIHN0ZDo6dGllKGludFZhbHVlLCBpbnRBcnJheSwgbG9uZ1ZhbHVlLCBsb25nQXJyYXksIGRvdWJsZVZhbHVlLCBkb3VibGVBcnJheSwgZmxvYXRWYWx1ZSwgZmxvYXRBcnJheSwgYnl0ZVZhbHVlLCBieXRlQXJyYXksIGJvb2xlYW5WYWx1ZSwgYm9vbGVhbkFycmF5LCBzdHJpbmdWYWx1ZSwgc3RyaW5nQXJyYXksIHN0cmluZ0xpc3QsIHBhcmNlbGFibGVWYWx1ZSwgcGFyY2VsYWJsZUFycmF5LCBlbnVtVmFsdWUsIGVudW1BcnJheSwgbnVsbEFycmF5LCBudWxsTGlzdCwgcGFyY2VsYWJsZUdlbmVyaWMsIHVuaW9uVmFsdWUpID49IHN0ZDo6dGllKHJocy5pbnRWYWx1ZSwgcmhzLmludEFycmF5LCByaHMubG9uZ1ZhbHVlLCByaHMubG9uZ0FycmF5LCByaHMuZG91YmxlVmFsdWUsIHJocy5kb3VibGVBcnJheSwgcmhzLmZsb2F0VmFsdWUsIHJocy5mbG9hdEFycmF5LCByaHMuYnl0ZVZhbHVlLCByaHMuYnl0ZUFycmF5LCByaHMuYm9vbGVhblZhbHVlLCByaHMuYm9vbGVhbkFycmF5LCByaHMuc3RyaW5nVmFsdWUsIHJocy5zdHJpbmdBcnJheSwgcmhzLnN0cmluZ0xpc3QsIHJocy5wYXJjZWxhYmxlVmFsdWUsIHJocy5wYXJjZWxhYmxlQXJyYXksIHJocy5lbnVtVmFsdWUsIHJocy5lbnVtQXJyYXksIHJocy5udWxsQXJyYXksIHJocy5udWxsTGlzdCwgcmhzLnBhcmNlbGFibGVHZW5lcmljLCByaHMudW5pb25WYWx1ZSk7CiAgIH0KIAotICBpbnQzMl90IGludFZhbHVlID0gaW50MzJfdCgwKTsKLSAgOjpzdGQ6OnZlY3RvcjxpbnQzMl90PiBpbnRBcnJheTsKLSAgaW50NjRfdCBsb25nVmFsdWUgPSBpbnQ2NF90KDBMKTsKLSAgOjpzdGQ6OnZlY3RvcjxpbnQ2NF90PiBsb25nQXJyYXk7Ci0gIGRvdWJsZSBkb3VibGVWYWx1ZSA9IGRvdWJsZSgwLjAwMDAwMCk7Ci0gIDo6c3RkOjp2ZWN0b3I8ZG91YmxlPiBkb3VibGVBcnJheTsKLSAgZmxvYXQgZmxvYXRWYWx1ZSA9IGZsb2F0KDAuMDAwMDAwZik7Ci0gIDo6c3RkOjp2ZWN0b3I8ZmxvYXQ+IGZsb2F0QXJyYXk7Ci0gIGludDhfdCBieXRlVmFsdWUgPSBpbnQ4X3QoMCk7Ci0gIDo6c3RkOjp2ZWN0b3I8dWludDhfdD4gYnl0ZUFycmF5OwotICBib29sIGJvb2xlYW5WYWx1ZSA9IGJvb2woZmFsc2UpOwotICA6OnN0ZDo6dmVjdG9yPGJvb2w+IGJvb2xlYW5BcnJheTsKLSAgOjphbmRyb2lkOjpTdHJpbmcxNiBzdHJpbmdWYWx1ZTsKLSAgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OlN0cmluZzE2PiBzdHJpbmdBcnJheTsKLSAgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OlN0cmluZzE2PiBzdHJpbmdMaXN0OwotICA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpPdGhlclBhcmNlbGFibGVGb3JUb1N0cmluZyBwYXJjZWxhYmxlVmFsdWU7Ci0gIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6T3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmc+IHBhcmNlbGFibGVBcnJheTsKLSAgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bSBlbnVtVmFsdWUgPSA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtKDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW06OkZPTyk7Ci0gIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bT4gZW51bUFycmF5OwotICA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6U3RyaW5nMTY+IG51bGxBcnJheTsKLSAgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OlN0cmluZzE2PiBudWxsTGlzdDsKLSAgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6R2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxlPGludDMyX3QsIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlN0cnVjdHVyZWRQYXJjZWxhYmxlLCA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtPiBwYXJjZWxhYmxlR2VuZXJpYzsKLSAgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6VW5pb24gdW5pb25WYWx1ZTsKICAgOjphbmRyb2lkOjpzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBmaW5hbDsKICAgOjphbmRyb2lkOjpzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IGZpbmFsOwogICBzdGF0aWMgY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiYgZ2V0UGFyY2VsYWJsZURlc2NyaXB0b3IoKSB7CkBAIC05OSw5ICs5Niw2IEBACiAgICAgcmV0dXJuIG9zLnN0cigpOwogICB9CiB9OyAgLy8gY2xhc3MgUGFyY2VsYWJsZUZvclRvU3RyaW5nCi0KIH0gIC8vIG5hbWVzcGFjZSB0ZXN0cwotCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL1JlY3Vyc2l2ZUxpc3QuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9SZWN1cnNpdmVMaXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg3NGQ5ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9SZWN1cnNpdmVMaXN0LmgKQEAgLTAsMCArMSw1NSBAQAorI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvUmVjdXJzaXZlTGlzdC5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3RvX3N0cmluZy5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxiaW5kZXIvU3RhdHVzLmg+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxvcHRpb25hbD4KKyNpbmNsdWRlIDx0dXBsZT4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworY2xhc3MgUmVjdXJzaXZlTGlzdCA6IHB1YmxpYyA6OmFuZHJvaWQ6OlBhcmNlbGFibGUgeworcHVibGljOgorICBpbnQzMl90IHZhbHVlID0gMDsKKyAgOjpzdGQ6OnVuaXF1ZV9wdHI8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6UmVjdXJzaXZlTGlzdD4gbmV4dDsKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBSZWN1cnNpdmVMaXN0JiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUodmFsdWUsIG5leHQpICE9IHN0ZDo6dGllKHJocy52YWx1ZSwgcmhzLm5leHQpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBSZWN1cnNpdmVMaXN0JiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUodmFsdWUsIG5leHQpIDwgc3RkOjp0aWUocmhzLnZhbHVlLCByaHMubmV4dCk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBSZWN1cnNpdmVMaXN0JiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUodmFsdWUsIG5leHQpIDw9IHN0ZDo6dGllKHJocy52YWx1ZSwgcmhzLm5leHQpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgUmVjdXJzaXZlTGlzdCYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKHZhbHVlLCBuZXh0KSA9PSBzdGQ6OnRpZShyaHMudmFsdWUsIHJocy5uZXh0KTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgUmVjdXJzaXZlTGlzdCYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKHZhbHVlLCBuZXh0KSA+IHN0ZDo6dGllKHJocy52YWx1ZSwgcmhzLm5leHQpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgUmVjdXJzaXZlTGlzdCYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKHZhbHVlLCBuZXh0KSA+PSBzdGQ6OnRpZShyaHMudmFsdWUsIHJocy5uZXh0KTsKKyAgfQorCisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgZmluYWw7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3Qgd3JpdGVUb1BhcmNlbCg6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCBmaW5hbDsKKyAgc3RhdGljIGNvbnN0IDo6YW5kcm9pZDo6U3RyaW5nMTYmIGdldFBhcmNlbGFibGVEZXNjcmlwdG9yKCkgeworICAgIHN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0YXRpY1N0cmluZzE2IERFU0NJUFRPUiAodSJhbmRyb2lkLmFpZGwudGVzdHMuUmVjdXJzaXZlTGlzdCIpOworICAgIHJldHVybiBERVNDSVBUT1I7CisgIH0KKyAgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvczsKKyAgICBvcyA8PCAiUmVjdXJzaXZlTGlzdHsiOworICAgIG9zIDw8ICJ2YWx1ZTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyh2YWx1ZSk7CisgICAgb3MgPDwgIiwgbmV4dDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhuZXh0KTsKKyAgICBvcyA8PCAifSI7CisgICAgcmV0dXJuIG9zLnN0cigpOworICB9Cit9OyAgLy8gY2xhc3MgUmVjdXJzaXZlTGlzdAorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL1N0cnVjdHVyZWRQYXJjZWxhYmxlLmgKaW5kZXggYmZkMWU1OC4uMzM5YzUxNiAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL1N0cnVjdHVyZWRQYXJjZWxhYmxlLmgKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL1N0cnVjdHVyZWRQYXJjZWxhYmxlLmgKQEAgLTQsNiArNCw3IEBACiAjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL0NvbnN0YW50RXhwcmVzc2lvbkVudW0uaD4KICNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvSW50RW51bS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9Mb25nRW51bS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9Vbmlvbi5oPgogI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3RvX3N0cmluZy5oPgogI2luY2x1ZGUgPGJpbmRlci9JQmluZGVyLmg+CkBAIC0xNywzNCArMTgsNDYgQEAKICNpbmNsdWRlIDx2ZWN0b3I+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogbmFtZXNwYWNlIGFpZGwgewotCiBuYW1lc3BhY2UgdGVzdHMgewotCiBjbGFzcyBTdHJ1Y3R1cmVkUGFyY2VsYWJsZSA6IHB1YmxpYyA6OmFuZHJvaWQ6OlBhcmNlbGFibGUgewogcHVibGljOgotICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFN0cnVjdHVyZWRQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gc3RkOjp0aWUoc2hvdWxkQ29udGFpblRocmVlRnMsIGYsIHNob3VsZEJlSmVycnksIHNob3VsZEJlQnl0ZUJhciwgc2hvdWxkQmVJbnRCYXIsIHNob3VsZEJlTG9uZ0Jhciwgc2hvdWxkQ29udGFpblR3b0J5dGVGb29zLCBzaG91bGRDb250YWluVHdvSW50Rm9vcywgc2hvdWxkQ29udGFpblR3b0xvbmdGb29zLCBzdHJpbmdEZWZhdWx0c1RvRm9vLCBieXRlRGVmYXVsdHNUb0ZvdXIsIGludERlZmF1bHRzVG9GaXZlLCBsb25nRGVmYXVsdHNUb05lZ2F0aXZlU2V2ZW4sIGJvb2xlYW5EZWZhdWx0c1RvVHJ1ZSwgY2hhckRlZmF1bHRzVG9DLCBmbG9hdERlZmF1bHRzVG9QaSwgZG91YmxlV2l0aERlZmF1bHQsIGFycmF5RGVmYXVsdHNUbzEyMywgYXJyYXlEZWZhdWx0c1RvRW1wdHksIGJvb2xEZWZhdWx0LCBieXRlRGVmYXVsdCwgaW50RGVmYXVsdCwgbG9uZ0RlZmF1bHQsIGZsb2F0RGVmYXVsdCwgZG91YmxlRGVmYXVsdCwgY2hlY2tEb3VibGVGcm9tRmxvYXQsIGNoZWNrU3RyaW5nQXJyYXkxLCBjaGVja1N0cmluZ0FycmF5MiwgaW50MzJfbWluLCBpbnQzMl9tYXgsIGludDY0X21heCwgaGV4SW50MzJfbmVnXzEsIGliaW5kZXIsIGludDMyXzEsIGludDY0XzEsIGhleEludDMyX3Bvc18xLCBoZXhJbnQ2NF9wb3NfMSwgY29uc3RfZXhwcnNfMSwgY29uc3RfZXhwcnNfMiwgY29uc3RfZXhwcnNfMywgY29uc3RfZXhwcnNfNCwgY29uc3RfZXhwcnNfNSwgY29uc3RfZXhwcnNfNiwgY29uc3RfZXhwcnNfNywgY29uc3RfZXhwcnNfOCwgY29uc3RfZXhwcnNfOSwgY29uc3RfZXhwcnNfMTAsIGFkZFN0cmluZzEsIGFkZFN0cmluZzIsIHNob3VsZFNldEJpdDBBbmRCaXQyLCB1LCBzaG91bGRCZUNvbnN0UzEsIGRlZmF1bHRXaXRoRm9vKSAhPSBzdGQ6OnRpZShyaHMuc2hvdWxkQ29udGFpblRocmVlRnMsIHJocy5mLCByaHMuc2hvdWxkQmVKZXJyeSwgcmhzLnNob3VsZEJlQnl0ZUJhciwgcmhzLnNob3VsZEJlSW50QmFyLCByaHMuc2hvdWxkQmVMb25nQmFyLCByaHMuc2hvdWxkQ29udGFpblR3b0J5dGVGb29zLCByaHMuc2hvdWxkQ29udGFpblR3b0ludEZvb3MsIHJocy5zaG91bGRDb250YWluVHdvTG9uZ0Zvb3MsIHJocy5zdHJpbmdEZWZhdWx0c1RvRm9vLCByaHMuYnl0ZURlZmF1bHRzVG9Gb3VyLCByaHMuaW50RGVmYXVsdHNUb0ZpdmUsIHJocy5sb25nRGVmYXVsdHNUb05lZ2F0aXZlU2V2ZW4sIHJocy5ib29sZWFuRGVmYXVsdHNUb1RydWUsIHJocy5jaGFyRGVmYXVsdHNUb0MsIHJocy5mbG9hdERlZmF1bHRzVG9QaSwgcmhzLmRvdWJsZVdpdGhEZWZhdWx0LCByaHMuYXJyYXlEZWZhdWx0c1RvMTIzLCByaHMuYXJyYXlEZWZhdWx0c1RvRW1wdHksIHJocy5ib29sRGVmYXVsdCwgcmhzLmJ5dGVEZWZhdWx0LCByaHMuaW50RGVmYXVsdCwgcmhzLmxvbmdEZWZhdWx0LCByaHMuZmxvYXREZWZhdWx0LCByaHMuZG91YmxlRGVmYXVsdCwgcmhzLmNoZWNrRG91YmxlRnJvbUZsb2F0LCByaHMuY2hlY2tTdHJpbmdBcnJheTEsIHJocy5jaGVja1N0cmluZ0FycmF5MiwgcmhzLmludDMyX21pbiwgcmhzLmludDMyX21heCwgcmhzLmludDY0X21heCwgcmhzLmhleEludDMyX25lZ18xLCByaHMuaWJpbmRlciwgcmhzLmludDMyXzEsIHJocy5pbnQ2NF8xLCByaHMuaGV4SW50MzJfcG9zXzEsIHJocy5oZXhJbnQ2NF9wb3NfMSwgcmhzLmNvbnN0X2V4cHJzXzEsIHJocy5jb25zdF9leHByc18yLCByaHMuY29uc3RfZXhwcnNfMywgcmhzLmNvbnN0X2V4cHJzXzQsIHJocy5jb25zdF9leHByc181LCByaHMuY29uc3RfZXhwcnNfNiwgcmhzLmNvbnN0X2V4cHJzXzcsIHJocy5jb25zdF9leHByc184LCByaHMuY29uc3RfZXhwcnNfOSwgcmhzLmNvbnN0X2V4cHJzXzEwLCByaHMuYWRkU3RyaW5nMSwgcmhzLmFkZFN0cmluZzIsIHJocy5zaG91bGRTZXRCaXQwQW5kQml0MiwgcmhzLnUsIHJocy5zaG91bGRCZUNvbnN0UzEsIHJocy5kZWZhdWx0V2l0aEZvbyk7Ci0gIH0KLSAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFN0cnVjdHVyZWRQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gc3RkOjp0aWUoc2hvdWxkQ29udGFpblRocmVlRnMsIGYsIHNob3VsZEJlSmVycnksIHNob3VsZEJlQnl0ZUJhciwgc2hvdWxkQmVJbnRCYXIsIHNob3VsZEJlTG9uZ0Jhciwgc2hvdWxkQ29udGFpblR3b0J5dGVGb29zLCBzaG91bGRDb250YWluVHdvSW50Rm9vcywgc2hvdWxkQ29udGFpblR3b0xvbmdGb29zLCBzdHJpbmdEZWZhdWx0c1RvRm9vLCBieXRlRGVmYXVsdHNUb0ZvdXIsIGludERlZmF1bHRzVG9GaXZlLCBsb25nRGVmYXVsdHNUb05lZ2F0aXZlU2V2ZW4sIGJvb2xlYW5EZWZhdWx0c1RvVHJ1ZSwgY2hhckRlZmF1bHRzVG9DLCBmbG9hdERlZmF1bHRzVG9QaSwgZG91YmxlV2l0aERlZmF1bHQsIGFycmF5RGVmYXVsdHNUbzEyMywgYXJyYXlEZWZhdWx0c1RvRW1wdHksIGJvb2xEZWZhdWx0LCBieXRlRGVmYXVsdCwgaW50RGVmYXVsdCwgbG9uZ0RlZmF1bHQsIGZsb2F0RGVmYXVsdCwgZG91YmxlRGVmYXVsdCwgY2hlY2tEb3VibGVGcm9tRmxvYXQsIGNoZWNrU3RyaW5nQXJyYXkxLCBjaGVja1N0cmluZ0FycmF5MiwgaW50MzJfbWluLCBpbnQzMl9tYXgsIGludDY0X21heCwgaGV4SW50MzJfbmVnXzEsIGliaW5kZXIsIGludDMyXzEsIGludDY0XzEsIGhleEludDMyX3Bvc18xLCBoZXhJbnQ2NF9wb3NfMSwgY29uc3RfZXhwcnNfMSwgY29uc3RfZXhwcnNfMiwgY29uc3RfZXhwcnNfMywgY29uc3RfZXhwcnNfNCwgY29uc3RfZXhwcnNfNSwgY29uc3RfZXhwcnNfNiwgY29uc3RfZXhwcnNfNywgY29uc3RfZXhwcnNfOCwgY29uc3RfZXhwcnNfOSwgY29uc3RfZXhwcnNfMTAsIGFkZFN0cmluZzEsIGFkZFN0cmluZzIsIHNob3VsZFNldEJpdDBBbmRCaXQyLCB1LCBzaG91bGRCZUNvbnN0UzEsIGRlZmF1bHRXaXRoRm9vKSA8IHN0ZDo6dGllKHJocy5zaG91bGRDb250YWluVGhyZWVGcywgcmhzLmYsIHJocy5zaG91bGRCZUplcnJ5LCByaHMuc2hvdWxkQmVCeXRlQmFyLCByaHMuc2hvdWxkQmVJbnRCYXIsIHJocy5zaG91bGRCZUxvbmdCYXIsIHJocy5zaG91bGRDb250YWluVHdvQnl0ZUZvb3MsIHJocy5zaG91bGRDb250YWluVHdvSW50Rm9vcywgcmhzLnNob3VsZENvbnRhaW5Ud29Mb25nRm9vcywgcmhzLnN0cmluZ0RlZmF1bHRzVG9Gb28sIHJocy5ieXRlRGVmYXVsdHNUb0ZvdXIsIHJocy5pbnREZWZhdWx0c1RvRml2ZSwgcmhzLmxvbmdEZWZhdWx0c1RvTmVnYXRpdmVTZXZlbiwgcmhzLmJvb2xlYW5EZWZhdWx0c1RvVHJ1ZSwgcmhzLmNoYXJEZWZhdWx0c1RvQywgcmhzLmZsb2F0RGVmYXVsdHNUb1BpLCByaHMuZG91YmxlV2l0aERlZmF1bHQsIHJocy5hcnJheURlZmF1bHRzVG8xMjMsIHJocy5hcnJheURlZmF1bHRzVG9FbXB0eSwgcmhzLmJvb2xEZWZhdWx0LCByaHMuYnl0ZURlZmF1bHQsIHJocy5pbnREZWZhdWx0LCByaHMubG9uZ0RlZmF1bHQsIHJocy5mbG9hdERlZmF1bHQsIHJocy5kb3VibGVEZWZhdWx0LCByaHMuY2hlY2tEb3VibGVGcm9tRmxvYXQsIHJocy5jaGVja1N0cmluZ0FycmF5MSwgcmhzLmNoZWNrU3RyaW5nQXJyYXkyLCByaHMuaW50MzJfbWluLCByaHMuaW50MzJfbWF4LCByaHMuaW50NjRfbWF4LCByaHMuaGV4SW50MzJfbmVnXzEsIHJocy5pYmluZGVyLCByaHMuaW50MzJfMSwgcmhzLmludDY0XzEsIHJocy5oZXhJbnQzMl9wb3NfMSwgcmhzLmhleEludDY0X3Bvc18xLCByaHMuY29uc3RfZXhwcnNfMSwgcmhzLmNvbnN0X2V4cHJzXzIsIHJocy5jb25zdF9leHByc18zLCByaHMuY29uc3RfZXhwcnNfNCwgcmhzLmNvbnN0X2V4cHJzXzUsIHJocy5jb25zdF9leHByc182LCByaHMuY29uc3RfZXhwcnNfNywgcmhzLmNvbnN0X2V4cHJzXzgsIHJocy5jb25zdF9leHByc185LCByaHMuY29uc3RfZXhwcnNfMTAsIHJocy5hZGRTdHJpbmcxLCByaHMuYWRkU3RyaW5nMiwgcmhzLnNob3VsZFNldEJpdDBBbmRCaXQyLCByaHMudSwgcmhzLnNob3VsZEJlQ29uc3RTMSwgcmhzLmRlZmF1bHRXaXRoRm9vKTsKLSAgfQotICBpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IFN0cnVjdHVyZWRQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gc3RkOjp0aWUoc2hvdWxkQ29udGFpblRocmVlRnMsIGYsIHNob3VsZEJlSmVycnksIHNob3VsZEJlQnl0ZUJhciwgc2hvdWxkQmVJbnRCYXIsIHNob3VsZEJlTG9uZ0Jhciwgc2hvdWxkQ29udGFpblR3b0J5dGVGb29zLCBzaG91bGRDb250YWluVHdvSW50Rm9vcywgc2hvdWxkQ29udGFpblR3b0xvbmdGb29zLCBzdHJpbmdEZWZhdWx0c1RvRm9vLCBieXRlRGVmYXVsdHNUb0ZvdXIsIGludERlZmF1bHRzVG9GaXZlLCBsb25nRGVmYXVsdHNUb05lZ2F0aXZlU2V2ZW4sIGJvb2xlYW5EZWZhdWx0c1RvVHJ1ZSwgY2hhckRlZmF1bHRzVG9DLCBmbG9hdERlZmF1bHRzVG9QaSwgZG91YmxlV2l0aERlZmF1bHQsIGFycmF5RGVmYXVsdHNUbzEyMywgYXJyYXlEZWZhdWx0c1RvRW1wdHksIGJvb2xEZWZhdWx0LCBieXRlRGVmYXVsdCwgaW50RGVmYXVsdCwgbG9uZ0RlZmF1bHQsIGZsb2F0RGVmYXVsdCwgZG91YmxlRGVmYXVsdCwgY2hlY2tEb3VibGVGcm9tRmxvYXQsIGNoZWNrU3RyaW5nQXJyYXkxLCBjaGVja1N0cmluZ0FycmF5MiwgaW50MzJfbWluLCBpbnQzMl9tYXgsIGludDY0X21heCwgaGV4SW50MzJfbmVnXzEsIGliaW5kZXIsIGludDMyXzEsIGludDY0XzEsIGhleEludDMyX3Bvc18xLCBoZXhJbnQ2NF9wb3NfMSwgY29uc3RfZXhwcnNfMSwgY29uc3RfZXhwcnNfMiwgY29uc3RfZXhwcnNfMywgY29uc3RfZXhwcnNfNCwgY29uc3RfZXhwcnNfNSwgY29uc3RfZXhwcnNfNiwgY29uc3RfZXhwcnNfNywgY29uc3RfZXhwcnNfOCwgY29uc3RfZXhwcnNfOSwgY29uc3RfZXhwcnNfMTAsIGFkZFN0cmluZzEsIGFkZFN0cmluZzIsIHNob3VsZFNldEJpdDBBbmRCaXQyLCB1LCBzaG91bGRCZUNvbnN0UzEsIGRlZmF1bHRXaXRoRm9vKSA8PSBzdGQ6OnRpZShyaHMuc2hvdWxkQ29udGFpblRocmVlRnMsIHJocy5mLCByaHMuc2hvdWxkQmVKZXJyeSwgcmhzLnNob3VsZEJlQnl0ZUJhciwgcmhzLnNob3VsZEJlSW50QmFyLCByaHMuc2hvdWxkQmVMb25nQmFyLCByaHMuc2hvdWxkQ29udGFpblR3b0J5dGVGb29zLCByaHMuc2hvdWxkQ29udGFpblR3b0ludEZvb3MsIHJocy5zaG91bGRDb250YWluVHdvTG9uZ0Zvb3MsIHJocy5zdHJpbmdEZWZhdWx0c1RvRm9vLCByaHMuYnl0ZURlZmF1bHRzVG9Gb3VyLCByaHMuaW50RGVmYXVsdHNUb0ZpdmUsIHJocy5sb25nRGVmYXVsdHNUb05lZ2F0aXZlU2V2ZW4sIHJocy5ib29sZWFuRGVmYXVsdHNUb1RydWUsIHJocy5jaGFyRGVmYXVsdHNUb0MsIHJocy5mbG9hdERlZmF1bHRzVG9QaSwgcmhzLmRvdWJsZVdpdGhEZWZhdWx0LCByaHMuYXJyYXlEZWZhdWx0c1RvMTIzLCByaHMuYXJyYXlEZWZhdWx0c1RvRW1wdHksIHJocy5ib29sRGVmYXVsdCwgcmhzLmJ5dGVEZWZhdWx0LCByaHMuaW50RGVmYXVsdCwgcmhzLmxvbmdEZWZhdWx0LCByaHMuZmxvYXREZWZhdWx0LCByaHMuZG91YmxlRGVmYXVsdCwgcmhzLmNoZWNrRG91YmxlRnJvbUZsb2F0LCByaHMuY2hlY2tTdHJpbmdBcnJheTEsIHJocy5jaGVja1N0cmluZ0FycmF5MiwgcmhzLmludDMyX21pbiwgcmhzLmludDMyX21heCwgcmhzLmludDY0X21heCwgcmhzLmhleEludDMyX25lZ18xLCByaHMuaWJpbmRlciwgcmhzLmludDMyXzEsIHJocy5pbnQ2NF8xLCByaHMuaGV4SW50MzJfcG9zXzEsIHJocy5oZXhJbnQ2NF9wb3NfMSwgcmhzLmNvbnN0X2V4cHJzXzEsIHJocy5jb25zdF9leHByc18yLCByaHMuY29uc3RfZXhwcnNfMywgcmhzLmNvbnN0X2V4cHJzXzQsIHJocy5jb25zdF9leHByc181LCByaHMuY29uc3RfZXhwcnNfNiwgcmhzLmNvbnN0X2V4cHJzXzcsIHJocy5jb25zdF9leHByc184LCByaHMuY29uc3RfZXhwcnNfOSwgcmhzLmNvbnN0X2V4cHJzXzEwLCByaHMuYWRkU3RyaW5nMSwgcmhzLmFkZFN0cmluZzIsIHJocy5zaG91bGRTZXRCaXQwQW5kQml0MiwgcmhzLnUsIHJocy5zaG91bGRCZUNvbnN0UzEsIHJocy5kZWZhdWx0V2l0aEZvbyk7Ci0gIH0KLSAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBTdHJ1Y3R1cmVkUGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0ZDo6dGllKHNob3VsZENvbnRhaW5UaHJlZUZzLCBmLCBzaG91bGRCZUplcnJ5LCBzaG91bGRCZUJ5dGVCYXIsIHNob3VsZEJlSW50QmFyLCBzaG91bGRCZUxvbmdCYXIsIHNob3VsZENvbnRhaW5Ud29CeXRlRm9vcywgc2hvdWxkQ29udGFpblR3b0ludEZvb3MsIHNob3VsZENvbnRhaW5Ud29Mb25nRm9vcywgc3RyaW5nRGVmYXVsdHNUb0ZvbywgYnl0ZURlZmF1bHRzVG9Gb3VyLCBpbnREZWZhdWx0c1RvRml2ZSwgbG9uZ0RlZmF1bHRzVG9OZWdhdGl2ZVNldmVuLCBib29sZWFuRGVmYXVsdHNUb1RydWUsIGNoYXJEZWZhdWx0c1RvQywgZmxvYXREZWZhdWx0c1RvUGksIGRvdWJsZVdpdGhEZWZhdWx0LCBhcnJheURlZmF1bHRzVG8xMjMsIGFycmF5RGVmYXVsdHNUb0VtcHR5LCBib29sRGVmYXVsdCwgYnl0ZURlZmF1bHQsIGludERlZmF1bHQsIGxvbmdEZWZhdWx0LCBmbG9hdERlZmF1bHQsIGRvdWJsZURlZmF1bHQsIGNoZWNrRG91YmxlRnJvbUZsb2F0LCBjaGVja1N0cmluZ0FycmF5MSwgY2hlY2tTdHJpbmdBcnJheTIsIGludDMyX21pbiwgaW50MzJfbWF4LCBpbnQ2NF9tYXgsIGhleEludDMyX25lZ18xLCBpYmluZGVyLCBpbnQzMl8xLCBpbnQ2NF8xLCBoZXhJbnQzMl9wb3NfMSwgaGV4SW50NjRfcG9zXzEsIGNvbnN0X2V4cHJzXzEsIGNvbnN0X2V4cHJzXzIsIGNvbnN0X2V4cHJzXzMsIGNvbnN0X2V4cHJzXzQsIGNvbnN0X2V4cHJzXzUsIGNvbnN0X2V4cHJzXzYsIGNvbnN0X2V4cHJzXzcsIGNvbnN0X2V4cHJzXzgsIGNvbnN0X2V4cHJzXzksIGNvbnN0X2V4cHJzXzEwLCBhZGRTdHJpbmcxLCBhZGRTdHJpbmcyLCBzaG91bGRTZXRCaXQwQW5kQml0MiwgdSwgc2hvdWxkQmVDb25zdFMxLCBkZWZhdWx0V2l0aEZvbykgPT0gc3RkOjp0aWUocmhzLnNob3VsZENvbnRhaW5UaHJlZUZzLCByaHMuZiwgcmhzLnNob3VsZEJlSmVycnksIHJocy5zaG91bGRCZUJ5dGVCYXIsIHJocy5zaG91bGRCZUludEJhciwgcmhzLnNob3VsZEJlTG9uZ0JhciwgcmhzLnNob3VsZENvbnRhaW5Ud29CeXRlRm9vcywgcmhzLnNob3VsZENvbnRhaW5Ud29JbnRGb29zLCByaHMuc2hvdWxkQ29udGFpblR3b0xvbmdGb29zLCByaHMuc3RyaW5nRGVmYXVsdHNUb0ZvbywgcmhzLmJ5dGVEZWZhdWx0c1RvRm91ciwgcmhzLmludERlZmF1bHRzVG9GaXZlLCByaHMubG9uZ0RlZmF1bHRzVG9OZWdhdGl2ZVNldmVuLCByaHMuYm9vbGVhbkRlZmF1bHRzVG9UcnVlLCByaHMuY2hhckRlZmF1bHRzVG9DLCByaHMuZmxvYXREZWZhdWx0c1RvUGksIHJocy5kb3VibGVXaXRoRGVmYXVsdCwgcmhzLmFycmF5RGVmYXVsdHNUbzEyMywgcmhzLmFycmF5RGVmYXVsdHNUb0VtcHR5LCByaHMuYm9vbERlZmF1bHQsIHJocy5ieXRlRGVmYXVsdCwgcmhzLmludERlZmF1bHQsIHJocy5sb25nRGVmYXVsdCwgcmhzLmZsb2F0RGVmYXVsdCwgcmhzLmRvdWJsZURlZmF1bHQsIHJocy5jaGVja0RvdWJsZUZyb21GbG9hdCwgcmhzLmNoZWNrU3RyaW5nQXJyYXkxLCByaHMuY2hlY2tTdHJpbmdBcnJheTIsIHJocy5pbnQzMl9taW4sIHJocy5pbnQzMl9tYXgsIHJocy5pbnQ2NF9tYXgsIHJocy5oZXhJbnQzMl9uZWdfMSwgcmhzLmliaW5kZXIsIHJocy5pbnQzMl8xLCByaHMuaW50NjRfMSwgcmhzLmhleEludDMyX3Bvc18xLCByaHMuaGV4SW50NjRfcG9zXzEsIHJocy5jb25zdF9leHByc18xLCByaHMuY29uc3RfZXhwcnNfMiwgcmhzLmNvbnN0X2V4cHJzXzMsIHJocy5jb25zdF9leHByc180LCByaHMuY29uc3RfZXhwcnNfNSwgcmhzLmNvbnN0X2V4cHJzXzYsIHJocy5jb25zdF9leHByc183LCByaHMuY29uc3RfZXhwcnNfOCwgcmhzLmNvbnN0X2V4cHJzXzksIHJocy5jb25zdF9leHByc18xMCwgcmhzLmFkZFN0cmluZzEsIHJocy5hZGRTdHJpbmcyLCByaHMuc2hvdWxkU2V0Qml0MEFuZEJpdDIsIHJocy51LCByaHMuc2hvdWxkQmVDb25zdFMxLCByaHMuZGVmYXVsdFdpdGhGb28pOwotICB9Ci0gIGlubGluZSBib29sIG9wZXJhdG9yPihjb25zdCBTdHJ1Y3R1cmVkUGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0ZDo6dGllKHNob3VsZENvbnRhaW5UaHJlZUZzLCBmLCBzaG91bGRCZUplcnJ5LCBzaG91bGRCZUJ5dGVCYXIsIHNob3VsZEJlSW50QmFyLCBzaG91bGRCZUxvbmdCYXIsIHNob3VsZENvbnRhaW5Ud29CeXRlRm9vcywgc2hvdWxkQ29udGFpblR3b0ludEZvb3MsIHNob3VsZENvbnRhaW5Ud29Mb25nRm9vcywgc3RyaW5nRGVmYXVsdHNUb0ZvbywgYnl0ZURlZmF1bHRzVG9Gb3VyLCBpbnREZWZhdWx0c1RvRml2ZSwgbG9uZ0RlZmF1bHRzVG9OZWdhdGl2ZVNldmVuLCBib29sZWFuRGVmYXVsdHNUb1RydWUsIGNoYXJEZWZhdWx0c1RvQywgZmxvYXREZWZhdWx0c1RvUGksIGRvdWJsZVdpdGhEZWZhdWx0LCBhcnJheURlZmF1bHRzVG8xMjMsIGFycmF5RGVmYXVsdHNUb0VtcHR5LCBib29sRGVmYXVsdCwgYnl0ZURlZmF1bHQsIGludERlZmF1bHQsIGxvbmdEZWZhdWx0LCBmbG9hdERlZmF1bHQsIGRvdWJsZURlZmF1bHQsIGNoZWNrRG91YmxlRnJvbUZsb2F0LCBjaGVja1N0cmluZ0FycmF5MSwgY2hlY2tTdHJpbmdBcnJheTIsIGludDMyX21pbiwgaW50MzJfbWF4LCBpbnQ2NF9tYXgsIGhleEludDMyX25lZ18xLCBpYmluZGVyLCBpbnQzMl8xLCBpbnQ2NF8xLCBoZXhJbnQzMl9wb3NfMSwgaGV4SW50NjRfcG9zXzEsIGNvbnN0X2V4cHJzXzEsIGNvbnN0X2V4cHJzXzIsIGNvbnN0X2V4cHJzXzMsIGNvbnN0X2V4cHJzXzQsIGNvbnN0X2V4cHJzXzUsIGNvbnN0X2V4cHJzXzYsIGNvbnN0X2V4cHJzXzcsIGNvbnN0X2V4cHJzXzgsIGNvbnN0X2V4cHJzXzksIGNvbnN0X2V4cHJzXzEwLCBhZGRTdHJpbmcxLCBhZGRTdHJpbmcyLCBzaG91bGRTZXRCaXQwQW5kQml0MiwgdSwgc2hvdWxkQmVDb25zdFMxLCBkZWZhdWx0V2l0aEZvbykgPiBzdGQ6OnRpZShyaHMuc2hvdWxkQ29udGFpblRocmVlRnMsIHJocy5mLCByaHMuc2hvdWxkQmVKZXJyeSwgcmhzLnNob3VsZEJlQnl0ZUJhciwgcmhzLnNob3VsZEJlSW50QmFyLCByaHMuc2hvdWxkQmVMb25nQmFyLCByaHMuc2hvdWxkQ29udGFpblR3b0J5dGVGb29zLCByaHMuc2hvdWxkQ29udGFpblR3b0ludEZvb3MsIHJocy5zaG91bGRDb250YWluVHdvTG9uZ0Zvb3MsIHJocy5zdHJpbmdEZWZhdWx0c1RvRm9vLCByaHMuYnl0ZURlZmF1bHRzVG9Gb3VyLCByaHMuaW50RGVmYXVsdHNUb0ZpdmUsIHJocy5sb25nRGVmYXVsdHNUb05lZ2F0aXZlU2V2ZW4sIHJocy5ib29sZWFuRGVmYXVsdHNUb1RydWUsIHJocy5jaGFyRGVmYXVsdHNUb0MsIHJocy5mbG9hdERlZmF1bHRzVG9QaSwgcmhzLmRvdWJsZVdpdGhEZWZhdWx0LCByaHMuYXJyYXlEZWZhdWx0c1RvMTIzLCByaHMuYXJyYXlEZWZhdWx0c1RvRW1wdHksIHJocy5ib29sRGVmYXVsdCwgcmhzLmJ5dGVEZWZhdWx0LCByaHMuaW50RGVmYXVsdCwgcmhzLmxvbmdEZWZhdWx0LCByaHMuZmxvYXREZWZhdWx0LCByaHMuZG91YmxlRGVmYXVsdCwgcmhzLmNoZWNrRG91YmxlRnJvbUZsb2F0LCByaHMuY2hlY2tTdHJpbmdBcnJheTEsIHJocy5jaGVja1N0cmluZ0FycmF5MiwgcmhzLmludDMyX21pbiwgcmhzLmludDMyX21heCwgcmhzLmludDY0X21heCwgcmhzLmhleEludDMyX25lZ18xLCByaHMuaWJpbmRlciwgcmhzLmludDMyXzEsIHJocy5pbnQ2NF8xLCByaHMuaGV4SW50MzJfcG9zXzEsIHJocy5oZXhJbnQ2NF9wb3NfMSwgcmhzLmNvbnN0X2V4cHJzXzEsIHJocy5jb25zdF9leHByc18yLCByaHMuY29uc3RfZXhwcnNfMywgcmhzLmNvbnN0X2V4cHJzXzQsIHJocy5jb25zdF9leHByc181LCByaHMuY29uc3RfZXhwcnNfNiwgcmhzLmNvbnN0X2V4cHJzXzcsIHJocy5jb25zdF9leHByc184LCByaHMuY29uc3RfZXhwcnNfOSwgcmhzLmNvbnN0X2V4cHJzXzEwLCByaHMuYWRkU3RyaW5nMSwgcmhzLmFkZFN0cmluZzIsIHJocy5zaG91bGRTZXRCaXQwQW5kQml0MiwgcmhzLnUsIHJocy5zaG91bGRCZUNvbnN0UzEsIHJocy5kZWZhdWx0V2l0aEZvbyk7Ci0gIH0KLSAgaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBTdHJ1Y3R1cmVkUGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0ZDo6dGllKHNob3VsZENvbnRhaW5UaHJlZUZzLCBmLCBzaG91bGRCZUplcnJ5LCBzaG91bGRCZUJ5dGVCYXIsIHNob3VsZEJlSW50QmFyLCBzaG91bGRCZUxvbmdCYXIsIHNob3VsZENvbnRhaW5Ud29CeXRlRm9vcywgc2hvdWxkQ29udGFpblR3b0ludEZvb3MsIHNob3VsZENvbnRhaW5Ud29Mb25nRm9vcywgc3RyaW5nRGVmYXVsdHNUb0ZvbywgYnl0ZURlZmF1bHRzVG9Gb3VyLCBpbnREZWZhdWx0c1RvRml2ZSwgbG9uZ0RlZmF1bHRzVG9OZWdhdGl2ZVNldmVuLCBib29sZWFuRGVmYXVsdHNUb1RydWUsIGNoYXJEZWZhdWx0c1RvQywgZmxvYXREZWZhdWx0c1RvUGksIGRvdWJsZVdpdGhEZWZhdWx0LCBhcnJheURlZmF1bHRzVG8xMjMsIGFycmF5RGVmYXVsdHNUb0VtcHR5LCBib29sRGVmYXVsdCwgYnl0ZURlZmF1bHQsIGludERlZmF1bHQsIGxvbmdEZWZhdWx0LCBmbG9hdERlZmF1bHQsIGRvdWJsZURlZmF1bHQsIGNoZWNrRG91YmxlRnJvbUZsb2F0LCBjaGVja1N0cmluZ0FycmF5MSwgY2hlY2tTdHJpbmdBcnJheTIsIGludDMyX21pbiwgaW50MzJfbWF4LCBpbnQ2NF9tYXgsIGhleEludDMyX25lZ18xLCBpYmluZGVyLCBpbnQzMl8xLCBpbnQ2NF8xLCBoZXhJbnQzMl9wb3NfMSwgaGV4SW50NjRfcG9zXzEsIGNvbnN0X2V4cHJzXzEsIGNvbnN0X2V4cHJzXzIsIGNvbnN0X2V4cHJzXzMsIGNvbnN0X2V4cHJzXzQsIGNvbnN0X2V4cHJzXzUsIGNvbnN0X2V4cHJzXzYsIGNvbnN0X2V4cHJzXzcsIGNvbnN0X2V4cHJzXzgsIGNvbnN0X2V4cHJzXzksIGNvbnN0X2V4cHJzXzEwLCBhZGRTdHJpbmcxLCBhZGRTdHJpbmcyLCBzaG91bGRTZXRCaXQwQW5kQml0MiwgdSwgc2hvdWxkQmVDb25zdFMxLCBkZWZhdWx0V2l0aEZvbykgPj0gc3RkOjp0aWUocmhzLnNob3VsZENvbnRhaW5UaHJlZUZzLCByaHMuZiwgcmhzLnNob3VsZEJlSmVycnksIHJocy5zaG91bGRCZUJ5dGVCYXIsIHJocy5zaG91bGRCZUludEJhciwgcmhzLnNob3VsZEJlTG9uZ0JhciwgcmhzLnNob3VsZENvbnRhaW5Ud29CeXRlRm9vcywgcmhzLnNob3VsZENvbnRhaW5Ud29JbnRGb29zLCByaHMuc2hvdWxkQ29udGFpblR3b0xvbmdGb29zLCByaHMuc3RyaW5nRGVmYXVsdHNUb0ZvbywgcmhzLmJ5dGVEZWZhdWx0c1RvRm91ciwgcmhzLmludERlZmF1bHRzVG9GaXZlLCByaHMubG9uZ0RlZmF1bHRzVG9OZWdhdGl2ZVNldmVuLCByaHMuYm9vbGVhbkRlZmF1bHRzVG9UcnVlLCByaHMuY2hhckRlZmF1bHRzVG9DLCByaHMuZmxvYXREZWZhdWx0c1RvUGksIHJocy5kb3VibGVXaXRoRGVmYXVsdCwgcmhzLmFycmF5RGVmYXVsdHNUbzEyMywgcmhzLmFycmF5RGVmYXVsdHNUb0VtcHR5LCByaHMuYm9vbERlZmF1bHQsIHJocy5ieXRlRGVmYXVsdCwgcmhzLmludERlZmF1bHQsIHJocy5sb25nRGVmYXVsdCwgcmhzLmZsb2F0RGVmYXVsdCwgcmhzLmRvdWJsZURlZmF1bHQsIHJocy5jaGVja0RvdWJsZUZyb21GbG9hdCwgcmhzLmNoZWNrU3RyaW5nQXJyYXkxLCByaHMuY2hlY2tTdHJpbmdBcnJheTIsIHJocy5pbnQzMl9taW4sIHJocy5pbnQzMl9tYXgsIHJocy5pbnQ2NF9tYXgsIHJocy5oZXhJbnQzMl9uZWdfMSwgcmhzLmliaW5kZXIsIHJocy5pbnQzMl8xLCByaHMuaW50NjRfMSwgcmhzLmhleEludDMyX3Bvc18xLCByaHMuaGV4SW50NjRfcG9zXzEsIHJocy5jb25zdF9leHByc18xLCByaHMuY29uc3RfZXhwcnNfMiwgcmhzLmNvbnN0X2V4cHJzXzMsIHJocy5jb25zdF9leHByc180LCByaHMuY29uc3RfZXhwcnNfNSwgcmhzLmNvbnN0X2V4cHJzXzYsIHJocy5jb25zdF9leHByc183LCByaHMuY29uc3RfZXhwcnNfOCwgcmhzLmNvbnN0X2V4cHJzXzksIHJocy5jb25zdF9leHByc18xMCwgcmhzLmFkZFN0cmluZzEsIHJocy5hZGRTdHJpbmcyLCByaHMuc2hvdWxkU2V0Qml0MEFuZEJpdDIsIHJocy51LCByaHMuc2hvdWxkQmVDb25zdFMxLCByaHMuZGVmYXVsdFdpdGhGb28pOwotICB9CisgIGNsYXNzIEVtcHR5IDogcHVibGljIDo6YW5kcm9pZDo6UGFyY2VsYWJsZSB7CisgIHB1YmxpYzoKKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEVtcHR5JikgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKCkgIT0gc3RkOjp0aWUoKTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEVtcHR5JikgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKCkgPCBzdGQ6OnRpZSgpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IEVtcHR5JikgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKCkgPD0gc3RkOjp0aWUoKTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBFbXB0eSYpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZSgpID09IHN0ZDo6dGllKCk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPihjb25zdCBFbXB0eSYpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZSgpID4gc3RkOjp0aWUoKTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBFbXB0eSYpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZSgpID49IHN0ZDo6dGllKCk7CisgICAgfQogCisgICAgOjphbmRyb2lkOjpzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBmaW5hbDsKKyAgICA6OmFuZHJvaWQ6OnN0YXR1c190IHdyaXRlVG9QYXJjZWwoOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgZmluYWw7CisgICAgc3RhdGljIGNvbnN0IDo6YW5kcm9pZDo6U3RyaW5nMTYmIGdldFBhcmNlbGFibGVEZXNjcmlwdG9yKCkgeworICAgICAgc3RhdGljIGNvbnN0IDo6YW5kcm9pZDo6U3RhdGljU3RyaW5nMTYgREVTQ0lQVE9SICh1ImFuZHJvaWQuYWlkbC50ZXN0cy5TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5FbXB0eSIpOworICAgICAgcmV0dXJuIERFU0NJUFRPUjsKKyAgICB9CisgICAgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOworICAgICAgb3MgPDwgIkVtcHR5eyI7CisgICAgICBvcyA8PCAifSI7CisgICAgICByZXR1cm4gb3Muc3RyKCk7CisgICAgfQorICB9OyAgLy8gY2xhc3MgRW1wdHkKICAgOjpzdGQ6OnZlY3RvcjxpbnQzMl90PiBzaG91bGRDb250YWluVGhyZWVGczsKLSAgaW50MzJfdCBmID0gaW50MzJfdCgwKTsKKyAgaW50MzJfdCBmID0gMDsKICAgOjpzdGQ6OnN0cmluZyBzaG91bGRCZUplcnJ5OwogICA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCeXRlRW51bSBzaG91bGRCZUJ5dGVCYXIgPSA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCeXRlRW51bSgwKTsKICAgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bSBzaG91bGRCZUludEJhciA9IDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0oMCk7CkBAIC01MiwzNCArNjUsMzYgQEAKICAgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCeXRlRW51bT4gc2hvdWxkQ29udGFpblR3b0J5dGVGb29zOwogICA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0+IHNob3VsZENvbnRhaW5Ud29JbnRGb29zOwogICA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtPiBzaG91bGRDb250YWluVHdvTG9uZ0Zvb3M7Ci0gIDo6YW5kcm9pZDo6U3RyaW5nMTYgc3RyaW5nRGVmYXVsdHNUb0ZvbyA9IDo6YW5kcm9pZDo6U3RyaW5nMTYoOjphbmRyb2lkOjpTdHJpbmcxNigiZm9vIikpOwotICBpbnQ4X3QgYnl0ZURlZmF1bHRzVG9Gb3VyID0gaW50OF90KDQpOwotICBpbnQzMl90IGludERlZmF1bHRzVG9GaXZlID0gaW50MzJfdCg1KTsKLSAgaW50NjRfdCBsb25nRGVmYXVsdHNUb05lZ2F0aXZlU2V2ZW4gPSBpbnQ2NF90KC03TCk7Ci0gIGJvb2wgYm9vbGVhbkRlZmF1bHRzVG9UcnVlID0gYm9vbCh0cnVlKTsKLSAgY2hhcjE2X3QgY2hhckRlZmF1bHRzVG9DID0gY2hhcjE2X3QoJ0MnKTsKLSAgZmxvYXQgZmxvYXREZWZhdWx0c1RvUGkgPSBmbG9hdCgzLjE0MDAwMGYpOwotICBkb3VibGUgZG91YmxlV2l0aERlZmF1bHQgPSBkb3VibGUoLTMxNDAwMDAwMDAwMDAwMDAwMC4wMDAwMDApOwotICA6OnN0ZDo6dmVjdG9yPGludDMyX3Q+IGFycmF5RGVmYXVsdHNUbzEyMyA9IDo6c3RkOjp2ZWN0b3I8aW50MzJfdD4oezEsIDIsIDN9KTsKLSAgOjpzdGQ6OnZlY3RvcjxpbnQzMl90PiBhcnJheURlZmF1bHRzVG9FbXB0eSA9IDo6c3RkOjp2ZWN0b3I8aW50MzJfdD4oe30pOwotICBib29sIGJvb2xEZWZhdWx0ID0gYm9vbChmYWxzZSk7Ci0gIGludDhfdCBieXRlRGVmYXVsdCA9IGludDhfdCgwKTsKLSAgaW50MzJfdCBpbnREZWZhdWx0ID0gaW50MzJfdCgwKTsKLSAgaW50NjRfdCBsb25nRGVmYXVsdCA9IGludDY0X3QoMEwpOwotICBmbG9hdCBmbG9hdERlZmF1bHQgPSBmbG9hdCgwLjAwMDAwMGYpOwotICBkb3VibGUgZG91YmxlRGVmYXVsdCA9IGRvdWJsZSgwLjAwMDAwMCk7Ci0gIGRvdWJsZSBjaGVja0RvdWJsZUZyb21GbG9hdCA9IGRvdWJsZSgzLjE0MDAwMCk7Ci0gIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpTdHJpbmcxNj4gY2hlY2tTdHJpbmdBcnJheTEgPSA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6U3RyaW5nMTY+KHs6OmFuZHJvaWQ6OlN0cmluZzE2KCJhIiksIDo6YW5kcm9pZDo6U3RyaW5nMTYoImIiKX0pOwotICA6OnN0ZDo6dmVjdG9yPDo6c3RkOjpzdHJpbmc+IGNoZWNrU3RyaW5nQXJyYXkyID0gOjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6c3RyaW5nPih7ImEiLCAiYiJ9KTsKLSAgaW50MzJfdCBpbnQzMl9taW4gPSBpbnQzMl90KC0yMTQ3NDgzNjQ4KTsKLSAgaW50MzJfdCBpbnQzMl9tYXggPSBpbnQzMl90KDIxNDc0ODM2NDcpOwotICBpbnQ2NF90IGludDY0X21heCA9IGludDY0X3QoOTIyMzM3MjAzNjg1NDc3NTgwN0wpOwotICBpbnQzMl90IGhleEludDMyX25lZ18xID0gaW50MzJfdCgtMSk7CisgIDo6YW5kcm9pZDo6U3RyaW5nMTYgc3RyaW5nRGVmYXVsdHNUb0ZvbyA9IDo6YW5kcm9pZDo6U3RyaW5nMTYoImZvbyIpOworICBpbnQ4X3QgYnl0ZURlZmF1bHRzVG9Gb3VyID0gNDsKKyAgaW50MzJfdCBpbnREZWZhdWx0c1RvRml2ZSA9IDU7CisgIGludDY0X3QgbG9uZ0RlZmF1bHRzVG9OZWdhdGl2ZVNldmVuID0gLTdMOworICBib29sIGJvb2xlYW5EZWZhdWx0c1RvVHJ1ZSA9IHRydWU7CisgIGNoYXIxNl90IGNoYXJEZWZhdWx0c1RvQyA9ICdDJzsKKyAgZmxvYXQgZmxvYXREZWZhdWx0c1RvUGkgPSAzLjE0MDAwMGY7CisgIGRvdWJsZSBkb3VibGVXaXRoRGVmYXVsdCA9IC0zMTQwMDAwMDAwMDAwMDAwMDAuMDAwMDAwOworICA6OnN0ZDo6dmVjdG9yPGludDMyX3Q+IGFycmF5RGVmYXVsdHNUbzEyMyA9IHsxLCAyLCAzfTsKKyAgOjpzdGQ6OnZlY3RvcjxpbnQzMl90PiBhcnJheURlZmF1bHRzVG9FbXB0eSA9IHt9OworICBib29sIGJvb2xEZWZhdWx0ID0gZmFsc2U7CisgIGludDhfdCBieXRlRGVmYXVsdCA9IDA7CisgIGludDMyX3QgaW50RGVmYXVsdCA9IDA7CisgIGludDY0X3QgbG9uZ0RlZmF1bHQgPSAwTDsKKyAgZmxvYXQgZmxvYXREZWZhdWx0ID0gMC4wMDAwMDBmOworICBkb3VibGUgZG91YmxlRGVmYXVsdCA9IDAuMDAwMDAwOworICBkb3VibGUgY2hlY2tEb3VibGVGcm9tRmxvYXQgPSAzLjE0MDAwMDsKKyAgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OlN0cmluZzE2PiBjaGVja1N0cmluZ0FycmF5MSA9IHs6OmFuZHJvaWQ6OlN0cmluZzE2KCJhIiksIDo6YW5kcm9pZDo6U3RyaW5nMTYoImIiKX07CisgIDo6c3RkOjp2ZWN0b3I8OjpzdGQ6OnN0cmluZz4gY2hlY2tTdHJpbmdBcnJheTIgPSB7ImEiLCAiYiJ9OworICBpbnQzMl90IGludDMyX21pbiA9IC0yMTQ3NDgzNjQ4OworICBpbnQzMl90IGludDMyX21heCA9IDIxNDc0ODM2NDc7CisgIGludDY0X3QgaW50NjRfbWF4ID0gOTIyMzM3MjAzNjg1NDc3NTgwN0w7CisgIGludDMyX3QgaGV4SW50MzJfbmVnXzEgPSAtMTsKICAgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+IGliaW5kZXI7Ci0gIDo6c3RkOjp2ZWN0b3I8aW50MzJfdD4gaW50MzJfMSA9IDo6c3RkOjp2ZWN0b3I8aW50MzJfdD4oezEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDF9KTsKLSAgOjpzdGQ6OnZlY3RvcjxpbnQ2NF90PiBpbnQ2NF8xID0gOjpzdGQ6OnZlY3RvcjxpbnQ2NF90Pih7MUwsIDFMLCAxTCwgMUwsIDFMLCAxTCwgMUwsIDFMLCAxTCwgMUx9KTsKLSAgaW50MzJfdCBoZXhJbnQzMl9wb3NfMSA9IGludDMyX3QoMSk7Ci0gIGludDMyX3QgaGV4SW50NjRfcG9zXzEgPSBpbnQzMl90KDEpOworICA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpTdHJ1Y3R1cmVkUGFyY2VsYWJsZTo6RW1wdHkgZW1wdHk7CisgIDo6c3RkOjp2ZWN0b3I8dWludDhfdD4gaW50OF8xID0gezEsIDEsIDEsIDEsIDF9OworICA6OnN0ZDo6dmVjdG9yPGludDMyX3Q+IGludDMyXzEgPSB7MSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMX07CisgIDo6c3RkOjp2ZWN0b3I8aW50NjRfdD4gaW50NjRfMSA9IHsxTCwgMUwsIDFMLCAxTCwgMUwsIDFMLCAxTCwgMUwsIDFMLCAxTH07CisgIGludDMyX3QgaGV4SW50MzJfcG9zXzEgPSAxOworICBpbnQzMl90IGhleEludDY0X3Bvc18xID0gMTsKICAgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSBjb25zdF9leHByc18xID0gOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSgwKTsKICAgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSBjb25zdF9leHByc18yID0gOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSgwKTsKICAgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSBjb25zdF9leHByc18zID0gOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSgwKTsKQEAgLTkwLDE3ICsxMDUsMzQgQEAKICAgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSBjb25zdF9leHByc184ID0gOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSgwKTsKICAgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSBjb25zdF9leHByc185ID0gOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSgwKTsKICAgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSBjb25zdF9leHByc18xMCA9IDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkNvbnN0YW50RXhwcmVzc2lvbkVudW0oMCk7Ci0gIDo6c3RkOjpzdHJpbmcgYWRkU3RyaW5nMSA9IDo6c3RkOjpzdHJpbmcoImhlbGxvIHdvcmxkISIpOwotICA6OnN0ZDo6c3RyaW5nIGFkZFN0cmluZzIgPSA6OnN0ZDo6c3RyaW5nKCJUaGUgcXVpY2sgYnJvd24gZm94IGp1bXBzIG92ZXIgdGhlIGxhenkgZG9nLiIpOwotICBpbnQzMl90IHNob3VsZFNldEJpdDBBbmRCaXQyID0gaW50MzJfdCgwKTsKKyAgOjpzdGQ6OnN0cmluZyBhZGRTdHJpbmcxID0gImhlbGxvIHdvcmxkISI7CisgIDo6c3RkOjpzdHJpbmcgYWRkU3RyaW5nMiA9ICJUaGUgcXVpY2sgYnJvd24gZm94IGp1bXBzIG92ZXIgdGhlIGxhenkgZG9nLiI7CisgIGludDMyX3Qgc2hvdWxkU2V0Qml0MEFuZEJpdDIgPSAwOwogICA6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6VW5pb24+IHU7CiAgIDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpVbmlvbj4gc2hvdWxkQmVDb25zdFMxOwotICA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtIGRlZmF1bHRXaXRoRm9vID0gOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bSg6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtOjpGT08pOwotICBlbnVtICA6IGludDMyX3QgewotICAgIEJJVDAgPSAxLAotICAgIEJJVDEgPSAyLAotICAgIEJJVDIgPSA0LAotICB9OworICA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtIGRlZmF1bHRXaXRoRm9vID0gOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bTo6Rk9POworICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFN0cnVjdHVyZWRQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoc2hvdWxkQ29udGFpblRocmVlRnMsIGYsIHNob3VsZEJlSmVycnksIHNob3VsZEJlQnl0ZUJhciwgc2hvdWxkQmVJbnRCYXIsIHNob3VsZEJlTG9uZ0Jhciwgc2hvdWxkQ29udGFpblR3b0J5dGVGb29zLCBzaG91bGRDb250YWluVHdvSW50Rm9vcywgc2hvdWxkQ29udGFpblR3b0xvbmdGb29zLCBzdHJpbmdEZWZhdWx0c1RvRm9vLCBieXRlRGVmYXVsdHNUb0ZvdXIsIGludERlZmF1bHRzVG9GaXZlLCBsb25nRGVmYXVsdHNUb05lZ2F0aXZlU2V2ZW4sIGJvb2xlYW5EZWZhdWx0c1RvVHJ1ZSwgY2hhckRlZmF1bHRzVG9DLCBmbG9hdERlZmF1bHRzVG9QaSwgZG91YmxlV2l0aERlZmF1bHQsIGFycmF5RGVmYXVsdHNUbzEyMywgYXJyYXlEZWZhdWx0c1RvRW1wdHksIGJvb2xEZWZhdWx0LCBieXRlRGVmYXVsdCwgaW50RGVmYXVsdCwgbG9uZ0RlZmF1bHQsIGZsb2F0RGVmYXVsdCwgZG91YmxlRGVmYXVsdCwgY2hlY2tEb3VibGVGcm9tRmxvYXQsIGNoZWNrU3RyaW5nQXJyYXkxLCBjaGVja1N0cmluZ0FycmF5MiwgaW50MzJfbWluLCBpbnQzMl9tYXgsIGludDY0X21heCwgaGV4SW50MzJfbmVnXzEsIGliaW5kZXIsIGVtcHR5LCBpbnQ4XzEsIGludDMyXzEsIGludDY0XzEsIGhleEludDMyX3Bvc18xLCBoZXhJbnQ2NF9wb3NfMSwgY29uc3RfZXhwcnNfMSwgY29uc3RfZXhwcnNfMiwgY29uc3RfZXhwcnNfMywgY29uc3RfZXhwcnNfNCwgY29uc3RfZXhwcnNfNSwgY29uc3RfZXhwcnNfNiwgY29uc3RfZXhwcnNfNywgY29uc3RfZXhwcnNfOCwgY29uc3RfZXhwcnNfOSwgY29uc3RfZXhwcnNfMTAsIGFkZFN0cmluZzEsIGFkZFN0cmluZzIsIHNob3VsZFNldEJpdDBBbmRCaXQyLCB1LCBzaG91bGRCZUNvbnN0UzEsIGRlZmF1bHRXaXRoRm9vKSAhPSBzdGQ6OnRpZShyaHMuc2hvdWxkQ29udGFpblRocmVlRnMsIHJocy5mLCByaHMuc2hvdWxkQmVKZXJyeSwgcmhzLnNob3VsZEJlQnl0ZUJhciwgcmhzLnNob3VsZEJlSW50QmFyLCByaHMuc2hvdWxkQmVMb25nQmFyLCByaHMuc2hvdWxkQ29udGFpblR3b0J5dGVGb29zLCByaHMuc2hvdWxkQ29udGFpblR3b0ludEZvb3MsIHJocy5zaG91bGRDb250YWluVHdvTG9uZ0Zvb3MsIHJocy5zdHJpbmdEZWZhdWx0c1RvRm9vLCByaHMuYnl0ZURlZmF1bHRzVG9Gb3VyLCByaHMuaW50RGVmYXVsdHNUb0ZpdmUsIHJocy5sb25nRGVmYXVsdHNUb05lZ2F0aXZlU2V2ZW4sIHJocy5ib29sZWFuRGVmYXVsdHNUb1RydWUsIHJocy5jaGFyRGVmYXVsdHNUb0MsIHJocy5mbG9hdERlZmF1bHRzVG9QaSwgcmhzLmRvdWJsZVdpdGhEZWZhdWx0LCByaHMuYXJyYXlEZWZhdWx0c1RvMTIzLCByaHMuYXJyYXlEZWZhdWx0c1RvRW1wdHksIHJocy5ib29sRGVmYXVsdCwgcmhzLmJ5dGVEZWZhdWx0LCByaHMuaW50RGVmYXVsdCwgcmhzLmxvbmdEZWZhdWx0LCByaHMuZmxvYXREZWZhdWx0LCByaHMuZG91YmxlRGVmYXVsdCwgcmhzLmNoZWNrRG91YmxlRnJvbUZsb2F0LCByaHMuY2hlY2tTdHJpbmdBcnJheTEsIHJocy5jaGVja1N0cmluZ0FycmF5MiwgcmhzLmludDMyX21pbiwgcmhzLmludDMyX21heCwgcmhzLmludDY0X21heCwgcmhzLmhleEludDMyX25lZ18xLCByaHMuaWJpbmRlciwgcmhzLmVtcHR5LCByaHMuaW50OF8xLCByaHMuaW50MzJfMSwgcmhzLmludDY0XzEsIHJocy5oZXhJbnQzMl9wb3NfMSwgcmhzLmhleEludDY0X3Bvc18xLCByaHMuY29uc3RfZXhwcnNfMSwgcmhzLmNvbnN0X2V4cHJzXzIsIHJocy5jb25zdF9leHByc18zLCByaHMuY29uc3RfZXhwcnNfNCwgcmhzLmNvbnN0X2V4cHJzXzUsIHJocy5jb25zdF9leHByc182LCByaHMuY29uc3RfZXhwcnNfNywgcmhzLmNvbnN0X2V4cHJzXzgsIHJocy5jb25zdF9leHByc185LCByaHMuY29uc3RfZXhwcnNfMTAsIHJocy5hZGRTdHJpbmcxLCByaHMuYWRkU3RyaW5nMiwgcmhzLnNob3VsZFNldEJpdDBBbmRCaXQyLCByaHMudSwgcmhzLnNob3VsZEJlQ29uc3RTMSwgcmhzLmRlZmF1bHRXaXRoRm9vKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgU3RydWN0dXJlZFBhcmNlbGFibGUmIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZShzaG91bGRDb250YWluVGhyZWVGcywgZiwgc2hvdWxkQmVKZXJyeSwgc2hvdWxkQmVCeXRlQmFyLCBzaG91bGRCZUludEJhciwgc2hvdWxkQmVMb25nQmFyLCBzaG91bGRDb250YWluVHdvQnl0ZUZvb3MsIHNob3VsZENvbnRhaW5Ud29JbnRGb29zLCBzaG91bGRDb250YWluVHdvTG9uZ0Zvb3MsIHN0cmluZ0RlZmF1bHRzVG9Gb28sIGJ5dGVEZWZhdWx0c1RvRm91ciwgaW50RGVmYXVsdHNUb0ZpdmUsIGxvbmdEZWZhdWx0c1RvTmVnYXRpdmVTZXZlbiwgYm9vbGVhbkRlZmF1bHRzVG9UcnVlLCBjaGFyRGVmYXVsdHNUb0MsIGZsb2F0RGVmYXVsdHNUb1BpLCBkb3VibGVXaXRoRGVmYXVsdCwgYXJyYXlEZWZhdWx0c1RvMTIzLCBhcnJheURlZmF1bHRzVG9FbXB0eSwgYm9vbERlZmF1bHQsIGJ5dGVEZWZhdWx0LCBpbnREZWZhdWx0LCBsb25nRGVmYXVsdCwgZmxvYXREZWZhdWx0LCBkb3VibGVEZWZhdWx0LCBjaGVja0RvdWJsZUZyb21GbG9hdCwgY2hlY2tTdHJpbmdBcnJheTEsIGNoZWNrU3RyaW5nQXJyYXkyLCBpbnQzMl9taW4sIGludDMyX21heCwgaW50NjRfbWF4LCBoZXhJbnQzMl9uZWdfMSwgaWJpbmRlciwgZW1wdHksIGludDhfMSwgaW50MzJfMSwgaW50NjRfMSwgaGV4SW50MzJfcG9zXzEsIGhleEludDY0X3Bvc18xLCBjb25zdF9leHByc18xLCBjb25zdF9leHByc18yLCBjb25zdF9leHByc18zLCBjb25zdF9leHByc180LCBjb25zdF9leHByc181LCBjb25zdF9leHByc182LCBjb25zdF9leHByc183LCBjb25zdF9leHByc184LCBjb25zdF9leHByc185LCBjb25zdF9leHByc18xMCwgYWRkU3RyaW5nMSwgYWRkU3RyaW5nMiwgc2hvdWxkU2V0Qml0MEFuZEJpdDIsIHUsIHNob3VsZEJlQ29uc3RTMSwgZGVmYXVsdFdpdGhGb28pIDwgc3RkOjp0aWUocmhzLnNob3VsZENvbnRhaW5UaHJlZUZzLCByaHMuZiwgcmhzLnNob3VsZEJlSmVycnksIHJocy5zaG91bGRCZUJ5dGVCYXIsIHJocy5zaG91bGRCZUludEJhciwgcmhzLnNob3VsZEJlTG9uZ0JhciwgcmhzLnNob3VsZENvbnRhaW5Ud29CeXRlRm9vcywgcmhzLnNob3VsZENvbnRhaW5Ud29JbnRGb29zLCByaHMuc2hvdWxkQ29udGFpblR3b0xvbmdGb29zLCByaHMuc3RyaW5nRGVmYXVsdHNUb0ZvbywgcmhzLmJ5dGVEZWZhdWx0c1RvRm91ciwgcmhzLmludERlZmF1bHRzVG9GaXZlLCByaHMubG9uZ0RlZmF1bHRzVG9OZWdhdGl2ZVNldmVuLCByaHMuYm9vbGVhbkRlZmF1bHRzVG9UcnVlLCByaHMuY2hhckRlZmF1bHRzVG9DLCByaHMuZmxvYXREZWZhdWx0c1RvUGksIHJocy5kb3VibGVXaXRoRGVmYXVsdCwgcmhzLmFycmF5RGVmYXVsdHNUbzEyMywgcmhzLmFycmF5RGVmYXVsdHNUb0VtcHR5LCByaHMuYm9vbERlZmF1bHQsIHJocy5ieXRlRGVmYXVsdCwgcmhzLmludERlZmF1bHQsIHJocy5sb25nRGVmYXVsdCwgcmhzLmZsb2F0RGVmYXVsdCwgcmhzLmRvdWJsZURlZmF1bHQsIHJocy5jaGVja0RvdWJsZUZyb21GbG9hdCwgcmhzLmNoZWNrU3RyaW5nQXJyYXkxLCByaHMuY2hlY2tTdHJpbmdBcnJheTIsIHJocy5pbnQzMl9taW4sIHJocy5pbnQzMl9tYXgsIHJocy5pbnQ2NF9tYXgsIHJocy5oZXhJbnQzMl9uZWdfMSwgcmhzLmliaW5kZXIsIHJocy5lbXB0eSwgcmhzLmludDhfMSwgcmhzLmludDMyXzEsIHJocy5pbnQ2NF8xLCByaHMuaGV4SW50MzJfcG9zXzEsIHJocy5oZXhJbnQ2NF9wb3NfMSwgcmhzLmNvbnN0X2V4cHJzXzEsIHJocy5jb25zdF9leHByc18yLCByaHMuY29uc3RfZXhwcnNfMywgcmhzLmNvbnN0X2V4cHJzXzQsIHJocy5jb25zdF9leHByc181LCByaHMuY29uc3RfZXhwcnNfNiwgcmhzLmNvbnN0X2V4cHJzXzcsIHJocy5jb25zdF9leHByc184LCByaHMuY29uc3RfZXhwcnNfOSwgcmhzLmNvbnN0X2V4cHJzXzEwLCByaHMuYWRkU3RyaW5nMSwgcmhzLmFkZFN0cmluZzIsIHJocy5zaG91bGRTZXRCaXQwQW5kQml0MiwgcmhzLnUsIHJocy5zaG91bGRCZUNvbnN0UzEsIHJocy5kZWZhdWx0V2l0aEZvbyk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBTdHJ1Y3R1cmVkUGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKHNob3VsZENvbnRhaW5UaHJlZUZzLCBmLCBzaG91bGRCZUplcnJ5LCBzaG91bGRCZUJ5dGVCYXIsIHNob3VsZEJlSW50QmFyLCBzaG91bGRCZUxvbmdCYXIsIHNob3VsZENvbnRhaW5Ud29CeXRlRm9vcywgc2hvdWxkQ29udGFpblR3b0ludEZvb3MsIHNob3VsZENvbnRhaW5Ud29Mb25nRm9vcywgc3RyaW5nRGVmYXVsdHNUb0ZvbywgYnl0ZURlZmF1bHRzVG9Gb3VyLCBpbnREZWZhdWx0c1RvRml2ZSwgbG9uZ0RlZmF1bHRzVG9OZWdhdGl2ZVNldmVuLCBib29sZWFuRGVmYXVsdHNUb1RydWUsIGNoYXJEZWZhdWx0c1RvQywgZmxvYXREZWZhdWx0c1RvUGksIGRvdWJsZVdpdGhEZWZhdWx0LCBhcnJheURlZmF1bHRzVG8xMjMsIGFycmF5RGVmYXVsdHNUb0VtcHR5LCBib29sRGVmYXVsdCwgYnl0ZURlZmF1bHQsIGludERlZmF1bHQsIGxvbmdEZWZhdWx0LCBmbG9hdERlZmF1bHQsIGRvdWJsZURlZmF1bHQsIGNoZWNrRG91YmxlRnJvbUZsb2F0LCBjaGVja1N0cmluZ0FycmF5MSwgY2hlY2tTdHJpbmdBcnJheTIsIGludDMyX21pbiwgaW50MzJfbWF4LCBpbnQ2NF9tYXgsIGhleEludDMyX25lZ18xLCBpYmluZGVyLCBlbXB0eSwgaW50OF8xLCBpbnQzMl8xLCBpbnQ2NF8xLCBoZXhJbnQzMl9wb3NfMSwgaGV4SW50NjRfcG9zXzEsIGNvbnN0X2V4cHJzXzEsIGNvbnN0X2V4cHJzXzIsIGNvbnN0X2V4cHJzXzMsIGNvbnN0X2V4cHJzXzQsIGNvbnN0X2V4cHJzXzUsIGNvbnN0X2V4cHJzXzYsIGNvbnN0X2V4cHJzXzcsIGNvbnN0X2V4cHJzXzgsIGNvbnN0X2V4cHJzXzksIGNvbnN0X2V4cHJzXzEwLCBhZGRTdHJpbmcxLCBhZGRTdHJpbmcyLCBzaG91bGRTZXRCaXQwQW5kQml0MiwgdSwgc2hvdWxkQmVDb25zdFMxLCBkZWZhdWx0V2l0aEZvbykgPD0gc3RkOjp0aWUocmhzLnNob3VsZENvbnRhaW5UaHJlZUZzLCByaHMuZiwgcmhzLnNob3VsZEJlSmVycnksIHJocy5zaG91bGRCZUJ5dGVCYXIsIHJocy5zaG91bGRCZUludEJhciwgcmhzLnNob3VsZEJlTG9uZ0JhciwgcmhzLnNob3VsZENvbnRhaW5Ud29CeXRlRm9vcywgcmhzLnNob3VsZENvbnRhaW5Ud29JbnRGb29zLCByaHMuc2hvdWxkQ29udGFpblR3b0xvbmdGb29zLCByaHMuc3RyaW5nRGVmYXVsdHNUb0ZvbywgcmhzLmJ5dGVEZWZhdWx0c1RvRm91ciwgcmhzLmludERlZmF1bHRzVG9GaXZlLCByaHMubG9uZ0RlZmF1bHRzVG9OZWdhdGl2ZVNldmVuLCByaHMuYm9vbGVhbkRlZmF1bHRzVG9UcnVlLCByaHMuY2hhckRlZmF1bHRzVG9DLCByaHMuZmxvYXREZWZhdWx0c1RvUGksIHJocy5kb3VibGVXaXRoRGVmYXVsdCwgcmhzLmFycmF5RGVmYXVsdHNUbzEyMywgcmhzLmFycmF5RGVmYXVsdHNUb0VtcHR5LCByaHMuYm9vbERlZmF1bHQsIHJocy5ieXRlRGVmYXVsdCwgcmhzLmludERlZmF1bHQsIHJocy5sb25nRGVmYXVsdCwgcmhzLmZsb2F0RGVmYXVsdCwgcmhzLmRvdWJsZURlZmF1bHQsIHJocy5jaGVja0RvdWJsZUZyb21GbG9hdCwgcmhzLmNoZWNrU3RyaW5nQXJyYXkxLCByaHMuY2hlY2tTdHJpbmdBcnJheTIsIHJocy5pbnQzMl9taW4sIHJocy5pbnQzMl9tYXgsIHJocy5pbnQ2NF9tYXgsIHJocy5oZXhJbnQzMl9uZWdfMSwgcmhzLmliaW5kZXIsIHJocy5lbXB0eSwgcmhzLmludDhfMSwgcmhzLmludDMyXzEsIHJocy5pbnQ2NF8xLCByaHMuaGV4SW50MzJfcG9zXzEsIHJocy5oZXhJbnQ2NF9wb3NfMSwgcmhzLmNvbnN0X2V4cHJzXzEsIHJocy5jb25zdF9leHByc18yLCByaHMuY29uc3RfZXhwcnNfMywgcmhzLmNvbnN0X2V4cHJzXzQsIHJocy5jb25zdF9leHByc181LCByaHMuY29uc3RfZXhwcnNfNiwgcmhzLmNvbnN0X2V4cHJzXzcsIHJocy5jb25zdF9leHByc184LCByaHMuY29uc3RfZXhwcnNfOSwgcmhzLmNvbnN0X2V4cHJzXzEwLCByaHMuYWRkU3RyaW5nMSwgcmhzLmFkZFN0cmluZzIsIHJocy5zaG91bGRTZXRCaXQwQW5kQml0MiwgcmhzLnUsIHJocy5zaG91bGRCZUNvbnN0UzEsIHJocy5kZWZhdWx0V2l0aEZvbyk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBTdHJ1Y3R1cmVkUGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKHNob3VsZENvbnRhaW5UaHJlZUZzLCBmLCBzaG91bGRCZUplcnJ5LCBzaG91bGRCZUJ5dGVCYXIsIHNob3VsZEJlSW50QmFyLCBzaG91bGRCZUxvbmdCYXIsIHNob3VsZENvbnRhaW5Ud29CeXRlRm9vcywgc2hvdWxkQ29udGFpblR3b0ludEZvb3MsIHNob3VsZENvbnRhaW5Ud29Mb25nRm9vcywgc3RyaW5nRGVmYXVsdHNUb0ZvbywgYnl0ZURlZmF1bHRzVG9Gb3VyLCBpbnREZWZhdWx0c1RvRml2ZSwgbG9uZ0RlZmF1bHRzVG9OZWdhdGl2ZVNldmVuLCBib29sZWFuRGVmYXVsdHNUb1RydWUsIGNoYXJEZWZhdWx0c1RvQywgZmxvYXREZWZhdWx0c1RvUGksIGRvdWJsZVdpdGhEZWZhdWx0LCBhcnJheURlZmF1bHRzVG8xMjMsIGFycmF5RGVmYXVsdHNUb0VtcHR5LCBib29sRGVmYXVsdCwgYnl0ZURlZmF1bHQsIGludERlZmF1bHQsIGxvbmdEZWZhdWx0LCBmbG9hdERlZmF1bHQsIGRvdWJsZURlZmF1bHQsIGNoZWNrRG91YmxlRnJvbUZsb2F0LCBjaGVja1N0cmluZ0FycmF5MSwgY2hlY2tTdHJpbmdBcnJheTIsIGludDMyX21pbiwgaW50MzJfbWF4LCBpbnQ2NF9tYXgsIGhleEludDMyX25lZ18xLCBpYmluZGVyLCBlbXB0eSwgaW50OF8xLCBpbnQzMl8xLCBpbnQ2NF8xLCBoZXhJbnQzMl9wb3NfMSwgaGV4SW50NjRfcG9zXzEsIGNvbnN0X2V4cHJzXzEsIGNvbnN0X2V4cHJzXzIsIGNvbnN0X2V4cHJzXzMsIGNvbnN0X2V4cHJzXzQsIGNvbnN0X2V4cHJzXzUsIGNvbnN0X2V4cHJzXzYsIGNvbnN0X2V4cHJzXzcsIGNvbnN0X2V4cHJzXzgsIGNvbnN0X2V4cHJzXzksIGNvbnN0X2V4cHJzXzEwLCBhZGRTdHJpbmcxLCBhZGRTdHJpbmcyLCBzaG91bGRTZXRCaXQwQW5kQml0MiwgdSwgc2hvdWxkQmVDb25zdFMxLCBkZWZhdWx0V2l0aEZvbykgPT0gc3RkOjp0aWUocmhzLnNob3VsZENvbnRhaW5UaHJlZUZzLCByaHMuZiwgcmhzLnNob3VsZEJlSmVycnksIHJocy5zaG91bGRCZUJ5dGVCYXIsIHJocy5zaG91bGRCZUludEJhciwgcmhzLnNob3VsZEJlTG9uZ0JhciwgcmhzLnNob3VsZENvbnRhaW5Ud29CeXRlRm9vcywgcmhzLnNob3VsZENvbnRhaW5Ud29JbnRGb29zLCByaHMuc2hvdWxkQ29udGFpblR3b0xvbmdGb29zLCByaHMuc3RyaW5nRGVmYXVsdHNUb0ZvbywgcmhzLmJ5dGVEZWZhdWx0c1RvRm91ciwgcmhzLmludERlZmF1bHRzVG9GaXZlLCByaHMubG9uZ0RlZmF1bHRzVG9OZWdhdGl2ZVNldmVuLCByaHMuYm9vbGVhbkRlZmF1bHRzVG9UcnVlLCByaHMuY2hhckRlZmF1bHRzVG9DLCByaHMuZmxvYXREZWZhdWx0c1RvUGksIHJocy5kb3VibGVXaXRoRGVmYXVsdCwgcmhzLmFycmF5RGVmYXVsdHNUbzEyMywgcmhzLmFycmF5RGVmYXVsdHNUb0VtcHR5LCByaHMuYm9vbERlZmF1bHQsIHJocy5ieXRlRGVmYXVsdCwgcmhzLmludERlZmF1bHQsIHJocy5sb25nRGVmYXVsdCwgcmhzLmZsb2F0RGVmYXVsdCwgcmhzLmRvdWJsZURlZmF1bHQsIHJocy5jaGVja0RvdWJsZUZyb21GbG9hdCwgcmhzLmNoZWNrU3RyaW5nQXJyYXkxLCByaHMuY2hlY2tTdHJpbmdBcnJheTIsIHJocy5pbnQzMl9taW4sIHJocy5pbnQzMl9tYXgsIHJocy5pbnQ2NF9tYXgsIHJocy5oZXhJbnQzMl9uZWdfMSwgcmhzLmliaW5kZXIsIHJocy5lbXB0eSwgcmhzLmludDhfMSwgcmhzLmludDMyXzEsIHJocy5pbnQ2NF8xLCByaHMuaGV4SW50MzJfcG9zXzEsIHJocy5oZXhJbnQ2NF9wb3NfMSwgcmhzLmNvbnN0X2V4cHJzXzEsIHJocy5jb25zdF9leHByc18yLCByaHMuY29uc3RfZXhwcnNfMywgcmhzLmNvbnN0X2V4cHJzXzQsIHJocy5jb25zdF9leHByc181LCByaHMuY29uc3RfZXhwcnNfNiwgcmhzLmNvbnN0X2V4cHJzXzcsIHJocy5jb25zdF9leHByc184LCByaHMuY29uc3RfZXhwcnNfOSwgcmhzLmNvbnN0X2V4cHJzXzEwLCByaHMuYWRkU3RyaW5nMSwgcmhzLmFkZFN0cmluZzIsIHJocy5zaG91bGRTZXRCaXQwQW5kQml0MiwgcmhzLnUsIHJocy5zaG91bGRCZUNvbnN0UzEsIHJocy5kZWZhdWx0V2l0aEZvbyk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IFN0cnVjdHVyZWRQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoc2hvdWxkQ29udGFpblRocmVlRnMsIGYsIHNob3VsZEJlSmVycnksIHNob3VsZEJlQnl0ZUJhciwgc2hvdWxkQmVJbnRCYXIsIHNob3VsZEJlTG9uZ0Jhciwgc2hvdWxkQ29udGFpblR3b0J5dGVGb29zLCBzaG91bGRDb250YWluVHdvSW50Rm9vcywgc2hvdWxkQ29udGFpblR3b0xvbmdGb29zLCBzdHJpbmdEZWZhdWx0c1RvRm9vLCBieXRlRGVmYXVsdHNUb0ZvdXIsIGludERlZmF1bHRzVG9GaXZlLCBsb25nRGVmYXVsdHNUb05lZ2F0aXZlU2V2ZW4sIGJvb2xlYW5EZWZhdWx0c1RvVHJ1ZSwgY2hhckRlZmF1bHRzVG9DLCBmbG9hdERlZmF1bHRzVG9QaSwgZG91YmxlV2l0aERlZmF1bHQsIGFycmF5RGVmYXVsdHNUbzEyMywgYXJyYXlEZWZhdWx0c1RvRW1wdHksIGJvb2xEZWZhdWx0LCBieXRlRGVmYXVsdCwgaW50RGVmYXVsdCwgbG9uZ0RlZmF1bHQsIGZsb2F0RGVmYXVsdCwgZG91YmxlRGVmYXVsdCwgY2hlY2tEb3VibGVGcm9tRmxvYXQsIGNoZWNrU3RyaW5nQXJyYXkxLCBjaGVja1N0cmluZ0FycmF5MiwgaW50MzJfbWluLCBpbnQzMl9tYXgsIGludDY0X21heCwgaGV4SW50MzJfbmVnXzEsIGliaW5kZXIsIGVtcHR5LCBpbnQ4XzEsIGludDMyXzEsIGludDY0XzEsIGhleEludDMyX3Bvc18xLCBoZXhJbnQ2NF9wb3NfMSwgY29uc3RfZXhwcnNfMSwgY29uc3RfZXhwcnNfMiwgY29uc3RfZXhwcnNfMywgY29uc3RfZXhwcnNfNCwgY29uc3RfZXhwcnNfNSwgY29uc3RfZXhwcnNfNiwgY29uc3RfZXhwcnNfNywgY29uc3RfZXhwcnNfOCwgY29uc3RfZXhwcnNfOSwgY29uc3RfZXhwcnNfMTAsIGFkZFN0cmluZzEsIGFkZFN0cmluZzIsIHNob3VsZFNldEJpdDBBbmRCaXQyLCB1LCBzaG91bGRCZUNvbnN0UzEsIGRlZmF1bHRXaXRoRm9vKSA+IHN0ZDo6dGllKHJocy5zaG91bGRDb250YWluVGhyZWVGcywgcmhzLmYsIHJocy5zaG91bGRCZUplcnJ5LCByaHMuc2hvdWxkQmVCeXRlQmFyLCByaHMuc2hvdWxkQmVJbnRCYXIsIHJocy5zaG91bGRCZUxvbmdCYXIsIHJocy5zaG91bGRDb250YWluVHdvQnl0ZUZvb3MsIHJocy5zaG91bGRDb250YWluVHdvSW50Rm9vcywgcmhzLnNob3VsZENvbnRhaW5Ud29Mb25nRm9vcywgcmhzLnN0cmluZ0RlZmF1bHRzVG9Gb28sIHJocy5ieXRlRGVmYXVsdHNUb0ZvdXIsIHJocy5pbnREZWZhdWx0c1RvRml2ZSwgcmhzLmxvbmdEZWZhdWx0c1RvTmVnYXRpdmVTZXZlbiwgcmhzLmJvb2xlYW5EZWZhdWx0c1RvVHJ1ZSwgcmhzLmNoYXJEZWZhdWx0c1RvQywgcmhzLmZsb2F0RGVmYXVsdHNUb1BpLCByaHMuZG91YmxlV2l0aERlZmF1bHQsIHJocy5hcnJheURlZmF1bHRzVG8xMjMsIHJocy5hcnJheURlZmF1bHRzVG9FbXB0eSwgcmhzLmJvb2xEZWZhdWx0LCByaHMuYnl0ZURlZmF1bHQsIHJocy5pbnREZWZhdWx0LCByaHMubG9uZ0RlZmF1bHQsIHJocy5mbG9hdERlZmF1bHQsIHJocy5kb3VibGVEZWZhdWx0LCByaHMuY2hlY2tEb3VibGVGcm9tRmxvYXQsIHJocy5jaGVja1N0cmluZ0FycmF5MSwgcmhzLmNoZWNrU3RyaW5nQXJyYXkyLCByaHMuaW50MzJfbWluLCByaHMuaW50MzJfbWF4LCByaHMuaW50NjRfbWF4LCByaHMuaGV4SW50MzJfbmVnXzEsIHJocy5pYmluZGVyLCByaHMuZW1wdHksIHJocy5pbnQ4XzEsIHJocy5pbnQzMl8xLCByaHMuaW50NjRfMSwgcmhzLmhleEludDMyX3Bvc18xLCByaHMuaGV4SW50NjRfcG9zXzEsIHJocy5jb25zdF9leHByc18xLCByaHMuY29uc3RfZXhwcnNfMiwgcmhzLmNvbnN0X2V4cHJzXzMsIHJocy5jb25zdF9leHByc180LCByaHMuY29uc3RfZXhwcnNfNSwgcmhzLmNvbnN0X2V4cHJzXzYsIHJocy5jb25zdF9leHByc183LCByaHMuY29uc3RfZXhwcnNfOCwgcmhzLmNvbnN0X2V4cHJzXzksIHJocy5jb25zdF9leHByc18xMCwgcmhzLmFkZFN0cmluZzEsIHJocy5hZGRTdHJpbmcyLCByaHMuc2hvdWxkU2V0Qml0MEFuZEJpdDIsIHJocy51LCByaHMuc2hvdWxkQmVDb25zdFMxLCByaHMuZGVmYXVsdFdpdGhGb28pOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgU3RydWN0dXJlZFBhcmNlbGFibGUmIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZShzaG91bGRDb250YWluVGhyZWVGcywgZiwgc2hvdWxkQmVKZXJyeSwgc2hvdWxkQmVCeXRlQmFyLCBzaG91bGRCZUludEJhciwgc2hvdWxkQmVMb25nQmFyLCBzaG91bGRDb250YWluVHdvQnl0ZUZvb3MsIHNob3VsZENvbnRhaW5Ud29JbnRGb29zLCBzaG91bGRDb250YWluVHdvTG9uZ0Zvb3MsIHN0cmluZ0RlZmF1bHRzVG9Gb28sIGJ5dGVEZWZhdWx0c1RvRm91ciwgaW50RGVmYXVsdHNUb0ZpdmUsIGxvbmdEZWZhdWx0c1RvTmVnYXRpdmVTZXZlbiwgYm9vbGVhbkRlZmF1bHRzVG9UcnVlLCBjaGFyRGVmYXVsdHNUb0MsIGZsb2F0RGVmYXVsdHNUb1BpLCBkb3VibGVXaXRoRGVmYXVsdCwgYXJyYXlEZWZhdWx0c1RvMTIzLCBhcnJheURlZmF1bHRzVG9FbXB0eSwgYm9vbERlZmF1bHQsIGJ5dGVEZWZhdWx0LCBpbnREZWZhdWx0LCBsb25nRGVmYXVsdCwgZmxvYXREZWZhdWx0LCBkb3VibGVEZWZhdWx0LCBjaGVja0RvdWJsZUZyb21GbG9hdCwgY2hlY2tTdHJpbmdBcnJheTEsIGNoZWNrU3RyaW5nQXJyYXkyLCBpbnQzMl9taW4sIGludDMyX21heCwgaW50NjRfbWF4LCBoZXhJbnQzMl9uZWdfMSwgaWJpbmRlciwgZW1wdHksIGludDhfMSwgaW50MzJfMSwgaW50NjRfMSwgaGV4SW50MzJfcG9zXzEsIGhleEludDY0X3Bvc18xLCBjb25zdF9leHByc18xLCBjb25zdF9leHByc18yLCBjb25zdF9leHByc18zLCBjb25zdF9leHByc180LCBjb25zdF9leHByc181LCBjb25zdF9leHByc182LCBjb25zdF9leHByc183LCBjb25zdF9leHByc184LCBjb25zdF9leHByc185LCBjb25zdF9leHByc18xMCwgYWRkU3RyaW5nMSwgYWRkU3RyaW5nMiwgc2hvdWxkU2V0Qml0MEFuZEJpdDIsIHUsIHNob3VsZEJlQ29uc3RTMSwgZGVmYXVsdFdpdGhGb28pID49IHN0ZDo6dGllKHJocy5zaG91bGRDb250YWluVGhyZWVGcywgcmhzLmYsIHJocy5zaG91bGRCZUplcnJ5LCByaHMuc2hvdWxkQmVCeXRlQmFyLCByaHMuc2hvdWxkQmVJbnRCYXIsIHJocy5zaG91bGRCZUxvbmdCYXIsIHJocy5zaG91bGRDb250YWluVHdvQnl0ZUZvb3MsIHJocy5zaG91bGRDb250YWluVHdvSW50Rm9vcywgcmhzLnNob3VsZENvbnRhaW5Ud29Mb25nRm9vcywgcmhzLnN0cmluZ0RlZmF1bHRzVG9Gb28sIHJocy5ieXRlRGVmYXVsdHNUb0ZvdXIsIHJocy5pbnREZWZhdWx0c1RvRml2ZSwgcmhzLmxvbmdEZWZhdWx0c1RvTmVnYXRpdmVTZXZlbiwgcmhzLmJvb2xlYW5EZWZhdWx0c1RvVHJ1ZSwgcmhzLmNoYXJEZWZhdWx0c1RvQywgcmhzLmZsb2F0RGVmYXVsdHNUb1BpLCByaHMuZG91YmxlV2l0aERlZmF1bHQsIHJocy5hcnJheURlZmF1bHRzVG8xMjMsIHJocy5hcnJheURlZmF1bHRzVG9FbXB0eSwgcmhzLmJvb2xEZWZhdWx0LCByaHMuYnl0ZURlZmF1bHQsIHJocy5pbnREZWZhdWx0LCByaHMubG9uZ0RlZmF1bHQsIHJocy5mbG9hdERlZmF1bHQsIHJocy5kb3VibGVEZWZhdWx0LCByaHMuY2hlY2tEb3VibGVGcm9tRmxvYXQsIHJocy5jaGVja1N0cmluZ0FycmF5MSwgcmhzLmNoZWNrU3RyaW5nQXJyYXkyLCByaHMuaW50MzJfbWluLCByaHMuaW50MzJfbWF4LCByaHMuaW50NjRfbWF4LCByaHMuaGV4SW50MzJfbmVnXzEsIHJocy5pYmluZGVyLCByaHMuZW1wdHksIHJocy5pbnQ4XzEsIHJocy5pbnQzMl8xLCByaHMuaW50NjRfMSwgcmhzLmhleEludDMyX3Bvc18xLCByaHMuaGV4SW50NjRfcG9zXzEsIHJocy5jb25zdF9leHByc18xLCByaHMuY29uc3RfZXhwcnNfMiwgcmhzLmNvbnN0X2V4cHJzXzMsIHJocy5jb25zdF9leHByc180LCByaHMuY29uc3RfZXhwcnNfNSwgcmhzLmNvbnN0X2V4cHJzXzYsIHJocy5jb25zdF9leHByc183LCByaHMuY29uc3RfZXhwcnNfOCwgcmhzLmNvbnN0X2V4cHJzXzksIHJocy5jb25zdF9leHByc18xMCwgcmhzLmFkZFN0cmluZzEsIHJocy5hZGRTdHJpbmcyLCByaHMuc2hvdWxkU2V0Qml0MEFuZEJpdDIsIHJocy51LCByaHMuc2hvdWxkQmVDb25zdFMxLCByaHMuZGVmYXVsdFdpdGhGb28pOworICB9CisKKyAgZW51bSA6IGludDMyX3QgeyBCSVQwID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEJJVDEgPSAyIH07CisgIGVudW0gOiBpbnQzMl90IHsgQklUMiA9IDQgfTsKICAgOjphbmRyb2lkOjpzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBmaW5hbDsKICAgOjphbmRyb2lkOjpzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IGZpbmFsOwogICBzdGF0aWMgY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiYgZ2V0UGFyY2VsYWJsZURlc2NyaXB0b3IoKSB7CkBAIC0xNDMsNiArMTc1LDggQEAKICAgICBvcyA8PCAiLCBpbnQ2NF9tYXg6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaW50NjRfbWF4KTsKICAgICBvcyA8PCAiLCBoZXhJbnQzMl9uZWdfMTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhoZXhJbnQzMl9uZWdfMSk7CiAgICAgb3MgPDwgIiwgaWJpbmRlcjogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpYmluZGVyKTsKKyAgICBvcyA8PCAiLCBlbXB0eTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhlbXB0eSk7CisgICAgb3MgPDwgIiwgaW50OF8xOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGludDhfMSk7CiAgICAgb3MgPDwgIiwgaW50MzJfMTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbnQzMl8xKTsKICAgICBvcyA8PCAiLCBpbnQ2NF8xOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGludDY0XzEpOwogICAgIG9zIDw8ICIsIGhleEludDMyX3Bvc18xOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGhleEludDMyX3Bvc18xKTsKQEAgLTE2Nyw5ICsyMDEsNiBAQAogICAgIHJldHVybiBvcy5zdHIoKTsKICAgfQogfTsgIC8vIGNsYXNzIFN0cnVjdHVyZWRQYXJjZWxhYmxlCi0KIH0gIC8vIG5hbWVzcGFjZSB0ZXN0cwotCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL1VuaW9uLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb24uaAppbmRleCAxZGZmYWJiLi5hODIzMDBmIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb24uaAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb24uaApAQCAtMiw2ICsyLDggQEAKIAogI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9CeXRlRW51bS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3RvX3N0cmluZy5oPgorI2luY2x1ZGUgPGFycmF5PgorI2luY2x1ZGUgPGJpbmRlci9FbnVtcy5oPgogI2luY2x1ZGUgPGJpbmRlci9JQmluZGVyLmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgogI2luY2x1ZGUgPGJpbmRlci9TdGF0dXMuaD4KQEAgLTE5LDEzICsyMSw3MyBAQAogI2VuZGlmCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogbmFtZXNwYWNlIGFpZGwgewotCiBuYW1lc3BhY2UgdGVzdHMgewotCiBjbGFzcyBVbmlvbiA6IHB1YmxpYyA6OmFuZHJvaWQ6OlBhcmNlbGFibGUgewogcHVibGljOgorICBlbnVtIGNsYXNzIFRhZyA6IGludDMyX3QgeworICAgIG5zID0gMCwKKyAgICBuID0gMSwKKyAgICBtID0gMiwKKyAgICBzID0gMywKKyAgICBpYmluZGVyID0gNCwKKyAgICBzcyA9IDUsCisgICAgYmUgPSA2LAorICB9OworICAvLyBFeHBvc2UgdGFnIHN5bWJvbHMgZm9yIGxlZ2FjeSBjb2RlCisgIHN0YXRpYyBjb25zdCBpbmxpbmUgVGFnIG5zID0gVGFnOjpuczsKKyAgc3RhdGljIGNvbnN0IGlubGluZSBUYWcgbiA9IFRhZzo6bjsKKyAgc3RhdGljIGNvbnN0IGlubGluZSBUYWcgbSA9IFRhZzo6bTsKKyAgc3RhdGljIGNvbnN0IGlubGluZSBUYWcgcyA9IFRhZzo6czsKKyAgc3RhdGljIGNvbnN0IGlubGluZSBUYWcgaWJpbmRlciA9IFRhZzo6aWJpbmRlcjsKKyAgc3RhdGljIGNvbnN0IGlubGluZSBUYWcgc3MgPSBUYWc6OnNzOworICBzdGF0aWMgY29uc3QgaW5saW5lIFRhZyBiZSA9IFRhZzo6YmU7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICBzdGF0aWMgY29uc3RleHByIGJvb2wgX25vdF9zZWxmID0gIXN0ZDo6aXNfc2FtZV92PHN0ZDo6cmVtb3ZlX2N2X3Q8c3RkOjpyZW1vdmVfcmVmZXJlbmNlX3Q8X1RwPj4sIFVuaW9uPjsKKworICBVbmlvbigpIDogX3ZhbHVlKHN0ZDo6aW5fcGxhY2VfaW5kZXg8c3RhdGljX2Nhc3Q8c2l6ZV90Pihucyk+LCA6OnN0ZDo6dmVjdG9yPGludDMyX3Q+KHt9KSkgeyB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgPSBzdGQ6OmVuYWJsZV9pZl90PF9ub3Rfc2VsZjxfVHA+Pj4KKyAgLy8gTk9MSU5UTkVYVExJTkUoZ29vZ2xlLWV4cGxpY2l0LWNvbnN0cnVjdG9yKQorICBjb25zdGV4cHIgVW5pb24oX1RwJiYgX2FyZykKKyAgICAgIDogX3ZhbHVlKHN0ZDo6Zm9yd2FyZDxfVHA+KF9hcmcpKSB7fQorCisgIHRlbXBsYXRlIDxzaXplX3QgX05wLCB0eXBlbmFtZS4uLiBfVHA+CisgIGNvbnN0ZXhwciBleHBsaWNpdCBVbmlvbihzdGQ6OmluX3BsYWNlX2luZGV4X3Q8X05wPiwgX1RwJiYuLi4gX2FyZ3MpCisgICAgICA6IF92YWx1ZShzdGQ6OmluX3BsYWNlX2luZGV4PF9OcD4sIHN0ZDo6Zm9yd2FyZDxfVHA+KF9hcmdzKS4uLikge30KKworICB0ZW1wbGF0ZSA8VGFnIF90YWcsIHR5cGVuYW1lLi4uIF9UcD4KKyAgc3RhdGljIFVuaW9uIG1ha2UoX1RwJiYuLi4gX2FyZ3MpIHsKKyAgICByZXR1cm4gVW5pb24oc3RkOjppbl9wbGFjZV9pbmRleDxzdGF0aWNfY2FzdDxzaXplX3Q+KF90YWcpPiwgc3RkOjpmb3J3YXJkPF9UcD4oX2FyZ3MpLi4uKTsKKyAgfQorCisgIHRlbXBsYXRlIDxUYWcgX3RhZywgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZS4uLiBfVXA+CisgIHN0YXRpYyBVbmlvbiBtYWtlKHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxfVHA+IF9pbCwgX1VwJiYuLi4gX2FyZ3MpIHsKKyAgICByZXR1cm4gVW5pb24oc3RkOjppbl9wbGFjZV9pbmRleDxzdGF0aWNfY2FzdDxzaXplX3Q+KF90YWcpPiwgc3RkOjptb3ZlKF9pbCksIHN0ZDo6Zm9yd2FyZDxfVXA+KF9hcmdzKS4uLik7CisgIH0KKworICBUYWcgZ2V0VGFnKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxUYWc+KF92YWx1ZS5pbmRleCgpKTsKKyAgfQorCisgIHRlbXBsYXRlIDxUYWcgX3RhZz4KKyAgY29uc3QgYXV0byYgZ2V0KCkgY29uc3QgeworICAgIGlmIChnZXRUYWcoKSAhPSBfdGFnKSB7IF9fYXNzZXJ0MihfX0ZJTEVfXywgX19MSU5FX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18sICJiYWQgYWNjZXNzOiBhIHdyb25nIHRhZyIpOyB9CisgICAgcmV0dXJuIHN0ZDo6Z2V0PHN0YXRpY19jYXN0PHNpemVfdD4oX3RhZyk+KF92YWx1ZSk7CisgIH0KKworICB0ZW1wbGF0ZSA8VGFnIF90YWc+CisgIGF1dG8mIGdldCgpIHsKKyAgICBpZiAoZ2V0VGFnKCkgIT0gX3RhZykgeyBfX2Fzc2VydDIoX19GSUxFX18sIF9fTElORV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fLCAiYmFkIGFjY2VzczogYSB3cm9uZyB0YWciKTsgfQorICAgIHJldHVybiBzdGQ6OmdldDxzdGF0aWNfY2FzdDxzaXplX3Q+KF90YWcpPihfdmFsdWUpOworICB9CisKKyAgdGVtcGxhdGUgPFRhZyBfdGFnLCB0eXBlbmFtZS4uLiBfVHA+CisgIHZvaWQgc2V0KF9UcCYmLi4uIF9hcmdzKSB7CisgICAgX3ZhbHVlLmVtcGxhY2U8c3RhdGljX2Nhc3Q8c2l6ZV90PihfdGFnKT4oc3RkOjpmb3J3YXJkPF9UcD4oX2FyZ3MpLi4uKTsKKyAgfQorCiAgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgVW5pb24mIHJocykgY29uc3QgewogICAgIHJldHVybiBfdmFsdWUgIT0gcmhzLl92YWx1ZTsKICAgfQpAQCAtNDUsNjUgKzEwNyw2IEBACiAgICAgcmV0dXJuIF92YWx1ZSA+PSByaHMuX3ZhbHVlOwogICB9CiAKLSAgZW51bSBUYWcgOiBpbnQzMl90IHsKLSAgICBucyA9IDAsICAvLyBpbnRbXSBuczsKLSAgICBuLCAgLy8gaW50IG47Ci0gICAgbSwgIC8vIGludCBtOwotICAgIHMsICAvLyBTdHJpbmcgczsKLSAgICBpYmluZGVyLCAgLy8gSUJpbmRlciBpYmluZGVyOwotICAgIHNzLCAgLy8gTGlzdDxTdHJpbmc+IHNzOwotICAgIGJlLCAgLy8gYW5kcm9pZC5haWRsLnRlc3RzLkJ5dGVFbnVtIGJlOwotICB9OwotCi0gIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KLSAgc3RhdGljIGNvbnN0ZXhwciBib29sIF9ub3Rfc2VsZiA9ICFzdGQ6OmlzX3NhbWVfdjxzdGQ6OnJlbW92ZV9jdl90PHN0ZDo6cmVtb3ZlX3JlZmVyZW5jZV90PF9UcD4+LCBVbmlvbj47Ci0KLSAgVW5pb24oKSA6IF92YWx1ZShzdGQ6OmluX3BsYWNlX2luZGV4PG5zPiwgOjpzdGQ6OnZlY3RvcjxpbnQzMl90Pih7fSkpIHsgfQotICBVbmlvbihjb25zdCBVbmlvbiYpID0gZGVmYXVsdDsKLSAgVW5pb24oVW5pb24mJikgPSBkZWZhdWx0OwotICBVbmlvbiYgb3BlcmF0b3I9KGNvbnN0IFVuaW9uJikgPSBkZWZhdWx0OwotICBVbmlvbiYgb3BlcmF0b3I9KFVuaW9uJiYpID0gZGVmYXVsdDsKLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSA9IHN0ZDo6ZW5hYmxlX2lmX3Q8X25vdF9zZWxmPF9UcD4+PgotICAvLyBOT0xJTlRORVhUTElORShnb29nbGUtZXhwbGljaXQtY29uc3RydWN0b3IpCi0gIGNvbnN0ZXhwciBVbmlvbihfVHAmJiBfYXJnKQotICAgICAgOiBfdmFsdWUoc3RkOjpmb3J3YXJkPF9UcD4oX2FyZykpIHt9Ci0KLSAgdGVtcGxhdGUgPHNpemVfdCBfTnAsIHR5cGVuYW1lLi4uIF9UcD4KLSAgY29uc3RleHByIGV4cGxpY2l0IFVuaW9uKHN0ZDo6aW5fcGxhY2VfaW5kZXhfdDxfTnA+LCBfVHAmJi4uLiBfYXJncykKLSAgICAgIDogX3ZhbHVlKHN0ZDo6aW5fcGxhY2VfaW5kZXg8X05wPiwgc3RkOjpmb3J3YXJkPF9UcD4oX2FyZ3MpLi4uKSB7fQotCi0gIHRlbXBsYXRlIDxUYWcgX3RhZywgdHlwZW5hbWUuLi4gX1RwPgotICBzdGF0aWMgVW5pb24gbWFrZShfVHAmJi4uLiBfYXJncykgewotICAgIHJldHVybiBVbmlvbihzdGQ6OmluX3BsYWNlX2luZGV4PF90YWc+LCBzdGQ6OmZvcndhcmQ8X1RwPihfYXJncykuLi4pOwotICB9Ci0KLSAgdGVtcGxhdGUgPFRhZyBfdGFnLCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lLi4uIF9VcD4KLSAgc3RhdGljIFVuaW9uIG1ha2Uoc3RkOjppbml0aWFsaXplcl9saXN0PF9UcD4gX2lsLCBfVXAmJi4uLiBfYXJncykgewotICAgIHJldHVybiBVbmlvbihzdGQ6OmluX3BsYWNlX2luZGV4PF90YWc+LCBzdGQ6Om1vdmUoX2lsKSwgc3RkOjpmb3J3YXJkPF9VcD4oX2FyZ3MpLi4uKTsKLSAgfQotCi0gIFRhZyBnZXRUYWcoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFRhZz4oX3ZhbHVlLmluZGV4KCkpOwotICB9Ci0KLSAgdGVtcGxhdGUgPFRhZyBfdGFnPgotICBjb25zdCBhdXRvJiBnZXQoKSBjb25zdCB7Ci0gICAgaWYgKGdldFRhZygpICE9IF90YWcpIHsgX19hc3NlcnQyKF9fRklMRV9fLCBfX0xJTkVfXywgX19QUkVUVFlfRlVOQ1RJT05fXywgImJhZCBhY2Nlc3M6IGEgd3JvbmcgdGFnIik7IH0KLSAgICByZXR1cm4gc3RkOjpnZXQ8X3RhZz4oX3ZhbHVlKTsKLSAgfQotCi0gIHRlbXBsYXRlIDxUYWcgX3RhZz4KLSAgYXV0byYgZ2V0KCkgewotICAgIGlmIChnZXRUYWcoKSAhPSBfdGFnKSB7IF9fYXNzZXJ0MihfX0ZJTEVfXywgX19MSU5FX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18sICJiYWQgYWNjZXNzOiBhIHdyb25nIHRhZyIpOyB9Ci0gICAgcmV0dXJuIHN0ZDo6Z2V0PF90YWc+KF92YWx1ZSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8VGFnIF90YWcsIHR5cGVuYW1lLi4uIF9UcD4KLSAgdm9pZCBzZXQoX1RwJiYuLi4gX2FyZ3MpIHsKLSAgICBfdmFsdWUuZW1wbGFjZTxfdGFnPihzdGQ6OmZvcndhcmQ8X1RwPihfYXJncykuLi4pOwotICB9Ci0KICAgc3RhdGljIGNvbnN0IDo6c3RkOjpzdHJpbmcmIFMxKCk7CiAgIDo6YW5kcm9pZDo6c3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgZmluYWw7CiAgIDo6YW5kcm9pZDo6c3RhdHVzX3Qgd3JpdGVUb1BhcmNlbCg6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCBmaW5hbDsKQEAgLTEyOSw5ICsxMzIsNDkgQEAKIHByaXZhdGU6CiAgIHN0ZDo6dmFyaWFudDw6OnN0ZDo6dmVjdG9yPGludDMyX3Q+LCBpbnQzMl90LCBpbnQzMl90LCA6OnN0ZDo6c3RyaW5nLCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4sIDo6c3RkOjp2ZWN0b3I8OjpzdGQ6OnN0cmluZz4sIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJ5dGVFbnVtPiBfdmFsdWU7CiB9OyAgLy8gY2xhc3MgVW5pb24KLQogfSAgLy8gbmFtZXNwYWNlIHRlc3RzCi0KIH0gIC8vIG5hbWVzcGFjZSBhaWRsCi0KK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworW1tub2Rpc2NhcmRdXSBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKFVuaW9uOjpUYWcgdmFsKSB7CisgIHN3aXRjaCh2YWwpIHsKKyAgY2FzZSBVbmlvbjo6VGFnOjpuczoKKyAgICByZXR1cm4gIm5zIjsKKyAgY2FzZSBVbmlvbjo6VGFnOjpuOgorICAgIHJldHVybiAibiI7CisgIGNhc2UgVW5pb246OlRhZzo6bToKKyAgICByZXR1cm4gIm0iOworICBjYXNlIFVuaW9uOjpUYWc6OnM6CisgICAgcmV0dXJuICJzIjsKKyAgY2FzZSBVbmlvbjo6VGFnOjppYmluZGVyOgorICAgIHJldHVybiAiaWJpbmRlciI7CisgIGNhc2UgVW5pb246OlRhZzo6c3M6CisgICAgcmV0dXJuICJzcyI7CisgIGNhc2UgVW5pb246OlRhZzo6YmU6CisgICAgcmV0dXJuICJiZSI7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIHN0ZDo6dG9fc3RyaW5nKHN0YXRpY19jYXN0PGludDMyX3Q+KHZhbCkpOworICB9Cit9Cit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGludGVybmFsIHsKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdjKysxNy1leHRlbnNpb25zIgordGVtcGxhdGUgPD4KK2NvbnN0ZXhwciBpbmxpbmUgc3RkOjphcnJheTw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpVbmlvbjo6VGFnLCA3PiBlbnVtX3ZhbHVlczw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpVbmlvbjo6VGFnPiA9IHsKKyAgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6VW5pb246OlRhZzo6bnMsCisgIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlVuaW9uOjpUYWc6Om4sCisgIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlVuaW9uOjpUYWc6Om0sCisgIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlVuaW9uOjpUYWc6OnMsCisgIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlVuaW9uOjpUYWc6OmliaW5kZXIsCisgIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlVuaW9uOjpUYWc6OnNzLAorICA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpVbmlvbjo6VGFnOjpiZSwKK307CisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb25XaXRoRmQuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9VbmlvbldpdGhGZC5oCmluZGV4IDdlNDAyMWYuLmM5N2VkZjEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9VbmlvbldpdGhGZC5oCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9VbmlvbldpdGhGZC5oCkBAIC0xLDExICsxLDE0IEBACiAjcHJhZ21hIG9uY2UKIAogI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3RvX3N0cmluZy5oPgorI2luY2x1ZGUgPGFycmF5PgorI2luY2x1ZGUgPGJpbmRlci9FbnVtcy5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsRmlsZURlc2NyaXB0b3IuaD4KICNpbmNsdWRlIDxiaW5kZXIvU3RhdHVzLmg+CiAjaW5jbHVkZSA8Y2Fzc2VydD4KICNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KICNpbmNsdWRlIDx1dGlsaXR5PgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CkBAIC0xNiwxMyArMTksNjMgQEAKICNlbmRpZgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIG5hbWVzcGFjZSBhaWRsIHsKLQogbmFtZXNwYWNlIHRlc3RzIHsKLQogY2xhc3MgVW5pb25XaXRoRmQgOiBwdWJsaWMgOjphbmRyb2lkOjpQYXJjZWxhYmxlIHsKIHB1YmxpYzoKKyAgZW51bSBjbGFzcyBUYWcgOiBpbnQzMl90IHsKKyAgICBudW0gPSAwLAorICAgIHBmZCA9IDEsCisgIH07CisgIC8vIEV4cG9zZSB0YWcgc3ltYm9scyBmb3IgbGVnYWN5IGNvZGUKKyAgc3RhdGljIGNvbnN0IGlubGluZSBUYWcgbnVtID0gVGFnOjpudW07CisgIHN0YXRpYyBjb25zdCBpbmxpbmUgVGFnIHBmZCA9IFRhZzo6cGZkOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgc3RhdGljIGNvbnN0ZXhwciBib29sIF9ub3Rfc2VsZiA9ICFzdGQ6OmlzX3NhbWVfdjxzdGQ6OnJlbW92ZV9jdl90PHN0ZDo6cmVtb3ZlX3JlZmVyZW5jZV90PF9UcD4+LCBVbmlvbldpdGhGZD47CisKKyAgVW5pb25XaXRoRmQoKSA6IF92YWx1ZShzdGQ6OmluX3BsYWNlX2luZGV4PHN0YXRpY19jYXN0PHNpemVfdD4obnVtKT4sIGludDMyX3QoMCkpIHsgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lID0gc3RkOjplbmFibGVfaWZfdDxfbm90X3NlbGY8X1RwPj4+CisgIC8vIE5PTElOVE5FWFRMSU5FKGdvb2dsZS1leHBsaWNpdC1jb25zdHJ1Y3RvcikKKyAgY29uc3RleHByIFVuaW9uV2l0aEZkKF9UcCYmIF9hcmcpCisgICAgICA6IF92YWx1ZShzdGQ6OmZvcndhcmQ8X1RwPihfYXJnKSkge30KKworICB0ZW1wbGF0ZSA8c2l6ZV90IF9OcCwgdHlwZW5hbWUuLi4gX1RwPgorICBjb25zdGV4cHIgZXhwbGljaXQgVW5pb25XaXRoRmQoc3RkOjppbl9wbGFjZV9pbmRleF90PF9OcD4sIF9UcCYmLi4uIF9hcmdzKQorICAgICAgOiBfdmFsdWUoc3RkOjppbl9wbGFjZV9pbmRleDxfTnA+LCBzdGQ6OmZvcndhcmQ8X1RwPihfYXJncykuLi4pIHt9CisKKyAgdGVtcGxhdGUgPFRhZyBfdGFnLCB0eXBlbmFtZS4uLiBfVHA+CisgIHN0YXRpYyBVbmlvbldpdGhGZCBtYWtlKF9UcCYmLi4uIF9hcmdzKSB7CisgICAgcmV0dXJuIFVuaW9uV2l0aEZkKHN0ZDo6aW5fcGxhY2VfaW5kZXg8c3RhdGljX2Nhc3Q8c2l6ZV90PihfdGFnKT4sIHN0ZDo6Zm9yd2FyZDxfVHA+KF9hcmdzKS4uLik7CisgIH0KKworICB0ZW1wbGF0ZSA8VGFnIF90YWcsIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUuLi4gX1VwPgorICBzdGF0aWMgVW5pb25XaXRoRmQgbWFrZShzdGQ6OmluaXRpYWxpemVyX2xpc3Q8X1RwPiBfaWwsIF9VcCYmLi4uIF9hcmdzKSB7CisgICAgcmV0dXJuIFVuaW9uV2l0aEZkKHN0ZDo6aW5fcGxhY2VfaW5kZXg8c3RhdGljX2Nhc3Q8c2l6ZV90PihfdGFnKT4sIHN0ZDo6bW92ZShfaWwpLCBzdGQ6OmZvcndhcmQ8X1VwPihfYXJncykuLi4pOworICB9CisKKyAgVGFnIGdldFRhZygpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VGFnPihfdmFsdWUuaW5kZXgoKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8VGFnIF90YWc+CisgIGNvbnN0IGF1dG8mIGdldCgpIGNvbnN0IHsKKyAgICBpZiAoZ2V0VGFnKCkgIT0gX3RhZykgeyBfX2Fzc2VydDIoX19GSUxFX18sIF9fTElORV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fLCAiYmFkIGFjY2VzczogYSB3cm9uZyB0YWciKTsgfQorICAgIHJldHVybiBzdGQ6OmdldDxzdGF0aWNfY2FzdDxzaXplX3Q+KF90YWcpPihfdmFsdWUpOworICB9CisKKyAgdGVtcGxhdGUgPFRhZyBfdGFnPgorICBhdXRvJiBnZXQoKSB7CisgICAgaWYgKGdldFRhZygpICE9IF90YWcpIHsgX19hc3NlcnQyKF9fRklMRV9fLCBfX0xJTkVfXywgX19QUkVUVFlfRlVOQ1RJT05fXywgImJhZCBhY2Nlc3M6IGEgd3JvbmcgdGFnIik7IH0KKyAgICByZXR1cm4gc3RkOjpnZXQ8c3RhdGljX2Nhc3Q8c2l6ZV90PihfdGFnKT4oX3ZhbHVlKTsKKyAgfQorCisgIHRlbXBsYXRlIDxUYWcgX3RhZywgdHlwZW5hbWUuLi4gX1RwPgorICB2b2lkIHNldChfVHAmJi4uLiBfYXJncykgeworICAgIF92YWx1ZS5lbXBsYWNlPHN0YXRpY19jYXN0PHNpemVfdD4oX3RhZyk+KHN0ZDo6Zm9yd2FyZDxfVHA+KF9hcmdzKS4uLik7CisgIH0KKwogICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFVuaW9uV2l0aEZkJiByaHMpIGNvbnN0IHsKICAgICByZXR1cm4gX3ZhbHVlICE9IHJocy5fdmFsdWU7CiAgIH0KQEAgLTQyLDYwICs5NSw2IEBACiAgICAgcmV0dXJuIF92YWx1ZSA+PSByaHMuX3ZhbHVlOwogICB9CiAKLSAgZW51bSBUYWcgOiBpbnQzMl90IHsKLSAgICBudW0gPSAwLCAgLy8gaW50IG51bTsKLSAgICBwZmQsICAvLyBQYXJjZWxGaWxlRGVzY3JpcHRvciBwZmQ7Ci0gIH07Ci0KLSAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgotICBzdGF0aWMgY29uc3RleHByIGJvb2wgX25vdF9zZWxmID0gIXN0ZDo6aXNfc2FtZV92PHN0ZDo6cmVtb3ZlX2N2X3Q8c3RkOjpyZW1vdmVfcmVmZXJlbmNlX3Q8X1RwPj4sIFVuaW9uV2l0aEZkPjsKLQotICBVbmlvbldpdGhGZCgpIDogX3ZhbHVlKHN0ZDo6aW5fcGxhY2VfaW5kZXg8bnVtPiwgaW50MzJfdCgwKSkgeyB9Ci0gIFVuaW9uV2l0aEZkKGNvbnN0IFVuaW9uV2l0aEZkJikgPSBkZWZhdWx0OwotICBVbmlvbldpdGhGZChVbmlvbldpdGhGZCYmKSA9IGRlZmF1bHQ7Ci0gIFVuaW9uV2l0aEZkJiBvcGVyYXRvcj0oY29uc3QgVW5pb25XaXRoRmQmKSA9IGRlZmF1bHQ7Ci0gIFVuaW9uV2l0aEZkJiBvcGVyYXRvcj0oVW5pb25XaXRoRmQmJikgPSBkZWZhdWx0OwotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lID0gc3RkOjplbmFibGVfaWZfdDxfbm90X3NlbGY8X1RwPj4+Ci0gIC8vIE5PTElOVE5FWFRMSU5FKGdvb2dsZS1leHBsaWNpdC1jb25zdHJ1Y3RvcikKLSAgY29uc3RleHByIFVuaW9uV2l0aEZkKF9UcCYmIF9hcmcpCi0gICAgICA6IF92YWx1ZShzdGQ6OmZvcndhcmQ8X1RwPihfYXJnKSkge30KLQotICB0ZW1wbGF0ZSA8c2l6ZV90IF9OcCwgdHlwZW5hbWUuLi4gX1RwPgotICBjb25zdGV4cHIgZXhwbGljaXQgVW5pb25XaXRoRmQoc3RkOjppbl9wbGFjZV9pbmRleF90PF9OcD4sIF9UcCYmLi4uIF9hcmdzKQotICAgICAgOiBfdmFsdWUoc3RkOjppbl9wbGFjZV9pbmRleDxfTnA+LCBzdGQ6OmZvcndhcmQ8X1RwPihfYXJncykuLi4pIHt9Ci0KLSAgdGVtcGxhdGUgPFRhZyBfdGFnLCB0eXBlbmFtZS4uLiBfVHA+Ci0gIHN0YXRpYyBVbmlvbldpdGhGZCBtYWtlKF9UcCYmLi4uIF9hcmdzKSB7Ci0gICAgcmV0dXJuIFVuaW9uV2l0aEZkKHN0ZDo6aW5fcGxhY2VfaW5kZXg8X3RhZz4sIHN0ZDo6Zm9yd2FyZDxfVHA+KF9hcmdzKS4uLik7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8VGFnIF90YWcsIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUuLi4gX1VwPgotICBzdGF0aWMgVW5pb25XaXRoRmQgbWFrZShzdGQ6OmluaXRpYWxpemVyX2xpc3Q8X1RwPiBfaWwsIF9VcCYmLi4uIF9hcmdzKSB7Ci0gICAgcmV0dXJuIFVuaW9uV2l0aEZkKHN0ZDo6aW5fcGxhY2VfaW5kZXg8X3RhZz4sIHN0ZDo6bW92ZShfaWwpLCBzdGQ6OmZvcndhcmQ8X1VwPihfYXJncykuLi4pOwotICB9Ci0KLSAgVGFnIGdldFRhZygpIGNvbnN0IHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VGFnPihfdmFsdWUuaW5kZXgoKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8VGFnIF90YWc+Ci0gIGNvbnN0IGF1dG8mIGdldCgpIGNvbnN0IHsKLSAgICBpZiAoZ2V0VGFnKCkgIT0gX3RhZykgeyBfX2Fzc2VydDIoX19GSUxFX18sIF9fTElORV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fLCAiYmFkIGFjY2VzczogYSB3cm9uZyB0YWciKTsgfQotICAgIHJldHVybiBzdGQ6OmdldDxfdGFnPihfdmFsdWUpOwotICB9Ci0KLSAgdGVtcGxhdGUgPFRhZyBfdGFnPgotICBhdXRvJiBnZXQoKSB7Ci0gICAgaWYgKGdldFRhZygpICE9IF90YWcpIHsgX19hc3NlcnQyKF9fRklMRV9fLCBfX0xJTkVfXywgX19QUkVUVFlfRlVOQ1RJT05fXywgImJhZCBhY2Nlc3M6IGEgd3JvbmcgdGFnIik7IH0KLSAgICByZXR1cm4gc3RkOjpnZXQ8X3RhZz4oX3ZhbHVlKTsKLSAgfQotCi0gIHRlbXBsYXRlIDxUYWcgX3RhZywgdHlwZW5hbWUuLi4gX1RwPgotICB2b2lkIHNldChfVHAmJi4uLiBfYXJncykgewotICAgIF92YWx1ZS5lbXBsYWNlPF90YWc+KHN0ZDo6Zm9yd2FyZDxfVHA+KF9hcmdzKS4uLik7Ci0gIH0KLQogICA6OmFuZHJvaWQ6OnN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGZpbmFsOwogICA6OmFuZHJvaWQ6OnN0YXR1c190IHdyaXRlVG9QYXJjZWwoOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgZmluYWw7CiAgIHN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiBnZXRQYXJjZWxhYmxlRGVzY3JpcHRvcigpIHsKQEAgLTExNSw5ICsxMTQsMzQgQEAKIHByaXZhdGU6CiAgIHN0ZDo6dmFyaWFudDxpbnQzMl90LCA6OmFuZHJvaWQ6Om9zOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj4gX3ZhbHVlOwogfTsgIC8vIGNsYXNzIFVuaW9uV2l0aEZkCi0KIH0gIC8vIG5hbWVzcGFjZSB0ZXN0cwotCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAotCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK1tbbm9kaXNjYXJkXV0gc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZyhVbmlvbldpdGhGZDo6VGFnIHZhbCkgeworICBzd2l0Y2godmFsKSB7CisgIGNhc2UgVW5pb25XaXRoRmQ6OlRhZzo6bnVtOgorICAgIHJldHVybiAibnVtIjsKKyAgY2FzZSBVbmlvbldpdGhGZDo6VGFnOjpwZmQ6CisgICAgcmV0dXJuICJwZmQiOworICBkZWZhdWx0OgorICAgIHJldHVybiBzdGQ6OnRvX3N0cmluZyhzdGF0aWNfY2FzdDxpbnQzMl90Pih2YWwpKTsKKyAgfQorfQorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XYysrMTctZXh0ZW5zaW9ucyIKK3RlbXBsYXRlIDw+Citjb25zdGV4cHIgaW5saW5lIHN0ZDo6YXJyYXk8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6VW5pb25XaXRoRmQ6OlRhZywgMj4gZW51bV92YWx1ZXM8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6VW5pb25XaXRoRmQ6OlRhZz4gPSB7CisgIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlVuaW9uV2l0aEZkOjpUYWc6Om51bSwKKyAgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6VW5pb25XaXRoRmQ6OlRhZzo6cGZkLAorfTsKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vQm5FeHRlbmRhYmxlUGFyY2VsYWJsZS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9CbkV4dGVuZGFibGVQYXJjZWxhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U3MmFhMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vQm5FeHRlbmRhYmxlUGFyY2VsYWJsZS5oCkBAIC0wLDAgKzEgQEAKKyNlcnJvciBUT0RPKGIvMTExMzYyNTkzKSBwYXJjZWxhYmxlcyBkbyBub3QgaGF2ZSBibiBjbGFzc2VzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9Cbk15RXh0LmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0JuTXlFeHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTcyYWEzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9Cbk15RXh0LmgKQEAgLTAsMCArMSBAQAorI2Vycm9yIFRPRE8oYi8xMTEzNjI1OTMpIHBhcmNlbGFibGVzIGRvIG5vdCBoYXZlIGJuIGNsYXNzZXMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0JuTXlFeHQyLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0JuTXlFeHQyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U3MmFhMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vQm5NeUV4dDIuaApAQCAtMCwwICsxIEBACisjZXJyb3IgVE9ETyhiLzExMTM2MjU5MykgcGFyY2VsYWJsZXMgZG8gbm90IGhhdmUgYm4gY2xhc3NlcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vQm5NeUV4dExpa2UuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vQm5NeUV4dExpa2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTcyYWEzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9Cbk15RXh0TGlrZS5oCkBAIC0wLDAgKzEgQEAKKyNlcnJvciBUT0RPKGIvMTExMzYyNTkzKSBwYXJjZWxhYmxlcyBkbyBub3QgaGF2ZSBibiBjbGFzc2VzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9CcEV4dGVuZGFibGVQYXJjZWxhYmxlLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0JwRXh0ZW5kYWJsZVBhcmNlbGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2FmNmIxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9CcEV4dGVuZGFibGVQYXJjZWxhYmxlLmgKQEAgLTAsMCArMSBAQAorI2Vycm9yIFRPRE8oYi8xMTEzNjI1OTMpIHBhcmNlbGFibGVzIGRvIG5vdCBoYXZlIGJwIGNsYXNzZXMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0JwTXlFeHQuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vQnBNeUV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YWY2YjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0JwTXlFeHQuaApAQCAtMCwwICsxIEBACisjZXJyb3IgVE9ETyhiLzExMTM2MjU5MykgcGFyY2VsYWJsZXMgZG8gbm90IGhhdmUgYnAgY2xhc3NlcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vQnBNeUV4dDIuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vQnBNeUV4dDIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2FmNmIxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9CcE15RXh0Mi5oCkBAIC0wLDAgKzEgQEAKKyNlcnJvciBUT0RPKGIvMTExMzYyNTkzKSBwYXJjZWxhYmxlcyBkbyBub3QgaGF2ZSBicCBjbGFzc2VzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9CcE15RXh0TGlrZS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9CcE15RXh0TGlrZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YWY2YjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0JwTXlFeHRMaWtlLmgKQEAgLTAsMCArMSBAQAorI2Vycm9yIFRPRE8oYi8xMTEzNjI1OTMpIHBhcmNlbGFibGVzIGRvIG5vdCBoYXZlIGJwIGNsYXNzZXMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0V4dGVuZGFibGVQYXJjZWxhYmxlLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0V4dGVuZGFibGVQYXJjZWxhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y3MDlmMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vRXh0ZW5kYWJsZVBhcmNlbGFibGUuaApAQCAtMCwwICsxLDYzIEBACisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3RvX3N0cmluZy5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsYWJsZUhvbGRlci5oPgorI2luY2x1ZGUgPGJpbmRlci9TdGF0dXMuaD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0dXBsZT4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworbmFtZXNwYWNlIGV4dGVuc2lvbiB7CitjbGFzcyBFeHRlbmRhYmxlUGFyY2VsYWJsZSA6IHB1YmxpYyA6OmFuZHJvaWQ6OlBhcmNlbGFibGUgeworcHVibGljOgorICBpbnQzMl90IGEgPSAwOworICA6OnN0ZDo6c3RyaW5nIGI7CisgIDo6YW5kcm9pZDo6b3M6OlBhcmNlbGFibGVIb2xkZXIgZXh0IHsgOjphbmRyb2lkOjpQYXJjZWxhYmxlOjpTdGFiaWxpdHk6OlNUQUJJTElUWV9MT0NBTCB9OworICBpbnQ2NF90IGMgPSAwTDsKKyAgOjphbmRyb2lkOjpvczo6UGFyY2VsYWJsZUhvbGRlciBleHQyIHsgOjphbmRyb2lkOjpQYXJjZWxhYmxlOjpTdGFiaWxpdHk6OlNUQUJJTElUWV9MT0NBTCB9OworICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEV4dGVuZGFibGVQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoYSwgYiwgZXh0LCBjLCBleHQyKSAhPSBzdGQ6OnRpZShyaHMuYSwgcmhzLmIsIHJocy5leHQsIHJocy5jLCByaHMuZXh0Mik7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEV4dGVuZGFibGVQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoYSwgYiwgZXh0LCBjLCBleHQyKSA8IHN0ZDo6dGllKHJocy5hLCByaHMuYiwgcmhzLmV4dCwgcmhzLmMsIHJocy5leHQyKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IEV4dGVuZGFibGVQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoYSwgYiwgZXh0LCBjLCBleHQyKSA8PSBzdGQ6OnRpZShyaHMuYSwgcmhzLmIsIHJocy5leHQsIHJocy5jLCByaHMuZXh0Mik7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBFeHRlbmRhYmxlUGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKGEsIGIsIGV4dCwgYywgZXh0MikgPT0gc3RkOjp0aWUocmhzLmEsIHJocy5iLCByaHMuZXh0LCByaHMuYywgcmhzLmV4dDIpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPihjb25zdCBFeHRlbmRhYmxlUGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKGEsIGIsIGV4dCwgYywgZXh0MikgPiBzdGQ6OnRpZShyaHMuYSwgcmhzLmIsIHJocy5leHQsIHJocy5jLCByaHMuZXh0Mik7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBFeHRlbmRhYmxlUGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKGEsIGIsIGV4dCwgYywgZXh0MikgPj0gc3RkOjp0aWUocmhzLmEsIHJocy5iLCByaHMuZXh0LCByaHMuYywgcmhzLmV4dDIpOworICB9CisKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBmaW5hbDsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IGZpbmFsOworICBzdGF0aWMgY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiYgZ2V0UGFyY2VsYWJsZURlc2NyaXB0b3IoKSB7CisgICAgc3RhdGljIGNvbnN0IDo6YW5kcm9pZDo6U3RhdGljU3RyaW5nMTYgREVTQ0lQVE9SICh1ImFuZHJvaWQuYWlkbC50ZXN0cy5leHRlbnNpb24uRXh0ZW5kYWJsZVBhcmNlbGFibGUiKTsKKyAgICByZXR1cm4gREVTQ0lQVE9SOworICB9CisgIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7CisgICAgb3MgPDwgIkV4dGVuZGFibGVQYXJjZWxhYmxleyI7CisgICAgb3MgPDwgImE6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoYSk7CisgICAgb3MgPDwgIiwgYjogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhiKTsKKyAgICBvcyA8PCAiLCBleHQ6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoZXh0KTsKKyAgICBvcyA8PCAiLCBjOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGMpOworICAgIG9zIDw8ICIsIGV4dDI6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoZXh0Mik7CisgICAgb3MgPDwgIn0iOworICAgIHJldHVybiBvcy5zdHIoKTsKKyAgfQorfTsgIC8vIGNsYXNzIEV4dGVuZGFibGVQYXJjZWxhYmxlCit9ICAvLyBuYW1lc3BhY2UgZXh0ZW5zaW9uCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dC5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4OTk1NGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0LmgKQEAgLTAsMCArMSw1NiBAQAorI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl90b19zdHJpbmcuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8YmluZGVyL1N0YXR1cy5oPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHR1cGxlPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CituYW1lc3BhY2UgZXh0ZW5zaW9uIHsKK2NsYXNzIE15RXh0IDogcHVibGljIDo6YW5kcm9pZDo6UGFyY2VsYWJsZSB7CitwdWJsaWM6CisgIGludDMyX3QgYSA9IDA7CisgIDo6c3RkOjpzdHJpbmcgYjsKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBNeUV4dCYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKGEsIGIpICE9IHN0ZDo6dGllKHJocy5hLCByaHMuYik7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IE15RXh0JiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoYSwgYikgPCBzdGQ6OnRpZShyaHMuYSwgcmhzLmIpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgTXlFeHQmIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZShhLCBiKSA8PSBzdGQ6OnRpZShyaHMuYSwgcmhzLmIpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgTXlFeHQmIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZShhLCBiKSA9PSBzdGQ6OnRpZShyaHMuYSwgcmhzLmIpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPihjb25zdCBNeUV4dCYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKGEsIGIpID4gc3RkOjp0aWUocmhzLmEsIHJocy5iKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IE15RXh0JiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoYSwgYikgPj0gc3RkOjp0aWUocmhzLmEsIHJocy5iKTsKKyAgfQorCisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgZmluYWw7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3Qgd3JpdGVUb1BhcmNlbCg6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCBmaW5hbDsKKyAgc3RhdGljIGNvbnN0IDo6YW5kcm9pZDo6U3RyaW5nMTYmIGdldFBhcmNlbGFibGVEZXNjcmlwdG9yKCkgeworICAgIHN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0YXRpY1N0cmluZzE2IERFU0NJUFRPUiAodSJhbmRyb2lkLmFpZGwudGVzdHMuZXh0ZW5zaW9uLk15RXh0Iik7CisgICAgcmV0dXJuIERFU0NJUFRPUjsKKyAgfQorICBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOworICAgIG9zIDw8ICJNeUV4dHsiOworICAgIG9zIDw8ICJhOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGEpOworICAgIG9zIDw8ICIsIGI6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoYik7CisgICAgb3MgPDwgIn0iOworICAgIHJldHVybiBvcy5zdHIoKTsKKyAgfQorfTsgIC8vIGNsYXNzIE15RXh0Cit9ICAvLyBuYW1lc3BhY2UgZXh0ZW5zaW9uCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dDIuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNmY2QwMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQyLmgKQEAgLTAsMCArMSw1OSBAQAorI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfdG9fc3RyaW5nLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGJpbmRlci9TdGF0dXMuaD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0dXBsZT4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworbmFtZXNwYWNlIGV4dGVuc2lvbiB7CitjbGFzcyBNeUV4dDIgOiBwdWJsaWMgOjphbmRyb2lkOjpQYXJjZWxhYmxlIHsKK3B1YmxpYzoKKyAgaW50MzJfdCBhID0gMDsKKyAgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6ZXh0ZW5zaW9uOjpNeUV4dCBiOworICA6OnN0ZDo6c3RyaW5nIGM7CisgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgTXlFeHQyJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoYSwgYiwgYykgIT0gc3RkOjp0aWUocmhzLmEsIHJocy5iLCByaHMuYyk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IE15RXh0MiYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKGEsIGIsIGMpIDwgc3RkOjp0aWUocmhzLmEsIHJocy5iLCByaHMuYyk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBNeUV4dDImIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZShhLCBiLCBjKSA8PSBzdGQ6OnRpZShyaHMuYSwgcmhzLmIsIHJocy5jKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE15RXh0MiYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKGEsIGIsIGMpID09IHN0ZDo6dGllKHJocy5hLCByaHMuYiwgcmhzLmMpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPihjb25zdCBNeUV4dDImIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZShhLCBiLCBjKSA+IHN0ZDo6dGllKHJocy5hLCByaHMuYiwgcmhzLmMpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgTXlFeHQyJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoYSwgYiwgYykgPj0gc3RkOjp0aWUocmhzLmEsIHJocy5iLCByaHMuYyk7CisgIH0KKworICA6OmFuZHJvaWQ6OnN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGZpbmFsOworICA6OmFuZHJvaWQ6OnN0YXR1c190IHdyaXRlVG9QYXJjZWwoOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgZmluYWw7CisgIHN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiBnZXRQYXJjZWxhYmxlRGVzY3JpcHRvcigpIHsKKyAgICBzdGF0aWMgY29uc3QgOjphbmRyb2lkOjpTdGF0aWNTdHJpbmcxNiBERVNDSVBUT1IgKHUiYW5kcm9pZC5haWRsLnRlc3RzLmV4dGVuc2lvbi5NeUV4dDIiKTsKKyAgICByZXR1cm4gREVTQ0lQVE9SOworICB9CisgIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7CisgICAgb3MgPDwgIk15RXh0MnsiOworICAgIG9zIDw8ICJhOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGEpOworICAgIG9zIDw8ICIsIGI6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoYik7CisgICAgb3MgPDwgIiwgYzogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhjKTsKKyAgICBvcyA8PCAifSI7CisgICAgcmV0dXJuIG9zLnN0cigpOworICB9Cit9OyAgLy8gY2xhc3MgTXlFeHQyCit9ICAvLyBuYW1lc3BhY2UgZXh0ZW5zaW9uCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dExpa2UuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHRMaWtlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFjMmJmNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHRMaWtlLmgKQEAgLTAsMCArMSw1NSBAQAorI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl90b19zdHJpbmcuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8YmluZGVyL1N0YXR1cy5oPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8dHVwbGU+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK25hbWVzcGFjZSBleHRlbnNpb24geworY2xhc3MgTXlFeHRMaWtlIDogcHVibGljIDo6YW5kcm9pZDo6UGFyY2VsYWJsZSB7CitwdWJsaWM6CisgIGludDMyX3QgYSA9IDA7CisgIDo6YW5kcm9pZDo6U3RyaW5nMTYgYjsKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBNeUV4dExpa2UmIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZShhLCBiKSAhPSBzdGQ6OnRpZShyaHMuYSwgcmhzLmIpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBNeUV4dExpa2UmIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZShhLCBiKSA8IHN0ZDo6dGllKHJocy5hLCByaHMuYik7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBNeUV4dExpa2UmIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZShhLCBiKSA8PSBzdGQ6OnRpZShyaHMuYSwgcmhzLmIpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgTXlFeHRMaWtlJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoYSwgYikgPT0gc3RkOjp0aWUocmhzLmEsIHJocy5iKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgTXlFeHRMaWtlJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoYSwgYikgPiBzdGQ6OnRpZShyaHMuYSwgcmhzLmIpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgTXlFeHRMaWtlJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoYSwgYikgPj0gc3RkOjp0aWUocmhzLmEsIHJocy5iKTsKKyAgfQorCisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgZmluYWw7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3Qgd3JpdGVUb1BhcmNlbCg6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCBmaW5hbDsKKyAgc3RhdGljIGNvbnN0IDo6YW5kcm9pZDo6U3RyaW5nMTYmIGdldFBhcmNlbGFibGVEZXNjcmlwdG9yKCkgeworICAgIHN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0YXRpY1N0cmluZzE2IERFU0NJUFRPUiAodSJhbmRyb2lkLmFpZGwudGVzdHMuZXh0ZW5zaW9uLk15RXh0TGlrZSIpOworICAgIHJldHVybiBERVNDSVBUT1I7CisgIH0KKyAgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvczsKKyAgICBvcyA8PCAiTXlFeHRMaWtleyI7CisgICAgb3MgPDwgImE6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoYSk7CisgICAgb3MgPDwgIiwgYjogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhiKTsKKyAgICBvcyA8PCAifSI7CisgICAgcmV0dXJuIG9zLnN0cigpOworICB9Cit9OyAgLy8gY2xhc3MgTXlFeHRMaWtlCit9ICAvLyBuYW1lc3BhY2UgZXh0ZW5zaW9uCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9CbkRlZXBseU5lc3RlZC5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9CbkRlZXBseU5lc3RlZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNzJhYTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0JuRGVlcGx5TmVzdGVkLmgKQEAgLTAsMCArMSBAQAorI2Vycm9yIFRPRE8oYi8xMTEzNjI1OTMpIHBhcmNlbGFibGVzIGRvIG5vdCBoYXZlIGJuIGNsYXNzZXMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0JuTmVzdGVkU2VydmljZS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9Cbk5lc3RlZFNlcnZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODc4YWYwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9Cbk5lc3RlZFNlcnZpY2UuaApAQCAtMCwwICsxLDM0IEBACisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9JTmVzdGVkU2VydmljZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworbmFtZXNwYWNlIG5lc3RlZCB7CitjbGFzcyBCbk5lc3RlZFNlcnZpY2UgOiBwdWJsaWMgOjphbmRyb2lkOjpCbkludGVyZmFjZTxJTmVzdGVkU2VydmljZT4geworcHVibGljOgorICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX2ZsaXBTdGF0dXMgPSA6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAwOworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX2ZsaXBTdGF0dXNXaXRoQ2FsbGJhY2sgPSA6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAxOworICBleHBsaWNpdCBCbk5lc3RlZFNlcnZpY2UoKTsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBvblRyYW5zYWN0KHVpbnQzMl90IF9haWRsX2NvZGUsIGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsJiBfYWlkbF9kYXRhLCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcmVwbHksIHVpbnQzMl90IF9haWRsX2ZsYWdzKSBvdmVycmlkZTsKK307ICAvLyBjbGFzcyBCbk5lc3RlZFNlcnZpY2UKKworY2xhc3MgSU5lc3RlZFNlcnZpY2VEZWxlZ2F0b3IgOiBwdWJsaWMgQm5OZXN0ZWRTZXJ2aWNlIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgSU5lc3RlZFNlcnZpY2VEZWxlZ2F0b3IoOjphbmRyb2lkOjpzcDxJTmVzdGVkU2VydmljZT4gJmltcGwpIDogX2FpZGxfZGVsZWdhdGUoaW1wbCkge30KKworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIGZsaXBTdGF0dXMoY29uc3QgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpQYXJjZWxhYmxlV2l0aE5lc3RlZCYgcCwgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpJTmVzdGVkU2VydmljZTo6UmVzdWx0KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPmZsaXBTdGF0dXMocCwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIGZsaXBTdGF0dXNXaXRoQ2FsbGJhY2soOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpQYXJjZWxhYmxlV2l0aE5lc3RlZDo6U3RhdHVzIHN0YXR1cywgY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OklOZXN0ZWRTZXJ2aWNlOjpJQ2FsbGJhY2s+JiBjYikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+ZmxpcFN0YXR1c1dpdGhDYWxsYmFjayhzdGF0dXMsIGNiKTsKKyAgfQorcHJpdmF0ZToKKyAgOjphbmRyb2lkOjpzcDxJTmVzdGVkU2VydmljZT4gX2FpZGxfZGVsZWdhdGU7Cit9OyAgLy8gY2xhc3MgSU5lc3RlZFNlcnZpY2VEZWxlZ2F0b3IKK30gIC8vIG5hbWVzcGFjZSBuZXN0ZWQKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0JuUGFyY2VsYWJsZVdpdGhOZXN0ZWQuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvQm5QYXJjZWxhYmxlV2l0aE5lc3RlZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNzJhYTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0JuUGFyY2VsYWJsZVdpdGhOZXN0ZWQuaApAQCAtMCwwICsxIEBACisjZXJyb3IgVE9ETyhiLzExMTM2MjU5MykgcGFyY2VsYWJsZXMgZG8gbm90IGhhdmUgYm4gY2xhc3NlcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvQnBEZWVwbHlOZXN0ZWQuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvQnBEZWVwbHlOZXN0ZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2FmNmIxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9CcERlZXBseU5lc3RlZC5oCkBAIC0wLDAgKzEgQEAKKyNlcnJvciBUT0RPKGIvMTExMzYyNTkzKSBwYXJjZWxhYmxlcyBkbyBub3QgaGF2ZSBicCBjbGFzc2VzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9CcE5lc3RlZFNlcnZpY2UuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvQnBOZXN0ZWRTZXJ2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU2OWE0MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvQnBOZXN0ZWRTZXJ2aWNlLmgKQEAgLTAsMCArMSwyMiBAQAorI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxiaW5kZXIvSUJpbmRlci5oPgorI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9JTmVzdGVkU2VydmljZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworbmFtZXNwYWNlIG5lc3RlZCB7CitjbGFzcyBCcE5lc3RlZFNlcnZpY2UgOiBwdWJsaWMgOjphbmRyb2lkOjpCcEludGVyZmFjZTxJTmVzdGVkU2VydmljZT4geworcHVibGljOgorICBleHBsaWNpdCBCcE5lc3RlZFNlcnZpY2UoY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+JiBfYWlkbF9pbXBsKTsKKyAgdmlydHVhbCB+QnBOZXN0ZWRTZXJ2aWNlKCkgPSBkZWZhdWx0OworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIGZsaXBTdGF0dXMoY29uc3QgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpQYXJjZWxhYmxlV2l0aE5lc3RlZCYgcCwgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpJTmVzdGVkU2VydmljZTo6UmVzdWx0KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIGZsaXBTdGF0dXNXaXRoQ2FsbGJhY2soOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpQYXJjZWxhYmxlV2l0aE5lc3RlZDo6U3RhdHVzIHN0YXR1cywgY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OklOZXN0ZWRTZXJ2aWNlOjpJQ2FsbGJhY2s+JiBjYikgb3ZlcnJpZGU7Cit9OyAgLy8gY2xhc3MgQnBOZXN0ZWRTZXJ2aWNlCit9ICAvLyBuYW1lc3BhY2UgbmVzdGVkCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9CcFBhcmNlbGFibGVXaXRoTmVzdGVkLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0JwUGFyY2VsYWJsZVdpdGhOZXN0ZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2FmNmIxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9CcFBhcmNlbGFibGVXaXRoTmVzdGVkLmgKQEAgLTAsMCArMSBAQAorI2Vycm9yIFRPRE8oYi8xMTEzNjI1OTMpIHBhcmNlbGFibGVzIGRvIG5vdCBoYXZlIGJwIGNsYXNzZXMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0RlZXBseU5lc3RlZC5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9EZWVwbHlOZXN0ZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTI4MGI0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9EZWVwbHlOZXN0ZWQuaApAQCAtMCwwICsxLDIyMyBAQAorI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0RlZXBseU5lc3RlZC5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3RvX3N0cmluZy5oPgorI2luY2x1ZGUgPGFycmF5PgorI2luY2x1ZGUgPGJpbmRlci9FbnVtcy5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxiaW5kZXIvU3RhdHVzLmg+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dHVwbGU+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK25hbWVzcGFjZSBuZXN0ZWQgeworY2xhc3MgRGVlcGx5TmVzdGVkIDogcHVibGljIDo6YW5kcm9pZDo6UGFyY2VsYWJsZSB7CitwdWJsaWM6CisgIGNsYXNzIEIgOiBwdWJsaWMgOjphbmRyb2lkOjpQYXJjZWxhYmxlIHsKKyAgcHVibGljOgorICAgIGNsYXNzIEMgOiBwdWJsaWMgOjphbmRyb2lkOjpQYXJjZWxhYmxlIHsKKyAgICBwdWJsaWM6CisgICAgICBjbGFzcyBEIDogcHVibGljIDo6YW5kcm9pZDo6UGFyY2VsYWJsZSB7CisgICAgICBwdWJsaWM6CisgICAgICAgIGVudW0gY2xhc3MgRSA6IGludDhfdCB7CisgICAgICAgICAgT0sgPSAwLAorICAgICAgICB9OworICAgICAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEQmKSBjb25zdCB7CisgICAgICAgICAgcmV0dXJuIHN0ZDo6dGllKCkgIT0gc3RkOjp0aWUoKTsKKyAgICAgICAgfQorICAgICAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgRCYpIGNvbnN0IHsKKyAgICAgICAgICByZXR1cm4gc3RkOjp0aWUoKSA8IHN0ZDo6dGllKCk7CisgICAgICAgIH0KKyAgICAgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBEJikgY29uc3QgeworICAgICAgICAgIHJldHVybiBzdGQ6OnRpZSgpIDw9IHN0ZDo6dGllKCk7CisgICAgICAgIH0KKyAgICAgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBEJikgY29uc3QgeworICAgICAgICAgIHJldHVybiBzdGQ6OnRpZSgpID09IHN0ZDo6dGllKCk7CisgICAgICAgIH0KKyAgICAgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IEQmKSBjb25zdCB7CisgICAgICAgICAgcmV0dXJuIHN0ZDo6dGllKCkgPiBzdGQ6OnRpZSgpOworICAgICAgICB9CisgICAgICAgIGlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgRCYpIGNvbnN0IHsKKyAgICAgICAgICByZXR1cm4gc3RkOjp0aWUoKSA+PSBzdGQ6OnRpZSgpOworICAgICAgICB9CisKKyAgICAgICAgOjphbmRyb2lkOjpzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBmaW5hbDsKKyAgICAgICAgOjphbmRyb2lkOjpzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IGZpbmFsOworICAgICAgICBzdGF0aWMgY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiYgZ2V0UGFyY2VsYWJsZURlc2NyaXB0b3IoKSB7CisgICAgICAgICAgc3RhdGljIGNvbnN0IDo6YW5kcm9pZDo6U3RhdGljU3RyaW5nMTYgREVTQ0lQVE9SICh1ImFuZHJvaWQuYWlkbC50ZXN0cy5uZXN0ZWQuRGVlcGx5TmVzdGVkLkIuQy5EIik7CisgICAgICAgICAgcmV0dXJuIERFU0NJUFRPUjsKKyAgICAgICAgfQorICAgICAgICBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOworICAgICAgICAgIG9zIDw8ICJEeyI7CisgICAgICAgICAgb3MgPDwgIn0iOworICAgICAgICAgIHJldHVybiBvcy5zdHIoKTsKKyAgICAgICAgfQorICAgICAgfTsgIC8vIGNsYXNzIEQKKyAgICAgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgQyYpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6dGllKCkgIT0gc3RkOjp0aWUoKTsKKyAgICAgIH0KKyAgICAgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBDJikgY29uc3QgeworICAgICAgICByZXR1cm4gc3RkOjp0aWUoKSA8IHN0ZDo6dGllKCk7CisgICAgICB9CisgICAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IEMmKSBjb25zdCB7CisgICAgICAgIHJldHVybiBzdGQ6OnRpZSgpIDw9IHN0ZDo6dGllKCk7CisgICAgICB9CisgICAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEMmKSBjb25zdCB7CisgICAgICAgIHJldHVybiBzdGQ6OnRpZSgpID09IHN0ZDo6dGllKCk7CisgICAgICB9CisgICAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgQyYpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6dGllKCkgPiBzdGQ6OnRpZSgpOworICAgICAgfQorICAgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBDJikgY29uc3QgeworICAgICAgICByZXR1cm4gc3RkOjp0aWUoKSA+PSBzdGQ6OnRpZSgpOworICAgICAgfQorCisgICAgICA6OmFuZHJvaWQ6OnN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGZpbmFsOworICAgICAgOjphbmRyb2lkOjpzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IGZpbmFsOworICAgICAgc3RhdGljIGNvbnN0IDo6YW5kcm9pZDo6U3RyaW5nMTYmIGdldFBhcmNlbGFibGVEZXNjcmlwdG9yKCkgeworICAgICAgICBzdGF0aWMgY29uc3QgOjphbmRyb2lkOjpTdGF0aWNTdHJpbmcxNiBERVNDSVBUT1IgKHUiYW5kcm9pZC5haWRsLnRlc3RzLm5lc3RlZC5EZWVwbHlOZXN0ZWQuQi5DIik7CisgICAgICAgIHJldHVybiBERVNDSVBUT1I7CisgICAgICB9CisgICAgICBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvczsKKyAgICAgICAgb3MgPDwgIkN7IjsKKyAgICAgICAgb3MgPDwgIn0iOworICAgICAgICByZXR1cm4gb3Muc3RyKCk7CisgICAgICB9CisgICAgfTsgIC8vIGNsYXNzIEMKKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEImKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoKSAhPSBzdGQ6OnRpZSgpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgQiYpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZSgpIDwgc3RkOjp0aWUoKTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBCJikgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKCkgPD0gc3RkOjp0aWUoKTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBCJikgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKCkgPT0gc3RkOjp0aWUoKTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IEImKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoKSA+IHN0ZDo6dGllKCk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgQiYpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZSgpID49IHN0ZDo6dGllKCk7CisgICAgfQorCisgICAgOjphbmRyb2lkOjpzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBmaW5hbDsKKyAgICA6OmFuZHJvaWQ6OnN0YXR1c190IHdyaXRlVG9QYXJjZWwoOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgZmluYWw7CisgICAgc3RhdGljIGNvbnN0IDo6YW5kcm9pZDo6U3RyaW5nMTYmIGdldFBhcmNlbGFibGVEZXNjcmlwdG9yKCkgeworICAgICAgc3RhdGljIGNvbnN0IDo6YW5kcm9pZDo6U3RhdGljU3RyaW5nMTYgREVTQ0lQVE9SICh1ImFuZHJvaWQuYWlkbC50ZXN0cy5uZXN0ZWQuRGVlcGx5TmVzdGVkLkIiKTsKKyAgICAgIHJldHVybiBERVNDSVBUT1I7CisgICAgfQorICAgIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsKKyAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvczsKKyAgICAgIG9zIDw8ICJCeyI7CisgICAgICBvcyA8PCAifSI7CisgICAgICByZXR1cm4gb3Muc3RyKCk7CisgICAgfQorICB9OyAgLy8gY2xhc3MgQgorICBjbGFzcyBBIDogcHVibGljIDo6YW5kcm9pZDo6UGFyY2VsYWJsZSB7CisgIHB1YmxpYzoKKyAgICA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OkRlZXBseU5lc3RlZDo6Qjo6Qzo6RDo6RSBlID0gOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpEZWVwbHlOZXN0ZWQ6OkI6OkM6OkQ6OkU6Ok9LOworICAgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgQSYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoZSkgIT0gc3RkOjp0aWUocmhzLmUpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgQSYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoZSkgPCBzdGQ6OnRpZShyaHMuZSk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgQSYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoZSkgPD0gc3RkOjp0aWUocmhzLmUpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEEmIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKGUpID09IHN0ZDo6dGllKHJocy5lKTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IEEmIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKGUpID4gc3RkOjp0aWUocmhzLmUpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IEEmIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKGUpID49IHN0ZDo6dGllKHJocy5lKTsKKyAgICB9CisKKyAgICA6OmFuZHJvaWQ6OnN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGZpbmFsOworICAgIDo6YW5kcm9pZDo6c3RhdHVzX3Qgd3JpdGVUb1BhcmNlbCg6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCBmaW5hbDsKKyAgICBzdGF0aWMgY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiYgZ2V0UGFyY2VsYWJsZURlc2NyaXB0b3IoKSB7CisgICAgICBzdGF0aWMgY29uc3QgOjphbmRyb2lkOjpTdGF0aWNTdHJpbmcxNiBERVNDSVBUT1IgKHUiYW5kcm9pZC5haWRsLnRlc3RzLm5lc3RlZC5EZWVwbHlOZXN0ZWQuQSIpOworICAgICAgcmV0dXJuIERFU0NJUFRPUjsKKyAgICB9CisgICAgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOworICAgICAgb3MgPDwgIkF7IjsKKyAgICAgIG9zIDw8ICJlOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGUpOworICAgICAgb3MgPDwgIn0iOworICAgICAgcmV0dXJuIG9zLnN0cigpOworICAgIH0KKyAgfTsgIC8vIGNsYXNzIEEKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBEZWVwbHlOZXN0ZWQmKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKCkgIT0gc3RkOjp0aWUoKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgRGVlcGx5TmVzdGVkJikgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZSgpIDwgc3RkOjp0aWUoKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IERlZXBseU5lc3RlZCYpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoKSA8PSBzdGQ6OnRpZSgpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgRGVlcGx5TmVzdGVkJikgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZSgpID09IHN0ZDo6dGllKCk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IERlZXBseU5lc3RlZCYpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoKSA+IHN0ZDo6dGllKCk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBEZWVwbHlOZXN0ZWQmKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKCkgPj0gc3RkOjp0aWUoKTsKKyAgfQorCisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgZmluYWw7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3Qgd3JpdGVUb1BhcmNlbCg6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCBmaW5hbDsKKyAgc3RhdGljIGNvbnN0IDo6YW5kcm9pZDo6U3RyaW5nMTYmIGdldFBhcmNlbGFibGVEZXNjcmlwdG9yKCkgeworICAgIHN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0YXRpY1N0cmluZzE2IERFU0NJUFRPUiAodSJhbmRyb2lkLmFpZGwudGVzdHMubmVzdGVkLkRlZXBseU5lc3RlZCIpOworICAgIHJldHVybiBERVNDSVBUT1I7CisgIH0KKyAgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvczsKKyAgICBvcyA8PCAiRGVlcGx5TmVzdGVkeyI7CisgICAgb3MgPDwgIn0iOworICAgIHJldHVybiBvcy5zdHIoKTsKKyAgfQorfTsgIC8vIGNsYXNzIERlZXBseU5lc3RlZAorfSAgLy8gbmFtZXNwYWNlIG5lc3RlZAorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CituYW1lc3BhY2UgbmVzdGVkIHsKK1tbbm9kaXNjYXJkXV0gc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZyhEZWVwbHlOZXN0ZWQ6OkI6OkM6OkQ6OkUgdmFsKSB7CisgIHN3aXRjaCh2YWwpIHsKKyAgY2FzZSBEZWVwbHlOZXN0ZWQ6OkI6OkM6OkQ6OkU6Ok9LOgorICAgIHJldHVybiAiT0siOworICBkZWZhdWx0OgorICAgIHJldHVybiBzdGQ6OnRvX3N0cmluZyhzdGF0aWNfY2FzdDxpbnQ4X3Q+KHZhbCkpOworICB9Cit9Cit9ICAvLyBuYW1lc3BhY2UgbmVzdGVkCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGludGVybmFsIHsKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdjKysxNy1leHRlbnNpb25zIgordGVtcGxhdGUgPD4KK2NvbnN0ZXhwciBpbmxpbmUgc3RkOjphcnJheTw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OkRlZXBseU5lc3RlZDo6Qjo6Qzo6RDo6RSwgMT4gZW51bV92YWx1ZXM8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpEZWVwbHlOZXN0ZWQ6OkI6OkM6OkQ6OkU+ID0geworICA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OkRlZXBseU5lc3RlZDo6Qjo6Qzo6RDo6RTo6T0ssCit9OworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAorfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9JTmVzdGVkU2VydmljZS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9JTmVzdGVkU2VydmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhYjcyNjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0lOZXN0ZWRTZXJ2aWNlLmgKQEAgLTAsMCArMSwxMTQgQEAKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9JTmVzdGVkU2VydmljZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvUGFyY2VsYWJsZVdpdGhOZXN0ZWQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl90b19zdHJpbmcuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSUJpbmRlci5oPgorI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGJpbmRlci9TdGF0dXMuaD4KKyNpbmNsdWRlIDx0dXBsZT4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK25hbWVzcGFjZSBuZXN0ZWQgeworY2xhc3MgSU5lc3RlZFNlcnZpY2UgOiBwdWJsaWMgOjphbmRyb2lkOjpJSW50ZXJmYWNlIHsKK3B1YmxpYzoKKyAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShOZXN0ZWRTZXJ2aWNlKQorICBjbGFzcyBSZXN1bHQgOiBwdWJsaWMgOjphbmRyb2lkOjpQYXJjZWxhYmxlIHsKKyAgcHVibGljOgorICAgIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6UGFyY2VsYWJsZVdpdGhOZXN0ZWQ6OlN0YXR1cyBzdGF0dXMgPSA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OlBhcmNlbGFibGVXaXRoTmVzdGVkOjpTdGF0dXM6Ok9LOworICAgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgUmVzdWx0JiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZShzdGF0dXMpICE9IHN0ZDo6dGllKHJocy5zdGF0dXMpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgUmVzdWx0JiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZShzdGF0dXMpIDwgc3RkOjp0aWUocmhzLnN0YXR1cyk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgUmVzdWx0JiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZShzdGF0dXMpIDw9IHN0ZDo6dGllKHJocy5zdGF0dXMpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFJlc3VsdCYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoc3RhdHVzKSA9PSBzdGQ6OnRpZShyaHMuc3RhdHVzKTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IFJlc3VsdCYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoc3RhdHVzKSA+IHN0ZDo6dGllKHJocy5zdGF0dXMpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IFJlc3VsdCYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoc3RhdHVzKSA+PSBzdGQ6OnRpZShyaHMuc3RhdHVzKTsKKyAgICB9CisKKyAgICA6OmFuZHJvaWQ6OnN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGZpbmFsOworICAgIDo6YW5kcm9pZDo6c3RhdHVzX3Qgd3JpdGVUb1BhcmNlbCg6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCBmaW5hbDsKKyAgICBzdGF0aWMgY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiYgZ2V0UGFyY2VsYWJsZURlc2NyaXB0b3IoKSB7CisgICAgICBzdGF0aWMgY29uc3QgOjphbmRyb2lkOjpTdGF0aWNTdHJpbmcxNiBERVNDSVBUT1IgKHUiYW5kcm9pZC5haWRsLnRlc3RzLm5lc3RlZC5JTmVzdGVkU2VydmljZS5SZXN1bHQiKTsKKyAgICAgIHJldHVybiBERVNDSVBUT1I7CisgICAgfQorICAgIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsKKyAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvczsKKyAgICAgIG9zIDw8ICJSZXN1bHR7IjsKKyAgICAgIG9zIDw8ICJzdGF0dXM6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoc3RhdHVzKTsKKyAgICAgIG9zIDw8ICJ9IjsKKyAgICAgIHJldHVybiBvcy5zdHIoKTsKKyAgICB9CisgIH07ICAvLyBjbGFzcyBSZXN1bHQKKyAgY2xhc3MgSUNhbGxiYWNrIDogcHVibGljIDo6YW5kcm9pZDo6SUludGVyZmFjZSB7CisgIHB1YmxpYzoKKyAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKENhbGxiYWNrKQorICAgIHZpcnR1YWwgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBkb25lKDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6UGFyY2VsYWJsZVdpdGhOZXN0ZWQ6OlN0YXR1cyBzdGF0dXMpID0gMDsKKyAgfTsgIC8vIGNsYXNzIElDYWxsYmFjaworCisgIGNsYXNzIElDYWxsYmFja0RlZmF1bHQgOiBwdWJsaWMgSUNhbGxiYWNrIHsKKyAgcHVibGljOgorICAgIDo6YW5kcm9pZDo6SUJpbmRlciogb25Bc0JpbmRlcigpIG92ZXJyaWRlIHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIGRvbmUoOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpQYXJjZWxhYmxlV2l0aE5lc3RlZDo6U3RhdHVzIC8qc3RhdHVzKi8pIG92ZXJyaWRlIHsKKyAgICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOworICAgIH0KKyAgfTsgIC8vIGNsYXNzIElDYWxsYmFja0RlZmF1bHQKKyAgY2xhc3MgQnBDYWxsYmFjayA6IHB1YmxpYyA6OmFuZHJvaWQ6OkJwSW50ZXJmYWNlPElDYWxsYmFjaz4geworICBwdWJsaWM6CisgICAgZXhwbGljaXQgQnBDYWxsYmFjayhjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4mIF9haWRsX2ltcGwpOworICAgIHZpcnR1YWwgfkJwQ2FsbGJhY2soKSA9IGRlZmF1bHQ7CisgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBkb25lKDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6UGFyY2VsYWJsZVdpdGhOZXN0ZWQ6OlN0YXR1cyBzdGF0dXMpIG92ZXJyaWRlOworICB9OyAgLy8gY2xhc3MgQnBDYWxsYmFjaworICBjbGFzcyBCbkNhbGxiYWNrIDogcHVibGljIDo6YW5kcm9pZDo6Qm5JbnRlcmZhY2U8SUNhbGxiYWNrPiB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX2RvbmUgPSA6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAwOworICAgIGV4cGxpY2l0IEJuQ2FsbGJhY2soKTsKKyAgICA6OmFuZHJvaWQ6OnN0YXR1c190IG9uVHJhbnNhY3QodWludDMyX3QgX2FpZGxfY29kZSwgY29uc3QgOjphbmRyb2lkOjpQYXJjZWwmIF9haWRsX2RhdGEsIDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9yZXBseSwgdWludDMyX3QgX2FpZGxfZmxhZ3MpIG92ZXJyaWRlOworICB9OyAgLy8gY2xhc3MgQm5DYWxsYmFjaworCisgIGNsYXNzIElDYWxsYmFja0RlbGVnYXRvciA6IHB1YmxpYyBCbkNhbGxiYWNrIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IElDYWxsYmFja0RlbGVnYXRvcig6OmFuZHJvaWQ6OnNwPElDYWxsYmFjaz4gJmltcGwpIDogX2FpZGxfZGVsZWdhdGUoaW1wbCkge30KKworICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgZG9uZSg6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OlBhcmNlbGFibGVXaXRoTmVzdGVkOjpTdGF0dXMgc3RhdHVzKSBvdmVycmlkZSB7CisgICAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPmRvbmUoc3RhdHVzKTsKKyAgICB9CisgIHByaXZhdGU6CisgICAgOjphbmRyb2lkOjpzcDxJQ2FsbGJhY2s+IF9haWRsX2RlbGVnYXRlOworICB9OyAgLy8gY2xhc3MgSUNhbGxiYWNrRGVsZWdhdG9yCisgIHZpcnR1YWwgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBmbGlwU3RhdHVzKGNvbnN0IDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6UGFyY2VsYWJsZVdpdGhOZXN0ZWQmIHAsIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6SU5lc3RlZFNlcnZpY2U6OlJlc3VsdCogX2FpZGxfcmV0dXJuKSA9IDA7CisgIHZpcnR1YWwgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBmbGlwU3RhdHVzV2l0aENhbGxiYWNrKDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6UGFyY2VsYWJsZVdpdGhOZXN0ZWQ6OlN0YXR1cyBzdGF0dXMsIGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpJTmVzdGVkU2VydmljZTo6SUNhbGxiYWNrPiYgY2IpID0gMDsKK307ICAvLyBjbGFzcyBJTmVzdGVkU2VydmljZQorCitjbGFzcyBJTmVzdGVkU2VydmljZURlZmF1bHQgOiBwdWJsaWMgSU5lc3RlZFNlcnZpY2UgeworcHVibGljOgorICA6OmFuZHJvaWQ6OklCaW5kZXIqIG9uQXNCaW5kZXIoKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBmbGlwU3RhdHVzKGNvbnN0IDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6UGFyY2VsYWJsZVdpdGhOZXN0ZWQmIC8qcCovLCA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OklOZXN0ZWRTZXJ2aWNlOjpSZXN1bHQqIC8qX2FpZGxfcmV0dXJuKi8pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIGZsaXBTdGF0dXNXaXRoQ2FsbGJhY2soOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpQYXJjZWxhYmxlV2l0aE5lc3RlZDo6U3RhdHVzIC8qc3RhdHVzKi8sIGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpJTmVzdGVkU2VydmljZTo6SUNhbGxiYWNrPiYgLypjYiovKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTik7CisgIH0KK307ICAvLyBjbGFzcyBJTmVzdGVkU2VydmljZURlZmF1bHQKK30gIC8vIG5hbWVzcGFjZSBuZXN0ZWQKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL1BhcmNlbGFibGVXaXRoTmVzdGVkLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL1BhcmNlbGFibGVXaXRoTmVzdGVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZhM2M0ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvUGFyY2VsYWJsZVdpdGhOZXN0ZWQuaApAQCAtMCwwICsxLDkxIEBACisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvUGFyY2VsYWJsZVdpdGhOZXN0ZWQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl90b19zdHJpbmcuaD4KKyNpbmNsdWRlIDxhcnJheT4KKyNpbmNsdWRlIDxiaW5kZXIvRW51bXMuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8YmluZGVyL1N0YXR1cy5oPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHR1cGxlPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CituYW1lc3BhY2UgbmVzdGVkIHsKK2NsYXNzIFBhcmNlbGFibGVXaXRoTmVzdGVkIDogcHVibGljIDo6YW5kcm9pZDo6UGFyY2VsYWJsZSB7CitwdWJsaWM6CisgIGVudW0gY2xhc3MgU3RhdHVzIDogaW50OF90IHsKKyAgICBPSyA9IDAsCisgICAgTk9UX09LID0gMSwKKyAgfTsKKyAgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpQYXJjZWxhYmxlV2l0aE5lc3RlZDo6U3RhdHVzIHN0YXR1cyA9IDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6UGFyY2VsYWJsZVdpdGhOZXN0ZWQ6OlN0YXR1czo6T0s7CisgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgUGFyY2VsYWJsZVdpdGhOZXN0ZWQmIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZShzdGF0dXMpICE9IHN0ZDo6dGllKHJocy5zdGF0dXMpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBQYXJjZWxhYmxlV2l0aE5lc3RlZCYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKHN0YXR1cykgPCBzdGQ6OnRpZShyaHMuc3RhdHVzKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IFBhcmNlbGFibGVXaXRoTmVzdGVkJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoc3RhdHVzKSA8PSBzdGQ6OnRpZShyaHMuc3RhdHVzKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFBhcmNlbGFibGVXaXRoTmVzdGVkJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoc3RhdHVzKSA9PSBzdGQ6OnRpZShyaHMuc3RhdHVzKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgUGFyY2VsYWJsZVdpdGhOZXN0ZWQmIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZShzdGF0dXMpID4gc3RkOjp0aWUocmhzLnN0YXR1cyk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBQYXJjZWxhYmxlV2l0aE5lc3RlZCYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKHN0YXR1cykgPj0gc3RkOjp0aWUocmhzLnN0YXR1cyk7CisgIH0KKworICA6OmFuZHJvaWQ6OnN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGZpbmFsOworICA6OmFuZHJvaWQ6OnN0YXR1c190IHdyaXRlVG9QYXJjZWwoOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgZmluYWw7CisgIHN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiBnZXRQYXJjZWxhYmxlRGVzY3JpcHRvcigpIHsKKyAgICBzdGF0aWMgY29uc3QgOjphbmRyb2lkOjpTdGF0aWNTdHJpbmcxNiBERVNDSVBUT1IgKHUiYW5kcm9pZC5haWRsLnRlc3RzLm5lc3RlZC5QYXJjZWxhYmxlV2l0aE5lc3RlZCIpOworICAgIHJldHVybiBERVNDSVBUT1I7CisgIH0KKyAgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvczsKKyAgICBvcyA8PCAiUGFyY2VsYWJsZVdpdGhOZXN0ZWR7IjsKKyAgICBvcyA8PCAic3RhdHVzOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKHN0YXR1cyk7CisgICAgb3MgPDwgIn0iOworICAgIHJldHVybiBvcy5zdHIoKTsKKyAgfQorfTsgIC8vIGNsYXNzIFBhcmNlbGFibGVXaXRoTmVzdGVkCit9ICAvLyBuYW1lc3BhY2UgbmVzdGVkCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK25hbWVzcGFjZSBuZXN0ZWQgeworW1tub2Rpc2NhcmRdXSBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKFBhcmNlbGFibGVXaXRoTmVzdGVkOjpTdGF0dXMgdmFsKSB7CisgIHN3aXRjaCh2YWwpIHsKKyAgY2FzZSBQYXJjZWxhYmxlV2l0aE5lc3RlZDo6U3RhdHVzOjpPSzoKKyAgICByZXR1cm4gIk9LIjsKKyAgY2FzZSBQYXJjZWxhYmxlV2l0aE5lc3RlZDo6U3RhdHVzOjpOT1RfT0s6CisgICAgcmV0dXJuICJOT1RfT0siOworICBkZWZhdWx0OgorICAgIHJldHVybiBzdGQ6OnRvX3N0cmluZyhzdGF0aWNfY2FzdDxpbnQ4X3Q+KHZhbCkpOworICB9Cit9Cit9ICAvLyBuYW1lc3BhY2UgbmVzdGVkCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGludGVybmFsIHsKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdjKysxNy1leHRlbnNpb25zIgordGVtcGxhdGUgPD4KK2NvbnN0ZXhwciBpbmxpbmUgc3RkOjphcnJheTw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OlBhcmNlbGFibGVXaXRoTmVzdGVkOjpTdGF0dXMsIDI+IGVudW1fdmFsdWVzPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6UGFyY2VsYWJsZVdpdGhOZXN0ZWQ6OlN0YXR1cz4gPSB7CisgIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6UGFyY2VsYWJsZVdpdGhOZXN0ZWQ6OlN0YXR1czo6T0ssCisgIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6UGFyY2VsYWJsZVdpdGhOZXN0ZWQ6OlN0YXR1czo6Tk9UX09LLAorfTsKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvRW51bVVuaW9uLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL0VudW1Vbmlvbi5oCmluZGV4IDNkZjdkZTIuLjdhNDFiMjAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvRW51bVVuaW9uLmgKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9FbnVtVW5pb24uaApAQCAtMyw5ICszLDEzIEBACiAjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL0ludEVudW0uaD4KICNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvTG9uZ0VudW0uaD4KICNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl90b19zdHJpbmcuaD4KKyNpbmNsdWRlIDxhcnJheT4KKyNpbmNsdWRlIDxiaW5kZXIvRW51bXMuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAjaW5jbHVkZSA8YmluZGVyL1N0YXR1cy5oPgogI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dHlwZV90cmFpdHM+CiAjaW5jbHVkZSA8dXRpbGl0eT4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgpAQCAtMTYsMTUgKzIwLDY2IEBACiAjZW5kaWYKIAogbmFtZXNwYWNlIGFuZHJvaWQgewotCiBuYW1lc3BhY2UgYWlkbCB7Ci0KIG5hbWVzcGFjZSB0ZXN0cyB7Ci0KIG5hbWVzcGFjZSB1bmlvbnMgewotCiBjbGFzcyBFbnVtVW5pb24gOiBwdWJsaWMgOjphbmRyb2lkOjpQYXJjZWxhYmxlIHsKIHB1YmxpYzoKKyAgZW51bSBjbGFzcyBUYWcgOiBpbnQzMl90IHsKKyAgICBpbnRFbnVtID0gMCwKKyAgICBsb25nRW51bSA9IDEsCisgICAgZGVwcmVjYXRlZEZpZWxkIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQoImRvIG5vdCB1c2UgdGhpcyIpKSkgPSAyLAorICB9OworICAvLyBFeHBvc2UgdGFnIHN5bWJvbHMgZm9yIGxlZ2FjeSBjb2RlCisgIHN0YXRpYyBjb25zdCBpbmxpbmUgVGFnIGludEVudW0gPSBUYWc6OmludEVudW07CisgIHN0YXRpYyBjb25zdCBpbmxpbmUgVGFnIGxvbmdFbnVtID0gVGFnOjpsb25nRW51bTsKKyAgc3RhdGljIGNvbnN0IGlubGluZSBUYWcgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCgiZG8gbm90IHVzZSB0aGlzIikpKSBkZXByZWNhdGVkRmllbGQgPSBUYWc6OmRlcHJlY2F0ZWRGaWVsZDsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBfbm90X3NlbGYgPSAhc3RkOjppc19zYW1lX3Y8c3RkOjpyZW1vdmVfY3ZfdDxzdGQ6OnJlbW92ZV9yZWZlcmVuY2VfdDxfVHA+PiwgRW51bVVuaW9uPjsKKworICBFbnVtVW5pb24oKSA6IF92YWx1ZShzdGQ6OmluX3BsYWNlX2luZGV4PHN0YXRpY19jYXN0PHNpemVfdD4oaW50RW51bSk+LCA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtKDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW06OkZPTykpIHsgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lID0gc3RkOjplbmFibGVfaWZfdDxfbm90X3NlbGY8X1RwPj4+CisgIC8vIE5PTElOVE5FWFRMSU5FKGdvb2dsZS1leHBsaWNpdC1jb25zdHJ1Y3RvcikKKyAgY29uc3RleHByIEVudW1VbmlvbihfVHAmJiBfYXJnKQorICAgICAgOiBfdmFsdWUoc3RkOjpmb3J3YXJkPF9UcD4oX2FyZykpIHt9CisKKyAgdGVtcGxhdGUgPHNpemVfdCBfTnAsIHR5cGVuYW1lLi4uIF9UcD4KKyAgY29uc3RleHByIGV4cGxpY2l0IEVudW1VbmlvbihzdGQ6OmluX3BsYWNlX2luZGV4X3Q8X05wPiwgX1RwJiYuLi4gX2FyZ3MpCisgICAgICA6IF92YWx1ZShzdGQ6OmluX3BsYWNlX2luZGV4PF9OcD4sIHN0ZDo6Zm9yd2FyZDxfVHA+KF9hcmdzKS4uLikge30KKworICB0ZW1wbGF0ZSA8VGFnIF90YWcsIHR5cGVuYW1lLi4uIF9UcD4KKyAgc3RhdGljIEVudW1VbmlvbiBtYWtlKF9UcCYmLi4uIF9hcmdzKSB7CisgICAgcmV0dXJuIEVudW1VbmlvbihzdGQ6OmluX3BsYWNlX2luZGV4PHN0YXRpY19jYXN0PHNpemVfdD4oX3RhZyk+LCBzdGQ6OmZvcndhcmQ8X1RwPihfYXJncykuLi4pOworICB9CisKKyAgdGVtcGxhdGUgPFRhZyBfdGFnLCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lLi4uIF9VcD4KKyAgc3RhdGljIEVudW1VbmlvbiBtYWtlKHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxfVHA+IF9pbCwgX1VwJiYuLi4gX2FyZ3MpIHsKKyAgICByZXR1cm4gRW51bVVuaW9uKHN0ZDo6aW5fcGxhY2VfaW5kZXg8c3RhdGljX2Nhc3Q8c2l6ZV90PihfdGFnKT4sIHN0ZDo6bW92ZShfaWwpLCBzdGQ6OmZvcndhcmQ8X1VwPihfYXJncykuLi4pOworICB9CisKKyAgVGFnIGdldFRhZygpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VGFnPihfdmFsdWUuaW5kZXgoKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8VGFnIF90YWc+CisgIGNvbnN0IGF1dG8mIGdldCgpIGNvbnN0IHsKKyAgICBpZiAoZ2V0VGFnKCkgIT0gX3RhZykgeyBfX2Fzc2VydDIoX19GSUxFX18sIF9fTElORV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fLCAiYmFkIGFjY2VzczogYSB3cm9uZyB0YWciKTsgfQorICAgIHJldHVybiBzdGQ6OmdldDxzdGF0aWNfY2FzdDxzaXplX3Q+KF90YWcpPihfdmFsdWUpOworICB9CisKKyAgdGVtcGxhdGUgPFRhZyBfdGFnPgorICBhdXRvJiBnZXQoKSB7CisgICAgaWYgKGdldFRhZygpICE9IF90YWcpIHsgX19hc3NlcnQyKF9fRklMRV9fLCBfX0xJTkVfXywgX19QUkVUVFlfRlVOQ1RJT05fXywgImJhZCBhY2Nlc3M6IGEgd3JvbmcgdGFnIik7IH0KKyAgICByZXR1cm4gc3RkOjpnZXQ8c3RhdGljX2Nhc3Q8c2l6ZV90PihfdGFnKT4oX3ZhbHVlKTsKKyAgfQorCisgIHRlbXBsYXRlIDxUYWcgX3RhZywgdHlwZW5hbWUuLi4gX1RwPgorICB2b2lkIHNldChfVHAmJi4uLiBfYXJncykgeworICAgIF92YWx1ZS5lbXBsYWNlPHN0YXRpY19jYXN0PHNpemVfdD4oX3RhZyk+KHN0ZDo6Zm9yd2FyZDxfVHA+KF9hcmdzKS4uLik7CisgIH0KKwogICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEVudW1VbmlvbiYgcmhzKSBjb25zdCB7CiAgICAgcmV0dXJuIF92YWx1ZSAhPSByaHMuX3ZhbHVlOwogICB9CkBAIC00NCw2MCArOTksNiBAQAogICAgIHJldHVybiBfdmFsdWUgPj0gcmhzLl92YWx1ZTsKICAgfQogCi0gIGVudW0gVGFnIDogaW50MzJfdCB7Ci0gICAgaW50RW51bSA9IDAsICAvLyBhbmRyb2lkLmFpZGwudGVzdHMuSW50RW51bSBpbnRFbnVtOwotICAgIGxvbmdFbnVtLCAgLy8gYW5kcm9pZC5haWRsLnRlc3RzLkxvbmdFbnVtIGxvbmdFbnVtOwotICB9OwotCi0gIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KLSAgc3RhdGljIGNvbnN0ZXhwciBib29sIF9ub3Rfc2VsZiA9ICFzdGQ6OmlzX3NhbWVfdjxzdGQ6OnJlbW92ZV9jdl90PHN0ZDo6cmVtb3ZlX3JlZmVyZW5jZV90PF9UcD4+LCBFbnVtVW5pb24+OwotCi0gIEVudW1VbmlvbigpIDogX3ZhbHVlKHN0ZDo6aW5fcGxhY2VfaW5kZXg8aW50RW51bT4sIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0oOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bTo6Rk9PKSkgeyB9Ci0gIEVudW1Vbmlvbihjb25zdCBFbnVtVW5pb24mKSA9IGRlZmF1bHQ7Ci0gIEVudW1VbmlvbihFbnVtVW5pb24mJikgPSBkZWZhdWx0OwotICBFbnVtVW5pb24mIG9wZXJhdG9yPShjb25zdCBFbnVtVW5pb24mKSA9IGRlZmF1bHQ7Ci0gIEVudW1VbmlvbiYgb3BlcmF0b3I9KEVudW1VbmlvbiYmKSA9IGRlZmF1bHQ7Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgPSBzdGQ6OmVuYWJsZV9pZl90PF9ub3Rfc2VsZjxfVHA+Pj4KLSAgLy8gTk9MSU5UTkVYVExJTkUoZ29vZ2xlLWV4cGxpY2l0LWNvbnN0cnVjdG9yKQotICBjb25zdGV4cHIgRW51bVVuaW9uKF9UcCYmIF9hcmcpCi0gICAgICA6IF92YWx1ZShzdGQ6OmZvcndhcmQ8X1RwPihfYXJnKSkge30KLQotICB0ZW1wbGF0ZSA8c2l6ZV90IF9OcCwgdHlwZW5hbWUuLi4gX1RwPgotICBjb25zdGV4cHIgZXhwbGljaXQgRW51bVVuaW9uKHN0ZDo6aW5fcGxhY2VfaW5kZXhfdDxfTnA+LCBfVHAmJi4uLiBfYXJncykKLSAgICAgIDogX3ZhbHVlKHN0ZDo6aW5fcGxhY2VfaW5kZXg8X05wPiwgc3RkOjpmb3J3YXJkPF9UcD4oX2FyZ3MpLi4uKSB7fQotCi0gIHRlbXBsYXRlIDxUYWcgX3RhZywgdHlwZW5hbWUuLi4gX1RwPgotICBzdGF0aWMgRW51bVVuaW9uIG1ha2UoX1RwJiYuLi4gX2FyZ3MpIHsKLSAgICByZXR1cm4gRW51bVVuaW9uKHN0ZDo6aW5fcGxhY2VfaW5kZXg8X3RhZz4sIHN0ZDo6Zm9yd2FyZDxfVHA+KF9hcmdzKS4uLik7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8VGFnIF90YWcsIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUuLi4gX1VwPgotICBzdGF0aWMgRW51bVVuaW9uIG1ha2Uoc3RkOjppbml0aWFsaXplcl9saXN0PF9UcD4gX2lsLCBfVXAmJi4uLiBfYXJncykgewotICAgIHJldHVybiBFbnVtVW5pb24oc3RkOjppbl9wbGFjZV9pbmRleDxfdGFnPiwgc3RkOjptb3ZlKF9pbCksIHN0ZDo6Zm9yd2FyZDxfVXA+KF9hcmdzKS4uLik7Ci0gIH0KLQotICBUYWcgZ2V0VGFnKCkgY29uc3QgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxUYWc+KF92YWx1ZS5pbmRleCgpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDxUYWcgX3RhZz4KLSAgY29uc3QgYXV0byYgZ2V0KCkgY29uc3QgewotICAgIGlmIChnZXRUYWcoKSAhPSBfdGFnKSB7IF9fYXNzZXJ0MihfX0ZJTEVfXywgX19MSU5FX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18sICJiYWQgYWNjZXNzOiBhIHdyb25nIHRhZyIpOyB9Ci0gICAgcmV0dXJuIHN0ZDo6Z2V0PF90YWc+KF92YWx1ZSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8VGFnIF90YWc+Ci0gIGF1dG8mIGdldCgpIHsKLSAgICBpZiAoZ2V0VGFnKCkgIT0gX3RhZykgeyBfX2Fzc2VydDIoX19GSUxFX18sIF9fTElORV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fLCAiYmFkIGFjY2VzczogYSB3cm9uZyB0YWciKTsgfQotICAgIHJldHVybiBzdGQ6OmdldDxfdGFnPihfdmFsdWUpOwotICB9Ci0KLSAgdGVtcGxhdGUgPFRhZyBfdGFnLCB0eXBlbmFtZS4uLiBfVHA+Ci0gIHZvaWQgc2V0KF9UcCYmLi4uIF9hcmdzKSB7Ci0gICAgX3ZhbHVlLmVtcGxhY2U8X3RhZz4oc3RkOjpmb3J3YXJkPF9UcD4oX2FyZ3MpLi4uKTsKLSAgfQotCiAgIDo6YW5kcm9pZDo6c3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgZmluYWw7CiAgIDo6YW5kcm9pZDo6c3RhdHVzX3Qgd3JpdGVUb1BhcmNlbCg6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCBmaW5hbDsKICAgc3RhdGljIGNvbnN0IDo6YW5kcm9pZDo6U3RyaW5nMTYmIGdldFBhcmNlbGFibGVEZXNjcmlwdG9yKCkgewpAQCAtMTEwLDE4ICsxMTEsNTUgQEAKICAgICBzd2l0Y2ggKGdldFRhZygpKSB7CiAgICAgY2FzZSBpbnRFbnVtOiBvcyA8PCAiaW50RW51bTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhnZXQ8aW50RW51bT4oKSk7IGJyZWFrOwogICAgIGNhc2UgbG9uZ0VudW06IG9zIDw8ICJsb25nRW51bTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhnZXQ8bG9uZ0VudW0+KCkpOyBicmVhazsKKyAgICAjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorICAgICNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2RlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIgorICAgIGNhc2UgZGVwcmVjYXRlZEZpZWxkOiBvcyA8PCAiZGVwcmVjYXRlZEZpZWxkOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGdldDxkZXByZWNhdGVkRmllbGQ+KCkpOyBicmVhazsKKyAgICAjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCiAgICAgfQogICAgIG9zIDw8ICJ9IjsKICAgICByZXR1cm4gb3Muc3RyKCk7CiAgIH0KIHByaXZhdGU6Ci0gIHN0ZDo6dmFyaWFudDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtLCA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMb25nRW51bT4gX3ZhbHVlOworICBzdGQ6OnZhcmlhbnQ8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bSwgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0sIGludDMyX3Q+IF92YWx1ZTsKIH07ICAvLyBjbGFzcyBFbnVtVW5pb24KLQogfSAgLy8gbmFtZXNwYWNlIHVuaW9ucwotCiB9ICAvLyBuYW1lc3BhY2UgdGVzdHMKLQogfSAgLy8gbmFtZXNwYWNlIGFpZGwKLQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CituYW1lc3BhY2UgdW5pb25zIHsKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdkZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIKK1tbbm9kaXNjYXJkXV0gc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZyhFbnVtVW5pb246OlRhZyB2YWwpIHsKKyAgc3dpdGNoKHZhbCkgeworICBjYXNlIEVudW1Vbmlvbjo6VGFnOjppbnRFbnVtOgorICAgIHJldHVybiAiaW50RW51bSI7CisgIGNhc2UgRW51bVVuaW9uOjpUYWc6OmxvbmdFbnVtOgorICAgIHJldHVybiAibG9uZ0VudW0iOworICBjYXNlIEVudW1Vbmlvbjo6VGFnOjpkZXByZWNhdGVkRmllbGQ6CisgICAgcmV0dXJuICJkZXByZWNhdGVkRmllbGQiOworICBkZWZhdWx0OgorICAgIHJldHVybiBzdGQ6OnRvX3N0cmluZyhzdGF0aWNfY2FzdDxpbnQzMl90Pih2YWwpKTsKKyAgfQorfQorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAorfSAgLy8gbmFtZXNwYWNlIHVuaW9ucworfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XYysrMTctZXh0ZW5zaW9ucyIKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2RlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIgordGVtcGxhdGUgPD4KK2NvbnN0ZXhwciBpbmxpbmUgc3RkOjphcnJheTw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjp1bmlvbnM6OkVudW1Vbmlvbjo6VGFnLCAzPiBlbnVtX3ZhbHVlczw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjp1bmlvbnM6OkVudW1Vbmlvbjo6VGFnPiA9IHsKKyAgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6dW5pb25zOjpFbnVtVW5pb246OlRhZzo6aW50RW51bSwKKyAgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6dW5pb25zOjpFbnVtVW5pb246OlRhZzo6bG9uZ0VudW0sCisgIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OnVuaW9uczo6RW51bVVuaW9uOjpUYWc6OmRlcHJlY2F0ZWRGaWVsZCwKK307CisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL1VuaW9uSW5Vbmlvbi5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9VbmlvbkluVW5pb24uaAppbmRleCA1OTJjZmUzLi45YmFkYzNhIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL1VuaW9uSW5Vbmlvbi5oCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvVW5pb25JblVuaW9uLmgKQEAgLTIsMTAgKzIsMTMgQEAKIAogI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvRW51bVVuaW9uLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfdG9fc3RyaW5nLmg+CisjaW5jbHVkZSA8YXJyYXk+CisjaW5jbHVkZSA8YmluZGVyL0VudW1zLmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgogI2luY2x1ZGUgPGJpbmRlci9TdGF0dXMuaD4KICNpbmNsdWRlIDxjYXNzZXJ0PgogI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgogI2luY2x1ZGUgPHV0aWxpdHk+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KQEAgLTE2LDE1ICsxOSw2NCBAQAogI2VuZGlmCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogbmFtZXNwYWNlIGFpZGwgewotCiBuYW1lc3BhY2UgdGVzdHMgewotCiBuYW1lc3BhY2UgdW5pb25zIHsKLQogY2xhc3MgVW5pb25JblVuaW9uIDogcHVibGljIDo6YW5kcm9pZDo6UGFyY2VsYWJsZSB7CiBwdWJsaWM6CisgIGVudW0gY2xhc3MgVGFnIDogaW50MzJfdCB7CisgICAgZmlyc3QgPSAwLAorICAgIHNlY29uZCA9IDEsCisgIH07CisgIC8vIEV4cG9zZSB0YWcgc3ltYm9scyBmb3IgbGVnYWN5IGNvZGUKKyAgc3RhdGljIGNvbnN0IGlubGluZSBUYWcgZmlyc3QgPSBUYWc6OmZpcnN0OworICBzdGF0aWMgY29uc3QgaW5saW5lIFRhZyBzZWNvbmQgPSBUYWc6OnNlY29uZDsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBfbm90X3NlbGYgPSAhc3RkOjppc19zYW1lX3Y8c3RkOjpyZW1vdmVfY3ZfdDxzdGQ6OnJlbW92ZV9yZWZlcmVuY2VfdDxfVHA+PiwgVW5pb25JblVuaW9uPjsKKworICBVbmlvbkluVW5pb24oKSA6IF92YWx1ZShzdGQ6OmluX3BsYWNlX2luZGV4PHN0YXRpY19jYXN0PHNpemVfdD4oZmlyc3QpPiwgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6dW5pb25zOjpFbnVtVW5pb24oKSkgeyB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgPSBzdGQ6OmVuYWJsZV9pZl90PF9ub3Rfc2VsZjxfVHA+Pj4KKyAgLy8gTk9MSU5UTkVYVExJTkUoZ29vZ2xlLWV4cGxpY2l0LWNvbnN0cnVjdG9yKQorICBjb25zdGV4cHIgVW5pb25JblVuaW9uKF9UcCYmIF9hcmcpCisgICAgICA6IF92YWx1ZShzdGQ6OmZvcndhcmQ8X1RwPihfYXJnKSkge30KKworICB0ZW1wbGF0ZSA8c2l6ZV90IF9OcCwgdHlwZW5hbWUuLi4gX1RwPgorICBjb25zdGV4cHIgZXhwbGljaXQgVW5pb25JblVuaW9uKHN0ZDo6aW5fcGxhY2VfaW5kZXhfdDxfTnA+LCBfVHAmJi4uLiBfYXJncykKKyAgICAgIDogX3ZhbHVlKHN0ZDo6aW5fcGxhY2VfaW5kZXg8X05wPiwgc3RkOjpmb3J3YXJkPF9UcD4oX2FyZ3MpLi4uKSB7fQorCisgIHRlbXBsYXRlIDxUYWcgX3RhZywgdHlwZW5hbWUuLi4gX1RwPgorICBzdGF0aWMgVW5pb25JblVuaW9uIG1ha2UoX1RwJiYuLi4gX2FyZ3MpIHsKKyAgICByZXR1cm4gVW5pb25JblVuaW9uKHN0ZDo6aW5fcGxhY2VfaW5kZXg8c3RhdGljX2Nhc3Q8c2l6ZV90PihfdGFnKT4sIHN0ZDo6Zm9yd2FyZDxfVHA+KF9hcmdzKS4uLik7CisgIH0KKworICB0ZW1wbGF0ZSA8VGFnIF90YWcsIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUuLi4gX1VwPgorICBzdGF0aWMgVW5pb25JblVuaW9uIG1ha2Uoc3RkOjppbml0aWFsaXplcl9saXN0PF9UcD4gX2lsLCBfVXAmJi4uLiBfYXJncykgeworICAgIHJldHVybiBVbmlvbkluVW5pb24oc3RkOjppbl9wbGFjZV9pbmRleDxzdGF0aWNfY2FzdDxzaXplX3Q+KF90YWcpPiwgc3RkOjptb3ZlKF9pbCksIHN0ZDo6Zm9yd2FyZDxfVXA+KF9hcmdzKS4uLik7CisgIH0KKworICBUYWcgZ2V0VGFnKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxUYWc+KF92YWx1ZS5pbmRleCgpKTsKKyAgfQorCisgIHRlbXBsYXRlIDxUYWcgX3RhZz4KKyAgY29uc3QgYXV0byYgZ2V0KCkgY29uc3QgeworICAgIGlmIChnZXRUYWcoKSAhPSBfdGFnKSB7IF9fYXNzZXJ0MihfX0ZJTEVfXywgX19MSU5FX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18sICJiYWQgYWNjZXNzOiBhIHdyb25nIHRhZyIpOyB9CisgICAgcmV0dXJuIHN0ZDo6Z2V0PHN0YXRpY19jYXN0PHNpemVfdD4oX3RhZyk+KF92YWx1ZSk7CisgIH0KKworICB0ZW1wbGF0ZSA8VGFnIF90YWc+CisgIGF1dG8mIGdldCgpIHsKKyAgICBpZiAoZ2V0VGFnKCkgIT0gX3RhZykgeyBfX2Fzc2VydDIoX19GSUxFX18sIF9fTElORV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fLCAiYmFkIGFjY2VzczogYSB3cm9uZyB0YWciKTsgfQorICAgIHJldHVybiBzdGQ6OmdldDxzdGF0aWNfY2FzdDxzaXplX3Q+KF90YWcpPihfdmFsdWUpOworICB9CisKKyAgdGVtcGxhdGUgPFRhZyBfdGFnLCB0eXBlbmFtZS4uLiBfVHA+CisgIHZvaWQgc2V0KF9UcCYmLi4uIF9hcmdzKSB7CisgICAgX3ZhbHVlLmVtcGxhY2U8c3RhdGljX2Nhc3Q8c2l6ZV90PihfdGFnKT4oc3RkOjpmb3J3YXJkPF9UcD4oX2FyZ3MpLi4uKTsKKyAgfQorCiAgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgVW5pb25JblVuaW9uJiByaHMpIGNvbnN0IHsKICAgICByZXR1cm4gX3ZhbHVlICE9IHJocy5fdmFsdWU7CiAgIH0KQEAgLTQ0LDYwICs5Niw2IEBACiAgICAgcmV0dXJuIF92YWx1ZSA+PSByaHMuX3ZhbHVlOwogICB9CiAKLSAgZW51bSBUYWcgOiBpbnQzMl90IHsKLSAgICBmaXJzdCA9IDAsICAvLyBhbmRyb2lkLmFpZGwudGVzdHMudW5pb25zLkVudW1VbmlvbiBmaXJzdDsKLSAgICBzZWNvbmQsICAvLyBpbnQgc2Vjb25kOwotICB9OwotCi0gIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KLSAgc3RhdGljIGNvbnN0ZXhwciBib29sIF9ub3Rfc2VsZiA9ICFzdGQ6OmlzX3NhbWVfdjxzdGQ6OnJlbW92ZV9jdl90PHN0ZDo6cmVtb3ZlX3JlZmVyZW5jZV90PF9UcD4+LCBVbmlvbkluVW5pb24+OwotCi0gIFVuaW9uSW5VbmlvbigpIDogX3ZhbHVlKHN0ZDo6aW5fcGxhY2VfaW5kZXg8Zmlyc3Q+LCA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjp1bmlvbnM6OkVudW1VbmlvbigpKSB7IH0KLSAgVW5pb25JblVuaW9uKGNvbnN0IFVuaW9uSW5VbmlvbiYpID0gZGVmYXVsdDsKLSAgVW5pb25JblVuaW9uKFVuaW9uSW5VbmlvbiYmKSA9IGRlZmF1bHQ7Ci0gIFVuaW9uSW5VbmlvbiYgb3BlcmF0b3I9KGNvbnN0IFVuaW9uSW5VbmlvbiYpID0gZGVmYXVsdDsKLSAgVW5pb25JblVuaW9uJiBvcGVyYXRvcj0oVW5pb25JblVuaW9uJiYpID0gZGVmYXVsdDsKLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSA9IHN0ZDo6ZW5hYmxlX2lmX3Q8X25vdF9zZWxmPF9UcD4+PgotICAvLyBOT0xJTlRORVhUTElORShnb29nbGUtZXhwbGljaXQtY29uc3RydWN0b3IpCi0gIGNvbnN0ZXhwciBVbmlvbkluVW5pb24oX1RwJiYgX2FyZykKLSAgICAgIDogX3ZhbHVlKHN0ZDo6Zm9yd2FyZDxfVHA+KF9hcmcpKSB7fQotCi0gIHRlbXBsYXRlIDxzaXplX3QgX05wLCB0eXBlbmFtZS4uLiBfVHA+Ci0gIGNvbnN0ZXhwciBleHBsaWNpdCBVbmlvbkluVW5pb24oc3RkOjppbl9wbGFjZV9pbmRleF90PF9OcD4sIF9UcCYmLi4uIF9hcmdzKQotICAgICAgOiBfdmFsdWUoc3RkOjppbl9wbGFjZV9pbmRleDxfTnA+LCBzdGQ6OmZvcndhcmQ8X1RwPihfYXJncykuLi4pIHt9Ci0KLSAgdGVtcGxhdGUgPFRhZyBfdGFnLCB0eXBlbmFtZS4uLiBfVHA+Ci0gIHN0YXRpYyBVbmlvbkluVW5pb24gbWFrZShfVHAmJi4uLiBfYXJncykgewotICAgIHJldHVybiBVbmlvbkluVW5pb24oc3RkOjppbl9wbGFjZV9pbmRleDxfdGFnPiwgc3RkOjpmb3J3YXJkPF9UcD4oX2FyZ3MpLi4uKTsKLSAgfQotCi0gIHRlbXBsYXRlIDxUYWcgX3RhZywgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZS4uLiBfVXA+Ci0gIHN0YXRpYyBVbmlvbkluVW5pb24gbWFrZShzdGQ6OmluaXRpYWxpemVyX2xpc3Q8X1RwPiBfaWwsIF9VcCYmLi4uIF9hcmdzKSB7Ci0gICAgcmV0dXJuIFVuaW9uSW5VbmlvbihzdGQ6OmluX3BsYWNlX2luZGV4PF90YWc+LCBzdGQ6Om1vdmUoX2lsKSwgc3RkOjpmb3J3YXJkPF9VcD4oX2FyZ3MpLi4uKTsKLSAgfQotCi0gIFRhZyBnZXRUYWcoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFRhZz4oX3ZhbHVlLmluZGV4KCkpOwotICB9Ci0KLSAgdGVtcGxhdGUgPFRhZyBfdGFnPgotICBjb25zdCBhdXRvJiBnZXQoKSBjb25zdCB7Ci0gICAgaWYgKGdldFRhZygpICE9IF90YWcpIHsgX19hc3NlcnQyKF9fRklMRV9fLCBfX0xJTkVfXywgX19QUkVUVFlfRlVOQ1RJT05fXywgImJhZCBhY2Nlc3M6IGEgd3JvbmcgdGFnIik7IH0KLSAgICByZXR1cm4gc3RkOjpnZXQ8X3RhZz4oX3ZhbHVlKTsKLSAgfQotCi0gIHRlbXBsYXRlIDxUYWcgX3RhZz4KLSAgYXV0byYgZ2V0KCkgewotICAgIGlmIChnZXRUYWcoKSAhPSBfdGFnKSB7IF9fYXNzZXJ0MihfX0ZJTEVfXywgX19MSU5FX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18sICJiYWQgYWNjZXNzOiBhIHdyb25nIHRhZyIpOyB9Ci0gICAgcmV0dXJuIHN0ZDo6Z2V0PF90YWc+KF92YWx1ZSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8VGFnIF90YWcsIHR5cGVuYW1lLi4uIF9UcD4KLSAgdm9pZCBzZXQoX1RwJiYuLi4gX2FyZ3MpIHsKLSAgICBfdmFsdWUuZW1wbGFjZTxfdGFnPihzdGQ6OmZvcndhcmQ8X1RwPihfYXJncykuLi4pOwotICB9Ci0KICAgOjphbmRyb2lkOjpzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBmaW5hbDsKICAgOjphbmRyb2lkOjpzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IGZpbmFsOwogICBzdGF0aWMgY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiYgZ2V0UGFyY2VsYWJsZURlc2NyaXB0b3IoKSB7CkBAIC0xMTcsMTEgKzExNSwzNyBAQAogcHJpdmF0ZToKICAgc3RkOjp2YXJpYW50PDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OnVuaW9uczo6RW51bVVuaW9uLCBpbnQzMl90PiBfdmFsdWU7CiB9OyAgLy8gY2xhc3MgVW5pb25JblVuaW9uCi0KIH0gIC8vIG5hbWVzcGFjZSB1bmlvbnMKLQogfSAgLy8gbmFtZXNwYWNlIHRlc3RzCi0KIH0gIC8vIG5hbWVzcGFjZSBhaWRsCi0KK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworbmFtZXNwYWNlIHVuaW9ucyB7CitbW25vZGlzY2FyZF1dIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoVW5pb25JblVuaW9uOjpUYWcgdmFsKSB7CisgIHN3aXRjaCh2YWwpIHsKKyAgY2FzZSBVbmlvbkluVW5pb246OlRhZzo6Zmlyc3Q6CisgICAgcmV0dXJuICJmaXJzdCI7CisgIGNhc2UgVW5pb25JblVuaW9uOjpUYWc6OnNlY29uZDoKKyAgICByZXR1cm4gInNlY29uZCI7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIHN0ZDo6dG9fc3RyaW5nKHN0YXRpY19jYXN0PGludDMyX3Q+KHZhbCkpOworICB9Cit9Cit9ICAvLyBuYW1lc3BhY2UgdW5pb25zCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGludGVybmFsIHsKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdjKysxNy1leHRlbnNpb25zIgordGVtcGxhdGUgPD4KK2NvbnN0ZXhwciBpbmxpbmUgc3RkOjphcnJheTw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjp1bmlvbnM6OlVuaW9uSW5Vbmlvbjo6VGFnLCAyPiBlbnVtX3ZhbHVlczw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjp1bmlvbnM6OlVuaW9uSW5Vbmlvbjo6VGFnPiA9IHsKKyAgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6dW5pb25zOjpVbmlvbkluVW5pb246OlRhZzo6Zmlyc3QsCisgIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OnVuaW9uczo6VW5pb25JblVuaW9uOjpUYWc6OnNlY29uZCwKK307CisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9BcnJheU9mSW50ZXJmYWNlcy5qYXZhIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvQXJyYXlPZkludGVyZmFjZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTQ1ZTA4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvQXJyYXlPZkludGVyZmFjZXMuamF2YQpAQCAtMCwwICsxLDU3NSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBhdXRvLWdlbmVyYXRlZC4gIERPIE5PVCBNT0RJRlkuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5haWRsLnRlc3RzOworcHVibGljIGNsYXNzIEFycmF5T2ZJbnRlcmZhY2VzIGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlCit7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3I8QXJyYXlPZkludGVyZmFjZXM+IENSRUFUT1IgPSBuZXcgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3I8QXJyYXlPZkludGVyZmFjZXM+KCkgeworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBcnJheU9mSW50ZXJmYWNlcyBjcmVhdGVGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3NvdXJjZSkgeworICAgICAgQXJyYXlPZkludGVyZmFjZXMgX2FpZGxfb3V0ID0gbmV3IEFycmF5T2ZJbnRlcmZhY2VzKCk7CisgICAgICBfYWlkbF9vdXQucmVhZEZyb21QYXJjZWwoX2FpZGxfc291cmNlKTsKKyAgICAgIHJldHVybiBfYWlkbF9vdXQ7CisgICAgfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBcnJheU9mSW50ZXJmYWNlc1tdIG5ld0FycmF5KGludCBfYWlkbF9zaXplKSB7CisgICAgICByZXR1cm4gbmV3IEFycmF5T2ZJbnRlcmZhY2VzW19haWRsX3NpemVdOworICAgIH0KKyAgfTsKKyAgQE92ZXJyaWRlIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlVG9QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgX2FpZGxfcGFyY2VsLCBpbnQgX2FpZGxfZmxhZykKKyAgeworICAgIGludCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCk7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KDApOworICAgIGludCBfYWlkbF9lbmRfcG9zID0gX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpOworICAgIF9haWRsX3BhcmNlbC5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgICAgX2FpZGxfcGFyY2VsLnNldERhdGFQb3NpdGlvbihfYWlkbF9lbmRfcG9zKTsKKyAgfQorICBwdWJsaWMgZmluYWwgdm9pZCByZWFkRnJvbVBhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9wYXJjZWwpCisgIHsKKyAgICBpbnQgX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpOworICAgIGludCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSBfYWlkbF9wYXJjZWwucmVhZEludCgpOworICAgIHRyeSB7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9zaXplIDwgNCkgdGhyb3cgbmV3IGFuZHJvaWQub3MuQmFkUGFyY2VsYWJsZUV4Y2VwdGlvbigiUGFyY2VsYWJsZSB0b28gc21hbGwiKTs7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGlmIChfYWlkbF9zdGFydF9wb3MgPiAoSW50ZWdlci5NQVhfVkFMVUUgLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpKSB7CisgICAgICAgIHRocm93IG5ldyBhbmRyb2lkLm9zLkJhZFBhcmNlbGFibGVFeGNlcHRpb24oIk92ZXJmbG93IGluIHRoZSBzaXplIG9mIHBhcmNlbGFibGUiKTsKKyAgICAgIH0KKyAgICAgIF9haWRsX3BhcmNlbC5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICB9CisgIH0KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKKyAgICBpbnQgX21hc2sgPSAwOworICAgIHJldHVybiBfbWFzazsKKyAgfQorICBwdWJsaWMgaW50ZXJmYWNlIElFbXB0eUludGVyZmFjZSBleHRlbmRzIGFuZHJvaWQub3MuSUludGVyZmFjZQorICB7CisgICAgLyoqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIElFbXB0eUludGVyZmFjZS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIERlZmF1bHQgaW1wbGVtZW50cyBhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlCisgICAgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICB9CisgICAgLyoqIExvY2FsLXNpZGUgSVBDIGltcGxlbWVudGF0aW9uIHN0dWIgY2xhc3MuICovCisgICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBTdHViIGV4dGVuZHMgYW5kcm9pZC5vcy5CaW5kZXIgaW1wbGVtZW50cyBhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlCisgICAgeworICAgICAgLyoqIENvbnN0cnVjdCB0aGUgc3R1YiBhdCBhdHRhY2ggaXQgdG8gdGhlIGludGVyZmFjZS4gKi8KKyAgICAgIHB1YmxpYyBTdHViKCkKKyAgICAgIHsKKyAgICAgICAgdGhpcy5hdHRhY2hJbnRlcmZhY2UodGhpcywgREVTQ1JJUFRPUik7CisgICAgICB9CisgICAgICAvKioKKyAgICAgICAqIENhc3QgYW4gSUJpbmRlciBvYmplY3QgaW50byBhbiBhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlIGludGVyZmFjZSwKKyAgICAgICAqIGdlbmVyYXRpbmcgYSBwcm94eSBpZiBuZWVkZWQuCisgICAgICAgKi8KKyAgICAgIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZSBhc0ludGVyZmFjZShhbmRyb2lkLm9zLklCaW5kZXIgb2JqKQorICAgICAgeworICAgICAgICBpZiAoKG9iaj09bnVsbCkpIHsKKyAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBhbmRyb2lkLm9zLklJbnRlcmZhY2UgaWluID0gb2JqLnF1ZXJ5TG9jYWxJbnRlcmZhY2UoREVTQ1JJUFRPUik7CisgICAgICAgIGlmICgoKGlpbiE9bnVsbCkmJihpaW4gaW5zdGFuY2VvZiBhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlKSkpIHsKKyAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlKWlpbik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlLlN0dWIuUHJveHkob2JqKTsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICB9CisgICAgICBAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gb25UcmFuc2FjdChpbnQgY29kZSwgYW5kcm9pZC5vcy5QYXJjZWwgZGF0YSwgYW5kcm9pZC5vcy5QYXJjZWwgcmVwbHksIGludCBmbGFncykgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgICB7CisgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZGVzY3JpcHRvciA9IERFU0NSSVBUT1I7CisgICAgICAgIHN3aXRjaCAoY29kZSkKKyAgICAgICAgeworICAgICAgICAgIGNhc2UgSU5URVJGQUNFX1RSQU5TQUNUSU9OOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIHJlcGx5LndyaXRlU3RyaW5nKGRlc2NyaXB0b3IpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoY29kZSkKKyAgICAgICAgeworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLm9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFByb3h5IGltcGxlbWVudHMgYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZQorICAgICAgeworICAgICAgICBwcml2YXRlIGFuZHJvaWQub3MuSUJpbmRlciBtUmVtb3RlOworICAgICAgICBQcm94eShhbmRyb2lkLm9zLklCaW5kZXIgcmVtb3RlKQorICAgICAgICB7CisgICAgICAgICAgbVJlbW90ZSA9IHJlbW90ZTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUgcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gbVJlbW90ZTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBERVNDUklQVE9SOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERVNDUklQVE9SID0gImFuZHJvaWQkYWlkbCR0ZXN0cyRBcnJheU9mSW50ZXJmYWNlcyRJRW1wdHlJbnRlcmZhY2UiLnJlcGxhY2UoJyQnLCAnLicpOworICB9CisgIHB1YmxpYyBpbnRlcmZhY2UgSU15SW50ZXJmYWNlIGV4dGVuZHMgYW5kcm9pZC5vcy5JSW50ZXJmYWNlCisgIHsKKyAgICAvKiogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3IgSU15SW50ZXJmYWNlLiAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRGVmYXVsdCBpbXBsZW1lbnRzIGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JTXlJbnRlcmZhY2UKKyAgICB7CisgICAgICBAT3ZlcnJpZGUgcHVibGljIGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2VbXSBtZXRob2RXaXRoSW50ZXJmYWNlcyhhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlIGlmYWNlLCBhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlIG51bGxhYmxlX2lmYWNlLCBhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlW10gaWZhY2VfYXJyYXlfaW4sIGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2VbXSBpZmFjZV9hcnJheV9vdXQsIGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2VbXSBpZmFjZV9hcnJheV9pbm91dCwgYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZVtdIG51bGxhYmxlX2lmYWNlX2FycmF5X2luLCBhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlW10gbnVsbGFibGVfaWZhY2VfYXJyYXlfb3V0LCBhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlW10gbnVsbGFibGVfaWZhY2VfYXJyYXlfaW5vdXQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgICAgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisgICAgfQorICAgIC8qKiBMb2NhbC1zaWRlIElQQyBpbXBsZW1lbnRhdGlvbiBzdHViIGNsYXNzLiAqLworICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgU3R1YiBleHRlbmRzIGFuZHJvaWQub3MuQmluZGVyIGltcGxlbWVudHMgYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklNeUludGVyZmFjZQorICAgIHsKKyAgICAgIC8qKiBDb25zdHJ1Y3QgdGhlIHN0dWIgYXQgYXR0YWNoIGl0IHRvIHRoZSBpbnRlcmZhY2UuICovCisgICAgICBwdWJsaWMgU3R1YigpCisgICAgICB7CisgICAgICAgIHRoaXMuYXR0YWNoSW50ZXJmYWNlKHRoaXMsIERFU0NSSVBUT1IpOworICAgICAgfQorICAgICAgLyoqCisgICAgICAgKiBDYXN0IGFuIElCaW5kZXIgb2JqZWN0IGludG8gYW4gYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklNeUludGVyZmFjZSBpbnRlcmZhY2UsCisgICAgICAgKiBnZW5lcmF0aW5nIGEgcHJveHkgaWYgbmVlZGVkLgorICAgICAgICovCisgICAgICBwdWJsaWMgc3RhdGljIGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JTXlJbnRlcmZhY2UgYXNJbnRlcmZhY2UoYW5kcm9pZC5vcy5JQmluZGVyIG9iaikKKyAgICAgIHsKKyAgICAgICAgaWYgKChvYmo9PW51bGwpKSB7CisgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgYW5kcm9pZC5vcy5JSW50ZXJmYWNlIGlpbiA9IG9iai5xdWVyeUxvY2FsSW50ZXJmYWNlKERFU0NSSVBUT1IpOworICAgICAgICBpZiAoKChpaW4hPW51bGwpJiYoaWluIGluc3RhbmNlb2YgYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklNeUludGVyZmFjZSkpKSB7CisgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklNeUludGVyZmFjZSlpaW4pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklNeUludGVyZmFjZS5TdHViLlByb3h5KG9iaik7CisgICAgICB9CisgICAgICBAT3ZlcnJpZGUgcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCisgICAgICB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgICAgfQorICAgICAgQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIG9uVHJhbnNhY3QoaW50IGNvZGUsIGFuZHJvaWQub3MuUGFyY2VsIGRhdGEsIGFuZHJvaWQub3MuUGFyY2VsIHJlcGx5LCBpbnQgZmxhZ3MpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgICAgeworICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGRlc2NyaXB0b3IgPSBERVNDUklQVE9SOworICAgICAgICBpZiAoY29kZSA+PSBhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiAmJiBjb2RlIDw9IGFuZHJvaWQub3MuSUJpbmRlci5MQVNUX0NBTExfVFJBTlNBQ1RJT04pIHsKKyAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoZGVzY3JpcHRvcik7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChjb2RlKQorICAgICAgICB7CisgICAgICAgICAgY2FzZSBJTlRFUkZBQ0VfVFJBTlNBQ1RJT046CisgICAgICAgICAgeworICAgICAgICAgICAgcmVwbHkud3JpdGVTdHJpbmcoZGVzY3JpcHRvcik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChjb2RlKQorICAgICAgICB7CisgICAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9tZXRob2RXaXRoSW50ZXJmYWNlczoKKyAgICAgICAgICB7CisgICAgICAgICAgICBhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlIF9hcmcwOworICAgICAgICAgICAgX2FyZzAgPSBhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlLlN0dWIuYXNJbnRlcmZhY2UoZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICAgICAgYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZSBfYXJnMTsKKyAgICAgICAgICAgIF9hcmcxID0gYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZS5TdHViLmFzSW50ZXJmYWNlKGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgICAgIGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2VbXSBfYXJnMjsKKyAgICAgICAgICAgIF9hcmcyID0gZGF0YS5jcmVhdGVJbnRlcmZhY2VBcnJheShhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlW106Om5ldywgYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZS5TdHViOjphc0ludGVyZmFjZSk7CisgICAgICAgICAgICBhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlW10gX2FyZzM7CisgICAgICAgICAgICBpbnQgX2FyZzNfbGVuZ3RoID0gZGF0YS5yZWFkSW50KCk7CisgICAgICAgICAgICBpZiAoX2FyZzNfbGVuZ3RoIDwgMCkgeworICAgICAgICAgICAgICBfYXJnMyA9IG51bGw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBfYXJnMyA9IG5ldyBhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlW19hcmczX2xlbmd0aF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlW10gX2FyZzQ7CisgICAgICAgICAgICBfYXJnNCA9IGRhdGEuY3JlYXRlSW50ZXJmYWNlQXJyYXkoYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZVtdOjpuZXcsIGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UuU3R1Yjo6YXNJbnRlcmZhY2UpOworICAgICAgICAgICAgYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZVtdIF9hcmc1OworICAgICAgICAgICAgX2FyZzUgPSBkYXRhLmNyZWF0ZUludGVyZmFjZUFycmF5KGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2VbXTo6bmV3LCBhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlLlN0dWI6OmFzSW50ZXJmYWNlKTsKKyAgICAgICAgICAgIGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2VbXSBfYXJnNjsKKyAgICAgICAgICAgIGludCBfYXJnNl9sZW5ndGggPSBkYXRhLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIGlmIChfYXJnNl9sZW5ndGggPCAwKSB7CisgICAgICAgICAgICAgIF9hcmc2ID0gbnVsbDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIF9hcmc2ID0gbmV3IGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2VbX2FyZzZfbGVuZ3RoXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2VbXSBfYXJnNzsKKyAgICAgICAgICAgIF9hcmc3ID0gZGF0YS5jcmVhdGVJbnRlcmZhY2VBcnJheShhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlW106Om5ldywgYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZS5TdHViOjphc0ludGVyZmFjZSk7CisgICAgICAgICAgICBkYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOworICAgICAgICAgICAgYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZVtdIF9yZXN1bHQgPSB0aGlzLm1ldGhvZFdpdGhJbnRlcmZhY2VzKF9hcmcwLCBfYXJnMSwgX2FyZzIsIF9hcmczLCBfYXJnNCwgX2FyZzUsIF9hcmc2LCBfYXJnNyk7CisgICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgICByZXBseS53cml0ZUludGVyZmFjZUFycmF5KF9yZXN1bHQpOworICAgICAgICAgICAgcmVwbHkud3JpdGVJbnRlcmZhY2VBcnJheShfYXJnMyk7CisgICAgICAgICAgICByZXBseS53cml0ZUludGVyZmFjZUFycmF5KF9hcmc0KTsKKyAgICAgICAgICAgIHJlcGx5LndyaXRlSW50ZXJmYWNlQXJyYXkoX2FyZzYpOworICAgICAgICAgICAgcmVwbHkud3JpdGVJbnRlcmZhY2VBcnJheShfYXJnNyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIub25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFByb3h5IGltcGxlbWVudHMgYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklNeUludGVyZmFjZQorICAgICAgeworICAgICAgICBwcml2YXRlIGFuZHJvaWQub3MuSUJpbmRlciBtUmVtb3RlOworICAgICAgICBQcm94eShhbmRyb2lkLm9zLklCaW5kZXIgcmVtb3RlKQorICAgICAgICB7CisgICAgICAgICAgbVJlbW90ZSA9IHJlbW90ZTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUgcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gbVJlbW90ZTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBERVNDUklQVE9SOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZVtdIG1ldGhvZFdpdGhJbnRlcmZhY2VzKGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UgaWZhY2UsIGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UgbnVsbGFibGVfaWZhY2UsIGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2VbXSBpZmFjZV9hcnJheV9pbiwgYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZVtdIGlmYWNlX2FycmF5X291dCwgYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZVtdIGlmYWNlX2FycmF5X2lub3V0LCBhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlW10gbnVsbGFibGVfaWZhY2VfYXJyYXlfaW4sIGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2VbXSBudWxsYWJsZV9pZmFjZV9hcnJheV9vdXQsIGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2VbXSBudWxsYWJsZV9pZmFjZV9hcnJheV9pbm91dCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbihhc0JpbmRlcigpKTsKKyAgICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgICBhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlW10gX3Jlc3VsdDsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKKyAgICAgICAgICAgIF9kYXRhLndyaXRlU3Ryb25nSW50ZXJmYWNlKGlmYWNlKTsKKyAgICAgICAgICAgIF9kYXRhLndyaXRlU3Ryb25nSW50ZXJmYWNlKG51bGxhYmxlX2lmYWNlKTsKKyAgICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlQXJyYXkoaWZhY2VfYXJyYXlfaW4pOworICAgICAgICAgICAgaWYgKChpZmFjZV9hcnJheV9vdXQ9PW51bGwpKSB7CisgICAgICAgICAgICAgIF9kYXRhLndyaXRlSW50KC0xKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICBfZGF0YS53cml0ZUludChpZmFjZV9hcnJheV9vdXQubGVuZ3RoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlQXJyYXkoaWZhY2VfYXJyYXlfaW5vdXQpOworICAgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VBcnJheShudWxsYWJsZV9pZmFjZV9hcnJheV9pbik7CisgICAgICAgICAgICBpZiAoKG51bGxhYmxlX2lmYWNlX2FycmF5X291dD09bnVsbCkpIHsKKyAgICAgICAgICAgICAgX2RhdGEud3JpdGVJbnQoLTEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgIF9kYXRhLndyaXRlSW50KG51bGxhYmxlX2lmYWNlX2FycmF5X291dC5sZW5ndGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VBcnJheShudWxsYWJsZV9pZmFjZV9hcnJheV9pbm91dCk7CisgICAgICAgICAgICBib29sZWFuIF9zdGF0dXMgPSBtUmVtb3RlLnRyYW5zYWN0KFN0dWIuVFJBTlNBQ1RJT05fbWV0aG9kV2l0aEludGVyZmFjZXMsIF9kYXRhLCBfcmVwbHksIDApOworICAgICAgICAgICAgX3JlcGx5LnJlYWRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIF9yZXN1bHQgPSBfcmVwbHkuY3JlYXRlSW50ZXJmYWNlQXJyYXkoYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZVtdOjpuZXcsIGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UuU3R1Yjo6YXNJbnRlcmZhY2UpOworICAgICAgICAgICAgX3JlcGx5LnJlYWRJbnRlcmZhY2VBcnJheShpZmFjZV9hcnJheV9vdXQsIGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UuU3R1Yjo6YXNJbnRlcmZhY2UpOworICAgICAgICAgICAgX3JlcGx5LnJlYWRJbnRlcmZhY2VBcnJheShpZmFjZV9hcnJheV9pbm91dCwgYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZS5TdHViOjphc0ludGVyZmFjZSk7CisgICAgICAgICAgICBfcmVwbHkucmVhZEludGVyZmFjZUFycmF5KG51bGxhYmxlX2lmYWNlX2FycmF5X291dCwgYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZS5TdHViOjphc0ludGVyZmFjZSk7CisgICAgICAgICAgICBfcmVwbHkucmVhZEludGVyZmFjZUFycmF5KG51bGxhYmxlX2lmYWNlX2FycmF5X2lub3V0LCBhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlLlN0dWI6OmFzSW50ZXJmYWNlKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgICBfcmVwbHkucmVjeWNsZSgpOworICAgICAgICAgICAgX2RhdGEucmVjeWNsZSgpOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gX3Jlc3VsdDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9tZXRob2RXaXRoSW50ZXJmYWNlcyA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDApOworICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVTQ1JJUFRPUiA9ICJhbmRyb2lkJGFpZGwkdGVzdHMkQXJyYXlPZkludGVyZmFjZXMkSU15SW50ZXJmYWNlIi5yZXBsYWNlKCckJywgJy4nKTsKKyAgICBwdWJsaWMgYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZVtdIG1ldGhvZFdpdGhJbnRlcmZhY2VzKGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UgaWZhY2UsIGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UgbnVsbGFibGVfaWZhY2UsIGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2VbXSBpZmFjZV9hcnJheV9pbiwgYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZVtdIGlmYWNlX2FycmF5X291dCwgYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZVtdIGlmYWNlX2FycmF5X2lub3V0LCBhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlW10gbnVsbGFibGVfaWZhY2VfYXJyYXlfaW4sIGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2VbXSBudWxsYWJsZV9pZmFjZV9hcnJheV9vdXQsIGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2VbXSBudWxsYWJsZV9pZmFjZV9hcnJheV9pbm91dCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworICB9CisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlQYXJjZWxhYmxlIGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlCisgIHsKKyAgICBwdWJsaWMgYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZSBpZmFjZTsKKyAgICBwdWJsaWMgYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZSBudWxsYWJsZV9pZmFjZTsKKyAgICBwdWJsaWMgYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZVtdIGlmYWNlX2FycmF5OworICAgIHB1YmxpYyBhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlW10gbnVsbGFibGVfaWZhY2VfYXJyYXk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm9zLlBhcmNlbGFibGUuQ3JlYXRvcjxNeVBhcmNlbGFibGU+IENSRUFUT1IgPSBuZXcgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3I8TXlQYXJjZWxhYmxlPigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIE15UGFyY2VsYWJsZSBjcmVhdGVGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3NvdXJjZSkgeworICAgICAgICBNeVBhcmNlbGFibGUgX2FpZGxfb3V0ID0gbmV3IE15UGFyY2VsYWJsZSgpOworICAgICAgICBfYWlkbF9vdXQucmVhZEZyb21QYXJjZWwoX2FpZGxfc291cmNlKTsKKyAgICAgICAgcmV0dXJuIF9haWRsX291dDsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIE15UGFyY2VsYWJsZVtdIG5ld0FycmF5KGludCBfYWlkbF9zaXplKSB7CisgICAgICAgIHJldHVybiBuZXcgTXlQYXJjZWxhYmxlW19haWRsX3NpemVdOworICAgICAgfQorICAgIH07CisgICAgQE92ZXJyaWRlIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlVG9QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgX2FpZGxfcGFyY2VsLCBpbnQgX2FpZGxfZmxhZykKKyAgICB7CisgICAgICBpbnQgX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpOworICAgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KDApOworICAgICAgX2FpZGxfcGFyY2VsLndyaXRlU3Ryb25nSW50ZXJmYWNlKGlmYWNlKTsKKyAgICAgIF9haWRsX3BhcmNlbC53cml0ZVN0cm9uZ0ludGVyZmFjZShudWxsYWJsZV9pZmFjZSk7CisgICAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnRlcmZhY2VBcnJheShpZmFjZV9hcnJheSk7CisgICAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnRlcmZhY2VBcnJheShudWxsYWJsZV9pZmFjZV9hcnJheSk7CisgICAgICBpbnQgX2FpZGxfZW5kX3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKKyAgICAgIF9haWRsX3BhcmNlbC5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zKTsKKyAgICAgIF9haWRsX3BhcmNlbC53cml0ZUludChfYWlkbF9lbmRfcG9zIC0gX2FpZGxfc3RhcnRfcG9zKTsKKyAgICAgIF9haWRsX3BhcmNlbC5zZXREYXRhUG9zaXRpb24oX2FpZGxfZW5kX3Bvcyk7CisgICAgfQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJlYWRGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3BhcmNlbCkKKyAgICB7CisgICAgICBpbnQgX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpOworICAgICAgaW50IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IF9haWRsX3BhcmNlbC5yZWFkSW50KCk7CisgICAgICB0cnkgeworICAgICAgICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9zaXplIDwgNCkgdGhyb3cgbmV3IGFuZHJvaWQub3MuQmFkUGFyY2VsYWJsZUV4Y2VwdGlvbigiUGFyY2VsYWJsZSB0b28gc21hbGwiKTs7CisgICAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICAgIGlmYWNlID0gYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZS5TdHViLmFzSW50ZXJmYWNlKF9haWRsX3BhcmNlbC5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgICBudWxsYWJsZV9pZmFjZSA9IGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UuU3R1Yi5hc0ludGVyZmFjZShfYWlkbF9wYXJjZWwucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgICAgaWZhY2VfYXJyYXkgPSBfYWlkbF9wYXJjZWwuY3JlYXRlSW50ZXJmYWNlQXJyYXkoYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZVtdOjpuZXcsIGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UuU3R1Yjo6YXNJbnRlcmZhY2UpOworICAgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgICBudWxsYWJsZV9pZmFjZV9hcnJheSA9IF9haWRsX3BhcmNlbC5jcmVhdGVJbnRlcmZhY2VBcnJheShhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlW106Om5ldywgYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZS5TdHViOjphc0ludGVyZmFjZSk7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gKEludGVnZXIuTUFYX1ZBTFVFIC0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSkgeworICAgICAgICAgIHRocm93IG5ldyBhbmRyb2lkLm9zLkJhZFBhcmNlbGFibGVFeGNlcHRpb24oIk92ZXJmbG93IGluIHRoZSBzaXplIG9mIHBhcmNlbGFibGUiKTsKKyAgICAgICAgfQorICAgICAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgICB9CisgICAgfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICBqYXZhLnV0aWwuU3RyaW5nSm9pbmVyIF9haWRsX3NqID0gbmV3IGphdmEudXRpbC5TdHJpbmdKb2luZXIoIiwgIiwgInsiLCAifSIpOworICAgICAgX2FpZGxfc2ouYWRkKCJpZmFjZTogIiArIChqYXZhLnV0aWwuT2JqZWN0cy50b1N0cmluZyhpZmFjZSkpKTsKKyAgICAgIF9haWRsX3NqLmFkZCgibnVsbGFibGVfaWZhY2U6ICIgKyAoamF2YS51dGlsLk9iamVjdHMudG9TdHJpbmcobnVsbGFibGVfaWZhY2UpKSk7CisgICAgICBfYWlkbF9zai5hZGQoImlmYWNlX2FycmF5OiAiICsgKGphdmEudXRpbC5BcnJheXMudG9TdHJpbmcoaWZhY2VfYXJyYXkpKSk7CisgICAgICBfYWlkbF9zai5hZGQoIm51bGxhYmxlX2lmYWNlX2FycmF5OiAiICsgKGphdmEudXRpbC5BcnJheXMudG9TdHJpbmcobnVsbGFibGVfaWZhY2VfYXJyYXkpKSk7CisgICAgICByZXR1cm4gImFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5NeVBhcmNlbGFibGUiICsgX2FpZGxfc2oudG9TdHJpbmcoKSAgOworICAgIH0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7CisgICAgICBpZiAodGhpcyA9PSBvdGhlcikgcmV0dXJuIHRydWU7CisgICAgICBpZiAob3RoZXIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBNeVBhcmNlbGFibGUpKSByZXR1cm4gZmFsc2U7CisgICAgICBNeVBhcmNlbGFibGUgdGhhdCA9IChNeVBhcmNlbGFibGUpb3RoZXI7CisgICAgICBpZiAoIWphdmEudXRpbC5PYmplY3RzLmRlZXBFcXVhbHMoaWZhY2UsIHRoYXQuaWZhY2UpKSByZXR1cm4gZmFsc2U7CisgICAgICBpZiAoIWphdmEudXRpbC5PYmplY3RzLmRlZXBFcXVhbHMobnVsbGFibGVfaWZhY2UsIHRoYXQubnVsbGFibGVfaWZhY2UpKSByZXR1cm4gZmFsc2U7CisgICAgICBpZiAoIWphdmEudXRpbC5PYmplY3RzLmRlZXBFcXVhbHMoaWZhY2VfYXJyYXksIHRoYXQuaWZhY2VfYXJyYXkpKSByZXR1cm4gZmFsc2U7CisgICAgICBpZiAoIWphdmEudXRpbC5PYmplY3RzLmRlZXBFcXVhbHMobnVsbGFibGVfaWZhY2VfYXJyYXksIHRoYXQubnVsbGFibGVfaWZhY2VfYXJyYXkpKSByZXR1cm4gZmFsc2U7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgcmV0dXJuIGphdmEudXRpbC5BcnJheXMuZGVlcEhhc2hDb2RlKGphdmEudXRpbC5BcnJheXMuYXNMaXN0KGlmYWNlLCBudWxsYWJsZV9pZmFjZSwgaWZhY2VfYXJyYXksIG51bGxhYmxlX2lmYWNlX2FycmF5KS50b0FycmF5KCkpOworICAgIH0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgICBpbnQgX21hc2sgPSAwOworICAgICAgcmV0dXJuIF9tYXNrOworICAgIH0KKyAgfQorICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIE15VW5pb24gaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUgeworICAgIC8vIHRhZ3MgZm9yIHVuaW9uIGZpZWxkcworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IGlmYWNlID0gMDsgIC8vIGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UgaWZhY2U7CisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgbnVsbGFibGVfaWZhY2UgPSAxOyAgLy8gYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZSBudWxsYWJsZV9pZmFjZTsKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBpZmFjZV9hcnJheSA9IDI7ICAvLyBhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlW10gaWZhY2VfYXJyYXk7CisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgbnVsbGFibGVfaWZhY2VfYXJyYXkgPSAzOyAgLy8gYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZVtdIG51bGxhYmxlX2lmYWNlX2FycmF5OworCisgICAgcHJpdmF0ZSBpbnQgX3RhZzsKKyAgICBwcml2YXRlIE9iamVjdCBfdmFsdWU7CisKKyAgICBwdWJsaWMgTXlVbmlvbigpIHsKKyAgICAgIGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UgX3ZhbHVlID0gbnVsbDsKKyAgICAgIHRoaXMuX3RhZyA9IGlmYWNlOworICAgICAgdGhpcy5fdmFsdWUgPSBfdmFsdWU7CisgICAgfQorCisgICAgcHJpdmF0ZSBNeVVuaW9uKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3BhcmNlbCkgeworICAgICAgcmVhZEZyb21QYXJjZWwoX2FpZGxfcGFyY2VsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIE15VW5pb24oaW50IF90YWcsIE9iamVjdCBfdmFsdWUpIHsKKyAgICAgIHRoaXMuX3RhZyA9IF90YWc7CisgICAgICB0aGlzLl92YWx1ZSA9IF92YWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFRhZygpIHsKKyAgICAgIHJldHVybiBfdGFnOworICAgIH0KKworICAgIC8vIGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UgaWZhY2U7CisKKyAgICBwdWJsaWMgc3RhdGljIE15VW5pb24gaWZhY2UoYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZSBfdmFsdWUpIHsKKyAgICAgIHJldHVybiBuZXcgTXlVbmlvbihpZmFjZSwgX3ZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZSBnZXRJZmFjZSgpIHsKKyAgICAgIF9hc3NlcnRUYWcoaWZhY2UpOworICAgICAgcmV0dXJuIChhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlKSBfdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SWZhY2UoYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZSBfdmFsdWUpIHsKKyAgICAgIF9zZXQoaWZhY2UsIF92YWx1ZSk7CisgICAgfQorCisgICAgLy8gYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZSBudWxsYWJsZV9pZmFjZTsKKworICAgIHB1YmxpYyBzdGF0aWMgTXlVbmlvbiBudWxsYWJsZV9pZmFjZShhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlIF92YWx1ZSkgeworICAgICAgcmV0dXJuIG5ldyBNeVVuaW9uKG51bGxhYmxlX2lmYWNlLCBfdmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlIGdldE51bGxhYmxlX2lmYWNlKCkgeworICAgICAgX2Fzc2VydFRhZyhudWxsYWJsZV9pZmFjZSk7CisgICAgICByZXR1cm4gKGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UpIF92YWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROdWxsYWJsZV9pZmFjZShhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlIF92YWx1ZSkgeworICAgICAgX3NldChudWxsYWJsZV9pZmFjZSwgX3ZhbHVlKTsKKyAgICB9CisKKyAgICAvLyBhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlW10gaWZhY2VfYXJyYXk7CisKKyAgICBwdWJsaWMgc3RhdGljIE15VW5pb24gaWZhY2VfYXJyYXkoYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZVtdIF92YWx1ZSkgeworICAgICAgcmV0dXJuIG5ldyBNeVVuaW9uKGlmYWNlX2FycmF5LCBfdmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlW10gZ2V0SWZhY2VfYXJyYXkoKSB7CisgICAgICBfYXNzZXJ0VGFnKGlmYWNlX2FycmF5KTsKKyAgICAgIHJldHVybiAoYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZVtdKSBfdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SWZhY2VfYXJyYXkoYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZVtdIF92YWx1ZSkgeworICAgICAgX3NldChpZmFjZV9hcnJheSwgX3ZhbHVlKTsKKyAgICB9CisKKyAgICAvLyBhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlW10gbnVsbGFibGVfaWZhY2VfYXJyYXk7CisKKyAgICBwdWJsaWMgc3RhdGljIE15VW5pb24gbnVsbGFibGVfaWZhY2VfYXJyYXkoYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZVtdIF92YWx1ZSkgeworICAgICAgcmV0dXJuIG5ldyBNeVVuaW9uKG51bGxhYmxlX2lmYWNlX2FycmF5LCBfdmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlW10gZ2V0TnVsbGFibGVfaWZhY2VfYXJyYXkoKSB7CisgICAgICBfYXNzZXJ0VGFnKG51bGxhYmxlX2lmYWNlX2FycmF5KTsKKyAgICAgIHJldHVybiAoYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZVtdKSBfdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TnVsbGFibGVfaWZhY2VfYXJyYXkoYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZVtdIF92YWx1ZSkgeworICAgICAgX3NldChudWxsYWJsZV9pZmFjZV9hcnJheSwgX3ZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsYWJsZS5DcmVhdG9yPE15VW5pb24+IENSRUFUT1IgPSBuZXcgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3I8TXlVbmlvbj4oKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBNeVVuaW9uIGNyZWF0ZUZyb21QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgX2FpZGxfc291cmNlKSB7CisgICAgICAgIHJldHVybiBuZXcgTXlVbmlvbihfYWlkbF9zb3VyY2UpOworICAgICAgfQorICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgTXlVbmlvbltdIG5ld0FycmF5KGludCBfYWlkbF9zaXplKSB7CisgICAgICAgIHJldHVybiBuZXcgTXlVbmlvbltfYWlkbF9zaXplXTsKKyAgICAgIH0KKyAgICB9OworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGZpbmFsIHZvaWQgd3JpdGVUb1BhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9wYXJjZWwsIGludCBfYWlkbF9mbGFnKSB7CisgICAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoX3RhZyk7CisgICAgICBzd2l0Y2ggKF90YWcpIHsKKyAgICAgIGNhc2UgaWZhY2U6CisgICAgICAgIF9haWRsX3BhcmNlbC53cml0ZVN0cm9uZ0ludGVyZmFjZShnZXRJZmFjZSgpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIG51bGxhYmxlX2lmYWNlOgorICAgICAgICBfYWlkbF9wYXJjZWwud3JpdGVTdHJvbmdJbnRlcmZhY2UoZ2V0TnVsbGFibGVfaWZhY2UoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBpZmFjZV9hcnJheToKKyAgICAgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50ZXJmYWNlQXJyYXkoZ2V0SWZhY2VfYXJyYXkoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBudWxsYWJsZV9pZmFjZV9hcnJheToKKyAgICAgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50ZXJmYWNlQXJyYXkoZ2V0TnVsbGFibGVfaWZhY2VfYXJyYXkoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlYWRGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3BhcmNlbCkgeworICAgICAgaW50IF9haWRsX3RhZzsKKyAgICAgIF9haWRsX3RhZyA9IF9haWRsX3BhcmNlbC5yZWFkSW50KCk7CisgICAgICBzd2l0Y2ggKF9haWRsX3RhZykgeworICAgICAgY2FzZSBpZmFjZTogeworICAgICAgICBhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlIF9haWRsX3ZhbHVlOworICAgICAgICBfYWlkbF92YWx1ZSA9IGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UuU3R1Yi5hc0ludGVyZmFjZShfYWlkbF9wYXJjZWwucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgX3NldChfYWlkbF90YWcsIF9haWRsX3ZhbHVlKTsKKyAgICAgICAgcmV0dXJuOyB9CisgICAgICBjYXNlIG51bGxhYmxlX2lmYWNlOiB7CisgICAgICAgIGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UgX2FpZGxfdmFsdWU7CisgICAgICAgIF9haWRsX3ZhbHVlID0gYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZS5TdHViLmFzSW50ZXJmYWNlKF9haWRsX3BhcmNlbC5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICBfc2V0KF9haWRsX3RhZywgX2FpZGxfdmFsdWUpOworICAgICAgICByZXR1cm47IH0KKyAgICAgIGNhc2UgaWZhY2VfYXJyYXk6IHsKKyAgICAgICAgYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZVtdIF9haWRsX3ZhbHVlOworICAgICAgICBfYWlkbF92YWx1ZSA9IF9haWRsX3BhcmNlbC5jcmVhdGVJbnRlcmZhY2VBcnJheShhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlW106Om5ldywgYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZS5TdHViOjphc0ludGVyZmFjZSk7CisgICAgICAgIF9zZXQoX2FpZGxfdGFnLCBfYWlkbF92YWx1ZSk7CisgICAgICAgIHJldHVybjsgfQorICAgICAgY2FzZSBudWxsYWJsZV9pZmFjZV9hcnJheTogeworICAgICAgICBhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlW10gX2FpZGxfdmFsdWU7CisgICAgICAgIF9haWRsX3ZhbHVlID0gX2FpZGxfcGFyY2VsLmNyZWF0ZUludGVyZmFjZUFycmF5KGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2VbXTo6bmV3LCBhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlLlN0dWI6OmFzSW50ZXJmYWNlKTsKKyAgICAgICAgX3NldChfYWlkbF90YWcsIF9haWRsX3ZhbHVlKTsKKyAgICAgICAgcmV0dXJuOyB9CisgICAgICB9CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmlvbjogdW5rbm93biB0YWc6ICIgKyBfYWlkbF90YWcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKKyAgICAgIGludCBfbWFzayA9IDA7CisgICAgICBzd2l0Y2ggKGdldFRhZygpKSB7CisgICAgICB9CisgICAgICByZXR1cm4gX21hc2s7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgIHN3aXRjaCAoX3RhZykgeworICAgICAgY2FzZSBpZmFjZTogcmV0dXJuICJhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuTXlVbmlvbi5pZmFjZSgiICsgKGphdmEudXRpbC5PYmplY3RzLnRvU3RyaW5nKGdldElmYWNlKCkpKSArICIpIjsKKyAgICAgIGNhc2UgbnVsbGFibGVfaWZhY2U6IHJldHVybiAiYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLk15VW5pb24ubnVsbGFibGVfaWZhY2UoIiArIChqYXZhLnV0aWwuT2JqZWN0cy50b1N0cmluZyhnZXROdWxsYWJsZV9pZmFjZSgpKSkgKyAiKSI7CisgICAgICBjYXNlIGlmYWNlX2FycmF5OiByZXR1cm4gImFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5NeVVuaW9uLmlmYWNlX2FycmF5KCIgKyAoamF2YS51dGlsLkFycmF5cy50b1N0cmluZyhnZXRJZmFjZV9hcnJheSgpKSkgKyAiKSI7CisgICAgICBjYXNlIG51bGxhYmxlX2lmYWNlX2FycmF5OiByZXR1cm4gImFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5NeVVuaW9uLm51bGxhYmxlX2lmYWNlX2FycmF5KCIgKyAoamF2YS51dGlsLkFycmF5cy50b1N0cmluZyhnZXROdWxsYWJsZV9pZmFjZV9hcnJheSgpKSkgKyAiKSI7CisgICAgICB9CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ1bmtub3duIGZpZWxkOiAiICsgX3RhZyk7CisgICAgfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKKyAgICAgIGlmICh0aGlzID09IG90aGVyKSByZXR1cm4gdHJ1ZTsKKyAgICAgIGlmIChvdGhlciA9PSBudWxsKSByZXR1cm4gZmFsc2U7CisgICAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIE15VW5pb24pKSByZXR1cm4gZmFsc2U7CisgICAgICBNeVVuaW9uIHRoYXQgPSAoTXlVbmlvbilvdGhlcjsKKyAgICAgIGlmIChfdGFnICE9IHRoYXQuX3RhZykgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKCFqYXZhLnV0aWwuT2JqZWN0cy5kZWVwRXF1YWxzKF92YWx1ZSwgdGhhdC5fdmFsdWUpKSByZXR1cm4gZmFsc2U7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgcmV0dXJuIGphdmEudXRpbC5BcnJheXMuZGVlcEhhc2hDb2RlKGphdmEudXRpbC5BcnJheXMuYXNMaXN0KF90YWcsIF92YWx1ZSkudG9BcnJheSgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgX2Fzc2VydFRhZyhpbnQgdGFnKSB7CisgICAgICBpZiAoZ2V0VGFnKCkgIT0gdGFnKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImJhZCBhY2Nlc3M6ICIgKyBfdGFnU3RyaW5nKHRhZykgKyAiLCAiICsgX3RhZ1N0cmluZyhnZXRUYWcoKSkgKyAiIGlzIGF2YWlsYWJsZS4iKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBfdGFnU3RyaW5nKGludCBfdGFnKSB7CisgICAgICBzd2l0Y2ggKF90YWcpIHsKKyAgICAgIGNhc2UgaWZhY2U6IHJldHVybiAiaWZhY2UiOworICAgICAgY2FzZSBudWxsYWJsZV9pZmFjZTogcmV0dXJuICJudWxsYWJsZV9pZmFjZSI7CisgICAgICBjYXNlIGlmYWNlX2FycmF5OiByZXR1cm4gImlmYWNlX2FycmF5IjsKKyAgICAgIGNhc2UgbnVsbGFibGVfaWZhY2VfYXJyYXk6IHJldHVybiAibnVsbGFibGVfaWZhY2VfYXJyYXkiOworICAgICAgfQorICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidW5rbm93biBmaWVsZDogIiArIF90YWcpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBfc2V0KGludCBfdGFnLCBPYmplY3QgX3ZhbHVlKSB7CisgICAgICB0aGlzLl90YWcgPSBfdGFnOworICAgICAgdGhpcy5fdmFsdWUgPSBfdmFsdWU7CisgICAgfQorICAgIHB1YmxpYyBzdGF0aWMgQGludGVyZmFjZSBUYWcgeworICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWZhY2UgPSAwOworICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbnVsbGFibGVfaWZhY2UgPSAxOworICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWZhY2VfYXJyYXkgPSAyOworICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbnVsbGFibGVfaWZhY2VfYXJyYXkgPSAzOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvQXJyYXlPZkludGVyZmFjZXMuamF2YS5kIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvQXJyYXlPZkludGVyZmFjZXMuamF2YS5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MDVmYmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9BcnJheU9mSW50ZXJmYWNlcy5qYXZhLmQKQEAgLTAsMCArMSwyIEBACitvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0FycmF5T2ZJbnRlcmZhY2VzLmphdmEgOiBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9BcnJheU9mSW50ZXJmYWNlcy5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9CeXRlRW51bS5qYXZhIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvQnl0ZUVudW0uamF2YQppbmRleCAwZjVhM2VhLi40MmZlMWVkIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9CeXRlRW51bS5qYXZhCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0J5dGVFbnVtLmphdmEKQEAgLTIsOSArMiw3IEBACiAgKiBUaGlzIGZpbGUgaXMgYXV0by1nZW5lcmF0ZWQuICBETyBOT1QgTU9ESUZZLgogICovCiBwYWNrYWdlIGFuZHJvaWQuYWlkbC50ZXN0czsKLS8qKgotICogSGVsbG8sIHdvcmxkIQotICovCisvKiogSGVsbG8sIHdvcmxkISAqLwogcHVibGljIEBpbnRlcmZhY2UgQnl0ZUVudW0gewogICAvLyBDb21tZW50IGFib3V0IEZPTy4KICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIEZPTyA9IDE7CmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9EZXByZWNhdGVkUGFyY2VsYWJsZS5qYXZhIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvRGVwcmVjYXRlZFBhcmNlbGFibGUuamF2YQppbmRleCBmMTQ0NGJhLi5jYjE3MzY3IDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9EZXByZWNhdGVkUGFyY2VsYWJsZS5qYXZhCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0RlcHJlY2F0ZWRQYXJjZWxhYmxlLmphdmEKQEAgLTMyLDcgKzMyLDcgQEAKICAgICBpbnQgX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpOwogICAgIGludCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSBfYWlkbF9wYXJjZWwucmVhZEludCgpOwogICAgIHRyeSB7Ci0gICAgICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9zaXplIDwgMCkgcmV0dXJuOworICAgICAgaWYgKF9haWRsX3BhcmNlbGFibGVfc2l6ZSA8IDQpIHRocm93IG5ldyBhbmRyb2lkLm9zLkJhZFBhcmNlbGFibGVFeGNlcHRpb24oIlBhcmNlbGFibGUgdG9vIHNtYWxsIik7OwogICAgIH0gZmluYWxseSB7CiAgICAgICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gKEludGVnZXIuTUFYX1ZBTFVFIC0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSkgewogICAgICAgICB0aHJvdyBuZXcgYW5kcm9pZC5vcy5CYWRQYXJjZWxhYmxlRXhjZXB0aW9uKCJPdmVyZmxvdyBpbiB0aGUgc2l6ZSBvZiBwYXJjZWxhYmxlIik7CmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9GaXhlZFNpemUuamF2YSBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0ZpeGVkU2l6ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MzcwNjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9GaXhlZFNpemUuamF2YQpAQCAtMCwwICsxLDQxOCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBhdXRvLWdlbmVyYXRlZC4gIERPIE5PVCBNT0RJRlkuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5haWRsLnRlc3RzOworcHVibGljIGNsYXNzIEZpeGVkU2l6ZSBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZQoreworICBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsYWJsZS5DcmVhdG9yPEZpeGVkU2l6ZT4gQ1JFQVRPUiA9IG5ldyBhbmRyb2lkLm9zLlBhcmNlbGFibGUuQ3JlYXRvcjxGaXhlZFNpemU+KCkgeworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBGaXhlZFNpemUgY3JlYXRlRnJvbVBhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9zb3VyY2UpIHsKKyAgICAgIEZpeGVkU2l6ZSBfYWlkbF9vdXQgPSBuZXcgRml4ZWRTaXplKCk7CisgICAgICBfYWlkbF9vdXQucmVhZEZyb21QYXJjZWwoX2FpZGxfc291cmNlKTsKKyAgICAgIHJldHVybiBfYWlkbF9vdXQ7CisgICAgfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBGaXhlZFNpemVbXSBuZXdBcnJheShpbnQgX2FpZGxfc2l6ZSkgeworICAgICAgcmV0dXJuIG5ldyBGaXhlZFNpemVbX2FpZGxfc2l6ZV07CisgICAgfQorICB9OworICBAT3ZlcnJpZGUgcHVibGljIGZpbmFsIHZvaWQgd3JpdGVUb1BhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9wYXJjZWwsIGludCBfYWlkbF9mbGFnKQorICB7CisgICAgaW50IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoMCk7CisgICAgaW50IF9haWRsX2VuZF9wb3MgPSBfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCk7CisgICAgX2FpZGxfcGFyY2VsLnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MpOworICAgIF9haWRsX3BhcmNlbC53cml0ZUludChfYWlkbF9lbmRfcG9zIC0gX2FpZGxfc3RhcnRfcG9zKTsKKyAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX2VuZF9wb3MpOworICB9CisgIHB1YmxpYyBmaW5hbCB2b2lkIHJlYWRGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3BhcmNlbCkKKyAgeworICAgIGludCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCk7CisgICAgaW50IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IF9haWRsX3BhcmNlbC5yZWFkSW50KCk7CisgICAgdHJ5IHsKKyAgICAgIGlmIChfYWlkbF9wYXJjZWxhYmxlX3NpemUgPCA0KSB0aHJvdyBuZXcgYW5kcm9pZC5vcy5CYWRQYXJjZWxhYmxlRXhjZXB0aW9uKCJQYXJjZWxhYmxlIHRvbyBzbWFsbCIpOzsKKyAgICB9IGZpbmFsbHkgeworICAgICAgaWYgKF9haWRsX3N0YXJ0X3BvcyA+IChJbnRlZ2VyLk1BWF9WQUxVRSAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkpIHsKKyAgICAgICAgdGhyb3cgbmV3IGFuZHJvaWQub3MuQmFkUGFyY2VsYWJsZUV4Y2VwdGlvbigiT3ZlcmZsb3cgaW4gdGhlIHNpemUgb2YgcGFyY2VsYWJsZSIpOworICAgICAgfQorICAgICAgX2FpZGxfcGFyY2VsLnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIH0KKyAgfQorICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgIGludCBfbWFzayA9IDA7CisgICAgcmV0dXJuIF9tYXNrOworICB9CisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRml4ZWRQYXJjZWxhYmxlIGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlCisgIHsKKyAgICBwdWJsaWMgYm9vbGVhbiBib29sZWFuVmFsdWUgPSBmYWxzZTsKKyAgICBwdWJsaWMgYnl0ZSBieXRlVmFsdWUgPSAwOworICAgIHB1YmxpYyBjaGFyIGNoYXJWYWx1ZSA9ICdcMCc7CisgICAgcHVibGljIGludCBpbnRWYWx1ZSA9IDA7CisgICAgcHVibGljIGxvbmcgbG9uZ1ZhbHVlID0gMEw7CisgICAgcHVibGljIGZsb2F0IGZsb2F0VmFsdWUgPSAwLjAwMDAwMGY7CisgICAgcHVibGljIGRvdWJsZSBkb3VibGVWYWx1ZSA9IDAuMDAwMDAwOworICAgIHB1YmxpYyBsb25nIGVudW1WYWx1ZSA9IGFuZHJvaWQuYWlkbC50ZXN0cy5Mb25nRW51bS5GT087CisgICAgcHVibGljIGFuZHJvaWQuYWlkbC50ZXN0cy5GaXhlZFNpemUuRml4ZWRVbmlvbiBwYXJjZWxhYmxlVmFsdWU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm9zLlBhcmNlbGFibGUuQ3JlYXRvcjxGaXhlZFBhcmNlbGFibGU+IENSRUFUT1IgPSBuZXcgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3I8Rml4ZWRQYXJjZWxhYmxlPigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIEZpeGVkUGFyY2VsYWJsZSBjcmVhdGVGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3NvdXJjZSkgeworICAgICAgICBGaXhlZFBhcmNlbGFibGUgX2FpZGxfb3V0ID0gbmV3IEZpeGVkUGFyY2VsYWJsZSgpOworICAgICAgICBfYWlkbF9vdXQucmVhZEZyb21QYXJjZWwoX2FpZGxfc291cmNlKTsKKyAgICAgICAgcmV0dXJuIF9haWRsX291dDsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIEZpeGVkUGFyY2VsYWJsZVtdIG5ld0FycmF5KGludCBfYWlkbF9zaXplKSB7CisgICAgICAgIHJldHVybiBuZXcgRml4ZWRQYXJjZWxhYmxlW19haWRsX3NpemVdOworICAgICAgfQorICAgIH07CisgICAgQE92ZXJyaWRlIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlVG9QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgX2FpZGxfcGFyY2VsLCBpbnQgX2FpZGxfZmxhZykKKyAgICB7CisgICAgICBpbnQgX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpOworICAgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KDApOworICAgICAgX2FpZGxfcGFyY2VsLndyaXRlQm9vbGVhbihib29sZWFuVmFsdWUpOworICAgICAgX2FpZGxfcGFyY2VsLndyaXRlQnl0ZShieXRlVmFsdWUpOworICAgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KCgoaW50KWNoYXJWYWx1ZSkpOworICAgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KGludFZhbHVlKTsKKyAgICAgIF9haWRsX3BhcmNlbC53cml0ZUxvbmcobG9uZ1ZhbHVlKTsKKyAgICAgIF9haWRsX3BhcmNlbC53cml0ZUZsb2F0KGZsb2F0VmFsdWUpOworICAgICAgX2FpZGxfcGFyY2VsLndyaXRlRG91YmxlKGRvdWJsZVZhbHVlKTsKKyAgICAgIF9haWRsX3BhcmNlbC53cml0ZUxvbmcoZW51bVZhbHVlKTsKKyAgICAgIF9haWRsX3BhcmNlbC53cml0ZVR5cGVkT2JqZWN0KHBhcmNlbGFibGVWYWx1ZSwgX2FpZGxfZmxhZyk7CisgICAgICBpbnQgX2FpZGxfZW5kX3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKKyAgICAgIF9haWRsX3BhcmNlbC5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zKTsKKyAgICAgIF9haWRsX3BhcmNlbC53cml0ZUludChfYWlkbF9lbmRfcG9zIC0gX2FpZGxfc3RhcnRfcG9zKTsKKyAgICAgIF9haWRsX3BhcmNlbC5zZXREYXRhUG9zaXRpb24oX2FpZGxfZW5kX3Bvcyk7CisgICAgfQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJlYWRGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3BhcmNlbCkKKyAgICB7CisgICAgICBpbnQgX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpOworICAgICAgaW50IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IF9haWRsX3BhcmNlbC5yZWFkSW50KCk7CisgICAgICB0cnkgeworICAgICAgICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9zaXplIDwgNCkgdGhyb3cgbmV3IGFuZHJvaWQub3MuQmFkUGFyY2VsYWJsZUV4Y2VwdGlvbigiUGFyY2VsYWJsZSB0b28gc21hbGwiKTs7CisgICAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICAgIGJvb2xlYW5WYWx1ZSA9IF9haWRsX3BhcmNlbC5yZWFkQm9vbGVhbigpOworICAgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgICBieXRlVmFsdWUgPSBfYWlkbF9wYXJjZWwucmVhZEJ5dGUoKTsKKyAgICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgICAgY2hhclZhbHVlID0gKGNoYXIpX2FpZGxfcGFyY2VsLnJlYWRJbnQoKTsKKyAgICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgICAgaW50VmFsdWUgPSBfYWlkbF9wYXJjZWwucmVhZEludCgpOworICAgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgICBsb25nVmFsdWUgPSBfYWlkbF9wYXJjZWwucmVhZExvbmcoKTsKKyAgICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgICAgZmxvYXRWYWx1ZSA9IF9haWRsX3BhcmNlbC5yZWFkRmxvYXQoKTsKKyAgICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgICAgZG91YmxlVmFsdWUgPSBfYWlkbF9wYXJjZWwucmVhZERvdWJsZSgpOworICAgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgICBlbnVtVmFsdWUgPSBfYWlkbF9wYXJjZWwucmVhZExvbmcoKTsKKyAgICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgICAgcGFyY2VsYWJsZVZhbHVlID0gX2FpZGxfcGFyY2VsLnJlYWRUeXBlZE9iamVjdChhbmRyb2lkLmFpZGwudGVzdHMuRml4ZWRTaXplLkZpeGVkVW5pb24uQ1JFQVRPUik7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gKEludGVnZXIuTUFYX1ZBTFVFIC0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSkgeworICAgICAgICAgIHRocm93IG5ldyBhbmRyb2lkLm9zLkJhZFBhcmNlbGFibGVFeGNlcHRpb24oIk92ZXJmbG93IGluIHRoZSBzaXplIG9mIHBhcmNlbGFibGUiKTsKKyAgICAgICAgfQorICAgICAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgICB9CisgICAgfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKKyAgICAgIGludCBfbWFzayA9IDA7CisgICAgICBfbWFzayB8PSBkZXNjcmliZUNvbnRlbnRzKHBhcmNlbGFibGVWYWx1ZSk7CisgICAgICByZXR1cm4gX21hc2s7CisgICAgfQorICAgIHByaXZhdGUgaW50IGRlc2NyaWJlQ29udGVudHMoT2JqZWN0IF92KSB7CisgICAgICBpZiAoX3YgPT0gbnVsbCkgcmV0dXJuIDA7CisgICAgICBpZiAoX3YgaW5zdGFuY2VvZiBhbmRyb2lkLm9zLlBhcmNlbGFibGUpIHsKKyAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5vcy5QYXJjZWxhYmxlKSBfdikuZGVzY3JpYmVDb250ZW50cygpOworICAgICAgfQorICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRml4ZWRVbmlvbiBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSB7CisgICAgLy8gdGFncyBmb3IgdW5pb24gZmllbGRzCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgYm9vbGVhblZhbHVlID0gMDsgIC8vIGJvb2xlYW4gYm9vbGVhblZhbHVlOworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IGJ5dGVWYWx1ZSA9IDE7ICAvLyBieXRlIGJ5dGVWYWx1ZTsKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBjaGFyVmFsdWUgPSAyOyAgLy8gY2hhciBjaGFyVmFsdWU7CisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgaW50VmFsdWUgPSAzOyAgLy8gaW50IGludFZhbHVlOworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IGxvbmdWYWx1ZSA9IDQ7ICAvLyBsb25nIGxvbmdWYWx1ZTsKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBmbG9hdFZhbHVlID0gNTsgIC8vIGZsb2F0IGZsb2F0VmFsdWU7CisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgZG91YmxlVmFsdWUgPSA2OyAgLy8gZG91YmxlIGRvdWJsZVZhbHVlOworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IGVudW1WYWx1ZSA9IDc7ICAvLyBhbmRyb2lkLmFpZGwudGVzdHMuTG9uZ0VudW0gZW51bVZhbHVlOworCisgICAgcHJpdmF0ZSBpbnQgX3RhZzsKKyAgICBwcml2YXRlIE9iamVjdCBfdmFsdWU7CisKKyAgICBwdWJsaWMgRml4ZWRVbmlvbigpIHsKKyAgICAgIGJvb2xlYW4gX3ZhbHVlID0gZmFsc2U7CisgICAgICB0aGlzLl90YWcgPSBib29sZWFuVmFsdWU7CisgICAgICB0aGlzLl92YWx1ZSA9IF92YWx1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIEZpeGVkVW5pb24oYW5kcm9pZC5vcy5QYXJjZWwgX2FpZGxfcGFyY2VsKSB7CisgICAgICByZWFkRnJvbVBhcmNlbChfYWlkbF9wYXJjZWwpOworICAgIH0KKworICAgIHByaXZhdGUgRml4ZWRVbmlvbihpbnQgX3RhZywgT2JqZWN0IF92YWx1ZSkgeworICAgICAgdGhpcy5fdGFnID0gX3RhZzsKKyAgICAgIHRoaXMuX3ZhbHVlID0gX3ZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0VGFnKCkgeworICAgICAgcmV0dXJuIF90YWc7CisgICAgfQorCisgICAgLy8gYm9vbGVhbiBib29sZWFuVmFsdWU7CisKKyAgICBwdWJsaWMgc3RhdGljIEZpeGVkVW5pb24gYm9vbGVhblZhbHVlKGJvb2xlYW4gX3ZhbHVlKSB7CisgICAgICByZXR1cm4gbmV3IEZpeGVkVW5pb24oYm9vbGVhblZhbHVlLCBfdmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGdldEJvb2xlYW5WYWx1ZSgpIHsKKyAgICAgIF9hc3NlcnRUYWcoYm9vbGVhblZhbHVlKTsKKyAgICAgIHJldHVybiAoYm9vbGVhbikgX3ZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEJvb2xlYW5WYWx1ZShib29sZWFuIF92YWx1ZSkgeworICAgICAgX3NldChib29sZWFuVmFsdWUsIF92YWx1ZSk7CisgICAgfQorCisgICAgLy8gYnl0ZSBieXRlVmFsdWU7CisKKyAgICBwdWJsaWMgc3RhdGljIEZpeGVkVW5pb24gYnl0ZVZhbHVlKGJ5dGUgX3ZhbHVlKSB7CisgICAgICByZXR1cm4gbmV3IEZpeGVkVW5pb24oYnl0ZVZhbHVlLCBfdmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBieXRlIGdldEJ5dGVWYWx1ZSgpIHsKKyAgICAgIF9hc3NlcnRUYWcoYnl0ZVZhbHVlKTsKKyAgICAgIHJldHVybiAoYnl0ZSkgX3ZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEJ5dGVWYWx1ZShieXRlIF92YWx1ZSkgeworICAgICAgX3NldChieXRlVmFsdWUsIF92YWx1ZSk7CisgICAgfQorCisgICAgLy8gY2hhciBjaGFyVmFsdWU7CisKKyAgICBwdWJsaWMgc3RhdGljIEZpeGVkVW5pb24gY2hhclZhbHVlKGNoYXIgX3ZhbHVlKSB7CisgICAgICByZXR1cm4gbmV3IEZpeGVkVW5pb24oY2hhclZhbHVlLCBfdmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBjaGFyIGdldENoYXJWYWx1ZSgpIHsKKyAgICAgIF9hc3NlcnRUYWcoY2hhclZhbHVlKTsKKyAgICAgIHJldHVybiAoY2hhcikgX3ZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENoYXJWYWx1ZShjaGFyIF92YWx1ZSkgeworICAgICAgX3NldChjaGFyVmFsdWUsIF92YWx1ZSk7CisgICAgfQorCisgICAgLy8gaW50IGludFZhbHVlOworCisgICAgcHVibGljIHN0YXRpYyBGaXhlZFVuaW9uIGludFZhbHVlKGludCBfdmFsdWUpIHsKKyAgICAgIHJldHVybiBuZXcgRml4ZWRVbmlvbihpbnRWYWx1ZSwgX3ZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEludFZhbHVlKCkgeworICAgICAgX2Fzc2VydFRhZyhpbnRWYWx1ZSk7CisgICAgICByZXR1cm4gKGludCkgX3ZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEludFZhbHVlKGludCBfdmFsdWUpIHsKKyAgICAgIF9zZXQoaW50VmFsdWUsIF92YWx1ZSk7CisgICAgfQorCisgICAgLy8gbG9uZyBsb25nVmFsdWU7CisKKyAgICBwdWJsaWMgc3RhdGljIEZpeGVkVW5pb24gbG9uZ1ZhbHVlKGxvbmcgX3ZhbHVlKSB7CisgICAgICByZXR1cm4gbmV3IEZpeGVkVW5pb24obG9uZ1ZhbHVlLCBfdmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldExvbmdWYWx1ZSgpIHsKKyAgICAgIF9hc3NlcnRUYWcobG9uZ1ZhbHVlKTsKKyAgICAgIHJldHVybiAobG9uZykgX3ZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldExvbmdWYWx1ZShsb25nIF92YWx1ZSkgeworICAgICAgX3NldChsb25nVmFsdWUsIF92YWx1ZSk7CisgICAgfQorCisgICAgLy8gZmxvYXQgZmxvYXRWYWx1ZTsKKworICAgIHB1YmxpYyBzdGF0aWMgRml4ZWRVbmlvbiBmbG9hdFZhbHVlKGZsb2F0IF92YWx1ZSkgeworICAgICAgcmV0dXJuIG5ldyBGaXhlZFVuaW9uKGZsb2F0VmFsdWUsIF92YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIGZsb2F0IGdldEZsb2F0VmFsdWUoKSB7CisgICAgICBfYXNzZXJ0VGFnKGZsb2F0VmFsdWUpOworICAgICAgcmV0dXJuIChmbG9hdCkgX3ZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEZsb2F0VmFsdWUoZmxvYXQgX3ZhbHVlKSB7CisgICAgICBfc2V0KGZsb2F0VmFsdWUsIF92YWx1ZSk7CisgICAgfQorCisgICAgLy8gZG91YmxlIGRvdWJsZVZhbHVlOworCisgICAgcHVibGljIHN0YXRpYyBGaXhlZFVuaW9uIGRvdWJsZVZhbHVlKGRvdWJsZSBfdmFsdWUpIHsKKyAgICAgIHJldHVybiBuZXcgRml4ZWRVbmlvbihkb3VibGVWYWx1ZSwgX3ZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZG91YmxlIGdldERvdWJsZVZhbHVlKCkgeworICAgICAgX2Fzc2VydFRhZyhkb3VibGVWYWx1ZSk7CisgICAgICByZXR1cm4gKGRvdWJsZSkgX3ZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERvdWJsZVZhbHVlKGRvdWJsZSBfdmFsdWUpIHsKKyAgICAgIF9zZXQoZG91YmxlVmFsdWUsIF92YWx1ZSk7CisgICAgfQorCisgICAgLy8gYW5kcm9pZC5haWRsLnRlc3RzLkxvbmdFbnVtIGVudW1WYWx1ZTsKKworICAgIHB1YmxpYyBzdGF0aWMgRml4ZWRVbmlvbiBlbnVtVmFsdWUobG9uZyBfdmFsdWUpIHsKKyAgICAgIHJldHVybiBuZXcgRml4ZWRVbmlvbihlbnVtVmFsdWUsIF92YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0RW51bVZhbHVlKCkgeworICAgICAgX2Fzc2VydFRhZyhlbnVtVmFsdWUpOworICAgICAgcmV0dXJuIChsb25nKSBfdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RW51bVZhbHVlKGxvbmcgX3ZhbHVlKSB7CisgICAgICBfc2V0KGVudW1WYWx1ZSwgX3ZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsYWJsZS5DcmVhdG9yPEZpeGVkVW5pb24+IENSRUFUT1IgPSBuZXcgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3I8Rml4ZWRVbmlvbj4oKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBGaXhlZFVuaW9uIGNyZWF0ZUZyb21QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgX2FpZGxfc291cmNlKSB7CisgICAgICAgIHJldHVybiBuZXcgRml4ZWRVbmlvbihfYWlkbF9zb3VyY2UpOworICAgICAgfQorICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgRml4ZWRVbmlvbltdIG5ld0FycmF5KGludCBfYWlkbF9zaXplKSB7CisgICAgICAgIHJldHVybiBuZXcgRml4ZWRVbmlvbltfYWlkbF9zaXplXTsKKyAgICAgIH0KKyAgICB9OworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGZpbmFsIHZvaWQgd3JpdGVUb1BhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9wYXJjZWwsIGludCBfYWlkbF9mbGFnKSB7CisgICAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoX3RhZyk7CisgICAgICBzd2l0Y2ggKF90YWcpIHsKKyAgICAgIGNhc2UgYm9vbGVhblZhbHVlOgorICAgICAgICBfYWlkbF9wYXJjZWwud3JpdGVCb29sZWFuKGdldEJvb2xlYW5WYWx1ZSgpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIGJ5dGVWYWx1ZToKKyAgICAgICAgX2FpZGxfcGFyY2VsLndyaXRlQnl0ZShnZXRCeXRlVmFsdWUoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBjaGFyVmFsdWU6CisgICAgICAgIF9haWRsX3BhcmNlbC53cml0ZUludCgoKGludClnZXRDaGFyVmFsdWUoKSkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgaW50VmFsdWU6CisgICAgICAgIF9haWRsX3BhcmNlbC53cml0ZUludChnZXRJbnRWYWx1ZSgpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIGxvbmdWYWx1ZToKKyAgICAgICAgX2FpZGxfcGFyY2VsLndyaXRlTG9uZyhnZXRMb25nVmFsdWUoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBmbG9hdFZhbHVlOgorICAgICAgICBfYWlkbF9wYXJjZWwud3JpdGVGbG9hdChnZXRGbG9hdFZhbHVlKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgZG91YmxlVmFsdWU6CisgICAgICAgIF9haWRsX3BhcmNlbC53cml0ZURvdWJsZShnZXREb3VibGVWYWx1ZSgpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIGVudW1WYWx1ZToKKyAgICAgICAgX2FpZGxfcGFyY2VsLndyaXRlTG9uZyhnZXRFbnVtVmFsdWUoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlYWRGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3BhcmNlbCkgeworICAgICAgaW50IF9haWRsX3RhZzsKKyAgICAgIF9haWRsX3RhZyA9IF9haWRsX3BhcmNlbC5yZWFkSW50KCk7CisgICAgICBzd2l0Y2ggKF9haWRsX3RhZykgeworICAgICAgY2FzZSBib29sZWFuVmFsdWU6IHsKKyAgICAgICAgYm9vbGVhbiBfYWlkbF92YWx1ZTsKKyAgICAgICAgX2FpZGxfdmFsdWUgPSBfYWlkbF9wYXJjZWwucmVhZEJvb2xlYW4oKTsKKyAgICAgICAgX3NldChfYWlkbF90YWcsIF9haWRsX3ZhbHVlKTsKKyAgICAgICAgcmV0dXJuOyB9CisgICAgICBjYXNlIGJ5dGVWYWx1ZTogeworICAgICAgICBieXRlIF9haWRsX3ZhbHVlOworICAgICAgICBfYWlkbF92YWx1ZSA9IF9haWRsX3BhcmNlbC5yZWFkQnl0ZSgpOworICAgICAgICBfc2V0KF9haWRsX3RhZywgX2FpZGxfdmFsdWUpOworICAgICAgICByZXR1cm47IH0KKyAgICAgIGNhc2UgY2hhclZhbHVlOiB7CisgICAgICAgIGNoYXIgX2FpZGxfdmFsdWU7CisgICAgICAgIF9haWRsX3ZhbHVlID0gKGNoYXIpX2FpZGxfcGFyY2VsLnJlYWRJbnQoKTsKKyAgICAgICAgX3NldChfYWlkbF90YWcsIF9haWRsX3ZhbHVlKTsKKyAgICAgICAgcmV0dXJuOyB9CisgICAgICBjYXNlIGludFZhbHVlOiB7CisgICAgICAgIGludCBfYWlkbF92YWx1ZTsKKyAgICAgICAgX2FpZGxfdmFsdWUgPSBfYWlkbF9wYXJjZWwucmVhZEludCgpOworICAgICAgICBfc2V0KF9haWRsX3RhZywgX2FpZGxfdmFsdWUpOworICAgICAgICByZXR1cm47IH0KKyAgICAgIGNhc2UgbG9uZ1ZhbHVlOiB7CisgICAgICAgIGxvbmcgX2FpZGxfdmFsdWU7CisgICAgICAgIF9haWRsX3ZhbHVlID0gX2FpZGxfcGFyY2VsLnJlYWRMb25nKCk7CisgICAgICAgIF9zZXQoX2FpZGxfdGFnLCBfYWlkbF92YWx1ZSk7CisgICAgICAgIHJldHVybjsgfQorICAgICAgY2FzZSBmbG9hdFZhbHVlOiB7CisgICAgICAgIGZsb2F0IF9haWRsX3ZhbHVlOworICAgICAgICBfYWlkbF92YWx1ZSA9IF9haWRsX3BhcmNlbC5yZWFkRmxvYXQoKTsKKyAgICAgICAgX3NldChfYWlkbF90YWcsIF9haWRsX3ZhbHVlKTsKKyAgICAgICAgcmV0dXJuOyB9CisgICAgICBjYXNlIGRvdWJsZVZhbHVlOiB7CisgICAgICAgIGRvdWJsZSBfYWlkbF92YWx1ZTsKKyAgICAgICAgX2FpZGxfdmFsdWUgPSBfYWlkbF9wYXJjZWwucmVhZERvdWJsZSgpOworICAgICAgICBfc2V0KF9haWRsX3RhZywgX2FpZGxfdmFsdWUpOworICAgICAgICByZXR1cm47IH0KKyAgICAgIGNhc2UgZW51bVZhbHVlOiB7CisgICAgICAgIGxvbmcgX2FpZGxfdmFsdWU7CisgICAgICAgIF9haWRsX3ZhbHVlID0gX2FpZGxfcGFyY2VsLnJlYWRMb25nKCk7CisgICAgICAgIF9zZXQoX2FpZGxfdGFnLCBfYWlkbF92YWx1ZSk7CisgICAgICAgIHJldHVybjsgfQorICAgICAgfQorICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5pb246IHVua25vd24gdGFnOiAiICsgX2FpZGxfdGFnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgICBpbnQgX21hc2sgPSAwOworICAgICAgc3dpdGNoIChnZXRUYWcoKSkgeworICAgICAgfQorICAgICAgcmV0dXJuIF9tYXNrOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBfYXNzZXJ0VGFnKGludCB0YWcpIHsKKyAgICAgIGlmIChnZXRUYWcoKSAhPSB0YWcpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiYmFkIGFjY2VzczogIiArIF90YWdTdHJpbmcodGFnKSArICIsICIgKyBfdGFnU3RyaW5nKGdldFRhZygpKSArICIgaXMgYXZhaWxhYmxlLiIpOworICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIF90YWdTdHJpbmcoaW50IF90YWcpIHsKKyAgICAgIHN3aXRjaCAoX3RhZykgeworICAgICAgY2FzZSBib29sZWFuVmFsdWU6IHJldHVybiAiYm9vbGVhblZhbHVlIjsKKyAgICAgIGNhc2UgYnl0ZVZhbHVlOiByZXR1cm4gImJ5dGVWYWx1ZSI7CisgICAgICBjYXNlIGNoYXJWYWx1ZTogcmV0dXJuICJjaGFyVmFsdWUiOworICAgICAgY2FzZSBpbnRWYWx1ZTogcmV0dXJuICJpbnRWYWx1ZSI7CisgICAgICBjYXNlIGxvbmdWYWx1ZTogcmV0dXJuICJsb25nVmFsdWUiOworICAgICAgY2FzZSBmbG9hdFZhbHVlOiByZXR1cm4gImZsb2F0VmFsdWUiOworICAgICAgY2FzZSBkb3VibGVWYWx1ZTogcmV0dXJuICJkb3VibGVWYWx1ZSI7CisgICAgICBjYXNlIGVudW1WYWx1ZTogcmV0dXJuICJlbnVtVmFsdWUiOworICAgICAgfQorICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidW5rbm93biBmaWVsZDogIiArIF90YWcpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBfc2V0KGludCBfdGFnLCBPYmplY3QgX3ZhbHVlKSB7CisgICAgICB0aGlzLl90YWcgPSBfdGFnOworICAgICAgdGhpcy5fdmFsdWUgPSBfdmFsdWU7CisgICAgfQorICAgIHB1YmxpYyBzdGF0aWMgQGludGVyZmFjZSBUYWcgeworICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIGJvb2xlYW5WYWx1ZSA9IDA7CisgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgYnl0ZVZhbHVlID0gMTsKKyAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBjaGFyVmFsdWUgPSAyOworICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIGludFZhbHVlID0gMzsKKyAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBsb25nVmFsdWUgPSA0OworICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIGZsb2F0VmFsdWUgPSA1OworICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIGRvdWJsZVZhbHVlID0gNjsKKyAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBlbnVtVmFsdWUgPSA3OworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvRml4ZWRTaXplLmphdmEuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0ZpeGVkU2l6ZS5qYXZhLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRiMDkyYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0ZpeGVkU2l6ZS5qYXZhLmQKQEAgLTAsMCArMSwzIEBACitvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0ZpeGVkU2l6ZS5qYXZhIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvRml4ZWRTaXplLmFpZGwgXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvTG9uZ0VudW0uYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvR2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxlLmphdmEgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9HZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGUuamF2YQppbmRleCA5NGI2YTJlLi5lZTkzOTU2IDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9HZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGUuamF2YQorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9HZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGUuamF2YQpAQCAtMzQsNyArMzQsNyBAQAogICAgIGludCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCk7CiAgICAgaW50IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IF9haWRsX3BhcmNlbC5yZWFkSW50KCk7CiAgICAgdHJ5IHsKLSAgICAgIGlmIChfYWlkbF9wYXJjZWxhYmxlX3NpemUgPCAwKSByZXR1cm47CisgICAgICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9zaXplIDwgNCkgdGhyb3cgbmV3IGFuZHJvaWQub3MuQmFkUGFyY2VsYWJsZUV4Y2VwdGlvbigiUGFyY2VsYWJsZSB0b28gc21hbGwiKTs7CiAgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOwogICAgICAgYSA9IF9haWRsX3BhcmNlbC5yZWFkSW50KCk7CiAgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOwpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSURlcHJlY2F0ZWQuamF2YSBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lEZXByZWNhdGVkLmphdmEKaW5kZXggMDI5MGM3YS4uMDk1NzhmNSAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSURlcHJlY2F0ZWQuamF2YQorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JRGVwcmVjYXRlZC5qYXZhCkBAIC03NSwyMyArNzUsNiBAQAogICAgICAgewogICAgICAgICByZXR1cm4gREVTQ1JJUFRPUjsKICAgICAgIH0KLSAgICAgIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5haWRsLnRlc3RzLklEZXByZWNhdGVkIHNEZWZhdWx0SW1wbDsKLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHNldERlZmF1bHRJbXBsKGFuZHJvaWQuYWlkbC50ZXN0cy5JRGVwcmVjYXRlZCBpbXBsKSB7Ci0gICAgICAvLyBPbmx5IG9uZSB1c2VyIG9mIHRoaXMgaW50ZXJmYWNlIGNhbiB1c2UgdGhpcyBmdW5jdGlvbgotICAgICAgLy8gYXQgYSB0aW1lLiBUaGlzIGlzIGEgaGV1cmlzdGljIHRvIGRldGVjdCBpZiB0d28gZGlmZmVyZW50Ci0gICAgICAvLyB1c2VycyBpbiB0aGUgc2FtZSBwcm9jZXNzIHVzZSB0aGlzIGZ1bmN0aW9uLgotICAgICAgaWYgKFN0dWIuUHJveHkuc0RlZmF1bHRJbXBsICE9IG51bGwpIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigic2V0RGVmYXVsdEltcGwoKSBjYWxsZWQgdHdpY2UiKTsKLSAgICAgIH0KLSAgICAgIGlmIChpbXBsICE9IG51bGwpIHsKLSAgICAgICAgU3R1Yi5Qcm94eS5zRGVmYXVsdEltcGwgPSBpbXBsOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyBhbmRyb2lkLmFpZGwudGVzdHMuSURlcHJlY2F0ZWQgZ2V0RGVmYXVsdEltcGwoKSB7Ci0gICAgICByZXR1cm4gU3R1Yi5Qcm94eS5zRGVmYXVsdEltcGw7CiAgICAgfQogICB9CiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERVNDUklQVE9SID0gImFuZHJvaWQkYWlkbCR0ZXN0cyRJRGVwcmVjYXRlZCIucmVwbGFjZSgnJCcsICcuJyk7CmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JTmFtZWRDYWxsYmFjay5qYXZhIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSU5hbWVkQ2FsbGJhY2suamF2YQppbmRleCA2MGRkYzdhLi4zNTAwMjcxIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JTmFtZWRDYWxsYmFjay5qYXZhCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lOYW1lZENhbGxiYWNrLmphdmEKQEAgLTQ2LDYgKzQ2LDkgQEAKICAgICBAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gb25UcmFuc2FjdChpbnQgY29kZSwgYW5kcm9pZC5vcy5QYXJjZWwgZGF0YSwgYW5kcm9pZC5vcy5QYXJjZWwgcmVwbHksIGludCBmbGFncykgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCiAgICAgewogICAgICAgamF2YS5sYW5nLlN0cmluZyBkZXNjcmlwdG9yID0gREVTQ1JJUFRPUjsKKyAgICAgIGlmIChjb2RlID49IGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICYmIGNvZGUgPD0gYW5kcm9pZC5vcy5JQmluZGVyLkxBU1RfQ0FMTF9UUkFOU0FDVElPTikgeworICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoZGVzY3JpcHRvcik7CisgICAgICB9CiAgICAgICBzd2l0Y2ggKGNvZGUpCiAgICAgICB7CiAgICAgICAgIGNhc2UgSU5URVJGQUNFX1RSQU5TQUNUSU9OOgpAQCAtNTgsMTcgKzYxLDE3IEBACiAgICAgICB7CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fR2V0TmFtZToKICAgICAgICAgewotICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShkZXNjcmlwdG9yKTsKICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIF9yZXN1bHQgPSB0aGlzLkdldE5hbWUoKTsKICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVTdHJpbmcoX3Jlc3VsdCk7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgewogICAgICAgICAgIHJldHVybiBzdXBlci5vblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CiAgICAgICAgIH0KICAgICAgIH0KKyAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBQcm94eSBpbXBsZW1lbnRzIGFuZHJvaWQuYWlkbC50ZXN0cy5JTmFtZWRDYWxsYmFjawogICAgIHsKQEAgLTg3LDE3ICs5MCwxMiBAQAogICAgICAgfQogICAgICAgQE92ZXJyaWRlIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIEdldE5hbWUoKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KICAgICAgIHsKLSAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oYXNCaW5kZXIoKSk7CiAgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwogICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIF9yZXN1bHQ7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKICAgICAgICAgICBib29sZWFuIF9zdGF0dXMgPSBtUmVtb3RlLnRyYW5zYWN0KFN0dWIuVFJBTlNBQ1RJT05fR2V0TmFtZSwgX2RhdGEsIF9yZXBseSwgMCk7Ci0gICAgICAgICAgaWYgKCFfc3RhdHVzKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0RGVmYXVsdEltcGwoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgIHJldHVybiBnZXREZWZhdWx0SW1wbCgpLkdldE5hbWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9CiAgICAgICAgICAgX3JlcGx5LnJlYWRFeGNlcHRpb24oKTsKICAgICAgICAgICBfcmVzdWx0ID0gX3JlcGx5LnJlYWRTdHJpbmcoKTsKICAgICAgICAgfQpAQCAtMTA3LDI1ICsxMDUsOCBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBfcmVzdWx0OwogICAgICAgfQotICAgICAgcHVibGljIHN0YXRpYyBhbmRyb2lkLmFpZGwudGVzdHMuSU5hbWVkQ2FsbGJhY2sgc0RlZmF1bHRJbXBsOwogICAgIH0KICAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX0dldE5hbWUgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAwKTsKLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2V0RGVmYXVsdEltcGwoYW5kcm9pZC5haWRsLnRlc3RzLklOYW1lZENhbGxiYWNrIGltcGwpIHsKLSAgICAgIC8vIE9ubHkgb25lIHVzZXIgb2YgdGhpcyBpbnRlcmZhY2UgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uCi0gICAgICAvLyBhdCBhIHRpbWUuIFRoaXMgaXMgYSBoZXVyaXN0aWMgdG8gZGV0ZWN0IGlmIHR3byBkaWZmZXJlbnQKLSAgICAgIC8vIHVzZXJzIGluIHRoZSBzYW1lIHByb2Nlc3MgdXNlIHRoaXMgZnVuY3Rpb24uCi0gICAgICBpZiAoU3R1Yi5Qcm94eS5zRGVmYXVsdEltcGwgIT0gbnVsbCkgewotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJzZXREZWZhdWx0SW1wbCgpIGNhbGxlZCB0d2ljZSIpOwotICAgICAgfQotICAgICAgaWYgKGltcGwgIT0gbnVsbCkgewotICAgICAgICBTdHViLlByb3h5LnNEZWZhdWx0SW1wbCA9IGltcGw7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBwdWJsaWMgc3RhdGljIGFuZHJvaWQuYWlkbC50ZXN0cy5JTmFtZWRDYWxsYmFjayBnZXREZWZhdWx0SW1wbCgpIHsKLSAgICAgIHJldHVybiBTdHViLlByb3h5LnNEZWZhdWx0SW1wbDsKLSAgICB9CiAgIH0KICAgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFU0NSSVBUT1IgPSAiYW5kcm9pZCRhaWRsJHRlc3RzJElOYW1lZENhbGxiYWNrIi5yZXBsYWNlKCckJywgJy4nKTsKICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgR2V0TmFtZSgpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lOZXdOYW1lLmphdmEgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JTmV3TmFtZS5qYXZhCmluZGV4IDg5M2U0M2YuLjI2NWY4ZWYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lOZXdOYW1lLmphdmEKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSU5ld05hbWUuamF2YQpAQCAtNDYsNiArNDYsOSBAQAogICAgIEBPdmVycmlkZSBwdWJsaWMgYm9vbGVhbiBvblRyYW5zYWN0KGludCBjb2RlLCBhbmRyb2lkLm9zLlBhcmNlbCBkYXRhLCBhbmRyb2lkLm9zLlBhcmNlbCByZXBseSwgaW50IGZsYWdzKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KICAgICB7CiAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGRlc2NyaXB0b3IgPSBERVNDUklQVE9SOworICAgICAgaWYgKGNvZGUgPj0gYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gJiYgY29kZSA8PSBhbmRyb2lkLm9zLklCaW5kZXIuTEFTVF9DQUxMX1RSQU5TQUNUSU9OKSB7CisgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShkZXNjcmlwdG9yKTsKKyAgICAgIH0KICAgICAgIHN3aXRjaCAoY29kZSkKICAgICAgIHsKICAgICAgICAgY2FzZSBJTlRFUkZBQ0VfVFJBTlNBQ1RJT046CkBAIC01OCwxNyArNjEsMTcgQEAKICAgICAgIHsKICAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9SZWFsTmFtZToKICAgICAgICAgewotICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShkZXNjcmlwdG9yKTsKICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIF9yZXN1bHQgPSB0aGlzLlJlYWxOYW1lKCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOwogICAgICAgICAgIHJlcGx5LndyaXRlU3RyaW5nKF9yZXN1bHQpOwotICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgIHsKICAgICAgICAgICByZXR1cm4gc3VwZXIub25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwogICAgICAgICB9CiAgICAgICB9CisgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJveHkgaW1wbGVtZW50cyBhbmRyb2lkLmFpZGwudGVzdHMuSU5ld05hbWUKICAgICB7CkBAIC04NywxNyArOTAsMTIgQEAKICAgICAgIH0KICAgICAgIEBPdmVycmlkZSBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBSZWFsTmFtZSgpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgogICAgICAgewotICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbihhc0JpbmRlcigpKTsKICAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CiAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgX3Jlc3VsdDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOwogICAgICAgICAgIGJvb2xlYW4gX3N0YXR1cyA9IG1SZW1vdGUudHJhbnNhY3QoU3R1Yi5UUkFOU0FDVElPTl9SZWFsTmFtZSwgX2RhdGEsIF9yZXBseSwgMCk7Ci0gICAgICAgICAgaWYgKCFfc3RhdHVzKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0RGVmYXVsdEltcGwoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgIHJldHVybiBnZXREZWZhdWx0SW1wbCgpLlJlYWxOYW1lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQogICAgICAgICAgIF9yZXBseS5yZWFkRXhjZXB0aW9uKCk7CiAgICAgICAgICAgX3Jlc3VsdCA9IF9yZXBseS5yZWFkU3RyaW5nKCk7CiAgICAgICAgIH0KQEAgLTEwNywyNSArMTA1LDggQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gX3Jlc3VsdDsKICAgICAgIH0KLSAgICAgIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5haWRsLnRlc3RzLklOZXdOYW1lIHNEZWZhdWx0SW1wbDsKICAgICB9CiAgICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9SZWFsTmFtZSA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDApOwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzZXREZWZhdWx0SW1wbChhbmRyb2lkLmFpZGwudGVzdHMuSU5ld05hbWUgaW1wbCkgewotICAgICAgLy8gT25seSBvbmUgdXNlciBvZiB0aGlzIGludGVyZmFjZSBjYW4gdXNlIHRoaXMgZnVuY3Rpb24KLSAgICAgIC8vIGF0IGEgdGltZS4gVGhpcyBpcyBhIGhldXJpc3RpYyB0byBkZXRlY3QgaWYgdHdvIGRpZmZlcmVudAotICAgICAgLy8gdXNlcnMgaW4gdGhlIHNhbWUgcHJvY2VzcyB1c2UgdGhpcyBmdW5jdGlvbi4KLSAgICAgIGlmIChTdHViLlByb3h5LnNEZWZhdWx0SW1wbCAhPSBudWxsKSB7Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInNldERlZmF1bHRJbXBsKCkgY2FsbGVkIHR3aWNlIik7Ci0gICAgICB9Ci0gICAgICBpZiAoaW1wbCAhPSBudWxsKSB7Ci0gICAgICAgIFN0dWIuUHJveHkuc0RlZmF1bHRJbXBsID0gaW1wbDsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5haWRsLnRlc3RzLklOZXdOYW1lIGdldERlZmF1bHRJbXBsKCkgewotICAgICAgcmV0dXJuIFN0dWIuUHJveHkuc0RlZmF1bHRJbXBsOwotICAgIH0KICAgfQogICBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVTQ1JJUFRPUiA9ICJhbmRyb2lkJGFpZGwkdGVzdHMkSU9sZE5hbWUiLnJlcGxhY2UoJyQnLCAnLicpOwogICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBSZWFsTmFtZSgpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lPbGROYW1lLmphdmEgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JT2xkTmFtZS5qYXZhCmluZGV4IGM1MjM4N2MuLjcwMTNmY2UgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lPbGROYW1lLmphdmEKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSU9sZE5hbWUuamF2YQpAQCAtNDYsNiArNDYsOSBAQAogICAgIEBPdmVycmlkZSBwdWJsaWMgYm9vbGVhbiBvblRyYW5zYWN0KGludCBjb2RlLCBhbmRyb2lkLm9zLlBhcmNlbCBkYXRhLCBhbmRyb2lkLm9zLlBhcmNlbCByZXBseSwgaW50IGZsYWdzKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KICAgICB7CiAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGRlc2NyaXB0b3IgPSBERVNDUklQVE9SOworICAgICAgaWYgKGNvZGUgPj0gYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gJiYgY29kZSA8PSBhbmRyb2lkLm9zLklCaW5kZXIuTEFTVF9DQUxMX1RSQU5TQUNUSU9OKSB7CisgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShkZXNjcmlwdG9yKTsKKyAgICAgIH0KICAgICAgIHN3aXRjaCAoY29kZSkKICAgICAgIHsKICAgICAgICAgY2FzZSBJTlRFUkZBQ0VfVFJBTlNBQ1RJT046CkBAIC01OCwxNyArNjEsMTcgQEAKICAgICAgIHsKICAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9SZWFsTmFtZToKICAgICAgICAgewotICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShkZXNjcmlwdG9yKTsKICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIF9yZXN1bHQgPSB0aGlzLlJlYWxOYW1lKCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOwogICAgICAgICAgIHJlcGx5LndyaXRlU3RyaW5nKF9yZXN1bHQpOwotICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgIHsKICAgICAgICAgICByZXR1cm4gc3VwZXIub25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwogICAgICAgICB9CiAgICAgICB9CisgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJveHkgaW1wbGVtZW50cyBhbmRyb2lkLmFpZGwudGVzdHMuSU9sZE5hbWUKICAgICB7CkBAIC04NywxNyArOTAsMTIgQEAKICAgICAgIH0KICAgICAgIEBPdmVycmlkZSBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBSZWFsTmFtZSgpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgogICAgICAgewotICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbihhc0JpbmRlcigpKTsKICAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CiAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgX3Jlc3VsdDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOwogICAgICAgICAgIGJvb2xlYW4gX3N0YXR1cyA9IG1SZW1vdGUudHJhbnNhY3QoU3R1Yi5UUkFOU0FDVElPTl9SZWFsTmFtZSwgX2RhdGEsIF9yZXBseSwgMCk7Ci0gICAgICAgICAgaWYgKCFfc3RhdHVzKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0RGVmYXVsdEltcGwoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgIHJldHVybiBnZXREZWZhdWx0SW1wbCgpLlJlYWxOYW1lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQogICAgICAgICAgIF9yZXBseS5yZWFkRXhjZXB0aW9uKCk7CiAgICAgICAgICAgX3Jlc3VsdCA9IF9yZXBseS5yZWFkU3RyaW5nKCk7CiAgICAgICAgIH0KQEAgLTEwNywyNSArMTA1LDggQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gX3Jlc3VsdDsKICAgICAgIH0KLSAgICAgIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5haWRsLnRlc3RzLklPbGROYW1lIHNEZWZhdWx0SW1wbDsKICAgICB9CiAgICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9SZWFsTmFtZSA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDApOwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzZXREZWZhdWx0SW1wbChhbmRyb2lkLmFpZGwudGVzdHMuSU9sZE5hbWUgaW1wbCkgewotICAgICAgLy8gT25seSBvbmUgdXNlciBvZiB0aGlzIGludGVyZmFjZSBjYW4gdXNlIHRoaXMgZnVuY3Rpb24KLSAgICAgIC8vIGF0IGEgdGltZS4gVGhpcyBpcyBhIGhldXJpc3RpYyB0byBkZXRlY3QgaWYgdHdvIGRpZmZlcmVudAotICAgICAgLy8gdXNlcnMgaW4gdGhlIHNhbWUgcHJvY2VzcyB1c2UgdGhpcyBmdW5jdGlvbi4KLSAgICAgIGlmIChTdHViLlByb3h5LnNEZWZhdWx0SW1wbCAhPSBudWxsKSB7Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInNldERlZmF1bHRJbXBsKCkgY2FsbGVkIHR3aWNlIik7Ci0gICAgICB9Ci0gICAgICBpZiAoaW1wbCAhPSBudWxsKSB7Ci0gICAgICAgIFN0dWIuUHJveHkuc0RlZmF1bHRJbXBsID0gaW1wbDsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5haWRsLnRlc3RzLklPbGROYW1lIGdldERlZmF1bHRJbXBsKCkgewotICAgICAgcmV0dXJuIFN0dWIuUHJveHkuc0RlZmF1bHRJbXBsOwotICAgIH0KICAgfQogICBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVTQ1JJUFRPUiA9ICJhbmRyb2lkJGFpZGwkdGVzdHMkSU9sZE5hbWUiLnJlcGxhY2UoJyQnLCAnLicpOwogICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBSZWFsTmFtZSgpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lUZXN0U2VydmljZS5qYXZhIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSVRlc3RTZXJ2aWNlLmphdmEKaW5kZXggNGQ2ZjlmZC4uYzI2MzU3NiAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSVRlc3RTZXJ2aWNlLmphdmEKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSVRlc3RTZXJ2aWNlLmphdmEKQEAgLTIsNiArMiw3IEBACiAgKiBUaGlzIGZpbGUgaXMgYXV0by1nZW5lcmF0ZWQuICBETyBOT1QgTU9ESUZZLgogICovCiBwYWNrYWdlIGFuZHJvaWQuYWlkbC50ZXN0czsKKy8qKiBpbnRlcmZhY2UgY29tbWVudCAqLwogcHVibGljIGludGVyZmFjZSBJVGVzdFNlcnZpY2UgZXh0ZW5kcyBhbmRyb2lkLm9zLklJbnRlcmZhY2UKIHsKICAgLyoqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIElUZXN0U2VydmljZS4gKi8KQEAgLTIzLDkgKzI0LDkgQEAKICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICAvKioKLSAgICAgICAgICogQGRlcHJlY2F0ZWQgdG8gbWFrZSBzdXJlIHdlIGhhdmUgc29tZXRoaW5nIGluIHN5c3RlbS90b29scy9haWRsIHdoaWNoIGRvZXMgYSBjb21waWxlIGNoZWNrCi0gICAgICAgICAqICAgICBvZiBkZXByZWNhdGVkIGFuZCBtYWtlIHN1cmUgdGhpcyBpcyByZWZsZWN0ZWQgaW4gZ29sZGVucwotICAgICAgICAgKi8KKyAgICAgKiBAZGVwcmVjYXRlZCB0byBtYWtlIHN1cmUgd2UgaGF2ZSBzb21ldGhpbmcgaW4gc3lzdGVtL3Rvb2xzL2FpZGwgd2hpY2ggZG9lcyBhIGNvbXBpbGUgY2hlY2sKKyAgICAgKiAgICAgb2YgZGVwcmVjYXRlZCBhbmQgbWFrZSBzdXJlIHRoaXMgaXMgcmVmbGVjdGVkIGluIGdvbGRlbnMKKyAgICAgKi8KICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgRGVwcmVjYXRlZCgpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgogICAgIHsKICAgICB9CkBAIC0xMzEsNiArMTMyLDMwIEBACiAgICAgewogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIGFuZHJvaWQuYWlkbC50ZXN0cy5JTmFtZWRDYWxsYmFja1tdIEdldEludGVyZmFjZUFycmF5KGphdmEubGFuZy5TdHJpbmdbXSBuYW1lcykgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgYm9vbGVhbiBWZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VBcnJheShhbmRyb2lkLmFpZGwudGVzdHMuSU5hbWVkQ2FsbGJhY2tbXSBzZXJ2aWNlcywgamF2YS5sYW5nLlN0cmluZ1tdIG5hbWVzKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgYW5kcm9pZC5haWRsLnRlc3RzLklOYW1lZENhbGxiYWNrW10gR2V0TnVsbGFibGVJbnRlcmZhY2VBcnJheShqYXZhLmxhbmcuU3RyaW5nW10gbmFtZXMpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gVmVyaWZ5TmFtZXNXaXRoTnVsbGFibGVJbnRlcmZhY2VBcnJheShhbmRyb2lkLmFpZGwudGVzdHMuSU5hbWVkQ2FsbGJhY2tbXSBzZXJ2aWNlcywgamF2YS5sYW5nLlN0cmluZ1tdIG5hbWVzKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5haWRsLnRlc3RzLklOYW1lZENhbGxiYWNrPiBHZXRJbnRlcmZhY2VMaXN0KGphdmEubGFuZy5TdHJpbmdbXSBuYW1lcykgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgYm9vbGVhbiBWZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VMaXN0KGphdmEudXRpbC5MaXN0PGFuZHJvaWQuYWlkbC50ZXN0cy5JTmFtZWRDYWxsYmFjaz4gc2VydmljZXMsIGphdmEubGFuZy5TdHJpbmdbXSBuYW1lcykgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KICAgICAvLyBUZXN0IHRoYXQgTGlzdDxUPiB0eXBlcyB3b3JrIGNvcnJlY3RseS4KICAgICBAT3ZlcnJpZGUgcHVibGljIGphdmEudXRpbC5MaXN0PGphdmEubGFuZy5TdHJpbmc+IFJldmVyc2VTdHJpbmdMaXN0KGphdmEudXRpbC5MaXN0PGphdmEubGFuZy5TdHJpbmc+IGlucHV0LCBqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuU3RyaW5nPiByZXBlYXRlZCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCiAgICAgewpAQCAtMTczLDcgKzE5OCwxNSBAQAogICAgIHsKICAgICAgIHJldHVybiBudWxsOwogICAgIH0KLSAgICBAT3ZlcnJpZGUgcHVibGljIGFuZHJvaWQuYWlkbC50ZXN0cy5TdHJ1Y3R1cmVkUGFyY2VsYWJsZSBSZXBlYXROdWxsYWJsZVBhcmNlbGFibGUoYW5kcm9pZC5haWRsLnRlc3RzLlN0cnVjdHVyZWRQYXJjZWxhYmxlIGlucHV0KSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICBAT3ZlcnJpZGUgcHVibGljIGFuZHJvaWQuYWlkbC50ZXN0cy5JVGVzdFNlcnZpY2UuRW1wdHkgUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlKGFuZHJvaWQuYWlkbC50ZXN0cy5JVGVzdFNlcnZpY2UuRW1wdHkgaW5wdXQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIGFuZHJvaWQuYWlkbC50ZXN0cy5JVGVzdFNlcnZpY2UuRW1wdHlbXSBSZXBlYXROdWxsYWJsZVBhcmNlbGFibGVBcnJheShhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlLkVtcHR5W10gaW5wdXQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIGphdmEudXRpbC5MaXN0PGFuZHJvaWQuYWlkbC50ZXN0cy5JVGVzdFNlcnZpY2UuRW1wdHk+IFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUxpc3QoamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5haWRsLnRlc3RzLklUZXN0U2VydmljZS5FbXB0eT4gaW5wdXQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgogICAgIHsKICAgICAgIHJldHVybiBudWxsOwogICAgIH0KQEAgLTE4Myw2ICsyMTYsMTIgQEAKICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgVGFrZXNBTnVsbGFibGVJQmluZGVyKGFuZHJvaWQub3MuSUJpbmRlciBpbnB1dCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCiAgICAgewogICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgVGFrZXNBbklCaW5kZXJMaXN0KGphdmEudXRpbC5MaXN0PGFuZHJvaWQub3MuSUJpbmRlcj4gaW5wdXQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIFRha2VzQU51bGxhYmxlSUJpbmRlckxpc3QoamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5vcy5JQmluZGVyPiBpbnB1dCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgIH0KICAgICAvLyBUZXN0IHV0ZjggZGVjb2RpbmcgZnJvbSB1dGYxNiB3aXJlIGZvcm1hdAogICAgIEBPdmVycmlkZSBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBSZXBlYXRVdGY4Q3BwU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdG9rZW4pIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgogICAgIHsKQEAgLTIwNCw2ICsyNDMsNyBAQAogICAgIHsKICAgICAgIHJldHVybiBudWxsOwogICAgIH0KKyAgICAvKiogY29tbWVudCBiZWZvcmUgYW5ub3RhdGlvbiAqLwogICAgIEBPdmVycmlkZSBwdWJsaWMgYW5kcm9pZC5haWRsLnRlc3RzLklOYW1lZENhbGxiYWNrIEdldENhbGxiYWNrKGJvb2xlYW4gcmV0dXJuX251bGwpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgogICAgIHsKICAgICAgIHJldHVybiBudWxsOwpAQCAtMjEzLDYgKzI1MywyMSBAQAogICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBGaWxsT3V0U3RydWN0dXJlZFBhcmNlbGFibGUoYW5kcm9pZC5haWRsLnRlc3RzLlN0cnVjdHVyZWRQYXJjZWxhYmxlIHBhcmNlbCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCiAgICAgewogICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgUmVwZWF0RXh0ZW5kYWJsZVBhcmNlbGFibGUoYW5kcm9pZC5haWRsLnRlc3RzLmV4dGVuc2lvbi5FeHRlbmRhYmxlUGFyY2VsYWJsZSBlcCwgYW5kcm9pZC5haWRsLnRlc3RzLmV4dGVuc2lvbi5FeHRlbmRhYmxlUGFyY2VsYWJsZSBlcDIpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyBhbmRyb2lkLmFpZGwudGVzdHMuUmVjdXJzaXZlTGlzdCBSZXZlcnNlTGlzdChhbmRyb2lkLmFpZGwudGVzdHMuUmVjdXJzaXZlTGlzdCBsaXN0KSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXJbXSBSZXZlcnNlSUJpbmRlckFycmF5KGFuZHJvaWQub3MuSUJpbmRlcltdIGlucHV0LCBhbmRyb2lkLm9zLklCaW5kZXJbXSByZXBlYXRlZCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyW10gUmV2ZXJzZU51bGxhYmxlSUJpbmRlckFycmF5KGFuZHJvaWQub3MuSUJpbmRlcltdIGlucHV0LCBhbmRyb2lkLm9zLklCaW5kZXJbXSByZXBlYXRlZCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogICAgIEBPdmVycmlkZSBwdWJsaWMgYW5kcm9pZC5haWRsLnRlc3RzLklPbGROYW1lIEdldE9sZE5hbWVJbnRlcmZhY2UoKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KICAgICB7CiAgICAgICByZXR1cm4gbnVsbDsKQEAgLTIyMSw2ICsyNzYsMTAgQEAKICAgICB7CiAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyBpbnRbXSBHZXRVbmlvblRhZ3MoYW5kcm9pZC5haWRsLnRlc3RzLlVuaW9uW10gaW5wdXQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KICAgICAvLyBSZXRyaWV2ZSB0aGUgSUNwcEphdmFUZXN0cyBpZiB0aGUgc2VydmVyIHN1cHBvcnRzIGl0CiAgICAgQE92ZXJyaWRlIHB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgR2V0Q3BwSmF2YVRlc3RzKCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCiAgICAgewpAQCAtMjM1LDYgKzI5NCwzMDQgQEAKICAgICAgIHJldHVybiBudWxsOwogICAgIH0KICAgfQorICAvKiogRGVsZWdhdG9yIGltcGxlbWVudGF0aW9uIGZvciBJVGVzdFNlcnZpY2UuICovCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRGVsZWdhdG9yIGV4dGVuZHMgYW5kcm9pZC5haWRsLnRlc3RzLklUZXN0U2VydmljZS5TdHViCisgIHsKKyAgICBwdWJsaWMgRGVsZWdhdG9yKGFuZHJvaWQuYWlkbC50ZXN0cy5JVGVzdFNlcnZpY2UgaW1wbCkgeworICAgICAgdGhpcy5tSW1wbCA9IGltcGw7CisgICAgfQorICAgIC8vIFRoaXMgaXMgdG8gZW11bGF0ZSBhIG1ldGhvZCB0aGF0IGlzIGFkZGVkIGFmdGVyIHRoZSBzZXJ2aWNlIGlzIGltcGxlbWVudGVkLgorICAgIC8vIFNvIHRoZSBjbGllbnQgY2Fubm90IGFzc3VtZSB0aGF0IGEgY2FsbCB0byB0aGlzIG1ldGhvZCB3aWxsIGJlIHN1Y2Nlc3NmdWwKKyAgICAvLyBvciBub3QuIEhvd2V2ZXIsIGluc2lkZSB0aGUgdGVzdCBlbnZpcm9ubWVudCwgd2UgY2FuJ3QgYnVpbGQgY2xpZW50IGFuZAorICAgIC8vIHRoZSBzZXJ2ZXIgd2l0aCBkaWZmZXJlbnQgdmVyc2lvbiBvZiB0aGlzIEFJREwgZmlsZS4gU28sIHdlIGxldCB0aGUgc2VydmVyCisgICAgLy8gYWN0dWFsbHkgaW1wbGVtZW50IHRoaXMgYW5kIGludGVyY2VwdCB0aGUgZGlzcGF0Y2ggdG8gdGhlIG1ldGhvZAorICAgIC8vIGluc2lkZSBvblRyYW5zYWN0KCkuCisgICAgLy8gV0FSTklORzogTXVzdCBiZSBmaXJzdCBtZXRob2QuCisgICAgLy8gVGhpcyByZXF1aXJlcyBoYXJkIGNvZGluZyB0aGUgdHJhbnNhY3Rpb24gbnVtYmVyLiBBcyBsb25nIGFzIHRoaXMgbWV0aG9kIGlzCisgICAgLy8gdGhlIGZpcnN0IGluIHRoaXMgaW50ZXJmYWNlLCBpdCBjYW4ga2VlcCB0aGUKKyAgICAvLyAiOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMCIgdmFsdWUgYW5kIGFsbG93CisgICAgLy8gbWV0aG9kcyB0byBiZSBhZGRlZCBhbmQgcmVtb3ZlZC4KKyAgICBAT3ZlcnJpZGUgcHVibGljIGludCBVbmltcGxlbWVudGVkTWV0aG9kKGludCBhcmcpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgIHJldHVybiBtSW1wbC5VbmltcGxlbWVudGVkTWV0aG9kKGFyZyk7CisgICAgfQorICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkIHRvIG1ha2Ugc3VyZSB3ZSBoYXZlIHNvbWV0aGluZyBpbiBzeXN0ZW0vdG9vbHMvYWlkbCB3aGljaCBkb2VzIGEgY29tcGlsZSBjaGVjaworICAgICAqICAgICBvZiBkZXByZWNhdGVkIGFuZCBtYWtlIHN1cmUgdGhpcyBpcyByZWZsZWN0ZWQgaW4gZ29sZGVucworICAgICAqLworICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBEZXByZWNhdGVkKCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgbUltcGwuRGVwcmVjYXRlZCgpOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgVGVzdE9uZXdheSgpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgIG1JbXBsLlRlc3RPbmV3YXkoKTsKKyAgICB9CisgICAgLy8gVGVzdCB0aGF0IHByaW1pdGl2ZXMgd29yayBhcyBwYXJhbWV0ZXJzIGFuZCByZXR1cm4gdHlwZXMuCisgICAgQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIFJlcGVhdEJvb2xlYW4oYm9vbGVhbiB0b2tlbikgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgcmV0dXJuIG1JbXBsLlJlcGVhdEJvb2xlYW4odG9rZW4pOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIGJ5dGUgUmVwZWF0Qnl0ZShieXRlIHRva2VuKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICByZXR1cm4gbUltcGwuUmVwZWF0Qnl0ZSh0b2tlbik7CisgICAgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgY2hhciBSZXBlYXRDaGFyKGNoYXIgdG9rZW4pIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgIHJldHVybiBtSW1wbC5SZXBlYXRDaGFyKHRva2VuKTsKKyAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyBpbnQgUmVwZWF0SW50KGludCB0b2tlbikgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgcmV0dXJuIG1JbXBsLlJlcGVhdEludCh0b2tlbik7CisgICAgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgbG9uZyBSZXBlYXRMb25nKGxvbmcgdG9rZW4pIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgIHJldHVybiBtSW1wbC5SZXBlYXRMb25nKHRva2VuKTsKKyAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyBmbG9hdCBSZXBlYXRGbG9hdChmbG9hdCB0b2tlbikgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgcmV0dXJuIG1JbXBsLlJlcGVhdEZsb2F0KHRva2VuKTsKKyAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyBkb3VibGUgUmVwZWF0RG91YmxlKGRvdWJsZSB0b2tlbikgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgcmV0dXJuIG1JbXBsLlJlcGVhdERvdWJsZSh0b2tlbik7CisgICAgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBSZXBlYXRTdHJpbmcoamF2YS5sYW5nLlN0cmluZyB0b2tlbikgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgcmV0dXJuIG1JbXBsLlJlcGVhdFN0cmluZyh0b2tlbik7CisgICAgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgYnl0ZSBSZXBlYXRCeXRlRW51bShieXRlIHRva2VuKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICByZXR1cm4gbUltcGwuUmVwZWF0Qnl0ZUVudW0odG9rZW4pOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIGludCBSZXBlYXRJbnRFbnVtKGludCB0b2tlbikgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgcmV0dXJuIG1JbXBsLlJlcGVhdEludEVudW0odG9rZW4pOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIGxvbmcgUmVwZWF0TG9uZ0VudW0obG9uZyB0b2tlbikgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgcmV0dXJuIG1JbXBsLlJlcGVhdExvbmdFbnVtKHRva2VuKTsKKyAgICB9CisgICAgLy8gVGVzdCB0aGF0IGFycmF5cyB3b3JrIGFzIHBhcmFtZXRlcnMgYW5kIHJldHVybiB0eXBlcy4KKyAgICBAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW5bXSBSZXZlcnNlQm9vbGVhbihib29sZWFuW10gaW5wdXQsIGJvb2xlYW5bXSByZXBlYXRlZCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgcmV0dXJuIG1JbXBsLlJldmVyc2VCb29sZWFuKGlucHV0LHJlcGVhdGVkKTsKKyAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyBieXRlW10gUmV2ZXJzZUJ5dGUoYnl0ZVtdIGlucHV0LCBieXRlW10gcmVwZWF0ZWQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgIHJldHVybiBtSW1wbC5SZXZlcnNlQnl0ZShpbnB1dCxyZXBlYXRlZCk7CisgICAgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgY2hhcltdIFJldmVyc2VDaGFyKGNoYXJbXSBpbnB1dCwgY2hhcltdIHJlcGVhdGVkKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICByZXR1cm4gbUltcGwuUmV2ZXJzZUNoYXIoaW5wdXQscmVwZWF0ZWQpOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIGludFtdIFJldmVyc2VJbnQoaW50W10gaW5wdXQsIGludFtdIHJlcGVhdGVkKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICByZXR1cm4gbUltcGwuUmV2ZXJzZUludChpbnB1dCxyZXBlYXRlZCk7CisgICAgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgbG9uZ1tdIFJldmVyc2VMb25nKGxvbmdbXSBpbnB1dCwgbG9uZ1tdIHJlcGVhdGVkKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICByZXR1cm4gbUltcGwuUmV2ZXJzZUxvbmcoaW5wdXQscmVwZWF0ZWQpOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIGZsb2F0W10gUmV2ZXJzZUZsb2F0KGZsb2F0W10gaW5wdXQsIGZsb2F0W10gcmVwZWF0ZWQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgIHJldHVybiBtSW1wbC5SZXZlcnNlRmxvYXQoaW5wdXQscmVwZWF0ZWQpOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIGRvdWJsZVtdIFJldmVyc2VEb3VibGUoZG91YmxlW10gaW5wdXQsIGRvdWJsZVtdIHJlcGVhdGVkKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICByZXR1cm4gbUltcGwuUmV2ZXJzZURvdWJsZShpbnB1dCxyZXBlYXRlZCk7CisgICAgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIFJldmVyc2VTdHJpbmcoamF2YS5sYW5nLlN0cmluZ1tdIGlucHV0LCBqYXZhLmxhbmcuU3RyaW5nW10gcmVwZWF0ZWQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgIHJldHVybiBtSW1wbC5SZXZlcnNlU3RyaW5nKGlucHV0LHJlcGVhdGVkKTsKKyAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyBieXRlW10gUmV2ZXJzZUJ5dGVFbnVtKGJ5dGVbXSBpbnB1dCwgYnl0ZVtdIHJlcGVhdGVkKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICByZXR1cm4gbUltcGwuUmV2ZXJzZUJ5dGVFbnVtKGlucHV0LHJlcGVhdGVkKTsKKyAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyBpbnRbXSBSZXZlcnNlSW50RW51bShpbnRbXSBpbnB1dCwgaW50W10gcmVwZWF0ZWQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgIHJldHVybiBtSW1wbC5SZXZlcnNlSW50RW51bShpbnB1dCxyZXBlYXRlZCk7CisgICAgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgbG9uZ1tdIFJldmVyc2VMb25nRW51bShsb25nW10gaW5wdXQsIGxvbmdbXSByZXBlYXRlZCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgcmV0dXJuIG1JbXBsLlJldmVyc2VMb25nRW51bShpbnB1dCxyZXBlYXRlZCk7CisgICAgfQorICAgIC8vIFRlc3QgdGhhdCBjbGllbnRzIGNhbiBzZW5kIGFuZCByZWNlaXZlIEJpbmRlcnMuCisgICAgQE92ZXJyaWRlIHB1YmxpYyBhbmRyb2lkLmFpZGwudGVzdHMuSU5hbWVkQ2FsbGJhY2sgR2V0T3RoZXJUZXN0U2VydmljZShqYXZhLmxhbmcuU3RyaW5nIG5hbWUpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgIHJldHVybiBtSW1wbC5HZXRPdGhlclRlc3RTZXJ2aWNlKG5hbWUpOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gVmVyaWZ5TmFtZShhbmRyb2lkLmFpZGwudGVzdHMuSU5hbWVkQ2FsbGJhY2sgc2VydmljZSwgamF2YS5sYW5nLlN0cmluZyBuYW1lKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICByZXR1cm4gbUltcGwuVmVyaWZ5TmFtZShzZXJ2aWNlLG5hbWUpOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIGFuZHJvaWQuYWlkbC50ZXN0cy5JTmFtZWRDYWxsYmFja1tdIEdldEludGVyZmFjZUFycmF5KGphdmEubGFuZy5TdHJpbmdbXSBuYW1lcykgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgcmV0dXJuIG1JbXBsLkdldEludGVyZmFjZUFycmF5KG5hbWVzKTsKKyAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIFZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUFycmF5KGFuZHJvaWQuYWlkbC50ZXN0cy5JTmFtZWRDYWxsYmFja1tdIHNlcnZpY2VzLCBqYXZhLmxhbmcuU3RyaW5nW10gbmFtZXMpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgIHJldHVybiBtSW1wbC5WZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VBcnJheShzZXJ2aWNlcyxuYW1lcyk7CisgICAgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgYW5kcm9pZC5haWRsLnRlc3RzLklOYW1lZENhbGxiYWNrW10gR2V0TnVsbGFibGVJbnRlcmZhY2VBcnJheShqYXZhLmxhbmcuU3RyaW5nW10gbmFtZXMpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgIHJldHVybiBtSW1wbC5HZXROdWxsYWJsZUludGVyZmFjZUFycmF5KG5hbWVzKTsKKyAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIFZlcmlmeU5hbWVzV2l0aE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoYW5kcm9pZC5haWRsLnRlc3RzLklOYW1lZENhbGxiYWNrW10gc2VydmljZXMsIGphdmEubGFuZy5TdHJpbmdbXSBuYW1lcykgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgcmV0dXJuIG1JbXBsLlZlcmlmeU5hbWVzV2l0aE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoc2VydmljZXMsbmFtZXMpOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIGphdmEudXRpbC5MaXN0PGFuZHJvaWQuYWlkbC50ZXN0cy5JTmFtZWRDYWxsYmFjaz4gR2V0SW50ZXJmYWNlTGlzdChqYXZhLmxhbmcuU3RyaW5nW10gbmFtZXMpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgIHJldHVybiBtSW1wbC5HZXRJbnRlcmZhY2VMaXN0KG5hbWVzKTsKKyAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIFZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUxpc3QoamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5haWRsLnRlc3RzLklOYW1lZENhbGxiYWNrPiBzZXJ2aWNlcywgamF2YS5sYW5nLlN0cmluZ1tdIG5hbWVzKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICByZXR1cm4gbUltcGwuVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlTGlzdChzZXJ2aWNlcyxuYW1lcyk7CisgICAgfQorICAgIC8vIFRlc3QgdGhhdCBMaXN0PFQ+IHR5cGVzIHdvcmsgY29ycmVjdGx5LgorICAgIEBPdmVycmlkZSBwdWJsaWMgamF2YS51dGlsLkxpc3Q8amF2YS5sYW5nLlN0cmluZz4gUmV2ZXJzZVN0cmluZ0xpc3QoamF2YS51dGlsLkxpc3Q8amF2YS5sYW5nLlN0cmluZz4gaW5wdXQsIGphdmEudXRpbC5MaXN0PGphdmEubGFuZy5TdHJpbmc+IHJlcGVhdGVkKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICByZXR1cm4gbUltcGwuUmV2ZXJzZVN0cmluZ0xpc3QoaW5wdXQscmVwZWF0ZWQpOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3IgUmVwZWF0UGFyY2VsRmlsZURlc2NyaXB0b3IoYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvciByZWFkKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICByZXR1cm4gbUltcGwuUmVwZWF0UGFyY2VsRmlsZURlc2NyaXB0b3IocmVhZCk7CisgICAgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcltdIFJldmVyc2VQYXJjZWxGaWxlRGVzY3JpcHRvckFycmF5KGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3JbXSBpbnB1dCwgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcltdIHJlcGVhdGVkKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICByZXR1cm4gbUltcGwuUmV2ZXJzZVBhcmNlbEZpbGVEZXNjcmlwdG9yQXJyYXkoaW5wdXQscmVwZWF0ZWQpOworICAgIH0KKyAgICAvLyBUZXN0IHRoYXQgc2VydmljZSBzcGVjaWZpYyBleGNlcHRpb25zIHdvcmsgY29ycmVjdGx5LgorICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBUaHJvd1NlcnZpY2VFeGNlcHRpb24oaW50IGNvZGUpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgIG1JbXBsLlRocm93U2VydmljZUV4Y2VwdGlvbihjb2RlKTsKKyAgICB9CisgICAgLy8gVGVzdCBudWxsYWJpbGl0eQorICAgIEBPdmVycmlkZSBwdWJsaWMgaW50W10gUmVwZWF0TnVsbGFibGVJbnRBcnJheShpbnRbXSBpbnB1dCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgcmV0dXJuIG1JbXBsLlJlcGVhdE51bGxhYmxlSW50QXJyYXkoaW5wdXQpOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIGJ5dGVbXSBSZXBlYXROdWxsYWJsZUJ5dGVFbnVtQXJyYXkoYnl0ZVtdIGlucHV0KSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICByZXR1cm4gbUltcGwuUmVwZWF0TnVsbGFibGVCeXRlRW51bUFycmF5KGlucHV0KTsKKyAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyBpbnRbXSBSZXBlYXROdWxsYWJsZUludEVudW1BcnJheShpbnRbXSBpbnB1dCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgcmV0dXJuIG1JbXBsLlJlcGVhdE51bGxhYmxlSW50RW51bUFycmF5KGlucHV0KTsKKyAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyBsb25nW10gUmVwZWF0TnVsbGFibGVMb25nRW51bUFycmF5KGxvbmdbXSBpbnB1dCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgcmV0dXJuIG1JbXBsLlJlcGVhdE51bGxhYmxlTG9uZ0VudW1BcnJheShpbnB1dCk7CisgICAgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBSZXBlYXROdWxsYWJsZVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIGlucHV0KSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICByZXR1cm4gbUltcGwuUmVwZWF0TnVsbGFibGVTdHJpbmcoaW5wdXQpOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIGphdmEudXRpbC5MaXN0PGphdmEubGFuZy5TdHJpbmc+IFJlcGVhdE51bGxhYmxlU3RyaW5nTGlzdChqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuU3RyaW5nPiBpbnB1dCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgcmV0dXJuIG1JbXBsLlJlcGVhdE51bGxhYmxlU3RyaW5nTGlzdChpbnB1dCk7CisgICAgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgYW5kcm9pZC5haWRsLnRlc3RzLklUZXN0U2VydmljZS5FbXB0eSBSZXBlYXROdWxsYWJsZVBhcmNlbGFibGUoYW5kcm9pZC5haWRsLnRlc3RzLklUZXN0U2VydmljZS5FbXB0eSBpbnB1dCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgcmV0dXJuIG1JbXBsLlJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZShpbnB1dCk7CisgICAgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgYW5kcm9pZC5haWRsLnRlc3RzLklUZXN0U2VydmljZS5FbXB0eVtdIFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUFycmF5KGFuZHJvaWQuYWlkbC50ZXN0cy5JVGVzdFNlcnZpY2UuRW1wdHlbXSBpbnB1dCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgcmV0dXJuIG1JbXBsLlJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUFycmF5KGlucHV0KTsKKyAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlLkVtcHR5PiBSZXBlYXROdWxsYWJsZVBhcmNlbGFibGVMaXN0KGphdmEudXRpbC5MaXN0PGFuZHJvaWQuYWlkbC50ZXN0cy5JVGVzdFNlcnZpY2UuRW1wdHk+IGlucHV0KSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICByZXR1cm4gbUltcGwuUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlTGlzdChpbnB1dCk7CisgICAgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBUYWtlc0FuSUJpbmRlcihhbmRyb2lkLm9zLklCaW5kZXIgaW5wdXQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgIG1JbXBsLlRha2VzQW5JQmluZGVyKGlucHV0KTsKKyAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIFRha2VzQU51bGxhYmxlSUJpbmRlcihhbmRyb2lkLm9zLklCaW5kZXIgaW5wdXQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgIG1JbXBsLlRha2VzQU51bGxhYmxlSUJpbmRlcihpbnB1dCk7CisgICAgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBUYWtlc0FuSUJpbmRlckxpc3QoamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5vcy5JQmluZGVyPiBpbnB1dCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgbUltcGwuVGFrZXNBbklCaW5kZXJMaXN0KGlucHV0KTsKKyAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIFRha2VzQU51bGxhYmxlSUJpbmRlckxpc3QoamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5vcy5JQmluZGVyPiBpbnB1dCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgbUltcGwuVGFrZXNBTnVsbGFibGVJQmluZGVyTGlzdChpbnB1dCk7CisgICAgfQorICAgIC8vIFRlc3QgdXRmOCBkZWNvZGluZyBmcm9tIHV0ZjE2IHdpcmUgZm9ybWF0CisgICAgQE92ZXJyaWRlIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIFJlcGVhdFV0ZjhDcHBTdHJpbmcoamF2YS5sYW5nLlN0cmluZyB0b2tlbikgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgcmV0dXJuIG1JbXBsLlJlcGVhdFV0ZjhDcHBTdHJpbmcodG9rZW4pOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIGphdmEubGFuZy5TdHJpbmcgUmVwZWF0TnVsbGFibGVVdGY4Q3BwU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdG9rZW4pIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgIHJldHVybiBtSW1wbC5SZXBlYXROdWxsYWJsZVV0ZjhDcHBTdHJpbmcodG9rZW4pOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIGphdmEubGFuZy5TdHJpbmdbXSBSZXZlcnNlVXRmOENwcFN0cmluZyhqYXZhLmxhbmcuU3RyaW5nW10gaW5wdXQsIGphdmEubGFuZy5TdHJpbmdbXSByZXBlYXRlZCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgcmV0dXJuIG1JbXBsLlJldmVyc2VVdGY4Q3BwU3RyaW5nKGlucHV0LHJlcGVhdGVkKTsKKyAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gUmV2ZXJzZU51bGxhYmxlVXRmOENwcFN0cmluZyhqYXZhLmxhbmcuU3RyaW5nW10gaW5wdXQsIGphdmEubGFuZy5TdHJpbmdbXSByZXBlYXRlZCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgcmV0dXJuIG1JbXBsLlJldmVyc2VOdWxsYWJsZVV0ZjhDcHBTdHJpbmcoaW5wdXQscmVwZWF0ZWQpOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIGphdmEudXRpbC5MaXN0PGphdmEubGFuZy5TdHJpbmc+IFJldmVyc2VVdGY4Q3BwU3RyaW5nTGlzdChqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuU3RyaW5nPiBpbnB1dCwgamF2YS51dGlsLkxpc3Q8amF2YS5sYW5nLlN0cmluZz4gcmVwZWF0ZWQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgIHJldHVybiBtSW1wbC5SZXZlcnNlVXRmOENwcFN0cmluZ0xpc3QoaW5wdXQscmVwZWF0ZWQpOworICAgIH0KKyAgICAvKiogY29tbWVudCBiZWZvcmUgYW5ub3RhdGlvbiAqLworICAgIEBPdmVycmlkZSBwdWJsaWMgYW5kcm9pZC5haWRsLnRlc3RzLklOYW1lZENhbGxiYWNrIEdldENhbGxiYWNrKGJvb2xlYW4gcmV0dXJuX251bGwpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgIHJldHVybiBtSW1wbC5HZXRDYWxsYmFjayhyZXR1cm5fbnVsbCk7CisgICAgfQorICAgIC8vIFNpbmNlIHRoaXMgcGFyYWNlbGFibGUgaGFzIGNsZWFybHkgZGVmaW5lZCBkZWZhdWx0IHZhbHVlcywgaXQgd291bGQgYmUKKyAgICAvLyBpbmVmZmljaWVudCB0byB1c2UgYW4gSVBDIHRvIGZpbGwgaXQgb3V0IGluIHByYWN0aWNlLgorICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBGaWxsT3V0U3RydWN0dXJlZFBhcmNlbGFibGUoYW5kcm9pZC5haWRsLnRlc3RzLlN0cnVjdHVyZWRQYXJjZWxhYmxlIHBhcmNlbCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgbUltcGwuRmlsbE91dFN0cnVjdHVyZWRQYXJjZWxhYmxlKHBhcmNlbCk7CisgICAgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBSZXBlYXRFeHRlbmRhYmxlUGFyY2VsYWJsZShhbmRyb2lkLmFpZGwudGVzdHMuZXh0ZW5zaW9uLkV4dGVuZGFibGVQYXJjZWxhYmxlIGVwLCBhbmRyb2lkLmFpZGwudGVzdHMuZXh0ZW5zaW9uLkV4dGVuZGFibGVQYXJjZWxhYmxlIGVwMikgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgbUltcGwuUmVwZWF0RXh0ZW5kYWJsZVBhcmNlbGFibGUoZXAsZXAyKTsKKyAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyBhbmRyb2lkLmFpZGwudGVzdHMuUmVjdXJzaXZlTGlzdCBSZXZlcnNlTGlzdChhbmRyb2lkLmFpZGwudGVzdHMuUmVjdXJzaXZlTGlzdCBsaXN0KSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICByZXR1cm4gbUltcGwuUmV2ZXJzZUxpc3QobGlzdCk7CisgICAgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyW10gUmV2ZXJzZUlCaW5kZXJBcnJheShhbmRyb2lkLm9zLklCaW5kZXJbXSBpbnB1dCwgYW5kcm9pZC5vcy5JQmluZGVyW10gcmVwZWF0ZWQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgIHJldHVybiBtSW1wbC5SZXZlcnNlSUJpbmRlckFycmF5KGlucHV0LHJlcGVhdGVkKTsKKyAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXJbXSBSZXZlcnNlTnVsbGFibGVJQmluZGVyQXJyYXkoYW5kcm9pZC5vcy5JQmluZGVyW10gaW5wdXQsIGFuZHJvaWQub3MuSUJpbmRlcltdIHJlcGVhdGVkKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICByZXR1cm4gbUltcGwuUmV2ZXJzZU51bGxhYmxlSUJpbmRlckFycmF5KGlucHV0LHJlcGVhdGVkKTsKKyAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyBhbmRyb2lkLmFpZGwudGVzdHMuSU9sZE5hbWUgR2V0T2xkTmFtZUludGVyZmFjZSgpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgIHJldHVybiBtSW1wbC5HZXRPbGROYW1lSW50ZXJmYWNlKCk7CisgICAgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgYW5kcm9pZC5haWRsLnRlc3RzLklOZXdOYW1lIEdldE5ld05hbWVJbnRlcmZhY2UoKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICByZXR1cm4gbUltcGwuR2V0TmV3TmFtZUludGVyZmFjZSgpOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIGludFtdIEdldFVuaW9uVGFncyhhbmRyb2lkLmFpZGwudGVzdHMuVW5pb25bXSBpbnB1dCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgcmV0dXJuIG1JbXBsLkdldFVuaW9uVGFncyhpbnB1dCk7CisgICAgfQorICAgIC8vIFJldHJpZXZlIHRoZSBJQ3BwSmF2YVRlc3RzIGlmIHRoZSBzZXJ2ZXIgc3VwcG9ydHMgaXQKKyAgICBAT3ZlcnJpZGUgcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBHZXRDcHBKYXZhVGVzdHMoKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICByZXR1cm4gbUltcGwuR2V0Q3BwSmF2YVRlc3RzKCk7CisgICAgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgYnl0ZSBnZXRCYWNrZW5kVHlwZSgpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgIHJldHVybiBtSW1wbC5nZXRCYWNrZW5kVHlwZSgpOworICAgIH0KKyAgICBhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlIG1JbXBsOworICB9CiAgIC8qKiBMb2NhbC1zaWRlIElQQyBpbXBsZW1lbnRhdGlvbiBzdHViIGNsYXNzLiAqLwogICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIFN0dWIgZXh0ZW5kcyBhbmRyb2lkLm9zLkJpbmRlciBpbXBsZW1lbnRzIGFuZHJvaWQuYWlkbC50ZXN0cy5JVGVzdFNlcnZpY2UKICAgewpAQCAtMjY1LDYgKzYyMiw5IEBACiAgICAgQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIG9uVHJhbnNhY3QoaW50IGNvZGUsIGFuZHJvaWQub3MuUGFyY2VsIGRhdGEsIGFuZHJvaWQub3MuUGFyY2VsIHJlcGx5LCBpbnQgZmxhZ3MpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgogICAgIHsKICAgICAgIGphdmEubGFuZy5TdHJpbmcgZGVzY3JpcHRvciA9IERFU0NSSVBUT1I7CisgICAgICBpZiAoY29kZSA+PSBhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiAmJiBjb2RlIDw9IGFuZHJvaWQub3MuSUJpbmRlci5MQVNUX0NBTExfVFJBTlNBQ1RJT04pIHsKKyAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKGRlc2NyaXB0b3IpOworICAgICAgfQogICAgICAgc3dpdGNoIChjb2RlKQogICAgICAgewogICAgICAgICBjYXNlIElOVEVSRkFDRV9UUkFOU0FDVElPTjoKQEAgLTI3Nyw2NjggKzYzNyw3ODggQEAKICAgICAgIHsKICAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9VbmltcGxlbWVudGVkTWV0aG9kOgogICAgICAgICB7Ci0gICAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKGRlc2NyaXB0b3IpOwogICAgICAgICAgIGludCBfYXJnMDsKICAgICAgICAgICBfYXJnMCA9IGRhdGEucmVhZEludCgpOworICAgICAgICAgIGRhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7CiAgICAgICAgICAgaW50IF9yZXN1bHQgPSB0aGlzLlVuaW1wbGVtZW50ZWRNZXRob2QoX2FyZzApOwogICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKICAgICAgICAgICByZXBseS53cml0ZUludChfcmVzdWx0KTsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX0RlcHJlY2F0ZWQ6CiAgICAgICAgIHsKLSAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoZGVzY3JpcHRvcik7CiAgICAgICAgICAgdGhpcy5EZXByZWNhdGVkKCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOwotICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fVGVzdE9uZXdheToKICAgICAgICAgewotICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShkZXNjcmlwdG9yKTsKICAgICAgICAgICB0aGlzLlRlc3RPbmV3YXkoKTsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX1JlcGVhdEJvb2xlYW46CiAgICAgICAgIHsKLSAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoZGVzY3JpcHRvcik7CiAgICAgICAgICAgYm9vbGVhbiBfYXJnMDsKLSAgICAgICAgICBfYXJnMCA9ICgwIT1kYXRhLnJlYWRJbnQoKSk7CisgICAgICAgICAgX2FyZzAgPSBkYXRhLnJlYWRCb29sZWFuKCk7CisgICAgICAgICAgZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsKICAgICAgICAgICBib29sZWFuIF9yZXN1bHQgPSB0aGlzLlJlcGVhdEJvb2xlYW4oX2FyZzApOwogICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKLSAgICAgICAgICByZXBseS53cml0ZUludCgoKF9yZXN1bHQpPygxKTooMCkpKTsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICByZXBseS53cml0ZUJvb2xlYW4oX3Jlc3VsdCk7CisgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9SZXBlYXRCeXRlOgogICAgICAgICB7Ci0gICAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKGRlc2NyaXB0b3IpOwogICAgICAgICAgIGJ5dGUgX2FyZzA7CiAgICAgICAgICAgX2FyZzAgPSBkYXRhLnJlYWRCeXRlKCk7CisgICAgICAgICAgZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsKICAgICAgICAgICBieXRlIF9yZXN1bHQgPSB0aGlzLlJlcGVhdEJ5dGUoX2FyZzApOwogICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKICAgICAgICAgICByZXBseS53cml0ZUJ5dGUoX3Jlc3VsdCk7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9SZXBlYXRDaGFyOgogICAgICAgICB7Ci0gICAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKGRlc2NyaXB0b3IpOwogICAgICAgICAgIGNoYXIgX2FyZzA7CiAgICAgICAgICAgX2FyZzAgPSAoY2hhcilkYXRhLnJlYWRJbnQoKTsKKyAgICAgICAgICBkYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOwogICAgICAgICAgIGNoYXIgX3Jlc3VsdCA9IHRoaXMuUmVwZWF0Q2hhcihfYXJnMCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOwogICAgICAgICAgIHJlcGx5LndyaXRlSW50KCgoaW50KV9yZXN1bHQpKTsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX1JlcGVhdEludDoKICAgICAgICAgewotICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShkZXNjcmlwdG9yKTsKICAgICAgICAgICBpbnQgX2FyZzA7CiAgICAgICAgICAgX2FyZzAgPSBkYXRhLnJlYWRJbnQoKTsKKyAgICAgICAgICBkYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOwogICAgICAgICAgIGludCBfcmVzdWx0ID0gdGhpcy5SZXBlYXRJbnQoX2FyZzApOwogICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKICAgICAgICAgICByZXBseS53cml0ZUludChfcmVzdWx0KTsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX1JlcGVhdExvbmc6CiAgICAgICAgIHsKLSAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoZGVzY3JpcHRvcik7CiAgICAgICAgICAgbG9uZyBfYXJnMDsKICAgICAgICAgICBfYXJnMCA9IGRhdGEucmVhZExvbmcoKTsKKyAgICAgICAgICBkYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOwogICAgICAgICAgIGxvbmcgX3Jlc3VsdCA9IHRoaXMuUmVwZWF0TG9uZyhfYXJnMCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOwogICAgICAgICAgIHJlcGx5LndyaXRlTG9uZyhfcmVzdWx0KTsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX1JlcGVhdEZsb2F0OgogICAgICAgICB7Ci0gICAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKGRlc2NyaXB0b3IpOwogICAgICAgICAgIGZsb2F0IF9hcmcwOwogICAgICAgICAgIF9hcmcwID0gZGF0YS5yZWFkRmxvYXQoKTsKKyAgICAgICAgICBkYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOwogICAgICAgICAgIGZsb2F0IF9yZXN1bHQgPSB0aGlzLlJlcGVhdEZsb2F0KF9hcmcwKTsKICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVGbG9hdChfcmVzdWx0KTsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX1JlcGVhdERvdWJsZToKICAgICAgICAgewotICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShkZXNjcmlwdG9yKTsKICAgICAgICAgICBkb3VibGUgX2FyZzA7CiAgICAgICAgICAgX2FyZzAgPSBkYXRhLnJlYWREb3VibGUoKTsKKyAgICAgICAgICBkYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOwogICAgICAgICAgIGRvdWJsZSBfcmVzdWx0ID0gdGhpcy5SZXBlYXREb3VibGUoX2FyZzApOwogICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKICAgICAgICAgICByZXBseS53cml0ZURvdWJsZShfcmVzdWx0KTsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX1JlcGVhdFN0cmluZzoKICAgICAgICAgewotICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShkZXNjcmlwdG9yKTsKICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIF9hcmcwOwogICAgICAgICAgIF9hcmcwID0gZGF0YS5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsKICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIF9yZXN1bHQgPSB0aGlzLlJlcGVhdFN0cmluZyhfYXJnMCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOwogICAgICAgICAgIHJlcGx5LndyaXRlU3RyaW5nKF9yZXN1bHQpOwotICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fUmVwZWF0Qnl0ZUVudW06CiAgICAgICAgIHsKLSAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoZGVzY3JpcHRvcik7CiAgICAgICAgICAgYnl0ZSBfYXJnMDsKICAgICAgICAgICBfYXJnMCA9IGRhdGEucmVhZEJ5dGUoKTsKKyAgICAgICAgICBkYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOwogICAgICAgICAgIGJ5dGUgX3Jlc3VsdCA9IHRoaXMuUmVwZWF0Qnl0ZUVudW0oX2FyZzApOwogICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKICAgICAgICAgICByZXBseS53cml0ZUJ5dGUoX3Jlc3VsdCk7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9SZXBlYXRJbnRFbnVtOgogICAgICAgICB7Ci0gICAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKGRlc2NyaXB0b3IpOwogICAgICAgICAgIGludCBfYXJnMDsKICAgICAgICAgICBfYXJnMCA9IGRhdGEucmVhZEludCgpOworICAgICAgICAgIGRhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7CiAgICAgICAgICAgaW50IF9yZXN1bHQgPSB0aGlzLlJlcGVhdEludEVudW0oX2FyZzApOwogICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKICAgICAgICAgICByZXBseS53cml0ZUludChfcmVzdWx0KTsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX1JlcGVhdExvbmdFbnVtOgogICAgICAgICB7Ci0gICAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKGRlc2NyaXB0b3IpOwogICAgICAgICAgIGxvbmcgX2FyZzA7CiAgICAgICAgICAgX2FyZzAgPSBkYXRhLnJlYWRMb25nKCk7CisgICAgICAgICAgZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsKICAgICAgICAgICBsb25nIF9yZXN1bHQgPSB0aGlzLlJlcGVhdExvbmdFbnVtKF9hcmcwKTsKICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVMb25nKF9yZXN1bHQpOwotICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fUmV2ZXJzZUJvb2xlYW46CiAgICAgICAgIHsKLSAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoZGVzY3JpcHRvcik7CiAgICAgICAgICAgYm9vbGVhbltdIF9hcmcwOwogICAgICAgICAgIF9hcmcwID0gZGF0YS5jcmVhdGVCb29sZWFuQXJyYXkoKTsKICAgICAgICAgICBib29sZWFuW10gX2FyZzE7CiAgICAgICAgICAgaW50IF9hcmcxX2xlbmd0aCA9IGRhdGEucmVhZEludCgpOwotICAgICAgICAgIGlmICgoX2FyZzFfbGVuZ3RoPDApKSB7CisgICAgICAgICAgaWYgKF9hcmcxX2xlbmd0aCA8IDApIHsKICAgICAgICAgICAgIF9hcmcxID0gbnVsbDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7CisgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIF9hcmcxID0gbmV3IGJvb2xlYW5bX2FyZzFfbGVuZ3RoXTsKICAgICAgICAgICB9CisgICAgICAgICAgZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsKICAgICAgICAgICBib29sZWFuW10gX3Jlc3VsdCA9IHRoaXMuUmV2ZXJzZUJvb2xlYW4oX2FyZzAsIF9hcmcxKTsKICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVCb29sZWFuQXJyYXkoX3Jlc3VsdCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVCb29sZWFuQXJyYXkoX2FyZzEpOwotICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fUmV2ZXJzZUJ5dGU6CiAgICAgICAgIHsKLSAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoZGVzY3JpcHRvcik7CiAgICAgICAgICAgYnl0ZVtdIF9hcmcwOwogICAgICAgICAgIF9hcmcwID0gZGF0YS5jcmVhdGVCeXRlQXJyYXkoKTsKICAgICAgICAgICBieXRlW10gX2FyZzE7CiAgICAgICAgICAgaW50IF9hcmcxX2xlbmd0aCA9IGRhdGEucmVhZEludCgpOwotICAgICAgICAgIGlmICgoX2FyZzFfbGVuZ3RoPDApKSB7CisgICAgICAgICAgaWYgKF9hcmcxX2xlbmd0aCA8IDApIHsKICAgICAgICAgICAgIF9hcmcxID0gbnVsbDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7CisgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIF9hcmcxID0gbmV3IGJ5dGVbX2FyZzFfbGVuZ3RoXTsKICAgICAgICAgICB9CisgICAgICAgICAgZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsKICAgICAgICAgICBieXRlW10gX3Jlc3VsdCA9IHRoaXMuUmV2ZXJzZUJ5dGUoX2FyZzAsIF9hcmcxKTsKICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVCeXRlQXJyYXkoX3Jlc3VsdCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVCeXRlQXJyYXkoX2FyZzEpOwotICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fUmV2ZXJzZUNoYXI6CiAgICAgICAgIHsKLSAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoZGVzY3JpcHRvcik7CiAgICAgICAgICAgY2hhcltdIF9hcmcwOwogICAgICAgICAgIF9hcmcwID0gZGF0YS5jcmVhdGVDaGFyQXJyYXkoKTsKICAgICAgICAgICBjaGFyW10gX2FyZzE7CiAgICAgICAgICAgaW50IF9hcmcxX2xlbmd0aCA9IGRhdGEucmVhZEludCgpOwotICAgICAgICAgIGlmICgoX2FyZzFfbGVuZ3RoPDApKSB7CisgICAgICAgICAgaWYgKF9hcmcxX2xlbmd0aCA8IDApIHsKICAgICAgICAgICAgIF9hcmcxID0gbnVsbDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7CisgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIF9hcmcxID0gbmV3IGNoYXJbX2FyZzFfbGVuZ3RoXTsKICAgICAgICAgICB9CisgICAgICAgICAgZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsKICAgICAgICAgICBjaGFyW10gX3Jlc3VsdCA9IHRoaXMuUmV2ZXJzZUNoYXIoX2FyZzAsIF9hcmcxKTsKICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVDaGFyQXJyYXkoX3Jlc3VsdCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVDaGFyQXJyYXkoX2FyZzEpOwotICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fUmV2ZXJzZUludDoKICAgICAgICAgewotICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShkZXNjcmlwdG9yKTsKICAgICAgICAgICBpbnRbXSBfYXJnMDsKICAgICAgICAgICBfYXJnMCA9IGRhdGEuY3JlYXRlSW50QXJyYXkoKTsKICAgICAgICAgICBpbnRbXSBfYXJnMTsKICAgICAgICAgICBpbnQgX2FyZzFfbGVuZ3RoID0gZGF0YS5yZWFkSW50KCk7Ci0gICAgICAgICAgaWYgKChfYXJnMV9sZW5ndGg8MCkpIHsKKyAgICAgICAgICBpZiAoX2FyZzFfbGVuZ3RoIDwgMCkgewogICAgICAgICAgICAgX2FyZzEgPSBudWxsOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgX2FyZzEgPSBuZXcgaW50W19hcmcxX2xlbmd0aF07CiAgICAgICAgICAgfQorICAgICAgICAgIGRhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7CiAgICAgICAgICAgaW50W10gX3Jlc3VsdCA9IHRoaXMuUmV2ZXJzZUludChfYXJnMCwgX2FyZzEpOwogICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKICAgICAgICAgICByZXBseS53cml0ZUludEFycmF5KF9yZXN1bHQpOwogICAgICAgICAgIHJlcGx5LndyaXRlSW50QXJyYXkoX2FyZzEpOwotICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fUmV2ZXJzZUxvbmc6CiAgICAgICAgIHsKLSAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoZGVzY3JpcHRvcik7CiAgICAgICAgICAgbG9uZ1tdIF9hcmcwOwogICAgICAgICAgIF9hcmcwID0gZGF0YS5jcmVhdGVMb25nQXJyYXkoKTsKICAgICAgICAgICBsb25nW10gX2FyZzE7CiAgICAgICAgICAgaW50IF9hcmcxX2xlbmd0aCA9IGRhdGEucmVhZEludCgpOwotICAgICAgICAgIGlmICgoX2FyZzFfbGVuZ3RoPDApKSB7CisgICAgICAgICAgaWYgKF9hcmcxX2xlbmd0aCA8IDApIHsKICAgICAgICAgICAgIF9hcmcxID0gbnVsbDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7CisgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIF9hcmcxID0gbmV3IGxvbmdbX2FyZzFfbGVuZ3RoXTsKICAgICAgICAgICB9CisgICAgICAgICAgZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsKICAgICAgICAgICBsb25nW10gX3Jlc3VsdCA9IHRoaXMuUmV2ZXJzZUxvbmcoX2FyZzAsIF9hcmcxKTsKICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVMb25nQXJyYXkoX3Jlc3VsdCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVMb25nQXJyYXkoX2FyZzEpOwotICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fUmV2ZXJzZUZsb2F0OgogICAgICAgICB7Ci0gICAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKGRlc2NyaXB0b3IpOwogICAgICAgICAgIGZsb2F0W10gX2FyZzA7CiAgICAgICAgICAgX2FyZzAgPSBkYXRhLmNyZWF0ZUZsb2F0QXJyYXkoKTsKICAgICAgICAgICBmbG9hdFtdIF9hcmcxOwogICAgICAgICAgIGludCBfYXJnMV9sZW5ndGggPSBkYXRhLnJlYWRJbnQoKTsKLSAgICAgICAgICBpZiAoKF9hcmcxX2xlbmd0aDwwKSkgeworICAgICAgICAgIGlmIChfYXJnMV9sZW5ndGggPCAwKSB7CiAgICAgICAgICAgICBfYXJnMSA9IG51bGw7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgeworICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBfYXJnMSA9IG5ldyBmbG9hdFtfYXJnMV9sZW5ndGhdOwogICAgICAgICAgIH0KKyAgICAgICAgICBkYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOwogICAgICAgICAgIGZsb2F0W10gX3Jlc3VsdCA9IHRoaXMuUmV2ZXJzZUZsb2F0KF9hcmcwLCBfYXJnMSk7CiAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOwogICAgICAgICAgIHJlcGx5LndyaXRlRmxvYXRBcnJheShfcmVzdWx0KTsKICAgICAgICAgICByZXBseS53cml0ZUZsb2F0QXJyYXkoX2FyZzEpOwotICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fUmV2ZXJzZURvdWJsZToKICAgICAgICAgewotICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShkZXNjcmlwdG9yKTsKICAgICAgICAgICBkb3VibGVbXSBfYXJnMDsKICAgICAgICAgICBfYXJnMCA9IGRhdGEuY3JlYXRlRG91YmxlQXJyYXkoKTsKICAgICAgICAgICBkb3VibGVbXSBfYXJnMTsKICAgICAgICAgICBpbnQgX2FyZzFfbGVuZ3RoID0gZGF0YS5yZWFkSW50KCk7Ci0gICAgICAgICAgaWYgKChfYXJnMV9sZW5ndGg8MCkpIHsKKyAgICAgICAgICBpZiAoX2FyZzFfbGVuZ3RoIDwgMCkgewogICAgICAgICAgICAgX2FyZzEgPSBudWxsOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgX2FyZzEgPSBuZXcgZG91YmxlW19hcmcxX2xlbmd0aF07CiAgICAgICAgICAgfQorICAgICAgICAgIGRhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7CiAgICAgICAgICAgZG91YmxlW10gX3Jlc3VsdCA9IHRoaXMuUmV2ZXJzZURvdWJsZShfYXJnMCwgX2FyZzEpOwogICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKICAgICAgICAgICByZXBseS53cml0ZURvdWJsZUFycmF5KF9yZXN1bHQpOwogICAgICAgICAgIHJlcGx5LndyaXRlRG91YmxlQXJyYXkoX2FyZzEpOwotICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fUmV2ZXJzZVN0cmluZzoKICAgICAgICAgewotICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShkZXNjcmlwdG9yKTsKICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nW10gX2FyZzA7CiAgICAgICAgICAgX2FyZzAgPSBkYXRhLmNyZWF0ZVN0cmluZ0FycmF5KCk7CiAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ1tdIF9hcmcxOwogICAgICAgICAgIGludCBfYXJnMV9sZW5ndGggPSBkYXRhLnJlYWRJbnQoKTsKLSAgICAgICAgICBpZiAoKF9hcmcxX2xlbmd0aDwwKSkgeworICAgICAgICAgIGlmIChfYXJnMV9sZW5ndGggPCAwKSB7CiAgICAgICAgICAgICBfYXJnMSA9IG51bGw7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgeworICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBfYXJnMSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nW19hcmcxX2xlbmd0aF07CiAgICAgICAgICAgfQorICAgICAgICAgIGRhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7CiAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ1tdIF9yZXN1bHQgPSB0aGlzLlJldmVyc2VTdHJpbmcoX2FyZzAsIF9hcmcxKTsKICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVTdHJpbmdBcnJheShfcmVzdWx0KTsKICAgICAgICAgICByZXBseS53cml0ZVN0cmluZ0FycmF5KF9hcmcxKTsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX1JldmVyc2VCeXRlRW51bToKICAgICAgICAgewotICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShkZXNjcmlwdG9yKTsKICAgICAgICAgICBieXRlW10gX2FyZzA7CiAgICAgICAgICAgX2FyZzAgPSBkYXRhLmNyZWF0ZUJ5dGVBcnJheSgpOwogICAgICAgICAgIGJ5dGVbXSBfYXJnMTsKICAgICAgICAgICBpbnQgX2FyZzFfbGVuZ3RoID0gZGF0YS5yZWFkSW50KCk7Ci0gICAgICAgICAgaWYgKChfYXJnMV9sZW5ndGg8MCkpIHsKKyAgICAgICAgICBpZiAoX2FyZzFfbGVuZ3RoIDwgMCkgewogICAgICAgICAgICAgX2FyZzEgPSBudWxsOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgX2FyZzEgPSBuZXcgYnl0ZVtfYXJnMV9sZW5ndGhdOwogICAgICAgICAgIH0KKyAgICAgICAgICBkYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOwogICAgICAgICAgIGJ5dGVbXSBfcmVzdWx0ID0gdGhpcy5SZXZlcnNlQnl0ZUVudW0oX2FyZzAsIF9hcmcxKTsKICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVCeXRlQXJyYXkoX3Jlc3VsdCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVCeXRlQXJyYXkoX2FyZzEpOwotICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fUmV2ZXJzZUludEVudW06CiAgICAgICAgIHsKLSAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoZGVzY3JpcHRvcik7CiAgICAgICAgICAgaW50W10gX2FyZzA7CiAgICAgICAgICAgX2FyZzAgPSBkYXRhLmNyZWF0ZUludEFycmF5KCk7CiAgICAgICAgICAgaW50W10gX2FyZzE7CiAgICAgICAgICAgaW50IF9hcmcxX2xlbmd0aCA9IGRhdGEucmVhZEludCgpOwotICAgICAgICAgIGlmICgoX2FyZzFfbGVuZ3RoPDApKSB7CisgICAgICAgICAgaWYgKF9hcmcxX2xlbmd0aCA8IDApIHsKICAgICAgICAgICAgIF9hcmcxID0gbnVsbDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7CisgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIF9hcmcxID0gbmV3IGludFtfYXJnMV9sZW5ndGhdOwogICAgICAgICAgIH0KKyAgICAgICAgICBkYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOwogICAgICAgICAgIGludFtdIF9yZXN1bHQgPSB0aGlzLlJldmVyc2VJbnRFbnVtKF9hcmcwLCBfYXJnMSk7CiAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOwogICAgICAgICAgIHJlcGx5LndyaXRlSW50QXJyYXkoX3Jlc3VsdCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVJbnRBcnJheShfYXJnMSk7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9SZXZlcnNlTG9uZ0VudW06CiAgICAgICAgIHsKLSAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoZGVzY3JpcHRvcik7CiAgICAgICAgICAgbG9uZ1tdIF9hcmcwOwogICAgICAgICAgIF9hcmcwID0gZGF0YS5jcmVhdGVMb25nQXJyYXkoKTsKICAgICAgICAgICBsb25nW10gX2FyZzE7CiAgICAgICAgICAgaW50IF9hcmcxX2xlbmd0aCA9IGRhdGEucmVhZEludCgpOwotICAgICAgICAgIGlmICgoX2FyZzFfbGVuZ3RoPDApKSB7CisgICAgICAgICAgaWYgKF9hcmcxX2xlbmd0aCA8IDApIHsKICAgICAgICAgICAgIF9hcmcxID0gbnVsbDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7CisgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIF9hcmcxID0gbmV3IGxvbmdbX2FyZzFfbGVuZ3RoXTsKICAgICAgICAgICB9CisgICAgICAgICAgZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsKICAgICAgICAgICBsb25nW10gX3Jlc3VsdCA9IHRoaXMuUmV2ZXJzZUxvbmdFbnVtKF9hcmcwLCBfYXJnMSk7CiAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOwogICAgICAgICAgIHJlcGx5LndyaXRlTG9uZ0FycmF5KF9yZXN1bHQpOwogICAgICAgICAgIHJlcGx5LndyaXRlTG9uZ0FycmF5KF9hcmcxKTsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX0dldE90aGVyVGVzdFNlcnZpY2U6CiAgICAgICAgIHsKLSAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoZGVzY3JpcHRvcik7CiAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBfYXJnMDsKICAgICAgICAgICBfYXJnMCA9IGRhdGEucmVhZFN0cmluZygpOworICAgICAgICAgIGRhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7CiAgICAgICAgICAgYW5kcm9pZC5haWRsLnRlc3RzLklOYW1lZENhbGxiYWNrIF9yZXN1bHQgPSB0aGlzLkdldE90aGVyVGVzdFNlcnZpY2UoX2FyZzApOwogICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKLSAgICAgICAgICByZXBseS53cml0ZVN0cm9uZ0JpbmRlcigoKChfcmVzdWx0IT1udWxsKSk/KF9yZXN1bHQuYXNCaW5kZXIoKSk6KG51bGwpKSk7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgcmVwbHkud3JpdGVTdHJvbmdJbnRlcmZhY2UoX3Jlc3VsdCk7CisgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9WZXJpZnlOYW1lOgogICAgICAgICB7Ci0gICAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKGRlc2NyaXB0b3IpOwogICAgICAgICAgIGFuZHJvaWQuYWlkbC50ZXN0cy5JTmFtZWRDYWxsYmFjayBfYXJnMDsKICAgICAgICAgICBfYXJnMCA9IGFuZHJvaWQuYWlkbC50ZXN0cy5JTmFtZWRDYWxsYmFjay5TdHViLmFzSW50ZXJmYWNlKGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIF9hcmcxOwogICAgICAgICAgIF9hcmcxID0gZGF0YS5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsKICAgICAgICAgICBib29sZWFuIF9yZXN1bHQgPSB0aGlzLlZlcmlmeU5hbWUoX2FyZzAsIF9hcmcxKTsKICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgcmVwbHkud3JpdGVJbnQoKChfcmVzdWx0KT8oMSk6KDApKSk7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgcmVwbHkud3JpdGVCb29sZWFuKF9yZXN1bHQpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fR2V0SW50ZXJmYWNlQXJyYXk6CisgICAgICAgIHsKKyAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nW10gX2FyZzA7CisgICAgICAgICAgX2FyZzAgPSBkYXRhLmNyZWF0ZVN0cmluZ0FycmF5KCk7CisgICAgICAgICAgZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsKKyAgICAgICAgICBhbmRyb2lkLmFpZGwudGVzdHMuSU5hbWVkQ2FsbGJhY2tbXSBfcmVzdWx0ID0gdGhpcy5HZXRJbnRlcmZhY2VBcnJheShfYXJnMCk7CisgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOworICAgICAgICAgIHJlcGx5LndyaXRlSW50ZXJmYWNlQXJyYXkoX3Jlc3VsdCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9WZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VBcnJheToKKyAgICAgICAgeworICAgICAgICAgIGFuZHJvaWQuYWlkbC50ZXN0cy5JTmFtZWRDYWxsYmFja1tdIF9hcmcwOworICAgICAgICAgIF9hcmcwID0gZGF0YS5jcmVhdGVJbnRlcmZhY2VBcnJheShhbmRyb2lkLmFpZGwudGVzdHMuSU5hbWVkQ2FsbGJhY2tbXTo6bmV3LCBhbmRyb2lkLmFpZGwudGVzdHMuSU5hbWVkQ2FsbGJhY2suU3R1Yjo6YXNJbnRlcmZhY2UpOworICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdbXSBfYXJnMTsKKyAgICAgICAgICBfYXJnMSA9IGRhdGEuY3JlYXRlU3RyaW5nQXJyYXkoKTsKKyAgICAgICAgICBkYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOworICAgICAgICAgIGJvb2xlYW4gX3Jlc3VsdCA9IHRoaXMuVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlQXJyYXkoX2FyZzAsIF9hcmcxKTsKKyAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgcmVwbHkud3JpdGVCb29sZWFuKF9yZXN1bHQpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fR2V0TnVsbGFibGVJbnRlcmZhY2VBcnJheToKKyAgICAgICAgeworICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdbXSBfYXJnMDsKKyAgICAgICAgICBfYXJnMCA9IGRhdGEuY3JlYXRlU3RyaW5nQXJyYXkoKTsKKyAgICAgICAgICBkYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOworICAgICAgICAgIGFuZHJvaWQuYWlkbC50ZXN0cy5JTmFtZWRDYWxsYmFja1tdIF9yZXN1bHQgPSB0aGlzLkdldE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoX2FyZzApOworICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKKyAgICAgICAgICByZXBseS53cml0ZUludGVyZmFjZUFycmF5KF9yZXN1bHQpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fVmVyaWZ5TmFtZXNXaXRoTnVsbGFibGVJbnRlcmZhY2VBcnJheToKKyAgICAgICAgeworICAgICAgICAgIGFuZHJvaWQuYWlkbC50ZXN0cy5JTmFtZWRDYWxsYmFja1tdIF9hcmcwOworICAgICAgICAgIF9hcmcwID0gZGF0YS5jcmVhdGVJbnRlcmZhY2VBcnJheShhbmRyb2lkLmFpZGwudGVzdHMuSU5hbWVkQ2FsbGJhY2tbXTo6bmV3LCBhbmRyb2lkLmFpZGwudGVzdHMuSU5hbWVkQ2FsbGJhY2suU3R1Yjo6YXNJbnRlcmZhY2UpOworICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdbXSBfYXJnMTsKKyAgICAgICAgICBfYXJnMSA9IGRhdGEuY3JlYXRlU3RyaW5nQXJyYXkoKTsKKyAgICAgICAgICBkYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOworICAgICAgICAgIGJvb2xlYW4gX3Jlc3VsdCA9IHRoaXMuVmVyaWZ5TmFtZXNXaXRoTnVsbGFibGVJbnRlcmZhY2VBcnJheShfYXJnMCwgX2FyZzEpOworICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKKyAgICAgICAgICByZXBseS53cml0ZUJvb2xlYW4oX3Jlc3VsdCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9HZXRJbnRlcmZhY2VMaXN0OgorICAgICAgICB7CisgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ1tdIF9hcmcwOworICAgICAgICAgIF9hcmcwID0gZGF0YS5jcmVhdGVTdHJpbmdBcnJheSgpOworICAgICAgICAgIGRhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7CisgICAgICAgICAgamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5haWRsLnRlc3RzLklOYW1lZENhbGxiYWNrPiBfcmVzdWx0ID0gdGhpcy5HZXRJbnRlcmZhY2VMaXN0KF9hcmcwKTsKKyAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgcmVwbHkud3JpdGVJbnRlcmZhY2VMaXN0KF9yZXN1bHQpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlTGlzdDoKKyAgICAgICAgeworICAgICAgICAgIGphdmEudXRpbC5MaXN0PGFuZHJvaWQuYWlkbC50ZXN0cy5JTmFtZWRDYWxsYmFjaz4gX2FyZzA7CisgICAgICAgICAgX2FyZzAgPSBkYXRhLmNyZWF0ZUludGVyZmFjZUFycmF5TGlzdChhbmRyb2lkLmFpZGwudGVzdHMuSU5hbWVkQ2FsbGJhY2suU3R1Yjo6YXNJbnRlcmZhY2UpOworICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdbXSBfYXJnMTsKKyAgICAgICAgICBfYXJnMSA9IGRhdGEuY3JlYXRlU3RyaW5nQXJyYXkoKTsKKyAgICAgICAgICBkYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOworICAgICAgICAgIGJvb2xlYW4gX3Jlc3VsdCA9IHRoaXMuVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlTGlzdChfYXJnMCwgX2FyZzEpOworICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKKyAgICAgICAgICByZXBseS53cml0ZUJvb2xlYW4oX3Jlc3VsdCk7CisgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9SZXZlcnNlU3RyaW5nTGlzdDoKICAgICAgICAgewotICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShkZXNjcmlwdG9yKTsKICAgICAgICAgICBqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuU3RyaW5nPiBfYXJnMDsKICAgICAgICAgICBfYXJnMCA9IGRhdGEuY3JlYXRlU3RyaW5nQXJyYXlMaXN0KCk7CiAgICAgICAgICAgamF2YS51dGlsLkxpc3Q8amF2YS5sYW5nLlN0cmluZz4gX2FyZzE7CiAgICAgICAgICAgX2FyZzEgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdDxqYXZhLmxhbmcuU3RyaW5nPigpOworICAgICAgICAgIGRhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7CiAgICAgICAgICAgamF2YS51dGlsLkxpc3Q8amF2YS5sYW5nLlN0cmluZz4gX3Jlc3VsdCA9IHRoaXMuUmV2ZXJzZVN0cmluZ0xpc3QoX2FyZzAsIF9hcmcxKTsKICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVTdHJpbmdMaXN0KF9yZXN1bHQpOwogICAgICAgICAgIHJlcGx5LndyaXRlU3RyaW5nTGlzdChfYXJnMSk7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9SZXBlYXRQYXJjZWxGaWxlRGVzY3JpcHRvcjoKICAgICAgICAgewotICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShkZXNjcmlwdG9yKTsKICAgICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yIF9hcmcwOwotICAgICAgICAgIGlmICgoMCE9ZGF0YS5yZWFkSW50KCkpKSB7Ci0gICAgICAgICAgICBfYXJnMCA9IGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3IuQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKGRhdGEpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIF9hcmcwID0gbnVsbDsKLSAgICAgICAgICB9CisgICAgICAgICAgX2FyZzAgPSBkYXRhLnJlYWRUeXBlZE9iamVjdChhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yLkNSRUFUT1IpOworICAgICAgICAgIGRhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7CiAgICAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvciBfcmVzdWx0ID0gdGhpcy5SZXBlYXRQYXJjZWxGaWxlRGVzY3JpcHRvcihfYXJnMCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOwotICAgICAgICAgIGlmICgoX3Jlc3VsdCE9bnVsbCkpIHsKLSAgICAgICAgICAgIHJlcGx5LndyaXRlSW50KDEpOwotICAgICAgICAgICAgX3Jlc3VsdC53cml0ZVRvUGFyY2VsKHJlcGx5LCBhbmRyb2lkLm9zLlBhcmNlbGFibGUuUEFSQ0VMQUJMRV9XUklURV9SRVRVUk5fVkFMVUUpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHJlcGx5LndyaXRlSW50KDApOwotICAgICAgICAgIH0KLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICByZXBseS53cml0ZVR5cGVkT2JqZWN0KF9yZXN1bHQsIGFuZHJvaWQub3MuUGFyY2VsYWJsZS5QQVJDRUxBQkxFX1dSSVRFX1JFVFVSTl9WQUxVRSk7CisgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9SZXZlcnNlUGFyY2VsRmlsZURlc2NyaXB0b3JBcnJheToKICAgICAgICAgewotICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShkZXNjcmlwdG9yKTsKICAgICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yW10gX2FyZzA7CiAgICAgICAgICAgX2FyZzAgPSBkYXRhLmNyZWF0ZVR5cGVkQXJyYXkoYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvci5DUkVBVE9SKTsKICAgICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yW10gX2FyZzE7CiAgICAgICAgICAgaW50IF9hcmcxX2xlbmd0aCA9IGRhdGEucmVhZEludCgpOwotICAgICAgICAgIGlmICgoX2FyZzFfbGVuZ3RoPDApKSB7CisgICAgICAgICAgaWYgKF9hcmcxX2xlbmd0aCA8IDApIHsKICAgICAgICAgICAgIF9hcmcxID0gbnVsbDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7CisgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIF9hcmcxID0gbmV3IGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3JbX2FyZzFfbGVuZ3RoXTsKICAgICAgICAgICB9CisgICAgICAgICAgZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsKICAgICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yW10gX3Jlc3VsdCA9IHRoaXMuUmV2ZXJzZVBhcmNlbEZpbGVEZXNjcmlwdG9yQXJyYXkoX2FyZzAsIF9hcmcxKTsKICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVUeXBlZEFycmF5KF9yZXN1bHQsIGFuZHJvaWQub3MuUGFyY2VsYWJsZS5QQVJDRUxBQkxFX1dSSVRFX1JFVFVSTl9WQUxVRSk7CiAgICAgICAgICAgcmVwbHkud3JpdGVUeXBlZEFycmF5KF9hcmcxLCBhbmRyb2lkLm9zLlBhcmNlbGFibGUuUEFSQ0VMQUJMRV9XUklURV9SRVRVUk5fVkFMVUUpOwotICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fVGhyb3dTZXJ2aWNlRXhjZXB0aW9uOgogICAgICAgICB7Ci0gICAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKGRlc2NyaXB0b3IpOwogICAgICAgICAgIGludCBfYXJnMDsKICAgICAgICAgICBfYXJnMCA9IGRhdGEucmVhZEludCgpOworICAgICAgICAgIGRhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7CiAgICAgICAgICAgdGhpcy5UaHJvd1NlcnZpY2VFeGNlcHRpb24oX2FyZzApOwogICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX1JlcGVhdE51bGxhYmxlSW50QXJyYXk6CiAgICAgICAgIHsKLSAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoZGVzY3JpcHRvcik7CiAgICAgICAgICAgaW50W10gX2FyZzA7CiAgICAgICAgICAgX2FyZzAgPSBkYXRhLmNyZWF0ZUludEFycmF5KCk7CisgICAgICAgICAgZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsKICAgICAgICAgICBpbnRbXSBfcmVzdWx0ID0gdGhpcy5SZXBlYXROdWxsYWJsZUludEFycmF5KF9hcmcwKTsKICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVJbnRBcnJheShfcmVzdWx0KTsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX1JlcGVhdE51bGxhYmxlQnl0ZUVudW1BcnJheToKICAgICAgICAgewotICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShkZXNjcmlwdG9yKTsKICAgICAgICAgICBieXRlW10gX2FyZzA7CiAgICAgICAgICAgX2FyZzAgPSBkYXRhLmNyZWF0ZUJ5dGVBcnJheSgpOworICAgICAgICAgIGRhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7CiAgICAgICAgICAgYnl0ZVtdIF9yZXN1bHQgPSB0aGlzLlJlcGVhdE51bGxhYmxlQnl0ZUVudW1BcnJheShfYXJnMCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOwogICAgICAgICAgIHJlcGx5LndyaXRlQnl0ZUFycmF5KF9yZXN1bHQpOwotICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fUmVwZWF0TnVsbGFibGVJbnRFbnVtQXJyYXk6CiAgICAgICAgIHsKLSAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoZGVzY3JpcHRvcik7CiAgICAgICAgICAgaW50W10gX2FyZzA7CiAgICAgICAgICAgX2FyZzAgPSBkYXRhLmNyZWF0ZUludEFycmF5KCk7CisgICAgICAgICAgZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsKICAgICAgICAgICBpbnRbXSBfcmVzdWx0ID0gdGhpcy5SZXBlYXROdWxsYWJsZUludEVudW1BcnJheShfYXJnMCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOwogICAgICAgICAgIHJlcGx5LndyaXRlSW50QXJyYXkoX3Jlc3VsdCk7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9SZXBlYXROdWxsYWJsZUxvbmdFbnVtQXJyYXk6CiAgICAgICAgIHsKLSAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoZGVzY3JpcHRvcik7CiAgICAgICAgICAgbG9uZ1tdIF9hcmcwOwogICAgICAgICAgIF9hcmcwID0gZGF0YS5jcmVhdGVMb25nQXJyYXkoKTsKKyAgICAgICAgICBkYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOwogICAgICAgICAgIGxvbmdbXSBfcmVzdWx0ID0gdGhpcy5SZXBlYXROdWxsYWJsZUxvbmdFbnVtQXJyYXkoX2FyZzApOwogICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKICAgICAgICAgICByZXBseS53cml0ZUxvbmdBcnJheShfcmVzdWx0KTsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX1JlcGVhdE51bGxhYmxlU3RyaW5nOgogICAgICAgICB7Ci0gICAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKGRlc2NyaXB0b3IpOwogICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgX2FyZzA7CiAgICAgICAgICAgX2FyZzAgPSBkYXRhLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICBkYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOwogICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgX3Jlc3VsdCA9IHRoaXMuUmVwZWF0TnVsbGFibGVTdHJpbmcoX2FyZzApOwogICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKICAgICAgICAgICByZXBseS53cml0ZVN0cmluZyhfcmVzdWx0KTsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX1JlcGVhdE51bGxhYmxlU3RyaW5nTGlzdDoKICAgICAgICAgewotICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShkZXNjcmlwdG9yKTsKICAgICAgICAgICBqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuU3RyaW5nPiBfYXJnMDsKICAgICAgICAgICBfYXJnMCA9IGRhdGEuY3JlYXRlU3RyaW5nQXJyYXlMaXN0KCk7CisgICAgICAgICAgZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsKICAgICAgICAgICBqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuU3RyaW5nPiBfcmVzdWx0ID0gdGhpcy5SZXBlYXROdWxsYWJsZVN0cmluZ0xpc3QoX2FyZzApOwogICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKICAgICAgICAgICByZXBseS53cml0ZVN0cmluZ0xpc3QoX3Jlc3VsdCk7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9SZXBlYXROdWxsYWJsZVBhcmNlbGFibGU6CiAgICAgICAgIHsKLSAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoZGVzY3JpcHRvcik7Ci0gICAgICAgICAgYW5kcm9pZC5haWRsLnRlc3RzLlN0cnVjdHVyZWRQYXJjZWxhYmxlIF9hcmcwOwotICAgICAgICAgIGlmICgoMCE9ZGF0YS5yZWFkSW50KCkpKSB7Ci0gICAgICAgICAgICBfYXJnMCA9IGFuZHJvaWQuYWlkbC50ZXN0cy5TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoZGF0YSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgX2FyZzAgPSBudWxsOwotICAgICAgICAgIH0KLSAgICAgICAgICBhbmRyb2lkLmFpZGwudGVzdHMuU3RydWN0dXJlZFBhcmNlbGFibGUgX3Jlc3VsdCA9IHRoaXMuUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlKF9hcmcwKTsKKyAgICAgICAgICBhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlLkVtcHR5IF9hcmcwOworICAgICAgICAgIF9hcmcwID0gZGF0YS5yZWFkVHlwZWRPYmplY3QoYW5kcm9pZC5haWRsLnRlc3RzLklUZXN0U2VydmljZS5FbXB0eS5DUkVBVE9SKTsKKyAgICAgICAgICBkYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOworICAgICAgICAgIGFuZHJvaWQuYWlkbC50ZXN0cy5JVGVzdFNlcnZpY2UuRW1wdHkgX3Jlc3VsdCA9IHRoaXMuUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlKF9hcmcwKTsKICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgaWYgKChfcmVzdWx0IT1udWxsKSkgewotICAgICAgICAgICAgcmVwbHkud3JpdGVJbnQoMSk7Ci0gICAgICAgICAgICBfcmVzdWx0LndyaXRlVG9QYXJjZWwocmVwbHksIGFuZHJvaWQub3MuUGFyY2VsYWJsZS5QQVJDRUxBQkxFX1dSSVRFX1JFVFVSTl9WQUxVRSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgcmVwbHkud3JpdGVJbnQoMCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIHJlcGx5LndyaXRlVHlwZWRPYmplY3QoX3Jlc3VsdCwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLlBBUkNFTEFCTEVfV1JJVEVfUkVUVVJOX1ZBTFVFKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX1JlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUFycmF5OgorICAgICAgICB7CisgICAgICAgICAgYW5kcm9pZC5haWRsLnRlc3RzLklUZXN0U2VydmljZS5FbXB0eVtdIF9hcmcwOworICAgICAgICAgIF9hcmcwID0gZGF0YS5jcmVhdGVUeXBlZEFycmF5KGFuZHJvaWQuYWlkbC50ZXN0cy5JVGVzdFNlcnZpY2UuRW1wdHkuQ1JFQVRPUik7CisgICAgICAgICAgZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsKKyAgICAgICAgICBhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlLkVtcHR5W10gX3Jlc3VsdCA9IHRoaXMuUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlQXJyYXkoX2FyZzApOworICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKKyAgICAgICAgICByZXBseS53cml0ZVR5cGVkQXJyYXkoX3Jlc3VsdCwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLlBBUkNFTEFCTEVfV1JJVEVfUkVUVVJOX1ZBTFVFKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX1JlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUxpc3Q6CisgICAgICAgIHsKKyAgICAgICAgICBqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlLkVtcHR5PiBfYXJnMDsKKyAgICAgICAgICBfYXJnMCA9IGRhdGEuY3JlYXRlVHlwZWRBcnJheUxpc3QoYW5kcm9pZC5haWRsLnRlc3RzLklUZXN0U2VydmljZS5FbXB0eS5DUkVBVE9SKTsKKyAgICAgICAgICBkYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOworICAgICAgICAgIGphdmEudXRpbC5MaXN0PGFuZHJvaWQuYWlkbC50ZXN0cy5JVGVzdFNlcnZpY2UuRW1wdHk+IF9yZXN1bHQgPSB0aGlzLlJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUxpc3QoX2FyZzApOworICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKKyAgICAgICAgICByZXBseS53cml0ZVR5cGVkTGlzdChfcmVzdWx0KTsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX1Rha2VzQW5JQmluZGVyOgogICAgICAgICB7Ci0gICAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKGRlc2NyaXB0b3IpOwogICAgICAgICAgIGFuZHJvaWQub3MuSUJpbmRlciBfYXJnMDsKICAgICAgICAgICBfYXJnMCA9IGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpOworICAgICAgICAgIGRhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7CiAgICAgICAgICAgdGhpcy5UYWtlc0FuSUJpbmRlcihfYXJnMCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOwotICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fVGFrZXNBTnVsbGFibGVJQmluZGVyOgogICAgICAgICB7Ci0gICAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKGRlc2NyaXB0b3IpOwogICAgICAgICAgIGFuZHJvaWQub3MuSUJpbmRlciBfYXJnMDsKICAgICAgICAgICBfYXJnMCA9IGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpOworICAgICAgICAgIGRhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7CiAgICAgICAgICAgdGhpcy5UYWtlc0FOdWxsYWJsZUlCaW5kZXIoX2FyZzApOwogICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX1Rha2VzQW5JQmluZGVyTGlzdDoKKyAgICAgICAgeworICAgICAgICAgIGphdmEudXRpbC5MaXN0PGFuZHJvaWQub3MuSUJpbmRlcj4gX2FyZzA7CisgICAgICAgICAgX2FyZzAgPSBkYXRhLmNyZWF0ZUJpbmRlckFycmF5TGlzdCgpOworICAgICAgICAgIGRhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7CisgICAgICAgICAgdGhpcy5UYWtlc0FuSUJpbmRlckxpc3QoX2FyZzApOworICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX1Rha2VzQU51bGxhYmxlSUJpbmRlckxpc3Q6CisgICAgICAgIHsKKyAgICAgICAgICBqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLm9zLklCaW5kZXI+IF9hcmcwOworICAgICAgICAgIF9hcmcwID0gZGF0YS5jcmVhdGVCaW5kZXJBcnJheUxpc3QoKTsKKyAgICAgICAgICBkYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOworICAgICAgICAgIHRoaXMuVGFrZXNBTnVsbGFibGVJQmluZGVyTGlzdChfYXJnMCk7CisgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fUmVwZWF0VXRmOENwcFN0cmluZzoKICAgICAgICAgewotICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShkZXNjcmlwdG9yKTsKICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIF9hcmcwOwogICAgICAgICAgIF9hcmcwID0gZGF0YS5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsKICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIF9yZXN1bHQgPSB0aGlzLlJlcGVhdFV0ZjhDcHBTdHJpbmcoX2FyZzApOwogICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKICAgICAgICAgICByZXBseS53cml0ZVN0cmluZyhfcmVzdWx0KTsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX1JlcGVhdE51bGxhYmxlVXRmOENwcFN0cmluZzoKICAgICAgICAgewotICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShkZXNjcmlwdG9yKTsKICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIF9hcmcwOwogICAgICAgICAgIF9hcmcwID0gZGF0YS5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsKICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIF9yZXN1bHQgPSB0aGlzLlJlcGVhdE51bGxhYmxlVXRmOENwcFN0cmluZyhfYXJnMCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOwogICAgICAgICAgIHJlcGx5LndyaXRlU3RyaW5nKF9yZXN1bHQpOwotICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fUmV2ZXJzZVV0ZjhDcHBTdHJpbmc6CiAgICAgICAgIHsKLSAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoZGVzY3JpcHRvcik7CiAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ1tdIF9hcmcwOwogICAgICAgICAgIF9hcmcwID0gZGF0YS5jcmVhdGVTdHJpbmdBcnJheSgpOwogICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdbXSBfYXJnMTsKICAgICAgICAgICBpbnQgX2FyZzFfbGVuZ3RoID0gZGF0YS5yZWFkSW50KCk7Ci0gICAgICAgICAgaWYgKChfYXJnMV9sZW5ndGg8MCkpIHsKKyAgICAgICAgICBpZiAoX2FyZzFfbGVuZ3RoIDwgMCkgewogICAgICAgICAgICAgX2FyZzEgPSBudWxsOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgX2FyZzEgPSBuZXcgamF2YS5sYW5nLlN0cmluZ1tfYXJnMV9sZW5ndGhdOwogICAgICAgICAgIH0KKyAgICAgICAgICBkYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOwogICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdbXSBfcmVzdWx0ID0gdGhpcy5SZXZlcnNlVXRmOENwcFN0cmluZyhfYXJnMCwgX2FyZzEpOwogICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKICAgICAgICAgICByZXBseS53cml0ZVN0cmluZ0FycmF5KF9yZXN1bHQpOwogICAgICAgICAgIHJlcGx5LndyaXRlU3RyaW5nQXJyYXkoX2FyZzEpOwotICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fUmV2ZXJzZU51bGxhYmxlVXRmOENwcFN0cmluZzoKICAgICAgICAgewotICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShkZXNjcmlwdG9yKTsKICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nW10gX2FyZzA7CiAgICAgICAgICAgX2FyZzAgPSBkYXRhLmNyZWF0ZVN0cmluZ0FycmF5KCk7CiAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ1tdIF9hcmcxOwogICAgICAgICAgIGludCBfYXJnMV9sZW5ndGggPSBkYXRhLnJlYWRJbnQoKTsKLSAgICAgICAgICBpZiAoKF9hcmcxX2xlbmd0aDwwKSkgeworICAgICAgICAgIGlmIChfYXJnMV9sZW5ndGggPCAwKSB7CiAgICAgICAgICAgICBfYXJnMSA9IG51bGw7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgeworICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBfYXJnMSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nW19hcmcxX2xlbmd0aF07CiAgICAgICAgICAgfQorICAgICAgICAgIGRhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7CiAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ1tdIF9yZXN1bHQgPSB0aGlzLlJldmVyc2VOdWxsYWJsZVV0ZjhDcHBTdHJpbmcoX2FyZzAsIF9hcmcxKTsKICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVTdHJpbmdBcnJheShfcmVzdWx0KTsKICAgICAgICAgICByZXBseS53cml0ZVN0cmluZ0FycmF5KF9hcmcxKTsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX1JldmVyc2VVdGY4Q3BwU3RyaW5nTGlzdDoKICAgICAgICAgewotICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShkZXNjcmlwdG9yKTsKICAgICAgICAgICBqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuU3RyaW5nPiBfYXJnMDsKICAgICAgICAgICBfYXJnMCA9IGRhdGEuY3JlYXRlU3RyaW5nQXJyYXlMaXN0KCk7CiAgICAgICAgICAgamF2YS51dGlsLkxpc3Q8amF2YS5sYW5nLlN0cmluZz4gX2FyZzE7CiAgICAgICAgICAgX2FyZzEgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdDxqYXZhLmxhbmcuU3RyaW5nPigpOworICAgICAgICAgIGRhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7CiAgICAgICAgICAgamF2YS51dGlsLkxpc3Q8amF2YS5sYW5nLlN0cmluZz4gX3Jlc3VsdCA9IHRoaXMuUmV2ZXJzZVV0ZjhDcHBTdHJpbmdMaXN0KF9hcmcwLCBfYXJnMSk7CiAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOwogICAgICAgICAgIHJlcGx5LndyaXRlU3RyaW5nTGlzdChfcmVzdWx0KTsKICAgICAgICAgICByZXBseS53cml0ZVN0cmluZ0xpc3QoX2FyZzEpOwotICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fR2V0Q2FsbGJhY2s6CiAgICAgICAgIHsKLSAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoZGVzY3JpcHRvcik7CiAgICAgICAgICAgYm9vbGVhbiBfYXJnMDsKLSAgICAgICAgICBfYXJnMCA9ICgwIT1kYXRhLnJlYWRJbnQoKSk7CisgICAgICAgICAgX2FyZzAgPSBkYXRhLnJlYWRCb29sZWFuKCk7CisgICAgICAgICAgZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsKICAgICAgICAgICBhbmRyb2lkLmFpZGwudGVzdHMuSU5hbWVkQ2FsbGJhY2sgX3Jlc3VsdCA9IHRoaXMuR2V0Q2FsbGJhY2soX2FyZzApOwogICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKLSAgICAgICAgICByZXBseS53cml0ZVN0cm9uZ0JpbmRlcigoKChfcmVzdWx0IT1udWxsKSk/KF9yZXN1bHQuYXNCaW5kZXIoKSk6KG51bGwpKSk7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgcmVwbHkud3JpdGVTdHJvbmdJbnRlcmZhY2UoX3Jlc3VsdCk7CisgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9GaWxsT3V0U3RydWN0dXJlZFBhcmNlbGFibGU6CiAgICAgICAgIHsKLSAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoZGVzY3JpcHRvcik7CiAgICAgICAgICAgYW5kcm9pZC5haWRsLnRlc3RzLlN0cnVjdHVyZWRQYXJjZWxhYmxlIF9hcmcwOwotICAgICAgICAgIGlmICgoMCE9ZGF0YS5yZWFkSW50KCkpKSB7Ci0gICAgICAgICAgICBfYXJnMCA9IGFuZHJvaWQuYWlkbC50ZXN0cy5TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoZGF0YSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgX2FyZzAgPSBudWxsOwotICAgICAgICAgIH0KKyAgICAgICAgICBfYXJnMCA9IGRhdGEucmVhZFR5cGVkT2JqZWN0KGFuZHJvaWQuYWlkbC50ZXN0cy5TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5DUkVBVE9SKTsKKyAgICAgICAgICBkYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOwogICAgICAgICAgIHRoaXMuRmlsbE91dFN0cnVjdHVyZWRQYXJjZWxhYmxlKF9hcmcwKTsKICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgaWYgKChfYXJnMCE9bnVsbCkpIHsKLSAgICAgICAgICAgIHJlcGx5LndyaXRlSW50KDEpOwotICAgICAgICAgICAgX2FyZzAud3JpdGVUb1BhcmNlbChyZXBseSwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLlBBUkNFTEFCTEVfV1JJVEVfUkVUVVJOX1ZBTFVFKTsKKyAgICAgICAgICByZXBseS53cml0ZVR5cGVkT2JqZWN0KF9hcmcwLCBhbmRyb2lkLm9zLlBhcmNlbGFibGUuUEFSQ0VMQUJMRV9XUklURV9SRVRVUk5fVkFMVUUpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fUmVwZWF0RXh0ZW5kYWJsZVBhcmNlbGFibGU6CisgICAgICAgIHsKKyAgICAgICAgICBhbmRyb2lkLmFpZGwudGVzdHMuZXh0ZW5zaW9uLkV4dGVuZGFibGVQYXJjZWxhYmxlIF9hcmcwOworICAgICAgICAgIF9hcmcwID0gZGF0YS5yZWFkVHlwZWRPYmplY3QoYW5kcm9pZC5haWRsLnRlc3RzLmV4dGVuc2lvbi5FeHRlbmRhYmxlUGFyY2VsYWJsZS5DUkVBVE9SKTsKKyAgICAgICAgICBhbmRyb2lkLmFpZGwudGVzdHMuZXh0ZW5zaW9uLkV4dGVuZGFibGVQYXJjZWxhYmxlIF9hcmcxOworICAgICAgICAgIF9hcmcxID0gbmV3IGFuZHJvaWQuYWlkbC50ZXN0cy5leHRlbnNpb24uRXh0ZW5kYWJsZVBhcmNlbGFibGUoKTsKKyAgICAgICAgICBkYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOworICAgICAgICAgIHRoaXMuUmVwZWF0RXh0ZW5kYWJsZVBhcmNlbGFibGUoX2FyZzAsIF9hcmcxKTsKKyAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgcmVwbHkud3JpdGVUeXBlZE9iamVjdChfYXJnMSwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLlBBUkNFTEFCTEVfV1JJVEVfUkVUVVJOX1ZBTFVFKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX1JldmVyc2VMaXN0OgorICAgICAgICB7CisgICAgICAgICAgYW5kcm9pZC5haWRsLnRlc3RzLlJlY3Vyc2l2ZUxpc3QgX2FyZzA7CisgICAgICAgICAgX2FyZzAgPSBkYXRhLnJlYWRUeXBlZE9iamVjdChhbmRyb2lkLmFpZGwudGVzdHMuUmVjdXJzaXZlTGlzdC5DUkVBVE9SKTsKKyAgICAgICAgICBkYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOworICAgICAgICAgIGFuZHJvaWQuYWlkbC50ZXN0cy5SZWN1cnNpdmVMaXN0IF9yZXN1bHQgPSB0aGlzLlJldmVyc2VMaXN0KF9hcmcwKTsKKyAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgcmVwbHkud3JpdGVUeXBlZE9iamVjdChfcmVzdWx0LCBhbmRyb2lkLm9zLlBhcmNlbGFibGUuUEFSQ0VMQUJMRV9XUklURV9SRVRVUk5fVkFMVUUpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fUmV2ZXJzZUlCaW5kZXJBcnJheToKKyAgICAgICAgeworICAgICAgICAgIGFuZHJvaWQub3MuSUJpbmRlcltdIF9hcmcwOworICAgICAgICAgIF9hcmcwID0gZGF0YS5jcmVhdGVCaW5kZXJBcnJheSgpOworICAgICAgICAgIGFuZHJvaWQub3MuSUJpbmRlcltdIF9hcmcxOworICAgICAgICAgIGludCBfYXJnMV9sZW5ndGggPSBkYXRhLnJlYWRJbnQoKTsKKyAgICAgICAgICBpZiAoX2FyZzFfbGVuZ3RoIDwgMCkgeworICAgICAgICAgICAgX2FyZzEgPSBudWxsOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBfYXJnMSA9IG5ldyBhbmRyb2lkLm9zLklCaW5kZXJbX2FyZzFfbGVuZ3RoXTsKICAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICByZXBseS53cml0ZUludCgwKTsKKyAgICAgICAgICBkYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOworICAgICAgICAgIGFuZHJvaWQub3MuSUJpbmRlcltdIF9yZXN1bHQgPSB0aGlzLlJldmVyc2VJQmluZGVyQXJyYXkoX2FyZzAsIF9hcmcxKTsKKyAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgcmVwbHkud3JpdGVCaW5kZXJBcnJheShfcmVzdWx0KTsKKyAgICAgICAgICByZXBseS53cml0ZUJpbmRlckFycmF5KF9hcmcxKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX1JldmVyc2VOdWxsYWJsZUlCaW5kZXJBcnJheToKKyAgICAgICAgeworICAgICAgICAgIGFuZHJvaWQub3MuSUJpbmRlcltdIF9hcmcwOworICAgICAgICAgIF9hcmcwID0gZGF0YS5jcmVhdGVCaW5kZXJBcnJheSgpOworICAgICAgICAgIGFuZHJvaWQub3MuSUJpbmRlcltdIF9hcmcxOworICAgICAgICAgIGludCBfYXJnMV9sZW5ndGggPSBkYXRhLnJlYWRJbnQoKTsKKyAgICAgICAgICBpZiAoX2FyZzFfbGVuZ3RoIDwgMCkgeworICAgICAgICAgICAgX2FyZzEgPSBudWxsOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBfYXJnMSA9IG5ldyBhbmRyb2lkLm9zLklCaW5kZXJbX2FyZzFfbGVuZ3RoXTsKICAgICAgICAgICB9Ci0gICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsKKyAgICAgICAgICBhbmRyb2lkLm9zLklCaW5kZXJbXSBfcmVzdWx0ID0gdGhpcy5SZXZlcnNlTnVsbGFibGVJQmluZGVyQXJyYXkoX2FyZzAsIF9hcmcxKTsKKyAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgcmVwbHkud3JpdGVCaW5kZXJBcnJheShfcmVzdWx0KTsKKyAgICAgICAgICByZXBseS53cml0ZUJpbmRlckFycmF5KF9hcmcxKTsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX0dldE9sZE5hbWVJbnRlcmZhY2U6CiAgICAgICAgIHsKLSAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoZGVzY3JpcHRvcik7CiAgICAgICAgICAgYW5kcm9pZC5haWRsLnRlc3RzLklPbGROYW1lIF9yZXN1bHQgPSB0aGlzLkdldE9sZE5hbWVJbnRlcmZhY2UoKTsKICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgcmVwbHkud3JpdGVTdHJvbmdCaW5kZXIoKCgoX3Jlc3VsdCE9bnVsbCkpPyhfcmVzdWx0LmFzQmluZGVyKCkpOihudWxsKSkpOwotICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIHJlcGx5LndyaXRlU3Ryb25nSW50ZXJmYWNlKF9yZXN1bHQpOworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fR2V0TmV3TmFtZUludGVyZmFjZToKICAgICAgICAgewotICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShkZXNjcmlwdG9yKTsKICAgICAgICAgICBhbmRyb2lkLmFpZGwudGVzdHMuSU5ld05hbWUgX3Jlc3VsdCA9IHRoaXMuR2V0TmV3TmFtZUludGVyZmFjZSgpOwogICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKLSAgICAgICAgICByZXBseS53cml0ZVN0cm9uZ0JpbmRlcigoKChfcmVzdWx0IT1udWxsKSk/KF9yZXN1bHQuYXNCaW5kZXIoKSk6KG51bGwpKSk7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgcmVwbHkud3JpdGVTdHJvbmdJbnRlcmZhY2UoX3Jlc3VsdCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9HZXRVbmlvblRhZ3M6CisgICAgICAgIHsKKyAgICAgICAgICBhbmRyb2lkLmFpZGwudGVzdHMuVW5pb25bXSBfYXJnMDsKKyAgICAgICAgICBfYXJnMCA9IGRhdGEuY3JlYXRlVHlwZWRBcnJheShhbmRyb2lkLmFpZGwudGVzdHMuVW5pb24uQ1JFQVRPUik7CisgICAgICAgICAgZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsKKyAgICAgICAgICBpbnRbXSBfcmVzdWx0ID0gdGhpcy5HZXRVbmlvblRhZ3MoX2FyZzApOworICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKKyAgICAgICAgICByZXBseS53cml0ZUludEFycmF5KF9yZXN1bHQpOworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fR2V0Q3BwSmF2YVRlc3RzOgogICAgICAgICB7Ci0gICAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKGRlc2NyaXB0b3IpOwogICAgICAgICAgIGFuZHJvaWQub3MuSUJpbmRlciBfcmVzdWx0ID0gdGhpcy5HZXRDcHBKYXZhVGVzdHMoKTsKICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVTdHJvbmdCaW5kZXIoX3Jlc3VsdCk7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9nZXRCYWNrZW5kVHlwZToKICAgICAgICAgewotICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShkZXNjcmlwdG9yKTsKICAgICAgICAgICBieXRlIF9yZXN1bHQgPSB0aGlzLmdldEJhY2tlbmRUeXBlKCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOwogICAgICAgICAgIHJlcGx5LndyaXRlQnl0ZShfcmVzdWx0KTsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBkZWZhdWx0OgogICAgICAgICB7CiAgICAgICAgICAgcmV0dXJuIHN1cGVyLm9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKICAgICAgICAgfQogICAgICAgfQorICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFByb3h5IGltcGxlbWVudHMgYW5kcm9pZC5haWRsLnRlc3RzLklUZXN0U2VydmljZQogICAgIHsKQEAgLTk2OCw4ICsxNDQ4LDkgQEAKICAgICAgIC8vIG1ldGhvZHMgdG8gYmUgYWRkZWQgYW5kIHJlbW92ZWQuCiAgICAgICBAT3ZlcnJpZGUgcHVibGljIGludCBVbmltcGxlbWVudGVkTWV0aG9kKGludCBhcmcpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgogICAgICAgewotICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwotICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7YW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwogICAgICAgICBpbnQgX3Jlc3VsdDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOwpAQCAtOTkwLDEzICsxNDcxLDE0IEBACiAgICAgICAgIHJldHVybiBfcmVzdWx0OwogICAgICAgfQogICAgICAgLyoqCi0gICAgICAgICAgICogQGRlcHJlY2F0ZWQgdG8gbWFrZSBzdXJlIHdlIGhhdmUgc29tZXRoaW5nIGluIHN5c3RlbS90b29scy9haWRsIHdoaWNoIGRvZXMgYSBjb21waWxlIGNoZWNrCi0gICAgICAgICAgICogICAgIG9mIGRlcHJlY2F0ZWQgYW5kIG1ha2Ugc3VyZSB0aGlzIGlzIHJlZmxlY3RlZCBpbiBnb2xkZW5zCi0gICAgICAgICAgICovCisgICAgICAgKiBAZGVwcmVjYXRlZCB0byBtYWtlIHN1cmUgd2UgaGF2ZSBzb21ldGhpbmcgaW4gc3lzdGVtL3Rvb2xzL2FpZGwgd2hpY2ggZG9lcyBhIGNvbXBpbGUgY2hlY2sKKyAgICAgICAqICAgICBvZiBkZXByZWNhdGVkIGFuZCBtYWtlIHN1cmUgdGhpcyBpcyByZWZsZWN0ZWQgaW4gZ29sZGVucworICAgICAgICovCiAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgRGVwcmVjYXRlZCgpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgogICAgICAgewotICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwotICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7YW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwogICAgICAgICB0cnkgewogICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7CiAgICAgICAgICAgYm9vbGVhbiBfc3RhdHVzID0gbVJlbW90ZS50cmFuc2FjdChTdHViLlRSQU5TQUNUSU9OX0RlcHJlY2F0ZWQsIF9kYXRhLCBfcmVwbHksIGFuZHJvaWQub3MuSUJpbmRlci5GTEFHX0NMRUFSX0JVRik7CkBAIC0xMDE1LDggKzE0OTcsOSBAQAogICAgICAgfQogICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIFRlc3RPbmV3YXkoKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KICAgICAgIHsKLSAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKLSAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpO3RyeSB7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgICAgICAgIHRyeSB7CiAgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKICAgICAgICAgICBib29sZWFuIF9zdGF0dXMgPSBtUmVtb3RlLnRyYW5zYWN0KFN0dWIuVFJBTlNBQ1RJT05fVGVzdE9uZXdheSwgX2RhdGEsIG51bGwsIGFuZHJvaWQub3MuSUJpbmRlci5GTEFHX09ORVdBWSB8IGFuZHJvaWQub3MuSUJpbmRlci5GTEFHX0NMRUFSX0JVRik7CiAgICAgICAgICAgaWYgKCFfc3RhdHVzKSB7CkBAIC0xMDMzLDEyICsxNTE2LDEzIEBACiAgICAgICAvLyBUZXN0IHRoYXQgcHJpbWl0aXZlcyB3b3JrIGFzIHBhcmFtZXRlcnMgYW5kIHJldHVybiB0eXBlcy4KICAgICAgIEBPdmVycmlkZSBwdWJsaWMgYm9vbGVhbiBSZXBlYXRCb29sZWFuKGJvb2xlYW4gdG9rZW4pIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgogICAgICAgewotICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwotICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7YW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwogICAgICAgICBib29sZWFuIF9yZXN1bHQ7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKLSAgICAgICAgICBfZGF0YS53cml0ZUludCgoKHRva2VuKT8oMSk6KDApKSk7CisgICAgICAgICAgX2RhdGEud3JpdGVCb29sZWFuKHRva2VuKTsKICAgICAgICAgICBib29sZWFuIF9zdGF0dXMgPSBtUmVtb3RlLnRyYW5zYWN0KFN0dWIuVFJBTlNBQ1RJT05fUmVwZWF0Qm9vbGVhbiwgX2RhdGEsIF9yZXBseSwgYW5kcm9pZC5vcy5JQmluZGVyLkZMQUdfQ0xFQVJfQlVGKTsKICAgICAgICAgICBpZiAoIV9zdGF0dXMpIHsKICAgICAgICAgICAgIGlmIChnZXREZWZhdWx0SW1wbCgpICE9IG51bGwpIHsKQEAgLTEwNDYsNyArMTUzMCw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQogICAgICAgICAgIF9yZXBseS5yZWFkRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgX3Jlc3VsdCA9ICgwIT1fcmVwbHkucmVhZEludCgpKTsKKyAgICAgICAgICBfcmVzdWx0ID0gX3JlcGx5LnJlYWRCb29sZWFuKCk7CiAgICAgICAgIH0KICAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgX3JlcGx5LnJlY3ljbGUoKTsKQEAgLTEwNTYsOCArMTU0MCw5IEBACiAgICAgICB9CiAgICAgICBAT3ZlcnJpZGUgcHVibGljIGJ5dGUgUmVwZWF0Qnl0ZShieXRlIHRva2VuKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KICAgICAgIHsKLSAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKLSAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpO2FuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbihhc0JpbmRlcigpKTsKKyAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKICAgICAgICAgYnl0ZSBfcmVzdWx0OwogICAgICAgICB0cnkgewogICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7CkBAIC0xMDc5LDggKzE1NjQsOSBAQAogICAgICAgfQogICAgICAgQE92ZXJyaWRlIHB1YmxpYyBjaGFyIFJlcGVhdENoYXIoY2hhciB0b2tlbikgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCiAgICAgICB7Ci0gICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7Ci0gICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTthbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oYXNCaW5kZXIoKSk7CisgICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CiAgICAgICAgIGNoYXIgX3Jlc3VsdDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOwpAQCAtMTEwMiw4ICsxNTg4LDkgQEAKICAgICAgIH0KICAgICAgIEBPdmVycmlkZSBwdWJsaWMgaW50IFJlcGVhdEludChpbnQgdG9rZW4pIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgogICAgICAgewotICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwotICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7YW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwogICAgICAgICBpbnQgX3Jlc3VsdDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOwpAQCAtMTEyNSw4ICsxNjEyLDkgQEAKICAgICAgIH0KICAgICAgIEBPdmVycmlkZSBwdWJsaWMgbG9uZyBSZXBlYXRMb25nKGxvbmcgdG9rZW4pIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgogICAgICAgewotICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwotICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7YW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwogICAgICAgICBsb25nIF9yZXN1bHQ7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKQEAgLTExNDgsOCArMTYzNiw5IEBACiAgICAgICB9CiAgICAgICBAT3ZlcnJpZGUgcHVibGljIGZsb2F0IFJlcGVhdEZsb2F0KGZsb2F0IHRva2VuKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KICAgICAgIHsKLSAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKLSAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpO2FuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbihhc0JpbmRlcigpKTsKKyAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKICAgICAgICAgZmxvYXQgX3Jlc3VsdDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOwpAQCAtMTE3MSw4ICsxNjYwLDkgQEAKICAgICAgIH0KICAgICAgIEBPdmVycmlkZSBwdWJsaWMgZG91YmxlIFJlcGVhdERvdWJsZShkb3VibGUgdG9rZW4pIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgogICAgICAgewotICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwotICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7YW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwogICAgICAgICBkb3VibGUgX3Jlc3VsdDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOwpAQCAtMTE5NCw4ICsxNjg0LDkgQEAKICAgICAgIH0KICAgICAgIEBPdmVycmlkZSBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBSZXBlYXRTdHJpbmcoamF2YS5sYW5nLlN0cmluZyB0b2tlbikgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCiAgICAgICB7Ci0gICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7Ci0gICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTthbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oYXNCaW5kZXIoKSk7CisgICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CiAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgX3Jlc3VsdDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOwpAQCAtMTIxNyw4ICsxNzA4LDkgQEAKICAgICAgIH0KICAgICAgIEBPdmVycmlkZSBwdWJsaWMgYnl0ZSBSZXBlYXRCeXRlRW51bShieXRlIHRva2VuKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KICAgICAgIHsKLSAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKLSAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpO2FuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbihhc0JpbmRlcigpKTsKKyAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKICAgICAgICAgYnl0ZSBfcmVzdWx0OwogICAgICAgICB0cnkgewogICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7CkBAIC0xMjQwLDggKzE3MzIsOSBAQAogICAgICAgfQogICAgICAgQE92ZXJyaWRlIHB1YmxpYyBpbnQgUmVwZWF0SW50RW51bShpbnQgdG9rZW4pIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgogICAgICAgewotICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwotICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7YW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwogICAgICAgICBpbnQgX3Jlc3VsdDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOwpAQCAtMTI2Myw4ICsxNzU2LDkgQEAKICAgICAgIH0KICAgICAgIEBPdmVycmlkZSBwdWJsaWMgbG9uZyBSZXBlYXRMb25nRW51bShsb25nIHRva2VuKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KICAgICAgIHsKLSAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKLSAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpO2FuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbihhc0JpbmRlcigpKTsKKyAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKICAgICAgICAgbG9uZyBfcmVzdWx0OwogICAgICAgICB0cnkgewogICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7CkBAIC0xMjg3LDggKzE3ODEsOSBAQAogICAgICAgLy8gVGVzdCB0aGF0IGFycmF5cyB3b3JrIGFzIHBhcmFtZXRlcnMgYW5kIHJldHVybiB0eXBlcy4KICAgICAgIEBPdmVycmlkZSBwdWJsaWMgYm9vbGVhbltdIFJldmVyc2VCb29sZWFuKGJvb2xlYW5bXSBpbnB1dCwgYm9vbGVhbltdIHJlcGVhdGVkKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KICAgICAgIHsKLSAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKLSAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpO2FuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbihhc0JpbmRlcigpKTsKKyAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKICAgICAgICAgYm9vbGVhbltdIF9yZXN1bHQ7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKQEAgLTEzMTcsOCArMTgxMiw5IEBACiAgICAgICB9CiAgICAgICBAT3ZlcnJpZGUgcHVibGljIGJ5dGVbXSBSZXZlcnNlQnl0ZShieXRlW10gaW5wdXQsIGJ5dGVbXSByZXBlYXRlZCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCiAgICAgICB7Ci0gICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7Ci0gICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTthbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oYXNCaW5kZXIoKSk7CisgICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CiAgICAgICAgIGJ5dGVbXSBfcmVzdWx0OwogICAgICAgICB0cnkgewogICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7CkBAIC0xMzQ3LDggKzE4NDMsOSBAQAogICAgICAgfQogICAgICAgQE92ZXJyaWRlIHB1YmxpYyBjaGFyW10gUmV2ZXJzZUNoYXIoY2hhcltdIGlucHV0LCBjaGFyW10gcmVwZWF0ZWQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgogICAgICAgewotICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwotICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7YW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwogICAgICAgICBjaGFyW10gX3Jlc3VsdDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOwpAQCAtMTM3Nyw4ICsxODc0LDkgQEAKICAgICAgIH0KICAgICAgIEBPdmVycmlkZSBwdWJsaWMgaW50W10gUmV2ZXJzZUludChpbnRbXSBpbnB1dCwgaW50W10gcmVwZWF0ZWQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgogICAgICAgewotICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwotICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7YW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwogICAgICAgICBpbnRbXSBfcmVzdWx0OwogICAgICAgICB0cnkgewogICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7CkBAIC0xNDA3LDggKzE5MDUsOSBAQAogICAgICAgfQogICAgICAgQE92ZXJyaWRlIHB1YmxpYyBsb25nW10gUmV2ZXJzZUxvbmcobG9uZ1tdIGlucHV0LCBsb25nW10gcmVwZWF0ZWQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgogICAgICAgewotICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwotICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7YW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwogICAgICAgICBsb25nW10gX3Jlc3VsdDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOwpAQCAtMTQzNyw4ICsxOTM2LDkgQEAKICAgICAgIH0KICAgICAgIEBPdmVycmlkZSBwdWJsaWMgZmxvYXRbXSBSZXZlcnNlRmxvYXQoZmxvYXRbXSBpbnB1dCwgZmxvYXRbXSByZXBlYXRlZCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCiAgICAgICB7Ci0gICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7Ci0gICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTthbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oYXNCaW5kZXIoKSk7CisgICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CiAgICAgICAgIGZsb2F0W10gX3Jlc3VsdDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOwpAQCAtMTQ2Nyw4ICsxOTY3LDkgQEAKICAgICAgIH0KICAgICAgIEBPdmVycmlkZSBwdWJsaWMgZG91YmxlW10gUmV2ZXJzZURvdWJsZShkb3VibGVbXSBpbnB1dCwgZG91YmxlW10gcmVwZWF0ZWQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgogICAgICAgewotICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwotICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7YW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwogICAgICAgICBkb3VibGVbXSBfcmVzdWx0OwogICAgICAgICB0cnkgewogICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7CkBAIC0xNDk3LDggKzE5OTgsOSBAQAogICAgICAgfQogICAgICAgQE92ZXJyaWRlIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gUmV2ZXJzZVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nW10gaW5wdXQsIGphdmEubGFuZy5TdHJpbmdbXSByZXBlYXRlZCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCiAgICAgICB7Ci0gICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7Ci0gICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTthbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oYXNCaW5kZXIoKSk7CisgICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CiAgICAgICAgIGphdmEubGFuZy5TdHJpbmdbXSBfcmVzdWx0OwogICAgICAgICB0cnkgewogICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7CkBAIC0xNTI3LDggKzIwMjksOSBAQAogICAgICAgfQogICAgICAgQE92ZXJyaWRlIHB1YmxpYyBieXRlW10gUmV2ZXJzZUJ5dGVFbnVtKGJ5dGVbXSBpbnB1dCwgYnl0ZVtdIHJlcGVhdGVkKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KICAgICAgIHsKLSAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKLSAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpO2FuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbihhc0JpbmRlcigpKTsKKyAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKICAgICAgICAgYnl0ZVtdIF9yZXN1bHQ7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKQEAgLTE1NTcsOCArMjA2MCw5IEBACiAgICAgICB9CiAgICAgICBAT3ZlcnJpZGUgcHVibGljIGludFtdIFJldmVyc2VJbnRFbnVtKGludFtdIGlucHV0LCBpbnRbXSByZXBlYXRlZCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCiAgICAgICB7Ci0gICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7Ci0gICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTthbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oYXNCaW5kZXIoKSk7CisgICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CiAgICAgICAgIGludFtdIF9yZXN1bHQ7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKQEAgLTE1ODcsOCArMjA5MSw5IEBACiAgICAgICB9CiAgICAgICBAT3ZlcnJpZGUgcHVibGljIGxvbmdbXSBSZXZlcnNlTG9uZ0VudW0obG9uZ1tdIGlucHV0LCBsb25nW10gcmVwZWF0ZWQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgogICAgICAgewotICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwotICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7YW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwogICAgICAgICBsb25nW10gX3Jlc3VsdDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOwpAQCAtMTYxOCwxMyArMjEyMywxNSBAQAogICAgICAgLy8gVGVzdCB0aGF0IGNsaWVudHMgY2FuIHNlbmQgYW5kIHJlY2VpdmUgQmluZGVycy4KICAgICAgIEBPdmVycmlkZSBwdWJsaWMgYW5kcm9pZC5haWRsLnRlc3RzLklOYW1lZENhbGxiYWNrIEdldE90aGVyVGVzdFNlcnZpY2UoamF2YS5sYW5nLlN0cmluZyBuYW1lKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KICAgICAgIHsKLSAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKLSAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpO2FuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbihhc0JpbmRlcigpKTsKKyAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKICAgICAgICAgYW5kcm9pZC5haWRsLnRlc3RzLklOYW1lZENhbGxiYWNrIF9yZXN1bHQ7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKICAgICAgICAgICBfZGF0YS53cml0ZVN0cmluZyhuYW1lKTsKICAgICAgICAgICBib29sZWFuIF9zdGF0dXMgPSBtUmVtb3RlLnRyYW5zYWN0KFN0dWIuVFJBTlNBQ1RJT05fR2V0T3RoZXJUZXN0U2VydmljZSwgX2RhdGEsIF9yZXBseSwgYW5kcm9pZC5vcy5JQmluZGVyLkZMQUdfQ0xFQVJfQlVGKTsKKyAgICAgICAgICBfcmVwbHkuc2V0UHJvcGFnYXRlQWxsb3dCbG9ja2luZygpOwogICAgICAgICAgIGlmICghX3N0YXR1cykgewogICAgICAgICAgICAgaWYgKGdldERlZmF1bHRJbXBsKCkgIT0gbnVsbCkgewogICAgICAgICAgICAgICByZXR1cm4gZ2V0RGVmYXVsdEltcGwoKS5HZXRPdGhlclRlc3RTZXJ2aWNlKG5hbWUpOwpAQCAtMTY0MSwxMiArMjE0OCwxMyBAQAogICAgICAgfQogICAgICAgQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIFZlcmlmeU5hbWUoYW5kcm9pZC5haWRsLnRlc3RzLklOYW1lZENhbGxiYWNrIHNlcnZpY2UsIGphdmEubGFuZy5TdHJpbmcgbmFtZSkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCiAgICAgICB7Ci0gICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7Ci0gICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTthbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oYXNCaW5kZXIoKSk7CisgICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CiAgICAgICAgIGJvb2xlYW4gX3Jlc3VsdDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOwotICAgICAgICAgIF9kYXRhLndyaXRlU3Ryb25nQmluZGVyKCgoKHNlcnZpY2UhPW51bGwpKT8oc2VydmljZS5hc0JpbmRlcigpKToobnVsbCkpKTsKKyAgICAgICAgICBfZGF0YS53cml0ZVN0cm9uZ0ludGVyZmFjZShzZXJ2aWNlKTsKICAgICAgICAgICBfZGF0YS53cml0ZVN0cmluZyhuYW1lKTsKICAgICAgICAgICBib29sZWFuIF9zdGF0dXMgPSBtUmVtb3RlLnRyYW5zYWN0KFN0dWIuVFJBTlNBQ1RJT05fVmVyaWZ5TmFtZSwgX2RhdGEsIF9yZXBseSwgYW5kcm9pZC5vcy5JQmluZGVyLkZMQUdfQ0xFQVJfQlVGKTsKICAgICAgICAgICBpZiAoIV9zdGF0dXMpIHsKQEAgLTE2NTUsNyArMjE2MywxNTQgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICB9CiAgICAgICAgICAgX3JlcGx5LnJlYWRFeGNlcHRpb24oKTsKLSAgICAgICAgICBfcmVzdWx0ID0gKDAhPV9yZXBseS5yZWFkSW50KCkpOworICAgICAgICAgIF9yZXN1bHQgPSBfcmVwbHkucmVhZEJvb2xlYW4oKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICBfcmVwbHkucmVjeWNsZSgpOworICAgICAgICAgIF9kYXRhLnJlY3ljbGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX3Jlc3VsdDsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgYW5kcm9pZC5haWRsLnRlc3RzLklOYW1lZENhbGxiYWNrW10gR2V0SW50ZXJmYWNlQXJyYXkoamF2YS5sYW5nLlN0cmluZ1tdIG5hbWVzKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICAgIHsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oYXNCaW5kZXIoKSk7CisgICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIGFuZHJvaWQuYWlkbC50ZXN0cy5JTmFtZWRDYWxsYmFja1tdIF9yZXN1bHQ7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKKyAgICAgICAgICBfZGF0YS53cml0ZVN0cmluZ0FycmF5KG5hbWVzKTsKKyAgICAgICAgICBib29sZWFuIF9zdGF0dXMgPSBtUmVtb3RlLnRyYW5zYWN0KFN0dWIuVFJBTlNBQ1RJT05fR2V0SW50ZXJmYWNlQXJyYXksIF9kYXRhLCBfcmVwbHksIGFuZHJvaWQub3MuSUJpbmRlci5GTEFHX0NMRUFSX0JVRik7CisgICAgICAgICAgaWYgKCFfc3RhdHVzKSB7CisgICAgICAgICAgICBpZiAoZ2V0RGVmYXVsdEltcGwoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgIHJldHVybiBnZXREZWZhdWx0SW1wbCgpLkdldEludGVyZmFjZUFycmF5KG5hbWVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgX3JlcGx5LnJlYWRFeGNlcHRpb24oKTsKKyAgICAgICAgICBfcmVzdWx0ID0gX3JlcGx5LmNyZWF0ZUludGVyZmFjZUFycmF5KGFuZHJvaWQuYWlkbC50ZXN0cy5JTmFtZWRDYWxsYmFja1tdOjpuZXcsIGFuZHJvaWQuYWlkbC50ZXN0cy5JTmFtZWRDYWxsYmFjay5TdHViOjphc0ludGVyZmFjZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgX3JlcGx5LnJlY3ljbGUoKTsKKyAgICAgICAgICBfZGF0YS5yZWN5Y2xlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9yZXN1bHQ7CisgICAgICB9CisgICAgICBAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlQXJyYXkoYW5kcm9pZC5haWRsLnRlc3RzLklOYW1lZENhbGxiYWNrW10gc2VydmljZXMsIGphdmEubGFuZy5TdHJpbmdbXSBuYW1lcykgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgICB7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICBib29sZWFuIF9yZXN1bHQ7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKKyAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZUFycmF5KHNlcnZpY2VzKTsKKyAgICAgICAgICBfZGF0YS53cml0ZVN0cmluZ0FycmF5KG5hbWVzKTsKKyAgICAgICAgICBib29sZWFuIF9zdGF0dXMgPSBtUmVtb3RlLnRyYW5zYWN0KFN0dWIuVFJBTlNBQ1RJT05fVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlQXJyYXksIF9kYXRhLCBfcmVwbHksIGFuZHJvaWQub3MuSUJpbmRlci5GTEFHX0NMRUFSX0JVRik7CisgICAgICAgICAgaWYgKCFfc3RhdHVzKSB7CisgICAgICAgICAgICBpZiAoZ2V0RGVmYXVsdEltcGwoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgIHJldHVybiBnZXREZWZhdWx0SW1wbCgpLlZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUFycmF5KHNlcnZpY2VzLCBuYW1lcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIF9yZXBseS5yZWFkRXhjZXB0aW9uKCk7CisgICAgICAgICAgX3Jlc3VsdCA9IF9yZXBseS5yZWFkQm9vbGVhbigpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICAgIF9yZXBseS5yZWN5Y2xlKCk7CisgICAgICAgICAgX2RhdGEucmVjeWNsZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfcmVzdWx0OworICAgICAgfQorICAgICAgQE92ZXJyaWRlIHB1YmxpYyBhbmRyb2lkLmFpZGwudGVzdHMuSU5hbWVkQ2FsbGJhY2tbXSBHZXROdWxsYWJsZUludGVyZmFjZUFycmF5KGphdmEubGFuZy5TdHJpbmdbXSBuYW1lcykgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgICB7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICBhbmRyb2lkLmFpZGwudGVzdHMuSU5hbWVkQ2FsbGJhY2tbXSBfcmVzdWx0OworICAgICAgICB0cnkgeworICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7CisgICAgICAgICAgX2RhdGEud3JpdGVTdHJpbmdBcnJheShuYW1lcyk7CisgICAgICAgICAgYm9vbGVhbiBfc3RhdHVzID0gbVJlbW90ZS50cmFuc2FjdChTdHViLlRSQU5TQUNUSU9OX0dldE51bGxhYmxlSW50ZXJmYWNlQXJyYXksIF9kYXRhLCBfcmVwbHksIGFuZHJvaWQub3MuSUJpbmRlci5GTEFHX0NMRUFSX0JVRik7CisgICAgICAgICAgaWYgKCFfc3RhdHVzKSB7CisgICAgICAgICAgICBpZiAoZ2V0RGVmYXVsdEltcGwoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgIHJldHVybiBnZXREZWZhdWx0SW1wbCgpLkdldE51bGxhYmxlSW50ZXJmYWNlQXJyYXkobmFtZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBfcmVwbHkucmVhZEV4Y2VwdGlvbigpOworICAgICAgICAgIF9yZXN1bHQgPSBfcmVwbHkuY3JlYXRlSW50ZXJmYWNlQXJyYXkoYW5kcm9pZC5haWRsLnRlc3RzLklOYW1lZENhbGxiYWNrW106Om5ldywgYW5kcm9pZC5haWRsLnRlc3RzLklOYW1lZENhbGxiYWNrLlN0dWI6OmFzSW50ZXJmYWNlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICBfcmVwbHkucmVjeWNsZSgpOworICAgICAgICAgIF9kYXRhLnJlY3ljbGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX3Jlc3VsdDsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgYm9vbGVhbiBWZXJpZnlOYW1lc1dpdGhOdWxsYWJsZUludGVyZmFjZUFycmF5KGFuZHJvaWQuYWlkbC50ZXN0cy5JTmFtZWRDYWxsYmFja1tdIHNlcnZpY2VzLCBqYXZhLmxhbmcuU3RyaW5nW10gbmFtZXMpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgICAgeworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbihhc0JpbmRlcigpKTsKKyAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgYm9vbGVhbiBfcmVzdWx0OworICAgICAgICB0cnkgeworICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7CisgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VBcnJheShzZXJ2aWNlcyk7CisgICAgICAgICAgX2RhdGEud3JpdGVTdHJpbmdBcnJheShuYW1lcyk7CisgICAgICAgICAgYm9vbGVhbiBfc3RhdHVzID0gbVJlbW90ZS50cmFuc2FjdChTdHViLlRSQU5TQUNUSU9OX1ZlcmlmeU5hbWVzV2l0aE51bGxhYmxlSW50ZXJmYWNlQXJyYXksIF9kYXRhLCBfcmVwbHksIGFuZHJvaWQub3MuSUJpbmRlci5GTEFHX0NMRUFSX0JVRik7CisgICAgICAgICAgaWYgKCFfc3RhdHVzKSB7CisgICAgICAgICAgICBpZiAoZ2V0RGVmYXVsdEltcGwoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgIHJldHVybiBnZXREZWZhdWx0SW1wbCgpLlZlcmlmeU5hbWVzV2l0aE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoc2VydmljZXMsIG5hbWVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgX3JlcGx5LnJlYWRFeGNlcHRpb24oKTsKKyAgICAgICAgICBfcmVzdWx0ID0gX3JlcGx5LnJlYWRCb29sZWFuKCk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgX3JlcGx5LnJlY3ljbGUoKTsKKyAgICAgICAgICBfZGF0YS5yZWN5Y2xlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9yZXN1bHQ7CisgICAgICB9CisgICAgICBAT3ZlcnJpZGUgcHVibGljIGphdmEudXRpbC5MaXN0PGFuZHJvaWQuYWlkbC50ZXN0cy5JTmFtZWRDYWxsYmFjaz4gR2V0SW50ZXJmYWNlTGlzdChqYXZhLmxhbmcuU3RyaW5nW10gbmFtZXMpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgICAgeworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbihhc0JpbmRlcigpKTsKKyAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5haWRsLnRlc3RzLklOYW1lZENhbGxiYWNrPiBfcmVzdWx0OworICAgICAgICB0cnkgeworICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7CisgICAgICAgICAgX2RhdGEud3JpdGVTdHJpbmdBcnJheShuYW1lcyk7CisgICAgICAgICAgYm9vbGVhbiBfc3RhdHVzID0gbVJlbW90ZS50cmFuc2FjdChTdHViLlRSQU5TQUNUSU9OX0dldEludGVyZmFjZUxpc3QsIF9kYXRhLCBfcmVwbHksIGFuZHJvaWQub3MuSUJpbmRlci5GTEFHX0NMRUFSX0JVRik7CisgICAgICAgICAgaWYgKCFfc3RhdHVzKSB7CisgICAgICAgICAgICBpZiAoZ2V0RGVmYXVsdEltcGwoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgIHJldHVybiBnZXREZWZhdWx0SW1wbCgpLkdldEludGVyZmFjZUxpc3QobmFtZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBfcmVwbHkucmVhZEV4Y2VwdGlvbigpOworICAgICAgICAgIF9yZXN1bHQgPSBfcmVwbHkuY3JlYXRlSW50ZXJmYWNlQXJyYXlMaXN0KGFuZHJvaWQuYWlkbC50ZXN0cy5JTmFtZWRDYWxsYmFjay5TdHViOjphc0ludGVyZmFjZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgX3JlcGx5LnJlY3ljbGUoKTsKKyAgICAgICAgICBfZGF0YS5yZWN5Y2xlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9yZXN1bHQ7CisgICAgICB9CisgICAgICBAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlTGlzdChqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLmFpZGwudGVzdHMuSU5hbWVkQ2FsbGJhY2s+IHNlcnZpY2VzLCBqYXZhLmxhbmcuU3RyaW5nW10gbmFtZXMpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgICAgeworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbihhc0JpbmRlcigpKTsKKyAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgYm9vbGVhbiBfcmVzdWx0OworICAgICAgICB0cnkgeworICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7CisgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VMaXN0KHNlcnZpY2VzKTsKKyAgICAgICAgICBfZGF0YS53cml0ZVN0cmluZ0FycmF5KG5hbWVzKTsKKyAgICAgICAgICBib29sZWFuIF9zdGF0dXMgPSBtUmVtb3RlLnRyYW5zYWN0KFN0dWIuVFJBTlNBQ1RJT05fVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlTGlzdCwgX2RhdGEsIF9yZXBseSwgYW5kcm9pZC5vcy5JQmluZGVyLkZMQUdfQ0xFQVJfQlVGKTsKKyAgICAgICAgICBpZiAoIV9zdGF0dXMpIHsKKyAgICAgICAgICAgIGlmIChnZXREZWZhdWx0SW1wbCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIGdldERlZmF1bHRJbXBsKCkuVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlTGlzdChzZXJ2aWNlcywgbmFtZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBfcmVwbHkucmVhZEV4Y2VwdGlvbigpOworICAgICAgICAgIF9yZXN1bHQgPSBfcmVwbHkucmVhZEJvb2xlYW4oKTsKICAgICAgICAgfQogICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICBfcmVwbHkucmVjeWNsZSgpOwpAQCAtMTY2Niw4ICsyMzIxLDkgQEAKICAgICAgIC8vIFRlc3QgdGhhdCBMaXN0PFQ+IHR5cGVzIHdvcmsgY29ycmVjdGx5LgogICAgICAgQE92ZXJyaWRlIHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuU3RyaW5nPiBSZXZlcnNlU3RyaW5nTGlzdChqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuU3RyaW5nPiBpbnB1dCwgamF2YS51dGlsLkxpc3Q8amF2YS5sYW5nLlN0cmluZz4gcmVwZWF0ZWQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgogICAgICAgewotICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwotICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7YW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwogICAgICAgICBqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuU3RyaW5nPiBfcmVzdWx0OwogICAgICAgICB0cnkgewogICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7CkBAIC0xNjkwLDE4ICsyMzQ2LDEzIEBACiAgICAgICB9CiAgICAgICBAT3ZlcnJpZGUgcHVibGljIGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3IgUmVwZWF0UGFyY2VsRmlsZURlc2NyaXB0b3IoYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvciByZWFkKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KICAgICAgIHsKLSAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKLSAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpO2FuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbihhc0JpbmRlcigpKTsKKyAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKICAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvciBfcmVzdWx0OwogICAgICAgICB0cnkgewogICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7Ci0gICAgICAgICAgaWYgKChyZWFkIT1udWxsKSkgewotICAgICAgICAgICAgX2RhdGEud3JpdGVJbnQoMSk7Ci0gICAgICAgICAgICByZWFkLndyaXRlVG9QYXJjZWwoX2RhdGEsIDApOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIF9kYXRhLndyaXRlSW50KDApOwotICAgICAgICAgIH0KKyAgICAgICAgICBfZGF0YS53cml0ZVR5cGVkT2JqZWN0KHJlYWQsIDApOwogICAgICAgICAgIGJvb2xlYW4gX3N0YXR1cyA9IG1SZW1vdGUudHJhbnNhY3QoU3R1Yi5UUkFOU0FDVElPTl9SZXBlYXRQYXJjZWxGaWxlRGVzY3JpcHRvciwgX2RhdGEsIF9yZXBseSwgYW5kcm9pZC5vcy5JQmluZGVyLkZMQUdfQ0xFQVJfQlVGKTsKICAgICAgICAgICBpZiAoIV9zdGF0dXMpIHsKICAgICAgICAgICAgIGlmIChnZXREZWZhdWx0SW1wbCgpICE9IG51bGwpIHsKQEAgLTE3MDksMTIgKzIzNjAsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgIH0KICAgICAgICAgICBfcmVwbHkucmVhZEV4Y2VwdGlvbigpOwotICAgICAgICAgIGlmICgoMCE9X3JlcGx5LnJlYWRJbnQoKSkpIHsKLSAgICAgICAgICAgIF9yZXN1bHQgPSBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yLkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChfcmVwbHkpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIF9yZXN1bHQgPSBudWxsOwotICAgICAgICAgIH0KKyAgICAgICAgICBfcmVzdWx0ID0gX3JlcGx5LnJlYWRUeXBlZE9iamVjdChhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yLkNSRUFUT1IpOwogICAgICAgICB9CiAgICAgICAgIGZpbmFsbHkgewogICAgICAgICAgIF9yZXBseS5yZWN5Y2xlKCk7CkBAIC0xNzI0LDggKzIzNzAsOSBAQAogICAgICAgfQogICAgICAgQE92ZXJyaWRlIHB1YmxpYyBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yW10gUmV2ZXJzZVBhcmNlbEZpbGVEZXNjcmlwdG9yQXJyYXkoYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcltdIGlucHV0LCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yW10gcmVwZWF0ZWQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgogICAgICAgewotICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwotICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7YW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwogICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yW10gX3Jlc3VsdDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOwpAQCAtMTc1NSw4ICsyNDAyLDkgQEAKICAgICAgIC8vIFRlc3QgdGhhdCBzZXJ2aWNlIHNwZWNpZmljIGV4Y2VwdGlvbnMgd29yayBjb3JyZWN0bHkuCiAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgVGhyb3dTZXJ2aWNlRXhjZXB0aW9uKGludCBjb2RlKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KICAgICAgIHsKLSAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKLSAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpO2FuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbihhc0JpbmRlcigpKTsKKyAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOwogICAgICAgICAgIF9kYXRhLndyaXRlSW50KGNvZGUpOwpAQCAtMTc3Nyw4ICsyNDI1LDkgQEAKICAgICAgIC8vIFRlc3QgbnVsbGFiaWxpdHkKICAgICAgIEBPdmVycmlkZSBwdWJsaWMgaW50W10gUmVwZWF0TnVsbGFibGVJbnRBcnJheShpbnRbXSBpbnB1dCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCiAgICAgICB7Ci0gICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7Ci0gICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTthbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oYXNCaW5kZXIoKSk7CisgICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CiAgICAgICAgIGludFtdIF9yZXN1bHQ7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKQEAgLTE4MDAsOCArMjQ0OSw5IEBACiAgICAgICB9CiAgICAgICBAT3ZlcnJpZGUgcHVibGljIGJ5dGVbXSBSZXBlYXROdWxsYWJsZUJ5dGVFbnVtQXJyYXkoYnl0ZVtdIGlucHV0KSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KICAgICAgIHsKLSAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKLSAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpO2FuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbihhc0JpbmRlcigpKTsKKyAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKICAgICAgICAgYnl0ZVtdIF9yZXN1bHQ7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKQEAgLTE4MjMsOCArMjQ3Myw5IEBACiAgICAgICB9CiAgICAgICBAT3ZlcnJpZGUgcHVibGljIGludFtdIFJlcGVhdE51bGxhYmxlSW50RW51bUFycmF5KGludFtdIGlucHV0KSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KICAgICAgIHsKLSAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKLSAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpO2FuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbihhc0JpbmRlcigpKTsKKyAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKICAgICAgICAgaW50W10gX3Jlc3VsdDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOwpAQCAtMTg0Niw4ICsyNDk3LDkgQEAKICAgICAgIH0KICAgICAgIEBPdmVycmlkZSBwdWJsaWMgbG9uZ1tdIFJlcGVhdE51bGxhYmxlTG9uZ0VudW1BcnJheShsb25nW10gaW5wdXQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgogICAgICAgewotICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwotICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7YW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwogICAgICAgICBsb25nW10gX3Jlc3VsdDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOwpAQCAtMTg2OSw4ICsyNTIxLDkgQEAKICAgICAgIH0KICAgICAgIEBPdmVycmlkZSBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBSZXBlYXROdWxsYWJsZVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIGlucHV0KSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KICAgICAgIHsKLSAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKLSAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpO2FuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbihhc0JpbmRlcigpKTsKKyAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBfcmVzdWx0OwogICAgICAgICB0cnkgewogICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7CkBAIC0xODkyLDggKzI1NDUsOSBAQAogICAgICAgfQogICAgICAgQE92ZXJyaWRlIHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuU3RyaW5nPiBSZXBlYXROdWxsYWJsZVN0cmluZ0xpc3QoamF2YS51dGlsLkxpc3Q8amF2YS5sYW5nLlN0cmluZz4gaW5wdXQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgogICAgICAgewotICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwotICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7YW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwogICAgICAgICBqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuU3RyaW5nPiBfcmVzdWx0OwogICAgICAgICB0cnkgewogICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7CkBAIC0xOTEzLDIwICsyNTY3LDE1IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIF9yZXN1bHQ7CiAgICAgICB9Ci0gICAgICBAT3ZlcnJpZGUgcHVibGljIGFuZHJvaWQuYWlkbC50ZXN0cy5TdHJ1Y3R1cmVkUGFyY2VsYWJsZSBSZXBlYXROdWxsYWJsZVBhcmNlbGFibGUoYW5kcm9pZC5haWRsLnRlc3RzLlN0cnVjdHVyZWRQYXJjZWxhYmxlIGlucHV0KSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgYW5kcm9pZC5haWRsLnRlc3RzLklUZXN0U2VydmljZS5FbXB0eSBSZXBlYXROdWxsYWJsZVBhcmNlbGFibGUoYW5kcm9pZC5haWRsLnRlc3RzLklUZXN0U2VydmljZS5FbXB0eSBpbnB1dCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCiAgICAgICB7Ci0gICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7Ci0gICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTthbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKLSAgICAgICAgYW5kcm9pZC5haWRsLnRlc3RzLlN0cnVjdHVyZWRQYXJjZWxhYmxlIF9yZXN1bHQ7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICBhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlLkVtcHR5IF9yZXN1bHQ7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKLSAgICAgICAgICBpZiAoKGlucHV0IT1udWxsKSkgewotICAgICAgICAgICAgX2RhdGEud3JpdGVJbnQoMSk7Ci0gICAgICAgICAgICBpbnB1dC53cml0ZVRvUGFyY2VsKF9kYXRhLCAwKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBfZGF0YS53cml0ZUludCgwKTsKLSAgICAgICAgICB9CisgICAgICAgICAgX2RhdGEud3JpdGVUeXBlZE9iamVjdChpbnB1dCwgMCk7CiAgICAgICAgICAgYm9vbGVhbiBfc3RhdHVzID0gbVJlbW90ZS50cmFuc2FjdChTdHViLlRSQU5TQUNUSU9OX1JlcGVhdE51bGxhYmxlUGFyY2VsYWJsZSwgX2RhdGEsIF9yZXBseSwgYW5kcm9pZC5vcy5JQmluZGVyLkZMQUdfQ0xFQVJfQlVGKTsKICAgICAgICAgICBpZiAoIV9zdGF0dXMpIHsKICAgICAgICAgICAgIGlmIChnZXREZWZhdWx0SW1wbCgpICE9IG51bGwpIHsKQEAgLTE5MzQsMTIgKzI1ODMsNTUgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICB9CiAgICAgICAgICAgX3JlcGx5LnJlYWRFeGNlcHRpb24oKTsKLSAgICAgICAgICBpZiAoKDAhPV9yZXBseS5yZWFkSW50KCkpKSB7Ci0gICAgICAgICAgICBfcmVzdWx0ID0gYW5kcm9pZC5haWRsLnRlc3RzLlN0cnVjdHVyZWRQYXJjZWxhYmxlLkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChfcmVwbHkpOworICAgICAgICAgIF9yZXN1bHQgPSBfcmVwbHkucmVhZFR5cGVkT2JqZWN0KGFuZHJvaWQuYWlkbC50ZXN0cy5JVGVzdFNlcnZpY2UuRW1wdHkuQ1JFQVRPUik7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgX3JlcGx5LnJlY3ljbGUoKTsKKyAgICAgICAgICBfZGF0YS5yZWN5Y2xlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9yZXN1bHQ7CisgICAgICB9CisgICAgICBAT3ZlcnJpZGUgcHVibGljIGFuZHJvaWQuYWlkbC50ZXN0cy5JVGVzdFNlcnZpY2UuRW1wdHlbXSBSZXBlYXROdWxsYWJsZVBhcmNlbGFibGVBcnJheShhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlLkVtcHR5W10gaW5wdXQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgICAgeworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbihhc0JpbmRlcigpKTsKKyAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgYW5kcm9pZC5haWRsLnRlc3RzLklUZXN0U2VydmljZS5FbXB0eVtdIF9yZXN1bHQ7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKKyAgICAgICAgICBfZGF0YS53cml0ZVR5cGVkQXJyYXkoaW5wdXQsIDApOworICAgICAgICAgIGJvb2xlYW4gX3N0YXR1cyA9IG1SZW1vdGUudHJhbnNhY3QoU3R1Yi5UUkFOU0FDVElPTl9SZXBlYXROdWxsYWJsZVBhcmNlbGFibGVBcnJheSwgX2RhdGEsIF9yZXBseSwgYW5kcm9pZC5vcy5JQmluZGVyLkZMQUdfQ0xFQVJfQlVGKTsKKyAgICAgICAgICBpZiAoIV9zdGF0dXMpIHsKKyAgICAgICAgICAgIGlmIChnZXREZWZhdWx0SW1wbCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIGdldERlZmF1bHRJbXBsKCkuUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlQXJyYXkoaW5wdXQpOworICAgICAgICAgICAgfQogICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIF9yZXN1bHQgPSBudWxsOworICAgICAgICAgIF9yZXBseS5yZWFkRXhjZXB0aW9uKCk7CisgICAgICAgICAgX3Jlc3VsdCA9IF9yZXBseS5jcmVhdGVUeXBlZEFycmF5KGFuZHJvaWQuYWlkbC50ZXN0cy5JVGVzdFNlcnZpY2UuRW1wdHkuQ1JFQVRPUik7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgX3JlcGx5LnJlY3ljbGUoKTsKKyAgICAgICAgICBfZGF0YS5yZWN5Y2xlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9yZXN1bHQ7CisgICAgICB9CisgICAgICBAT3ZlcnJpZGUgcHVibGljIGphdmEudXRpbC5MaXN0PGFuZHJvaWQuYWlkbC50ZXN0cy5JVGVzdFNlcnZpY2UuRW1wdHk+IFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUxpc3QoamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5haWRsLnRlc3RzLklUZXN0U2VydmljZS5FbXB0eT4gaW5wdXQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgICAgeworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbihhc0JpbmRlcigpKTsKKyAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5haWRsLnRlc3RzLklUZXN0U2VydmljZS5FbXB0eT4gX3Jlc3VsdDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOworICAgICAgICAgIF9kYXRhLndyaXRlVHlwZWRMaXN0KGlucHV0KTsKKyAgICAgICAgICBib29sZWFuIF9zdGF0dXMgPSBtUmVtb3RlLnRyYW5zYWN0KFN0dWIuVFJBTlNBQ1RJT05fUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlTGlzdCwgX2RhdGEsIF9yZXBseSwgYW5kcm9pZC5vcy5JQmluZGVyLkZMQUdfQ0xFQVJfQlVGKTsKKyAgICAgICAgICBpZiAoIV9zdGF0dXMpIHsKKyAgICAgICAgICAgIGlmIChnZXREZWZhdWx0SW1wbCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIGdldERlZmF1bHRJbXBsKCkuUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlTGlzdChpbnB1dCk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgfQorICAgICAgICAgIF9yZXBseS5yZWFkRXhjZXB0aW9uKCk7CisgICAgICAgICAgX3Jlc3VsdCA9IF9yZXBseS5jcmVhdGVUeXBlZEFycmF5TGlzdChhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlLkVtcHR5LkNSRUFUT1IpOwogICAgICAgICB9CiAgICAgICAgIGZpbmFsbHkgewogICAgICAgICAgIF9yZXBseS5yZWN5Y2xlKCk7CkBAIC0xOTQ5LDggKzI2NDEsOSBAQAogICAgICAgfQogICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIFRha2VzQW5JQmluZGVyKGFuZHJvaWQub3MuSUJpbmRlciBpbnB1dCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCiAgICAgICB7Ci0gICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7Ci0gICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTthbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oYXNCaW5kZXIoKSk7CisgICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKICAgICAgICAgICBfZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihpbnB1dCk7CkBAIC0xOTcwLDggKzI2NjMsOSBAQAogICAgICAgfQogICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIFRha2VzQU51bGxhYmxlSUJpbmRlcihhbmRyb2lkLm9zLklCaW5kZXIgaW5wdXQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgogICAgICAgewotICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwotICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7YW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwogICAgICAgICB0cnkgewogICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7CiAgICAgICAgICAgX2RhdGEud3JpdGVTdHJvbmdCaW5kZXIoaW5wdXQpOwpAQCAtMTk4OSwxMSArMjY4Myw1NiBAQAogICAgICAgICAgIF9kYXRhLnJlY3ljbGUoKTsKICAgICAgICAgfQogICAgICAgfQorICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIFRha2VzQW5JQmluZGVyTGlzdChqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLm9zLklCaW5kZXI+IGlucHV0KSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICAgIHsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oYXNCaW5kZXIoKSk7CisgICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKKyAgICAgICAgICBfZGF0YS53cml0ZUJpbmRlckxpc3QoaW5wdXQpOworICAgICAgICAgIGJvb2xlYW4gX3N0YXR1cyA9IG1SZW1vdGUudHJhbnNhY3QoU3R1Yi5UUkFOU0FDVElPTl9UYWtlc0FuSUJpbmRlckxpc3QsIF9kYXRhLCBfcmVwbHksIGFuZHJvaWQub3MuSUJpbmRlci5GTEFHX0NMRUFSX0JVRik7CisgICAgICAgICAgaWYgKCFfc3RhdHVzKSB7CisgICAgICAgICAgICBpZiAoZ2V0RGVmYXVsdEltcGwoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgIGdldERlZmF1bHRJbXBsKCkuVGFrZXNBbklCaW5kZXJMaXN0KGlucHV0KTsKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBfcmVwbHkucmVhZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICAgIF9yZXBseS5yZWN5Y2xlKCk7CisgICAgICAgICAgX2RhdGEucmVjeWNsZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgVGFrZXNBTnVsbGFibGVJQmluZGVyTGlzdChqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLm9zLklCaW5kZXI+IGlucHV0KSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICAgIHsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oYXNCaW5kZXIoKSk7CisgICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKKyAgICAgICAgICBfZGF0YS53cml0ZUJpbmRlckxpc3QoaW5wdXQpOworICAgICAgICAgIGJvb2xlYW4gX3N0YXR1cyA9IG1SZW1vdGUudHJhbnNhY3QoU3R1Yi5UUkFOU0FDVElPTl9UYWtlc0FOdWxsYWJsZUlCaW5kZXJMaXN0LCBfZGF0YSwgX3JlcGx5LCBhbmRyb2lkLm9zLklCaW5kZXIuRkxBR19DTEVBUl9CVUYpOworICAgICAgICAgIGlmICghX3N0YXR1cykgeworICAgICAgICAgICAgaWYgKGdldERlZmF1bHRJbXBsKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICBnZXREZWZhdWx0SW1wbCgpLlRha2VzQU51bGxhYmxlSUJpbmRlckxpc3QoaW5wdXQpOworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIF9yZXBseS5yZWFkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgX3JlcGx5LnJlY3ljbGUoKTsKKyAgICAgICAgICBfZGF0YS5yZWN5Y2xlKCk7CisgICAgICAgIH0KKyAgICAgIH0KICAgICAgIC8vIFRlc3QgdXRmOCBkZWNvZGluZyBmcm9tIHV0ZjE2IHdpcmUgZm9ybWF0CiAgICAgICBAT3ZlcnJpZGUgcHVibGljIGphdmEubGFuZy5TdHJpbmcgUmVwZWF0VXRmOENwcFN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHRva2VuKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KICAgICAgIHsKLSAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKLSAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpO2FuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbihhc0JpbmRlcigpKTsKKyAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBfcmVzdWx0OwogICAgICAgICB0cnkgewogICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7CkBAIC0yMDE1LDggKzI3NTQsOSBAQAogICAgICAgfQogICAgICAgQE92ZXJyaWRlIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIFJlcGVhdE51bGxhYmxlVXRmOENwcFN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHRva2VuKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KICAgICAgIHsKLSAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKLSAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpO2FuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbihhc0JpbmRlcigpKTsKKyAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBfcmVzdWx0OwogICAgICAgICB0cnkgewogICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7CkBAIC0yMDM4LDggKzI3NzgsOSBAQAogICAgICAgfQogICAgICAgQE92ZXJyaWRlIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gUmV2ZXJzZVV0ZjhDcHBTdHJpbmcoamF2YS5sYW5nLlN0cmluZ1tdIGlucHV0LCBqYXZhLmxhbmcuU3RyaW5nW10gcmVwZWF0ZWQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgogICAgICAgewotICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwotICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7YW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwogICAgICAgICBqYXZhLmxhbmcuU3RyaW5nW10gX3Jlc3VsdDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOwpAQCAtMjA2OCw4ICsyODA5LDkgQEAKICAgICAgIH0KICAgICAgIEBPdmVycmlkZSBwdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIFJldmVyc2VOdWxsYWJsZVV0ZjhDcHBTdHJpbmcoamF2YS5sYW5nLlN0cmluZ1tdIGlucHV0LCBqYXZhLmxhbmcuU3RyaW5nW10gcmVwZWF0ZWQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgogICAgICAgewotICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwotICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7YW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwogICAgICAgICBqYXZhLmxhbmcuU3RyaW5nW10gX3Jlc3VsdDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOwpAQCAtMjA5OCw4ICsyODQwLDkgQEAKICAgICAgIH0KICAgICAgIEBPdmVycmlkZSBwdWJsaWMgamF2YS51dGlsLkxpc3Q8amF2YS5sYW5nLlN0cmluZz4gUmV2ZXJzZVV0ZjhDcHBTdHJpbmdMaXN0KGphdmEudXRpbC5MaXN0PGphdmEubGFuZy5TdHJpbmc+IGlucHV0LCBqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuU3RyaW5nPiByZXBlYXRlZCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCiAgICAgICB7Ci0gICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7Ci0gICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTthbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oYXNCaW5kZXIoKSk7CisgICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CiAgICAgICAgIGphdmEudXRpbC5MaXN0PGphdmEubGFuZy5TdHJpbmc+IF9yZXN1bHQ7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKQEAgLTIxMjAsMTQgKzI4NjMsMTYgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gX3Jlc3VsdDsKICAgICAgIH0KKyAgICAgIC8qKiBjb21tZW50IGJlZm9yZSBhbm5vdGF0aW9uICovCiAgICAgICBAT3ZlcnJpZGUgcHVibGljIGFuZHJvaWQuYWlkbC50ZXN0cy5JTmFtZWRDYWxsYmFjayBHZXRDYWxsYmFjayhib29sZWFuIHJldHVybl9udWxsKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KICAgICAgIHsKLSAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKLSAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpO2FuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbihhc0JpbmRlcigpKTsKKyAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKICAgICAgICAgYW5kcm9pZC5haWRsLnRlc3RzLklOYW1lZENhbGxiYWNrIF9yZXN1bHQ7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKLSAgICAgICAgICBfZGF0YS53cml0ZUludCgoKHJldHVybl9udWxsKT8oMSk6KDApKSk7CisgICAgICAgICAgX2RhdGEud3JpdGVCb29sZWFuKHJldHVybl9udWxsKTsKICAgICAgICAgICBib29sZWFuIF9zdGF0dXMgPSBtUmVtb3RlLnRyYW5zYWN0KFN0dWIuVFJBTlNBQ1RJT05fR2V0Q2FsbGJhY2ssIF9kYXRhLCBfcmVwbHksIGFuZHJvaWQub3MuSUJpbmRlci5GTEFHX0NMRUFSX0JVRik7CiAgICAgICAgICAgaWYgKCFfc3RhdHVzKSB7CiAgICAgICAgICAgICBpZiAoZ2V0RGVmYXVsdEltcGwoKSAhPSBudWxsKSB7CkBAIC0yMTQ3LDE3ICsyODkyLDEyIEBACiAgICAgICAvLyBpbmVmZmljaWVudCB0byB1c2UgYW4gSVBDIHRvIGZpbGwgaXQgb3V0IGluIHByYWN0aWNlLgogICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIEZpbGxPdXRTdHJ1Y3R1cmVkUGFyY2VsYWJsZShhbmRyb2lkLmFpZGwudGVzdHMuU3RydWN0dXJlZFBhcmNlbGFibGUgcGFyY2VsKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KICAgICAgIHsKLSAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKLSAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpO2FuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbihhc0JpbmRlcigpKTsKKyAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOwotICAgICAgICAgIGlmICgocGFyY2VsIT1udWxsKSkgewotICAgICAgICAgICAgX2RhdGEud3JpdGVJbnQoMSk7Ci0gICAgICAgICAgICBwYXJjZWwud3JpdGVUb1BhcmNlbChfZGF0YSwgMCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgX2RhdGEud3JpdGVJbnQoMCk7Ci0gICAgICAgICAgfQorICAgICAgICAgIF9kYXRhLndyaXRlVHlwZWRPYmplY3QocGFyY2VsLCAwKTsKICAgICAgICAgICBib29sZWFuIF9zdGF0dXMgPSBtUmVtb3RlLnRyYW5zYWN0KFN0dWIuVFJBTlNBQ1RJT05fRmlsbE91dFN0cnVjdHVyZWRQYXJjZWxhYmxlLCBfZGF0YSwgX3JlcGx5LCBhbmRyb2lkLm9zLklCaW5kZXIuRkxBR19DTEVBUl9CVUYpOwogICAgICAgICAgIGlmICghX3N0YXR1cykgewogICAgICAgICAgICAgaWYgKGdldERlZmF1bHRJbXBsKCkgIT0gbnVsbCkgewpAQCAtMjE3NSwxMCArMjkxNSwxMjIgQEAKICAgICAgICAgICBfZGF0YS5yZWN5Y2xlKCk7CiAgICAgICAgIH0KICAgICAgIH0KKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBSZXBlYXRFeHRlbmRhYmxlUGFyY2VsYWJsZShhbmRyb2lkLmFpZGwudGVzdHMuZXh0ZW5zaW9uLkV4dGVuZGFibGVQYXJjZWxhYmxlIGVwLCBhbmRyb2lkLmFpZGwudGVzdHMuZXh0ZW5zaW9uLkV4dGVuZGFibGVQYXJjZWxhYmxlIGVwMikgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgICB7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICB0cnkgeworICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7CisgICAgICAgICAgX2RhdGEud3JpdGVUeXBlZE9iamVjdChlcCwgMCk7CisgICAgICAgICAgYm9vbGVhbiBfc3RhdHVzID0gbVJlbW90ZS50cmFuc2FjdChTdHViLlRSQU5TQUNUSU9OX1JlcGVhdEV4dGVuZGFibGVQYXJjZWxhYmxlLCBfZGF0YSwgX3JlcGx5LCBhbmRyb2lkLm9zLklCaW5kZXIuRkxBR19DTEVBUl9CVUYpOworICAgICAgICAgIGlmICghX3N0YXR1cykgeworICAgICAgICAgICAgaWYgKGdldERlZmF1bHRJbXBsKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICBnZXREZWZhdWx0SW1wbCgpLlJlcGVhdEV4dGVuZGFibGVQYXJjZWxhYmxlKGVwLCBlcDIpOworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIF9yZXBseS5yZWFkRXhjZXB0aW9uKCk7CisgICAgICAgICAgaWYgKCgwIT1fcmVwbHkucmVhZEludCgpKSkgeworICAgICAgICAgICAgZXAyLnJlYWRGcm9tUGFyY2VsKF9yZXBseSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICAgIF9yZXBseS5yZWN5Y2xlKCk7CisgICAgICAgICAgX2RhdGEucmVjeWNsZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBAT3ZlcnJpZGUgcHVibGljIGFuZHJvaWQuYWlkbC50ZXN0cy5SZWN1cnNpdmVMaXN0IFJldmVyc2VMaXN0KGFuZHJvaWQuYWlkbC50ZXN0cy5SZWN1cnNpdmVMaXN0IGxpc3QpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgICAgeworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbihhc0JpbmRlcigpKTsKKyAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgYW5kcm9pZC5haWRsLnRlc3RzLlJlY3Vyc2l2ZUxpc3QgX3Jlc3VsdDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOworICAgICAgICAgIF9kYXRhLndyaXRlVHlwZWRPYmplY3QobGlzdCwgMCk7CisgICAgICAgICAgYm9vbGVhbiBfc3RhdHVzID0gbVJlbW90ZS50cmFuc2FjdChTdHViLlRSQU5TQUNUSU9OX1JldmVyc2VMaXN0LCBfZGF0YSwgX3JlcGx5LCBhbmRyb2lkLm9zLklCaW5kZXIuRkxBR19DTEVBUl9CVUYpOworICAgICAgICAgIGlmICghX3N0YXR1cykgeworICAgICAgICAgICAgaWYgKGdldERlZmF1bHRJbXBsKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICByZXR1cm4gZ2V0RGVmYXVsdEltcGwoKS5SZXZlcnNlTGlzdChsaXN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgX3JlcGx5LnJlYWRFeGNlcHRpb24oKTsKKyAgICAgICAgICBfcmVzdWx0ID0gX3JlcGx5LnJlYWRUeXBlZE9iamVjdChhbmRyb2lkLmFpZGwudGVzdHMuUmVjdXJzaXZlTGlzdC5DUkVBVE9SKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICBfcmVwbHkucmVjeWNsZSgpOworICAgICAgICAgIF9kYXRhLnJlY3ljbGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX3Jlc3VsdDsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyW10gUmV2ZXJzZUlCaW5kZXJBcnJheShhbmRyb2lkLm9zLklCaW5kZXJbXSBpbnB1dCwgYW5kcm9pZC5vcy5JQmluZGVyW10gcmVwZWF0ZWQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgICAgeworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbihhc0JpbmRlcigpKTsKKyAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgYW5kcm9pZC5vcy5JQmluZGVyW10gX3Jlc3VsdDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOworICAgICAgICAgIF9kYXRhLndyaXRlQmluZGVyQXJyYXkoaW5wdXQpOworICAgICAgICAgIGlmICgocmVwZWF0ZWQ9PW51bGwpKSB7CisgICAgICAgICAgICBfZGF0YS53cml0ZUludCgtMSk7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgX2RhdGEud3JpdGVJbnQocmVwZWF0ZWQubGVuZ3RoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYm9vbGVhbiBfc3RhdHVzID0gbVJlbW90ZS50cmFuc2FjdChTdHViLlRSQU5TQUNUSU9OX1JldmVyc2VJQmluZGVyQXJyYXksIF9kYXRhLCBfcmVwbHksIGFuZHJvaWQub3MuSUJpbmRlci5GTEFHX0NMRUFSX0JVRik7CisgICAgICAgICAgaWYgKCFfc3RhdHVzKSB7CisgICAgICAgICAgICBpZiAoZ2V0RGVmYXVsdEltcGwoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgIHJldHVybiBnZXREZWZhdWx0SW1wbCgpLlJldmVyc2VJQmluZGVyQXJyYXkoaW5wdXQsIHJlcGVhdGVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgX3JlcGx5LnJlYWRFeGNlcHRpb24oKTsKKyAgICAgICAgICBfcmVzdWx0ID0gX3JlcGx5LmNyZWF0ZUJpbmRlckFycmF5KCk7CisgICAgICAgICAgX3JlcGx5LnJlYWRCaW5kZXJBcnJheShyZXBlYXRlZCk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgX3JlcGx5LnJlY3ljbGUoKTsKKyAgICAgICAgICBfZGF0YS5yZWN5Y2xlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9yZXN1bHQ7CisgICAgICB9CisgICAgICBAT3ZlcnJpZGUgcHVibGljIGFuZHJvaWQub3MuSUJpbmRlcltdIFJldmVyc2VOdWxsYWJsZUlCaW5kZXJBcnJheShhbmRyb2lkLm9zLklCaW5kZXJbXSBpbnB1dCwgYW5kcm9pZC5vcy5JQmluZGVyW10gcmVwZWF0ZWQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgICAgeworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbihhc0JpbmRlcigpKTsKKyAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgYW5kcm9pZC5vcy5JQmluZGVyW10gX3Jlc3VsdDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOworICAgICAgICAgIF9kYXRhLndyaXRlQmluZGVyQXJyYXkoaW5wdXQpOworICAgICAgICAgIGlmICgocmVwZWF0ZWQ9PW51bGwpKSB7CisgICAgICAgICAgICBfZGF0YS53cml0ZUludCgtMSk7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgX2RhdGEud3JpdGVJbnQocmVwZWF0ZWQubGVuZ3RoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYm9vbGVhbiBfc3RhdHVzID0gbVJlbW90ZS50cmFuc2FjdChTdHViLlRSQU5TQUNUSU9OX1JldmVyc2VOdWxsYWJsZUlCaW5kZXJBcnJheSwgX2RhdGEsIF9yZXBseSwgYW5kcm9pZC5vcy5JQmluZGVyLkZMQUdfQ0xFQVJfQlVGKTsKKyAgICAgICAgICBpZiAoIV9zdGF0dXMpIHsKKyAgICAgICAgICAgIGlmIChnZXREZWZhdWx0SW1wbCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIGdldERlZmF1bHRJbXBsKCkuUmV2ZXJzZU51bGxhYmxlSUJpbmRlckFycmF5KGlucHV0LCByZXBlYXRlZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIF9yZXBseS5yZWFkRXhjZXB0aW9uKCk7CisgICAgICAgICAgX3Jlc3VsdCA9IF9yZXBseS5jcmVhdGVCaW5kZXJBcnJheSgpOworICAgICAgICAgIF9yZXBseS5yZWFkQmluZGVyQXJyYXkocmVwZWF0ZWQpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICAgIF9yZXBseS5yZWN5Y2xlKCk7CisgICAgICAgICAgX2RhdGEucmVjeWNsZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfcmVzdWx0OworICAgICAgfQogICAgICAgQE92ZXJyaWRlIHB1YmxpYyBhbmRyb2lkLmFpZGwudGVzdHMuSU9sZE5hbWUgR2V0T2xkTmFtZUludGVyZmFjZSgpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgogICAgICAgewotICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwotICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7YW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwogICAgICAgICBhbmRyb2lkLmFpZGwudGVzdHMuSU9sZE5hbWUgX3Jlc3VsdDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOwpAQCAtMjE5OSw4ICszMDUxLDkgQEAKICAgICAgIH0KICAgICAgIEBPdmVycmlkZSBwdWJsaWMgYW5kcm9pZC5haWRsLnRlc3RzLklOZXdOYW1lIEdldE5ld05hbWVJbnRlcmZhY2UoKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KICAgICAgIHsKLSAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKLSAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpO2FuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbihhc0JpbmRlcigpKTsKKyAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKICAgICAgICAgYW5kcm9pZC5haWRsLnRlc3RzLklOZXdOYW1lIF9yZXN1bHQ7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKQEAgLTIyMTksMTEgKzMwNzIsMzYgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gX3Jlc3VsdDsKICAgICAgIH0KKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgaW50W10gR2V0VW5pb25UYWdzKGFuZHJvaWQuYWlkbC50ZXN0cy5VbmlvbltdIGlucHV0KSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICAgIHsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oYXNCaW5kZXIoKSk7CisgICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIGludFtdIF9yZXN1bHQ7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKKyAgICAgICAgICBfZGF0YS53cml0ZVR5cGVkQXJyYXkoaW5wdXQsIDApOworICAgICAgICAgIGJvb2xlYW4gX3N0YXR1cyA9IG1SZW1vdGUudHJhbnNhY3QoU3R1Yi5UUkFOU0FDVElPTl9HZXRVbmlvblRhZ3MsIF9kYXRhLCBfcmVwbHksIGFuZHJvaWQub3MuSUJpbmRlci5GTEFHX0NMRUFSX0JVRik7CisgICAgICAgICAgaWYgKCFfc3RhdHVzKSB7CisgICAgICAgICAgICBpZiAoZ2V0RGVmYXVsdEltcGwoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgIHJldHVybiBnZXREZWZhdWx0SW1wbCgpLkdldFVuaW9uVGFncyhpbnB1dCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIF9yZXBseS5yZWFkRXhjZXB0aW9uKCk7CisgICAgICAgICAgX3Jlc3VsdCA9IF9yZXBseS5jcmVhdGVJbnRBcnJheSgpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICAgIF9yZXBseS5yZWN5Y2xlKCk7CisgICAgICAgICAgX2RhdGEucmVjeWNsZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfcmVzdWx0OworICAgICAgfQogICAgICAgLy8gUmV0cmlldmUgdGhlIElDcHBKYXZhVGVzdHMgaWYgdGhlIHNlcnZlciBzdXBwb3J0cyBpdAogICAgICAgQE92ZXJyaWRlIHB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgR2V0Q3BwSmF2YVRlc3RzKCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCiAgICAgICB7Ci0gICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7Ci0gICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTthbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oYXNCaW5kZXIoKSk7CisgICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CiAgICAgICAgIGFuZHJvaWQub3MuSUJpbmRlciBfcmVzdWx0OwogICAgICAgICB0cnkgewogICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7CkBAIC0yMjQ0LDggKzMxMjIsOSBAQAogICAgICAgfQogICAgICAgQE92ZXJyaWRlIHB1YmxpYyBieXRlIGdldEJhY2tlbmRUeXBlKCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCiAgICAgICB7Ci0gICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7Ci0gICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTthbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oYXNCaW5kZXIoKSk7CisgICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CiAgICAgICAgIGJ5dGUgX3Jlc3VsdDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOwpAQCAtMjI5MywzMCArMzE3Miw0NSBAQAogICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fUmV2ZXJzZUxvbmdFbnVtID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMjQpOwogICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fR2V0T3RoZXJUZXN0U2VydmljZSA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDI1KTsKICAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX1ZlcmlmeU5hbWUgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyNik7Ci0gICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9SZXZlcnNlU3RyaW5nTGlzdCA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDI3KTsKLSAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX1JlcGVhdFBhcmNlbEZpbGVEZXNjcmlwdG9yID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMjgpOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fUmV2ZXJzZVBhcmNlbEZpbGVEZXNjcmlwdG9yQXJyYXkgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyOSk7Ci0gICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9UaHJvd1NlcnZpY2VFeGNlcHRpb24gPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzMCk7Ci0gICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9SZXBlYXROdWxsYWJsZUludEFycmF5ID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzEpOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fUmVwZWF0TnVsbGFibGVCeXRlRW51bUFycmF5ID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzIpOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fUmVwZWF0TnVsbGFibGVJbnRFbnVtQXJyYXkgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzMyk7Ci0gICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9SZXBlYXROdWxsYWJsZUxvbmdFbnVtQXJyYXkgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzNCk7Ci0gICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9SZXBlYXROdWxsYWJsZVN0cmluZyA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDM1KTsKLSAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX1JlcGVhdE51bGxhYmxlU3RyaW5nTGlzdCA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDM2KTsKLSAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX1JlcGVhdE51bGxhYmxlUGFyY2VsYWJsZSA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDM3KTsKLSAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX1Rha2VzQW5JQmluZGVyID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzgpOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fVGFrZXNBTnVsbGFibGVJQmluZGVyID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzkpOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fUmVwZWF0VXRmOENwcFN0cmluZyA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQwKTsKLSAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX1JlcGVhdE51bGxhYmxlVXRmOENwcFN0cmluZyA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQxKTsKLSAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX1JldmVyc2VVdGY4Q3BwU3RyaW5nID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDIpOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fUmV2ZXJzZU51bGxhYmxlVXRmOENwcFN0cmluZyA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQzKTsKLSAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX1JldmVyc2VVdGY4Q3BwU3RyaW5nTGlzdCA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQ0KTsKLSAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX0dldENhbGxiYWNrID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDUpOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fRmlsbE91dFN0cnVjdHVyZWRQYXJjZWxhYmxlID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDYpOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fR2V0T2xkTmFtZUludGVyZmFjZSA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQ3KTsKLSAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX0dldE5ld05hbWVJbnRlcmZhY2UgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0OCk7Ci0gICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9HZXRDcHBKYXZhVGVzdHMgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0OSk7Ci0gICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9nZXRCYWNrZW5kVHlwZSA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDUwKTsKKyAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX0dldEludGVyZmFjZUFycmF5ID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMjcpOworICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlQXJyYXkgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyOCk7CisgICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9HZXROdWxsYWJsZUludGVyZmFjZUFycmF5ID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMjkpOworICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fVmVyaWZ5TmFtZXNXaXRoTnVsbGFibGVJbnRlcmZhY2VBcnJheSA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDMwKTsKKyAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX0dldEludGVyZmFjZUxpc3QgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzMSk7CisgICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9WZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VMaXN0ID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzIpOworICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fUmV2ZXJzZVN0cmluZ0xpc3QgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzMyk7CisgICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9SZXBlYXRQYXJjZWxGaWxlRGVzY3JpcHRvciA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDM0KTsKKyAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX1JldmVyc2VQYXJjZWxGaWxlRGVzY3JpcHRvckFycmF5ID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzUpOworICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fVGhyb3dTZXJ2aWNlRXhjZXB0aW9uID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzYpOworICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fUmVwZWF0TnVsbGFibGVJbnRBcnJheSA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDM3KTsKKyAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX1JlcGVhdE51bGxhYmxlQnl0ZUVudW1BcnJheSA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDM4KTsKKyAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX1JlcGVhdE51bGxhYmxlSW50RW51bUFycmF5ID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzkpOworICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fUmVwZWF0TnVsbGFibGVMb25nRW51bUFycmF5ID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDApOworICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fUmVwZWF0TnVsbGFibGVTdHJpbmcgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0MSk7CisgICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9SZXBlYXROdWxsYWJsZVN0cmluZ0xpc3QgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0Mik7CisgICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9SZXBlYXROdWxsYWJsZVBhcmNlbGFibGUgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0Myk7CisgICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9SZXBlYXROdWxsYWJsZVBhcmNlbGFibGVBcnJheSA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQ0KTsKKyAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX1JlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUxpc3QgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0NSk7CisgICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9UYWtlc0FuSUJpbmRlciA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQ2KTsKKyAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX1Rha2VzQU51bGxhYmxlSUJpbmRlciA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQ3KTsKKyAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX1Rha2VzQW5JQmluZGVyTGlzdCA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQ4KTsKKyAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX1Rha2VzQU51bGxhYmxlSUJpbmRlckxpc3QgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0OSk7CisgICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9SZXBlYXRVdGY4Q3BwU3RyaW5nID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNTApOworICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fUmVwZWF0TnVsbGFibGVVdGY4Q3BwU3RyaW5nID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNTEpOworICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fUmV2ZXJzZVV0ZjhDcHBTdHJpbmcgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1Mik7CisgICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9SZXZlcnNlTnVsbGFibGVVdGY4Q3BwU3RyaW5nID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNTMpOworICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fUmV2ZXJzZVV0ZjhDcHBTdHJpbmdMaXN0ID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNTQpOworICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fR2V0Q2FsbGJhY2sgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1NSk7CisgICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9GaWxsT3V0U3RydWN0dXJlZFBhcmNlbGFibGUgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1Nik7CisgICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9SZXBlYXRFeHRlbmRhYmxlUGFyY2VsYWJsZSA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDU3KTsKKyAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX1JldmVyc2VMaXN0ID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNTgpOworICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fUmV2ZXJzZUlCaW5kZXJBcnJheSA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDU5KTsKKyAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX1JldmVyc2VOdWxsYWJsZUlCaW5kZXJBcnJheSA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDYwKTsKKyAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX0dldE9sZE5hbWVJbnRlcmZhY2UgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA2MSk7CisgICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9HZXROZXdOYW1lSW50ZXJmYWNlID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNjIpOworICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fR2V0VW5pb25UYWdzID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNjMpOworICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fR2V0Q3BwSmF2YVRlc3RzID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNjQpOworICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZ2V0QmFja2VuZFR5cGUgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA2NSk7CiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIHNldERlZmF1bHRJbXBsKGFuZHJvaWQuYWlkbC50ZXN0cy5JVGVzdFNlcnZpY2UgaW1wbCkgewogICAgICAgLy8gT25seSBvbmUgdXNlciBvZiB0aGlzIGludGVyZmFjZSBjYW4gdXNlIHRoaXMgZnVuY3Rpb24KICAgICAgIC8vIGF0IGEgdGltZS4gVGhpcyBpcyBhIGhldXJpc3RpYyB0byBkZXRlY3QgaWYgdHdvIGRpZmZlcmVudApAQCAtMjMzNiw2ICszMjMwLDEwIEBACiAgIH0KICAgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFU0NSSVBUT1IgPSAiYW5kcm9pZCRhaWRsJHRlc3RzJElUZXN0U2VydmljZSIucmVwbGFjZSgnJCcsICcuJyk7CiAgIC8vIFRlc3QgdGhhdCBjb25zdGFudHMgYXJlIGFjY2Vzc2libGUKKyAgLyoqIGV4dHJhIGRvYyBjb21tZW50ICovCisgIC8vIGV4dHJhIGxpbmUgY29tbWVudAorICAvKiBleHRyYSByZWd1bGFyIGNvbW1lbnQgKi8KKyAgLyoqIGNvbnN0IGNvbW1lbnQgKi8KICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEVTVF9DT05TVEFOVCA9IDQyOwogICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBURVNUX0NPTlNUQU5UMiA9IC00MjsKICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEVTVF9DT05TVEFOVDMgPSA0MjsKQEAgLTI0MjYsOSArMzMyNCw5IEBACiAgIC8vIG1ldGhvZHMgdG8gYmUgYWRkZWQgYW5kIHJlbW92ZWQuCiAgIHB1YmxpYyBpbnQgVW5pbXBsZW1lbnRlZE1ldGhvZChpbnQgYXJnKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiAgIC8qKgotICAgICAgICogQGRlcHJlY2F0ZWQgdG8gbWFrZSBzdXJlIHdlIGhhdmUgc29tZXRoaW5nIGluIHN5c3RlbS90b29scy9haWRsIHdoaWNoIGRvZXMgYSBjb21waWxlIGNoZWNrCi0gICAgICAgKiAgICAgb2YgZGVwcmVjYXRlZCBhbmQgbWFrZSBzdXJlIHRoaXMgaXMgcmVmbGVjdGVkIGluIGdvbGRlbnMKLSAgICAgICAqLworICAgKiBAZGVwcmVjYXRlZCB0byBtYWtlIHN1cmUgd2UgaGF2ZSBzb21ldGhpbmcgaW4gc3lzdGVtL3Rvb2xzL2FpZGwgd2hpY2ggZG9lcyBhIGNvbXBpbGUgY2hlY2sKKyAgICogICAgIG9mIGRlcHJlY2F0ZWQgYW5kIG1ha2Ugc3VyZSB0aGlzIGlzIHJlZmxlY3RlZCBpbiBnb2xkZW5zCisgICAqLwogICBARGVwcmVjYXRlZAogICBwdWJsaWMgdm9pZCBEZXByZWNhdGVkKCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogICBwdWJsaWMgdm9pZCBUZXN0T25ld2F5KCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwpAQCAtMjQ1OSw2ICszMzU3LDEyIEBACiAgIC8vIFRlc3QgdGhhdCBjbGllbnRzIGNhbiBzZW5kIGFuZCByZWNlaXZlIEJpbmRlcnMuCiAgIHB1YmxpYyBhbmRyb2lkLmFpZGwudGVzdHMuSU5hbWVkQ2FsbGJhY2sgR2V0T3RoZXJUZXN0U2VydmljZShqYXZhLmxhbmcuU3RyaW5nIG5hbWUpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKICAgcHVibGljIGJvb2xlYW4gVmVyaWZ5TmFtZShhbmRyb2lkLmFpZGwudGVzdHMuSU5hbWVkQ2FsbGJhY2sgc2VydmljZSwgamF2YS5sYW5nLlN0cmluZyBuYW1lKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CisgIHB1YmxpYyBhbmRyb2lkLmFpZGwudGVzdHMuSU5hbWVkQ2FsbGJhY2tbXSBHZXRJbnRlcmZhY2VBcnJheShqYXZhLmxhbmcuU3RyaW5nW10gbmFtZXMpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKKyAgcHVibGljIGJvb2xlYW4gVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlQXJyYXkoYW5kcm9pZC5haWRsLnRlc3RzLklOYW1lZENhbGxiYWNrW10gc2VydmljZXMsIGphdmEubGFuZy5TdHJpbmdbXSBuYW1lcykgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworICBwdWJsaWMgYW5kcm9pZC5haWRsLnRlc3RzLklOYW1lZENhbGxiYWNrW10gR2V0TnVsbGFibGVJbnRlcmZhY2VBcnJheShqYXZhLmxhbmcuU3RyaW5nW10gbmFtZXMpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKKyAgcHVibGljIGJvb2xlYW4gVmVyaWZ5TmFtZXNXaXRoTnVsbGFibGVJbnRlcmZhY2VBcnJheShhbmRyb2lkLmFpZGwudGVzdHMuSU5hbWVkQ2FsbGJhY2tbXSBzZXJ2aWNlcywgamF2YS5sYW5nLlN0cmluZ1tdIG5hbWVzKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CisgIHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLmFpZGwudGVzdHMuSU5hbWVkQ2FsbGJhY2s+IEdldEludGVyZmFjZUxpc3QoamF2YS5sYW5nLlN0cmluZ1tdIG5hbWVzKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CisgIHB1YmxpYyBib29sZWFuIFZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUxpc3QoamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5haWRsLnRlc3RzLklOYW1lZENhbGxiYWNrPiBzZXJ2aWNlcywgamF2YS5sYW5nLlN0cmluZ1tdIG5hbWVzKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiAgIC8vIFRlc3QgdGhhdCBMaXN0PFQ+IHR5cGVzIHdvcmsgY29ycmVjdGx5LgogICBwdWJsaWMgamF2YS51dGlsLkxpc3Q8amF2YS5sYW5nLlN0cmluZz4gUmV2ZXJzZVN0cmluZ0xpc3QoamF2YS51dGlsLkxpc3Q8amF2YS5sYW5nLlN0cmluZz4gaW5wdXQsIGphdmEudXRpbC5MaXN0PGphdmEubGFuZy5TdHJpbmc+IHJlcGVhdGVkKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiAgIHB1YmxpYyBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yIFJlcGVhdFBhcmNlbEZpbGVEZXNjcmlwdG9yKGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3IgcmVhZCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwpAQCAtMjQ3MiwyMiArMzM3NiwyMzggQEAKICAgcHVibGljIGxvbmdbXSBSZXBlYXROdWxsYWJsZUxvbmdFbnVtQXJyYXkobG9uZ1tdIGlucHV0KSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIFJlcGVhdE51bGxhYmxlU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgaW5wdXQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKICAgcHVibGljIGphdmEudXRpbC5MaXN0PGphdmEubGFuZy5TdHJpbmc+IFJlcGVhdE51bGxhYmxlU3RyaW5nTGlzdChqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuU3RyaW5nPiBpbnB1dCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwotICBwdWJsaWMgYW5kcm9pZC5haWRsLnRlc3RzLlN0cnVjdHVyZWRQYXJjZWxhYmxlIFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZShhbmRyb2lkLmFpZGwudGVzdHMuU3RydWN0dXJlZFBhcmNlbGFibGUgaW5wdXQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKKyAgcHVibGljIGFuZHJvaWQuYWlkbC50ZXN0cy5JVGVzdFNlcnZpY2UuRW1wdHkgUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlKGFuZHJvaWQuYWlkbC50ZXN0cy5JVGVzdFNlcnZpY2UuRW1wdHkgaW5wdXQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKKyAgcHVibGljIGFuZHJvaWQuYWlkbC50ZXN0cy5JVGVzdFNlcnZpY2UuRW1wdHlbXSBSZXBlYXROdWxsYWJsZVBhcmNlbGFibGVBcnJheShhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlLkVtcHR5W10gaW5wdXQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKKyAgcHVibGljIGphdmEudXRpbC5MaXN0PGFuZHJvaWQuYWlkbC50ZXN0cy5JVGVzdFNlcnZpY2UuRW1wdHk+IFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUxpc3QoamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5haWRsLnRlc3RzLklUZXN0U2VydmljZS5FbXB0eT4gaW5wdXQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKICAgcHVibGljIHZvaWQgVGFrZXNBbklCaW5kZXIoYW5kcm9pZC5vcy5JQmluZGVyIGlucHV0KSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiAgIHB1YmxpYyB2b2lkIFRha2VzQU51bGxhYmxlSUJpbmRlcihhbmRyb2lkLm9zLklCaW5kZXIgaW5wdXQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKKyAgcHVibGljIHZvaWQgVGFrZXNBbklCaW5kZXJMaXN0KGphdmEudXRpbC5MaXN0PGFuZHJvaWQub3MuSUJpbmRlcj4gaW5wdXQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKKyAgcHVibGljIHZvaWQgVGFrZXNBTnVsbGFibGVJQmluZGVyTGlzdChqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLm9zLklCaW5kZXI+IGlucHV0KSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiAgIC8vIFRlc3QgdXRmOCBkZWNvZGluZyBmcm9tIHV0ZjE2IHdpcmUgZm9ybWF0CiAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIFJlcGVhdFV0ZjhDcHBTdHJpbmcoamF2YS5sYW5nLlN0cmluZyB0b2tlbikgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBSZXBlYXROdWxsYWJsZVV0ZjhDcHBTdHJpbmcoamF2YS5sYW5nLlN0cmluZyB0b2tlbikgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIFJldmVyc2VVdGY4Q3BwU3RyaW5nKGphdmEubGFuZy5TdHJpbmdbXSBpbnB1dCwgamF2YS5sYW5nLlN0cmluZ1tdIHJlcGVhdGVkKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gUmV2ZXJzZU51bGxhYmxlVXRmOENwcFN0cmluZyhqYXZhLmxhbmcuU3RyaW5nW10gaW5wdXQsIGphdmEubGFuZy5TdHJpbmdbXSByZXBlYXRlZCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogICBwdWJsaWMgamF2YS51dGlsLkxpc3Q8amF2YS5sYW5nLlN0cmluZz4gUmV2ZXJzZVV0ZjhDcHBTdHJpbmdMaXN0KGphdmEudXRpbC5MaXN0PGphdmEubGFuZy5TdHJpbmc+IGlucHV0LCBqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuU3RyaW5nPiByZXBlYXRlZCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworICAvKiogY29tbWVudCBiZWZvcmUgYW5ub3RhdGlvbiAqLwogICBwdWJsaWMgYW5kcm9pZC5haWRsLnRlc3RzLklOYW1lZENhbGxiYWNrIEdldENhbGxiYWNrKGJvb2xlYW4gcmV0dXJuX251bGwpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKICAgLy8gU2luY2UgdGhpcyBwYXJhY2VsYWJsZSBoYXMgY2xlYXJseSBkZWZpbmVkIGRlZmF1bHQgdmFsdWVzLCBpdCB3b3VsZCBiZQogICAvLyBpbmVmZmljaWVudCB0byB1c2UgYW4gSVBDIHRvIGZpbGwgaXQgb3V0IGluIHByYWN0aWNlLgogICBwdWJsaWMgdm9pZCBGaWxsT3V0U3RydWN0dXJlZFBhcmNlbGFibGUoYW5kcm9pZC5haWRsLnRlc3RzLlN0cnVjdHVyZWRQYXJjZWxhYmxlIHBhcmNlbCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworICBwdWJsaWMgdm9pZCBSZXBlYXRFeHRlbmRhYmxlUGFyY2VsYWJsZShhbmRyb2lkLmFpZGwudGVzdHMuZXh0ZW5zaW9uLkV4dGVuZGFibGVQYXJjZWxhYmxlIGVwLCBhbmRyb2lkLmFpZGwudGVzdHMuZXh0ZW5zaW9uLkV4dGVuZGFibGVQYXJjZWxhYmxlIGVwMikgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworICBwdWJsaWMgYW5kcm9pZC5haWRsLnRlc3RzLlJlY3Vyc2l2ZUxpc3QgUmV2ZXJzZUxpc3QoYW5kcm9pZC5haWRsLnRlc3RzLlJlY3Vyc2l2ZUxpc3QgbGlzdCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworICBwdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyW10gUmV2ZXJzZUlCaW5kZXJBcnJheShhbmRyb2lkLm9zLklCaW5kZXJbXSBpbnB1dCwgYW5kcm9pZC5vcy5JQmluZGVyW10gcmVwZWF0ZWQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKKyAgcHVibGljIGFuZHJvaWQub3MuSUJpbmRlcltdIFJldmVyc2VOdWxsYWJsZUlCaW5kZXJBcnJheShhbmRyb2lkLm9zLklCaW5kZXJbXSBpbnB1dCwgYW5kcm9pZC5vcy5JQmluZGVyW10gcmVwZWF0ZWQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKICAgcHVibGljIGFuZHJvaWQuYWlkbC50ZXN0cy5JT2xkTmFtZSBHZXRPbGROYW1lSW50ZXJmYWNlKCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogICBwdWJsaWMgYW5kcm9pZC5haWRsLnRlc3RzLklOZXdOYW1lIEdldE5ld05hbWVJbnRlcmZhY2UoKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CisgIHB1YmxpYyBpbnRbXSBHZXRVbmlvblRhZ3MoYW5kcm9pZC5haWRsLnRlc3RzLlVuaW9uW10gaW5wdXQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKICAgLy8gUmV0cmlldmUgdGhlIElDcHBKYXZhVGVzdHMgaWYgdGhlIHNlcnZlciBzdXBwb3J0cyBpdAogICBwdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIEdldENwcEphdmFUZXN0cygpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKICAgcHVibGljIGJ5dGUgZ2V0QmFja2VuZFR5cGUoKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CisgIC8vIFNtYWxsIGVtcHR5IHBhcmNlbGFibGUgZm9yIG51bGxhYmlsaXR5IGNoZWNrCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRW1wdHkgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUKKyAgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3I8RW1wdHk+IENSRUFUT1IgPSBuZXcgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3I8RW1wdHk+KCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgRW1wdHkgY3JlYXRlRnJvbVBhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9zb3VyY2UpIHsKKyAgICAgICAgRW1wdHkgX2FpZGxfb3V0ID0gbmV3IEVtcHR5KCk7CisgICAgICAgIF9haWRsX291dC5yZWFkRnJvbVBhcmNlbChfYWlkbF9zb3VyY2UpOworICAgICAgICByZXR1cm4gX2FpZGxfb3V0OworICAgICAgfQorICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgRW1wdHlbXSBuZXdBcnJheShpbnQgX2FpZGxfc2l6ZSkgeworICAgICAgICByZXR1cm4gbmV3IEVtcHR5W19haWRsX3NpemVdOworICAgICAgfQorICAgIH07CisgICAgQE92ZXJyaWRlIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlVG9QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgX2FpZGxfcGFyY2VsLCBpbnQgX2FpZGxfZmxhZykKKyAgICB7CisgICAgICBpbnQgX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpOworICAgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KDApOworICAgICAgaW50IF9haWRsX2VuZF9wb3MgPSBfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCk7CisgICAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3Bvcyk7CisgICAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgICAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX2VuZF9wb3MpOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgdm9pZCByZWFkRnJvbVBhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9wYXJjZWwpCisgICAgeworICAgICAgaW50IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKKyAgICAgIGludCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSBfYWlkbF9wYXJjZWwucmVhZEludCgpOworICAgICAgdHJ5IHsKKyAgICAgICAgaWYgKF9haWRsX3BhcmNlbGFibGVfc2l6ZSA8IDQpIHRocm93IG5ldyBhbmRyb2lkLm9zLkJhZFBhcmNlbGFibGVFeGNlcHRpb24oIlBhcmNlbGFibGUgdG9vIHNtYWxsIik7OworICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgaWYgKF9haWRsX3N0YXJ0X3BvcyA+IChJbnRlZ2VyLk1BWF9WQUxVRSAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgYW5kcm9pZC5vcy5CYWRQYXJjZWxhYmxlRXhjZXB0aW9uKCJPdmVyZmxvdyBpbiB0aGUgc2l6ZSBvZiBwYXJjZWxhYmxlIik7CisgICAgICAgIH0KKyAgICAgICAgX2FpZGxfcGFyY2VsLnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgICAgfQorICAgIH0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7CisgICAgICBpZiAodGhpcyA9PSBvdGhlcikgcmV0dXJuIHRydWU7CisgICAgICBpZiAob3RoZXIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBFbXB0eSkpIHJldHVybiBmYWxzZTsKKyAgICAgIEVtcHR5IHRoYXQgPSAoRW1wdHkpb3RoZXI7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgcmV0dXJuIGphdmEudXRpbC5BcnJheXMuZGVlcEhhc2hDb2RlKGphdmEudXRpbC5BcnJheXMuYXNMaXN0KCkudG9BcnJheSgpKTsKKyAgICB9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgICAgaW50IF9tYXNrID0gMDsKKyAgICAgIHJldHVybiBfbWFzazsKKyAgICB9CisgIH0KKyAgcHVibGljIHN0YXRpYyBjbGFzcyBDb21waWxlckNoZWNrcyBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZQorICB7CisgICAgLy8gSUJpbmRlcgorICAgIHB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYmluZGVyOworICAgIHB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgbnVsbGFibGVfYmluZGVyOworICAgIHB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXJbXSBiaW5kZXJfYXJyYXk7CisgICAgcHVibGljIGFuZHJvaWQub3MuSUJpbmRlcltdIG51bGxhYmxlX2JpbmRlcl9hcnJheTsKKyAgICBwdWJsaWMgamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5vcy5JQmluZGVyPiBiaW5kZXJfbGlzdDsKKyAgICBwdWJsaWMgamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5vcy5JQmluZGVyPiBudWxsYWJsZV9iaW5kZXJfbGlzdDsKKyAgICAvLyBQYXJjZWxGaWxlRGVzY3JpcHRvcgorICAgIHB1YmxpYyBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yIHBmZDsKKyAgICBwdWJsaWMgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvciBudWxsYWJsZV9wZmQ7CisgICAgcHVibGljIGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3JbXSBwZmRfYXJyYXk7CisgICAgcHVibGljIGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3JbXSBudWxsYWJsZV9wZmRfYXJyYXk7CisgICAgcHVibGljIGphdmEudXRpbC5MaXN0PGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3I+IHBmZF9saXN0OworICAgIHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yPiBudWxsYWJsZV9wZmRfbGlzdDsKKyAgICAvLyBwYXJjZWxhYmxlCisgICAgcHVibGljIGFuZHJvaWQuYWlkbC50ZXN0cy5JVGVzdFNlcnZpY2UuRW1wdHkgcGFyY2VsOworICAgIHB1YmxpYyBhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlLkVtcHR5IG51bGxhYmxlX3BhcmNlbDsKKyAgICBwdWJsaWMgYW5kcm9pZC5haWRsLnRlc3RzLklUZXN0U2VydmljZS5FbXB0eVtdIHBhcmNlbF9hcnJheTsKKyAgICBwdWJsaWMgYW5kcm9pZC5haWRsLnRlc3RzLklUZXN0U2VydmljZS5FbXB0eVtdIG51bGxhYmxlX3BhcmNlbF9hcnJheTsKKyAgICBwdWJsaWMgamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5haWRsLnRlc3RzLklUZXN0U2VydmljZS5FbXB0eT4gcGFyY2VsX2xpc3Q7CisgICAgcHVibGljIGphdmEudXRpbC5MaXN0PGFuZHJvaWQuYWlkbC50ZXN0cy5JVGVzdFNlcnZpY2UuRW1wdHk+IG51bGxhYmxlX3BhcmNlbF9saXN0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3I8Q29tcGlsZXJDaGVja3M+IENSRUFUT1IgPSBuZXcgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3I8Q29tcGlsZXJDaGVja3M+KCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgQ29tcGlsZXJDaGVja3MgY3JlYXRlRnJvbVBhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9zb3VyY2UpIHsKKyAgICAgICAgQ29tcGlsZXJDaGVja3MgX2FpZGxfb3V0ID0gbmV3IENvbXBpbGVyQ2hlY2tzKCk7CisgICAgICAgIF9haWRsX291dC5yZWFkRnJvbVBhcmNlbChfYWlkbF9zb3VyY2UpOworICAgICAgICByZXR1cm4gX2FpZGxfb3V0OworICAgICAgfQorICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgQ29tcGlsZXJDaGVja3NbXSBuZXdBcnJheShpbnQgX2FpZGxfc2l6ZSkgeworICAgICAgICByZXR1cm4gbmV3IENvbXBpbGVyQ2hlY2tzW19haWRsX3NpemVdOworICAgICAgfQorICAgIH07CisgICAgQE92ZXJyaWRlIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlVG9QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgX2FpZGxfcGFyY2VsLCBpbnQgX2FpZGxfZmxhZykKKyAgICB7CisgICAgICBpbnQgX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpOworICAgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KDApOworICAgICAgX2FpZGxfcGFyY2VsLndyaXRlU3Ryb25nQmluZGVyKGJpbmRlcik7CisgICAgICBfYWlkbF9wYXJjZWwud3JpdGVTdHJvbmdCaW5kZXIobnVsbGFibGVfYmluZGVyKTsKKyAgICAgIF9haWRsX3BhcmNlbC53cml0ZUJpbmRlckFycmF5KGJpbmRlcl9hcnJheSk7CisgICAgICBfYWlkbF9wYXJjZWwud3JpdGVCaW5kZXJBcnJheShudWxsYWJsZV9iaW5kZXJfYXJyYXkpOworICAgICAgX2FpZGxfcGFyY2VsLndyaXRlQmluZGVyTGlzdChiaW5kZXJfbGlzdCk7CisgICAgICBfYWlkbF9wYXJjZWwud3JpdGVCaW5kZXJMaXN0KG51bGxhYmxlX2JpbmRlcl9saXN0KTsKKyAgICAgIF9haWRsX3BhcmNlbC53cml0ZVR5cGVkT2JqZWN0KHBmZCwgX2FpZGxfZmxhZyk7CisgICAgICBfYWlkbF9wYXJjZWwud3JpdGVUeXBlZE9iamVjdChudWxsYWJsZV9wZmQsIF9haWRsX2ZsYWcpOworICAgICAgX2FpZGxfcGFyY2VsLndyaXRlVHlwZWRBcnJheShwZmRfYXJyYXksIF9haWRsX2ZsYWcpOworICAgICAgX2FpZGxfcGFyY2VsLndyaXRlVHlwZWRBcnJheShudWxsYWJsZV9wZmRfYXJyYXksIF9haWRsX2ZsYWcpOworICAgICAgX2FpZGxfcGFyY2VsLndyaXRlVHlwZWRMaXN0KHBmZF9saXN0KTsKKyAgICAgIF9haWRsX3BhcmNlbC53cml0ZVR5cGVkTGlzdChudWxsYWJsZV9wZmRfbGlzdCk7CisgICAgICBfYWlkbF9wYXJjZWwud3JpdGVUeXBlZE9iamVjdChwYXJjZWwsIF9haWRsX2ZsYWcpOworICAgICAgX2FpZGxfcGFyY2VsLndyaXRlVHlwZWRPYmplY3QobnVsbGFibGVfcGFyY2VsLCBfYWlkbF9mbGFnKTsKKyAgICAgIF9haWRsX3BhcmNlbC53cml0ZVR5cGVkQXJyYXkocGFyY2VsX2FycmF5LCBfYWlkbF9mbGFnKTsKKyAgICAgIF9haWRsX3BhcmNlbC53cml0ZVR5cGVkQXJyYXkobnVsbGFibGVfcGFyY2VsX2FycmF5LCBfYWlkbF9mbGFnKTsKKyAgICAgIF9haWRsX3BhcmNlbC53cml0ZVR5cGVkTGlzdChwYXJjZWxfbGlzdCk7CisgICAgICBfYWlkbF9wYXJjZWwud3JpdGVUeXBlZExpc3QobnVsbGFibGVfcGFyY2VsX2xpc3QpOworICAgICAgaW50IF9haWRsX2VuZF9wb3MgPSBfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCk7CisgICAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3Bvcyk7CisgICAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgICAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX2VuZF9wb3MpOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgdm9pZCByZWFkRnJvbVBhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9wYXJjZWwpCisgICAgeworICAgICAgaW50IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKKyAgICAgIGludCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSBfYWlkbF9wYXJjZWwucmVhZEludCgpOworICAgICAgdHJ5IHsKKyAgICAgICAgaWYgKF9haWRsX3BhcmNlbGFibGVfc2l6ZSA8IDQpIHRocm93IG5ldyBhbmRyb2lkLm9zLkJhZFBhcmNlbGFibGVFeGNlcHRpb24oIlBhcmNlbGFibGUgdG9vIHNtYWxsIik7OworICAgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgICBiaW5kZXIgPSBfYWlkbF9wYXJjZWwucmVhZFN0cm9uZ0JpbmRlcigpOworICAgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgICBudWxsYWJsZV9iaW5kZXIgPSBfYWlkbF9wYXJjZWwucmVhZFN0cm9uZ0JpbmRlcigpOworICAgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgICBiaW5kZXJfYXJyYXkgPSBfYWlkbF9wYXJjZWwuY3JlYXRlQmluZGVyQXJyYXkoKTsKKyAgICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgICAgbnVsbGFibGVfYmluZGVyX2FycmF5ID0gX2FpZGxfcGFyY2VsLmNyZWF0ZUJpbmRlckFycmF5KCk7CisgICAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICAgIGJpbmRlcl9saXN0ID0gX2FpZGxfcGFyY2VsLmNyZWF0ZUJpbmRlckFycmF5TGlzdCgpOworICAgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgICBudWxsYWJsZV9iaW5kZXJfbGlzdCA9IF9haWRsX3BhcmNlbC5jcmVhdGVCaW5kZXJBcnJheUxpc3QoKTsKKyAgICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgICAgcGZkID0gX2FpZGxfcGFyY2VsLnJlYWRUeXBlZE9iamVjdChhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yLkNSRUFUT1IpOworICAgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgICBudWxsYWJsZV9wZmQgPSBfYWlkbF9wYXJjZWwucmVhZFR5cGVkT2JqZWN0KGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3IuQ1JFQVRPUik7CisgICAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICAgIHBmZF9hcnJheSA9IF9haWRsX3BhcmNlbC5jcmVhdGVUeXBlZEFycmF5KGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3IuQ1JFQVRPUik7CisgICAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICAgIG51bGxhYmxlX3BmZF9hcnJheSA9IF9haWRsX3BhcmNlbC5jcmVhdGVUeXBlZEFycmF5KGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3IuQ1JFQVRPUik7CisgICAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICAgIHBmZF9saXN0ID0gX2FpZGxfcGFyY2VsLmNyZWF0ZVR5cGVkQXJyYXlMaXN0KGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3IuQ1JFQVRPUik7CisgICAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICAgIG51bGxhYmxlX3BmZF9saXN0ID0gX2FpZGxfcGFyY2VsLmNyZWF0ZVR5cGVkQXJyYXlMaXN0KGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3IuQ1JFQVRPUik7CisgICAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICAgIHBhcmNlbCA9IF9haWRsX3BhcmNlbC5yZWFkVHlwZWRPYmplY3QoYW5kcm9pZC5haWRsLnRlc3RzLklUZXN0U2VydmljZS5FbXB0eS5DUkVBVE9SKTsKKyAgICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgICAgbnVsbGFibGVfcGFyY2VsID0gX2FpZGxfcGFyY2VsLnJlYWRUeXBlZE9iamVjdChhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlLkVtcHR5LkNSRUFUT1IpOworICAgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgICBwYXJjZWxfYXJyYXkgPSBfYWlkbF9wYXJjZWwuY3JlYXRlVHlwZWRBcnJheShhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlLkVtcHR5LkNSRUFUT1IpOworICAgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgICBudWxsYWJsZV9wYXJjZWxfYXJyYXkgPSBfYWlkbF9wYXJjZWwuY3JlYXRlVHlwZWRBcnJheShhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlLkVtcHR5LkNSRUFUT1IpOworICAgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgICBwYXJjZWxfbGlzdCA9IF9haWRsX3BhcmNlbC5jcmVhdGVUeXBlZEFycmF5TGlzdChhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlLkVtcHR5LkNSRUFUT1IpOworICAgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgICBudWxsYWJsZV9wYXJjZWxfbGlzdCA9IF9haWRsX3BhcmNlbC5jcmVhdGVUeXBlZEFycmF5TGlzdChhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlLkVtcHR5LkNSRUFUT1IpOworICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgaWYgKF9haWRsX3N0YXJ0X3BvcyA+IChJbnRlZ2VyLk1BWF9WQUxVRSAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgYW5kcm9pZC5vcy5CYWRQYXJjZWxhYmxlRXhjZXB0aW9uKCJPdmVyZmxvdyBpbiB0aGUgc2l6ZSBvZiBwYXJjZWxhYmxlIik7CisgICAgICAgIH0KKyAgICAgICAgX2FpZGxfcGFyY2VsLnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgICAgfQorICAgIH0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgICBpbnQgX21hc2sgPSAwOworICAgICAgX21hc2sgfD0gZGVzY3JpYmVDb250ZW50cyhwZmQpOworICAgICAgX21hc2sgfD0gZGVzY3JpYmVDb250ZW50cyhudWxsYWJsZV9wZmQpOworICAgICAgX21hc2sgfD0gZGVzY3JpYmVDb250ZW50cyhwZmRfYXJyYXkpOworICAgICAgX21hc2sgfD0gZGVzY3JpYmVDb250ZW50cyhudWxsYWJsZV9wZmRfYXJyYXkpOworICAgICAgX21hc2sgfD0gZGVzY3JpYmVDb250ZW50cyhwZmRfbGlzdCk7CisgICAgICBfbWFzayB8PSBkZXNjcmliZUNvbnRlbnRzKG51bGxhYmxlX3BmZF9saXN0KTsKKyAgICAgIF9tYXNrIHw9IGRlc2NyaWJlQ29udGVudHMocGFyY2VsKTsKKyAgICAgIF9tYXNrIHw9IGRlc2NyaWJlQ29udGVudHMobnVsbGFibGVfcGFyY2VsKTsKKyAgICAgIF9tYXNrIHw9IGRlc2NyaWJlQ29udGVudHMocGFyY2VsX2FycmF5KTsKKyAgICAgIF9tYXNrIHw9IGRlc2NyaWJlQ29udGVudHMobnVsbGFibGVfcGFyY2VsX2FycmF5KTsKKyAgICAgIF9tYXNrIHw9IGRlc2NyaWJlQ29udGVudHMocGFyY2VsX2xpc3QpOworICAgICAgX21hc2sgfD0gZGVzY3JpYmVDb250ZW50cyhudWxsYWJsZV9wYXJjZWxfbGlzdCk7CisgICAgICByZXR1cm4gX21hc2s7CisgICAgfQorICAgIHByaXZhdGUgaW50IGRlc2NyaWJlQ29udGVudHMoT2JqZWN0IF92KSB7CisgICAgICBpZiAoX3YgPT0gbnVsbCkgcmV0dXJuIDA7CisgICAgICBpZiAoX3YgaW5zdGFuY2VvZiBPYmplY3RbXSkgeworICAgICAgICBpbnQgX21hc2sgPSAwOworICAgICAgICBmb3IgKE9iamVjdCBvIDogKE9iamVjdFtdKSBfdikgeworICAgICAgICAgIF9tYXNrIHw9IGRlc2NyaWJlQ29udGVudHMobyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9tYXNrOworICAgICAgfQorICAgICAgaWYgKF92IGluc3RhbmNlb2YgamF2YS51dGlsLkNvbGxlY3Rpb24pIHsKKyAgICAgICAgaW50IF9tYXNrID0gMDsKKyAgICAgICAgZm9yIChPYmplY3QgbyA6IChqYXZhLnV0aWwuQ29sbGVjdGlvbikgX3YpIHsKKyAgICAgICAgICBfbWFzayB8PSBkZXNjcmliZUNvbnRlbnRzKG8pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfbWFzazsKKyAgICAgIH0KKyAgICAgIGlmIChfdiBpbnN0YW5jZW9mIGFuZHJvaWQub3MuUGFyY2VsYWJsZSkgeworICAgICAgICByZXR1cm4gKChhbmRyb2lkLm9zLlBhcmNlbGFibGUpIF92KS5kZXNjcmliZUNvbnRlbnRzKCk7CisgICAgICB9CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lUZXN0U2VydmljZS5qYXZhLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JVGVzdFNlcnZpY2UuamF2YS5kCmluZGV4IDFkYzUyNWIuLjU2MWM1MDggMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lUZXN0U2VydmljZS5qYXZhLmQKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSVRlc3RTZXJ2aWNlLmphdmEuZApAQCAtNyw0ICs3LDggQEAKICAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0lPbGROYW1lLmFpZGwgXAogICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvSW50RW51bS5haWRsIFwKICAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0xvbmdFbnVtLmFpZGwgXAotICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvU3RydWN0dXJlZFBhcmNlbGFibGUuYWlkbAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvUmVjdXJzaXZlTGlzdC5haWRsIFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL1N0cnVjdHVyZWRQYXJjZWxhYmxlLmFpZGwgXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb24uYWlkbCBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vRXh0ZW5kYWJsZVBhcmNlbGFibGUuYWlkbCBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9Db25zdGFudEV4cHJlc3Npb25FbnVtLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0ludEVudW0uamF2YSBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0ludEVudW0uamF2YQppbmRleCA2NGFlMDBhLi40MTE0ZmU3IDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JbnRFbnVtLmphdmEKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSW50RW51bS5qYXZhCkBAIC02LDQgKzYsMzQgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9PID0gMTAwMDsKICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkFSID0gMjAwMDsKICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkFaID0gMjAwMTsKKyAgLyoqIEBkZXByZWNhdGVkIGRvIG5vdCB1c2UgdGhpcyAqLworICBARGVwcmVjYXRlZAorICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBRVVggPSAyMDAyOworICBpbnRlcmZhY2UgJCB7CisgICAgc3RhdGljIFN0cmluZyB0b1N0cmluZyhpbnQgX2FpZGxfdikgeworICAgICAgaWYgKF9haWRsX3YgPT0gRk9PKSByZXR1cm4gIkZPTyI7CisgICAgICBpZiAoX2FpZGxfdiA9PSBCQVIpIHJldHVybiAiQkFSIjsKKyAgICAgIGlmIChfYWlkbF92ID09IEJBWikgcmV0dXJuICJCQVoiOworICAgICAgaWYgKF9haWRsX3YgPT0gUVVYKSByZXR1cm4gIlFVWCI7CisgICAgICByZXR1cm4gSW50ZWdlci50b1N0cmluZyhfYWlkbF92KTsKKyAgICB9CisgICAgc3RhdGljIFN0cmluZyBhcnJheVRvU3RyaW5nKE9iamVjdCBfYWlkbF92KSB7CisgICAgICBpZiAoX2FpZGxfdiA9PSBudWxsKSByZXR1cm4gIm51bGwiOworICAgICAgQ2xhc3M8Pz4gX2FpZGxfY2xzID0gX2FpZGxfdi5nZXRDbGFzcygpOworICAgICAgaWYgKCFfYWlkbF9jbHMuaXNBcnJheSgpKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJub3QgYW4gYXJyYXk6ICIgKyBfYWlkbF92KTsKKyAgICAgIENsYXNzPD8+IGNvbXAgPSBfYWlkbF9jbHMuZ2V0Q29tcG9uZW50VHlwZSgpOworICAgICAgamF2YS51dGlsLlN0cmluZ0pvaW5lciBfYWlkbF9zaiA9IG5ldyBqYXZhLnV0aWwuU3RyaW5nSm9pbmVyKCIsICIsICJbIiwgIl0iKTsKKyAgICAgIGlmIChjb21wLmlzQXJyYXkoKSkgeworICAgICAgICBmb3IgKGludCBfYWlkbF9pID0gMDsgX2FpZGxfaSA8IGphdmEubGFuZy5yZWZsZWN0LkFycmF5LmdldExlbmd0aChfYWlkbF92KTsgX2FpZGxfaSsrKSB7CisgICAgICAgICAgX2FpZGxfc2ouYWRkKGFycmF5VG9TdHJpbmcoamF2YS5sYW5nLnJlZmxlY3QuQXJyYXkuZ2V0KF9haWRsX3YsIF9haWRsX2kpKSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChfYWlkbF9jbHMgIT0gaW50W10uY2xhc3MpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIndyb25nIHR5cGU6ICIgKyBfYWlkbF9jbHMpOworICAgICAgICBmb3IgKGludCBlIDogKGludFtdKSBfYWlkbF92KSB7CisgICAgICAgICAgX2FpZGxfc2ouYWRkKHRvU3RyaW5nKGUpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIF9haWRsX3NqLnRvU3RyaW5nKCk7CisgICAgfQorICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9MaXN0T2ZJbnRlcmZhY2VzLmphdmEgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9MaXN0T2ZJbnRlcmZhY2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEyNTY0ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0xpc3RPZkludGVyZmFjZXMuamF2YQpAQCAtMCwwICsxLDU1NSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBhdXRvLWdlbmVyYXRlZC4gIERPIE5PVCBNT0RJRlkuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5haWRsLnRlc3RzOworcHVibGljIGNsYXNzIExpc3RPZkludGVyZmFjZXMgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUKK3sKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm9zLlBhcmNlbGFibGUuQ3JlYXRvcjxMaXN0T2ZJbnRlcmZhY2VzPiBDUkVBVE9SID0gbmV3IGFuZHJvaWQub3MuUGFyY2VsYWJsZS5DcmVhdG9yPExpc3RPZkludGVyZmFjZXM+KCkgeworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0T2ZJbnRlcmZhY2VzIGNyZWF0ZUZyb21QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgX2FpZGxfc291cmNlKSB7CisgICAgICBMaXN0T2ZJbnRlcmZhY2VzIF9haWRsX291dCA9IG5ldyBMaXN0T2ZJbnRlcmZhY2VzKCk7CisgICAgICBfYWlkbF9vdXQucmVhZEZyb21QYXJjZWwoX2FpZGxfc291cmNlKTsKKyAgICAgIHJldHVybiBfYWlkbF9vdXQ7CisgICAgfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0T2ZJbnRlcmZhY2VzW10gbmV3QXJyYXkoaW50IF9haWRsX3NpemUpIHsKKyAgICAgIHJldHVybiBuZXcgTGlzdE9mSW50ZXJmYWNlc1tfYWlkbF9zaXplXTsKKyAgICB9CisgIH07CisgIEBPdmVycmlkZSBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZVRvUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3BhcmNlbCwgaW50IF9haWRsX2ZsYWcpCisgIHsKKyAgICBpbnQgX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpOworICAgIF9haWRsX3BhcmNlbC53cml0ZUludCgwKTsKKyAgICBpbnQgX2FpZGxfZW5kX3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKKyAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3Bvcyk7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KF9haWRsX2VuZF9wb3MgLSBfYWlkbF9zdGFydF9wb3MpOworICAgIF9haWRsX3BhcmNlbC5zZXREYXRhUG9zaXRpb24oX2FpZGxfZW5kX3Bvcyk7CisgIH0KKyAgcHVibGljIGZpbmFsIHZvaWQgcmVhZEZyb21QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgX2FpZGxfcGFyY2VsKQorICB7CisgICAgaW50IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKKyAgICBpbnQgX2FpZGxfcGFyY2VsYWJsZV9zaXplID0gX2FpZGxfcGFyY2VsLnJlYWRJbnQoKTsKKyAgICB0cnkgeworICAgICAgaWYgKF9haWRsX3BhcmNlbGFibGVfc2l6ZSA8IDQpIHRocm93IG5ldyBhbmRyb2lkLm9zLkJhZFBhcmNlbGFibGVFeGNlcHRpb24oIlBhcmNlbGFibGUgdG9vIHNtYWxsIik7OworICAgIH0gZmluYWxseSB7CisgICAgICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gKEludGVnZXIuTUFYX1ZBTFVFIC0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSkgeworICAgICAgICB0aHJvdyBuZXcgYW5kcm9pZC5vcy5CYWRQYXJjZWxhYmxlRXhjZXB0aW9uKCJPdmVyZmxvdyBpbiB0aGUgc2l6ZSBvZiBwYXJjZWxhYmxlIik7CisgICAgICB9CisgICAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgfQorICB9CisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgaW50IF9tYXNrID0gMDsKKyAgICByZXR1cm4gX21hc2s7CisgIH0KKyAgcHVibGljIGludGVyZmFjZSBJRW1wdHlJbnRlcmZhY2UgZXh0ZW5kcyBhbmRyb2lkLm9zLklJbnRlcmZhY2UKKyAgeworICAgIC8qKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciBJRW1wdHlJbnRlcmZhY2UuICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBEZWZhdWx0IGltcGxlbWVudHMgYW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlCisgICAgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICB9CisgICAgLyoqIExvY2FsLXNpZGUgSVBDIGltcGxlbWVudGF0aW9uIHN0dWIgY2xhc3MuICovCisgICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBTdHViIGV4dGVuZHMgYW5kcm9pZC5vcy5CaW5kZXIgaW1wbGVtZW50cyBhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UKKyAgICB7CisgICAgICAvKiogQ29uc3RydWN0IHRoZSBzdHViIGF0IGF0dGFjaCBpdCB0byB0aGUgaW50ZXJmYWNlLiAqLworICAgICAgcHVibGljIFN0dWIoKQorICAgICAgeworICAgICAgICB0aGlzLmF0dGFjaEludGVyZmFjZSh0aGlzLCBERVNDUklQVE9SKTsKKyAgICAgIH0KKyAgICAgIC8qKgorICAgICAgICogQ2FzdCBhbiBJQmluZGVyIG9iamVjdCBpbnRvIGFuIGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZSBpbnRlcmZhY2UsCisgICAgICAgKiBnZW5lcmF0aW5nIGEgcHJveHkgaWYgbmVlZGVkLgorICAgICAgICovCisgICAgICBwdWJsaWMgc3RhdGljIGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZSBhc0ludGVyZmFjZShhbmRyb2lkLm9zLklCaW5kZXIgb2JqKQorICAgICAgeworICAgICAgICBpZiAoKG9iaj09bnVsbCkpIHsKKyAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBhbmRyb2lkLm9zLklJbnRlcmZhY2UgaWluID0gb2JqLnF1ZXJ5TG9jYWxJbnRlcmZhY2UoREVTQ1JJUFRPUik7CisgICAgICAgIGlmICgoKGlpbiE9bnVsbCkmJihpaW4gaW5zdGFuY2VvZiBhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UpKSkgeworICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZSlpaW4pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgYW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlLlN0dWIuUHJveHkob2JqKTsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICB9CisgICAgICBAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gb25UcmFuc2FjdChpbnQgY29kZSwgYW5kcm9pZC5vcy5QYXJjZWwgZGF0YSwgYW5kcm9pZC5vcy5QYXJjZWwgcmVwbHksIGludCBmbGFncykgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgICB7CisgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZGVzY3JpcHRvciA9IERFU0NSSVBUT1I7CisgICAgICAgIHN3aXRjaCAoY29kZSkKKyAgICAgICAgeworICAgICAgICAgIGNhc2UgSU5URVJGQUNFX1RSQU5TQUNUSU9OOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIHJlcGx5LndyaXRlU3RyaW5nKGRlc2NyaXB0b3IpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoY29kZSkKKyAgICAgICAgeworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLm9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFByb3h5IGltcGxlbWVudHMgYW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlCisgICAgICB7CisgICAgICAgIHByaXZhdGUgYW5kcm9pZC5vcy5JQmluZGVyIG1SZW1vdGU7CisgICAgICAgIFByb3h5KGFuZHJvaWQub3MuSUJpbmRlciByZW1vdGUpCisgICAgICAgIHsKKyAgICAgICAgICBtUmVtb3RlID0gcmVtb3RlOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBtUmVtb3RlOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEludGVyZmFjZURlc2NyaXB0b3IoKQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIERFU0NSSVBUT1I7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFU0NSSVBUT1IgPSAiYW5kcm9pZCRhaWRsJHRlc3RzJExpc3RPZkludGVyZmFjZXMkSUVtcHR5SW50ZXJmYWNlIi5yZXBsYWNlKCckJywgJy4nKTsKKyAgfQorICBwdWJsaWMgaW50ZXJmYWNlIElNeUludGVyZmFjZSBleHRlbmRzIGFuZHJvaWQub3MuSUludGVyZmFjZQorICB7CisgICAgLyoqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIElNeUludGVyZmFjZS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIERlZmF1bHQgaW1wbGVtZW50cyBhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JTXlJbnRlcmZhY2UKKyAgICB7CisgICAgICBAT3ZlcnJpZGUgcHVibGljIGphdmEudXRpbC5MaXN0PGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZT4gbWV0aG9kV2l0aEludGVyZmFjZXMoYW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlIGlmYWNlLCBhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UgbnVsbGFibGVfaWZhY2UsIGphdmEudXRpbC5MaXN0PGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZT4gaWZhY2VfbGlzdF9pbiwgamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlPiBpZmFjZV9saXN0X291dCwgamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlPiBpZmFjZV9saXN0X2lub3V0LCBqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2U+IG51bGxhYmxlX2lmYWNlX2xpc3RfaW4sIGphdmEudXRpbC5MaXN0PGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZT4gbnVsbGFibGVfaWZhY2VfbGlzdF9vdXQsIGphdmEudXRpbC5MaXN0PGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZT4gbnVsbGFibGVfaWZhY2VfbGlzdF9pbm91dCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgICB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICB9CisgICAgLyoqIExvY2FsLXNpZGUgSVBDIGltcGxlbWVudGF0aW9uIHN0dWIgY2xhc3MuICovCisgICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBTdHViIGV4dGVuZHMgYW5kcm9pZC5vcy5CaW5kZXIgaW1wbGVtZW50cyBhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JTXlJbnRlcmZhY2UKKyAgICB7CisgICAgICAvKiogQ29uc3RydWN0IHRoZSBzdHViIGF0IGF0dGFjaCBpdCB0byB0aGUgaW50ZXJmYWNlLiAqLworICAgICAgcHVibGljIFN0dWIoKQorICAgICAgeworICAgICAgICB0aGlzLmF0dGFjaEludGVyZmFjZSh0aGlzLCBERVNDUklQVE9SKTsKKyAgICAgIH0KKyAgICAgIC8qKgorICAgICAgICogQ2FzdCBhbiBJQmluZGVyIG9iamVjdCBpbnRvIGFuIGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklNeUludGVyZmFjZSBpbnRlcmZhY2UsCisgICAgICAgKiBnZW5lcmF0aW5nIGEgcHJveHkgaWYgbmVlZGVkLgorICAgICAgICovCisgICAgICBwdWJsaWMgc3RhdGljIGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklNeUludGVyZmFjZSBhc0ludGVyZmFjZShhbmRyb2lkLm9zLklCaW5kZXIgb2JqKQorICAgICAgeworICAgICAgICBpZiAoKG9iaj09bnVsbCkpIHsKKyAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBhbmRyb2lkLm9zLklJbnRlcmZhY2UgaWluID0gb2JqLnF1ZXJ5TG9jYWxJbnRlcmZhY2UoREVTQ1JJUFRPUik7CisgICAgICAgIGlmICgoKGlpbiE9bnVsbCkmJihpaW4gaW5zdGFuY2VvZiBhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JTXlJbnRlcmZhY2UpKSkgeworICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklNeUludGVyZmFjZSlpaW4pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgYW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSU15SW50ZXJmYWNlLlN0dWIuUHJveHkob2JqKTsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICB9CisgICAgICBAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gb25UcmFuc2FjdChpbnQgY29kZSwgYW5kcm9pZC5vcy5QYXJjZWwgZGF0YSwgYW5kcm9pZC5vcy5QYXJjZWwgcmVwbHksIGludCBmbGFncykgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgICB7CisgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZGVzY3JpcHRvciA9IERFU0NSSVBUT1I7CisgICAgICAgIGlmIChjb2RlID49IGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICYmIGNvZGUgPD0gYW5kcm9pZC5vcy5JQmluZGVyLkxBU1RfQ0FMTF9UUkFOU0FDVElPTikgeworICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShkZXNjcmlwdG9yKTsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKGNvZGUpCisgICAgICAgIHsKKyAgICAgICAgICBjYXNlIElOVEVSRkFDRV9UUkFOU0FDVElPTjoKKyAgICAgICAgICB7CisgICAgICAgICAgICByZXBseS53cml0ZVN0cmluZyhkZXNjcmlwdG9yKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKGNvZGUpCisgICAgICAgIHsKKyAgICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX21ldGhvZFdpdGhJbnRlcmZhY2VzOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZSBfYXJnMDsKKyAgICAgICAgICAgIF9hcmcwID0gYW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlLlN0dWIuYXNJbnRlcmZhY2UoZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICAgICAgYW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlIF9hcmcxOworICAgICAgICAgICAgX2FyZzEgPSBhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UuU3R1Yi5hc0ludGVyZmFjZShkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICBqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2U+IF9hcmcyOworICAgICAgICAgICAgX2FyZzIgPSBkYXRhLmNyZWF0ZUludGVyZmFjZUFycmF5TGlzdChhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UuU3R1Yjo6YXNJbnRlcmZhY2UpOworICAgICAgICAgICAgamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlPiBfYXJnMzsKKyAgICAgICAgICAgIF9hcmczID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3Q8YW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlPigpOworICAgICAgICAgICAgamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlPiBfYXJnNDsKKyAgICAgICAgICAgIF9hcmc0ID0gZGF0YS5jcmVhdGVJbnRlcmZhY2VBcnJheUxpc3QoYW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlLlN0dWI6OmFzSW50ZXJmYWNlKTsKKyAgICAgICAgICAgIGphdmEudXRpbC5MaXN0PGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZT4gX2FyZzU7CisgICAgICAgICAgICBfYXJnNSA9IGRhdGEuY3JlYXRlSW50ZXJmYWNlQXJyYXlMaXN0KGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZS5TdHViOjphc0ludGVyZmFjZSk7CisgICAgICAgICAgICBqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2U+IF9hcmc2OworICAgICAgICAgICAgX2FyZzYgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdDxhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2U+KCk7CisgICAgICAgICAgICBqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2U+IF9hcmc3OworICAgICAgICAgICAgX2FyZzcgPSBkYXRhLmNyZWF0ZUludGVyZmFjZUFycmF5TGlzdChhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UuU3R1Yjo6YXNJbnRlcmZhY2UpOworICAgICAgICAgICAgZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsKKyAgICAgICAgICAgIGphdmEudXRpbC5MaXN0PGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZT4gX3Jlc3VsdCA9IHRoaXMubWV0aG9kV2l0aEludGVyZmFjZXMoX2FyZzAsIF9hcmcxLCBfYXJnMiwgX2FyZzMsIF9hcmc0LCBfYXJnNSwgX2FyZzYsIF9hcmc3KTsKKyAgICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKKyAgICAgICAgICAgIHJlcGx5LndyaXRlSW50ZXJmYWNlTGlzdChfcmVzdWx0KTsKKyAgICAgICAgICAgIHJlcGx5LndyaXRlSW50ZXJmYWNlTGlzdChfYXJnMyk7CisgICAgICAgICAgICByZXBseS53cml0ZUludGVyZmFjZUxpc3QoX2FyZzQpOworICAgICAgICAgICAgcmVwbHkud3JpdGVJbnRlcmZhY2VMaXN0KF9hcmc2KTsKKyAgICAgICAgICAgIHJlcGx5LndyaXRlSW50ZXJmYWNlTGlzdChfYXJnNyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIub25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFByb3h5IGltcGxlbWVudHMgYW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSU15SW50ZXJmYWNlCisgICAgICB7CisgICAgICAgIHByaXZhdGUgYW5kcm9pZC5vcy5JQmluZGVyIG1SZW1vdGU7CisgICAgICAgIFByb3h5KGFuZHJvaWQub3MuSUJpbmRlciByZW1vdGUpCisgICAgICAgIHsKKyAgICAgICAgICBtUmVtb3RlID0gcmVtb3RlOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBtUmVtb3RlOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEludGVyZmFjZURlc2NyaXB0b3IoKQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIERFU0NSSVBUT1I7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2U+IG1ldGhvZFdpdGhJbnRlcmZhY2VzKGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZSBpZmFjZSwgYW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlIG51bGxhYmxlX2lmYWNlLCBqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2U+IGlmYWNlX2xpc3RfaW4sIGphdmEudXRpbC5MaXN0PGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZT4gaWZhY2VfbGlzdF9vdXQsIGphdmEudXRpbC5MaXN0PGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZT4gaWZhY2VfbGlzdF9pbm91dCwgamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlPiBudWxsYWJsZV9pZmFjZV9saXN0X2luLCBqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2U+IG51bGxhYmxlX2lmYWNlX2xpc3Rfb3V0LCBqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2U+IG51bGxhYmxlX2lmYWNlX2xpc3RfaW5vdXQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oYXNCaW5kZXIoKSk7CisgICAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgICAgamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlPiBfcmVzdWx0OworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOworICAgICAgICAgICAgX2RhdGEud3JpdGVTdHJvbmdJbnRlcmZhY2UoaWZhY2UpOworICAgICAgICAgICAgX2RhdGEud3JpdGVTdHJvbmdJbnRlcmZhY2UobnVsbGFibGVfaWZhY2UpOworICAgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VMaXN0KGlmYWNlX2xpc3RfaW4pOworICAgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VMaXN0KGlmYWNlX2xpc3RfaW5vdXQpOworICAgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VMaXN0KG51bGxhYmxlX2lmYWNlX2xpc3RfaW4pOworICAgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VMaXN0KG51bGxhYmxlX2lmYWNlX2xpc3RfaW5vdXQpOworICAgICAgICAgICAgYm9vbGVhbiBfc3RhdHVzID0gbVJlbW90ZS50cmFuc2FjdChTdHViLlRSQU5TQUNUSU9OX21ldGhvZFdpdGhJbnRlcmZhY2VzLCBfZGF0YSwgX3JlcGx5LCAwKTsKKyAgICAgICAgICAgIF9yZXBseS5yZWFkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICBfcmVzdWx0ID0gX3JlcGx5LmNyZWF0ZUludGVyZmFjZUFycmF5TGlzdChhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UuU3R1Yjo6YXNJbnRlcmZhY2UpOworICAgICAgICAgICAgX3JlcGx5LnJlYWRJbnRlcmZhY2VMaXN0KGlmYWNlX2xpc3Rfb3V0LCBhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UuU3R1Yjo6YXNJbnRlcmZhY2UpOworICAgICAgICAgICAgX3JlcGx5LnJlYWRJbnRlcmZhY2VMaXN0KGlmYWNlX2xpc3RfaW5vdXQsIGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZS5TdHViOjphc0ludGVyZmFjZSk7CisgICAgICAgICAgICBfcmVwbHkucmVhZEludGVyZmFjZUxpc3QobnVsbGFibGVfaWZhY2VfbGlzdF9vdXQsIGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZS5TdHViOjphc0ludGVyZmFjZSk7CisgICAgICAgICAgICBfcmVwbHkucmVhZEludGVyZmFjZUxpc3QobnVsbGFibGVfaWZhY2VfbGlzdF9pbm91dCwgYW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlLlN0dWI6OmFzSW50ZXJmYWNlKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgICBfcmVwbHkucmVjeWNsZSgpOworICAgICAgICAgICAgX2RhdGEucmVjeWNsZSgpOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gX3Jlc3VsdDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9tZXRob2RXaXRoSW50ZXJmYWNlcyA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDApOworICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVTQ1JJUFRPUiA9ICJhbmRyb2lkJGFpZGwkdGVzdHMkTGlzdE9mSW50ZXJmYWNlcyRJTXlJbnRlcmZhY2UiLnJlcGxhY2UoJyQnLCAnLicpOworICAgIHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2U+IG1ldGhvZFdpdGhJbnRlcmZhY2VzKGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZSBpZmFjZSwgYW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlIG51bGxhYmxlX2lmYWNlLCBqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2U+IGlmYWNlX2xpc3RfaW4sIGphdmEudXRpbC5MaXN0PGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZT4gaWZhY2VfbGlzdF9vdXQsIGphdmEudXRpbC5MaXN0PGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZT4gaWZhY2VfbGlzdF9pbm91dCwgamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlPiBudWxsYWJsZV9pZmFjZV9saXN0X2luLCBqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2U+IG51bGxhYmxlX2lmYWNlX2xpc3Rfb3V0LCBqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2U+IG51bGxhYmxlX2lmYWNlX2xpc3RfaW5vdXQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKKyAgfQorICBwdWJsaWMgc3RhdGljIGNsYXNzIE15UGFyY2VsYWJsZSBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZQorICB7CisgICAgcHVibGljIGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZSBpZmFjZTsKKyAgICBwdWJsaWMgYW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlIG51bGxhYmxlX2lmYWNlOworICAgIHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2U+IGlmYWNlX2xpc3Q7CisgICAgcHVibGljIGphdmEudXRpbC5MaXN0PGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZT4gbnVsbGFibGVfaWZhY2VfbGlzdDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsYWJsZS5DcmVhdG9yPE15UGFyY2VsYWJsZT4gQ1JFQVRPUiA9IG5ldyBhbmRyb2lkLm9zLlBhcmNlbGFibGUuQ3JlYXRvcjxNeVBhcmNlbGFibGU+KCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgTXlQYXJjZWxhYmxlIGNyZWF0ZUZyb21QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgX2FpZGxfc291cmNlKSB7CisgICAgICAgIE15UGFyY2VsYWJsZSBfYWlkbF9vdXQgPSBuZXcgTXlQYXJjZWxhYmxlKCk7CisgICAgICAgIF9haWRsX291dC5yZWFkRnJvbVBhcmNlbChfYWlkbF9zb3VyY2UpOworICAgICAgICByZXR1cm4gX2FpZGxfb3V0OworICAgICAgfQorICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgTXlQYXJjZWxhYmxlW10gbmV3QXJyYXkoaW50IF9haWRsX3NpemUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNeVBhcmNlbGFibGVbX2FpZGxfc2l6ZV07CisgICAgICB9CisgICAgfTsKKyAgICBAT3ZlcnJpZGUgcHVibGljIGZpbmFsIHZvaWQgd3JpdGVUb1BhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9wYXJjZWwsIGludCBfYWlkbF9mbGFnKQorICAgIHsKKyAgICAgIGludCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCk7CisgICAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoMCk7CisgICAgICBfYWlkbF9wYXJjZWwud3JpdGVTdHJvbmdJbnRlcmZhY2UoaWZhY2UpOworICAgICAgX2FpZGxfcGFyY2VsLndyaXRlU3Ryb25nSW50ZXJmYWNlKG51bGxhYmxlX2lmYWNlKTsKKyAgICAgIF9haWRsX3BhcmNlbC53cml0ZUludGVyZmFjZUxpc3QoaWZhY2VfbGlzdCk7CisgICAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnRlcmZhY2VMaXN0KG51bGxhYmxlX2lmYWNlX2xpc3QpOworICAgICAgaW50IF9haWRsX2VuZF9wb3MgPSBfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCk7CisgICAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3Bvcyk7CisgICAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgICAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX2VuZF9wb3MpOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgdm9pZCByZWFkRnJvbVBhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9wYXJjZWwpCisgICAgeworICAgICAgaW50IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKKyAgICAgIGludCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSBfYWlkbF9wYXJjZWwucmVhZEludCgpOworICAgICAgdHJ5IHsKKyAgICAgICAgaWYgKF9haWRsX3BhcmNlbGFibGVfc2l6ZSA8IDQpIHRocm93IG5ldyBhbmRyb2lkLm9zLkJhZFBhcmNlbGFibGVFeGNlcHRpb24oIlBhcmNlbGFibGUgdG9vIHNtYWxsIik7OworICAgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgICBpZmFjZSA9IGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZS5TdHViLmFzSW50ZXJmYWNlKF9haWRsX3BhcmNlbC5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgICBudWxsYWJsZV9pZmFjZSA9IGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZS5TdHViLmFzSW50ZXJmYWNlKF9haWRsX3BhcmNlbC5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgICBpZmFjZV9saXN0ID0gX2FpZGxfcGFyY2VsLmNyZWF0ZUludGVyZmFjZUFycmF5TGlzdChhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UuU3R1Yjo6YXNJbnRlcmZhY2UpOworICAgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgICBudWxsYWJsZV9pZmFjZV9saXN0ID0gX2FpZGxfcGFyY2VsLmNyZWF0ZUludGVyZmFjZUFycmF5TGlzdChhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UuU3R1Yjo6YXNJbnRlcmZhY2UpOworICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgaWYgKF9haWRsX3N0YXJ0X3BvcyA+IChJbnRlZ2VyLk1BWF9WQUxVRSAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgYW5kcm9pZC5vcy5CYWRQYXJjZWxhYmxlRXhjZXB0aW9uKCJPdmVyZmxvdyBpbiB0aGUgc2l6ZSBvZiBwYXJjZWxhYmxlIik7CisgICAgICAgIH0KKyAgICAgICAgX2FpZGxfcGFyY2VsLnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgICAgfQorICAgIH0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgamF2YS51dGlsLlN0cmluZ0pvaW5lciBfYWlkbF9zaiA9IG5ldyBqYXZhLnV0aWwuU3RyaW5nSm9pbmVyKCIsICIsICJ7IiwgIn0iKTsKKyAgICAgIF9haWRsX3NqLmFkZCgiaWZhY2U6ICIgKyAoamF2YS51dGlsLk9iamVjdHMudG9TdHJpbmcoaWZhY2UpKSk7CisgICAgICBfYWlkbF9zai5hZGQoIm51bGxhYmxlX2lmYWNlOiAiICsgKGphdmEudXRpbC5PYmplY3RzLnRvU3RyaW5nKG51bGxhYmxlX2lmYWNlKSkpOworICAgICAgX2FpZGxfc2ouYWRkKCJpZmFjZV9saXN0OiAiICsgKGphdmEudXRpbC5PYmplY3RzLnRvU3RyaW5nKGlmYWNlX2xpc3QpKSk7CisgICAgICBfYWlkbF9zai5hZGQoIm51bGxhYmxlX2lmYWNlX2xpc3Q6ICIgKyAoamF2YS51dGlsLk9iamVjdHMudG9TdHJpbmcobnVsbGFibGVfaWZhY2VfbGlzdCkpKTsKKyAgICAgIHJldHVybiAiYW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuTXlQYXJjZWxhYmxlIiArIF9haWRsX3NqLnRvU3RyaW5nKCkgIDsKKyAgICB9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgeworICAgICAgaWYgKHRoaXMgPT0gb3RoZXIpIHJldHVybiB0cnVlOworICAgICAgaWYgKG90aGVyID09IG51bGwpIHJldHVybiBmYWxzZTsKKyAgICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgTXlQYXJjZWxhYmxlKSkgcmV0dXJuIGZhbHNlOworICAgICAgTXlQYXJjZWxhYmxlIHRoYXQgPSAoTXlQYXJjZWxhYmxlKW90aGVyOworICAgICAgaWYgKCFqYXZhLnV0aWwuT2JqZWN0cy5kZWVwRXF1YWxzKGlmYWNlLCB0aGF0LmlmYWNlKSkgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKCFqYXZhLnV0aWwuT2JqZWN0cy5kZWVwRXF1YWxzKG51bGxhYmxlX2lmYWNlLCB0aGF0Lm51bGxhYmxlX2lmYWNlKSkgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKCFqYXZhLnV0aWwuT2JqZWN0cy5kZWVwRXF1YWxzKGlmYWNlX2xpc3QsIHRoYXQuaWZhY2VfbGlzdCkpIHJldHVybiBmYWxzZTsKKyAgICAgIGlmICghamF2YS51dGlsLk9iamVjdHMuZGVlcEVxdWFscyhudWxsYWJsZV9pZmFjZV9saXN0LCB0aGF0Lm51bGxhYmxlX2lmYWNlX2xpc3QpKSByZXR1cm4gZmFsc2U7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgcmV0dXJuIGphdmEudXRpbC5BcnJheXMuZGVlcEhhc2hDb2RlKGphdmEudXRpbC5BcnJheXMuYXNMaXN0KGlmYWNlLCBudWxsYWJsZV9pZmFjZSwgaWZhY2VfbGlzdCwgbnVsbGFibGVfaWZhY2VfbGlzdCkudG9BcnJheSgpKTsKKyAgICB9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgICAgaW50IF9tYXNrID0gMDsKKyAgICAgIHJldHVybiBfbWFzazsKKyAgICB9CisgIH0KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBNeVVuaW9uIGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlIHsKKyAgICAvLyB0YWdzIGZvciB1bmlvbiBmaWVsZHMKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBpZmFjZSA9IDA7ICAvLyBhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UgaWZhY2U7CisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgbnVsbGFibGVfaWZhY2UgPSAxOyAgLy8gYW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlIG51bGxhYmxlX2lmYWNlOworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IGlmYWNlX2xpc3QgPSAyOyAgLy8gTGlzdDxhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2U+IGlmYWNlX2xpc3Q7CisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgbnVsbGFibGVfaWZhY2VfbGlzdCA9IDM7ICAvLyBMaXN0PGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZT4gbnVsbGFibGVfaWZhY2VfbGlzdDsKKworICAgIHByaXZhdGUgaW50IF90YWc7CisgICAgcHJpdmF0ZSBPYmplY3QgX3ZhbHVlOworCisgICAgcHVibGljIE15VW5pb24oKSB7CisgICAgICBhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UgX3ZhbHVlID0gbnVsbDsKKyAgICAgIHRoaXMuX3RhZyA9IGlmYWNlOworICAgICAgdGhpcy5fdmFsdWUgPSBfdmFsdWU7CisgICAgfQorCisgICAgcHJpdmF0ZSBNeVVuaW9uKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3BhcmNlbCkgeworICAgICAgcmVhZEZyb21QYXJjZWwoX2FpZGxfcGFyY2VsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIE15VW5pb24oaW50IF90YWcsIE9iamVjdCBfdmFsdWUpIHsKKyAgICAgIHRoaXMuX3RhZyA9IF90YWc7CisgICAgICB0aGlzLl92YWx1ZSA9IF92YWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFRhZygpIHsKKyAgICAgIHJldHVybiBfdGFnOworICAgIH0KKworICAgIC8vIGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZSBpZmFjZTsKKworICAgIHB1YmxpYyBzdGF0aWMgTXlVbmlvbiBpZmFjZShhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UgX3ZhbHVlKSB7CisgICAgICByZXR1cm4gbmV3IE15VW5pb24oaWZhY2UsIF92YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZSBnZXRJZmFjZSgpIHsKKyAgICAgIF9hc3NlcnRUYWcoaWZhY2UpOworICAgICAgcmV0dXJuIChhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UpIF92YWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJZmFjZShhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UgX3ZhbHVlKSB7CisgICAgICBfc2V0KGlmYWNlLCBfdmFsdWUpOworICAgIH0KKworICAgIC8vIGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZSBudWxsYWJsZV9pZmFjZTsKKworICAgIHB1YmxpYyBzdGF0aWMgTXlVbmlvbiBudWxsYWJsZV9pZmFjZShhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UgX3ZhbHVlKSB7CisgICAgICByZXR1cm4gbmV3IE15VW5pb24obnVsbGFibGVfaWZhY2UsIF92YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZSBnZXROdWxsYWJsZV9pZmFjZSgpIHsKKyAgICAgIF9hc3NlcnRUYWcobnVsbGFibGVfaWZhY2UpOworICAgICAgcmV0dXJuIChhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UpIF92YWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROdWxsYWJsZV9pZmFjZShhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UgX3ZhbHVlKSB7CisgICAgICBfc2V0KG51bGxhYmxlX2lmYWNlLCBfdmFsdWUpOworICAgIH0KKworICAgIC8vIExpc3Q8YW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlPiBpZmFjZV9saXN0OworCisgICAgcHVibGljIHN0YXRpYyBNeVVuaW9uIGlmYWNlX2xpc3QoamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlPiBfdmFsdWUpIHsKKyAgICAgIHJldHVybiBuZXcgTXlVbmlvbihpZmFjZV9saXN0LCBfdmFsdWUpOworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2U+IGdldElmYWNlX2xpc3QoKSB7CisgICAgICBfYXNzZXJ0VGFnKGlmYWNlX2xpc3QpOworICAgICAgcmV0dXJuIChqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2U+KSBfdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SWZhY2VfbGlzdChqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2U+IF92YWx1ZSkgeworICAgICAgX3NldChpZmFjZV9saXN0LCBfdmFsdWUpOworICAgIH0KKworICAgIC8vIExpc3Q8YW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlPiBudWxsYWJsZV9pZmFjZV9saXN0OworCisgICAgcHVibGljIHN0YXRpYyBNeVVuaW9uIG51bGxhYmxlX2lmYWNlX2xpc3QoamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlPiBfdmFsdWUpIHsKKyAgICAgIHJldHVybiBuZXcgTXlVbmlvbihudWxsYWJsZV9pZmFjZV9saXN0LCBfdmFsdWUpOworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2U+IGdldE51bGxhYmxlX2lmYWNlX2xpc3QoKSB7CisgICAgICBfYXNzZXJ0VGFnKG51bGxhYmxlX2lmYWNlX2xpc3QpOworICAgICAgcmV0dXJuIChqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2U+KSBfdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TnVsbGFibGVfaWZhY2VfbGlzdChqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2U+IF92YWx1ZSkgeworICAgICAgX3NldChudWxsYWJsZV9pZmFjZV9saXN0LCBfdmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3I8TXlVbmlvbj4gQ1JFQVRPUiA9IG5ldyBhbmRyb2lkLm9zLlBhcmNlbGFibGUuQ3JlYXRvcjxNeVVuaW9uPigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIE15VW5pb24gY3JlYXRlRnJvbVBhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9zb3VyY2UpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNeVVuaW9uKF9haWRsX3NvdXJjZSk7CisgICAgICB9CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBNeVVuaW9uW10gbmV3QXJyYXkoaW50IF9haWRsX3NpemUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNeVVuaW9uW19haWRsX3NpemVdOworICAgICAgfQorICAgIH07CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZVRvUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3BhcmNlbCwgaW50IF9haWRsX2ZsYWcpIHsKKyAgICAgIF9haWRsX3BhcmNlbC53cml0ZUludChfdGFnKTsKKyAgICAgIHN3aXRjaCAoX3RhZykgeworICAgICAgY2FzZSBpZmFjZToKKyAgICAgICAgX2FpZGxfcGFyY2VsLndyaXRlU3Ryb25nSW50ZXJmYWNlKGdldElmYWNlKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgbnVsbGFibGVfaWZhY2U6CisgICAgICAgIF9haWRsX3BhcmNlbC53cml0ZVN0cm9uZ0ludGVyZmFjZShnZXROdWxsYWJsZV9pZmFjZSgpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIGlmYWNlX2xpc3Q6CisgICAgICAgIF9haWRsX3BhcmNlbC53cml0ZUludGVyZmFjZUxpc3QoZ2V0SWZhY2VfbGlzdCgpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIG51bGxhYmxlX2lmYWNlX2xpc3Q6CisgICAgICAgIF9haWRsX3BhcmNlbC53cml0ZUludGVyZmFjZUxpc3QoZ2V0TnVsbGFibGVfaWZhY2VfbGlzdCgpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVhZEZyb21QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgX2FpZGxfcGFyY2VsKSB7CisgICAgICBpbnQgX2FpZGxfdGFnOworICAgICAgX2FpZGxfdGFnID0gX2FpZGxfcGFyY2VsLnJlYWRJbnQoKTsKKyAgICAgIHN3aXRjaCAoX2FpZGxfdGFnKSB7CisgICAgICBjYXNlIGlmYWNlOiB7CisgICAgICAgIGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZSBfYWlkbF92YWx1ZTsKKyAgICAgICAgX2FpZGxfdmFsdWUgPSBhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UuU3R1Yi5hc0ludGVyZmFjZShfYWlkbF9wYXJjZWwucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgX3NldChfYWlkbF90YWcsIF9haWRsX3ZhbHVlKTsKKyAgICAgICAgcmV0dXJuOyB9CisgICAgICBjYXNlIG51bGxhYmxlX2lmYWNlOiB7CisgICAgICAgIGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZSBfYWlkbF92YWx1ZTsKKyAgICAgICAgX2FpZGxfdmFsdWUgPSBhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UuU3R1Yi5hc0ludGVyZmFjZShfYWlkbF9wYXJjZWwucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgX3NldChfYWlkbF90YWcsIF9haWRsX3ZhbHVlKTsKKyAgICAgICAgcmV0dXJuOyB9CisgICAgICBjYXNlIGlmYWNlX2xpc3Q6IHsKKyAgICAgICAgamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlPiBfYWlkbF92YWx1ZTsKKyAgICAgICAgX2FpZGxfdmFsdWUgPSBfYWlkbF9wYXJjZWwuY3JlYXRlSW50ZXJmYWNlQXJyYXlMaXN0KGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZS5TdHViOjphc0ludGVyZmFjZSk7CisgICAgICAgIF9zZXQoX2FpZGxfdGFnLCBfYWlkbF92YWx1ZSk7CisgICAgICAgIHJldHVybjsgfQorICAgICAgY2FzZSBudWxsYWJsZV9pZmFjZV9saXN0OiB7CisgICAgICAgIGphdmEudXRpbC5MaXN0PGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZT4gX2FpZGxfdmFsdWU7CisgICAgICAgIF9haWRsX3ZhbHVlID0gX2FpZGxfcGFyY2VsLmNyZWF0ZUludGVyZmFjZUFycmF5TGlzdChhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UuU3R1Yjo6YXNJbnRlcmZhY2UpOworICAgICAgICBfc2V0KF9haWRsX3RhZywgX2FpZGxfdmFsdWUpOworICAgICAgICByZXR1cm47IH0KKyAgICAgIH0KKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVuaW9uOiB1bmtub3duIHRhZzogIiArIF9haWRsX3RhZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgICAgaW50IF9tYXNrID0gMDsKKyAgICAgIHN3aXRjaCAoZ2V0VGFnKCkpIHsKKyAgICAgIH0KKyAgICAgIHJldHVybiBfbWFzazsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgc3dpdGNoIChfdGFnKSB7CisgICAgICBjYXNlIGlmYWNlOiByZXR1cm4gImFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLk15VW5pb24uaWZhY2UoIiArIChqYXZhLnV0aWwuT2JqZWN0cy50b1N0cmluZyhnZXRJZmFjZSgpKSkgKyAiKSI7CisgICAgICBjYXNlIG51bGxhYmxlX2lmYWNlOiByZXR1cm4gImFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLk15VW5pb24ubnVsbGFibGVfaWZhY2UoIiArIChqYXZhLnV0aWwuT2JqZWN0cy50b1N0cmluZyhnZXROdWxsYWJsZV9pZmFjZSgpKSkgKyAiKSI7CisgICAgICBjYXNlIGlmYWNlX2xpc3Q6IHJldHVybiAiYW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuTXlVbmlvbi5pZmFjZV9saXN0KCIgKyAoamF2YS51dGlsLk9iamVjdHMudG9TdHJpbmcoZ2V0SWZhY2VfbGlzdCgpKSkgKyAiKSI7CisgICAgICBjYXNlIG51bGxhYmxlX2lmYWNlX2xpc3Q6IHJldHVybiAiYW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuTXlVbmlvbi5udWxsYWJsZV9pZmFjZV9saXN0KCIgKyAoamF2YS51dGlsLk9iamVjdHMudG9TdHJpbmcoZ2V0TnVsbGFibGVfaWZhY2VfbGlzdCgpKSkgKyAiKSI7CisgICAgICB9CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ1bmtub3duIGZpZWxkOiAiICsgX3RhZyk7CisgICAgfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKKyAgICAgIGlmICh0aGlzID09IG90aGVyKSByZXR1cm4gdHJ1ZTsKKyAgICAgIGlmIChvdGhlciA9PSBudWxsKSByZXR1cm4gZmFsc2U7CisgICAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIE15VW5pb24pKSByZXR1cm4gZmFsc2U7CisgICAgICBNeVVuaW9uIHRoYXQgPSAoTXlVbmlvbilvdGhlcjsKKyAgICAgIGlmIChfdGFnICE9IHRoYXQuX3RhZykgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKCFqYXZhLnV0aWwuT2JqZWN0cy5kZWVwRXF1YWxzKF92YWx1ZSwgdGhhdC5fdmFsdWUpKSByZXR1cm4gZmFsc2U7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgcmV0dXJuIGphdmEudXRpbC5BcnJheXMuZGVlcEhhc2hDb2RlKGphdmEudXRpbC5BcnJheXMuYXNMaXN0KF90YWcsIF92YWx1ZSkudG9BcnJheSgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgX2Fzc2VydFRhZyhpbnQgdGFnKSB7CisgICAgICBpZiAoZ2V0VGFnKCkgIT0gdGFnKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImJhZCBhY2Nlc3M6ICIgKyBfdGFnU3RyaW5nKHRhZykgKyAiLCAiICsgX3RhZ1N0cmluZyhnZXRUYWcoKSkgKyAiIGlzIGF2YWlsYWJsZS4iKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBfdGFnU3RyaW5nKGludCBfdGFnKSB7CisgICAgICBzd2l0Y2ggKF90YWcpIHsKKyAgICAgIGNhc2UgaWZhY2U6IHJldHVybiAiaWZhY2UiOworICAgICAgY2FzZSBudWxsYWJsZV9pZmFjZTogcmV0dXJuICJudWxsYWJsZV9pZmFjZSI7CisgICAgICBjYXNlIGlmYWNlX2xpc3Q6IHJldHVybiAiaWZhY2VfbGlzdCI7CisgICAgICBjYXNlIG51bGxhYmxlX2lmYWNlX2xpc3Q6IHJldHVybiAibnVsbGFibGVfaWZhY2VfbGlzdCI7CisgICAgICB9CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ1bmtub3duIGZpZWxkOiAiICsgX3RhZyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIF9zZXQoaW50IF90YWcsIE9iamVjdCBfdmFsdWUpIHsKKyAgICAgIHRoaXMuX3RhZyA9IF90YWc7CisgICAgICB0aGlzLl92YWx1ZSA9IF92YWx1ZTsKKyAgICB9CisgICAgcHVibGljIHN0YXRpYyBAaW50ZXJmYWNlIFRhZyB7CisgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpZmFjZSA9IDA7CisgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBudWxsYWJsZV9pZmFjZSA9IDE7CisgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpZmFjZV9saXN0ID0gMjsKKyAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG51bGxhYmxlX2lmYWNlX2xpc3QgPSAzOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvTGlzdE9mSW50ZXJmYWNlcy5qYXZhLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9MaXN0T2ZJbnRlcmZhY2VzLmphdmEuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzg3MDM2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvTGlzdE9mSW50ZXJmYWNlcy5qYXZhLmQKQEAgLTAsMCArMSwyIEBACitvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0xpc3RPZkludGVyZmFjZXMuamF2YSA6IFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0xpc3RPZkludGVyZmFjZXMuYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmcuamF2YSBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL090aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nLmphdmEKaW5kZXggYTI4MjRlZS4uNDZhMTFlNyAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmcuamF2YQorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9PdGhlclBhcmNlbGFibGVGb3JUb1N0cmluZy5qYXZhCkBAIC0zMiw3ICszMiw3IEBACiAgICAgaW50IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKICAgICBpbnQgX2FpZGxfcGFyY2VsYWJsZV9zaXplID0gX2FpZGxfcGFyY2VsLnJlYWRJbnQoKTsKICAgICB0cnkgewotICAgICAgaWYgKF9haWRsX3BhcmNlbGFibGVfc2l6ZSA8IDApIHJldHVybjsKKyAgICAgIGlmIChfYWlkbF9wYXJjZWxhYmxlX3NpemUgPCA0KSB0aHJvdyBuZXcgYW5kcm9pZC5vcy5CYWRQYXJjZWxhYmxlRXhjZXB0aW9uKCJQYXJjZWxhYmxlIHRvbyBzbWFsbCIpOzsKICAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CiAgICAgICBmaWVsZCA9IF9haWRsX3BhcmNlbC5yZWFkU3RyaW5nKCk7CiAgICAgfSBmaW5hbGx5IHsKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1BhcmNlbGFibGVGb3JUb1N0cmluZy5qYXZhIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvUGFyY2VsYWJsZUZvclRvU3RyaW5nLmphdmEKaW5kZXggOWMxYmIxMy4uNzAzMmRjNyAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvUGFyY2VsYWJsZUZvclRvU3RyaW5nLmphdmEKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvUGFyY2VsYWJsZUZvclRvU3RyaW5nLmphdmEKQEAgLTUzLDM3ICs1MywxOSBAQAogICAgIF9haWRsX3BhcmNlbC53cml0ZUZsb2F0QXJyYXkoZmxvYXRBcnJheSk7CiAgICAgX2FpZGxfcGFyY2VsLndyaXRlQnl0ZShieXRlVmFsdWUpOwogICAgIF9haWRsX3BhcmNlbC53cml0ZUJ5dGVBcnJheShieXRlQXJyYXkpOwotICAgIF9haWRsX3BhcmNlbC53cml0ZUludCgoKGJvb2xlYW5WYWx1ZSk/KDEpOigwKSkpOworICAgIF9haWRsX3BhcmNlbC53cml0ZUJvb2xlYW4oYm9vbGVhblZhbHVlKTsKICAgICBfYWlkbF9wYXJjZWwud3JpdGVCb29sZWFuQXJyYXkoYm9vbGVhbkFycmF5KTsKICAgICBfYWlkbF9wYXJjZWwud3JpdGVTdHJpbmcoc3RyaW5nVmFsdWUpOwogICAgIF9haWRsX3BhcmNlbC53cml0ZVN0cmluZ0FycmF5KHN0cmluZ0FycmF5KTsKICAgICBfYWlkbF9wYXJjZWwud3JpdGVTdHJpbmdMaXN0KHN0cmluZ0xpc3QpOwotICAgIGlmICgocGFyY2VsYWJsZVZhbHVlIT1udWxsKSkgewotICAgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KDEpOwotICAgICAgcGFyY2VsYWJsZVZhbHVlLndyaXRlVG9QYXJjZWwoX2FpZGxfcGFyY2VsLCAwKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoMCk7Ci0gICAgfQotICAgIF9haWRsX3BhcmNlbC53cml0ZVR5cGVkQXJyYXkocGFyY2VsYWJsZUFycmF5LCAwKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVUeXBlZE9iamVjdChwYXJjZWxhYmxlVmFsdWUsIF9haWRsX2ZsYWcpOworICAgIF9haWRsX3BhcmNlbC53cml0ZVR5cGVkQXJyYXkocGFyY2VsYWJsZUFycmF5LCBfYWlkbF9mbGFnKTsKICAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoZW51bVZhbHVlKTsKICAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnRBcnJheShlbnVtQXJyYXkpOwogICAgIF9haWRsX3BhcmNlbC53cml0ZVN0cmluZ0FycmF5KG51bGxBcnJheSk7CiAgICAgX2FpZGxfcGFyY2VsLndyaXRlU3RyaW5nTGlzdChudWxsTGlzdCk7Ci0gICAgaWYgKChwYXJjZWxhYmxlR2VuZXJpYyE9bnVsbCkpIHsKLSAgICAgIF9haWRsX3BhcmNlbC53cml0ZUludCgxKTsKLSAgICAgIHBhcmNlbGFibGVHZW5lcmljLndyaXRlVG9QYXJjZWwoX2FpZGxfcGFyY2VsLCAwKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoMCk7Ci0gICAgfQotICAgIGlmICgodW5pb25WYWx1ZSE9bnVsbCkpIHsKLSAgICAgIF9haWRsX3BhcmNlbC53cml0ZUludCgxKTsKLSAgICAgIHVuaW9uVmFsdWUud3JpdGVUb1BhcmNlbChfYWlkbF9wYXJjZWwsIDApOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIF9haWRsX3BhcmNlbC53cml0ZUludCgwKTsKLSAgICB9CisgICAgX2FpZGxfcGFyY2VsLndyaXRlVHlwZWRPYmplY3QocGFyY2VsYWJsZUdlbmVyaWMsIF9haWRsX2ZsYWcpOworICAgIF9haWRsX3BhcmNlbC53cml0ZVR5cGVkT2JqZWN0KHVuaW9uVmFsdWUsIF9haWRsX2ZsYWcpOwogICAgIGludCBfYWlkbF9lbmRfcG9zID0gX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpOwogICAgIF9haWRsX3BhcmNlbC5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zKTsKICAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CkBAIC05NCw3ICs3Niw3IEBACiAgICAgaW50IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKICAgICBpbnQgX2FpZGxfcGFyY2VsYWJsZV9zaXplID0gX2FpZGxfcGFyY2VsLnJlYWRJbnQoKTsKICAgICB0cnkgewotICAgICAgaWYgKF9haWRsX3BhcmNlbGFibGVfc2l6ZSA8IDApIHJldHVybjsKKyAgICAgIGlmIChfYWlkbF9wYXJjZWxhYmxlX3NpemUgPCA0KSB0aHJvdyBuZXcgYW5kcm9pZC5vcy5CYWRQYXJjZWxhYmxlRXhjZXB0aW9uKCJQYXJjZWxhYmxlIHRvbyBzbWFsbCIpOzsKICAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CiAgICAgICBpbnRWYWx1ZSA9IF9haWRsX3BhcmNlbC5yZWFkSW50KCk7CiAgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOwpAQCAtMTE2LDcgKzk4LDcgQEAKICAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CiAgICAgICBieXRlQXJyYXkgPSBfYWlkbF9wYXJjZWwuY3JlYXRlQnl0ZUFycmF5KCk7CiAgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOwotICAgICAgYm9vbGVhblZhbHVlID0gKDAhPV9haWRsX3BhcmNlbC5yZWFkSW50KCkpOworICAgICAgYm9vbGVhblZhbHVlID0gX2FpZGxfcGFyY2VsLnJlYWRCb29sZWFuKCk7CiAgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOwogICAgICAgYm9vbGVhbkFycmF5ID0gX2FpZGxfcGFyY2VsLmNyZWF0ZUJvb2xlYW5BcnJheSgpOwogICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKQEAgLTEyNiwxMiArMTA4LDcgQEAKICAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CiAgICAgICBzdHJpbmdMaXN0ID0gX2FpZGxfcGFyY2VsLmNyZWF0ZVN0cmluZ0FycmF5TGlzdCgpOwogICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKLSAgICAgIGlmICgoMCE9X2FpZGxfcGFyY2VsLnJlYWRJbnQoKSkpIHsKLSAgICAgICAgcGFyY2VsYWJsZVZhbHVlID0gYW5kcm9pZC5haWRsLnRlc3RzLk90aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nLkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChfYWlkbF9wYXJjZWwpOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIHBhcmNlbGFibGVWYWx1ZSA9IG51bGw7Ci0gICAgICB9CisgICAgICBwYXJjZWxhYmxlVmFsdWUgPSBfYWlkbF9wYXJjZWwucmVhZFR5cGVkT2JqZWN0KGFuZHJvaWQuYWlkbC50ZXN0cy5PdGhlclBhcmNlbGFibGVGb3JUb1N0cmluZy5DUkVBVE9SKTsKICAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CiAgICAgICBwYXJjZWxhYmxlQXJyYXkgPSBfYWlkbF9wYXJjZWwuY3JlYXRlVHlwZWRBcnJheShhbmRyb2lkLmFpZGwudGVzdHMuT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmcuQ1JFQVRPUik7CiAgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOwpAQCAtMTQzLDE5ICsxMjAsOSBAQAogICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKICAgICAgIG51bGxMaXN0ID0gX2FpZGxfcGFyY2VsLmNyZWF0ZVN0cmluZ0FycmF5TGlzdCgpOwogICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKLSAgICAgIGlmICgoMCE9X2FpZGxfcGFyY2VsLnJlYWRJbnQoKSkpIHsKLSAgICAgICAgcGFyY2VsYWJsZUdlbmVyaWMgPSBhbmRyb2lkLmFpZGwudGVzdHMuR2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxlLkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChfYWlkbF9wYXJjZWwpOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIHBhcmNlbGFibGVHZW5lcmljID0gbnVsbDsKLSAgICAgIH0KKyAgICAgIHBhcmNlbGFibGVHZW5lcmljID0gX2FpZGxfcGFyY2VsLnJlYWRUeXBlZE9iamVjdChhbmRyb2lkLmFpZGwudGVzdHMuR2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxlLkNSRUFUT1IpOwogICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKLSAgICAgIGlmICgoMCE9X2FpZGxfcGFyY2VsLnJlYWRJbnQoKSkpIHsKLSAgICAgICAgdW5pb25WYWx1ZSA9IGFuZHJvaWQuYWlkbC50ZXN0cy5Vbmlvbi5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoX2FpZGxfcGFyY2VsKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICB1bmlvblZhbHVlID0gbnVsbDsKLSAgICAgIH0KKyAgICAgIHVuaW9uVmFsdWUgPSBfYWlkbF9wYXJjZWwucmVhZFR5cGVkT2JqZWN0KGFuZHJvaWQuYWlkbC50ZXN0cy5Vbmlvbi5DUkVBVE9SKTsKICAgICB9IGZpbmFsbHkgewogICAgICAgaWYgKF9haWRsX3N0YXJ0X3BvcyA+IChJbnRlZ2VyLk1BWF9WQUxVRSAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkpIHsKICAgICAgICAgdGhyb3cgbmV3IGFuZHJvaWQub3MuQmFkUGFyY2VsYWJsZUV4Y2VwdGlvbigiT3ZlcmZsb3cgaW4gdGhlIHNpemUgb2YgcGFyY2VsYWJsZSIpOwpAQCAtMTgzLDggKzE1MCw4IEBACiAgICAgX2FpZGxfc2ouYWRkKCJzdHJpbmdMaXN0OiAiICsgKGphdmEudXRpbC5PYmplY3RzLnRvU3RyaW5nKHN0cmluZ0xpc3QpKSk7CiAgICAgX2FpZGxfc2ouYWRkKCJwYXJjZWxhYmxlVmFsdWU6ICIgKyAoamF2YS51dGlsLk9iamVjdHMudG9TdHJpbmcocGFyY2VsYWJsZVZhbHVlKSkpOwogICAgIF9haWRsX3NqLmFkZCgicGFyY2VsYWJsZUFycmF5OiAiICsgKGphdmEudXRpbC5BcnJheXMudG9TdHJpbmcocGFyY2VsYWJsZUFycmF5KSkpOwotICAgIF9haWRsX3NqLmFkZCgiZW51bVZhbHVlOiAiICsgKGVudW1WYWx1ZSkpOwotICAgIF9haWRsX3NqLmFkZCgiZW51bUFycmF5OiAiICsgKGphdmEudXRpbC5BcnJheXMudG9TdHJpbmcoZW51bUFycmF5KSkpOworICAgIF9haWRsX3NqLmFkZCgiZW51bVZhbHVlOiAiICsgKGFuZHJvaWQuYWlkbC50ZXN0cy5JbnRFbnVtLiQudG9TdHJpbmcoZW51bVZhbHVlKSkpOworICAgIF9haWRsX3NqLmFkZCgiZW51bUFycmF5OiAiICsgKGFuZHJvaWQuYWlkbC50ZXN0cy5JbnRFbnVtLiQuYXJyYXlUb1N0cmluZyhlbnVtQXJyYXkpKSk7CiAgICAgX2FpZGxfc2ouYWRkKCJudWxsQXJyYXk6ICIgKyAoamF2YS51dGlsLkFycmF5cy50b1N0cmluZyhudWxsQXJyYXkpKSk7CiAgICAgX2FpZGxfc2ouYWRkKCJudWxsTGlzdDogIiArIChqYXZhLnV0aWwuT2JqZWN0cy50b1N0cmluZyhudWxsTGlzdCkpKTsKICAgICBfYWlkbF9zai5hZGQoInBhcmNlbGFibGVHZW5lcmljOiAiICsgKGphdmEudXRpbC5PYmplY3RzLnRvU3RyaW5nKHBhcmNlbGFibGVHZW5lcmljKSkpOwpAQCAtMjAyLDggKzE2OSw3IEBACiAgIH0KICAgcHJpdmF0ZSBpbnQgZGVzY3JpYmVDb250ZW50cyhPYmplY3QgX3YpIHsKICAgICBpZiAoX3YgPT0gbnVsbCkgcmV0dXJuIDA7Ci0gICAgQ2xhc3M8Pz4gX2NsYXp6ID0gX3YuZ2V0Q2xhc3MoKTsKLSAgICBpZiAoX2NsYXp6LmlzQXJyYXkoKSAmJiBfY2xhenouZ2V0Q29tcG9uZW50VHlwZSgpID09IE9iamVjdC5jbGFzcykgeworICAgIGlmIChfdiBpbnN0YW5jZW9mIE9iamVjdFtdKSB7CiAgICAgICBpbnQgX21hc2sgPSAwOwogICAgICAgZm9yIChPYmplY3QgbyA6IChPYmplY3RbXSkgX3YpIHsKICAgICAgICAgX21hc2sgfD0gZGVzY3JpYmVDb250ZW50cyhvKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1BhcmNlbGFibGVGb3JUb1N0cmluZy5qYXZhLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9QYXJjZWxhYmxlRm9yVG9TdHJpbmcuamF2YS5kCmluZGV4IDlhMTllYjYuLjAxM2U2MmMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1BhcmNlbGFibGVGb3JUb1N0cmluZy5qYXZhLmQKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvUGFyY2VsYWJsZUZvclRvU3RyaW5nLmphdmEuZApAQCAtNCw0ICs0LDcgQEAKICAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0ludEVudW0uYWlkbCBcCiAgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9PdGhlclBhcmNlbGFibGVGb3JUb1N0cmluZy5haWRsIFwKICAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL1N0cnVjdHVyZWRQYXJjZWxhYmxlLmFpZGwgXAotICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb24uYWlkbAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb24uYWlkbCBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9CeXRlRW51bS5haWRsIFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0xvbmdFbnVtLmFpZGwgXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvQ29uc3RhbnRFeHByZXNzaW9uRW51bS5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9SZWN1cnNpdmVMaXN0LmphdmEgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9SZWN1cnNpdmVMaXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVmYWFjOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1JlY3Vyc2l2ZUxpc3QuamF2YQpAQCAtMCwwICsxLDYyIEBACisvKgorICogVGhpcyBmaWxlIGlzIGF1dG8tZ2VuZXJhdGVkLiAgRE8gTk9UIE1PRElGWS4KKyAqLworcGFja2FnZSBhbmRyb2lkLmFpZGwudGVzdHM7CitwdWJsaWMgY2xhc3MgUmVjdXJzaXZlTGlzdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZQoreworICBwdWJsaWMgaW50IHZhbHVlID0gMDsKKyAgcHVibGljIGFuZHJvaWQuYWlkbC50ZXN0cy5SZWN1cnNpdmVMaXN0IG5leHQ7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3I8UmVjdXJzaXZlTGlzdD4gQ1JFQVRPUiA9IG5ldyBhbmRyb2lkLm9zLlBhcmNlbGFibGUuQ3JlYXRvcjxSZWN1cnNpdmVMaXN0PigpIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVjdXJzaXZlTGlzdCBjcmVhdGVGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3NvdXJjZSkgeworICAgICAgUmVjdXJzaXZlTGlzdCBfYWlkbF9vdXQgPSBuZXcgUmVjdXJzaXZlTGlzdCgpOworICAgICAgX2FpZGxfb3V0LnJlYWRGcm9tUGFyY2VsKF9haWRsX3NvdXJjZSk7CisgICAgICByZXR1cm4gX2FpZGxfb3V0OworICAgIH0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVjdXJzaXZlTGlzdFtdIG5ld0FycmF5KGludCBfYWlkbF9zaXplKSB7CisgICAgICByZXR1cm4gbmV3IFJlY3Vyc2l2ZUxpc3RbX2FpZGxfc2l6ZV07CisgICAgfQorICB9OworICBAT3ZlcnJpZGUgcHVibGljIGZpbmFsIHZvaWQgd3JpdGVUb1BhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9wYXJjZWwsIGludCBfYWlkbF9mbGFnKQorICB7CisgICAgaW50IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoMCk7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KHZhbHVlKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVUeXBlZE9iamVjdChuZXh0LCBfYWlkbF9mbGFnKTsKKyAgICBpbnQgX2FpZGxfZW5kX3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKKyAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3Bvcyk7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KF9haWRsX2VuZF9wb3MgLSBfYWlkbF9zdGFydF9wb3MpOworICAgIF9haWRsX3BhcmNlbC5zZXREYXRhUG9zaXRpb24oX2FpZGxfZW5kX3Bvcyk7CisgIH0KKyAgcHVibGljIGZpbmFsIHZvaWQgcmVhZEZyb21QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgX2FpZGxfcGFyY2VsKQorICB7CisgICAgaW50IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKKyAgICBpbnQgX2FpZGxfcGFyY2VsYWJsZV9zaXplID0gX2FpZGxfcGFyY2VsLnJlYWRJbnQoKTsKKyAgICB0cnkgeworICAgICAgaWYgKF9haWRsX3BhcmNlbGFibGVfc2l6ZSA8IDQpIHRocm93IG5ldyBhbmRyb2lkLm9zLkJhZFBhcmNlbGFibGVFeGNlcHRpb24oIlBhcmNlbGFibGUgdG9vIHNtYWxsIik7OworICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgIHZhbHVlID0gX2FpZGxfcGFyY2VsLnJlYWRJbnQoKTsKKyAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICBuZXh0ID0gX2FpZGxfcGFyY2VsLnJlYWRUeXBlZE9iamVjdChhbmRyb2lkLmFpZGwudGVzdHMuUmVjdXJzaXZlTGlzdC5DUkVBVE9SKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgaWYgKF9haWRsX3N0YXJ0X3BvcyA+IChJbnRlZ2VyLk1BWF9WQUxVRSAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkpIHsKKyAgICAgICAgdGhyb3cgbmV3IGFuZHJvaWQub3MuQmFkUGFyY2VsYWJsZUV4Y2VwdGlvbigiT3ZlcmZsb3cgaW4gdGhlIHNpemUgb2YgcGFyY2VsYWJsZSIpOworICAgICAgfQorICAgICAgX2FpZGxfcGFyY2VsLnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIH0KKyAgfQorICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgIGludCBfbWFzayA9IDA7CisgICAgX21hc2sgfD0gZGVzY3JpYmVDb250ZW50cyhuZXh0KTsKKyAgICByZXR1cm4gX21hc2s7CisgIH0KKyAgcHJpdmF0ZSBpbnQgZGVzY3JpYmVDb250ZW50cyhPYmplY3QgX3YpIHsKKyAgICBpZiAoX3YgPT0gbnVsbCkgcmV0dXJuIDA7CisgICAgaWYgKF92IGluc3RhbmNlb2YgYW5kcm9pZC5vcy5QYXJjZWxhYmxlKSB7CisgICAgICByZXR1cm4gKChhbmRyb2lkLm9zLlBhcmNlbGFibGUpIF92KS5kZXNjcmliZUNvbnRlbnRzKCk7CisgICAgfQorICAgIHJldHVybiAwOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9SZWN1cnNpdmVMaXN0LmphdmEuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1JlY3Vyc2l2ZUxpc3QuamF2YS5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNmM0ZWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9SZWN1cnNpdmVMaXN0LmphdmEuZApAQCAtMCwwICsxLDIgQEAKK291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvUmVjdXJzaXZlTGlzdC5qYXZhIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvUmVjdXJzaXZlTGlzdC5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5qYXZhIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvU3RydWN0dXJlZFBhcmNlbGFibGUuamF2YQppbmRleCA4MDZhNjM0Li5mYTM0YWZmIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5qYXZhCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1N0cnVjdHVyZWRQYXJjZWxhYmxlLmphdmEKQEAgLTM5LDcgKzM5LDkgQEAKICAgcHVibGljIGxvbmcgaW50NjRfbWF4ID0gOTIyMzM3MjAzNjg1NDc3NTgwN0w7CiAgIHB1YmxpYyBpbnQgaGV4SW50MzJfbmVnXzEgPSAtMTsKICAgcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBpYmluZGVyOworICBwdWJsaWMgYW5kcm9pZC5haWRsLnRlc3RzLlN0cnVjdHVyZWRQYXJjZWxhYmxlLkVtcHR5IGVtcHR5OwogICAvLyBDb25zdGFudCBleHByZXNzaW9ucyB0aGF0IGV2YWx1YXRlIHRvIDEKKyAgcHVibGljIGJ5dGVbXSBpbnQ4XzEgPSB7MSwgMSwgMSwgMSwgMX07CiAgIHB1YmxpYyBpbnRbXSBpbnQzMl8xID0gezEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDF9OwogICBwdWJsaWMgbG9uZ1tdIGludDY0XzEgPSB7MUwsIDFMLCAxTCwgMUwsIDFMLCAxTCwgMUwsIDFMLCAxTCwgMUx9OwogICBwdWJsaWMgaW50IGhleEludDMyX3Bvc18xID0gMTsKQEAgLTkwLDEzICs5MiwxMyBAQAogICAgIF9haWRsX3BhcmNlbC53cml0ZUJ5dGUoYnl0ZURlZmF1bHRzVG9Gb3VyKTsKICAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoaW50RGVmYXVsdHNUb0ZpdmUpOwogICAgIF9haWRsX3BhcmNlbC53cml0ZUxvbmcobG9uZ0RlZmF1bHRzVG9OZWdhdGl2ZVNldmVuKTsKLSAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoKChib29sZWFuRGVmYXVsdHNUb1RydWUpPygxKTooMCkpKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVCb29sZWFuKGJvb2xlYW5EZWZhdWx0c1RvVHJ1ZSk7CiAgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KCgoaW50KWNoYXJEZWZhdWx0c1RvQykpOwogICAgIF9haWRsX3BhcmNlbC53cml0ZUZsb2F0KGZsb2F0RGVmYXVsdHNUb1BpKTsKICAgICBfYWlkbF9wYXJjZWwud3JpdGVEb3VibGUoZG91YmxlV2l0aERlZmF1bHQpOwogICAgIF9haWRsX3BhcmNlbC53cml0ZUludEFycmF5KGFycmF5RGVmYXVsdHNUbzEyMyk7CiAgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50QXJyYXkoYXJyYXlEZWZhdWx0c1RvRW1wdHkpOwotICAgIF9haWRsX3BhcmNlbC53cml0ZUludCgoKGJvb2xEZWZhdWx0KT8oMSk6KDApKSk7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlQm9vbGVhbihib29sRGVmYXVsdCk7CiAgICAgX2FpZGxfcGFyY2VsLndyaXRlQnl0ZShieXRlRGVmYXVsdCk7CiAgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KGludERlZmF1bHQpOwogICAgIF9haWRsX3BhcmNlbC53cml0ZUxvbmcobG9uZ0RlZmF1bHQpOwpAQCAtMTEwLDYgKzExMiw4IEBACiAgICAgX2FpZGxfcGFyY2VsLndyaXRlTG9uZyhpbnQ2NF9tYXgpOwogICAgIF9haWRsX3BhcmNlbC53cml0ZUludChoZXhJbnQzMl9uZWdfMSk7CiAgICAgX2FpZGxfcGFyY2VsLndyaXRlU3Ryb25nQmluZGVyKGliaW5kZXIpOworICAgIF9haWRsX3BhcmNlbC53cml0ZVR5cGVkT2JqZWN0KGVtcHR5LCBfYWlkbF9mbGFnKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVCeXRlQXJyYXkoaW50OF8xKTsKICAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnRBcnJheShpbnQzMl8xKTsKICAgICBfYWlkbF9wYXJjZWwud3JpdGVMb25nQXJyYXkoaW50NjRfMSk7CiAgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KGhleEludDMyX3Bvc18xKTsKQEAgLTEyNywyMCArMTMxLDggQEAKICAgICBfYWlkbF9wYXJjZWwud3JpdGVTdHJpbmcoYWRkU3RyaW5nMSk7CiAgICAgX2FpZGxfcGFyY2VsLndyaXRlU3RyaW5nKGFkZFN0cmluZzIpOwogICAgIF9haWRsX3BhcmNlbC53cml0ZUludChzaG91bGRTZXRCaXQwQW5kQml0Mik7Ci0gICAgaWYgKCh1IT1udWxsKSkgewotICAgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KDEpOwotICAgICAgdS53cml0ZVRvUGFyY2VsKF9haWRsX3BhcmNlbCwgMCk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KDApOwotICAgIH0KLSAgICBpZiAoKHNob3VsZEJlQ29uc3RTMSE9bnVsbCkpIHsKLSAgICAgIF9haWRsX3BhcmNlbC53cml0ZUludCgxKTsKLSAgICAgIHNob3VsZEJlQ29uc3RTMS53cml0ZVRvUGFyY2VsKF9haWRsX3BhcmNlbCwgMCk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KDApOwotICAgIH0KKyAgICBfYWlkbF9wYXJjZWwud3JpdGVUeXBlZE9iamVjdCh1LCBfYWlkbF9mbGFnKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVUeXBlZE9iamVjdChzaG91bGRCZUNvbnN0UzEsIF9haWRsX2ZsYWcpOwogICAgIF9haWRsX3BhcmNlbC53cml0ZUludChkZWZhdWx0V2l0aEZvbyk7CiAgICAgaW50IF9haWRsX2VuZF9wb3MgPSBfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCk7CiAgICAgX2FpZGxfcGFyY2VsLnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MpOwpAQCAtMTUyLDcgKzE0NCw3IEBACiAgICAgaW50IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKICAgICBpbnQgX2FpZGxfcGFyY2VsYWJsZV9zaXplID0gX2FpZGxfcGFyY2VsLnJlYWRJbnQoKTsKICAgICB0cnkgewotICAgICAgaWYgKF9haWRsX3BhcmNlbGFibGVfc2l6ZSA8IDApIHJldHVybjsKKyAgICAgIGlmIChfYWlkbF9wYXJjZWxhYmxlX3NpemUgPCA0KSB0aHJvdyBuZXcgYW5kcm9pZC5vcy5CYWRQYXJjZWxhYmxlRXhjZXB0aW9uKCJQYXJjZWxhYmxlIHRvbyBzbWFsbCIpOzsKICAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CiAgICAgICBzaG91bGRDb250YWluVGhyZWVGcyA9IF9haWRsX3BhcmNlbC5jcmVhdGVJbnRBcnJheSgpOwogICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKQEAgLTE4MCw3ICsxNzIsNyBAQAogICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKICAgICAgIGxvbmdEZWZhdWx0c1RvTmVnYXRpdmVTZXZlbiA9IF9haWRsX3BhcmNlbC5yZWFkTG9uZygpOwogICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKLSAgICAgIGJvb2xlYW5EZWZhdWx0c1RvVHJ1ZSA9ICgwIT1fYWlkbF9wYXJjZWwucmVhZEludCgpKTsKKyAgICAgIGJvb2xlYW5EZWZhdWx0c1RvVHJ1ZSA9IF9haWRsX3BhcmNlbC5yZWFkQm9vbGVhbigpOwogICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKICAgICAgIGNoYXJEZWZhdWx0c1RvQyA9IChjaGFyKV9haWRsX3BhcmNlbC5yZWFkSW50KCk7CiAgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOwpAQCAtMTkyLDcgKzE4NCw3IEBACiAgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOwogICAgICAgYXJyYXlEZWZhdWx0c1RvRW1wdHkgPSBfYWlkbF9wYXJjZWwuY3JlYXRlSW50QXJyYXkoKTsKICAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47Ci0gICAgICBib29sRGVmYXVsdCA9ICgwIT1fYWlkbF9wYXJjZWwucmVhZEludCgpKTsKKyAgICAgIGJvb2xEZWZhdWx0ID0gX2FpZGxfcGFyY2VsLnJlYWRCb29sZWFuKCk7CiAgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOwogICAgICAgYnl0ZURlZmF1bHQgPSBfYWlkbF9wYXJjZWwucmVhZEJ5dGUoKTsKICAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CkBAIC0yMjAsNiArMjEyLDEwIEBACiAgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOwogICAgICAgaWJpbmRlciA9IF9haWRsX3BhcmNlbC5yZWFkU3Ryb25nQmluZGVyKCk7CiAgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgZW1wdHkgPSBfYWlkbF9wYXJjZWwucmVhZFR5cGVkT2JqZWN0KGFuZHJvaWQuYWlkbC50ZXN0cy5TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5FbXB0eS5DUkVBVE9SKTsKKyAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICBpbnQ4XzEgPSBfYWlkbF9wYXJjZWwuY3JlYXRlQnl0ZUFycmF5KCk7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOwogICAgICAgaW50MzJfMSA9IF9haWRsX3BhcmNlbC5jcmVhdGVJbnRBcnJheSgpOwogICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKICAgICAgIGludDY0XzEgPSBfYWlkbF9wYXJjZWwuY3JlYXRlTG9uZ0FycmF5KCk7CkBAIC0yNTQsMTkgKzI1MCw5IEBACiAgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOwogICAgICAgc2hvdWxkU2V0Qml0MEFuZEJpdDIgPSBfYWlkbF9wYXJjZWwucmVhZEludCgpOwogICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKLSAgICAgIGlmICgoMCE9X2FpZGxfcGFyY2VsLnJlYWRJbnQoKSkpIHsKLSAgICAgICAgdSA9IGFuZHJvaWQuYWlkbC50ZXN0cy5Vbmlvbi5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoX2FpZGxfcGFyY2VsKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICB1ID0gbnVsbDsKLSAgICAgIH0KKyAgICAgIHUgPSBfYWlkbF9wYXJjZWwucmVhZFR5cGVkT2JqZWN0KGFuZHJvaWQuYWlkbC50ZXN0cy5Vbmlvbi5DUkVBVE9SKTsKICAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47Ci0gICAgICBpZiAoKDAhPV9haWRsX3BhcmNlbC5yZWFkSW50KCkpKSB7Ci0gICAgICAgIHNob3VsZEJlQ29uc3RTMSA9IGFuZHJvaWQuYWlkbC50ZXN0cy5Vbmlvbi5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoX2FpZGxfcGFyY2VsKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBzaG91bGRCZUNvbnN0UzEgPSBudWxsOwotICAgICAgfQorICAgICAgc2hvdWxkQmVDb25zdFMxID0gX2FpZGxfcGFyY2VsLnJlYWRUeXBlZE9iamVjdChhbmRyb2lkLmFpZGwudGVzdHMuVW5pb24uQ1JFQVRPUik7CiAgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOwogICAgICAgZGVmYXVsdFdpdGhGb28gPSBfYWlkbF9wYXJjZWwucmVhZEludCgpOwogICAgIH0gZmluYWxseSB7CkBAIC0yODYsMTAgKzI3MiwxMCBAQAogICAgIF9haWRsX3NqLmFkZCgiZjogIiArIChmKSk7CiAgICAgX2FpZGxfc2ouYWRkKCJzaG91bGRCZUplcnJ5OiAiICsgKGphdmEudXRpbC5PYmplY3RzLnRvU3RyaW5nKHNob3VsZEJlSmVycnkpKSk7CiAgICAgX2FpZGxfc2ouYWRkKCJzaG91bGRCZUJ5dGVCYXI6ICIgKyAoc2hvdWxkQmVCeXRlQmFyKSk7Ci0gICAgX2FpZGxfc2ouYWRkKCJzaG91bGRCZUludEJhcjogIiArIChzaG91bGRCZUludEJhcikpOworICAgIF9haWRsX3NqLmFkZCgic2hvdWxkQmVJbnRCYXI6ICIgKyAoYW5kcm9pZC5haWRsLnRlc3RzLkludEVudW0uJC50b1N0cmluZyhzaG91bGRCZUludEJhcikpKTsKICAgICBfYWlkbF9zai5hZGQoInNob3VsZEJlTG9uZ0JhcjogIiArIChzaG91bGRCZUxvbmdCYXIpKTsKICAgICBfYWlkbF9zai5hZGQoInNob3VsZENvbnRhaW5Ud29CeXRlRm9vczogIiArIChqYXZhLnV0aWwuQXJyYXlzLnRvU3RyaW5nKHNob3VsZENvbnRhaW5Ud29CeXRlRm9vcykpKTsKLSAgICBfYWlkbF9zai5hZGQoInNob3VsZENvbnRhaW5Ud29JbnRGb29zOiAiICsgKGphdmEudXRpbC5BcnJheXMudG9TdHJpbmcoc2hvdWxkQ29udGFpblR3b0ludEZvb3MpKSk7CisgICAgX2FpZGxfc2ouYWRkKCJzaG91bGRDb250YWluVHdvSW50Rm9vczogIiArIChhbmRyb2lkLmFpZGwudGVzdHMuSW50RW51bS4kLmFycmF5VG9TdHJpbmcoc2hvdWxkQ29udGFpblR3b0ludEZvb3MpKSk7CiAgICAgX2FpZGxfc2ouYWRkKCJzaG91bGRDb250YWluVHdvTG9uZ0Zvb3M6ICIgKyAoamF2YS51dGlsLkFycmF5cy50b1N0cmluZyhzaG91bGRDb250YWluVHdvTG9uZ0Zvb3MpKSk7CiAgICAgX2FpZGxfc2ouYWRkKCJzdHJpbmdEZWZhdWx0c1RvRm9vOiAiICsgKGphdmEudXRpbC5PYmplY3RzLnRvU3RyaW5nKHN0cmluZ0RlZmF1bHRzVG9Gb28pKSk7CiAgICAgX2FpZGxfc2ouYWRkKCJieXRlRGVmYXVsdHNUb0ZvdXI6ICIgKyAoYnl0ZURlZmF1bHRzVG9Gb3VyKSk7CkBAIC0zMTUsNiArMzAxLDggQEAKICAgICBfYWlkbF9zai5hZGQoImludDY0X21heDogIiArIChpbnQ2NF9tYXgpKTsKICAgICBfYWlkbF9zai5hZGQoImhleEludDMyX25lZ18xOiAiICsgKGhleEludDMyX25lZ18xKSk7CiAgICAgX2FpZGxfc2ouYWRkKCJpYmluZGVyOiAiICsgKGphdmEudXRpbC5PYmplY3RzLnRvU3RyaW5nKGliaW5kZXIpKSk7CisgICAgX2FpZGxfc2ouYWRkKCJlbXB0eTogIiArIChqYXZhLnV0aWwuT2JqZWN0cy50b1N0cmluZyhlbXB0eSkpKTsKKyAgICBfYWlkbF9zai5hZGQoImludDhfMTogIiArIChqYXZhLnV0aWwuQXJyYXlzLnRvU3RyaW5nKGludDhfMSkpKTsKICAgICBfYWlkbF9zai5hZGQoImludDMyXzE6ICIgKyAoamF2YS51dGlsLkFycmF5cy50b1N0cmluZyhpbnQzMl8xKSkpOwogICAgIF9haWRsX3NqLmFkZCgiaW50NjRfMTogIiArIChqYXZhLnV0aWwuQXJyYXlzLnRvU3RyaW5nKGludDY0XzEpKSk7CiAgICAgX2FpZGxfc2ouYWRkKCJoZXhJbnQzMl9wb3NfMTogIiArIChoZXhJbnQzMl9wb3NfMSkpOwpAQCAtMzM0LDcgKzMyMiw3IEBACiAgICAgX2FpZGxfc2ouYWRkKCJzaG91bGRTZXRCaXQwQW5kQml0MjogIiArIChzaG91bGRTZXRCaXQwQW5kQml0MikpOwogICAgIF9haWRsX3NqLmFkZCgidTogIiArIChqYXZhLnV0aWwuT2JqZWN0cy50b1N0cmluZyh1KSkpOwogICAgIF9haWRsX3NqLmFkZCgic2hvdWxkQmVDb25zdFMxOiAiICsgKGphdmEudXRpbC5PYmplY3RzLnRvU3RyaW5nKHNob3VsZEJlQ29uc3RTMSkpKTsKLSAgICBfYWlkbF9zai5hZGQoImRlZmF1bHRXaXRoRm9vOiAiICsgKGRlZmF1bHRXaXRoRm9vKSk7CisgICAgX2FpZGxfc2ouYWRkKCJkZWZhdWx0V2l0aEZvbzogIiArIChhbmRyb2lkLmFpZGwudGVzdHMuSW50RW51bS4kLnRvU3RyaW5nKGRlZmF1bHRXaXRoRm9vKSkpOwogICAgIHJldHVybiAiYW5kcm9pZC5haWRsLnRlc3RzLlN0cnVjdHVyZWRQYXJjZWxhYmxlIiArIF9haWRsX3NqLnRvU3RyaW5nKCkgIDsKICAgfQogICBAT3ZlcnJpZGUKQEAgLTM3Niw2ICszNjQsOCBAQAogICAgIGlmICghamF2YS51dGlsLk9iamVjdHMuZGVlcEVxdWFscyhpbnQ2NF9tYXgsIHRoYXQuaW50NjRfbWF4KSkgcmV0dXJuIGZhbHNlOwogICAgIGlmICghamF2YS51dGlsLk9iamVjdHMuZGVlcEVxdWFscyhoZXhJbnQzMl9uZWdfMSwgdGhhdC5oZXhJbnQzMl9uZWdfMSkpIHJldHVybiBmYWxzZTsKICAgICBpZiAoIWphdmEudXRpbC5PYmplY3RzLmRlZXBFcXVhbHMoaWJpbmRlciwgdGhhdC5pYmluZGVyKSkgcmV0dXJuIGZhbHNlOworICAgIGlmICghamF2YS51dGlsLk9iamVjdHMuZGVlcEVxdWFscyhlbXB0eSwgdGhhdC5lbXB0eSkpIHJldHVybiBmYWxzZTsKKyAgICBpZiAoIWphdmEudXRpbC5PYmplY3RzLmRlZXBFcXVhbHMoaW50OF8xLCB0aGF0LmludDhfMSkpIHJldHVybiBmYWxzZTsKICAgICBpZiAoIWphdmEudXRpbC5PYmplY3RzLmRlZXBFcXVhbHMoaW50MzJfMSwgdGhhdC5pbnQzMl8xKSkgcmV0dXJuIGZhbHNlOwogICAgIGlmICghamF2YS51dGlsLk9iamVjdHMuZGVlcEVxdWFscyhpbnQ2NF8xLCB0aGF0LmludDY0XzEpKSByZXR1cm4gZmFsc2U7CiAgICAgaWYgKCFqYXZhLnV0aWwuT2JqZWN0cy5kZWVwRXF1YWxzKGhleEludDMyX3Bvc18xLCB0aGF0LmhleEludDMyX3Bvc18xKSkgcmV0dXJuIGZhbHNlOwpAQCAtNDAxLDExICszOTEsMTIgQEAKIAogICBAT3ZlcnJpZGUKICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICByZXR1cm4gamF2YS51dGlsLkFycmF5cy5kZWVwSGFzaENvZGUoamF2YS51dGlsLkFycmF5cy5hc0xpc3Qoc2hvdWxkQ29udGFpblRocmVlRnMsIGYsIHNob3VsZEJlSmVycnksIHNob3VsZEJlQnl0ZUJhciwgc2hvdWxkQmVJbnRCYXIsIHNob3VsZEJlTG9uZ0Jhciwgc2hvdWxkQ29udGFpblR3b0J5dGVGb29zLCBzaG91bGRDb250YWluVHdvSW50Rm9vcywgc2hvdWxkQ29udGFpblR3b0xvbmdGb29zLCBzdHJpbmdEZWZhdWx0c1RvRm9vLCBieXRlRGVmYXVsdHNUb0ZvdXIsIGludERlZmF1bHRzVG9GaXZlLCBsb25nRGVmYXVsdHNUb05lZ2F0aXZlU2V2ZW4sIGJvb2xlYW5EZWZhdWx0c1RvVHJ1ZSwgY2hhckRlZmF1bHRzVG9DLCBmbG9hdERlZmF1bHRzVG9QaSwgZG91YmxlV2l0aERlZmF1bHQsIGFycmF5RGVmYXVsdHNUbzEyMywgYXJyYXlEZWZhdWx0c1RvRW1wdHksIGJvb2xEZWZhdWx0LCBieXRlRGVmYXVsdCwgaW50RGVmYXVsdCwgbG9uZ0RlZmF1bHQsIGZsb2F0RGVmYXVsdCwgZG91YmxlRGVmYXVsdCwgY2hlY2tEb3VibGVGcm9tRmxvYXQsIGNoZWNrU3RyaW5nQXJyYXkxLCBjaGVja1N0cmluZ0FycmF5MiwgaW50MzJfbWluLCBpbnQzMl9tYXgsIGludDY0X21heCwgaGV4SW50MzJfbmVnXzEsIGliaW5kZXIsIGludDMyXzEsIGludDY0XzEsIGhleEludDMyX3Bvc18xLCBoZXhJbnQ2NF9wb3NfMSwgY29uc3RfZXhwcnNfMSwgY29uc3RfZXhwcnNfMiwgY29uc3RfZXhwcnNfMywgY29uc3RfZXhwcnNfNCwgY29uc3RfZXhwcnNfNSwgY29uc3RfZXhwcnNfNiwgY29uc3RfZXhwcnNfNywgY29uc3RfZXhwcnNfOCwgY29uc3RfZXhwcnNfOSwgY29uc3RfZXhwcnNfMTAsIGFkZFN0cmluZzEsIGFkZFN0cmluZzIsIHNob3VsZFNldEJpdDBBbmRCaXQyLCB1LCBzaG91bGRCZUNvbnN0UzEsIGRlZmF1bHRXaXRoRm9vKS50b0FycmF5KCkpOworICAgIHJldHVybiBqYXZhLnV0aWwuQXJyYXlzLmRlZXBIYXNoQ29kZShqYXZhLnV0aWwuQXJyYXlzLmFzTGlzdChzaG91bGRDb250YWluVGhyZWVGcywgZiwgc2hvdWxkQmVKZXJyeSwgc2hvdWxkQmVCeXRlQmFyLCBzaG91bGRCZUludEJhciwgc2hvdWxkQmVMb25nQmFyLCBzaG91bGRDb250YWluVHdvQnl0ZUZvb3MsIHNob3VsZENvbnRhaW5Ud29JbnRGb29zLCBzaG91bGRDb250YWluVHdvTG9uZ0Zvb3MsIHN0cmluZ0RlZmF1bHRzVG9Gb28sIGJ5dGVEZWZhdWx0c1RvRm91ciwgaW50RGVmYXVsdHNUb0ZpdmUsIGxvbmdEZWZhdWx0c1RvTmVnYXRpdmVTZXZlbiwgYm9vbGVhbkRlZmF1bHRzVG9UcnVlLCBjaGFyRGVmYXVsdHNUb0MsIGZsb2F0RGVmYXVsdHNUb1BpLCBkb3VibGVXaXRoRGVmYXVsdCwgYXJyYXlEZWZhdWx0c1RvMTIzLCBhcnJheURlZmF1bHRzVG9FbXB0eSwgYm9vbERlZmF1bHQsIGJ5dGVEZWZhdWx0LCBpbnREZWZhdWx0LCBsb25nRGVmYXVsdCwgZmxvYXREZWZhdWx0LCBkb3VibGVEZWZhdWx0LCBjaGVja0RvdWJsZUZyb21GbG9hdCwgY2hlY2tTdHJpbmdBcnJheTEsIGNoZWNrU3RyaW5nQXJyYXkyLCBpbnQzMl9taW4sIGludDMyX21heCwgaW50NjRfbWF4LCBoZXhJbnQzMl9uZWdfMSwgaWJpbmRlciwgZW1wdHksIGludDhfMSwgaW50MzJfMSwgaW50NjRfMSwgaGV4SW50MzJfcG9zXzEsIGhleEludDY0X3Bvc18xLCBjb25zdF9leHByc18xLCBjb25zdF9leHByc18yLCBjb25zdF9leHByc18zLCBjb25zdF9leHByc180LCBjb25zdF9leHByc181LCBjb25zdF9leHByc182LCBjb25zdF9leHByc183LCBjb25zdF9leHByc184LCBjb25zdF9leHByc185LCBjb25zdF9leHByc18xMCwgYWRkU3RyaW5nMSwgYWRkU3RyaW5nMiwgc2hvdWxkU2V0Qml0MEFuZEJpdDIsIHUsIHNob3VsZEJlQ29uc3RTMSwgZGVmYXVsdFdpdGhGb28pLnRvQXJyYXkoKSk7CiAgIH0KICAgQE92ZXJyaWRlCiAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKICAgICBpbnQgX21hc2sgPSAwOworICAgIF9tYXNrIHw9IGRlc2NyaWJlQ29udGVudHMoZW1wdHkpOwogICAgIF9tYXNrIHw9IGRlc2NyaWJlQ29udGVudHModSk7CiAgICAgX21hc2sgfD0gZGVzY3JpYmVDb250ZW50cyhzaG91bGRCZUNvbnN0UzEpOwogICAgIHJldHVybiBfbWFzazsKQEAgLTQxNyw0ICs0MDgsNjUgQEAKICAgICB9CiAgICAgcmV0dXJuIDA7CiAgIH0KKyAgLy8gTWFrZSBzdXJlIHdlIGNhbiBzZW5kIGFuIGVtcHR5IHBhcmNlbGFibGUKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBFbXB0eSBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZQorICB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm9zLlBhcmNlbGFibGUuQ3JlYXRvcjxFbXB0eT4gQ1JFQVRPUiA9IG5ldyBhbmRyb2lkLm9zLlBhcmNlbGFibGUuQ3JlYXRvcjxFbXB0eT4oKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBFbXB0eSBjcmVhdGVGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3NvdXJjZSkgeworICAgICAgICBFbXB0eSBfYWlkbF9vdXQgPSBuZXcgRW1wdHkoKTsKKyAgICAgICAgX2FpZGxfb3V0LnJlYWRGcm9tUGFyY2VsKF9haWRsX3NvdXJjZSk7CisgICAgICAgIHJldHVybiBfYWlkbF9vdXQ7CisgICAgICB9CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBFbXB0eVtdIG5ld0FycmF5KGludCBfYWlkbF9zaXplKSB7CisgICAgICAgIHJldHVybiBuZXcgRW1wdHlbX2FpZGxfc2l6ZV07CisgICAgICB9CisgICAgfTsKKyAgICBAT3ZlcnJpZGUgcHVibGljIGZpbmFsIHZvaWQgd3JpdGVUb1BhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9wYXJjZWwsIGludCBfYWlkbF9mbGFnKQorICAgIHsKKyAgICAgIGludCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCk7CisgICAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoMCk7CisgICAgICBpbnQgX2FpZGxfZW5kX3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKKyAgICAgIF9haWRsX3BhcmNlbC5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zKTsKKyAgICAgIF9haWRsX3BhcmNlbC53cml0ZUludChfYWlkbF9lbmRfcG9zIC0gX2FpZGxfc3RhcnRfcG9zKTsKKyAgICAgIF9haWRsX3BhcmNlbC5zZXREYXRhUG9zaXRpb24oX2FpZGxfZW5kX3Bvcyk7CisgICAgfQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJlYWRGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3BhcmNlbCkKKyAgICB7CisgICAgICBpbnQgX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpOworICAgICAgaW50IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IF9haWRsX3BhcmNlbC5yZWFkSW50KCk7CisgICAgICB0cnkgeworICAgICAgICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9zaXplIDwgNCkgdGhyb3cgbmV3IGFuZHJvaWQub3MuQmFkUGFyY2VsYWJsZUV4Y2VwdGlvbigiUGFyY2VsYWJsZSB0b28gc21hbGwiKTs7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gKEludGVnZXIuTUFYX1ZBTFVFIC0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSkgeworICAgICAgICAgIHRocm93IG5ldyBhbmRyb2lkLm9zLkJhZFBhcmNlbGFibGVFeGNlcHRpb24oIk92ZXJmbG93IGluIHRoZSBzaXplIG9mIHBhcmNlbGFibGUiKTsKKyAgICAgICAgfQorICAgICAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgICB9CisgICAgfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICBqYXZhLnV0aWwuU3RyaW5nSm9pbmVyIF9haWRsX3NqID0gbmV3IGphdmEudXRpbC5TdHJpbmdKb2luZXIoIiwgIiwgInsiLCAifSIpOworICAgICAgcmV0dXJuICJhbmRyb2lkLmFpZGwudGVzdHMuU3RydWN0dXJlZFBhcmNlbGFibGUuRW1wdHkiICsgX2FpZGxfc2oudG9TdHJpbmcoKSAgOworICAgIH0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7CisgICAgICBpZiAodGhpcyA9PSBvdGhlcikgcmV0dXJuIHRydWU7CisgICAgICBpZiAob3RoZXIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBFbXB0eSkpIHJldHVybiBmYWxzZTsKKyAgICAgIEVtcHR5IHRoYXQgPSAoRW1wdHkpb3RoZXI7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgcmV0dXJuIGphdmEudXRpbC5BcnJheXMuZGVlcEhhc2hDb2RlKGphdmEudXRpbC5BcnJheXMuYXNMaXN0KCkudG9BcnJheSgpKTsKKyAgICB9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgICAgaW50IF9tYXNrID0gMDsKKyAgICAgIHJldHVybiBfbWFzazsKKyAgICB9CisgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1VuaW9uLmphdmEgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9Vbmlvbi5qYXZhCmluZGV4IDJlMWRlZjIuLjAxODg5OGEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1VuaW9uLmphdmEKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb24uamF2YQpAQCAtMiw3ICsyLDYgQEAKICAqIFRoaXMgZmlsZSBpcyBhdXRvLWdlbmVyYXRlZC4gIERPIE5PVCBNT0RJRlkuCiAgKi8KIHBhY2thZ2UgYW5kcm9pZC5haWRsLnRlc3RzOwotCiBwdWJsaWMgZmluYWwgY2xhc3MgVW5pb24gaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUgewogICAvLyB0YWdzIGZvciB1bmlvbiBmaWVsZHMKICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgbnMgPSAwOyAgLy8gaW50W10gbnM7CkBAIC0yODQsNCArMjgzLDEzIEBACiAgICAgdGhpcy5fdGFnID0gX3RhZzsKICAgICB0aGlzLl92YWx1ZSA9IF92YWx1ZTsKICAgfQorICBwdWJsaWMgc3RhdGljIEBpbnRlcmZhY2UgVGFnIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBucyA9IDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbiA9IDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbSA9IDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcyA9IDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWJpbmRlciA9IDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3MgPSA1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJlID0gNjsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb25XaXRoRmQuamF2YSBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1VuaW9uV2l0aEZkLmphdmEKaW5kZXggYmEwMjVhZC4uNjNhNWYxYSAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb25XaXRoRmQuamF2YQorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9VbmlvbldpdGhGZC5qYXZhCkBAIC0yLDcgKzIsNiBAQAogICogVGhpcyBmaWxlIGlzIGF1dG8tZ2VuZXJhdGVkLiAgRE8gTk9UIE1PRElGWS4KICAqLwogcGFja2FnZSBhbmRyb2lkLmFpZGwudGVzdHM7Ci0KIHB1YmxpYyBmaW5hbCBjbGFzcyBVbmlvbldpdGhGZCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSB7CiAgIC8vIHRhZ3MgZm9yIHVuaW9uIGZpZWxkcwogICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBudW0gPSAwOyAgLy8gaW50IG51bTsKQEAgLTc5LDEzICs3OCw3IEBACiAgICAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoZ2V0TnVtKCkpOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSBwZmQ6Ci0gICAgICBpZiAoKGdldFBmZCgpIT1udWxsKSkgewotICAgICAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoMSk7Ci0gICAgICAgIGdldFBmZCgpLndyaXRlVG9QYXJjZWwoX2FpZGxfcGFyY2VsLCAwKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoMCk7Ci0gICAgICB9CisgICAgICBfYWlkbF9wYXJjZWwud3JpdGVUeXBlZE9iamVjdChnZXRQZmQoKSwgX2FpZGxfZmxhZyk7CiAgICAgICBicmVhazsKICAgICB9CiAgIH0KQEAgLTEwMSwxMiArOTQsNyBAQAogICAgICAgcmV0dXJuOyB9CiAgICAgY2FzZSBwZmQ6IHsKICAgICAgIGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3IgX2FpZGxfdmFsdWU7Ci0gICAgICBpZiAoKDAhPV9haWRsX3BhcmNlbC5yZWFkSW50KCkpKSB7Ci0gICAgICAgIF9haWRsX3ZhbHVlID0gYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvci5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoX2FpZGxfcGFyY2VsKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBfYWlkbF92YWx1ZSA9IG51bGw7Ci0gICAgICB9CisgICAgICBfYWlkbF92YWx1ZSA9IF9haWRsX3BhcmNlbC5yZWFkVHlwZWRPYmplY3QoYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvci5DUkVBVE9SKTsKICAgICAgIF9zZXQoX2FpZGxfdGFnLCBfYWlkbF92YWx1ZSk7CiAgICAgICByZXR1cm47IH0KICAgICB9CkBAIC0xNDksNCArMTM3LDggQEAKICAgICB0aGlzLl90YWcgPSBfdGFnOwogICAgIHRoaXMuX3ZhbHVlID0gX3ZhbHVlOwogICB9CisgIHB1YmxpYyBzdGF0aWMgQGludGVyZmFjZSBUYWcgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG51bSA9IDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGZkID0gMTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0V4dGVuZGFibGVQYXJjZWxhYmxlLmphdmEgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vRXh0ZW5kYWJsZVBhcmNlbGFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Njk2NDlmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0V4dGVuZGFibGVQYXJjZWxhYmxlLmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBhdXRvLWdlbmVyYXRlZC4gIERPIE5PVCBNT0RJRlkuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5haWRsLnRlc3RzLmV4dGVuc2lvbjsKK3B1YmxpYyBjbGFzcyBFeHRlbmRhYmxlUGFyY2VsYWJsZSBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZQoreworICBwdWJsaWMgaW50IGEgPSAwOworICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBiOworICBwdWJsaWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlSG9sZGVyIGV4dCA9IG5ldyBhbmRyb2lkLm9zLlBhcmNlbGFibGVIb2xkZXIoYW5kcm9pZC5vcy5QYXJjZWxhYmxlLlBBUkNFTEFCTEVfU1RBQklMSVRZX0xPQ0FMKTsKKyAgcHVibGljIGxvbmcgYyA9IDBMOworICBwdWJsaWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlSG9sZGVyIGV4dDIgPSBuZXcgYW5kcm9pZC5vcy5QYXJjZWxhYmxlSG9sZGVyKGFuZHJvaWQub3MuUGFyY2VsYWJsZS5QQVJDRUxBQkxFX1NUQUJJTElUWV9MT0NBTCk7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3I8RXh0ZW5kYWJsZVBhcmNlbGFibGU+IENSRUFUT1IgPSBuZXcgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3I8RXh0ZW5kYWJsZVBhcmNlbGFibGU+KCkgeworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBFeHRlbmRhYmxlUGFyY2VsYWJsZSBjcmVhdGVGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3NvdXJjZSkgeworICAgICAgRXh0ZW5kYWJsZVBhcmNlbGFibGUgX2FpZGxfb3V0ID0gbmV3IEV4dGVuZGFibGVQYXJjZWxhYmxlKCk7CisgICAgICBfYWlkbF9vdXQucmVhZEZyb21QYXJjZWwoX2FpZGxfc291cmNlKTsKKyAgICAgIHJldHVybiBfYWlkbF9vdXQ7CisgICAgfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBFeHRlbmRhYmxlUGFyY2VsYWJsZVtdIG5ld0FycmF5KGludCBfYWlkbF9zaXplKSB7CisgICAgICByZXR1cm4gbmV3IEV4dGVuZGFibGVQYXJjZWxhYmxlW19haWRsX3NpemVdOworICAgIH0KKyAgfTsKKyAgQE92ZXJyaWRlIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlVG9QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgX2FpZGxfcGFyY2VsLCBpbnQgX2FpZGxfZmxhZykKKyAgeworICAgIGludCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCk7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KDApOworICAgIF9haWRsX3BhcmNlbC53cml0ZUludChhKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVTdHJpbmcoYik7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlVHlwZWRPYmplY3QoZXh0LCAwKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVMb25nKGMpOworICAgIF9haWRsX3BhcmNlbC53cml0ZVR5cGVkT2JqZWN0KGV4dDIsIDApOworICAgIGludCBfYWlkbF9lbmRfcG9zID0gX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpOworICAgIF9haWRsX3BhcmNlbC5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgICAgX2FpZGxfcGFyY2VsLnNldERhdGFQb3NpdGlvbihfYWlkbF9lbmRfcG9zKTsKKyAgfQorICBwdWJsaWMgZmluYWwgdm9pZCByZWFkRnJvbVBhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9wYXJjZWwpCisgIHsKKyAgICBpbnQgX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpOworICAgIGludCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSBfYWlkbF9wYXJjZWwucmVhZEludCgpOworICAgIHRyeSB7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9zaXplIDwgNCkgdGhyb3cgbmV3IGFuZHJvaWQub3MuQmFkUGFyY2VsYWJsZUV4Y2VwdGlvbigiUGFyY2VsYWJsZSB0b28gc21hbGwiKTs7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgYSA9IF9haWRsX3BhcmNlbC5yZWFkSW50KCk7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgYiA9IF9haWRsX3BhcmNlbC5yZWFkU3RyaW5nKCk7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgaWYgKCgwIT1fYWlkbF9wYXJjZWwucmVhZEludCgpKSkgeworICAgICAgICBleHQucmVhZEZyb21QYXJjZWwoX2FpZGxfcGFyY2VsKTsKKyAgICAgIH0KKyAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICBjID0gX2FpZGxfcGFyY2VsLnJlYWRMb25nKCk7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgaWYgKCgwIT1fYWlkbF9wYXJjZWwucmVhZEludCgpKSkgeworICAgICAgICBleHQyLnJlYWRGcm9tUGFyY2VsKF9haWRsX3BhcmNlbCk7CisgICAgICB9CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGlmIChfYWlkbF9zdGFydF9wb3MgPiAoSW50ZWdlci5NQVhfVkFMVUUgLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpKSB7CisgICAgICAgIHRocm93IG5ldyBhbmRyb2lkLm9zLkJhZFBhcmNlbGFibGVFeGNlcHRpb24oIk92ZXJmbG93IGluIHRoZSBzaXplIG9mIHBhcmNlbGFibGUiKTsKKyAgICAgIH0KKyAgICAgIF9haWRsX3BhcmNlbC5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICB9CisgIH0KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKKyAgICBpbnQgX21hc2sgPSAwOworICAgIF9tYXNrIHw9IGRlc2NyaWJlQ29udGVudHMoZXh0KTsKKyAgICBfbWFzayB8PSBkZXNjcmliZUNvbnRlbnRzKGV4dDIpOworICAgIHJldHVybiBfbWFzazsKKyAgfQorICBwcml2YXRlIGludCBkZXNjcmliZUNvbnRlbnRzKE9iamVjdCBfdikgeworICAgIGlmIChfdiA9PSBudWxsKSByZXR1cm4gMDsKKyAgICBpZiAoX3YgaW5zdGFuY2VvZiBhbmRyb2lkLm9zLlBhcmNlbGFibGUpIHsKKyAgICAgIHJldHVybiAoKGFuZHJvaWQub3MuUGFyY2VsYWJsZSkgX3YpLmRlc2NyaWJlQ29udGVudHMoKTsKKyAgICB9CisgICAgcmV0dXJuIDA7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9FeHRlbmRhYmxlUGFyY2VsYWJsZS5qYXZhLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vRXh0ZW5kYWJsZVBhcmNlbGFibGUuamF2YS5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZWUxMTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vRXh0ZW5kYWJsZVBhcmNlbGFibGUuamF2YS5kCkBAIC0wLDAgKzEsMiBAQAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vRXh0ZW5kYWJsZVBhcmNlbGFibGUuamF2YSA6IFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9FeHRlbmRhYmxlUGFyY2VsYWJsZS5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQuamF2YSBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNTZiOTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKgorICogVGhpcyBmaWxlIGlzIGF1dG8tZ2VuZXJhdGVkLiAgRE8gTk9UIE1PRElGWS4KKyAqLworcGFja2FnZSBhbmRyb2lkLmFpZGwudGVzdHMuZXh0ZW5zaW9uOworcHVibGljIGNsYXNzIE15RXh0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlCit7CisgIHB1YmxpYyBpbnQgYSA9IDA7CisgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGI7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3I8TXlFeHQ+IENSRUFUT1IgPSBuZXcgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3I8TXlFeHQ+KCkgeworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNeUV4dCBjcmVhdGVGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3NvdXJjZSkgeworICAgICAgTXlFeHQgX2FpZGxfb3V0ID0gbmV3IE15RXh0KCk7CisgICAgICBfYWlkbF9vdXQucmVhZEZyb21QYXJjZWwoX2FpZGxfc291cmNlKTsKKyAgICAgIHJldHVybiBfYWlkbF9vdXQ7CisgICAgfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNeUV4dFtdIG5ld0FycmF5KGludCBfYWlkbF9zaXplKSB7CisgICAgICByZXR1cm4gbmV3IE15RXh0W19haWRsX3NpemVdOworICAgIH0KKyAgfTsKKyAgQE92ZXJyaWRlIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlVG9QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgX2FpZGxfcGFyY2VsLCBpbnQgX2FpZGxfZmxhZykKKyAgeworICAgIGludCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCk7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KDApOworICAgIF9haWRsX3BhcmNlbC53cml0ZUludChhKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVTdHJpbmcoYik7CisgICAgaW50IF9haWRsX2VuZF9wb3MgPSBfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCk7CisgICAgX2FpZGxfcGFyY2VsLnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MpOworICAgIF9haWRsX3BhcmNlbC53cml0ZUludChfYWlkbF9lbmRfcG9zIC0gX2FpZGxfc3RhcnRfcG9zKTsKKyAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX2VuZF9wb3MpOworICB9CisgIHB1YmxpYyBmaW5hbCB2b2lkIHJlYWRGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3BhcmNlbCkKKyAgeworICAgIGludCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCk7CisgICAgaW50IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IF9haWRsX3BhcmNlbC5yZWFkSW50KCk7CisgICAgdHJ5IHsKKyAgICAgIGlmIChfYWlkbF9wYXJjZWxhYmxlX3NpemUgPCA0KSB0aHJvdyBuZXcgYW5kcm9pZC5vcy5CYWRQYXJjZWxhYmxlRXhjZXB0aW9uKCJQYXJjZWxhYmxlIHRvbyBzbWFsbCIpOzsKKyAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICBhID0gX2FpZGxfcGFyY2VsLnJlYWRJbnQoKTsKKyAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICBiID0gX2FpZGxfcGFyY2VsLnJlYWRTdHJpbmcoKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgaWYgKF9haWRsX3N0YXJ0X3BvcyA+IChJbnRlZ2VyLk1BWF9WQUxVRSAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkpIHsKKyAgICAgICAgdGhyb3cgbmV3IGFuZHJvaWQub3MuQmFkUGFyY2VsYWJsZUV4Y2VwdGlvbigiT3ZlcmZsb3cgaW4gdGhlIHNpemUgb2YgcGFyY2VsYWJsZSIpOworICAgICAgfQorICAgICAgX2FpZGxfcGFyY2VsLnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIH0KKyAgfQorICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgIGludCBfbWFzayA9IDA7CisgICAgcmV0dXJuIF9tYXNrOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQuamF2YS5kIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0LmphdmEuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTFlZmI5NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dC5qYXZhLmQKQEAgLTAsMCArMSwyIEBACitvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dC5qYXZhIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0LmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dDIuamF2YSBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dDIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDNiZjU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0Mi5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXV0by1nZW5lcmF0ZWQuICBETyBOT1QgTU9ESUZZLgorICovCitwYWNrYWdlIGFuZHJvaWQuYWlkbC50ZXN0cy5leHRlbnNpb247CitwdWJsaWMgY2xhc3MgTXlFeHQyIGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlCit7CisgIHB1YmxpYyBpbnQgYSA9IDA7CisgIHB1YmxpYyBhbmRyb2lkLmFpZGwudGVzdHMuZXh0ZW5zaW9uLk15RXh0IGI7CisgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGM7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3I8TXlFeHQyPiBDUkVBVE9SID0gbmV3IGFuZHJvaWQub3MuUGFyY2VsYWJsZS5DcmVhdG9yPE15RXh0Mj4oKSB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE15RXh0MiBjcmVhdGVGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3NvdXJjZSkgeworICAgICAgTXlFeHQyIF9haWRsX291dCA9IG5ldyBNeUV4dDIoKTsKKyAgICAgIF9haWRsX291dC5yZWFkRnJvbVBhcmNlbChfYWlkbF9zb3VyY2UpOworICAgICAgcmV0dXJuIF9haWRsX291dDsKKyAgICB9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE15RXh0MltdIG5ld0FycmF5KGludCBfYWlkbF9zaXplKSB7CisgICAgICByZXR1cm4gbmV3IE15RXh0MltfYWlkbF9zaXplXTsKKyAgICB9CisgIH07CisgIEBPdmVycmlkZSBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZVRvUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3BhcmNlbCwgaW50IF9haWRsX2ZsYWcpCisgIHsKKyAgICBpbnQgX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpOworICAgIF9haWRsX3BhcmNlbC53cml0ZUludCgwKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoYSk7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlVHlwZWRPYmplY3QoYiwgX2FpZGxfZmxhZyk7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlU3RyaW5nKGMpOworICAgIGludCBfYWlkbF9lbmRfcG9zID0gX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpOworICAgIF9haWRsX3BhcmNlbC5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgICAgX2FpZGxfcGFyY2VsLnNldERhdGFQb3NpdGlvbihfYWlkbF9lbmRfcG9zKTsKKyAgfQorICBwdWJsaWMgZmluYWwgdm9pZCByZWFkRnJvbVBhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9wYXJjZWwpCisgIHsKKyAgICBpbnQgX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpOworICAgIGludCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSBfYWlkbF9wYXJjZWwucmVhZEludCgpOworICAgIHRyeSB7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9zaXplIDwgNCkgdGhyb3cgbmV3IGFuZHJvaWQub3MuQmFkUGFyY2VsYWJsZUV4Y2VwdGlvbigiUGFyY2VsYWJsZSB0b28gc21hbGwiKTs7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgYSA9IF9haWRsX3BhcmNlbC5yZWFkSW50KCk7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgYiA9IF9haWRsX3BhcmNlbC5yZWFkVHlwZWRPYmplY3QoYW5kcm9pZC5haWRsLnRlc3RzLmV4dGVuc2lvbi5NeUV4dC5DUkVBVE9SKTsKKyAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICBjID0gX2FpZGxfcGFyY2VsLnJlYWRTdHJpbmcoKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgaWYgKF9haWRsX3N0YXJ0X3BvcyA+IChJbnRlZ2VyLk1BWF9WQUxVRSAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkpIHsKKyAgICAgICAgdGhyb3cgbmV3IGFuZHJvaWQub3MuQmFkUGFyY2VsYWJsZUV4Y2VwdGlvbigiT3ZlcmZsb3cgaW4gdGhlIHNpemUgb2YgcGFyY2VsYWJsZSIpOworICAgICAgfQorICAgICAgX2FpZGxfcGFyY2VsLnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIH0KKyAgfQorICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgIGludCBfbWFzayA9IDA7CisgICAgX21hc2sgfD0gZGVzY3JpYmVDb250ZW50cyhiKTsKKyAgICByZXR1cm4gX21hc2s7CisgIH0KKyAgcHJpdmF0ZSBpbnQgZGVzY3JpYmVDb250ZW50cyhPYmplY3QgX3YpIHsKKyAgICBpZiAoX3YgPT0gbnVsbCkgcmV0dXJuIDA7CisgICAgaWYgKF92IGluc3RhbmNlb2YgYW5kcm9pZC5vcy5QYXJjZWxhYmxlKSB7CisgICAgICByZXR1cm4gKChhbmRyb2lkLm9zLlBhcmNlbGFibGUpIF92KS5kZXNjcmliZUNvbnRlbnRzKCk7CisgICAgfQorICAgIHJldHVybiAwOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQyLmphdmEuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dDIuamF2YS5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhYzk5ZjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQyLmphdmEuZApAQCAtMCwwICsxLDMgQEAKK291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0Mi5qYXZhIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0Mi5haWRsIFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dC5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHRMaWtlLmphdmEgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHRMaWtlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVhNDg1YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dExpa2UuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKgorICogVGhpcyBmaWxlIGlzIGF1dG8tZ2VuZXJhdGVkLiAgRE8gTk9UIE1PRElGWS4KKyAqLworcGFja2FnZSBhbmRyb2lkLmFpZGwudGVzdHMuZXh0ZW5zaW9uOworcHVibGljIGNsYXNzIE15RXh0TGlrZSBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZQoreworICBwdWJsaWMgaW50IGEgPSAwOworICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBiOworICBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsYWJsZS5DcmVhdG9yPE15RXh0TGlrZT4gQ1JFQVRPUiA9IG5ldyBhbmRyb2lkLm9zLlBhcmNlbGFibGUuQ3JlYXRvcjxNeUV4dExpa2U+KCkgeworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNeUV4dExpa2UgY3JlYXRlRnJvbVBhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9zb3VyY2UpIHsKKyAgICAgIE15RXh0TGlrZSBfYWlkbF9vdXQgPSBuZXcgTXlFeHRMaWtlKCk7CisgICAgICBfYWlkbF9vdXQucmVhZEZyb21QYXJjZWwoX2FpZGxfc291cmNlKTsKKyAgICAgIHJldHVybiBfYWlkbF9vdXQ7CisgICAgfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNeUV4dExpa2VbXSBuZXdBcnJheShpbnQgX2FpZGxfc2l6ZSkgeworICAgICAgcmV0dXJuIG5ldyBNeUV4dExpa2VbX2FpZGxfc2l6ZV07CisgICAgfQorICB9OworICBAT3ZlcnJpZGUgcHVibGljIGZpbmFsIHZvaWQgd3JpdGVUb1BhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9wYXJjZWwsIGludCBfYWlkbF9mbGFnKQorICB7CisgICAgaW50IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoMCk7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KGEpOworICAgIF9haWRsX3BhcmNlbC53cml0ZVN0cmluZyhiKTsKKyAgICBpbnQgX2FpZGxfZW5kX3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKKyAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3Bvcyk7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KF9haWRsX2VuZF9wb3MgLSBfYWlkbF9zdGFydF9wb3MpOworICAgIF9haWRsX3BhcmNlbC5zZXREYXRhUG9zaXRpb24oX2FpZGxfZW5kX3Bvcyk7CisgIH0KKyAgcHVibGljIGZpbmFsIHZvaWQgcmVhZEZyb21QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgX2FpZGxfcGFyY2VsKQorICB7CisgICAgaW50IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKKyAgICBpbnQgX2FpZGxfcGFyY2VsYWJsZV9zaXplID0gX2FpZGxfcGFyY2VsLnJlYWRJbnQoKTsKKyAgICB0cnkgeworICAgICAgaWYgKF9haWRsX3BhcmNlbGFibGVfc2l6ZSA8IDQpIHRocm93IG5ldyBhbmRyb2lkLm9zLkJhZFBhcmNlbGFibGVFeGNlcHRpb24oIlBhcmNlbGFibGUgdG9vIHNtYWxsIik7OworICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgIGEgPSBfYWlkbF9wYXJjZWwucmVhZEludCgpOworICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgIGIgPSBfYWlkbF9wYXJjZWwucmVhZFN0cmluZygpOworICAgIH0gZmluYWxseSB7CisgICAgICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gKEludGVnZXIuTUFYX1ZBTFVFIC0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSkgeworICAgICAgICB0aHJvdyBuZXcgYW5kcm9pZC5vcy5CYWRQYXJjZWxhYmxlRXhjZXB0aW9uKCJPdmVyZmxvdyBpbiB0aGUgc2l6ZSBvZiBwYXJjZWxhYmxlIik7CisgICAgICB9CisgICAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgfQorICB9CisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgaW50IF9tYXNrID0gMDsKKyAgICByZXR1cm4gX21hc2s7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dExpa2UuamF2YS5kIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0TGlrZS5qYXZhLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdmODUyZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dExpa2UuamF2YS5kCkBAIC0wLDAgKzEsMiBAQAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHRMaWtlLmphdmEgOiBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHRMaWtlLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9EZWVwbHlOZXN0ZWQuamF2YSBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9EZWVwbHlOZXN0ZWQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2RiOWRiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0RlZXBseU5lc3RlZC5qYXZhCkBAIC0wLDAgKzEsMjIyIEBACisvKgorICogVGhpcyBmaWxlIGlzIGF1dG8tZ2VuZXJhdGVkLiAgRE8gTk9UIE1PRElGWS4KKyAqLworcGFja2FnZSBhbmRyb2lkLmFpZGwudGVzdHMubmVzdGVkOworcHVibGljIGNsYXNzIERlZXBseU5lc3RlZCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZQoreworICBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsYWJsZS5DcmVhdG9yPERlZXBseU5lc3RlZD4gQ1JFQVRPUiA9IG5ldyBhbmRyb2lkLm9zLlBhcmNlbGFibGUuQ3JlYXRvcjxEZWVwbHlOZXN0ZWQ+KCkgeworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBEZWVwbHlOZXN0ZWQgY3JlYXRlRnJvbVBhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9zb3VyY2UpIHsKKyAgICAgIERlZXBseU5lc3RlZCBfYWlkbF9vdXQgPSBuZXcgRGVlcGx5TmVzdGVkKCk7CisgICAgICBfYWlkbF9vdXQucmVhZEZyb21QYXJjZWwoX2FpZGxfc291cmNlKTsKKyAgICAgIHJldHVybiBfYWlkbF9vdXQ7CisgICAgfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBEZWVwbHlOZXN0ZWRbXSBuZXdBcnJheShpbnQgX2FpZGxfc2l6ZSkgeworICAgICAgcmV0dXJuIG5ldyBEZWVwbHlOZXN0ZWRbX2FpZGxfc2l6ZV07CisgICAgfQorICB9OworICBAT3ZlcnJpZGUgcHVibGljIGZpbmFsIHZvaWQgd3JpdGVUb1BhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9wYXJjZWwsIGludCBfYWlkbF9mbGFnKQorICB7CisgICAgaW50IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoMCk7CisgICAgaW50IF9haWRsX2VuZF9wb3MgPSBfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCk7CisgICAgX2FpZGxfcGFyY2VsLnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MpOworICAgIF9haWRsX3BhcmNlbC53cml0ZUludChfYWlkbF9lbmRfcG9zIC0gX2FpZGxfc3RhcnRfcG9zKTsKKyAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX2VuZF9wb3MpOworICB9CisgIHB1YmxpYyBmaW5hbCB2b2lkIHJlYWRGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3BhcmNlbCkKKyAgeworICAgIGludCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCk7CisgICAgaW50IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IF9haWRsX3BhcmNlbC5yZWFkSW50KCk7CisgICAgdHJ5IHsKKyAgICAgIGlmIChfYWlkbF9wYXJjZWxhYmxlX3NpemUgPCA0KSB0aHJvdyBuZXcgYW5kcm9pZC5vcy5CYWRQYXJjZWxhYmxlRXhjZXB0aW9uKCJQYXJjZWxhYmxlIHRvbyBzbWFsbCIpOzsKKyAgICB9IGZpbmFsbHkgeworICAgICAgaWYgKF9haWRsX3N0YXJ0X3BvcyA+IChJbnRlZ2VyLk1BWF9WQUxVRSAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkpIHsKKyAgICAgICAgdGhyb3cgbmV3IGFuZHJvaWQub3MuQmFkUGFyY2VsYWJsZUV4Y2VwdGlvbigiT3ZlcmZsb3cgaW4gdGhlIHNpemUgb2YgcGFyY2VsYWJsZSIpOworICAgICAgfQorICAgICAgX2FpZGxfcGFyY2VsLnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIH0KKyAgfQorICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgIGludCBfbWFzayA9IDA7CisgICAgcmV0dXJuIF9tYXNrOworICB9CisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQSBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZQorICB7CisgICAgLy8gQ2FuIHJlZmVyZW5jZSBkZWVwbHkgbmVzdGVkIHR5cGUgb2YgYSBzaWJsaW5nIHR5cGUuCisgICAgcHVibGljIGJ5dGUgZSA9IGFuZHJvaWQuYWlkbC50ZXN0cy5uZXN0ZWQuRGVlcGx5TmVzdGVkLkIuQy5ELkUuT0s7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm9zLlBhcmNlbGFibGUuQ3JlYXRvcjxBPiBDUkVBVE9SID0gbmV3IGFuZHJvaWQub3MuUGFyY2VsYWJsZS5DcmVhdG9yPEE+KCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgQSBjcmVhdGVGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3NvdXJjZSkgeworICAgICAgICBBIF9haWRsX291dCA9IG5ldyBBKCk7CisgICAgICAgIF9haWRsX291dC5yZWFkRnJvbVBhcmNlbChfYWlkbF9zb3VyY2UpOworICAgICAgICByZXR1cm4gX2FpZGxfb3V0OworICAgICAgfQorICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgQVtdIG5ld0FycmF5KGludCBfYWlkbF9zaXplKSB7CisgICAgICAgIHJldHVybiBuZXcgQVtfYWlkbF9zaXplXTsKKyAgICAgIH0KKyAgICB9OworICAgIEBPdmVycmlkZSBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZVRvUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3BhcmNlbCwgaW50IF9haWRsX2ZsYWcpCisgICAgeworICAgICAgaW50IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKKyAgICAgIF9haWRsX3BhcmNlbC53cml0ZUludCgwKTsKKyAgICAgIF9haWRsX3BhcmNlbC53cml0ZUJ5dGUoZSk7CisgICAgICBpbnQgX2FpZGxfZW5kX3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKKyAgICAgIF9haWRsX3BhcmNlbC5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zKTsKKyAgICAgIF9haWRsX3BhcmNlbC53cml0ZUludChfYWlkbF9lbmRfcG9zIC0gX2FpZGxfc3RhcnRfcG9zKTsKKyAgICAgIF9haWRsX3BhcmNlbC5zZXREYXRhUG9zaXRpb24oX2FpZGxfZW5kX3Bvcyk7CisgICAgfQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJlYWRGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3BhcmNlbCkKKyAgICB7CisgICAgICBpbnQgX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpOworICAgICAgaW50IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IF9haWRsX3BhcmNlbC5yZWFkSW50KCk7CisgICAgICB0cnkgeworICAgICAgICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9zaXplIDwgNCkgdGhyb3cgbmV3IGFuZHJvaWQub3MuQmFkUGFyY2VsYWJsZUV4Y2VwdGlvbigiUGFyY2VsYWJsZSB0b28gc21hbGwiKTs7CisgICAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICAgIGUgPSBfYWlkbF9wYXJjZWwucmVhZEJ5dGUoKTsKKyAgICAgIH0gZmluYWxseSB7CisgICAgICAgIGlmIChfYWlkbF9zdGFydF9wb3MgPiAoSW50ZWdlci5NQVhfVkFMVUUgLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpKSB7CisgICAgICAgICAgdGhyb3cgbmV3IGFuZHJvaWQub3MuQmFkUGFyY2VsYWJsZUV4Y2VwdGlvbigiT3ZlcmZsb3cgaW4gdGhlIHNpemUgb2YgcGFyY2VsYWJsZSIpOworICAgICAgICB9CisgICAgICAgIF9haWRsX3BhcmNlbC5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICAgIH0KKyAgICB9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgICAgaW50IF9tYXNrID0gMDsKKyAgICAgIHJldHVybiBfbWFzazsKKyAgICB9CisgIH0KKyAgcHVibGljIHN0YXRpYyBjbGFzcyBCIGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlCisgIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsYWJsZS5DcmVhdG9yPEI+IENSRUFUT1IgPSBuZXcgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3I8Qj4oKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBCIGNyZWF0ZUZyb21QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgX2FpZGxfc291cmNlKSB7CisgICAgICAgIEIgX2FpZGxfb3V0ID0gbmV3IEIoKTsKKyAgICAgICAgX2FpZGxfb3V0LnJlYWRGcm9tUGFyY2VsKF9haWRsX3NvdXJjZSk7CisgICAgICAgIHJldHVybiBfYWlkbF9vdXQ7CisgICAgICB9CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBCW10gbmV3QXJyYXkoaW50IF9haWRsX3NpemUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBCW19haWRsX3NpemVdOworICAgICAgfQorICAgIH07CisgICAgQE92ZXJyaWRlIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlVG9QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgX2FpZGxfcGFyY2VsLCBpbnQgX2FpZGxfZmxhZykKKyAgICB7CisgICAgICBpbnQgX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpOworICAgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KDApOworICAgICAgaW50IF9haWRsX2VuZF9wb3MgPSBfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCk7CisgICAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3Bvcyk7CisgICAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgICAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX2VuZF9wb3MpOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgdm9pZCByZWFkRnJvbVBhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9wYXJjZWwpCisgICAgeworICAgICAgaW50IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKKyAgICAgIGludCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSBfYWlkbF9wYXJjZWwucmVhZEludCgpOworICAgICAgdHJ5IHsKKyAgICAgICAgaWYgKF9haWRsX3BhcmNlbGFibGVfc2l6ZSA8IDQpIHRocm93IG5ldyBhbmRyb2lkLm9zLkJhZFBhcmNlbGFibGVFeGNlcHRpb24oIlBhcmNlbGFibGUgdG9vIHNtYWxsIik7OworICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgaWYgKF9haWRsX3N0YXJ0X3BvcyA+IChJbnRlZ2VyLk1BWF9WQUxVRSAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgYW5kcm9pZC5vcy5CYWRQYXJjZWxhYmxlRXhjZXB0aW9uKCJPdmVyZmxvdyBpbiB0aGUgc2l6ZSBvZiBwYXJjZWxhYmxlIik7CisgICAgICAgIH0KKyAgICAgICAgX2FpZGxfcGFyY2VsLnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgICAgfQorICAgIH0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgICBpbnQgX21hc2sgPSAwOworICAgICAgcmV0dXJuIF9tYXNrOworICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEMgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUKKyAgICB7CisgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsYWJsZS5DcmVhdG9yPEM+IENSRUFUT1IgPSBuZXcgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3I8Qz4oKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQyBjcmVhdGVGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3NvdXJjZSkgeworICAgICAgICAgIEMgX2FpZGxfb3V0ID0gbmV3IEMoKTsKKyAgICAgICAgICBfYWlkbF9vdXQucmVhZEZyb21QYXJjZWwoX2FpZGxfc291cmNlKTsKKyAgICAgICAgICByZXR1cm4gX2FpZGxfb3V0OworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ1tdIG5ld0FycmF5KGludCBfYWlkbF9zaXplKSB7CisgICAgICAgICAgcmV0dXJuIG5ldyBDW19haWRsX3NpemVdOworICAgICAgICB9CisgICAgICB9OworICAgICAgQE92ZXJyaWRlIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlVG9QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgX2FpZGxfcGFyY2VsLCBpbnQgX2FpZGxfZmxhZykKKyAgICAgIHsKKyAgICAgICAgaW50IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKKyAgICAgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KDApOworICAgICAgICBpbnQgX2FpZGxfZW5kX3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKKyAgICAgICAgX2FpZGxfcGFyY2VsLnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MpOworICAgICAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgICAgICAgIF9haWRsX3BhcmNlbC5zZXREYXRhUG9zaXRpb24oX2FpZGxfZW5kX3Bvcyk7CisgICAgICB9CisgICAgICBwdWJsaWMgZmluYWwgdm9pZCByZWFkRnJvbVBhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9wYXJjZWwpCisgICAgICB7CisgICAgICAgIGludCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCk7CisgICAgICAgIGludCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSBfYWlkbF9wYXJjZWwucmVhZEludCgpOworICAgICAgICB0cnkgeworICAgICAgICAgIGlmIChfYWlkbF9wYXJjZWxhYmxlX3NpemUgPCA0KSB0aHJvdyBuZXcgYW5kcm9pZC5vcy5CYWRQYXJjZWxhYmxlRXhjZXB0aW9uKCJQYXJjZWxhYmxlIHRvbyBzbWFsbCIpOzsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gKEludGVnZXIuTUFYX1ZBTFVFIC0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IGFuZHJvaWQub3MuQmFkUGFyY2VsYWJsZUV4Y2VwdGlvbigiT3ZlcmZsb3cgaW4gdGhlIHNpemUgb2YgcGFyY2VsYWJsZSIpOworICAgICAgICAgIH0KKyAgICAgICAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgICAgICBpbnQgX21hc2sgPSAwOworICAgICAgICByZXR1cm4gX21hc2s7CisgICAgICB9CisgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEQgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUKKyAgICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm9zLlBhcmNlbGFibGUuQ3JlYXRvcjxEPiBDUkVBVE9SID0gbmV3IGFuZHJvaWQub3MuUGFyY2VsYWJsZS5DcmVhdG9yPEQ+KCkgeworICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgIHB1YmxpYyBEIGNyZWF0ZUZyb21QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgX2FpZGxfc291cmNlKSB7CisgICAgICAgICAgICBEIF9haWRsX291dCA9IG5ldyBEKCk7CisgICAgICAgICAgICBfYWlkbF9vdXQucmVhZEZyb21QYXJjZWwoX2FpZGxfc291cmNlKTsKKyAgICAgICAgICAgIHJldHVybiBfYWlkbF9vdXQ7CisgICAgICAgICAgfQorICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgIHB1YmxpYyBEW10gbmV3QXJyYXkoaW50IF9haWRsX3NpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRFtfYWlkbF9zaXplXTsKKyAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZVRvUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3BhcmNlbCwgaW50IF9haWRsX2ZsYWcpCisgICAgICAgIHsKKyAgICAgICAgICBpbnQgX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpOworICAgICAgICAgIF9haWRsX3BhcmNlbC53cml0ZUludCgwKTsKKyAgICAgICAgICBpbnQgX2FpZGxfZW5kX3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKKyAgICAgICAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3Bvcyk7CisgICAgICAgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KF9haWRsX2VuZF9wb3MgLSBfYWlkbF9zdGFydF9wb3MpOworICAgICAgICAgIF9haWRsX3BhcmNlbC5zZXREYXRhUG9zaXRpb24oX2FpZGxfZW5kX3Bvcyk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGZpbmFsIHZvaWQgcmVhZEZyb21QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgX2FpZGxfcGFyY2VsKQorICAgICAgICB7CisgICAgICAgICAgaW50IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKKyAgICAgICAgICBpbnQgX2FpZGxfcGFyY2VsYWJsZV9zaXplID0gX2FpZGxfcGFyY2VsLnJlYWRJbnQoKTsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKF9haWRsX3BhcmNlbGFibGVfc2l6ZSA8IDQpIHRocm93IG5ldyBhbmRyb2lkLm9zLkJhZFBhcmNlbGFibGVFeGNlcHRpb24oIlBhcmNlbGFibGUgdG9vIHNtYWxsIik7OworICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gKEludGVnZXIuTUFYX1ZBTFVFIC0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSkgeworICAgICAgICAgICAgICB0aHJvdyBuZXcgYW5kcm9pZC5vcy5CYWRQYXJjZWxhYmxlRXhjZXB0aW9uKCJPdmVyZmxvdyBpbiB0aGUgc2l6ZSBvZiBwYXJjZWxhYmxlIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgICAgICAgaW50IF9tYXNrID0gMDsKKyAgICAgICAgICByZXR1cm4gX21hc2s7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHN0YXRpYyBAaW50ZXJmYWNlIEUgeworICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPSyA9IDA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9EZWVwbHlOZXN0ZWQuamF2YS5kIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0RlZXBseU5lc3RlZC5qYXZhLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU3NmFiNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9EZWVwbHlOZXN0ZWQuamF2YS5kCkBAIC0wLDAgKzEsMiBAQAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvRGVlcGx5TmVzdGVkLmphdmEgOiBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvRGVlcGx5TmVzdGVkLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9JTmVzdGVkU2VydmljZS5qYXZhIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0lOZXN0ZWRTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZkY2UzNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9JTmVzdGVkU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsMzAzIEBACisvKgorICogVGhpcyBmaWxlIGlzIGF1dG8tZ2VuZXJhdGVkLiAgRE8gTk9UIE1PRElGWS4KKyAqLworcGFja2FnZSBhbmRyb2lkLmFpZGwudGVzdHMubmVzdGVkOworcHVibGljIGludGVyZmFjZSBJTmVzdGVkU2VydmljZSBleHRlbmRzIGFuZHJvaWQub3MuSUludGVyZmFjZQoreworICAvKiogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3IgSU5lc3RlZFNlcnZpY2UuICovCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRGVmYXVsdCBpbXBsZW1lbnRzIGFuZHJvaWQuYWlkbC50ZXN0cy5uZXN0ZWQuSU5lc3RlZFNlcnZpY2UKKyAgeworICAgIEBPdmVycmlkZSBwdWJsaWMgYW5kcm9pZC5haWRsLnRlc3RzLm5lc3RlZC5JTmVzdGVkU2VydmljZS5SZXN1bHQgZmxpcFN0YXR1cyhhbmRyb2lkLmFpZGwudGVzdHMubmVzdGVkLlBhcmNlbGFibGVXaXRoTmVzdGVkIHApIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgZmxpcFN0YXR1c1dpdGhDYWxsYmFjayhieXRlIHN0YXR1cywgYW5kcm9pZC5haWRsLnRlc3RzLm5lc3RlZC5JTmVzdGVkU2VydmljZS5JQ2FsbGJhY2sgY2IpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICB9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgfQorICAvKiogTG9jYWwtc2lkZSBJUEMgaW1wbGVtZW50YXRpb24gc3R1YiBjbGFzcy4gKi8KKyAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBTdHViIGV4dGVuZHMgYW5kcm9pZC5vcy5CaW5kZXIgaW1wbGVtZW50cyBhbmRyb2lkLmFpZGwudGVzdHMubmVzdGVkLklOZXN0ZWRTZXJ2aWNlCisgIHsKKyAgICAvKiogQ29uc3RydWN0IHRoZSBzdHViIGF0IGF0dGFjaCBpdCB0byB0aGUgaW50ZXJmYWNlLiAqLworICAgIHB1YmxpYyBTdHViKCkKKyAgICB7CisgICAgICB0aGlzLmF0dGFjaEludGVyZmFjZSh0aGlzLCBERVNDUklQVE9SKTsKKyAgICB9CisgICAgLyoqCisgICAgICogQ2FzdCBhbiBJQmluZGVyIG9iamVjdCBpbnRvIGFuIGFuZHJvaWQuYWlkbC50ZXN0cy5uZXN0ZWQuSU5lc3RlZFNlcnZpY2UgaW50ZXJmYWNlLAorICAgICAqIGdlbmVyYXRpbmcgYSBwcm94eSBpZiBuZWVkZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBhbmRyb2lkLmFpZGwudGVzdHMubmVzdGVkLklOZXN0ZWRTZXJ2aWNlIGFzSW50ZXJmYWNlKGFuZHJvaWQub3MuSUJpbmRlciBvYmopCisgICAgeworICAgICAgaWYgKChvYmo9PW51bGwpKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgICAgYW5kcm9pZC5vcy5JSW50ZXJmYWNlIGlpbiA9IG9iai5xdWVyeUxvY2FsSW50ZXJmYWNlKERFU0NSSVBUT1IpOworICAgICAgaWYgKCgoaWluIT1udWxsKSYmKGlpbiBpbnN0YW5jZW9mIGFuZHJvaWQuYWlkbC50ZXN0cy5uZXN0ZWQuSU5lc3RlZFNlcnZpY2UpKSkgeworICAgICAgICByZXR1cm4gKChhbmRyb2lkLmFpZGwudGVzdHMubmVzdGVkLklOZXN0ZWRTZXJ2aWNlKWlpbik7CisgICAgICB9CisgICAgICByZXR1cm4gbmV3IGFuZHJvaWQuYWlkbC50ZXN0cy5uZXN0ZWQuSU5lc3RlZFNlcnZpY2UuU3R1Yi5Qcm94eShvYmopOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCisgICAgeworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgYm9vbGVhbiBvblRyYW5zYWN0KGludCBjb2RlLCBhbmRyb2lkLm9zLlBhcmNlbCBkYXRhLCBhbmRyb2lkLm9zLlBhcmNlbCByZXBseSwgaW50IGZsYWdzKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICBqYXZhLmxhbmcuU3RyaW5nIGRlc2NyaXB0b3IgPSBERVNDUklQVE9SOworICAgICAgaWYgKGNvZGUgPj0gYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gJiYgY29kZSA8PSBhbmRyb2lkLm9zLklCaW5kZXIuTEFTVF9DQUxMX1RSQU5TQUNUSU9OKSB7CisgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShkZXNjcmlwdG9yKTsKKyAgICAgIH0KKyAgICAgIHN3aXRjaCAoY29kZSkKKyAgICAgIHsKKyAgICAgICAgY2FzZSBJTlRFUkZBQ0VfVFJBTlNBQ1RJT046CisgICAgICAgIHsKKyAgICAgICAgICByZXBseS53cml0ZVN0cmluZyhkZXNjcmlwdG9yKTsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgc3dpdGNoIChjb2RlKQorICAgICAgeworICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX2ZsaXBTdGF0dXM6CisgICAgICAgIHsKKyAgICAgICAgICBhbmRyb2lkLmFpZGwudGVzdHMubmVzdGVkLlBhcmNlbGFibGVXaXRoTmVzdGVkIF9hcmcwOworICAgICAgICAgIF9hcmcwID0gZGF0YS5yZWFkVHlwZWRPYmplY3QoYW5kcm9pZC5haWRsLnRlc3RzLm5lc3RlZC5QYXJjZWxhYmxlV2l0aE5lc3RlZC5DUkVBVE9SKTsKKyAgICAgICAgICBkYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOworICAgICAgICAgIGFuZHJvaWQuYWlkbC50ZXN0cy5uZXN0ZWQuSU5lc3RlZFNlcnZpY2UuUmVzdWx0IF9yZXN1bHQgPSB0aGlzLmZsaXBTdGF0dXMoX2FyZzApOworICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKKyAgICAgICAgICByZXBseS53cml0ZVR5cGVkT2JqZWN0KF9yZXN1bHQsIGFuZHJvaWQub3MuUGFyY2VsYWJsZS5QQVJDRUxBQkxFX1dSSVRFX1JFVFVSTl9WQUxVRSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9mbGlwU3RhdHVzV2l0aENhbGxiYWNrOgorICAgICAgICB7CisgICAgICAgICAgYnl0ZSBfYXJnMDsKKyAgICAgICAgICBfYXJnMCA9IGRhdGEucmVhZEJ5dGUoKTsKKyAgICAgICAgICBhbmRyb2lkLmFpZGwudGVzdHMubmVzdGVkLklOZXN0ZWRTZXJ2aWNlLklDYWxsYmFjayBfYXJnMTsKKyAgICAgICAgICBfYXJnMSA9IGFuZHJvaWQuYWlkbC50ZXN0cy5uZXN0ZWQuSU5lc3RlZFNlcnZpY2UuSUNhbGxiYWNrLlN0dWIuYXNJbnRlcmZhY2UoZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICAgIGRhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7CisgICAgICAgICAgdGhpcy5mbGlwU3RhdHVzV2l0aENhbGxiYWNrKF9hcmcwLCBfYXJnMSk7CisgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gc3VwZXIub25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJveHkgaW1wbGVtZW50cyBhbmRyb2lkLmFpZGwudGVzdHMubmVzdGVkLklOZXN0ZWRTZXJ2aWNlCisgICAgeworICAgICAgcHJpdmF0ZSBhbmRyb2lkLm9zLklCaW5kZXIgbVJlbW90ZTsKKyAgICAgIFByb3h5KGFuZHJvaWQub3MuSUJpbmRlciByZW1vdGUpCisgICAgICB7CisgICAgICAgIG1SZW1vdGUgPSByZW1vdGU7CisgICAgICB9CisgICAgICBAT3ZlcnJpZGUgcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCisgICAgICB7CisgICAgICAgIHJldHVybiBtUmVtb3RlOworICAgICAgfQorICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpCisgICAgICB7CisgICAgICAgIHJldHVybiBERVNDUklQVE9SOworICAgICAgfQorICAgICAgQE92ZXJyaWRlIHB1YmxpYyBhbmRyb2lkLmFpZGwudGVzdHMubmVzdGVkLklOZXN0ZWRTZXJ2aWNlLlJlc3VsdCBmbGlwU3RhdHVzKGFuZHJvaWQuYWlkbC50ZXN0cy5uZXN0ZWQuUGFyY2VsYWJsZVdpdGhOZXN0ZWQgcCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgICB7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgYW5kcm9pZC5haWRsLnRlc3RzLm5lc3RlZC5JTmVzdGVkU2VydmljZS5SZXN1bHQgX3Jlc3VsdDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOworICAgICAgICAgIF9kYXRhLndyaXRlVHlwZWRPYmplY3QocCwgMCk7CisgICAgICAgICAgYm9vbGVhbiBfc3RhdHVzID0gbVJlbW90ZS50cmFuc2FjdChTdHViLlRSQU5TQUNUSU9OX2ZsaXBTdGF0dXMsIF9kYXRhLCBfcmVwbHksIDApOworICAgICAgICAgIF9yZXBseS5yZWFkRXhjZXB0aW9uKCk7CisgICAgICAgICAgX3Jlc3VsdCA9IF9yZXBseS5yZWFkVHlwZWRPYmplY3QoYW5kcm9pZC5haWRsLnRlc3RzLm5lc3RlZC5JTmVzdGVkU2VydmljZS5SZXN1bHQuQ1JFQVRPUik7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgX3JlcGx5LnJlY3ljbGUoKTsKKyAgICAgICAgICBfZGF0YS5yZWN5Y2xlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9yZXN1bHQ7CisgICAgICB9CisgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgZmxpcFN0YXR1c1dpdGhDYWxsYmFjayhieXRlIHN0YXR1cywgYW5kcm9pZC5haWRsLnRlc3RzLm5lc3RlZC5JTmVzdGVkU2VydmljZS5JQ2FsbGJhY2sgY2IpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgICAgeworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbihhc0JpbmRlcigpKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKKyAgICAgICAgICBfZGF0YS53cml0ZUJ5dGUoc3RhdHVzKTsKKyAgICAgICAgICBfZGF0YS53cml0ZVN0cm9uZ0ludGVyZmFjZShjYik7CisgICAgICAgICAgYm9vbGVhbiBfc3RhdHVzID0gbVJlbW90ZS50cmFuc2FjdChTdHViLlRSQU5TQUNUSU9OX2ZsaXBTdGF0dXNXaXRoQ2FsbGJhY2ssIF9kYXRhLCBfcmVwbHksIDApOworICAgICAgICAgIF9yZXBseS5yZWFkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgX3JlcGx5LnJlY3ljbGUoKTsKKyAgICAgICAgICBfZGF0YS5yZWN5Y2xlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9mbGlwU3RhdHVzID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMCk7CisgICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9mbGlwU3RhdHVzV2l0aENhbGxiYWNrID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMSk7CisgIH0KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFU0NSSVBUT1IgPSAiYW5kcm9pZCRhaWRsJHRlc3RzJG5lc3RlZCRJTmVzdGVkU2VydmljZSIucmVwbGFjZSgnJCcsICcuJyk7CisgIHB1YmxpYyBhbmRyb2lkLmFpZGwudGVzdHMubmVzdGVkLklOZXN0ZWRTZXJ2aWNlLlJlc3VsdCBmbGlwU3RhdHVzKGFuZHJvaWQuYWlkbC50ZXN0cy5uZXN0ZWQuUGFyY2VsYWJsZVdpdGhOZXN0ZWQgcCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworICBwdWJsaWMgdm9pZCBmbGlwU3RhdHVzV2l0aENhbGxiYWNrKGJ5dGUgc3RhdHVzLCBhbmRyb2lkLmFpZGwudGVzdHMubmVzdGVkLklOZXN0ZWRTZXJ2aWNlLklDYWxsYmFjayBjYikgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc3VsdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZQorICB7CisgICAgcHVibGljIGJ5dGUgc3RhdHVzID0gYW5kcm9pZC5haWRsLnRlc3RzLm5lc3RlZC5QYXJjZWxhYmxlV2l0aE5lc3RlZC5TdGF0dXMuT0s7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm9zLlBhcmNlbGFibGUuQ3JlYXRvcjxSZXN1bHQ+IENSRUFUT1IgPSBuZXcgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3I8UmVzdWx0PigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIFJlc3VsdCBjcmVhdGVGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3NvdXJjZSkgeworICAgICAgICBSZXN1bHQgX2FpZGxfb3V0ID0gbmV3IFJlc3VsdCgpOworICAgICAgICBfYWlkbF9vdXQucmVhZEZyb21QYXJjZWwoX2FpZGxfc291cmNlKTsKKyAgICAgICAgcmV0dXJuIF9haWRsX291dDsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIFJlc3VsdFtdIG5ld0FycmF5KGludCBfYWlkbF9zaXplKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzdWx0W19haWRsX3NpemVdOworICAgICAgfQorICAgIH07CisgICAgQE92ZXJyaWRlIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlVG9QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgX2FpZGxfcGFyY2VsLCBpbnQgX2FpZGxfZmxhZykKKyAgICB7CisgICAgICBpbnQgX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpOworICAgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KDApOworICAgICAgX2FpZGxfcGFyY2VsLndyaXRlQnl0ZShzdGF0dXMpOworICAgICAgaW50IF9haWRsX2VuZF9wb3MgPSBfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCk7CisgICAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3Bvcyk7CisgICAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgICAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX2VuZF9wb3MpOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgdm9pZCByZWFkRnJvbVBhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9wYXJjZWwpCisgICAgeworICAgICAgaW50IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKKyAgICAgIGludCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSBfYWlkbF9wYXJjZWwucmVhZEludCgpOworICAgICAgdHJ5IHsKKyAgICAgICAgaWYgKF9haWRsX3BhcmNlbGFibGVfc2l6ZSA8IDQpIHRocm93IG5ldyBhbmRyb2lkLm9zLkJhZFBhcmNlbGFibGVFeGNlcHRpb24oIlBhcmNlbGFibGUgdG9vIHNtYWxsIik7OworICAgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgICBzdGF0dXMgPSBfYWlkbF9wYXJjZWwucmVhZEJ5dGUoKTsKKyAgICAgIH0gZmluYWxseSB7CisgICAgICAgIGlmIChfYWlkbF9zdGFydF9wb3MgPiAoSW50ZWdlci5NQVhfVkFMVUUgLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpKSB7CisgICAgICAgICAgdGhyb3cgbmV3IGFuZHJvaWQub3MuQmFkUGFyY2VsYWJsZUV4Y2VwdGlvbigiT3ZlcmZsb3cgaW4gdGhlIHNpemUgb2YgcGFyY2VsYWJsZSIpOworICAgICAgICB9CisgICAgICAgIF9haWRsX3BhcmNlbC5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICAgIH0KKyAgICB9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgICAgaW50IF9tYXNrID0gMDsKKyAgICAgIHJldHVybiBfbWFzazsKKyAgICB9CisgIH0KKyAgcHVibGljIGludGVyZmFjZSBJQ2FsbGJhY2sgZXh0ZW5kcyBhbmRyb2lkLm9zLklJbnRlcmZhY2UKKyAgeworICAgIC8qKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciBJQ2FsbGJhY2suICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBEZWZhdWx0IGltcGxlbWVudHMgYW5kcm9pZC5haWRsLnRlc3RzLm5lc3RlZC5JTmVzdGVkU2VydmljZS5JQ2FsbGJhY2sKKyAgICB7CisgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgZG9uZShieXRlIHN0YXR1cykgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgICB7CisgICAgICB9CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgIH0KKyAgICAvKiogTG9jYWwtc2lkZSBJUEMgaW1wbGVtZW50YXRpb24gc3R1YiBjbGFzcy4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIFN0dWIgZXh0ZW5kcyBhbmRyb2lkLm9zLkJpbmRlciBpbXBsZW1lbnRzIGFuZHJvaWQuYWlkbC50ZXN0cy5uZXN0ZWQuSU5lc3RlZFNlcnZpY2UuSUNhbGxiYWNrCisgICAgeworICAgICAgLyoqIENvbnN0cnVjdCB0aGUgc3R1YiBhdCBhdHRhY2ggaXQgdG8gdGhlIGludGVyZmFjZS4gKi8KKyAgICAgIHB1YmxpYyBTdHViKCkKKyAgICAgIHsKKyAgICAgICAgdGhpcy5hdHRhY2hJbnRlcmZhY2UodGhpcywgREVTQ1JJUFRPUik7CisgICAgICB9CisgICAgICAvKioKKyAgICAgICAqIENhc3QgYW4gSUJpbmRlciBvYmplY3QgaW50byBhbiBhbmRyb2lkLmFpZGwudGVzdHMubmVzdGVkLklOZXN0ZWRTZXJ2aWNlLklDYWxsYmFjayBpbnRlcmZhY2UsCisgICAgICAgKiBnZW5lcmF0aW5nIGEgcHJveHkgaWYgbmVlZGVkLgorICAgICAgICovCisgICAgICBwdWJsaWMgc3RhdGljIGFuZHJvaWQuYWlkbC50ZXN0cy5uZXN0ZWQuSU5lc3RlZFNlcnZpY2UuSUNhbGxiYWNrIGFzSW50ZXJmYWNlKGFuZHJvaWQub3MuSUJpbmRlciBvYmopCisgICAgICB7CisgICAgICAgIGlmICgob2JqPT1udWxsKSkgeworICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIGFuZHJvaWQub3MuSUludGVyZmFjZSBpaW4gPSBvYmoucXVlcnlMb2NhbEludGVyZmFjZShERVNDUklQVE9SKTsKKyAgICAgICAgaWYgKCgoaWluIT1udWxsKSYmKGlpbiBpbnN0YW5jZW9mIGFuZHJvaWQuYWlkbC50ZXN0cy5uZXN0ZWQuSU5lc3RlZFNlcnZpY2UuSUNhbGxiYWNrKSkpIHsKKyAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLmFpZGwudGVzdHMubmVzdGVkLklOZXN0ZWRTZXJ2aWNlLklDYWxsYmFjaylpaW4pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgYW5kcm9pZC5haWRsLnRlc3RzLm5lc3RlZC5JTmVzdGVkU2VydmljZS5JQ2FsbGJhY2suU3R1Yi5Qcm94eShvYmopOworICAgICAgfQorICAgICAgQE92ZXJyaWRlIHB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKQorICAgICAgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgYm9vbGVhbiBvblRyYW5zYWN0KGludCBjb2RlLCBhbmRyb2lkLm9zLlBhcmNlbCBkYXRhLCBhbmRyb2lkLm9zLlBhcmNlbCByZXBseSwgaW50IGZsYWdzKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICAgIHsKKyAgICAgICAgamF2YS5sYW5nLlN0cmluZyBkZXNjcmlwdG9yID0gREVTQ1JJUFRPUjsKKyAgICAgICAgaWYgKGNvZGUgPj0gYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gJiYgY29kZSA8PSBhbmRyb2lkLm9zLklCaW5kZXIuTEFTVF9DQUxMX1RSQU5TQUNUSU9OKSB7CisgICAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKGRlc2NyaXB0b3IpOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoY29kZSkKKyAgICAgICAgeworICAgICAgICAgIGNhc2UgSU5URVJGQUNFX1RSQU5TQUNUSU9OOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIHJlcGx5LndyaXRlU3RyaW5nKGRlc2NyaXB0b3IpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoY29kZSkKKyAgICAgICAgeworICAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fZG9uZToKKyAgICAgICAgICB7CisgICAgICAgICAgICBieXRlIF9hcmcwOworICAgICAgICAgICAgX2FyZzAgPSBkYXRhLnJlYWRCeXRlKCk7CisgICAgICAgICAgICBkYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOworICAgICAgICAgICAgdGhpcy5kb25lKF9hcmcwKTsKKyAgICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzdXBlci5vblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJveHkgaW1wbGVtZW50cyBhbmRyb2lkLmFpZGwudGVzdHMubmVzdGVkLklOZXN0ZWRTZXJ2aWNlLklDYWxsYmFjaworICAgICAgeworICAgICAgICBwcml2YXRlIGFuZHJvaWQub3MuSUJpbmRlciBtUmVtb3RlOworICAgICAgICBQcm94eShhbmRyb2lkLm9zLklCaW5kZXIgcmVtb3RlKQorICAgICAgICB7CisgICAgICAgICAgbVJlbW90ZSA9IHJlbW90ZTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUgcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gbVJlbW90ZTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBERVNDUklQVE9SOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBkb25lKGJ5dGUgc3RhdHVzKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOworICAgICAgICAgICAgX2RhdGEud3JpdGVCeXRlKHN0YXR1cyk7CisgICAgICAgICAgICBib29sZWFuIF9zdGF0dXMgPSBtUmVtb3RlLnRyYW5zYWN0KFN0dWIuVFJBTlNBQ1RJT05fZG9uZSwgX2RhdGEsIF9yZXBseSwgMCk7CisgICAgICAgICAgICBfcmVwbHkucmVhZEV4Y2VwdGlvbigpOworICAgICAgICAgIH0KKyAgICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICAgIF9yZXBseS5yZWN5Y2xlKCk7CisgICAgICAgICAgICBfZGF0YS5yZWN5Y2xlKCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2RvbmUgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAwKTsKKyAgICB9CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFU0NSSVBUT1IgPSAiYW5kcm9pZCRhaWRsJHRlc3RzJG5lc3RlZCRJTmVzdGVkU2VydmljZSRJQ2FsbGJhY2siLnJlcGxhY2UoJyQnLCAnLicpOworICAgIHB1YmxpYyB2b2lkIGRvbmUoYnl0ZSBzdGF0dXMpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0lOZXN0ZWRTZXJ2aWNlLmphdmEuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9JTmVzdGVkU2VydmljZS5qYXZhLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNhOWU0MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9JTmVzdGVkU2VydmljZS5qYXZhLmQKQEAgLTAsMCArMSwzIEBACitvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9JTmVzdGVkU2VydmljZS5qYXZhIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0lOZXN0ZWRTZXJ2aWNlLmFpZGwgXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL1BhcmNlbGFibGVXaXRoTmVzdGVkLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9QYXJjZWxhYmxlV2l0aE5lc3RlZC5qYXZhIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL1BhcmNlbGFibGVXaXRoTmVzdGVkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVkMmZjOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9QYXJjZWxhYmxlV2l0aE5lc3RlZC5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXV0by1nZW5lcmF0ZWQuICBETyBOT1QgTU9ESUZZLgorICovCitwYWNrYWdlIGFuZHJvaWQuYWlkbC50ZXN0cy5uZXN0ZWQ7CitwdWJsaWMgY2xhc3MgUGFyY2VsYWJsZVdpdGhOZXN0ZWQgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUKK3sKKyAgcHVibGljIGJ5dGUgc3RhdHVzID0gYW5kcm9pZC5haWRsLnRlc3RzLm5lc3RlZC5QYXJjZWxhYmxlV2l0aE5lc3RlZC5TdGF0dXMuT0s7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3I8UGFyY2VsYWJsZVdpdGhOZXN0ZWQ+IENSRUFUT1IgPSBuZXcgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3I8UGFyY2VsYWJsZVdpdGhOZXN0ZWQ+KCkgeworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBQYXJjZWxhYmxlV2l0aE5lc3RlZCBjcmVhdGVGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3NvdXJjZSkgeworICAgICAgUGFyY2VsYWJsZVdpdGhOZXN0ZWQgX2FpZGxfb3V0ID0gbmV3IFBhcmNlbGFibGVXaXRoTmVzdGVkKCk7CisgICAgICBfYWlkbF9vdXQucmVhZEZyb21QYXJjZWwoX2FpZGxfc291cmNlKTsKKyAgICAgIHJldHVybiBfYWlkbF9vdXQ7CisgICAgfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBQYXJjZWxhYmxlV2l0aE5lc3RlZFtdIG5ld0FycmF5KGludCBfYWlkbF9zaXplKSB7CisgICAgICByZXR1cm4gbmV3IFBhcmNlbGFibGVXaXRoTmVzdGVkW19haWRsX3NpemVdOworICAgIH0KKyAgfTsKKyAgQE92ZXJyaWRlIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlVG9QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgX2FpZGxfcGFyY2VsLCBpbnQgX2FpZGxfZmxhZykKKyAgeworICAgIGludCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCk7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KDApOworICAgIF9haWRsX3BhcmNlbC53cml0ZUJ5dGUoc3RhdHVzKTsKKyAgICBpbnQgX2FpZGxfZW5kX3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKKyAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3Bvcyk7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KF9haWRsX2VuZF9wb3MgLSBfYWlkbF9zdGFydF9wb3MpOworICAgIF9haWRsX3BhcmNlbC5zZXREYXRhUG9zaXRpb24oX2FpZGxfZW5kX3Bvcyk7CisgIH0KKyAgcHVibGljIGZpbmFsIHZvaWQgcmVhZEZyb21QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgX2FpZGxfcGFyY2VsKQorICB7CisgICAgaW50IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKKyAgICBpbnQgX2FpZGxfcGFyY2VsYWJsZV9zaXplID0gX2FpZGxfcGFyY2VsLnJlYWRJbnQoKTsKKyAgICB0cnkgeworICAgICAgaWYgKF9haWRsX3BhcmNlbGFibGVfc2l6ZSA8IDQpIHRocm93IG5ldyBhbmRyb2lkLm9zLkJhZFBhcmNlbGFibGVFeGNlcHRpb24oIlBhcmNlbGFibGUgdG9vIHNtYWxsIik7OworICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgIHN0YXR1cyA9IF9haWRsX3BhcmNlbC5yZWFkQnl0ZSgpOworICAgIH0gZmluYWxseSB7CisgICAgICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gKEludGVnZXIuTUFYX1ZBTFVFIC0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSkgeworICAgICAgICB0aHJvdyBuZXcgYW5kcm9pZC5vcy5CYWRQYXJjZWxhYmxlRXhjZXB0aW9uKCJPdmVyZmxvdyBpbiB0aGUgc2l6ZSBvZiBwYXJjZWxhYmxlIik7CisgICAgICB9CisgICAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgfQorICB9CisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgaW50IF9tYXNrID0gMDsKKyAgICByZXR1cm4gX21hc2s7CisgIH0KKyAgcHVibGljIHN0YXRpYyBAaW50ZXJmYWNlIFN0YXR1cyB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9LID0gMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgTk9UX09LID0gMTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL1BhcmNlbGFibGVXaXRoTmVzdGVkLmphdmEuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9QYXJjZWxhYmxlV2l0aE5lc3RlZC5qYXZhLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY3YThjNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9QYXJjZWxhYmxlV2l0aE5lc3RlZC5qYXZhLmQKQEAgLTAsMCArMSwyIEBACitvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9QYXJjZWxhYmxlV2l0aE5lc3RlZC5qYXZhIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL1BhcmNlbGFibGVXaXRoTmVzdGVkLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9FbnVtVW5pb24uamF2YSBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9FbnVtVW5pb24uamF2YQppbmRleCAwZThhYzkzLi43NTE5ZmQ0IDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvRW51bVVuaW9uLmphdmEKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL0VudW1Vbmlvbi5qYXZhCkBAIC0yLDExICsyLDExIEBACiAgKiBUaGlzIGZpbGUgaXMgYXV0by1nZW5lcmF0ZWQuICBETyBOT1QgTU9ESUZZLgogICovCiBwYWNrYWdlIGFuZHJvaWQuYWlkbC50ZXN0cy51bmlvbnM7Ci0KIHB1YmxpYyBmaW5hbCBjbGFzcyBFbnVtVW5pb24gaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUgewogICAvLyB0YWdzIGZvciB1bmlvbiBmaWVsZHMKICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgaW50RW51bSA9IDA7ICAvLyBhbmRyb2lkLmFpZGwudGVzdHMuSW50RW51bSBpbnRFbnVtOwogICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBsb25nRW51bSA9IDE7ICAvLyBhbmRyb2lkLmFpZGwudGVzdHMuTG9uZ0VudW0gbG9uZ0VudW07CisgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IGRlcHJlY2F0ZWRGaWVsZCA9IDI7ICAvLyBpbnQgZGVwcmVjYXRlZEZpZWxkOwogCiAgIHByaXZhdGUgaW50IF90YWc7CiAgIHByaXZhdGUgT2JqZWN0IF92YWx1ZTsKQEAgLTYwLDYgKzYwLDIzIEBACiAgICAgX3NldChsb25nRW51bSwgX3ZhbHVlKTsKICAgfQogCisgIC8vIGludCBkZXByZWNhdGVkRmllbGQ7CisKKyAgLyoqIEBkZXByZWNhdGVkIGRvIG5vdCB1c2UgdGhpcyAqLworICBARGVwcmVjYXRlZAorICBwdWJsaWMgc3RhdGljIEVudW1VbmlvbiBkZXByZWNhdGVkRmllbGQoaW50IF92YWx1ZSkgeworICAgIHJldHVybiBuZXcgRW51bVVuaW9uKGRlcHJlY2F0ZWRGaWVsZCwgX3ZhbHVlKTsKKyAgfQorCisgIHB1YmxpYyBpbnQgZ2V0RGVwcmVjYXRlZEZpZWxkKCkgeworICAgIF9hc3NlcnRUYWcoZGVwcmVjYXRlZEZpZWxkKTsKKyAgICByZXR1cm4gKGludCkgX3ZhbHVlOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0RGVwcmVjYXRlZEZpZWxkKGludCBfdmFsdWUpIHsKKyAgICBfc2V0KGRlcHJlY2F0ZWRGaWVsZCwgX3ZhbHVlKTsKKyAgfQorCiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3I8RW51bVVuaW9uPiBDUkVBVE9SID0gbmV3IGFuZHJvaWQub3MuUGFyY2VsYWJsZS5DcmVhdG9yPEVudW1Vbmlvbj4oKSB7CiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEVudW1VbmlvbiBjcmVhdGVGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3NvdXJjZSkgewpAQCAtODEsNiArOTgsOSBAQAogICAgIGNhc2UgbG9uZ0VudW06CiAgICAgICBfYWlkbF9wYXJjZWwud3JpdGVMb25nKGdldExvbmdFbnVtKCkpOwogICAgICAgYnJlYWs7CisgICAgY2FzZSBkZXByZWNhdGVkRmllbGQ6CisgICAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoZ2V0RGVwcmVjYXRlZEZpZWxkKCkpOworICAgICAgYnJlYWs7CiAgICAgfQogICB9CiAKQEAgLTk4LDYgKzExOCwxMSBAQAogICAgICAgX2FpZGxfdmFsdWUgPSBfYWlkbF9wYXJjZWwucmVhZExvbmcoKTsKICAgICAgIF9zZXQoX2FpZGxfdGFnLCBfYWlkbF92YWx1ZSk7CiAgICAgICByZXR1cm47IH0KKyAgICBjYXNlIGRlcHJlY2F0ZWRGaWVsZDogeworICAgICAgaW50IF9haWRsX3ZhbHVlOworICAgICAgX2FpZGxfdmFsdWUgPSBfYWlkbF9wYXJjZWwucmVhZEludCgpOworICAgICAgX3NldChfYWlkbF90YWcsIF9haWRsX3ZhbHVlKTsKKyAgICAgIHJldHVybjsgfQogICAgIH0KICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmlvbjogdW5rbm93biB0YWc6ICIgKyBfYWlkbF90YWcpOwogICB9CkBAIC0xMTMsOCArMTM4LDkgQEAKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgc3dpdGNoIChfdGFnKSB7Ci0gICAgY2FzZSBpbnRFbnVtOiByZXR1cm4gImFuZHJvaWQuYWlkbC50ZXN0cy51bmlvbnMuRW51bVVuaW9uLmludEVudW0oIiArIChnZXRJbnRFbnVtKCkpICsgIikiOworICAgIGNhc2UgaW50RW51bTogcmV0dXJuICJhbmRyb2lkLmFpZGwudGVzdHMudW5pb25zLkVudW1Vbmlvbi5pbnRFbnVtKCIgKyAoYW5kcm9pZC5haWRsLnRlc3RzLkludEVudW0uJC50b1N0cmluZyhnZXRJbnRFbnVtKCkpKSArICIpIjsKICAgICBjYXNlIGxvbmdFbnVtOiByZXR1cm4gImFuZHJvaWQuYWlkbC50ZXN0cy51bmlvbnMuRW51bVVuaW9uLmxvbmdFbnVtKCIgKyAoZ2V0TG9uZ0VudW0oKSkgKyAiKSI7CisgICAgY2FzZSBkZXByZWNhdGVkRmllbGQ6IHJldHVybiAiYW5kcm9pZC5haWRsLnRlc3RzLnVuaW9ucy5FbnVtVW5pb24uZGVwcmVjYXRlZEZpZWxkKCIgKyAoZ2V0RGVwcmVjYXRlZEZpZWxkKCkpICsgIikiOwogICAgIH0KICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ1bmtub3duIGZpZWxkOiAiICsgX3RhZyk7CiAgIH0KQEAgLTE0NCw2ICsxNzAsNyBAQAogICAgIHN3aXRjaCAoX3RhZykgewogICAgIGNhc2UgaW50RW51bTogcmV0dXJuICJpbnRFbnVtIjsKICAgICBjYXNlIGxvbmdFbnVtOiByZXR1cm4gImxvbmdFbnVtIjsKKyAgICBjYXNlIGRlcHJlY2F0ZWRGaWVsZDogcmV0dXJuICJkZXByZWNhdGVkRmllbGQiOwogICAgIH0KICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ1bmtub3duIGZpZWxkOiAiICsgX3RhZyk7CiAgIH0KQEAgLTE1Miw0ICsxNzksMTEgQEAKICAgICB0aGlzLl90YWcgPSBfdGFnOwogICAgIHRoaXMuX3ZhbHVlID0gX3ZhbHVlOwogICB9CisgIHB1YmxpYyBzdGF0aWMgQGludGVyZmFjZSBUYWcgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGludEVudW0gPSAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxvbmdFbnVtID0gMTsKKyAgICAvKiogQGRlcHJlY2F0ZWQgZG8gbm90IHVzZSB0aGlzICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBkZXByZWNhdGVkRmllbGQgPSAyOworICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvVW5pb25JblVuaW9uLmphdmEgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvVW5pb25JblVuaW9uLmphdmEKaW5kZXggYTE0NTdlMC4uNDY1MzkwMCAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL1VuaW9uSW5Vbmlvbi5qYXZhCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9VbmlvbkluVW5pb24uamF2YQpAQCAtMiw3ICsyLDYgQEAKICAqIFRoaXMgZmlsZSBpcyBhdXRvLWdlbmVyYXRlZC4gIERPIE5PVCBNT0RJRlkuCiAgKi8KIHBhY2thZ2UgYW5kcm9pZC5haWRsLnRlc3RzLnVuaW9uczsKLQogcHVibGljIGZpbmFsIGNsYXNzIFVuaW9uSW5VbmlvbiBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSB7CiAgIC8vIHRhZ3MgZm9yIHVuaW9uIGZpZWxkcwogICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBmaXJzdCA9IDA7ICAvLyBhbmRyb2lkLmFpZGwudGVzdHMudW5pb25zLkVudW1VbmlvbiBmaXJzdDsKQEAgLTc2LDEzICs3NSw3IEBACiAgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KF90YWcpOwogICAgIHN3aXRjaCAoX3RhZykgewogICAgIGNhc2UgZmlyc3Q6Ci0gICAgICBpZiAoKGdldEZpcnN0KCkhPW51bGwpKSB7Ci0gICAgICAgIF9haWRsX3BhcmNlbC53cml0ZUludCgxKTsKLSAgICAgICAgZ2V0Rmlyc3QoKS53cml0ZVRvUGFyY2VsKF9haWRsX3BhcmNlbCwgMCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KDApOwotICAgICAgfQorICAgICAgX2FpZGxfcGFyY2VsLndyaXRlVHlwZWRPYmplY3QoZ2V0Rmlyc3QoKSwgX2FpZGxfZmxhZyk7CiAgICAgICBicmVhazsKICAgICBjYXNlIHNlY29uZDoKICAgICAgIF9haWRsX3BhcmNlbC53cml0ZUludChnZXRTZWNvbmQoKSk7CkBAIC05NiwxMiArODksNyBAQAogICAgIHN3aXRjaCAoX2FpZGxfdGFnKSB7CiAgICAgY2FzZSBmaXJzdDogewogICAgICAgYW5kcm9pZC5haWRsLnRlc3RzLnVuaW9ucy5FbnVtVW5pb24gX2FpZGxfdmFsdWU7Ci0gICAgICBpZiAoKDAhPV9haWRsX3BhcmNlbC5yZWFkSW50KCkpKSB7Ci0gICAgICAgIF9haWRsX3ZhbHVlID0gYW5kcm9pZC5haWRsLnRlc3RzLnVuaW9ucy5FbnVtVW5pb24uQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKF9haWRsX3BhcmNlbCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgX2FpZGxfdmFsdWUgPSBudWxsOwotICAgICAgfQorICAgICAgX2FpZGxfdmFsdWUgPSBfYWlkbF9wYXJjZWwucmVhZFR5cGVkT2JqZWN0KGFuZHJvaWQuYWlkbC50ZXN0cy51bmlvbnMuRW51bVVuaW9uLkNSRUFUT1IpOwogICAgICAgX3NldChfYWlkbF90YWcsIF9haWRsX3ZhbHVlKTsKICAgICAgIHJldHVybjsgfQogICAgIGNhc2Ugc2Vjb25kOiB7CkBAIC0xNzMsNCArMTYxLDggQEAKICAgICB0aGlzLl90YWcgPSBfdGFnOwogICAgIHRoaXMuX3ZhbHVlID0gX3ZhbHVlOwogICB9CisgIHB1YmxpYyBzdGF0aWMgQGludGVyZmFjZSBUYWcgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGZpcnN0ID0gMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBzZWNvbmQgPSAxOworICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvVW5pb25JblVuaW9uLmphdmEuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9VbmlvbkluVW5pb24uamF2YS5kCmluZGV4IGY1YzIxMjMuLjdkMjdmZGQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9VbmlvbkluVW5pb24uamF2YS5kCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9VbmlvbkluVW5pb24uamF2YS5kCkBAIC0xLDMgKzEsNSBAQAogb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvVW5pb25JblVuaW9uLmphdmEgOiBcCiAgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvVW5pb25JblVuaW9uLmFpZGwgXAotICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL0VudW1Vbmlvbi5haWRsCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvRW51bVVuaW9uLmFpZGwgXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvSW50RW51bS5haWRsIFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0xvbmdFbnVtLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvQXJyYXlPZkludGVyZmFjZXMuY3BwIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9BcnJheU9mSW50ZXJmYWNlcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQyYzM3MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvQXJyYXlPZkludGVyZmFjZXMuY3BwCkBAIC0wLDAgKzEsNDc3IEBACisjaW5jbHVkZSAiYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQXJyYXlPZkludGVyZmFjZXMuaCIKKworI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3BhcmNlbF91dGlscy5oPgorCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworY29uc3QgY2hhciogQXJyYXlPZkludGVyZmFjZXM6OmRlc2NyaXB0b3IgPSAiYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzIjsKKworYmluZGVyX3N0YXR1c190IEFycmF5T2ZJbnRlcmZhY2VzOjpyZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBfYWlkbF9wYXJjZWwpIHsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBTVEFUVVNfT0s7CisgIGludDMyX3QgX2FpZGxfc3RhcnRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKTsKKyAgaW50MzJfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSAwOworICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzIoX2FpZGxfcGFyY2VsLCAmX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9zaXplIDwgNCkgcmV0dXJuIFNUQVRVU19CQURfVkFMVUU7CisgIGlmIChfYWlkbF9zdGFydF9wb3MgPiBJTlQzMl9NQVggLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybiBTVEFUVVNfQkFEX1ZBTFVFOworICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorYmluZGVyX3N0YXR1c190IEFycmF5T2ZJbnRlcmZhY2VzOjp3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1czsKKyAgc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIoX2FpZGxfcGFyY2VsLCAwKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBzaXplX3QgX2FpZGxfZW5kX3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zKTsKKyAgQVBhcmNlbF93cml0ZUludDMyKF9haWRsX3BhcmNlbCwgX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfZW5kX3Bvcyk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CitzdGF0aWMgYmluZGVyX3N0YXR1c190IF9haWRsX2FuZHJvaWRfYWlkbF90ZXN0c19BcnJheU9mSW50ZXJmYWNlc19JRW1wdHlJbnRlcmZhY2Vfb25UcmFuc2FjdChBSUJpbmRlciogX2FpZGxfYmluZGVyLCB0cmFuc2FjdGlvbl9jb2RlX3QgX2FpZGxfY29kZSwgY29uc3QgQVBhcmNlbCogX2FpZGxfaW4sIEFQYXJjZWwqIF9haWRsX291dCkgeworICAodm9pZClfYWlkbF9pbjsKKyAgKHZvaWQpX2FpZGxfb3V0OworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OOworICAodm9pZClfYWlkbF9iaW5kZXI7CisgICh2b2lkKV9haWRsX2NvZGU7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorCitzdGF0aWMgQUlCaW5kZXJfQ2xhc3MqIF9nX2FpZGxfYW5kcm9pZF9haWRsX3Rlc3RzX0FycmF5T2ZJbnRlcmZhY2VzX0lFbXB0eUludGVyZmFjZV9jbGF6eiA9IDo6bmRrOjpJQ0ludGVyZmFjZTo6ZGVmaW5lQ2xhc3MoQXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZTo6ZGVzY3JpcHRvciwgX2FpZGxfYW5kcm9pZF9haWRsX3Rlc3RzX0FycmF5T2ZJbnRlcmZhY2VzX0lFbXB0eUludGVyZmFjZV9vblRyYW5zYWN0KTsKKworQXJyYXlPZkludGVyZmFjZXM6OkJwRW1wdHlJbnRlcmZhY2U6OkJwRW1wdHlJbnRlcmZhY2UoY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGJpbmRlcikgOiBCcENJbnRlcmZhY2UoYmluZGVyKSB7fQorQXJyYXlPZkludGVyZmFjZXM6OkJwRW1wdHlJbnRlcmZhY2U6On5CcEVtcHR5SW50ZXJmYWNlKCkge30KKworLy8gU291cmNlIGZvciBCbkVtcHR5SW50ZXJmYWNlCitBcnJheU9mSW50ZXJmYWNlczo6Qm5FbXB0eUludGVyZmFjZTo6Qm5FbXB0eUludGVyZmFjZSgpIHt9CitBcnJheU9mSW50ZXJmYWNlczo6Qm5FbXB0eUludGVyZmFjZTo6fkJuRW1wdHlJbnRlcmZhY2UoKSB7fQorOjpuZGs6OlNwQUlCaW5kZXIgQXJyYXlPZkludGVyZmFjZXM6OkJuRW1wdHlJbnRlcmZhY2U6OmNyZWF0ZUJpbmRlcigpIHsKKyAgQUlCaW5kZXIqIGJpbmRlciA9IEFJQmluZGVyX25ldyhfZ19haWRsX2FuZHJvaWRfYWlkbF90ZXN0c19BcnJheU9mSW50ZXJmYWNlc19JRW1wdHlJbnRlcmZhY2VfY2xhenosIHN0YXRpY19jYXN0PHZvaWQqPih0aGlzKSk7CisgICNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgQUlCaW5kZXJfbWFya0NvbXBpbGF0aW9uVW5pdFN0YWJpbGl0eShiaW5kZXIpOworICAjZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICByZXR1cm4gOjpuZGs6OlNwQUlCaW5kZXIoYmluZGVyKTsKK30KKy8vIFNvdXJjZSBmb3IgSUVtcHR5SW50ZXJmYWNlCitjb25zdCBjaGFyKiBBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlOjpkZXNjcmlwdG9yID0gImFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UiOworQXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZTo6SUVtcHR5SW50ZXJmYWNlKCkge30KK0FycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U6On5JRW1wdHlJbnRlcmZhY2UoKSB7fQorCisKK3N0ZDo6c2hhcmVkX3B0cjxBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPiBBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlOjpmcm9tQmluZGVyKGNvbnN0IDo6bmRrOjpTcEFJQmluZGVyJiBiaW5kZXIpIHsKKyAgaWYgKCFBSUJpbmRlcl9hc3NvY2lhdGVDbGFzcyhiaW5kZXIuZ2V0KCksIF9nX2FpZGxfYW5kcm9pZF9haWRsX3Rlc3RzX0FycmF5T2ZJbnRlcmZhY2VzX0lFbXB0eUludGVyZmFjZV9jbGF6eikpIHsgcmV0dXJuIG51bGxwdHI7IH0KKyAgc3RkOjpzaGFyZWRfcHRyPDo6bmRrOjpJQ0ludGVyZmFjZT4gaW50ZXJmYWNlID0gOjpuZGs6OklDSW50ZXJmYWNlOjphc0ludGVyZmFjZShiaW5kZXIuZ2V0KCkpOworICBpZiAoaW50ZXJmYWNlKSB7CisgICAgcmV0dXJuIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxJRW1wdHlJbnRlcmZhY2U+KGludGVyZmFjZSk7CisgIH0KKyAgcmV0dXJuIDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPEFycmF5T2ZJbnRlcmZhY2VzOjpCcEVtcHR5SW50ZXJmYWNlPihiaW5kZXIpOworfQorCitiaW5kZXJfc3RhdHVzX3QgQXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZTo6d3JpdGVUb1BhcmNlbChBUGFyY2VsKiBwYXJjZWwsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJRW1wdHlJbnRlcmZhY2U+JiBpbnN0YW5jZSkgeworICByZXR1cm4gQVBhcmNlbF93cml0ZVN0cm9uZ0JpbmRlcihwYXJjZWwsIGluc3RhbmNlID8gaW5zdGFuY2UtPmFzQmluZGVyKCkuZ2V0KCkgOiBudWxscHRyKTsKK30KK2JpbmRlcl9zdGF0dXNfdCBBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlOjpyZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBwYXJjZWwsIHN0ZDo6c2hhcmVkX3B0cjxJRW1wdHlJbnRlcmZhY2U+KiBpbnN0YW5jZSkgeworICA6Om5kazo6U3BBSUJpbmRlciBiaW5kZXI7CisgIGJpbmRlcl9zdGF0dXNfdCBzdGF0dXMgPSBBUGFyY2VsX3JlYWRTdHJvbmdCaW5kZXIocGFyY2VsLCBiaW5kZXIuZ2V0UigpKTsKKyAgaWYgKHN0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBzdGF0dXM7CisgICppbnN0YW5jZSA9IElFbXB0eUludGVyZmFjZTo6ZnJvbUJpbmRlcihiaW5kZXIpOworICByZXR1cm4gU1RBVFVTX09LOworfQorYm9vbCBBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlOjpzZXREZWZhdWx0SW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SUVtcHR5SW50ZXJmYWNlPiYgaW1wbCkgeworICAvLyBPbmx5IG9uZSB1c2VyIG9mIHRoaXMgaW50ZXJmYWNlIGNhbiB1c2UgdGhpcyBmdW5jdGlvbgorICAvLyBhdCBhIHRpbWUuIFRoaXMgaXMgYSBoZXVyaXN0aWMgdG8gZGV0ZWN0IGlmIHR3byBkaWZmZXJlbnQKKyAgLy8gdXNlcnMgaW4gdGhlIHNhbWUgcHJvY2VzcyB1c2UgdGhpcyBmdW5jdGlvbi4KKyAgYXNzZXJ0KCFJRW1wdHlJbnRlcmZhY2U6OmRlZmF1bHRfaW1wbCk7CisgIGlmIChpbXBsKSB7CisgICAgSUVtcHR5SW50ZXJmYWNlOjpkZWZhdWx0X2ltcGwgPSBpbXBsOworICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KK2NvbnN0IHN0ZDo6c2hhcmVkX3B0cjxBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPiYgQXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZTo6Z2V0RGVmYXVsdEltcGwoKSB7CisgIHJldHVybiBJRW1wdHlJbnRlcmZhY2U6OmRlZmF1bHRfaW1wbDsKK30KK3N0ZDo6c2hhcmVkX3B0cjxBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPiBBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlOjpkZWZhdWx0X2ltcGwgPSBudWxscHRyOworOjpuZGs6OlNwQUlCaW5kZXIgQXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZURlZmF1bHQ6OmFzQmluZGVyKCkgeworICByZXR1cm4gOjpuZGs6OlNwQUlCaW5kZXIoKTsKK30KK2Jvb2wgQXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZURlZmF1bHQ6OmlzUmVtb3RlKCkgeworICByZXR1cm4gZmFsc2U7Cit9Cit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CitzdGF0aWMgYmluZGVyX3N0YXR1c190IF9haWRsX2FuZHJvaWRfYWlkbF90ZXN0c19BcnJheU9mSW50ZXJmYWNlc19JTXlJbnRlcmZhY2Vfb25UcmFuc2FjdChBSUJpbmRlciogX2FpZGxfYmluZGVyLCB0cmFuc2FjdGlvbl9jb2RlX3QgX2FpZGxfY29kZSwgY29uc3QgQVBhcmNlbCogX2FpZGxfaW4sIEFQYXJjZWwqIF9haWRsX291dCkgeworICAodm9pZClfYWlkbF9pbjsKKyAgKHZvaWQpX2FpZGxfb3V0OworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OOworICBzdGQ6OnNoYXJlZF9wdHI8QXJyYXlPZkludGVyZmFjZXM6OkJuTXlJbnRlcmZhY2U+IF9haWRsX2ltcGwgPSBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QXJyYXlPZkludGVyZmFjZXM6OkJuTXlJbnRlcmZhY2U+KDo6bmRrOjpJQ0ludGVyZmFjZTo6YXNJbnRlcmZhY2UoX2FpZGxfYmluZGVyKSk7CisgIHN3aXRjaCAoX2FpZGxfY29kZSkgeworICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAwIC8qbWV0aG9kV2l0aEludGVyZmFjZXMqLyk6IHsKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPiBpbl9pZmFjZTsKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPiBpbl9udWxsYWJsZV9pZmFjZTsKKyAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4gaW5faWZhY2VfYXJyYXlfaW47CisgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+IG91dF9pZmFjZV9hcnJheV9vdXQ7CisgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+IGluX2lmYWNlX2FycmF5X2lub3V0OworICAgICAgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PiBpbl9udWxsYWJsZV9pZmFjZV9hcnJheV9pbjsKKyAgICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4gb3V0X251bGxhYmxlX2lmYWNlX2FycmF5X291dDsKKyAgICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4gaW5fbnVsbGFibGVfaWZhY2VfYXJyYXlfaW5vdXQ7CisgICAgICBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+IF9haWRsX3JldHVybjsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX2luLCAmaW5faWZhY2UpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfaW4sICZpbl9udWxsYWJsZV9pZmFjZSk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfaW4sICZpbl9pZmFjZV9hcnJheV9pbik7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVzaXplVmVjdG9yKF9haWRsX2luLCAmb3V0X2lmYWNlX2FycmF5X291dCk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfaW4sICZpbl9pZmFjZV9hcnJheV9pbm91dCk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9pbiwgJmluX251bGxhYmxlX2lmYWNlX2FycmF5X2luKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZXNpemVWZWN0b3IoX2FpZGxfaW4sICZvdXRfbnVsbGFibGVfaWZhY2VfYXJyYXlfb3V0KTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX2luLCAmaW5fbnVsbGFibGVfaWZhY2VfYXJyYXlfaW5vdXQpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzID0gX2FpZGxfaW1wbC0+bWV0aG9kV2l0aEludGVyZmFjZXMoaW5faWZhY2UsIGluX251bGxhYmxlX2lmYWNlLCBpbl9pZmFjZV9hcnJheV9pbiwgJm91dF9pZmFjZV9hcnJheV9vdXQsICZpbl9pZmFjZV9hcnJheV9pbm91dCwgaW5fbnVsbGFibGVfaWZhY2VfYXJyYXlfaW4sICZvdXRfbnVsbGFibGVfaWZhY2VfYXJyYXlfb3V0LCAmaW5fbnVsbGFibGVfaWZhY2VfYXJyYXlfaW5vdXQsICZfYWlkbF9yZXR1cm4pOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVTdGF0dXNIZWFkZXIoX2FpZGxfb3V0LCBfYWlkbF9zdGF0dXMuZ2V0KCkpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7CisKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgb3V0X2lmYWNlX2FycmF5X291dCk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgaW5faWZhY2VfYXJyYXlfaW5vdXQpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX291dCwgb3V0X251bGxhYmxlX2lmYWNlX2FycmF5X291dCk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfb3V0LCBpbl9udWxsYWJsZV9pZmFjZV9hcnJheV9pbm91dCk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9CisKK3N0YXRpYyBBSUJpbmRlcl9DbGFzcyogX2dfYWlkbF9hbmRyb2lkX2FpZGxfdGVzdHNfQXJyYXlPZkludGVyZmFjZXNfSU15SW50ZXJmYWNlX2NsYXp6ID0gOjpuZGs6OklDSW50ZXJmYWNlOjpkZWZpbmVDbGFzcyhBcnJheU9mSW50ZXJmYWNlczo6SU15SW50ZXJmYWNlOjpkZXNjcmlwdG9yLCBfYWlkbF9hbmRyb2lkX2FpZGxfdGVzdHNfQXJyYXlPZkludGVyZmFjZXNfSU15SW50ZXJmYWNlX29uVHJhbnNhY3QpOworCitBcnJheU9mSW50ZXJmYWNlczo6QnBNeUludGVyZmFjZTo6QnBNeUludGVyZmFjZShjb25zdCA6Om5kazo6U3BBSUJpbmRlciYgYmluZGVyKSA6IEJwQ0ludGVyZmFjZShiaW5kZXIpIHt9CitBcnJheU9mSW50ZXJmYWNlczo6QnBNeUludGVyZmFjZTo6fkJwTXlJbnRlcmZhY2UoKSB7fQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBBcnJheU9mSW50ZXJmYWNlczo6QnBNeUludGVyZmFjZTo6bWV0aG9kV2l0aEludGVyZmFjZXMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+JiBpbl9pZmFjZSwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+JiBpbl9udWxsYWJsZV9pZmFjZSwgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+PiYgaW5faWZhY2VfYXJyYXlfaW4sIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4qIG91dF9pZmFjZV9hcnJheV9vdXQsIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4qIGluX2lmYWNlX2FycmF5X2lub3V0LCBjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+JiBpbl9udWxsYWJsZV9pZmFjZV9hcnJheV9pbiwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+Piogb3V0X251bGxhYmxlX2lmYWNlX2FycmF5X291dCwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PiogaW5fbnVsbGFibGVfaWZhY2VfYXJyYXlfaW5vdXQsIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4qIF9haWRsX3JldHVybikgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19PSzsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOworICA6Om5kazo6U2NvcGVkQVBhcmNlbCBfYWlkbF9pbjsKKyAgOjpuZGs6OlNjb3BlZEFQYXJjZWwgX2FpZGxfb3V0OworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl9wcmVwYXJlVHJhbnNhY3Rpb24oYXNCaW5kZXIoKS5nZXQoKSwgX2FpZGxfaW4uZ2V0UigpKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX2lmYWNlKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5fbnVsbGFibGVfaWZhY2UpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5faWZhY2VfYXJyYXlfaW4pOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yU2l6ZShfYWlkbF9pbi5nZXQoKSwgKm91dF9pZmFjZV9hcnJheV9vdXQpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgKmluX2lmYWNlX2FycmF5X2lub3V0KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5fbnVsbGFibGVfaWZhY2VfYXJyYXlfaW4pOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yU2l6ZShfYWlkbF9pbi5nZXQoKSwgKm91dF9udWxsYWJsZV9pZmFjZV9hcnJheV9vdXQpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX2luLmdldCgpLCAqaW5fbnVsbGFibGVfaWZhY2VfYXJyYXlfaW5vdXQpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KAorICAgIGFzQmluZGVyKCkuZ2V0KCksCisgICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAwIC8qbWV0aG9kV2l0aEludGVyZmFjZXMqLyksCisgICAgX2FpZGxfaW4uZ2V0UigpLAorICAgIF9haWRsX291dC5nZXRSKCksCisgICAgMAorICAgICNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgICB8IEZMQUdfUFJJVkFURV9MT0NBTAorICAgICNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgICAgKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgPT0gU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT04gJiYgSU15SW50ZXJmYWNlOjpnZXREZWZhdWx0SW1wbCgpKSB7CisgICAgX2FpZGxfc3RhdHVzID0gSU15SW50ZXJmYWNlOjpnZXREZWZhdWx0SW1wbCgpLT5tZXRob2RXaXRoSW50ZXJmYWNlcyhpbl9pZmFjZSwgaW5fbnVsbGFibGVfaWZhY2UsIGluX2lmYWNlX2FycmF5X2luLCBvdXRfaWZhY2VfYXJyYXlfb3V0LCBpbl9pZmFjZV9hcnJheV9pbm91dCwgaW5fbnVsbGFibGVfaWZhY2VfYXJyYXlfaW4sIG91dF9udWxsYWJsZV9pZmFjZV9hcnJheV9vdXQsIGluX251bGxhYmxlX2lmYWNlX2FycmF5X2lub3V0LCBfYWlkbF9yZXR1cm4pOworICAgIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKKyAgfQorICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZFN0YXR1c0hlYWRlcihfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3N0YXR1cy5nZXRSKCkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBvdXRfaWZhY2VfYXJyYXlfb3V0KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIGluX2lmYWNlX2FycmF5X2lub3V0KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX291dC5nZXQoKSwgb3V0X251bGxhYmxlX2lmYWNlX2FycmF5X291dCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9vdXQuZ2V0KCksIGluX251bGxhYmxlX2lmYWNlX2FycmF5X2lub3V0KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX2Vycm9yOgorICBfYWlkbF9zdGF0dXMuc2V0KEFTdGF0dXNfZnJvbVN0YXR1cyhfYWlkbF9yZXRfc3RhdHVzKSk7CisgIF9haWRsX3N0YXR1c19yZXR1cm46CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9CisvLyBTb3VyY2UgZm9yIEJuTXlJbnRlcmZhY2UKK0FycmF5T2ZJbnRlcmZhY2VzOjpCbk15SW50ZXJmYWNlOjpCbk15SW50ZXJmYWNlKCkge30KK0FycmF5T2ZJbnRlcmZhY2VzOjpCbk15SW50ZXJmYWNlOjp+Qm5NeUludGVyZmFjZSgpIHt9Cis6Om5kazo6U3BBSUJpbmRlciBBcnJheU9mSW50ZXJmYWNlczo6Qm5NeUludGVyZmFjZTo6Y3JlYXRlQmluZGVyKCkgeworICBBSUJpbmRlciogYmluZGVyID0gQUlCaW5kZXJfbmV3KF9nX2FpZGxfYW5kcm9pZF9haWRsX3Rlc3RzX0FycmF5T2ZJbnRlcmZhY2VzX0lNeUludGVyZmFjZV9jbGF6eiwgc3RhdGljX2Nhc3Q8dm9pZCo+KHRoaXMpKTsKKyAgI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICBBSUJpbmRlcl9tYXJrQ29tcGlsYXRpb25Vbml0U3RhYmlsaXR5KGJpbmRlcik7CisgICNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgIHJldHVybiA6Om5kazo6U3BBSUJpbmRlcihiaW5kZXIpOworfQorLy8gU291cmNlIGZvciBJTXlJbnRlcmZhY2UKK2NvbnN0IGNoYXIqIEFycmF5T2ZJbnRlcmZhY2VzOjpJTXlJbnRlcmZhY2U6OmRlc2NyaXB0b3IgPSAiYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklNeUludGVyZmFjZSI7CitBcnJheU9mSW50ZXJmYWNlczo6SU15SW50ZXJmYWNlOjpJTXlJbnRlcmZhY2UoKSB7fQorQXJyYXlPZkludGVyZmFjZXM6OklNeUludGVyZmFjZTo6fklNeUludGVyZmFjZSgpIHt9CisKKworc3RkOjpzaGFyZWRfcHRyPEFycmF5T2ZJbnRlcmZhY2VzOjpJTXlJbnRlcmZhY2U+IEFycmF5T2ZJbnRlcmZhY2VzOjpJTXlJbnRlcmZhY2U6OmZyb21CaW5kZXIoY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGJpbmRlcikgeworICBpZiAoIUFJQmluZGVyX2Fzc29jaWF0ZUNsYXNzKGJpbmRlci5nZXQoKSwgX2dfYWlkbF9hbmRyb2lkX2FpZGxfdGVzdHNfQXJyYXlPZkludGVyZmFjZXNfSU15SW50ZXJmYWNlX2NsYXp6KSkgeyByZXR1cm4gbnVsbHB0cjsgfQorICBzdGQ6OnNoYXJlZF9wdHI8OjpuZGs6OklDSW50ZXJmYWNlPiBpbnRlcmZhY2UgPSA6Om5kazo6SUNJbnRlcmZhY2U6OmFzSW50ZXJmYWNlKGJpbmRlci5nZXQoKSk7CisgIGlmIChpbnRlcmZhY2UpIHsKKyAgICByZXR1cm4gc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PElNeUludGVyZmFjZT4oaW50ZXJmYWNlKTsKKyAgfQorICByZXR1cm4gOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8QXJyYXlPZkludGVyZmFjZXM6OkJwTXlJbnRlcmZhY2U+KGJpbmRlcik7Cit9CisKK2JpbmRlcl9zdGF0dXNfdCBBcnJheU9mSW50ZXJmYWNlczo6SU15SW50ZXJmYWNlOjp3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIHBhcmNlbCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElNeUludGVyZmFjZT4mIGluc3RhbmNlKSB7CisgIHJldHVybiBBUGFyY2VsX3dyaXRlU3Ryb25nQmluZGVyKHBhcmNlbCwgaW5zdGFuY2UgPyBpbnN0YW5jZS0+YXNCaW5kZXIoKS5nZXQoKSA6IG51bGxwdHIpOworfQorYmluZGVyX3N0YXR1c190IEFycmF5T2ZJbnRlcmZhY2VzOjpJTXlJbnRlcmZhY2U6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIHBhcmNlbCwgc3RkOjpzaGFyZWRfcHRyPElNeUludGVyZmFjZT4qIGluc3RhbmNlKSB7CisgIDo6bmRrOjpTcEFJQmluZGVyIGJpbmRlcjsKKyAgYmluZGVyX3N0YXR1c190IHN0YXR1cyA9IEFQYXJjZWxfcmVhZFN0cm9uZ0JpbmRlcihwYXJjZWwsIGJpbmRlci5nZXRSKCkpOworICBpZiAoc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIHN0YXR1czsKKyAgKmluc3RhbmNlID0gSU15SW50ZXJmYWNlOjpmcm9tQmluZGVyKGJpbmRlcik7CisgIHJldHVybiBTVEFUVVNfT0s7Cit9Citib29sIEFycmF5T2ZJbnRlcmZhY2VzOjpJTXlJbnRlcmZhY2U6OnNldERlZmF1bHRJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJTXlJbnRlcmZhY2U+JiBpbXBsKSB7CisgIC8vIE9ubHkgb25lIHVzZXIgb2YgdGhpcyBpbnRlcmZhY2UgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uCisgIC8vIGF0IGEgdGltZS4gVGhpcyBpcyBhIGhldXJpc3RpYyB0byBkZXRlY3QgaWYgdHdvIGRpZmZlcmVudAorICAvLyB1c2VycyBpbiB0aGUgc2FtZSBwcm9jZXNzIHVzZSB0aGlzIGZ1bmN0aW9uLgorICBhc3NlcnQoIUlNeUludGVyZmFjZTo6ZGVmYXVsdF9pbXBsKTsKKyAgaWYgKGltcGwpIHsKKyAgICBJTXlJbnRlcmZhY2U6OmRlZmF1bHRfaW1wbCA9IGltcGw7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEFycmF5T2ZJbnRlcmZhY2VzOjpJTXlJbnRlcmZhY2U+JiBBcnJheU9mSW50ZXJmYWNlczo6SU15SW50ZXJmYWNlOjpnZXREZWZhdWx0SW1wbCgpIHsKKyAgcmV0dXJuIElNeUludGVyZmFjZTo6ZGVmYXVsdF9pbXBsOworfQorc3RkOjpzaGFyZWRfcHRyPEFycmF5T2ZJbnRlcmZhY2VzOjpJTXlJbnRlcmZhY2U+IEFycmF5T2ZJbnRlcmZhY2VzOjpJTXlJbnRlcmZhY2U6OmRlZmF1bHRfaW1wbCA9IG51bGxwdHI7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBBcnJheU9mSW50ZXJmYWNlczo6SU15SW50ZXJmYWNlRGVmYXVsdDo6bWV0aG9kV2l0aEludGVyZmFjZXMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+JiAvKmluX2lmYWNlKi8sIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPiYgLyppbl9udWxsYWJsZV9pZmFjZSovLCBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+JiAvKmluX2lmYWNlX2FycmF5X2luKi8sIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4qIC8qb3V0X2lmYWNlX2FycmF5X291dCovLCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+KiAvKmluX2lmYWNlX2FycmF5X2lub3V0Ki8sIGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4mIC8qaW5fbnVsbGFibGVfaWZhY2VfYXJyYXlfaW4qLywgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PiogLypvdXRfbnVsbGFibGVfaWZhY2VfYXJyYXlfb3V0Ki8sIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4qIC8qaW5fbnVsbGFibGVfaWZhY2VfYXJyYXlfaW5vdXQqLywgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PiogLypfYWlkbF9yZXR1cm4qLykgeworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIF9haWRsX3N0YXR1cy5zZXQoQVN0YXR1c19mcm9tU3RhdHVzKFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OKSk7CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9Cis6Om5kazo6U3BBSUJpbmRlciBBcnJheU9mSW50ZXJmYWNlczo6SU15SW50ZXJmYWNlRGVmYXVsdDo6YXNCaW5kZXIoKSB7CisgIHJldHVybiA6Om5kazo6U3BBSUJpbmRlcigpOworfQorYm9vbCBBcnJheU9mSW50ZXJmYWNlczo6SU15SW50ZXJmYWNlRGVmYXVsdDo6aXNSZW1vdGUoKSB7CisgIHJldHVybiBmYWxzZTsKK30KK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK2NvbnN0IGNoYXIqIEFycmF5T2ZJbnRlcmZhY2VzOjpNeVBhcmNlbGFibGU6OmRlc2NyaXB0b3IgPSAiYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLk15UGFyY2VsYWJsZSI7CisKK2JpbmRlcl9zdGF0dXNfdCBBcnJheU9mSW50ZXJmYWNlczo6TXlQYXJjZWxhYmxlOjpyZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBfYWlkbF9wYXJjZWwpIHsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBTVEFUVVNfT0s7CisgIGludDMyX3QgX2FpZGxfc3RhcnRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKTsKKyAgaW50MzJfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSAwOworICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzIoX2FpZGxfcGFyY2VsLCAmX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9zaXplIDwgNCkgcmV0dXJuIFNUQVRVU19CQURfVkFMVUU7CisgIGlmIChfYWlkbF9zdGFydF9wb3MgPiBJTlQzMl9NQVggLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybiBTVEFUVVNfQkFEX1ZBTFVFOworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmlmYWNlKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCAmbnVsbGFibGVfaWZhY2UpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmaWZhY2VfYXJyYXkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsICZudWxsYWJsZV9pZmFjZV9hcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KK2JpbmRlcl9zdGF0dXNfdCBBcnJheU9mSW50ZXJmYWNlczo6TXlQYXJjZWxhYmxlOjp3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1czsKKyAgc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIoX2FpZGxfcGFyY2VsLCAwKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgaWZhY2UpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsIG51bGxhYmxlX2lmYWNlKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgaWZhY2VfYXJyYXkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsIG51bGxhYmxlX2lmYWNlX2FycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBzaXplX3QgX2FpZGxfZW5kX3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zKTsKKyAgQVBhcmNlbF93cml0ZUludDMyKF9haWRsX3BhcmNlbCwgX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfZW5kX3Bvcyk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7Citjb25zdCBjaGFyKiBBcnJheU9mSW50ZXJmYWNlczo6TXlVbmlvbjo6ZGVzY3JpcHRvciA9ICJhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuTXlVbmlvbiI7CisKK2JpbmRlcl9zdGF0dXNfdCBBcnJheU9mSW50ZXJmYWNlczo6TXlVbmlvbjo6cmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogX3BhcmNlbCkgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1czsKKyAgaW50MzJfdCBfYWlkbF90YWc7CisgIGlmICgoX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9wYXJjZWwsICZfYWlkbF90YWcpKSAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICBzd2l0Y2ggKHN0YXRpY19jYXN0PFRhZz4oX2FpZGxfdGFnKSkgeworICBjYXNlIGlmYWNlOiB7CisgICAgc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+IF9haWRsX3ZhbHVlOworICAgIGlmICgoX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9wYXJjZWwsICZfYWlkbF92YWx1ZSkpICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgICAgaWYgY29uc3RleHByIChzdGQ6OmlzX3RyaXZpYWxseV9jb3B5YWJsZV92PHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4pIHsKKyAgICAgIHNldDxpZmFjZT4oX2FpZGxfdmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBOT0xJTlRORVhUTElORShwZXJmb3JtYW5jZS1tb3ZlLWNvbnN0LWFyZykKKyAgICAgIHNldDxpZmFjZT4oc3RkOjptb3ZlKF9haWRsX3ZhbHVlKSk7CisgICAgfQorICAgIHJldHVybiBTVEFUVVNfT0s7IH0KKyAgY2FzZSBudWxsYWJsZV9pZmFjZTogeworICAgIHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPiBfYWlkbF92YWx1ZTsKKyAgICBpZiAoKF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9wYXJjZWwsICZfYWlkbF92YWx1ZSkpICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgICAgaWYgY29uc3RleHByIChzdGQ6OmlzX3RyaXZpYWxseV9jb3B5YWJsZV92PHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4pIHsKKyAgICAgIHNldDxudWxsYWJsZV9pZmFjZT4oX2FpZGxfdmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBOT0xJTlRORVhUTElORShwZXJmb3JtYW5jZS1tb3ZlLWNvbnN0LWFyZykKKyAgICAgIHNldDxudWxsYWJsZV9pZmFjZT4oc3RkOjptb3ZlKF9haWRsX3ZhbHVlKSk7CisgICAgfQorICAgIHJldHVybiBTVEFUVVNfT0s7IH0KKyAgY2FzZSBpZmFjZV9hcnJheTogeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4gX2FpZGxfdmFsdWU7CisgICAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX3BhcmNlbCwgJl9haWRsX3ZhbHVlKSkgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgICBpZiBjb25zdGV4cHIgKHN0ZDo6aXNfdHJpdmlhbGx5X2NvcHlhYmxlX3Y8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4pIHsKKyAgICAgIHNldDxpZmFjZV9hcnJheT4oX2FpZGxfdmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBOT0xJTlRORVhUTElORShwZXJmb3JtYW5jZS1tb3ZlLWNvbnN0LWFyZykKKyAgICAgIHNldDxpZmFjZV9hcnJheT4oc3RkOjptb3ZlKF9haWRsX3ZhbHVlKSk7CisgICAgfQorICAgIHJldHVybiBTVEFUVVNfT0s7IH0KKyAgY2FzZSBudWxsYWJsZV9pZmFjZV9hcnJheTogeworICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4gX2FpZGxfdmFsdWU7CisgICAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfcGFyY2VsLCAmX2FpZGxfdmFsdWUpKSAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICAgIGlmIGNvbnN0ZXhwciAoc3RkOjppc190cml2aWFsbHlfY29weWFibGVfdjxzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+PikgeworICAgICAgc2V0PG51bGxhYmxlX2lmYWNlX2FycmF5PihfYWlkbF92YWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIE5PTElOVE5FWFRMSU5FKHBlcmZvcm1hbmNlLW1vdmUtY29uc3QtYXJnKQorICAgICAgc2V0PG51bGxhYmxlX2lmYWNlX2FycmF5PihzdGQ6Om1vdmUoX2FpZGxfdmFsdWUpKTsKKyAgICB9CisgICAgcmV0dXJuIFNUQVRVU19PSzsgfQorICB9CisgIHJldHVybiBTVEFUVVNfQkFEX1ZBTFVFOworfQorYmluZGVyX3N0YXR1c190IEFycmF5T2ZJbnRlcmZhY2VzOjpNeVVuaW9uOjp3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIF9wYXJjZWwpIGNvbnN0IHsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX3BhcmNlbCwgc3RhdGljX2Nhc3Q8aW50MzJfdD4oZ2V0VGFnKCkpKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgc3dpdGNoIChnZXRUYWcoKSkgeworICBjYXNlIGlmYWNlOiByZXR1cm4gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9wYXJjZWwsIGdldDxpZmFjZT4oKSk7CisgIGNhc2UgbnVsbGFibGVfaWZhY2U6IHJldHVybiA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfcGFyY2VsLCBnZXQ8bnVsbGFibGVfaWZhY2U+KCkpOworICBjYXNlIGlmYWNlX2FycmF5OiByZXR1cm4gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9wYXJjZWwsIGdldDxpZmFjZV9hcnJheT4oKSk7CisgIGNhc2UgbnVsbGFibGVfaWZhY2VfYXJyYXk6IHJldHVybiA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfcGFyY2VsLCBnZXQ8bnVsbGFibGVfaWZhY2VfYXJyYXk+KCkpOworICB9CisgIF9fYXNzZXJ0MihfX0ZJTEVfXywgX19MSU5FX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18sICJjYW4ndCByZWFjaCBoZXJlIik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9BcnJheU9mSW50ZXJmYWNlcy5jcHAuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvQXJyYXlPZkludGVyZmFjZXMuY3BwLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY3MDc2YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvQXJyYXlPZkludGVyZmFjZXMuY3BwLmQKQEAgLTAsMCArMSwyIEBACitvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvQXJyYXlPZkludGVyZmFjZXMuY3BwIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvQXJyYXlPZkludGVyZmFjZXMuYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9CYWNrZW5kVHlwZS5jcHAgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0JhY2tlbmRUeXBlLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9CYWNrZW5kVHlwZS5jcHAKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvQmFja2VuZFR5cGUuY3BwCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0JhY2tlbmRUeXBlLmNwcC5kIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9CYWNrZW5kVHlwZS5jcHAuZApzaW1pbGFyaXR5IGluZGV4IDY3JQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0JhY2tlbmRUeXBlLmNwcC5kCnJlbmFtZSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0JhY2tlbmRUeXBlLmNwcC5kCmluZGV4IDc0ZTQ3ZjkuLjg5YTliZjkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvQmFja2VuZFR5cGUuY3BwLmQKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9CYWNrZW5kVHlwZS5jcHAuZApAQCAtMSwyICsxLDIgQEAKLW91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9CYWNrZW5kVHlwZS5jcHAgOiBcCitvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvQmFja2VuZFR5cGUuY3BwIDogXAogICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvQmFja2VuZFR5cGUuYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9CeXRlRW51bS5jcHAgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0J5dGVFbnVtLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9CeXRlRW51bS5jcHAKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvQnl0ZUVudW0uY3BwCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0J5dGVFbnVtLmNwcC5kIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9CeXRlRW51bS5jcHAuZApzaW1pbGFyaXR5IGluZGV4IDY3JQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0J5dGVFbnVtLmNwcC5kCnJlbmFtZSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0J5dGVFbnVtLmNwcC5kCmluZGV4IDUxMDAxMmEuLmM4NThjODAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvQnl0ZUVudW0uY3BwLmQKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9CeXRlRW51bS5jcHAuZApAQCAtMSwyICsxLDIgQEAKLW91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9CeXRlRW51bS5jcHAgOiBcCitvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvQnl0ZUVudW0uY3BwIDogXAogICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvQnl0ZUVudW0uYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9Db25zdGFudEV4cHJlc3Npb25FbnVtLmNwcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvQ29uc3RhbnRFeHByZXNzaW9uRW51bS5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvQ29uc3RhbnRFeHByZXNzaW9uRW51bS5jcHAKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvQ29uc3RhbnRFeHByZXNzaW9uRW51bS5jcHAKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvQ29uc3RhbnRFeHByZXNzaW9uRW51bS5jcHAuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvQ29uc3RhbnRFeHByZXNzaW9uRW51bS5jcHAuZApzaW1pbGFyaXR5IGluZGV4IDY1JQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0NvbnN0YW50RXhwcmVzc2lvbkVudW0uY3BwLmQKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvQ29uc3RhbnRFeHByZXNzaW9uRW51bS5jcHAuZAppbmRleCBhMTk1YzA5Li5kMGFiNTAyIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0NvbnN0YW50RXhwcmVzc2lvbkVudW0uY3BwLmQKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9Db25zdGFudEV4cHJlc3Npb25FbnVtLmNwcC5kCkBAIC0xLDIgKzEsMiBAQAotb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0NvbnN0YW50RXhwcmVzc2lvbkVudW0uY3BwIDogXAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0NvbnN0YW50RXhwcmVzc2lvbkVudW0uY3BwIDogXAogICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvQ29uc3RhbnRFeHByZXNzaW9uRW51bS5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0RlcHJlY2F0ZWRFbnVtLmNwcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvRGVwcmVjYXRlZEVudW0uY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0RlcHJlY2F0ZWRFbnVtLmNwcApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9EZXByZWNhdGVkRW51bS5jcHAKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvRGVwcmVjYXRlZEVudW0uY3BwLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0RlcHJlY2F0ZWRFbnVtLmNwcC5kCnNpbWlsYXJpdHkgaW5kZXggNjYlCnJlbmFtZSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvRGVwcmVjYXRlZEVudW0uY3BwLmQKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvRGVwcmVjYXRlZEVudW0uY3BwLmQKaW5kZXggNDJhYzZhMy4uZTI1ZWM5ZSAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9EZXByZWNhdGVkRW51bS5jcHAuZAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0RlcHJlY2F0ZWRFbnVtLmNwcC5kCkBAIC0xLDIgKzEsMiBAQAotb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0RlcHJlY2F0ZWRFbnVtLmNwcCA6IFwKK291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9EZXByZWNhdGVkRW51bS5jcHAgOiBcCiAgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9EZXByZWNhdGVkRW51bS5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0RlcHJlY2F0ZWRQYXJjZWxhYmxlLmNwcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvRGVwcmVjYXRlZFBhcmNlbGFibGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMmM0YTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0RlcHJlY2F0ZWRQYXJjZWxhYmxlLmNwcApAQCAtMCwwICsxLDM5IEBACisjaW5jbHVkZSAiYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvRGVwcmVjYXRlZFBhcmNlbGFibGUuaCIKKworI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3BhcmNlbF91dGlscy5oPgorCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworY29uc3QgY2hhciogRGVwcmVjYXRlZFBhcmNlbGFibGU6OmRlc2NyaXB0b3IgPSAiYW5kcm9pZC5haWRsLnRlc3RzLkRlcHJlY2F0ZWRQYXJjZWxhYmxlIjsKKworYmluZGVyX3N0YXR1c190IERlcHJlY2F0ZWRQYXJjZWxhYmxlOjpyZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBfYWlkbF9wYXJjZWwpIHsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBTVEFUVVNfT0s7CisgIGludDMyX3QgX2FpZGxfc3RhcnRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKTsKKyAgaW50MzJfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSAwOworICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzIoX2FpZGxfcGFyY2VsLCAmX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9zaXplIDwgNCkgcmV0dXJuIFNUQVRVU19CQURfVkFMVUU7CisgIGlmIChfYWlkbF9zdGFydF9wb3MgPiBJTlQzMl9NQVggLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybiBTVEFUVVNfQkFEX1ZBTFVFOworICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorYmluZGVyX3N0YXR1c190IERlcHJlY2F0ZWRQYXJjZWxhYmxlOjp3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1czsKKyAgc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIoX2FpZGxfcGFyY2VsLCAwKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBzaXplX3QgX2FpZGxfZW5kX3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zKTsKKyAgQVBhcmNlbF93cml0ZUludDMyKF9haWRsX3BhcmNlbCwgX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfZW5kX3Bvcyk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvRGVwcmVjYXRlZFBhcmNlbGFibGUuY3BwLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0RlcHJlY2F0ZWRQYXJjZWxhYmxlLmNwcC5kCnNpbWlsYXJpdHkgaW5kZXggNjUlCnJlbmFtZSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvRGVwcmVjYXRlZFBhcmNlbGFibGUuY3BwLmQKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvRGVwcmVjYXRlZFBhcmNlbGFibGUuY3BwLmQKaW5kZXggMTY4Y2Y2Ni4uZmNjNDM2YyAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9EZXByZWNhdGVkUGFyY2VsYWJsZS5jcHAuZAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0RlcHJlY2F0ZWRQYXJjZWxhYmxlLmNwcC5kCkBAIC0xLDIgKzEsMiBAQAotb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0RlcHJlY2F0ZWRQYXJjZWxhYmxlLmNwcCA6IFwKK291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9EZXByZWNhdGVkUGFyY2VsYWJsZS5jcHAgOiBcCiAgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9EZXByZWNhdGVkUGFyY2VsYWJsZS5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0ZpeGVkU2l6ZS5jcHAgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0ZpeGVkU2l6ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg5YTM4OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvRml4ZWRTaXplLmNwcApAQCAtMCwwICsxLDI3OCBAQAorI2luY2x1ZGUgImFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0ZpeGVkU2l6ZS5oIgorCisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcGFyY2VsX3V0aWxzLmg+CisKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7Citjb25zdCBjaGFyKiBGaXhlZFNpemU6OmRlc2NyaXB0b3IgPSAiYW5kcm9pZC5haWRsLnRlc3RzLkZpeGVkU2l6ZSI7CisKK2JpbmRlcl9zdGF0dXNfdCBGaXhlZFNpemU6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIF9haWRsX3BhcmNlbCkgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19PSzsKKyAgaW50MzJfdCBfYWlkbF9zdGFydF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpOworICBpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IDA7CisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihfYWlkbF9wYXJjZWwsICZfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChfYWlkbF9wYXJjZWxhYmxlX3NpemUgPCA0KSByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTsKKyAgaWYgKF9haWRsX3N0YXJ0X3BvcyA+IElOVDMyX01BWCAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuIFNUQVRVU19CQURfVkFMVUU7CisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9CitiaW5kZXJfc3RhdHVzX3QgRml4ZWRTaXplOjp3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1czsKKyAgc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIoX2FpZGxfcGFyY2VsLCAwKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBzaXplX3QgX2FpZGxfZW5kX3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zKTsKKyAgQVBhcmNlbF93cml0ZUludDMyKF9haWRsX3BhcmNlbCwgX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfZW5kX3Bvcyk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7Citjb25zdCBjaGFyKiBGaXhlZFNpemU6OkZpeGVkUGFyY2VsYWJsZTo6ZGVzY3JpcHRvciA9ICJhbmRyb2lkLmFpZGwudGVzdHMuRml4ZWRTaXplLkZpeGVkUGFyY2VsYWJsZSI7CisKK2JpbmRlcl9zdGF0dXNfdCBGaXhlZFNpemU6OkZpeGVkUGFyY2VsYWJsZTo6cmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogX2FpZGxfcGFyY2VsKSB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX09LOworICBpbnQzMl90IF9haWRsX3N0YXJ0X3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIGludDMyX3QgX2FpZGxfcGFyY2VsYWJsZV9zaXplID0gMDsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyKF9haWRsX3BhcmNlbCwgJl9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKF9haWRsX3BhcmNlbGFibGVfc2l6ZSA8IDQpIHJldHVybiBTVEFUVVNfQkFEX1ZBTFVFOworICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gSU5UMzJfTUFYIC0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTsKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZib29sZWFuVmFsdWUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmYnl0ZVZhbHVlKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmNoYXJWYWx1ZSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZpbnRWYWx1ZSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZsb25nVmFsdWUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmZmxvYXRWYWx1ZSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZkb3VibGVWYWx1ZSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZlbnVtVmFsdWUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmcGFyY2VsYWJsZVZhbHVlKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorYmluZGVyX3N0YXR1c190IEZpeGVkU2l6ZTo6Rml4ZWRQYXJjZWxhYmxlOjp3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1czsKKyAgc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIoX2FpZGxfcGFyY2VsLCAwKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgYm9vbGVhblZhbHVlKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgYnl0ZVZhbHVlKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgY2hhclZhbHVlKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgaW50VmFsdWUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBsb25nVmFsdWUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBmbG9hdFZhbHVlKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgZG91YmxlVmFsdWUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBlbnVtVmFsdWUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBwYXJjZWxhYmxlVmFsdWUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIHNpemVfdCBfYWlkbF9lbmRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKTsKKyAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MpOworICBBUGFyY2VsX3dyaXRlSW50MzIoX2FpZGxfcGFyY2VsLCBfYWlkbF9lbmRfcG9zIC0gX2FpZGxfc3RhcnRfcG9zKTsKKyAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9lbmRfcG9zKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK2NvbnN0IGNoYXIqIEZpeGVkU2l6ZTo6Rml4ZWRVbmlvbjo6ZGVzY3JpcHRvciA9ICJhbmRyb2lkLmFpZGwudGVzdHMuRml4ZWRTaXplLkZpeGVkVW5pb24iOworCitiaW5kZXJfc3RhdHVzX3QgRml4ZWRTaXplOjpGaXhlZFVuaW9uOjpyZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBfcGFyY2VsKSB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzOworICBpbnQzMl90IF9haWRsX3RhZzsKKyAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX3BhcmNlbCwgJl9haWRsX3RhZykpICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIHN3aXRjaCAoc3RhdGljX2Nhc3Q8VGFnPihfYWlkbF90YWcpKSB7CisgIGNhc2UgYm9vbGVhblZhbHVlOiB7CisgICAgYm9vbCBfYWlkbF92YWx1ZTsKKyAgICBpZiAoKF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfcGFyY2VsLCAmX2FpZGxfdmFsdWUpKSAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICAgIGlmIGNvbnN0ZXhwciAoc3RkOjppc190cml2aWFsbHlfY29weWFibGVfdjxib29sPikgeworICAgICAgc2V0PGJvb2xlYW5WYWx1ZT4oX2FpZGxfdmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBOT0xJTlRORVhUTElORShwZXJmb3JtYW5jZS1tb3ZlLWNvbnN0LWFyZykKKyAgICAgIHNldDxib29sZWFuVmFsdWU+KHN0ZDo6bW92ZShfYWlkbF92YWx1ZSkpOworICAgIH0KKyAgICByZXR1cm4gU1RBVFVTX09LOyB9CisgIGNhc2UgYnl0ZVZhbHVlOiB7CisgICAgaW50OF90IF9haWRsX3ZhbHVlOworICAgIGlmICgoX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9wYXJjZWwsICZfYWlkbF92YWx1ZSkpICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgICAgaWYgY29uc3RleHByIChzdGQ6OmlzX3RyaXZpYWxseV9jb3B5YWJsZV92PGludDhfdD4pIHsKKyAgICAgIHNldDxieXRlVmFsdWU+KF9haWRsX3ZhbHVlKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gTk9MSU5UTkVYVExJTkUocGVyZm9ybWFuY2UtbW92ZS1jb25zdC1hcmcpCisgICAgICBzZXQ8Ynl0ZVZhbHVlPihzdGQ6Om1vdmUoX2FpZGxfdmFsdWUpKTsKKyAgICB9CisgICAgcmV0dXJuIFNUQVRVU19PSzsgfQorICBjYXNlIGNoYXJWYWx1ZTogeworICAgIGNoYXIxNl90IF9haWRsX3ZhbHVlOworICAgIGlmICgoX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9wYXJjZWwsICZfYWlkbF92YWx1ZSkpICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgICAgaWYgY29uc3RleHByIChzdGQ6OmlzX3RyaXZpYWxseV9jb3B5YWJsZV92PGNoYXIxNl90PikgeworICAgICAgc2V0PGNoYXJWYWx1ZT4oX2FpZGxfdmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBOT0xJTlRORVhUTElORShwZXJmb3JtYW5jZS1tb3ZlLWNvbnN0LWFyZykKKyAgICAgIHNldDxjaGFyVmFsdWU+KHN0ZDo6bW92ZShfYWlkbF92YWx1ZSkpOworICAgIH0KKyAgICByZXR1cm4gU1RBVFVTX09LOyB9CisgIGNhc2UgaW50VmFsdWU6IHsKKyAgICBpbnQzMl90IF9haWRsX3ZhbHVlOworICAgIGlmICgoX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9wYXJjZWwsICZfYWlkbF92YWx1ZSkpICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgICAgaWYgY29uc3RleHByIChzdGQ6OmlzX3RyaXZpYWxseV9jb3B5YWJsZV92PGludDMyX3Q+KSB7CisgICAgICBzZXQ8aW50VmFsdWU+KF9haWRsX3ZhbHVlKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gTk9MSU5UTkVYVExJTkUocGVyZm9ybWFuY2UtbW92ZS1jb25zdC1hcmcpCisgICAgICBzZXQ8aW50VmFsdWU+KHN0ZDo6bW92ZShfYWlkbF92YWx1ZSkpOworICAgIH0KKyAgICByZXR1cm4gU1RBVFVTX09LOyB9CisgIGNhc2UgbG9uZ1ZhbHVlOiB7CisgICAgaW50NjRfdCBfYWlkbF92YWx1ZTsKKyAgICBpZiAoKF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfcGFyY2VsLCAmX2FpZGxfdmFsdWUpKSAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICAgIGlmIGNvbnN0ZXhwciAoc3RkOjppc190cml2aWFsbHlfY29weWFibGVfdjxpbnQ2NF90PikgeworICAgICAgc2V0PGxvbmdWYWx1ZT4oX2FpZGxfdmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBOT0xJTlRORVhUTElORShwZXJmb3JtYW5jZS1tb3ZlLWNvbnN0LWFyZykKKyAgICAgIHNldDxsb25nVmFsdWU+KHN0ZDo6bW92ZShfYWlkbF92YWx1ZSkpOworICAgIH0KKyAgICByZXR1cm4gU1RBVFVTX09LOyB9CisgIGNhc2UgZmxvYXRWYWx1ZTogeworICAgIGZsb2F0IF9haWRsX3ZhbHVlOworICAgIGlmICgoX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9wYXJjZWwsICZfYWlkbF92YWx1ZSkpICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgICAgaWYgY29uc3RleHByIChzdGQ6OmlzX3RyaXZpYWxseV9jb3B5YWJsZV92PGZsb2F0PikgeworICAgICAgc2V0PGZsb2F0VmFsdWU+KF9haWRsX3ZhbHVlKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gTk9MSU5UTkVYVExJTkUocGVyZm9ybWFuY2UtbW92ZS1jb25zdC1hcmcpCisgICAgICBzZXQ8ZmxvYXRWYWx1ZT4oc3RkOjptb3ZlKF9haWRsX3ZhbHVlKSk7CisgICAgfQorICAgIHJldHVybiBTVEFUVVNfT0s7IH0KKyAgY2FzZSBkb3VibGVWYWx1ZTogeworICAgIGRvdWJsZSBfYWlkbF92YWx1ZTsKKyAgICBpZiAoKF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfcGFyY2VsLCAmX2FpZGxfdmFsdWUpKSAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICAgIGlmIGNvbnN0ZXhwciAoc3RkOjppc190cml2aWFsbHlfY29weWFibGVfdjxkb3VibGU+KSB7CisgICAgICBzZXQ8ZG91YmxlVmFsdWU+KF9haWRsX3ZhbHVlKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gTk9MSU5UTkVYVExJTkUocGVyZm9ybWFuY2UtbW92ZS1jb25zdC1hcmcpCisgICAgICBzZXQ8ZG91YmxlVmFsdWU+KHN0ZDo6bW92ZShfYWlkbF92YWx1ZSkpOworICAgIH0KKyAgICByZXR1cm4gU1RBVFVTX09LOyB9CisgIGNhc2UgZW51bVZhbHVlOiB7CisgICAgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0gX2FpZGxfdmFsdWU7CisgICAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX3BhcmNlbCwgJl9haWRsX3ZhbHVlKSkgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgICBpZiBjb25zdGV4cHIgKHN0ZDo6aXNfdHJpdmlhbGx5X2NvcHlhYmxlX3Y8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0+KSB7CisgICAgICBzZXQ8ZW51bVZhbHVlPihfYWlkbF92YWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIE5PTElOVE5FWFRMSU5FKHBlcmZvcm1hbmNlLW1vdmUtY29uc3QtYXJnKQorICAgICAgc2V0PGVudW1WYWx1ZT4oc3RkOjptb3ZlKF9haWRsX3ZhbHVlKSk7CisgICAgfQorICAgIHJldHVybiBTVEFUVVNfT0s7IH0KKyAgfQorICByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTsKK30KK2JpbmRlcl9zdGF0dXNfdCBGaXhlZFNpemU6OkZpeGVkVW5pb246OndyaXRlVG9QYXJjZWwoQVBhcmNlbCogX3BhcmNlbCkgY29uc3QgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfcGFyY2VsLCBzdGF0aWNfY2FzdDxpbnQzMl90PihnZXRUYWcoKSkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICBzd2l0Y2ggKGdldFRhZygpKSB7CisgIGNhc2UgYm9vbGVhblZhbHVlOiByZXR1cm4gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9wYXJjZWwsIGdldDxib29sZWFuVmFsdWU+KCkpOworICBjYXNlIGJ5dGVWYWx1ZTogcmV0dXJuIDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfcGFyY2VsLCBnZXQ8Ynl0ZVZhbHVlPigpKTsKKyAgY2FzZSBjaGFyVmFsdWU6IHJldHVybiA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX3BhcmNlbCwgZ2V0PGNoYXJWYWx1ZT4oKSk7CisgIGNhc2UgaW50VmFsdWU6IHJldHVybiA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX3BhcmNlbCwgZ2V0PGludFZhbHVlPigpKTsKKyAgY2FzZSBsb25nVmFsdWU6IHJldHVybiA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX3BhcmNlbCwgZ2V0PGxvbmdWYWx1ZT4oKSk7CisgIGNhc2UgZmxvYXRWYWx1ZTogcmV0dXJuIDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfcGFyY2VsLCBnZXQ8ZmxvYXRWYWx1ZT4oKSk7CisgIGNhc2UgZG91YmxlVmFsdWU6IHJldHVybiA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX3BhcmNlbCwgZ2V0PGRvdWJsZVZhbHVlPigpKTsKKyAgY2FzZSBlbnVtVmFsdWU6IHJldHVybiA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX3BhcmNlbCwgZ2V0PGVudW1WYWx1ZT4oKSk7CisgIH0KKyAgX19hc3NlcnQyKF9fRklMRV9fLCBfX0xJTkVfXywgX19QUkVUVFlfRlVOQ1RJT05fXywgImNhbid0IHJlYWNoIGhlcmUiKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0ZpeGVkU2l6ZS5jcHAuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvRml4ZWRTaXplLmNwcC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyN2FkM2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0ZpeGVkU2l6ZS5jcHAuZApAQCAtMCwwICsxLDMgQEAKK291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9GaXhlZFNpemUuY3BwIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvRml4ZWRTaXplLmFpZGwgXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvTG9uZ0VudW0uYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9HZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGUuY3BwIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9HZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGUuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0dlbmVyaWNTdHJ1Y3R1cmVkUGFyY2VsYWJsZS5jcHAKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvR2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxlLmNwcApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9HZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGUuY3BwLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0dlbmVyaWNTdHJ1Y3R1cmVkUGFyY2VsYWJsZS5jcHAuZApzaW1pbGFyaXR5IGluZGV4IDY0JQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0dlbmVyaWNTdHJ1Y3R1cmVkUGFyY2VsYWJsZS5jcHAuZApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9HZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGUuY3BwLmQKaW5kZXggMTBjMDAxMy4uMDZiMmY1ZCAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9HZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGUuY3BwLmQKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9HZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGUuY3BwLmQKQEAgLTEsMiArMSwyIEBACi1vdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvR2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxlLmNwcCA6IFwKK291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9HZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGUuY3BwIDogXAogICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvR2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxlLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSURlcHJlY2F0ZWQuY3BwIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JRGVwcmVjYXRlZC5jcHAKc2ltaWxhcml0eSBpbmRleCA4MSUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JRGVwcmVjYXRlZC5jcHAKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSURlcHJlY2F0ZWQuY3BwCmluZGV4IGE2NTEzYzIuLmU0ZmI1MTAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSURlcHJlY2F0ZWQuY3BwCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSURlcHJlY2F0ZWQuY3BwCkBAIC0xLDcgKzEsOCBAQAorI2luY2x1ZGUgImFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0lEZXByZWNhdGVkLmgiCisKICNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wYXJjZWxfdXRpbHMuaD4KLSNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcERlcHJlY2F0ZWQuaD4KICNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CbkRlcHJlY2F0ZWQuaD4KLSNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9JRGVwcmVjYXRlZC5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwRGVwcmVjYXRlZC5oPgogCiBuYW1lc3BhY2UgYWlkbCB7CiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC05LDcgKzEwLDcgQEAKIG5hbWVzcGFjZSB0ZXN0cyB7CiAjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAogI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XZGVwcmVjYXRlZCIKLXN0YXRpYyBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfb25UcmFuc2FjdChBSUJpbmRlciogX2FpZGxfYmluZGVyLCB0cmFuc2FjdGlvbl9jb2RlX3QgX2FpZGxfY29kZSwgY29uc3QgQVBhcmNlbCogX2FpZGxfaW4sIEFQYXJjZWwqIF9haWRsX291dCkgeworc3RhdGljIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9hbmRyb2lkX2FpZGxfdGVzdHNfSURlcHJlY2F0ZWRfb25UcmFuc2FjdChBSUJpbmRlciogX2FpZGxfYmluZGVyLCB0cmFuc2FjdGlvbl9jb2RlX3QgX2FpZGxfY29kZSwgY29uc3QgQVBhcmNlbCogX2FpZGxfaW4sIEFQYXJjZWwqIF9haWRsX291dCkgewogICAodm9pZClfYWlkbF9pbjsKICAgKHZvaWQpX2FpZGxfb3V0OwogICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OOwpAQCAtMTgsNyArMTksNyBAQAogICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKIH0KIAotc3RhdGljIEFJQmluZGVyX0NsYXNzKiBfZ19haWRsX2NsYXp6ID0gOjpuZGs6OklDSW50ZXJmYWNlOjpkZWZpbmVDbGFzcyhJRGVwcmVjYXRlZDo6ZGVzY3JpcHRvciwgX2FpZGxfb25UcmFuc2FjdCk7CitzdGF0aWMgQUlCaW5kZXJfQ2xhc3MqIF9nX2FpZGxfYW5kcm9pZF9haWRsX3Rlc3RzX0lEZXByZWNhdGVkX2NsYXp6ID0gOjpuZGs6OklDSW50ZXJmYWNlOjpkZWZpbmVDbGFzcyhJRGVwcmVjYXRlZDo6ZGVzY3JpcHRvciwgX2FpZGxfYW5kcm9pZF9haWRsX3Rlc3RzX0lEZXByZWNhdGVkX29uVHJhbnNhY3QpOwogCiAjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCiBCcERlcHJlY2F0ZWQ6OkJwRGVwcmVjYXRlZChjb25zdCA6Om5kazo6U3BBSUJpbmRlciYgYmluZGVyKSA6IEJwQ0ludGVyZmFjZShiaW5kZXIpIHt9CkBAIC0yOCw3ICsyOSw3IEBACiBCbkRlcHJlY2F0ZWQ6OkJuRGVwcmVjYXRlZCgpIHt9CiBCbkRlcHJlY2F0ZWQ6On5CbkRlcHJlY2F0ZWQoKSB7fQogOjpuZGs6OlNwQUlCaW5kZXIgQm5EZXByZWNhdGVkOjpjcmVhdGVCaW5kZXIoKSB7Ci0gIEFJQmluZGVyKiBiaW5kZXIgPSBBSUJpbmRlcl9uZXcoX2dfYWlkbF9jbGF6eiwgc3RhdGljX2Nhc3Q8dm9pZCo+KHRoaXMpKTsKKyAgQUlCaW5kZXIqIGJpbmRlciA9IEFJQmluZGVyX25ldyhfZ19haWRsX2FuZHJvaWRfYWlkbF90ZXN0c19JRGVwcmVjYXRlZF9jbGF6eiwgc3RhdGljX2Nhc3Q8dm9pZCo+KHRoaXMpKTsKICAgI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAogICBBSUJpbmRlcl9tYXJrQ29tcGlsYXRpb25Vbml0U3RhYmlsaXR5KGJpbmRlcik7CiAgICNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCkBAIC00MSw3ICs0Miw3IEBACiAKIAogc3RkOjpzaGFyZWRfcHRyPElEZXByZWNhdGVkPiBJRGVwcmVjYXRlZDo6ZnJvbUJpbmRlcihjb25zdCA6Om5kazo6U3BBSUJpbmRlciYgYmluZGVyKSB7Ci0gIGlmICghQUlCaW5kZXJfYXNzb2NpYXRlQ2xhc3MoYmluZGVyLmdldCgpLCBfZ19haWRsX2NsYXp6KSkgeyByZXR1cm4gbnVsbHB0cjsgfQorICBpZiAoIUFJQmluZGVyX2Fzc29jaWF0ZUNsYXNzKGJpbmRlci5nZXQoKSwgX2dfYWlkbF9hbmRyb2lkX2FpZGxfdGVzdHNfSURlcHJlY2F0ZWRfY2xhenopKSB7IHJldHVybiBudWxscHRyOyB9CiAgIHN0ZDo6c2hhcmVkX3B0cjw6Om5kazo6SUNJbnRlcmZhY2U+IGludGVyZmFjZSA9IDo6bmRrOjpJQ0ludGVyZmFjZTo6YXNJbnRlcmZhY2UoYmluZGVyLmdldCgpKTsKICAgaWYgKGludGVyZmFjZSkgewogICAgIHJldHVybiBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8SURlcHJlY2F0ZWQ+KGludGVyZmFjZSk7CmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lEZXByZWNhdGVkLmNwcC5kIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JRGVwcmVjYXRlZC5jcHAuZApzaW1pbGFyaXR5IGluZGV4IDY3JQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lEZXByZWNhdGVkLmNwcC5kCnJlbmFtZSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lEZXByZWNhdGVkLmNwcC5kCmluZGV4IDViYzQwYzAuLmQ5MmQ0ZTUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSURlcHJlY2F0ZWQuY3BwLmQKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JRGVwcmVjYXRlZC5jcHAuZApAQCAtMSwyICsxLDIgQEAKLW91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JRGVwcmVjYXRlZC5jcHAgOiBcCitvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSURlcHJlY2F0ZWQuY3BwIDogXAogICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvSURlcHJlY2F0ZWQuYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JTmFtZWRDYWxsYmFjay5jcHAgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lOYW1lZENhbGxiYWNrLmNwcApzaW1pbGFyaXR5IGluZGV4IDg1JQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lOYW1lZENhbGxiYWNrLmNwcApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JTmFtZWRDYWxsYmFjay5jcHAKaW5kZXggMTdmNmRhMi4uZDQ0MTEwNiAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JTmFtZWRDYWxsYmFjay5jcHAKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JTmFtZWRDYWxsYmFjay5jcHAKQEAgLTEsMTMgKzEsMTQgQEAKKyNpbmNsdWRlICJhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9JTmFtZWRDYWxsYmFjay5oIgorCiAjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcGFyY2VsX3V0aWxzLmg+Ci0jaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBOYW1lZENhbGxiYWNrLmg+CiAjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5OYW1lZENhbGxiYWNrLmg+Ci0jaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvSU5hbWVkQ2FsbGJhY2suaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcE5hbWVkQ2FsbGJhY2suaD4KIAogbmFtZXNwYWNlIGFpZGwgewogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGFpZGwgewogbmFtZXNwYWNlIHRlc3RzIHsKLXN0YXRpYyBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfb25UcmFuc2FjdChBSUJpbmRlciogX2FpZGxfYmluZGVyLCB0cmFuc2FjdGlvbl9jb2RlX3QgX2FpZGxfY29kZSwgY29uc3QgQVBhcmNlbCogX2FpZGxfaW4sIEFQYXJjZWwqIF9haWRsX291dCkgeworc3RhdGljIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9hbmRyb2lkX2FpZGxfdGVzdHNfSU5hbWVkQ2FsbGJhY2tfb25UcmFuc2FjdChBSUJpbmRlciogX2FpZGxfYmluZGVyLCB0cmFuc2FjdGlvbl9jb2RlX3QgX2FpZGxfY29kZSwgY29uc3QgQVBhcmNlbCogX2FpZGxfaW4sIEFQYXJjZWwqIF9haWRsX291dCkgewogICAodm9pZClfYWlkbF9pbjsKICAgKHZvaWQpX2FpZGxfb3V0OwogICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OOwpAQCAtMjIsNyArMjMsNyBAQAogCiAgICAgICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlU3RyaW5nKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgYnJlYWs7CkBAIC0zMSw3ICszMiw3IEBACiAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwogfQogCi1zdGF0aWMgQUlCaW5kZXJfQ2xhc3MqIF9nX2FpZGxfY2xhenogPSA6Om5kazo6SUNJbnRlcmZhY2U6OmRlZmluZUNsYXNzKElOYW1lZENhbGxiYWNrOjpkZXNjcmlwdG9yLCBfYWlkbF9vblRyYW5zYWN0KTsKK3N0YXRpYyBBSUJpbmRlcl9DbGFzcyogX2dfYWlkbF9hbmRyb2lkX2FpZGxfdGVzdHNfSU5hbWVkQ2FsbGJhY2tfY2xhenogPSA6Om5kazo6SUNJbnRlcmZhY2U6OmRlZmluZUNsYXNzKElOYW1lZENhbGxiYWNrOjpkZXNjcmlwdG9yLCBfYWlkbF9hbmRyb2lkX2FpZGxfdGVzdHNfSU5hbWVkQ2FsbGJhY2tfb25UcmFuc2FjdCk7CiAKIEJwTmFtZWRDYWxsYmFjazo6QnBOYW1lZENhbGxiYWNrKGNvbnN0IDo6bmRrOjpTcEFJQmluZGVyJiBiaW5kZXIpIDogQnBDSW50ZXJmYWNlKGJpbmRlcikge30KIEJwTmFtZWRDYWxsYmFjazo6fkJwTmFtZWRDYWxsYmFjaygpIHt9CkBAIC02NSw3ICs2Niw3IEBACiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47Ci0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkU3RyaW5nKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX2Vycm9yOgpAQCAtNzcsNyArNzgsNyBAQAogQm5OYW1lZENhbGxiYWNrOjpCbk5hbWVkQ2FsbGJhY2soKSB7fQogQm5OYW1lZENhbGxiYWNrOjp+Qm5OYW1lZENhbGxiYWNrKCkge30KIDo6bmRrOjpTcEFJQmluZGVyIEJuTmFtZWRDYWxsYmFjazo6Y3JlYXRlQmluZGVyKCkgewotICBBSUJpbmRlciogYmluZGVyID0gQUlCaW5kZXJfbmV3KF9nX2FpZGxfY2xhenosIHN0YXRpY19jYXN0PHZvaWQqPih0aGlzKSk7CisgIEFJQmluZGVyKiBiaW5kZXIgPSBBSUJpbmRlcl9uZXcoX2dfYWlkbF9hbmRyb2lkX2FpZGxfdGVzdHNfSU5hbWVkQ2FsbGJhY2tfY2xhenosIHN0YXRpY19jYXN0PHZvaWQqPih0aGlzKSk7CiAgICNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKICAgQUlCaW5kZXJfbWFya0NvbXBpbGF0aW9uVW5pdFN0YWJpbGl0eShiaW5kZXIpOwogICAjZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVApAQCAtOTAsNyArOTEsNyBAQAogCiAKIHN0ZDo6c2hhcmVkX3B0cjxJTmFtZWRDYWxsYmFjaz4gSU5hbWVkQ2FsbGJhY2s6OmZyb21CaW5kZXIoY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGJpbmRlcikgewotICBpZiAoIUFJQmluZGVyX2Fzc29jaWF0ZUNsYXNzKGJpbmRlci5nZXQoKSwgX2dfYWlkbF9jbGF6eikpIHsgcmV0dXJuIG51bGxwdHI7IH0KKyAgaWYgKCFBSUJpbmRlcl9hc3NvY2lhdGVDbGFzcyhiaW5kZXIuZ2V0KCksIF9nX2FpZGxfYW5kcm9pZF9haWRsX3Rlc3RzX0lOYW1lZENhbGxiYWNrX2NsYXp6KSkgeyByZXR1cm4gbnVsbHB0cjsgfQogICBzdGQ6OnNoYXJlZF9wdHI8OjpuZGs6OklDSW50ZXJmYWNlPiBpbnRlcmZhY2UgPSA6Om5kazo6SUNJbnRlcmZhY2U6OmFzSW50ZXJmYWNlKGJpbmRlci5nZXQoKSk7CiAgIGlmIChpbnRlcmZhY2UpIHsKICAgICByZXR1cm4gc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PElOYW1lZENhbGxiYWNrPihpbnRlcmZhY2UpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JTmFtZWRDYWxsYmFjay5jcHAuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSU5hbWVkQ2FsbGJhY2suY3BwLmQKc2ltaWxhcml0eSBpbmRleCA2NiUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JTmFtZWRDYWxsYmFjay5jcHAuZApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JTmFtZWRDYWxsYmFjay5jcHAuZAppbmRleCAyZWNlYjMzLi5iNmVjNWU2IDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lOYW1lZENhbGxiYWNrLmNwcC5kCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSU5hbWVkQ2FsbGJhY2suY3BwLmQKQEAgLTEsMiArMSwyIEBACi1vdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSU5hbWVkQ2FsbGJhY2suY3BwIDogXAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lOYW1lZENhbGxiYWNrLmNwcCA6IFwKICAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0lOYW1lZENhbGxiYWNrLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSU5ld05hbWUuY3BwIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JTmV3TmFtZS5jcHAKc2ltaWxhcml0eSBpbmRleCA4NSUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JTmV3TmFtZS5jcHAKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSU5ld05hbWUuY3BwCmluZGV4IDhmNDg0NDIuLmU0MDgyNTggMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSU5ld05hbWUuY3BwCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSU5ld05hbWUuY3BwCkBAIC0xLDEzICsxLDE0IEBACisjaW5jbHVkZSAiYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvSU5ld05hbWUuaCIKKwogI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3BhcmNlbF91dGlscy5oPgotI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwTmV3TmFtZS5oPgogI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuTmV3TmFtZS5oPgotI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0lOZXdOYW1lLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBOZXdOYW1lLmg+CiAKIG5hbWVzcGFjZSBhaWRsIHsKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBhaWRsIHsKIG5hbWVzcGFjZSB0ZXN0cyB7Ci1zdGF0aWMgYmluZGVyX3N0YXR1c190IF9haWRsX29uVHJhbnNhY3QoQUlCaW5kZXIqIF9haWRsX2JpbmRlciwgdHJhbnNhY3Rpb25fY29kZV90IF9haWRsX2NvZGUsIGNvbnN0IEFQYXJjZWwqIF9haWRsX2luLCBBUGFyY2VsKiBfYWlkbF9vdXQpIHsKK3N0YXRpYyBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfYW5kcm9pZF9haWRsX3Rlc3RzX0lOZXdOYW1lX29uVHJhbnNhY3QoQUlCaW5kZXIqIF9haWRsX2JpbmRlciwgdHJhbnNhY3Rpb25fY29kZV90IF9haWRsX2NvZGUsIGNvbnN0IEFQYXJjZWwqIF9haWRsX2luLCBBUGFyY2VsKiBfYWlkbF9vdXQpIHsKICAgKHZvaWQpX2FpZGxfaW47CiAgICh2b2lkKV9haWRsX291dDsKICAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTjsKQEAgLTIyLDcgKzIzLDcgQEAKIAogICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVN0cmluZyhfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIGJyZWFrOwpAQCAtMzEsNyArMzIsNyBAQAogICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKIH0KIAotc3RhdGljIEFJQmluZGVyX0NsYXNzKiBfZ19haWRsX2NsYXp6ID0gOjpuZGs6OklDSW50ZXJmYWNlOjpkZWZpbmVDbGFzcyhJTmV3TmFtZTo6ZGVzY3JpcHRvciwgX2FpZGxfb25UcmFuc2FjdCk7CitzdGF0aWMgQUlCaW5kZXJfQ2xhc3MqIF9nX2FpZGxfYW5kcm9pZF9haWRsX3Rlc3RzX0lOZXdOYW1lX2NsYXp6ID0gOjpuZGs6OklDSW50ZXJmYWNlOjpkZWZpbmVDbGFzcyhJTmV3TmFtZTo6ZGVzY3JpcHRvciwgX2FpZGxfYW5kcm9pZF9haWRsX3Rlc3RzX0lOZXdOYW1lX29uVHJhbnNhY3QpOwogCiBCcE5ld05hbWU6OkJwTmV3TmFtZShjb25zdCA6Om5kazo6U3BBSUJpbmRlciYgYmluZGVyKSA6IEJwQ0ludGVyZmFjZShiaW5kZXIpIHt9CiBCcE5ld05hbWU6On5CcE5ld05hbWUoKSB7fQpAQCAtNjUsNyArNjYsNyBAQAogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOwotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFN0cmluZyhfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9lcnJvcjoKQEAgLTc3LDcgKzc4LDcgQEAKIEJuTmV3TmFtZTo6Qm5OZXdOYW1lKCkge30KIEJuTmV3TmFtZTo6fkJuTmV3TmFtZSgpIHt9CiA6Om5kazo6U3BBSUJpbmRlciBCbk5ld05hbWU6OmNyZWF0ZUJpbmRlcigpIHsKLSAgQUlCaW5kZXIqIGJpbmRlciA9IEFJQmluZGVyX25ldyhfZ19haWRsX2NsYXp6LCBzdGF0aWNfY2FzdDx2b2lkKj4odGhpcykpOworICBBSUJpbmRlciogYmluZGVyID0gQUlCaW5kZXJfbmV3KF9nX2FpZGxfYW5kcm9pZF9haWRsX3Rlc3RzX0lOZXdOYW1lX2NsYXp6LCBzdGF0aWNfY2FzdDx2b2lkKj4odGhpcykpOwogICAjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCiAgIEFJQmluZGVyX21hcmtDb21waWxhdGlvblVuaXRTdGFiaWxpdHkoYmluZGVyKTsKICAgI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKQEAgLTkwLDcgKzkxLDcgQEAKIAogCiBzdGQ6OnNoYXJlZF9wdHI8SU5ld05hbWU+IElOZXdOYW1lOjpmcm9tQmluZGVyKGNvbnN0IDo6bmRrOjpTcEFJQmluZGVyJiBiaW5kZXIpIHsKLSAgaWYgKCFBSUJpbmRlcl9hc3NvY2lhdGVDbGFzcyhiaW5kZXIuZ2V0KCksIF9nX2FpZGxfY2xhenopKSB7IHJldHVybiBudWxscHRyOyB9CisgIGlmICghQUlCaW5kZXJfYXNzb2NpYXRlQ2xhc3MoYmluZGVyLmdldCgpLCBfZ19haWRsX2FuZHJvaWRfYWlkbF90ZXN0c19JTmV3TmFtZV9jbGF6eikpIHsgcmV0dXJuIG51bGxwdHI7IH0KICAgc3RkOjpzaGFyZWRfcHRyPDo6bmRrOjpJQ0ludGVyZmFjZT4gaW50ZXJmYWNlID0gOjpuZGs6OklDSW50ZXJmYWNlOjphc0ludGVyZmFjZShiaW5kZXIuZ2V0KCkpOwogICBpZiAoaW50ZXJmYWNlKSB7CiAgICAgcmV0dXJuIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxJTmV3TmFtZT4oaW50ZXJmYWNlKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSU5ld05hbWUuY3BwLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lOZXdOYW1lLmNwcC5kCnNpbWlsYXJpdHkgaW5kZXggNjclCnJlbmFtZSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSU5ld05hbWUuY3BwLmQKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSU5ld05hbWUuY3BwLmQKaW5kZXggMGM1NjljNS4uNDU5ZTE3NiAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JTmV3TmFtZS5jcHAuZAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lOZXdOYW1lLmNwcC5kCkBAIC0xLDIgKzEsMiBAQAotb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lOZXdOYW1lLmNwcCA6IFwKK291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JTmV3TmFtZS5jcHAgOiBcCiAgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9JTmV3TmFtZS5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lPbGROYW1lLmNwcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSU9sZE5hbWUuY3BwCnNpbWlsYXJpdHkgaW5kZXggODUlCnJlbmFtZSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSU9sZE5hbWUuY3BwCnJlbmFtZSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lPbGROYW1lLmNwcAppbmRleCA2ZjU0ZWM2Li5mZjQwNDk5IDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lPbGROYW1lLmNwcAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lPbGROYW1lLmNwcApAQCAtMSwxMyArMSwxNCBAQAorI2luY2x1ZGUgImFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0lPbGROYW1lLmgiCisKICNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wYXJjZWxfdXRpbHMuaD4KLSNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcE9sZE5hbWUuaD4KICNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9Cbk9sZE5hbWUuaD4KLSNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9JT2xkTmFtZS5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwT2xkTmFtZS5oPgogCiBuYW1lc3BhY2UgYWlkbCB7CiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgYWlkbCB7CiBuYW1lc3BhY2UgdGVzdHMgewotc3RhdGljIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9vblRyYW5zYWN0KEFJQmluZGVyKiBfYWlkbF9iaW5kZXIsIHRyYW5zYWN0aW9uX2NvZGVfdCBfYWlkbF9jb2RlLCBjb25zdCBBUGFyY2VsKiBfYWlkbF9pbiwgQVBhcmNlbCogX2FpZGxfb3V0KSB7CitzdGF0aWMgYmluZGVyX3N0YXR1c190IF9haWRsX2FuZHJvaWRfYWlkbF90ZXN0c19JT2xkTmFtZV9vblRyYW5zYWN0KEFJQmluZGVyKiBfYWlkbF9iaW5kZXIsIHRyYW5zYWN0aW9uX2NvZGVfdCBfYWlkbF9jb2RlLCBjb25zdCBBUGFyY2VsKiBfYWlkbF9pbiwgQVBhcmNlbCogX2FpZGxfb3V0KSB7CiAgICh2b2lkKV9haWRsX2luOwogICAodm9pZClfYWlkbF9vdXQ7CiAgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT047CkBAIC0yMiw3ICsyMyw3IEBACiAKICAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVTdHJpbmcoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICBicmVhazsKQEAgLTMxLDcgKzMyLDcgQEAKICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CiB9CiAKLXN0YXRpYyBBSUJpbmRlcl9DbGFzcyogX2dfYWlkbF9jbGF6eiA9IDo6bmRrOjpJQ0ludGVyZmFjZTo6ZGVmaW5lQ2xhc3MoSU9sZE5hbWU6OmRlc2NyaXB0b3IsIF9haWRsX29uVHJhbnNhY3QpOworc3RhdGljIEFJQmluZGVyX0NsYXNzKiBfZ19haWRsX2FuZHJvaWRfYWlkbF90ZXN0c19JT2xkTmFtZV9jbGF6eiA9IDo6bmRrOjpJQ0ludGVyZmFjZTo6ZGVmaW5lQ2xhc3MoSU9sZE5hbWU6OmRlc2NyaXB0b3IsIF9haWRsX2FuZHJvaWRfYWlkbF90ZXN0c19JT2xkTmFtZV9vblRyYW5zYWN0KTsKIAogQnBPbGROYW1lOjpCcE9sZE5hbWUoY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGJpbmRlcikgOiBCcENJbnRlcmZhY2UoYmluZGVyKSB7fQogQnBPbGROYW1lOjp+QnBPbGROYW1lKCkge30KQEAgLTY1LDcgKzY2LDcgQEAKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRTdHJpbmcoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfZXJyb3I6CkBAIC03Nyw3ICs3OCw3IEBACiBCbk9sZE5hbWU6OkJuT2xkTmFtZSgpIHt9CiBCbk9sZE5hbWU6On5Cbk9sZE5hbWUoKSB7fQogOjpuZGs6OlNwQUlCaW5kZXIgQm5PbGROYW1lOjpjcmVhdGVCaW5kZXIoKSB7Ci0gIEFJQmluZGVyKiBiaW5kZXIgPSBBSUJpbmRlcl9uZXcoX2dfYWlkbF9jbGF6eiwgc3RhdGljX2Nhc3Q8dm9pZCo+KHRoaXMpKTsKKyAgQUlCaW5kZXIqIGJpbmRlciA9IEFJQmluZGVyX25ldyhfZ19haWRsX2FuZHJvaWRfYWlkbF90ZXN0c19JT2xkTmFtZV9jbGF6eiwgc3RhdGljX2Nhc3Q8dm9pZCo+KHRoaXMpKTsKICAgI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAogICBBSUJpbmRlcl9tYXJrQ29tcGlsYXRpb25Vbml0U3RhYmlsaXR5KGJpbmRlcik7CiAgICNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCkBAIC05MCw3ICs5MSw3IEBACiAKIAogc3RkOjpzaGFyZWRfcHRyPElPbGROYW1lPiBJT2xkTmFtZTo6ZnJvbUJpbmRlcihjb25zdCA6Om5kazo6U3BBSUJpbmRlciYgYmluZGVyKSB7Ci0gIGlmICghQUlCaW5kZXJfYXNzb2NpYXRlQ2xhc3MoYmluZGVyLmdldCgpLCBfZ19haWRsX2NsYXp6KSkgeyByZXR1cm4gbnVsbHB0cjsgfQorICBpZiAoIUFJQmluZGVyX2Fzc29jaWF0ZUNsYXNzKGJpbmRlci5nZXQoKSwgX2dfYWlkbF9hbmRyb2lkX2FpZGxfdGVzdHNfSU9sZE5hbWVfY2xhenopKSB7IHJldHVybiBudWxscHRyOyB9CiAgIHN0ZDo6c2hhcmVkX3B0cjw6Om5kazo6SUNJbnRlcmZhY2U+IGludGVyZmFjZSA9IDo6bmRrOjpJQ0ludGVyZmFjZTo6YXNJbnRlcmZhY2UoYmluZGVyLmdldCgpKTsKICAgaWYgKGludGVyZmFjZSkgewogICAgIHJldHVybiBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8SU9sZE5hbWU+KGludGVyZmFjZSk7CmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lPbGROYW1lLmNwcC5kIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JT2xkTmFtZS5jcHAuZApzaW1pbGFyaXR5IGluZGV4IDY3JQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lPbGROYW1lLmNwcC5kCnJlbmFtZSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lPbGROYW1lLmNwcC5kCmluZGV4IDhlNDQzNWUuLjFjYTQyMzkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSU9sZE5hbWUuY3BwLmQKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JT2xkTmFtZS5jcHAuZApAQCAtMSwyICsxLDIgQEAKLW91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JT2xkTmFtZS5jcHAgOiBcCitvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSU9sZE5hbWUuY3BwIDogXAogICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvSU9sZE5hbWUuYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JVGVzdFNlcnZpY2UuY3BwIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JVGVzdFNlcnZpY2UuY3BwCnNpbWlsYXJpdHkgaW5kZXggNjElCnJlbmFtZSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSVRlc3RTZXJ2aWNlLmNwcApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JVGVzdFNlcnZpY2UuY3BwCmluZGV4IDUxNTcwN2EuLjhjOWZmMGEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSVRlc3RTZXJ2aWNlLmNwcAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lUZXN0U2VydmljZS5jcHAKQEAgLTEsMTYgKzEsMTcgQEAKKyNpbmNsdWRlICJhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9JVGVzdFNlcnZpY2UuaCIKKwogI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3BhcmNlbF91dGlscy5oPgotI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwTmFtZWRDYWxsYmFjay5oPgogI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuTmFtZWRDYWxsYmFjay5oPgotI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0lOYW1lZENhbGxiYWNrLmg+Ci0jaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBOZXdOYW1lLmg+CiAjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5OZXdOYW1lLmg+Ci0jaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvSU5ld05hbWUuaD4KLSNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcE9sZE5hbWUuaD4KICNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9Cbk9sZE5hbWUuaD4KLSNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9JT2xkTmFtZS5oPgotI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwVGVzdFNlcnZpY2UuaD4KICNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CblRlc3RTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvSVRlc3RTZXJ2aWNlLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBOYW1lZENhbGxiYWNrLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBOZXdOYW1lLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBPbGROYW1lLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBUZXN0U2VydmljZS5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0lOYW1lZENhbGxiYWNrLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvSU5ld05hbWUuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9JT2xkTmFtZS5oPgogCiBuYW1lc3BhY2UgYWlkbCB7CiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC0xOCw3ICsxOSw3IEBACiBuYW1lc3BhY2UgdGVzdHMgewogI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKICNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2RlcHJlY2F0ZWQiCi1zdGF0aWMgYmluZGVyX3N0YXR1c190IF9haWRsX29uVHJhbnNhY3QoQUlCaW5kZXIqIF9haWRsX2JpbmRlciwgdHJhbnNhY3Rpb25fY29kZV90IF9haWRsX2NvZGUsIGNvbnN0IEFQYXJjZWwqIF9haWRsX2luLCBBUGFyY2VsKiBfYWlkbF9vdXQpIHsKK3N0YXRpYyBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfYW5kcm9pZF9haWRsX3Rlc3RzX0lUZXN0U2VydmljZV9vblRyYW5zYWN0KEFJQmluZGVyKiBfYWlkbF9iaW5kZXIsIHRyYW5zYWN0aW9uX2NvZGVfdCBfYWlkbF9jb2RlLCBjb25zdCBBUGFyY2VsKiBfYWlkbF9pbiwgQVBhcmNlbCogX2FpZGxfb3V0KSB7CiAgICh2b2lkKV9haWRsX2luOwogICAodm9pZClfYWlkbF9vdXQ7CiAgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT047CkBAIC0yOCw3ICsyOSw3IEBACiAgICAgICBpbnQzMl90IGluX2FyZzsKICAgICAgIGludDMyX3QgX2FpZGxfcmV0dXJuOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzIoX2FpZGxfaW4sICZpbl9hcmcpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX2luLCAmaW5fYXJnKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1cyA9IF9haWRsX2ltcGwtPlVuaW1wbGVtZW50ZWRNZXRob2QoaW5fYXJnLCAmX2FpZGxfcmV0dXJuKTsKQEAgLTM3LDcgKzM4LDcgQEAKIAogICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICBicmVhazsKQEAgLTYyLDcgKzYzLDcgQEAKICAgICAgIGJvb2wgaW5fdG9rZW47CiAgICAgICBib29sIF9haWRsX3JldHVybjsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEJvb2woX2FpZGxfaW4sICZpbl90b2tlbik7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfaW4sICZpbl90b2tlbik7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXMgPSBfYWlkbF9pbXBsLT5SZXBlYXRCb29sZWFuKGluX3Rva2VuLCAmX2FpZGxfcmV0dXJuKTsKQEAgLTcxLDcgKzcyLDcgQEAKIAogICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlQm9vbChfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIGJyZWFrOwpAQCAtODAsNyArODEsNyBAQAogICAgICAgaW50OF90IGluX3Rva2VuOwogICAgICAgaW50OF90IF9haWRsX3JldHVybjsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEJ5dGUoX2FpZGxfaW4sICZpbl90b2tlbik7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfaW4sICZpbl90b2tlbik7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXMgPSBfYWlkbF9pbXBsLT5SZXBlYXRCeXRlKGluX3Rva2VuLCAmX2FpZGxfcmV0dXJuKTsKQEAgLTg5LDcgKzkwLDcgQEAKIAogICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlQnl0ZShfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIGJyZWFrOwpAQCAtOTgsNyArOTksNyBAQAogICAgICAgY2hhcjE2X3QgaW5fdG9rZW47CiAgICAgICBjaGFyMTZfdCBfYWlkbF9yZXR1cm47CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRDaGFyKF9haWRsX2luLCAmaW5fdG9rZW4pOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX2luLCAmaW5fdG9rZW4pOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzID0gX2FpZGxfaW1wbC0+UmVwZWF0Q2hhcihpbl90b2tlbiwgJl9haWRsX3JldHVybik7CkBAIC0xMDcsNyArMTA4LDcgQEAKIAogICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlQ2hhcihfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIGJyZWFrOwpAQCAtMTE2LDcgKzExNyw3IEBACiAgICAgICBpbnQzMl90IGluX3Rva2VuOwogICAgICAgaW50MzJfdCBfYWlkbF9yZXR1cm47CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihfYWlkbF9pbiwgJmluX3Rva2VuKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9pbiwgJmluX3Rva2VuKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1cyA9IF9haWRsX2ltcGwtPlJlcGVhdEludChpbl90b2tlbiwgJl9haWRsX3JldHVybik7CkBAIC0xMjUsNyArMTI2LDcgQEAKIAogICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICBicmVhazsKQEAgLTEzNCw3ICsxMzUsNyBAQAogICAgICAgaW50NjRfdCBpbl90b2tlbjsKICAgICAgIGludDY0X3QgX2FpZGxfcmV0dXJuOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50NjQoX2FpZGxfaW4sICZpbl90b2tlbik7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfaW4sICZpbl90b2tlbik7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXMgPSBfYWlkbF9pbXBsLT5SZXBlYXRMb25nKGluX3Rva2VuLCAmX2FpZGxfcmV0dXJuKTsKQEAgLTE0Myw3ICsxNDQsNyBAQAogCiAgICAgICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQ2NChfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIGJyZWFrOwpAQCAtMTUyLDcgKzE1Myw3IEBACiAgICAgICBmbG9hdCBpbl90b2tlbjsKICAgICAgIGZsb2F0IF9haWRsX3JldHVybjsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEZsb2F0KF9haWRsX2luLCAmaW5fdG9rZW4pOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX2luLCAmaW5fdG9rZW4pOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzID0gX2FpZGxfaW1wbC0+UmVwZWF0RmxvYXQoaW5fdG9rZW4sICZfYWlkbF9yZXR1cm4pOwpAQCAtMTYxLDcgKzE2Miw3IEBACiAKICAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUZsb2F0KF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgYnJlYWs7CkBAIC0xNzAsNyArMTcxLDcgQEAKICAgICAgIGRvdWJsZSBpbl90b2tlbjsKICAgICAgIGRvdWJsZSBfYWlkbF9yZXR1cm47CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWREb3VibGUoX2FpZGxfaW4sICZpbl90b2tlbik7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfaW4sICZpbl90b2tlbik7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXMgPSBfYWlkbF9pbXBsLT5SZXBlYXREb3VibGUoaW5fdG9rZW4sICZfYWlkbF9yZXR1cm4pOwpAQCAtMTc5LDcgKzE4MCw3IEBACiAKICAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZURvdWJsZShfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIGJyZWFrOwpAQCAtMTg4LDcgKzE4OSw3IEBACiAgICAgICBzdGQ6OnN0cmluZyBpbl90b2tlbjsKICAgICAgIHN0ZDo6c3RyaW5nIF9haWRsX3JldHVybjsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRTdHJpbmcoX2FpZGxfaW4sICZpbl90b2tlbik7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfaW4sICZpbl90b2tlbik7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXMgPSBfYWlkbF9pbXBsLT5SZXBlYXRTdHJpbmcoaW5fdG9rZW4sICZfYWlkbF9yZXR1cm4pOwpAQCAtMTk3LDcgKzE5OCw3IEBACiAKICAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVTdHJpbmcoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICBicmVhazsKQEAgLTIwNiw3ICsyMDcsNyBAQAogICAgICAgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Qnl0ZUVudW0gaW5fdG9rZW47CiAgICAgICA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCeXRlRW51bSBfYWlkbF9yZXR1cm47CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRCeXRlKF9haWRsX2luLCByZWludGVycHJldF9jYXN0PGludDhfdCo+KCZpbl90b2tlbikpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX2luLCAmaW5fdG9rZW4pOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzID0gX2FpZGxfaW1wbC0+UmVwZWF0Qnl0ZUVudW0oaW5fdG9rZW4sICZfYWlkbF9yZXR1cm4pOwpAQCAtMjE1LDcgKzIxNiw3IEBACiAKICAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUJ5dGUoX2FpZGxfb3V0LCBzdGF0aWNfY2FzdDxpbnQ4X3Q+KF9haWRsX3JldHVybikpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICBicmVhazsKQEAgLTIyNCw3ICsyMjUsNyBAQAogICAgICAgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bSBpbl90b2tlbjsKICAgICAgIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0gX2FpZGxfcmV0dXJuOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzIoX2FpZGxfaW4sIHJlaW50ZXJwcmV0X2Nhc3Q8aW50MzJfdCo+KCZpbl90b2tlbikpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX2luLCAmaW5fdG9rZW4pOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzID0gX2FpZGxfaW1wbC0+UmVwZWF0SW50RW51bShpbl90b2tlbiwgJl9haWRsX3JldHVybik7CkBAIC0yMzMsNyArMjM0LDcgQEAKIAogICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIoX2FpZGxfb3V0LCBzdGF0aWNfY2FzdDxpbnQzMl90PihfYWlkbF9yZXR1cm4pKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgYnJlYWs7CkBAIC0yNDIsNyArMjQzLDcgQEAKICAgICAgIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtIGluX3Rva2VuOwogICAgICAgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0gX2FpZGxfcmV0dXJuOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50NjQoX2FpZGxfaW4sIHJlaW50ZXJwcmV0X2Nhc3Q8aW50NjRfdCo+KCZpbl90b2tlbikpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX2luLCAmaW5fdG9rZW4pOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzID0gX2FpZGxfaW1wbC0+UmVwZWF0TG9uZ0VudW0oaW5fdG9rZW4sICZfYWlkbF9yZXR1cm4pOwpAQCAtMjUxLDcgKzI1Miw3IEBACiAKICAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDY0KF9haWRsX291dCwgc3RhdGljX2Nhc3Q8aW50NjRfdD4oX2FpZGxfcmV0dXJuKSk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIGJyZWFrOwpAQCAtMjYxLDcgKzI2Miw3IEBACiAgICAgICBzdGQ6OnZlY3Rvcjxib29sPiBvdXRfcmVwZWF0ZWQ7CiAgICAgICBzdGQ6OnZlY3Rvcjxib29sPiBfYWlkbF9yZXR1cm47CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX2luLCAmaW5faW5wdXQpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX2luLCAmaW5faW5wdXQpOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3Jlc2l6ZVZlY3RvcihfYWlkbF9pbiwgJm91dF9yZXBlYXRlZCk7CkBAIC0yNzMsMTAgKzI3NCwxMCBAQAogCiAgICAgICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKF9haWRsX291dCwgb3V0X3JlcGVhdGVkKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBvdXRfcmVwZWF0ZWQpOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgYnJlYWs7CkBAIC0yODYsNyArMjg3LDcgQEAKICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IG91dF9yZXBlYXRlZDsKICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IF9haWRsX3JldHVybjsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX2FpZGxfaW4sICZpbl9pbnB1dCk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfaW4sICZpbl9pbnB1dCk7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVzaXplVmVjdG9yKF9haWRsX2luLCAmb3V0X3JlcGVhdGVkKTsKQEAgLTI5OCwxMCArMjk5LDEwIEBACiAKICAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX2FpZGxfb3V0LCBvdXRfcmVwZWF0ZWQpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIG91dF9yZXBlYXRlZCk7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICBicmVhazsKQEAgLTMxMSw3ICszMTIsNyBAQAogICAgICAgc3RkOjp2ZWN0b3I8Y2hhcjE2X3Q+IG91dF9yZXBlYXRlZDsKICAgICAgIHN0ZDo6dmVjdG9yPGNoYXIxNl90PiBfYWlkbF9yZXR1cm47CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX2luLCAmaW5faW5wdXQpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX2luLCAmaW5faW5wdXQpOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3Jlc2l6ZVZlY3RvcihfYWlkbF9pbiwgJm91dF9yZXBlYXRlZCk7CkBAIC0zMjMsMTAgKzMyNCwxMCBAQAogCiAgICAgICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKF9haWRsX291dCwgb3V0X3JlcGVhdGVkKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBvdXRfcmVwZWF0ZWQpOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgYnJlYWs7CkBAIC0zMzYsNyArMzM3LDcgQEAKICAgICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IG91dF9yZXBlYXRlZDsKICAgICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IF9haWRsX3JldHVybjsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX2FpZGxfaW4sICZpbl9pbnB1dCk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfaW4sICZpbl9pbnB1dCk7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVzaXplVmVjdG9yKF9haWRsX2luLCAmb3V0X3JlcGVhdGVkKTsKQEAgLTM0OCwxMCArMzQ5LDEwIEBACiAKICAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX2FpZGxfb3V0LCBvdXRfcmVwZWF0ZWQpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIG91dF9yZXBlYXRlZCk7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICBicmVhazsKQEAgLTM2MSw3ICszNjIsNyBAQAogICAgICAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gb3V0X3JlcGVhdGVkOwogICAgICAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gX2FpZGxfcmV0dXJuOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihfYWlkbF9pbiwgJmluX2lucHV0KTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9pbiwgJmluX2lucHV0KTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZXNpemVWZWN0b3IoX2FpZGxfaW4sICZvdXRfcmVwZWF0ZWQpOwpAQCAtMzczLDEwICszNzQsMTAgQEAKIAogICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihfYWlkbF9vdXQsIG91dF9yZXBlYXRlZCk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgb3V0X3JlcGVhdGVkKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIGJyZWFrOwpAQCAtMzg2LDcgKzM4Nyw3IEBACiAgICAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gb3V0X3JlcGVhdGVkOwogICAgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IF9haWRsX3JldHVybjsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX2FpZGxfaW4sICZpbl9pbnB1dCk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfaW4sICZpbl9pbnB1dCk7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVzaXplVmVjdG9yKF9haWRsX2luLCAmb3V0X3JlcGVhdGVkKTsKQEAgLTM5OCwxMCArMzk5LDEwIEBACiAKICAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX2FpZGxfb3V0LCBvdXRfcmVwZWF0ZWQpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIG91dF9yZXBlYXRlZCk7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICBicmVhazsKQEAgLTQxMSw3ICs0MTIsNyBAQAogICAgICAgc3RkOjp2ZWN0b3I8ZG91YmxlPiBvdXRfcmVwZWF0ZWQ7CiAgICAgICBzdGQ6OnZlY3Rvcjxkb3VibGU+IF9haWRsX3JldHVybjsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX2FpZGxfaW4sICZpbl9pbnB1dCk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfaW4sICZpbl9pbnB1dCk7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVzaXplVmVjdG9yKF9haWRsX2luLCAmb3V0X3JlcGVhdGVkKTsKQEAgLTQyMywxMCArNDI0LDEwIEBACiAKICAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX2FpZGxfb3V0LCBvdXRfcmVwZWF0ZWQpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIG91dF9yZXBlYXRlZCk7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICBicmVhazsKQEAgLTQzNiw3ICs0MzcsNyBAQAogICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG91dF9yZXBlYXRlZDsKICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBfYWlkbF9yZXR1cm47CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX2luLCAmaW5faW5wdXQpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX2luLCAmaW5faW5wdXQpOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3Jlc2l6ZVZlY3RvcihfYWlkbF9pbiwgJm91dF9yZXBlYXRlZCk7CkBAIC00NDgsMTAgKzQ0OSwxMCBAQAogCiAgICAgICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKF9haWRsX291dCwgb3V0X3JlcGVhdGVkKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBvdXRfcmVwZWF0ZWQpOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgYnJlYWs7CkBAIC00NjEsNyArNDYyLDcgQEAKICAgICAgIHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJ5dGVFbnVtPiBvdXRfcmVwZWF0ZWQ7CiAgICAgICBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCeXRlRW51bT4gX2FpZGxfcmV0dXJuOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkQnl0ZUFycmF5KF9haWRsX2luLCBzdGF0aWNfY2FzdDx2b2lkKj4oJmluX2lucHV0KSwgbmRrOjpBUGFyY2VsX3N0ZFZlY3RvckFsbG9jYXRvcjxpbnQ4X3Q+KTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9pbiwgJmluX2lucHV0KTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZXNpemVWZWN0b3IoX2FpZGxfaW4sICZvdXRfcmVwZWF0ZWQpOwpAQCAtNDczLDEwICs0NzQsMTAgQEAKIAogICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlQnl0ZUFycmF5KF9haWRsX291dCwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBpbnQ4X3QqPihfYWlkbF9yZXR1cm4uZGF0YSgpKSwgX2FpZGxfcmV0dXJuLnNpemUoKSk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlQnl0ZUFycmF5KF9haWRsX291dCwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBpbnQ4X3QqPihvdXRfcmVwZWF0ZWQuZGF0YSgpKSwgb3V0X3JlcGVhdGVkLnNpemUoKSk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgb3V0X3JlcGVhdGVkKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIGJyZWFrOwpAQCAtNDg2LDcgKzQ4Nyw3IEBACiAgICAgICBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtPiBvdXRfcmVwZWF0ZWQ7CiAgICAgICBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtPiBfYWlkbF9yZXR1cm47CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMkFycmF5KF9haWRsX2luLCBzdGF0aWNfY2FzdDx2b2lkKj4oJmluX2lucHV0KSwgbmRrOjpBUGFyY2VsX3N0ZFZlY3RvckFsbG9jYXRvcjxpbnQzMl90Pik7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfaW4sICZpbl9pbnB1dCk7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVzaXplVmVjdG9yKF9haWRsX2luLCAmb3V0X3JlcGVhdGVkKTsKQEAgLTQ5OCwxMCArNDk5LDEwIEBACiAKICAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDMyQXJyYXkoX2FpZGxfb3V0LCByZWludGVycHJldF9jYXN0PGNvbnN0IGludDMyX3QqPihfYWlkbF9yZXR1cm4uZGF0YSgpKSwgX2FpZGxfcmV0dXJuLnNpemUoKSk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzJBcnJheShfYWlkbF9vdXQsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgaW50MzJfdCo+KG91dF9yZXBlYXRlZC5kYXRhKCkpLCBvdXRfcmVwZWF0ZWQuc2l6ZSgpKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBvdXRfcmVwZWF0ZWQpOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgYnJlYWs7CkBAIC01MTEsNyArNTEyLDcgQEAKICAgICAgIHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtPiBvdXRfcmVwZWF0ZWQ7CiAgICAgICBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMb25nRW51bT4gX2FpZGxfcmV0dXJuOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50NjRBcnJheShfYWlkbF9pbiwgc3RhdGljX2Nhc3Q8dm9pZCo+KCZpbl9pbnB1dCksIG5kazo6QVBhcmNlbF9zdGRWZWN0b3JBbGxvY2F0b3I8aW50NjRfdD4pOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX2luLCAmaW5faW5wdXQpOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3Jlc2l6ZVZlY3RvcihfYWlkbF9pbiwgJm91dF9yZXBlYXRlZCk7CkBAIC01MjMsMTAgKzUyNCwxMCBAQAogCiAgICAgICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQ2NEFycmF5KF9haWRsX291dCwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBpbnQ2NF90Kj4oX2FpZGxfcmV0dXJuLmRhdGEoKSksIF9haWRsX3JldHVybi5zaXplKCkpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDY0QXJyYXkoX2FpZGxfb3V0LCByZWludGVycHJldF9jYXN0PGNvbnN0IGludDY0X3QqPihvdXRfcmVwZWF0ZWQuZGF0YSgpKSwgb3V0X3JlcGVhdGVkLnNpemUoKSk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgb3V0X3JlcGVhdGVkKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIGJyZWFrOwpAQCAtNTM1LDcgKzUzNiw3IEBACiAgICAgICBzdGQ6OnN0cmluZyBpbl9uYW1lOwogICAgICAgc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPiBfYWlkbF9yZXR1cm47CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkU3RyaW5nKF9haWRsX2luLCAmaW5fbmFtZSk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfaW4sICZpbl9uYW1lKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1cyA9IF9haWRsX2ltcGwtPkdldE90aGVyVGVzdFNlcnZpY2UoaW5fbmFtZSwgJl9haWRsX3JldHVybik7CkBAIC01NDQsNyArNTQ1LDcgQEAKIAogICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjazo6d3JpdGVUb1BhcmNlbChfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIGJyZWFrOwpAQCAtNTU0LDEwICs1NTUsMTAgQEAKICAgICAgIHN0ZDo6c3RyaW5nIGluX25hbWU7CiAgICAgICBib29sIF9haWRsX3JldHVybjsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrOjpyZWFkRnJvbVBhcmNlbChfYWlkbF9pbiwgJmluX3NlcnZpY2UpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX2luLCAmaW5fc2VydmljZSk7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFN0cmluZyhfYWlkbF9pbiwgJmluX25hbWUpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX2luLCAmaW5fbmFtZSk7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXMgPSBfYWlkbF9pbXBsLT5WZXJpZnlOYW1lKGluX3NlcnZpY2UsIGluX25hbWUsICZfYWlkbF9yZXR1cm4pOwpAQCAtNTY2LDE3ICs1NjcsMTM3IEBACiAKICAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUJvb2woX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICBicmVhazsKICAgICB9Ci0gICAgY2FzZSAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDI3IC8qUmV2ZXJzZVN0cmluZ0xpc3QqLyk6IHsKKyAgICBjYXNlIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMjcgLypHZXRJbnRlcmZhY2VBcnJheSovKTogeworICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGluX25hbWVzOworICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPj4gX2FpZGxfcmV0dXJuOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfaW4sICZpbl9uYW1lcyk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXMgPSBfYWlkbF9pbXBsLT5HZXRJbnRlcmZhY2VBcnJheShpbl9uYW1lcywgJl9haWRsX3JldHVybik7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZVN0YXR1c0hlYWRlcihfYWlkbF9vdXQsIF9haWRsX3N0YXR1cy5nZXQoKSk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBicmVhazsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDI4IC8qVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlQXJyYXkqLyk6IHsKKyAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4+IGluX3NlcnZpY2VzOworICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGluX25hbWVzOworICAgICAgYm9vbCBfYWlkbF9yZXR1cm47CisKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9pbiwgJmluX3NlcnZpY2VzKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9pbiwgJmluX25hbWVzKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1cyA9IF9haWRsX2ltcGwtPlZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUFycmF5KGluX3NlcnZpY2VzLCBpbl9uYW1lcywgJl9haWRsX3JldHVybik7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZVN0YXR1c0hlYWRlcihfYWlkbF9vdXQsIF9haWRsX3N0YXR1cy5nZXQoKSk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBicmVhazsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDI5IC8qR2V0TnVsbGFibGVJbnRlcmZhY2VBcnJheSovKTogeworICAgICAgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPj4+IGluX25hbWVzOworICAgICAgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+Pj4gX2FpZGxfcmV0dXJuOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9pbiwgJmluX25hbWVzKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1cyA9IF9haWRsX2ltcGwtPkdldE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoaW5fbmFtZXMsICZfYWlkbF9yZXR1cm4pOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVTdGF0dXNIZWFkZXIoX2FpZGxfb3V0LCBfYWlkbF9zdGF0dXMuZ2V0KCkpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7CisKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDMwIC8qVmVyaWZ5TmFtZXNXaXRoTnVsbGFibGVJbnRlcmZhY2VBcnJheSovKTogeworICAgICAgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+Pj4gaW5fc2VydmljZXM7CisgICAgICBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+Pj4gaW5fbmFtZXM7CisgICAgICBib29sIF9haWRsX3JldHVybjsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfaW4sICZpbl9zZXJ2aWNlcyk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9pbiwgJmluX25hbWVzKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1cyA9IF9haWRsX2ltcGwtPlZlcmlmeU5hbWVzV2l0aE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoaW5fc2VydmljZXMsIGluX25hbWVzLCAmX2FpZGxfcmV0dXJuKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlU3RhdHVzSGVhZGVyKF9haWRsX291dCwgX2FpZGxfc3RhdHVzLmdldCgpKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzEgLypHZXRJbnRlcmZhY2VMaXN0Ki8pOiB7CisgICAgICBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+Pj4gaW5fbmFtZXM7CisgICAgICBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4+PiBfYWlkbF9yZXR1cm47CisKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX2luLCAmaW5fbmFtZXMpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzID0gX2FpZGxfaW1wbC0+R2V0SW50ZXJmYWNlTGlzdChpbl9uYW1lcywgJl9haWRsX3JldHVybik7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZVN0YXR1c0hlYWRlcihfYWlkbF9vdXQsIF9haWRsX3N0YXR1cy5nZXQoKSk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBicmVhazsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzIgLypWZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VMaXN0Ki8pOiB7CisgICAgICBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4+PiBpbl9zZXJ2aWNlczsKKyAgICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4+PiBpbl9uYW1lczsKKyAgICAgIGJvb2wgX2FpZGxfcmV0dXJuOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9pbiwgJmluX3NlcnZpY2VzKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX2luLCAmaW5fbmFtZXMpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzID0gX2FpZGxfaW1wbC0+VmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlTGlzdChpbl9zZXJ2aWNlcywgaW5fbmFtZXMsICZfYWlkbF9yZXR1cm4pOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVTdGF0dXNIZWFkZXIoX2FpZGxfb3V0LCBfYWlkbF9zdGF0dXMuZ2V0KCkpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7CisKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzMyAvKlJldmVyc2VTdHJpbmdMaXN0Ki8pOiB7CiAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gaW5faW5wdXQ7CiAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gb3V0X3JlcGVhdGVkOwogICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IF9haWRsX3JldHVybjsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX2FpZGxfaW4sICZpbl9pbnB1dCk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfaW4sICZpbl9pbnB1dCk7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXMgPSBfYWlkbF9pbXBsLT5SZXZlcnNlU3RyaW5nTGlzdChpbl9pbnB1dCwgJm91dF9yZXBlYXRlZCwgJl9haWRsX3JldHVybik7CkBAIC01ODUsMTkgKzcwNiwxOSBAQAogCiAgICAgICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKF9haWRsX291dCwgb3V0X3JlcGVhdGVkKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBvdXRfcmVwZWF0ZWQpOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgYnJlYWs7CiAgICAgfQotICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyOCAvKlJlcGVhdFBhcmNlbEZpbGVEZXNjcmlwdG9yKi8pOiB7CisgICAgY2FzZSAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDM0IC8qUmVwZWF0UGFyY2VsRmlsZURlc2NyaXB0b3IqLyk6IHsKICAgICAgIDo6bmRrOjpTY29wZWRGaWxlRGVzY3JpcHRvciBpbl9yZWFkOwogICAgICAgOjpuZGs6OlNjb3BlZEZpbGVEZXNjcmlwdG9yIF9haWRsX3JldHVybjsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRSZXF1aXJlZFBhcmNlbEZpbGVEZXNjcmlwdG9yKF9haWRsX2luLCAmaW5fcmVhZCk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfaW4sICZpbl9yZWFkKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1cyA9IF9haWRsX2ltcGwtPlJlcGVhdFBhcmNlbEZpbGVEZXNjcmlwdG9yKGluX3JlYWQsICZfYWlkbF9yZXR1cm4pOwpAQCAtNjA2LDE3ICs3MjcsMTcgQEAKIAogICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVJlcXVpcmVkUGFyY2VsRmlsZURlc2NyaXB0b3IoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICBicmVhazsKICAgICB9Ci0gICAgY2FzZSAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDI5IC8qUmV2ZXJzZVBhcmNlbEZpbGVEZXNjcmlwdG9yQXJyYXkqLyk6IHsKKyAgICBjYXNlIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzUgLypSZXZlcnNlUGFyY2VsRmlsZURlc2NyaXB0b3JBcnJheSovKTogewogICAgICAgc3RkOjp2ZWN0b3I8OjpuZGs6OlNjb3BlZEZpbGVEZXNjcmlwdG9yPiBpbl9pbnB1dDsKICAgICAgIHN0ZDo6dmVjdG9yPDo6bmRrOjpTY29wZWRGaWxlRGVzY3JpcHRvcj4gb3V0X3JlcGVhdGVkOwogICAgICAgc3RkOjp2ZWN0b3I8OjpuZGs6OlNjb3BlZEZpbGVEZXNjcmlwdG9yPiBfYWlkbF9yZXR1cm47CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX2luLCAmaW5faW5wdXQpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX2luLCAmaW5faW5wdXQpOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3Jlc2l6ZVZlY3RvcihfYWlkbF9pbiwgJm91dF9yZXBlYXRlZCk7CkBAIC02MjgsMTggKzc0OSwxOCBAQAogCiAgICAgICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKF9haWRsX291dCwgb3V0X3JlcGVhdGVkKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBvdXRfcmVwZWF0ZWQpOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgYnJlYWs7CiAgICAgfQotICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzMCAvKlRocm93U2VydmljZUV4Y2VwdGlvbiovKTogeworICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzNiAvKlRocm93U2VydmljZUV4Y2VwdGlvbiovKTogewogICAgICAgaW50MzJfdCBpbl9jb2RlOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzIoX2FpZGxfaW4sICZpbl9jb2RlKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9pbiwgJmluX2NvZGUpOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzID0gX2FpZGxfaW1wbC0+VGhyb3dTZXJ2aWNlRXhjZXB0aW9uKGluX2NvZGUpOwpAQCAtNjUwLDExICs3NzEsMTEgQEAKIAogICAgICAgYnJlYWs7CiAgICAgfQotICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzMSAvKlJlcGVhdE51bGxhYmxlSW50QXJyYXkqLyk6IHsKKyAgICBjYXNlIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzcgLypSZXBlYXROdWxsYWJsZUludEFycmF5Ki8pOiB7CiAgICAgICBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPGludDMyX3Q+PiBpbl9pbnB1dDsKICAgICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8aW50MzJfdD4+IF9haWRsX3JldHVybjsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX2FpZGxfaW4sICZpbl9pbnB1dCk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9pbiwgJmluX2lucHV0KTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1cyA9IF9haWRsX2ltcGwtPlJlcGVhdE51bGxhYmxlSW50QXJyYXkoaW5faW5wdXQsICZfYWlkbF9yZXR1cm4pOwpAQCAtNjYzLDE2ICs3ODQsMTYgQEAKIAogICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgYnJlYWs7CiAgICAgfQotICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzMiAvKlJlcGVhdE51bGxhYmxlQnl0ZUVudW1BcnJheSovKTogeworICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzOCAvKlJlcGVhdE51bGxhYmxlQnl0ZUVudW1BcnJheSovKTogewogICAgICAgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCeXRlRW51bT4+IGluX2lucHV0OwogICAgICAgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCeXRlRW51bT4+IF9haWRsX3JldHVybjsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEJ5dGVBcnJheShfYWlkbF9pbiwgc3RhdGljX2Nhc3Q8dm9pZCo+KCZpbl9pbnB1dCksIG5kazo6QVBhcmNlbF9udWxsYWJsZVN0ZFZlY3RvckFsbG9jYXRvcjxpbnQ4X3Q+KTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX2luLCAmaW5faW5wdXQpOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzID0gX2FpZGxfaW1wbC0+UmVwZWF0TnVsbGFibGVCeXRlRW51bUFycmF5KGluX2lucHV0LCAmX2FpZGxfcmV0dXJuKTsKQEAgLTY4MSwxNiArODAyLDE2IEBACiAKICAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUJ5dGVBcnJheShfYWlkbF9vdXQsIChfYWlkbF9yZXR1cm4gPyByZWludGVycHJldF9jYXN0PGNvbnN0IGludDhfdCo+KF9haWRsX3JldHVybi0+ZGF0YSgpKSA6IG51bGxwdHIpLCAoX2FpZGxfcmV0dXJuID8gX2FpZGxfcmV0dXJuLT5zaXplKCkgOiAtMSkpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIGJyZWFrOwogICAgIH0KLSAgICBjYXNlIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzMgLypSZXBlYXROdWxsYWJsZUludEVudW1BcnJheSovKTogeworICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzOSAvKlJlcGVhdE51bGxhYmxlSW50RW51bUFycmF5Ki8pOiB7CiAgICAgICBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0+PiBpbl9pbnB1dDsKICAgICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bT4+IF9haWRsX3JldHVybjsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyQXJyYXkoX2FpZGxfaW4sIHN0YXRpY19jYXN0PHZvaWQqPigmaW5faW5wdXQpLCBuZGs6OkFQYXJjZWxfbnVsbGFibGVTdGRWZWN0b3JBbGxvY2F0b3I8aW50MzJfdD4pOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfaW4sICZpbl9pbnB1dCk7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXMgPSBfYWlkbF9pbXBsLT5SZXBlYXROdWxsYWJsZUludEVudW1BcnJheShpbl9pbnB1dCwgJl9haWRsX3JldHVybik7CkBAIC02OTksMTYgKzgyMCwxNiBAQAogCiAgICAgICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQzMkFycmF5KF9haWRsX291dCwgKF9haWRsX3JldHVybiA/IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgaW50MzJfdCo+KF9haWRsX3JldHVybi0+ZGF0YSgpKSA6IG51bGxwdHIpLCAoX2FpZGxfcmV0dXJuID8gX2FpZGxfcmV0dXJuLT5zaXplKCkgOiAtMSkpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIGJyZWFrOwogICAgIH0KLSAgICBjYXNlIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzQgLypSZXBlYXROdWxsYWJsZUxvbmdFbnVtQXJyYXkqLyk6IHsKKyAgICBjYXNlIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDAgLypSZXBlYXROdWxsYWJsZUxvbmdFbnVtQXJyYXkqLyk6IHsKICAgICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0+PiBpbl9pbnB1dDsKICAgICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0+PiBfYWlkbF9yZXR1cm47CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQ2NEFycmF5KF9haWRsX2luLCBzdGF0aWNfY2FzdDx2b2lkKj4oJmluX2lucHV0KSwgbmRrOjpBUGFyY2VsX251bGxhYmxlU3RkVmVjdG9yQWxsb2NhdG9yPGludDY0X3Q+KTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX2luLCAmaW5faW5wdXQpOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzID0gX2FpZGxfaW1wbC0+UmVwZWF0TnVsbGFibGVMb25nRW51bUFycmF5KGluX2lucHV0LCAmX2FpZGxfcmV0dXJuKTsKQEAgLTcxNywxNiArODM4LDE2IEBACiAKICAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDY0QXJyYXkoX2FpZGxfb3V0LCAoX2FpZGxfcmV0dXJuID8gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBpbnQ2NF90Kj4oX2FpZGxfcmV0dXJuLT5kYXRhKCkpIDogbnVsbHB0ciksIChfYWlkbF9yZXR1cm4gPyBfYWlkbF9yZXR1cm4tPnNpemUoKSA6IC0xKSk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgYnJlYWs7CiAgICAgfQotICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzNSAvKlJlcGVhdE51bGxhYmxlU3RyaW5nKi8pOiB7CisgICAgY2FzZSAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQxIC8qUmVwZWF0TnVsbGFibGVTdHJpbmcqLyk6IHsKICAgICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+IGluX2lucHV0OwogICAgICAgc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4gX2FpZGxfcmV0dXJuOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFN0cmluZyhfYWlkbF9pbiwgJmluX2lucHV0KTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX2luLCAmaW5faW5wdXQpOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzID0gX2FpZGxfaW1wbC0+UmVwZWF0TnVsbGFibGVTdHJpbmcoaW5faW5wdXQsICZfYWlkbF9yZXR1cm4pOwpAQCAtNzM1LDE2ICs4NTYsMTYgQEAKIAogICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVN0cmluZyhfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgYnJlYWs7CiAgICAgfQotICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzNiAvKlJlcGVhdE51bGxhYmxlU3RyaW5nTGlzdCovKTogewotICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGluX2lucHV0OwotICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IF9haWRsX3JldHVybjsKKyAgICBjYXNlIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDIgLypSZXBlYXROdWxsYWJsZVN0cmluZ0xpc3QqLyk6IHsKKyAgICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4+PiBpbl9pbnB1dDsKKyAgICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4+PiBfYWlkbF9yZXR1cm47CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX2luLCAmaW5faW5wdXQpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfaW4sICZpbl9pbnB1dCk7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXMgPSBfYWlkbF9pbXBsLT5SZXBlYXROdWxsYWJsZVN0cmluZ0xpc3QoaW5faW5wdXQsICZfYWlkbF9yZXR1cm4pOwpAQCAtNzUzLDE2ICs4NzQsMTYgQEAKIAogICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgYnJlYWs7CiAgICAgfQotICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzNyAvKlJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZSovKTogewotICAgICAgc3RkOjpvcHRpb25hbDw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpTdHJ1Y3R1cmVkUGFyY2VsYWJsZT4gaW5faW5wdXQ7Ci0gICAgICBzdGQ6Om9wdGlvbmFsPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlN0cnVjdHVyZWRQYXJjZWxhYmxlPiBfYWlkbF9yZXR1cm47CisgICAgY2FzZSAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQzIC8qUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlKi8pOiB7CisgICAgICBzdGQ6Om9wdGlvbmFsPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6RW1wdHk+IGluX2lucHV0OworICAgICAgc3RkOjpvcHRpb25hbDw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5PiBfYWlkbF9yZXR1cm47CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVQYXJjZWxhYmxlKF9haWRsX2luLCAmaW5faW5wdXQpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfaW4sICZpbl9pbnB1dCk7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXMgPSBfYWlkbF9pbXBsLT5SZXBlYXROdWxsYWJsZVBhcmNlbGFibGUoaW5faW5wdXQsICZfYWlkbF9yZXR1cm4pOwpAQCAtNzcxLDE1ICs4OTIsNTEgQEAKIAogICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlUGFyY2VsYWJsZShfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgYnJlYWs7CiAgICAgfQotICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzOCAvKlRha2VzQW5JQmluZGVyKi8pOiB7CisgICAgY2FzZSAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQ0IC8qUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlQXJyYXkqLyk6IHsKKyAgICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5Pj4+IGluX2lucHV0OworICAgICAgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6RW1wdHk+Pj4gX2FpZGxfcmV0dXJuOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9pbiwgJmluX2lucHV0KTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1cyA9IF9haWRsX2ltcGwtPlJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUFycmF5KGluX2lucHV0LCAmX2FpZGxfcmV0dXJuKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlU3RhdHVzSGVhZGVyKF9haWRsX291dCwgX2FpZGxfc3RhdHVzLmdldCgpKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0NSAvKlJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUxpc3QqLyk6IHsKKyAgICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5Pj4+IGluX2lucHV0OworICAgICAgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6RW1wdHk+Pj4gX2FpZGxfcmV0dXJuOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9pbiwgJmluX2lucHV0KTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1cyA9IF9haWRsX2ltcGwtPlJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUxpc3QoaW5faW5wdXQsICZfYWlkbF9yZXR1cm4pOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVTdGF0dXNIZWFkZXIoX2FpZGxfb3V0LCBfYWlkbF9zdGF0dXMuZ2V0KCkpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7CisKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQ2IC8qVGFrZXNBbklCaW5kZXIqLyk6IHsKICAgICAgIDo6bmRrOjpTcEFJQmluZGVyIGluX2lucHV0OwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFJlcXVpcmVkU3Ryb25nQmluZGVyKF9haWRsX2luLCAmaW5faW5wdXQpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX2luLCAmaW5faW5wdXQpOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzID0gX2FpZGxfaW1wbC0+VGFrZXNBbklCaW5kZXIoaW5faW5wdXQpOwpAQCAtNzkwLDEwICs5NDcsMTAgQEAKIAogICAgICAgYnJlYWs7CiAgICAgfQotICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzOSAvKlRha2VzQU51bGxhYmxlSUJpbmRlciovKTogeworICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0NyAvKlRha2VzQU51bGxhYmxlSUJpbmRlciovKTogewogICAgICAgOjpuZGs6OlNwQUlCaW5kZXIgaW5faW5wdXQ7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVTdHJvbmdCaW5kZXIoX2FpZGxfaW4sICZpbl9pbnB1dCk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9pbiwgJmluX2lucHV0KTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1cyA9IF9haWRsX2ltcGwtPlRha2VzQU51bGxhYmxlSUJpbmRlcihpbl9pbnB1dCk7CkBAIC04MDQsMTEgKzk2MSwzOSBAQAogCiAgICAgICBicmVhazsKICAgICB9Ci0gICAgY2FzZSAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQwIC8qUmVwZWF0VXRmOENwcFN0cmluZyovKTogeworICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0OCAvKlRha2VzQW5JQmluZGVyTGlzdCovKTogeworICAgICAgc3RkOjp2ZWN0b3I8OjpuZGs6OlNwQUlCaW5kZXI+IGluX2lucHV0OworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfaW4sICZpbl9pbnB1dCk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXMgPSBfYWlkbF9pbXBsLT5UYWtlc0FuSUJpbmRlckxpc3QoaW5faW5wdXQpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVTdGF0dXNIZWFkZXIoX2FpZGxfb3V0LCBfYWlkbF9zdGF0dXMuZ2V0KCkpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7CisKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDkgLypUYWtlc0FOdWxsYWJsZUlCaW5kZXJMaXN0Ki8pOiB7CisgICAgICBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPDo6bmRrOjpTcEFJQmluZGVyPj4gaW5faW5wdXQ7CisKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX2luLCAmaW5faW5wdXQpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzID0gX2FpZGxfaW1wbC0+VGFrZXNBTnVsbGFibGVJQmluZGVyTGlzdChpbl9pbnB1dCk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZVN0YXR1c0hlYWRlcihfYWlkbF9vdXQsIF9haWRsX3N0YXR1cy5nZXQoKSk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBicmVhazsKKworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1MCAvKlJlcGVhdFV0ZjhDcHBTdHJpbmcqLyk6IHsKICAgICAgIHN0ZDo6c3RyaW5nIGluX3Rva2VuOwogICAgICAgc3RkOjpzdHJpbmcgX2FpZGxfcmV0dXJuOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFN0cmluZyhfYWlkbF9pbiwgJmluX3Rva2VuKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9pbiwgJmluX3Rva2VuKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1cyA9IF9haWRsX2ltcGwtPlJlcGVhdFV0ZjhDcHBTdHJpbmcoaW5fdG9rZW4sICZfYWlkbF9yZXR1cm4pOwpAQCAtODE3LDE2ICsxMDAyLDE2IEBACiAKICAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVTdHJpbmcoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICBicmVhazsKICAgICB9Ci0gICAgY2FzZSAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQxIC8qUmVwZWF0TnVsbGFibGVVdGY4Q3BwU3RyaW5nKi8pOiB7CisgICAgY2FzZSAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDUxIC8qUmVwZWF0TnVsbGFibGVVdGY4Q3BwU3RyaW5nKi8pOiB7CiAgICAgICBzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiBpbl90b2tlbjsKICAgICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+IF9haWRsX3JldHVybjsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRTdHJpbmcoX2FpZGxfaW4sICZpbl90b2tlbik7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9pbiwgJmluX3Rva2VuKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1cyA9IF9haWRsX2ltcGwtPlJlcGVhdE51bGxhYmxlVXRmOENwcFN0cmluZyhpbl90b2tlbiwgJl9haWRsX3JldHVybik7CkBAIC04MzUsMTcgKzEwMjAsMTcgQEAKIAogICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVN0cmluZyhfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgYnJlYWs7CiAgICAgfQotICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0MiAvKlJldmVyc2VVdGY4Q3BwU3RyaW5nKi8pOiB7CisgICAgY2FzZSAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDUyIC8qUmV2ZXJzZVV0ZjhDcHBTdHJpbmcqLyk6IHsKICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBpbl9pbnB1dDsKICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBvdXRfcmVwZWF0ZWQ7CiAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gX2FpZGxfcmV0dXJuOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihfYWlkbF9pbiwgJmluX2lucHV0KTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9pbiwgJmluX2lucHV0KTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZXNpemVWZWN0b3IoX2FpZGxfaW4sICZvdXRfcmVwZWF0ZWQpOwpAQCAtODU3LDIwICsxMDQyLDIwIEBACiAKICAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX2FpZGxfb3V0LCBvdXRfcmVwZWF0ZWQpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIG91dF9yZXBlYXRlZCk7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICBicmVhazsKICAgICB9Ci0gICAgY2FzZSAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQzIC8qUmV2ZXJzZU51bGxhYmxlVXRmOENwcFN0cmluZyovKTogeworICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1MyAvKlJldmVyc2VOdWxsYWJsZVV0ZjhDcHBTdHJpbmcqLyk6IHsKICAgICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4+PiBpbl9pbnB1dDsKICAgICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4+PiBvdXRfcmVwZWF0ZWQ7CiAgICAgICBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+Pj4gX2FpZGxfcmV0dXJuOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihfYWlkbF9pbiwgJmluX2lucHV0KTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX2luLCAmaW5faW5wdXQpOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3Jlc2l6ZVZlY3RvcihfYWlkbF9pbiwgJm91dF9yZXBlYXRlZCk7CkBAIC04ODIsMjAgKzEwNjcsMjAgQEAKIAogICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKF9haWRsX291dCwgb3V0X3JlcGVhdGVkKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9vdXQsIG91dF9yZXBlYXRlZCk7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICBicmVhazsKICAgICB9Ci0gICAgY2FzZSAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQ0IC8qUmV2ZXJzZVV0ZjhDcHBTdHJpbmdMaXN0Ki8pOiB7Ci0gICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gaW5faW5wdXQ7Ci0gICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gb3V0X3JlcGVhdGVkOwotICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IF9haWRsX3JldHVybjsKKyAgICBjYXNlIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNTQgLypSZXZlcnNlVXRmOENwcFN0cmluZ0xpc3QqLyk6IHsKKyAgICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4+PiBpbl9pbnB1dDsKKyAgICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4+PiBvdXRfcmVwZWF0ZWQ7CisgICAgICBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+Pj4gX2FpZGxfcmV0dXJuOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihfYWlkbF9pbiwgJmluX2lucHV0KTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX2luLCAmaW5faW5wdXQpOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzID0gX2FpZGxfaW1wbC0+UmV2ZXJzZVV0ZjhDcHBTdHJpbmdMaXN0KGluX2lucHV0LCAmb3V0X3JlcGVhdGVkLCAmX2FpZGxfcmV0dXJuKTsKQEAgLTkwNCwxOSArMTA4OSwxOSBAQAogCiAgICAgICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX2FpZGxfb3V0LCBvdXRfcmVwZWF0ZWQpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX291dCwgb3V0X3JlcGVhdGVkKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIGJyZWFrOwogICAgIH0KLSAgICBjYXNlIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDUgLypHZXRDYWxsYmFjayovKTogeworICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1NSAvKkdldENhbGxiYWNrKi8pOiB7CiAgICAgICBib29sIGluX3JldHVybl9udWxsOwogICAgICAgc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPiBfYWlkbF9yZXR1cm47CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRCb29sKF9haWRsX2luLCAmaW5fcmV0dXJuX251bGwpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX2luLCAmaW5fcmV0dXJuX251bGwpOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzID0gX2FpZGxfaW1wbC0+R2V0Q2FsbGJhY2soaW5fcmV0dXJuX251bGwsICZfYWlkbF9yZXR1cm4pOwpAQCAtOTI1LDE1ICsxMTEwLDE1IEBACiAKICAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s6OndyaXRlVG9QYXJjZWwoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIGJyZWFrOwogICAgIH0KLSAgICBjYXNlIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDYgLypGaWxsT3V0U3RydWN0dXJlZFBhcmNlbGFibGUqLyk6IHsKKyAgICBjYXNlIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNTYgLypGaWxsT3V0U3RydWN0dXJlZFBhcmNlbGFibGUqLyk6IHsKICAgICAgIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlN0cnVjdHVyZWRQYXJjZWxhYmxlIGluX3BhcmNlbDsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRQYXJjZWxhYmxlKF9haWRsX2luLCAmaW5fcGFyY2VsKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9pbiwgJmluX3BhcmNlbCk7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXMgPSBfYWlkbF9pbXBsLT5GaWxsT3V0U3RydWN0dXJlZFBhcmNlbGFibGUoJmluX3BhcmNlbCk7CkBAIC05NDIsMTIgKzExMjcsOTggQEAKIAogICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVBhcmNlbGFibGUoX2FpZGxfb3V0LCBpbl9wYXJjZWwpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIGluX3BhcmNlbCk7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICBicmVhazsKICAgICB9Ci0gICAgY2FzZSAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQ3IC8qR2V0T2xkTmFtZUludGVyZmFjZSovKTogeworICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1NyAvKlJlcGVhdEV4dGVuZGFibGVQYXJjZWxhYmxlKi8pOiB7CisgICAgICA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpleHRlbnNpb246OkV4dGVuZGFibGVQYXJjZWxhYmxlIGluX2VwOworICAgICAgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6ZXh0ZW5zaW9uOjpFeHRlbmRhYmxlUGFyY2VsYWJsZSBvdXRfZXAyOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfaW4sICZpbl9lcCk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXMgPSBfYWlkbF9pbXBsLT5SZXBlYXRFeHRlbmRhYmxlUGFyY2VsYWJsZShpbl9lcCwgJm91dF9lcDIpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVTdGF0dXNIZWFkZXIoX2FpZGxfb3V0LCBfYWlkbF9zdGF0dXMuZ2V0KCkpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7CisKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBvdXRfZXAyKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNTggLypSZXZlcnNlTGlzdCovKTogeworICAgICAgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6UmVjdXJzaXZlTGlzdCBpbl9saXN0OworICAgICAgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6UmVjdXJzaXZlTGlzdCBfYWlkbF9yZXR1cm47CisKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9pbiwgJmluX2xpc3QpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzID0gX2FpZGxfaW1wbC0+UmV2ZXJzZUxpc3QoaW5fbGlzdCwgJl9haWRsX3JldHVybik7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZVN0YXR1c0hlYWRlcihfYWlkbF9vdXQsIF9haWRsX3N0YXR1cy5nZXQoKSk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBicmVhazsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDU5IC8qUmV2ZXJzZUlCaW5kZXJBcnJheSovKTogeworICAgICAgc3RkOjp2ZWN0b3I8OjpuZGs6OlNwQUlCaW5kZXI+IGluX2lucHV0OworICAgICAgc3RkOjp2ZWN0b3I8OjpuZGs6OlNwQUlCaW5kZXI+IG91dF9yZXBlYXRlZDsKKyAgICAgIHN0ZDo6dmVjdG9yPDo6bmRrOjpTcEFJQmluZGVyPiBfYWlkbF9yZXR1cm47CisKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9pbiwgJmluX2lucHV0KTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZXNpemVWZWN0b3IoX2FpZGxfaW4sICZvdXRfcmVwZWF0ZWQpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzID0gX2FpZGxfaW1wbC0+UmV2ZXJzZUlCaW5kZXJBcnJheShpbl9pbnB1dCwgJm91dF9yZXBlYXRlZCwgJl9haWRsX3JldHVybik7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZVN0YXR1c0hlYWRlcihfYWlkbF9vdXQsIF9haWRsX3N0YXR1cy5nZXQoKSk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBicmVhazsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgb3V0X3JlcGVhdGVkKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNjAgLypSZXZlcnNlTnVsbGFibGVJQmluZGVyQXJyYXkqLyk6IHsKKyAgICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8OjpuZGs6OlNwQUlCaW5kZXI+PiBpbl9pbnB1dDsKKyAgICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8OjpuZGs6OlNwQUlCaW5kZXI+PiBvdXRfcmVwZWF0ZWQ7CisgICAgICBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPDo6bmRrOjpTcEFJQmluZGVyPj4gX2FpZGxfcmV0dXJuOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9pbiwgJmluX2lucHV0KTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZXNpemVWZWN0b3IoX2FpZGxfaW4sICZvdXRfcmVwZWF0ZWQpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzID0gX2FpZGxfaW1wbC0+UmV2ZXJzZU51bGxhYmxlSUJpbmRlckFycmF5KGluX2lucHV0LCAmb3V0X3JlcGVhdGVkLCAmX2FpZGxfcmV0dXJuKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlU3RhdHVzSGVhZGVyKF9haWRsX291dCwgX2FpZGxfc3RhdHVzLmdldCgpKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX291dCwgb3V0X3JlcGVhdGVkKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNjEgLypHZXRPbGROYW1lSW50ZXJmYWNlKi8pOiB7CiAgICAgICBzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU9sZE5hbWU+IF9haWRsX3JldHVybjsKIAogICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzID0gX2FpZGxfaW1wbC0+R2V0T2xkTmFtZUludGVyZmFjZSgmX2FpZGxfcmV0dXJuKTsKQEAgLTk1NiwxMiArMTIyNywxMiBAQAogCiAgICAgICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklPbGROYW1lOjp3cml0ZVRvUGFyY2VsKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgYnJlYWs7CiAgICAgfQotICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0OCAvKkdldE5ld05hbWVJbnRlcmZhY2UqLyk6IHsKKyAgICBjYXNlIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNjIgLypHZXROZXdOYW1lSW50ZXJmYWNlKi8pOiB7CiAgICAgICBzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5ld05hbWU+IF9haWRsX3JldHVybjsKIAogICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzID0gX2FpZGxfaW1wbC0+R2V0TmV3TmFtZUludGVyZmFjZSgmX2FpZGxfcmV0dXJuKTsKQEAgLTk3MCwxMiArMTI0MSwzMCBAQAogCiAgICAgICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOZXdOYW1lOjp3cml0ZVRvUGFyY2VsKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgYnJlYWs7CiAgICAgfQotICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0OSAvKkdldENwcEphdmFUZXN0cyovKTogeworICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA2MyAvKkdldFVuaW9uVGFncyovKTogeworICAgICAgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6VW5pb24+IGluX2lucHV0OworICAgICAgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6VW5pb246OlRhZz4gX2FpZGxfcmV0dXJuOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfaW4sICZpbl9pbnB1dCk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXMgPSBfYWlkbF9pbXBsLT5HZXRVbmlvblRhZ3MoaW5faW5wdXQsICZfYWlkbF9yZXR1cm4pOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVTdGF0dXNIZWFkZXIoX2FpZGxfb3V0LCBfYWlkbF9zdGF0dXMuZ2V0KCkpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7CisKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA2NCAvKkdldENwcEphdmFUZXN0cyovKTogewogICAgICAgOjpuZGs6OlNwQUlCaW5kZXIgX2FpZGxfcmV0dXJuOwogCiAgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXMgPSBfYWlkbF9pbXBsLT5HZXRDcHBKYXZhVGVzdHMoJl9haWRsX3JldHVybik7CkBAIC05ODQsMTIgKzEyNzMsMTIgQEAKIAogICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlU3Ryb25nQmluZGVyKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICBicmVhazsKICAgICB9Ci0gICAgY2FzZSAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDUwIC8qZ2V0QmFja2VuZFR5cGUqLyk6IHsKKyAgICBjYXNlIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNjUgLypnZXRCYWNrZW5kVHlwZSovKTogewogICAgICAgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QmFja2VuZFR5cGUgX2FpZGxfcmV0dXJuOwogCiAgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXMgPSBfYWlkbF9pbXBsLT5nZXRCYWNrZW5kVHlwZSgmX2FpZGxfcmV0dXJuKTsKQEAgLTk5OCw3ICsxMjg3LDcgQEAKIAogICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlQnl0ZShfYWlkbF9vdXQsIHN0YXRpY19jYXN0PGludDhfdD4oX2FpZGxfcmV0dXJuKSk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIGJyZWFrOwpAQCAtMTAwNyw3ICsxMjk2LDcgQEAKICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CiB9CiAKLXN0YXRpYyBBSUJpbmRlcl9DbGFzcyogX2dfYWlkbF9jbGF6eiA9IDo6bmRrOjpJQ0ludGVyZmFjZTo6ZGVmaW5lQ2xhc3MoSVRlc3RTZXJ2aWNlOjpkZXNjcmlwdG9yLCBfYWlkbF9vblRyYW5zYWN0KTsKK3N0YXRpYyBBSUJpbmRlcl9DbGFzcyogX2dfYWlkbF9hbmRyb2lkX2FpZGxfdGVzdHNfSVRlc3RTZXJ2aWNlX2NsYXp6ID0gOjpuZGs6OklDSW50ZXJmYWNlOjpkZWZpbmVDbGFzcyhJVGVzdFNlcnZpY2U6OmRlc2NyaXB0b3IsIF9haWRsX2FuZHJvaWRfYWlkbF90ZXN0c19JVGVzdFNlcnZpY2Vfb25UcmFuc2FjdCk7CiAKICNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKIEJwVGVzdFNlcnZpY2U6OkJwVGVzdFNlcnZpY2UoY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGJpbmRlcikgOiBCcENJbnRlcmZhY2UoYmluZGVyKSB7fQpAQCAtMTAyMyw3ICsxMzEyLDcgQEAKICAgQVBhcmNlbF9tYXJrU2Vuc2l0aXZlKF9haWRsX2luLmdldCgpKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIoX2FpZGxfaW4uZ2V0KCksIGluX2FyZyk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX2FyZyk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9yZXRfc3RhdHVzID0gQUlCaW5kZXJfdHJhbnNhY3QoCkBAIC0xMDQ2LDcgKzEzMzUsNyBAQAogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOwotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzIoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfZXJyb3I6CkBAIC0xMTMwLDcgKzE0MTksNyBAQAogICBBUGFyY2VsX21hcmtTZW5zaXRpdmUoX2FpZGxfaW4uZ2V0KCkpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVCb29sKF9haWRsX2luLmdldCgpLCBpbl90b2tlbik7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX3Rva2VuKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl90cmFuc2FjdCgKQEAgLTExNTMsNyArMTQ0Miw3IEBACiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47Ci0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRCb29sKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX2Vycm9yOgpAQCAtMTE3MSw3ICsxNDYwLDcgQEAKICAgQVBhcmNlbF9tYXJrU2Vuc2l0aXZlKF9haWRsX2luLmdldCgpKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlQnl0ZShfYWlkbF9pbi5nZXQoKSwgaW5fdG9rZW4pOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX2luLmdldCgpLCBpbl90b2tlbik7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9yZXRfc3RhdHVzID0gQUlCaW5kZXJfdHJhbnNhY3QoCkBAIC0xMTk0LDcgKzE0ODMsNyBAQAogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOwotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkQnl0ZShfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9lcnJvcjoKQEAgLTEyMTIsNyArMTUwMSw3IEBACiAgIEFQYXJjZWxfbWFya1NlbnNpdGl2ZShfYWlkbF9pbi5nZXQoKSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUNoYXIoX2FpZGxfaW4uZ2V0KCksIGluX3Rva2VuKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5fdG9rZW4pOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KApAQCAtMTIzNSw3ICsxNTI0LDcgQEAKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZENoYXIoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfZXJyb3I6CkBAIC0xMjUzLDcgKzE1NDIsNyBAQAogICBBUGFyY2VsX21hcmtTZW5zaXRpdmUoX2FpZGxfaW4uZ2V0KCkpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQzMihfYWlkbF9pbi5nZXQoKSwgaW5fdG9rZW4pOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX2luLmdldCgpLCBpbl90b2tlbik7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9yZXRfc3RhdHVzID0gQUlCaW5kZXJfdHJhbnNhY3QoCkBAIC0xMjc2LDcgKzE1NjUsNyBAQAogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOwotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzIoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfZXJyb3I6CkBAIC0xMjk0LDcgKzE1ODMsNyBAQAogICBBUGFyY2VsX21hcmtTZW5zaXRpdmUoX2FpZGxfaW4uZ2V0KCkpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQ2NChfYWlkbF9pbi5nZXQoKSwgaW5fdG9rZW4pOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX2luLmdldCgpLCBpbl90b2tlbik7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9yZXRfc3RhdHVzID0gQUlCaW5kZXJfdHJhbnNhY3QoCkBAIC0xMzE3LDcgKzE2MDYsNyBAQAogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOwotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50NjQoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfZXJyb3I6CkBAIC0xMzM1LDcgKzE2MjQsNyBAQAogICBBUGFyY2VsX21hcmtTZW5zaXRpdmUoX2FpZGxfaW4uZ2V0KCkpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVGbG9hdChfYWlkbF9pbi5nZXQoKSwgaW5fdG9rZW4pOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX2luLmdldCgpLCBpbl90b2tlbik7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9yZXRfc3RhdHVzID0gQUlCaW5kZXJfdHJhbnNhY3QoCkBAIC0xMzU4LDcgKzE2NDcsNyBAQAogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOwotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkRmxvYXQoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfZXJyb3I6CkBAIC0xMzc2LDcgKzE2NjUsNyBAQAogICBBUGFyY2VsX21hcmtTZW5zaXRpdmUoX2FpZGxfaW4uZ2V0KCkpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVEb3VibGUoX2FpZGxfaW4uZ2V0KCksIGluX3Rva2VuKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5fdG9rZW4pOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KApAQCAtMTM5OSw3ICsxNjg4LDcgQEAKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZERvdWJsZShfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9lcnJvcjoKQEAgLTE0MTcsNyArMTcwNiw3IEBACiAgIEFQYXJjZWxfbWFya1NlbnNpdGl2ZShfYWlkbF9pbi5nZXQoKSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVTdHJpbmcoX2FpZGxfaW4uZ2V0KCksIGluX3Rva2VuKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5fdG9rZW4pOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KApAQCAtMTQ0MCw3ICsxNzI5LDcgQEAKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRTdHJpbmcoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfZXJyb3I6CkBAIC0xNDU4LDcgKzE3NDcsNyBAQAogICBBUGFyY2VsX21hcmtTZW5zaXRpdmUoX2FpZGxfaW4uZ2V0KCkpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVCeXRlKF9haWRsX2luLmdldCgpLCBzdGF0aWNfY2FzdDxpbnQ4X3Q+KGluX3Rva2VuKSk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX3Rva2VuKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl90cmFuc2FjdCgKQEAgLTE0ODEsNyArMTc3MCw3IEBACiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47Ci0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRCeXRlKF9haWRsX291dC5nZXQoKSwgcmVpbnRlcnByZXRfY2FzdDxpbnQ4X3QqPihfYWlkbF9yZXR1cm4pKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX2Vycm9yOgpAQCAtMTQ5OSw3ICsxNzg4LDcgQEAKICAgQVBhcmNlbF9tYXJrU2Vuc2l0aXZlKF9haWRsX2luLmdldCgpKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIoX2FpZGxfaW4uZ2V0KCksIHN0YXRpY19jYXN0PGludDMyX3Q+KGluX3Rva2VuKSk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX3Rva2VuKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl90cmFuc2FjdCgKQEAgLTE1MjIsNyArMTgxMSw3IEBACiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47Ci0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihfYWlkbF9vdXQuZ2V0KCksIHJlaW50ZXJwcmV0X2Nhc3Q8aW50MzJfdCo+KF9haWRsX3JldHVybikpOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfZXJyb3I6CkBAIC0xNTQwLDcgKzE4MjksNyBAQAogICBBUGFyY2VsX21hcmtTZW5zaXRpdmUoX2FpZGxfaW4uZ2V0KCkpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQ2NChfYWlkbF9pbi5nZXQoKSwgc3RhdGljX2Nhc3Q8aW50NjRfdD4oaW5fdG9rZW4pKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5fdG9rZW4pOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KApAQCAtMTU2Myw3ICsxODUyLDcgQEAKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDY0KF9haWRsX291dC5nZXQoKSwgcmVpbnRlcnByZXRfY2FzdDxpbnQ2NF90Kj4oX2FpZGxfcmV0dXJuKSk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9lcnJvcjoKQEAgLTE1ODEsNyArMTg3MCw3IEBACiAgIEFQYXJjZWxfbWFya1NlbnNpdGl2ZShfYWlkbF9pbi5nZXQoKSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX2FpZGxfaW4uZ2V0KCksIGluX2lucHV0KTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5faW5wdXQpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yU2l6ZShfYWlkbF9pbi5nZXQoKSwgKm91dF9yZXBlYXRlZCk7CkBAIC0xNjA3LDEwICsxODk2LDEwIEBACiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47Ci0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX291dC5nZXQoKSwgb3V0X3JlcGVhdGVkKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgb3V0X3JlcGVhdGVkKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX2Vycm9yOgpAQCAtMTYyOCw3ICsxOTE3LDcgQEAKICAgQVBhcmNlbF9tYXJrU2Vuc2l0aXZlKF9haWRsX2luLmdldCgpKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihfYWlkbF9pbi5nZXQoKSwgaW5faW5wdXQpOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX2luLmdldCgpLCBpbl9pbnB1dCk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3JTaXplKF9haWRsX2luLmdldCgpLCAqb3V0X3JlcGVhdGVkKTsKQEAgLTE2NTQsMTAgKzE5NDMsMTAgQEAKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX2FpZGxfb3V0LmdldCgpLCBvdXRfcmVwZWF0ZWQpOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBvdXRfcmVwZWF0ZWQpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfZXJyb3I6CkBAIC0xNjc1LDcgKzE5NjQsNyBAQAogICBBUGFyY2VsX21hcmtTZW5zaXRpdmUoX2FpZGxfaW4uZ2V0KCkpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKF9haWRsX2luLmdldCgpLCBpbl9pbnB1dCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX2lucHV0KTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvclNpemUoX2FpZGxfaW4uZ2V0KCksICpvdXRfcmVwZWF0ZWQpOwpAQCAtMTcwMSwxMCArMTk5MCwxMCBAQAogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOwotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihfYWlkbF9vdXQuZ2V0KCksIG91dF9yZXBlYXRlZCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIG91dF9yZXBlYXRlZCk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9lcnJvcjoKQEAgLTE3MjIsNyArMjAxMSw3IEBACiAgIEFQYXJjZWxfbWFya1NlbnNpdGl2ZShfYWlkbF9pbi5nZXQoKSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX2FpZGxfaW4uZ2V0KCksIGluX2lucHV0KTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5faW5wdXQpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yU2l6ZShfYWlkbF9pbi5nZXQoKSwgKm91dF9yZXBlYXRlZCk7CkBAIC0xNzQ4LDEwICsyMDM3LDEwIEBACiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47Ci0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX291dC5nZXQoKSwgb3V0X3JlcGVhdGVkKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgb3V0X3JlcGVhdGVkKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX2Vycm9yOgpAQCAtMTc2OSw3ICsyMDU4LDcgQEAKICAgQVBhcmNlbF9tYXJrU2Vuc2l0aXZlKF9haWRsX2luLmdldCgpKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihfYWlkbF9pbi5nZXQoKSwgaW5faW5wdXQpOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX2luLmdldCgpLCBpbl9pbnB1dCk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3JTaXplKF9haWRsX2luLmdldCgpLCAqb3V0X3JlcGVhdGVkKTsKQEAgLTE3OTUsMTAgKzIwODQsMTAgQEAKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX2FpZGxfb3V0LmdldCgpLCBvdXRfcmVwZWF0ZWQpOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBvdXRfcmVwZWF0ZWQpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfZXJyb3I6CkBAIC0xODE2LDcgKzIxMDUsNyBAQAogICBBUGFyY2VsX21hcmtTZW5zaXRpdmUoX2FpZGxfaW4uZ2V0KCkpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKF9haWRsX2luLmdldCgpLCBpbl9pbnB1dCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX2lucHV0KTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvclNpemUoX2FpZGxfaW4uZ2V0KCksICpvdXRfcmVwZWF0ZWQpOwpAQCAtMTg0MiwxMCArMjEzMSwxMCBAQAogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOwotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihfYWlkbF9vdXQuZ2V0KCksIG91dF9yZXBlYXRlZCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIG91dF9yZXBlYXRlZCk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9lcnJvcjoKQEAgLTE4NjMsNyArMjE1Miw3IEBACiAgIEFQYXJjZWxfbWFya1NlbnNpdGl2ZShfYWlkbF9pbi5nZXQoKSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX2FpZGxfaW4uZ2V0KCksIGluX2lucHV0KTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5faW5wdXQpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yU2l6ZShfYWlkbF9pbi5nZXQoKSwgKm91dF9yZXBlYXRlZCk7CkBAIC0xODg5LDEwICsyMTc4LDEwIEBACiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47Ci0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX291dC5nZXQoKSwgb3V0X3JlcGVhdGVkKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgb3V0X3JlcGVhdGVkKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX2Vycm9yOgpAQCAtMTkxMCw3ICsyMTk5LDcgQEAKICAgQVBhcmNlbF9tYXJrU2Vuc2l0aXZlKF9haWRsX2luLmdldCgpKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihfYWlkbF9pbi5nZXQoKSwgaW5faW5wdXQpOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX2luLmdldCgpLCBpbl9pbnB1dCk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3JTaXplKF9haWRsX2luLmdldCgpLCAqb3V0X3JlcGVhdGVkKTsKQEAgLTE5MzYsMTAgKzIyMjUsMTAgQEAKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX2FpZGxfb3V0LmdldCgpLCBvdXRfcmVwZWF0ZWQpOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBvdXRfcmVwZWF0ZWQpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfZXJyb3I6CkBAIC0xOTU3LDcgKzIyNDYsNyBAQAogICBBUGFyY2VsX21hcmtTZW5zaXRpdmUoX2FpZGxfaW4uZ2V0KCkpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVCeXRlQXJyYXkoX2FpZGxfaW4uZ2V0KCksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgaW50OF90Kj4oaW5faW5wdXQuZGF0YSgpKSwgaW5faW5wdXQuc2l6ZSgpKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5faW5wdXQpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yU2l6ZShfYWlkbF9pbi5nZXQoKSwgKm91dF9yZXBlYXRlZCk7CkBAIC0xOTgzLDEwICsyMjcyLDEwIEBACiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47Ci0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRCeXRlQXJyYXkoX2FpZGxfb3V0LmdldCgpLCBzdGF0aWNfY2FzdDx2b2lkKj4oX2FpZGxfcmV0dXJuKSwgbmRrOjpBUGFyY2VsX3N0ZFZlY3RvckFsbG9jYXRvcjxpbnQ4X3Q+KTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRCeXRlQXJyYXkoX2FpZGxfb3V0LmdldCgpLCBzdGF0aWNfY2FzdDx2b2lkKj4ob3V0X3JlcGVhdGVkKSwgbmRrOjpBUGFyY2VsX3N0ZFZlY3RvckFsbG9jYXRvcjxpbnQ4X3Q+KTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgb3V0X3JlcGVhdGVkKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX2Vycm9yOgpAQCAtMjAwNCw3ICsyMjkzLDcgQEAKICAgQVBhcmNlbF9tYXJrU2Vuc2l0aXZlKF9haWRsX2luLmdldCgpKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzJBcnJheShfYWlkbF9pbi5nZXQoKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBpbnQzMl90Kj4oaW5faW5wdXQuZGF0YSgpKSwgaW5faW5wdXQuc2l6ZSgpKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5faW5wdXQpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yU2l6ZShfYWlkbF9pbi5nZXQoKSwgKm91dF9yZXBlYXRlZCk7CkBAIC0yMDMwLDEwICsyMzE5LDEwIEBACiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47Ci0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMkFycmF5KF9haWRsX291dC5nZXQoKSwgc3RhdGljX2Nhc3Q8dm9pZCo+KF9haWRsX3JldHVybiksIG5kazo6QVBhcmNlbF9zdGRWZWN0b3JBbGxvY2F0b3I8aW50MzJfdD4pOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyQXJyYXkoX2FpZGxfb3V0LmdldCgpLCBzdGF0aWNfY2FzdDx2b2lkKj4ob3V0X3JlcGVhdGVkKSwgbmRrOjpBUGFyY2VsX3N0ZFZlY3RvckFsbG9jYXRvcjxpbnQzMl90Pik7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIG91dF9yZXBlYXRlZCk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9lcnJvcjoKQEAgLTIwNTEsNyArMjM0MCw3IEBACiAgIEFQYXJjZWxfbWFya1NlbnNpdGl2ZShfYWlkbF9pbi5nZXQoKSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDY0QXJyYXkoX2FpZGxfaW4uZ2V0KCksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgaW50NjRfdCo+KGluX2lucHV0LmRhdGEoKSksIGluX2lucHV0LnNpemUoKSk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX2lucHV0KTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvclNpemUoX2FpZGxfaW4uZ2V0KCksICpvdXRfcmVwZWF0ZWQpOwpAQCAtMjA3NywxMCArMjM2NiwxMCBAQAogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOwotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50NjRBcnJheShfYWlkbF9vdXQuZ2V0KCksIHN0YXRpY19jYXN0PHZvaWQqPihfYWlkbF9yZXR1cm4pLCBuZGs6OkFQYXJjZWxfc3RkVmVjdG9yQWxsb2NhdG9yPGludDY0X3Q+KTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQ2NEFycmF5KF9haWRsX291dC5nZXQoKSwgc3RhdGljX2Nhc3Q8dm9pZCo+KG91dF9yZXBlYXRlZCksIG5kazo6QVBhcmNlbF9zdGRWZWN0b3JBbGxvY2F0b3I8aW50NjRfdD4pOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBvdXRfcmVwZWF0ZWQpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfZXJyb3I6CkBAIC0yMDk4LDcgKzIzODcsNyBAQAogICBBUGFyY2VsX21hcmtTZW5zaXRpdmUoX2FpZGxfaW4uZ2V0KCkpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlU3RyaW5nKF9haWRsX2luLmdldCgpLCBpbl9uYW1lKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5fbmFtZSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9yZXRfc3RhdHVzID0gQUlCaW5kZXJfdHJhbnNhY3QoCkBAIC0yMTIxLDcgKzI0MTAsNyBAQAogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOwotICBfYWlkbF9yZXRfc3RhdHVzID0gOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s6OnJlYWRGcm9tUGFyY2VsKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX2Vycm9yOgpAQCAtMjEzOSwxMCArMjQyOCwxMCBAQAogICBBUGFyY2VsX21hcmtTZW5zaXRpdmUoX2FpZGxfaW4uZ2V0KCkpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrOjp3cml0ZVRvUGFyY2VsKF9haWRsX2luLmdldCgpLCBpbl9zZXJ2aWNlKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5fc2VydmljZSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVTdHJpbmcoX2FpZGxfaW4uZ2V0KCksIGluX25hbWUpOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX2luLmdldCgpLCBpbl9uYW1lKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl90cmFuc2FjdCgKQEAgLTIxNjUsNyArMjQ1NCwyNjIgQEAKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEJvb2woX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfZXJyb3I6CisgIF9haWRsX3N0YXR1cy5zZXQoQVN0YXR1c19mcm9tU3RhdHVzKF9haWRsX3JldF9zdGF0dXMpKTsKKyAgX2FpZGxfc3RhdHVzX3JldHVybjoKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKzo6bmRrOjpTY29wZWRBU3RhdHVzIEJwVGVzdFNlcnZpY2U6OkdldEludGVyZmFjZUFycmF5KGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgaW5fbmFtZXMsIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4+KiBfYWlkbF9yZXR1cm4pIHsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBTVEFUVVNfT0s7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1czsKKyAgOjpuZGs6OlNjb3BlZEFQYXJjZWwgX2FpZGxfaW47CisgIDo6bmRrOjpTY29wZWRBUGFyY2VsIF9haWRsX291dDsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gQUlCaW5kZXJfcHJlcGFyZVRyYW5zYWN0aW9uKGFzQmluZGVyKCkuZ2V0KCksIF9haWRsX2luLmdldFIoKSk7CisgIEFQYXJjZWxfbWFya1NlbnNpdGl2ZShfYWlkbF9pbi5nZXQoKSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX2luLmdldCgpLCBpbl9uYW1lcyk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gQUlCaW5kZXJfdHJhbnNhY3QoCisgICAgYXNCaW5kZXIoKS5nZXQoKSwKKyAgICAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDI3IC8qR2V0SW50ZXJmYWNlQXJyYXkqLyksCisgICAgX2FpZGxfaW4uZ2V0UigpLAorICAgIF9haWRsX291dC5nZXRSKCksCisgICAgRkxBR19DTEVBUl9CVUYKKyAgICAjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgICAgfCBGTEFHX1BSSVZBVEVfTE9DQUwKKyAgICAjZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICAgICk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzID09IFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OICYmIElUZXN0U2VydmljZTo6Z2V0RGVmYXVsdEltcGwoKSkgeworICAgIF9haWRsX3N0YXR1cyA9IElUZXN0U2VydmljZTo6Z2V0RGVmYXVsdEltcGwoKS0+R2V0SW50ZXJmYWNlQXJyYXkoaW5fbmFtZXMsIF9haWRsX3JldHVybik7CisgICAgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOworICB9CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkU3RhdHVzSGVhZGVyKF9haWRsX291dC5nZXQoKSwgX2FpZGxfc3RhdHVzLmdldFIoKSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9lcnJvcjoKKyAgX2FpZGxfc3RhdHVzLnNldChBU3RhdHVzX2Zyb21TdGF0dXMoX2FpZGxfcmV0X3N0YXR1cykpOworICBfYWlkbF9zdGF0dXNfcmV0dXJuOgorICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorOjpuZGs6OlNjb3BlZEFTdGF0dXMgQnBUZXN0U2VydmljZTo6VmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlQXJyYXkoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPj4mIGluX3NlcnZpY2VzLCBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGluX25hbWVzLCBib29sKiBfYWlkbF9yZXR1cm4pIHsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBTVEFUVVNfT0s7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1czsKKyAgOjpuZGs6OlNjb3BlZEFQYXJjZWwgX2FpZGxfaW47CisgIDo6bmRrOjpTY29wZWRBUGFyY2VsIF9haWRsX291dDsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gQUlCaW5kZXJfcHJlcGFyZVRyYW5zYWN0aW9uKGFzQmluZGVyKCkuZ2V0KCksIF9haWRsX2luLmdldFIoKSk7CisgIEFQYXJjZWxfbWFya1NlbnNpdGl2ZShfYWlkbF9pbi5nZXQoKSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX2luLmdldCgpLCBpbl9zZXJ2aWNlcyk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX2luLmdldCgpLCBpbl9uYW1lcyk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gQUlCaW5kZXJfdHJhbnNhY3QoCisgICAgYXNCaW5kZXIoKS5nZXQoKSwKKyAgICAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDI4IC8qVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlQXJyYXkqLyksCisgICAgX2FpZGxfaW4uZ2V0UigpLAorICAgIF9haWRsX291dC5nZXRSKCksCisgICAgRkxBR19DTEVBUl9CVUYKKyAgICAjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgICAgfCBGTEFHX1BSSVZBVEVfTE9DQUwKKyAgICAjZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICAgICk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzID09IFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OICYmIElUZXN0U2VydmljZTo6Z2V0RGVmYXVsdEltcGwoKSkgeworICAgIF9haWRsX3N0YXR1cyA9IElUZXN0U2VydmljZTo6Z2V0RGVmYXVsdEltcGwoKS0+VmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlQXJyYXkoaW5fc2VydmljZXMsIGluX25hbWVzLCBfYWlkbF9yZXR1cm4pOworICAgIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKKyAgfQorICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZFN0YXR1c0hlYWRlcihfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3N0YXR1cy5nZXRSKCkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfZXJyb3I6CisgIF9haWRsX3N0YXR1cy5zZXQoQVN0YXR1c19mcm9tU3RhdHVzKF9haWRsX3JldF9zdGF0dXMpKTsKKyAgX2FpZGxfc3RhdHVzX3JldHVybjoKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKzo6bmRrOjpTY29wZWRBU3RhdHVzIEJwVGVzdFNlcnZpY2U6OkdldE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPj4+JiBpbl9uYW1lcywgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+Pj4qIF9haWRsX3JldHVybikgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19PSzsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOworICA6Om5kazo6U2NvcGVkQVBhcmNlbCBfYWlkbF9pbjsKKyAgOjpuZGs6OlNjb3BlZEFQYXJjZWwgX2FpZGxfb3V0OworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl9wcmVwYXJlVHJhbnNhY3Rpb24oYXNCaW5kZXIoKS5nZXQoKSwgX2FpZGxfaW4uZ2V0UigpKTsKKyAgQVBhcmNlbF9tYXJrU2Vuc2l0aXZlKF9haWRsX2luLmdldCgpKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5fbmFtZXMpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KAorICAgIGFzQmluZGVyKCkuZ2V0KCksCisgICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyOSAvKkdldE51bGxhYmxlSW50ZXJmYWNlQXJyYXkqLyksCisgICAgX2FpZGxfaW4uZ2V0UigpLAorICAgIF9haWRsX291dC5nZXRSKCksCisgICAgRkxBR19DTEVBUl9CVUYKKyAgICAjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgICAgfCBGTEFHX1BSSVZBVEVfTE9DQUwKKyAgICAjZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICAgICk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzID09IFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OICYmIElUZXN0U2VydmljZTo6Z2V0RGVmYXVsdEltcGwoKSkgeworICAgIF9haWRsX3N0YXR1cyA9IElUZXN0U2VydmljZTo6Z2V0RGVmYXVsdEltcGwoKS0+R2V0TnVsbGFibGVJbnRlcmZhY2VBcnJheShpbl9uYW1lcywgX2FpZGxfcmV0dXJuKTsKKyAgICBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47CisgIH0KKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRTdGF0dXNIZWFkZXIoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9zdGF0dXMuZ2V0UigpKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfZXJyb3I6CisgIF9haWRsX3N0YXR1cy5zZXQoQVN0YXR1c19mcm9tU3RhdHVzKF9haWRsX3JldF9zdGF0dXMpKTsKKyAgX2FpZGxfc3RhdHVzX3JldHVybjoKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKzo6bmRrOjpTY29wZWRBU3RhdHVzIEJwVGVzdFNlcnZpY2U6OlZlcmlmeU5hbWVzV2l0aE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+Pj4mIGluX3NlcnZpY2VzLCBjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+Pj4mIGluX25hbWVzLCBib29sKiBfYWlkbF9yZXR1cm4pIHsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBTVEFUVVNfT0s7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1czsKKyAgOjpuZGs6OlNjb3BlZEFQYXJjZWwgX2FpZGxfaW47CisgIDo6bmRrOjpTY29wZWRBUGFyY2VsIF9haWRsX291dDsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gQUlCaW5kZXJfcHJlcGFyZVRyYW5zYWN0aW9uKGFzQmluZGVyKCkuZ2V0KCksIF9haWRsX2luLmdldFIoKSk7CisgIEFQYXJjZWxfbWFya1NlbnNpdGl2ZShfYWlkbF9pbi5nZXQoKSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX3NlcnZpY2VzKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5fbmFtZXMpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KAorICAgIGFzQmluZGVyKCkuZ2V0KCksCisgICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzMCAvKlZlcmlmeU5hbWVzV2l0aE51bGxhYmxlSW50ZXJmYWNlQXJyYXkqLyksCisgICAgX2FpZGxfaW4uZ2V0UigpLAorICAgIF9haWRsX291dC5nZXRSKCksCisgICAgRkxBR19DTEVBUl9CVUYKKyAgICAjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgICAgfCBGTEFHX1BSSVZBVEVfTE9DQUwKKyAgICAjZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICAgICk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzID09IFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OICYmIElUZXN0U2VydmljZTo6Z2V0RGVmYXVsdEltcGwoKSkgeworICAgIF9haWRsX3N0YXR1cyA9IElUZXN0U2VydmljZTo6Z2V0RGVmYXVsdEltcGwoKS0+VmVyaWZ5TmFtZXNXaXRoTnVsbGFibGVJbnRlcmZhY2VBcnJheShpbl9zZXJ2aWNlcywgaW5fbmFtZXMsIF9haWRsX3JldHVybik7CisgICAgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOworICB9CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkU3RhdHVzSGVhZGVyKF9haWRsX291dC5nZXQoKSwgX2FpZGxfc3RhdHVzLmdldFIoKSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9lcnJvcjoKKyAgX2FpZGxfc3RhdHVzLnNldChBU3RhdHVzX2Zyb21TdGF0dXMoX2FpZGxfcmV0X3N0YXR1cykpOworICBfYWlkbF9zdGF0dXNfcmV0dXJuOgorICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorOjpuZGs6OlNjb3BlZEFTdGF0dXMgQnBUZXN0U2VydmljZTo6R2V0SW50ZXJmYWNlTGlzdChjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+Pj4mIGluX25hbWVzLCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4+PiogX2FpZGxfcmV0dXJuKSB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX09LOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIDo6bmRrOjpTY29wZWRBUGFyY2VsIF9haWRsX2luOworICA6Om5kazo6U2NvcGVkQVBhcmNlbCBfYWlkbF9vdXQ7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3ByZXBhcmVUcmFuc2FjdGlvbihhc0JpbmRlcigpLmdldCgpLCBfYWlkbF9pbi5nZXRSKCkpOworICBBUGFyY2VsX21hcmtTZW5zaXRpdmUoX2FpZGxfaW4uZ2V0KCkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX2luLmdldCgpLCBpbl9uYW1lcyk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gQUlCaW5kZXJfdHJhbnNhY3QoCisgICAgYXNCaW5kZXIoKS5nZXQoKSwKKyAgICAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDMxIC8qR2V0SW50ZXJmYWNlTGlzdCovKSwKKyAgICBfYWlkbF9pbi5nZXRSKCksCisgICAgX2FpZGxfb3V0LmdldFIoKSwKKyAgICBGTEFHX0NMRUFSX0JVRgorICAgICNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgICB8IEZMQUdfUFJJVkFURV9MT0NBTAorICAgICNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgICAgKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgPT0gU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT04gJiYgSVRlc3RTZXJ2aWNlOjpnZXREZWZhdWx0SW1wbCgpKSB7CisgICAgX2FpZGxfc3RhdHVzID0gSVRlc3RTZXJ2aWNlOjpnZXREZWZhdWx0SW1wbCgpLT5HZXRJbnRlcmZhY2VMaXN0KGluX25hbWVzLCBfYWlkbF9yZXR1cm4pOworICAgIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKKyAgfQorICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZFN0YXR1c0hlYWRlcihfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3N0YXR1cy5nZXRSKCkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9lcnJvcjoKKyAgX2FpZGxfc3RhdHVzLnNldChBU3RhdHVzX2Zyb21TdGF0dXMoX2FpZGxfcmV0X3N0YXR1cykpOworICBfYWlkbF9zdGF0dXNfcmV0dXJuOgorICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorOjpuZGs6OlNjb3BlZEFTdGF0dXMgQnBUZXN0U2VydmljZTo6VmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlTGlzdChjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4+PiYgaW5fc2VydmljZXMsIGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4+PiYgaW5fbmFtZXMsIGJvb2wqIF9haWRsX3JldHVybikgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19PSzsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOworICA6Om5kazo6U2NvcGVkQVBhcmNlbCBfYWlkbF9pbjsKKyAgOjpuZGs6OlNjb3BlZEFQYXJjZWwgX2FpZGxfb3V0OworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl9wcmVwYXJlVHJhbnNhY3Rpb24oYXNCaW5kZXIoKS5nZXQoKSwgX2FpZGxfaW4uZ2V0UigpKTsKKyAgQVBhcmNlbF9tYXJrU2Vuc2l0aXZlKF9haWRsX2luLmdldCgpKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5fc2VydmljZXMpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX2luLmdldCgpLCBpbl9uYW1lcyk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gQUlCaW5kZXJfdHJhbnNhY3QoCisgICAgYXNCaW5kZXIoKS5nZXQoKSwKKyAgICAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDMyIC8qVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlTGlzdCovKSwKKyAgICBfYWlkbF9pbi5nZXRSKCksCisgICAgX2FpZGxfb3V0LmdldFIoKSwKKyAgICBGTEFHX0NMRUFSX0JVRgorICAgICNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgICB8IEZMQUdfUFJJVkFURV9MT0NBTAorICAgICNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgICAgKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgPT0gU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT04gJiYgSVRlc3RTZXJ2aWNlOjpnZXREZWZhdWx0SW1wbCgpKSB7CisgICAgX2FpZGxfc3RhdHVzID0gSVRlc3RTZXJ2aWNlOjpnZXREZWZhdWx0SW1wbCgpLT5WZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VMaXN0KGluX3NlcnZpY2VzLCBpbl9uYW1lcywgX2FpZGxfcmV0dXJuKTsKKyAgICBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47CisgIH0KKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRTdGF0dXNIZWFkZXIoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9zdGF0dXMuZ2V0UigpKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX2Vycm9yOgpAQCAtMjE4MywxMiArMjcyNywxMiBAQAogICBBUGFyY2VsX21hcmtTZW5zaXRpdmUoX2FpZGxfaW4uZ2V0KCkpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKF9haWRsX2luLmdldCgpLCBpbl9pbnB1dCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX2lucHV0KTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl90cmFuc2FjdCgKICAgICBhc0JpbmRlcigpLmdldCgpLAotICAgIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMjcgLypSZXZlcnNlU3RyaW5nTGlzdCovKSwKKyAgICAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDMzIC8qUmV2ZXJzZVN0cmluZ0xpc3QqLyksCiAgICAgX2FpZGxfaW4uZ2V0UigpLAogICAgIF9haWRsX291dC5nZXRSKCksCiAgICAgRkxBR19DTEVBUl9CVUYKQEAgLTIyMDYsMTAgKzI3NTAsMTAgQEAKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX2FpZGxfb3V0LmdldCgpLCBvdXRfcmVwZWF0ZWQpOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBvdXRfcmVwZWF0ZWQpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfZXJyb3I6CkBAIC0yMjI3LDEyICsyNzcxLDEyIEBACiAgIEFQYXJjZWxfbWFya1NlbnNpdGl2ZShfYWlkbF9pbi5nZXQoKSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVSZXF1aXJlZFBhcmNlbEZpbGVEZXNjcmlwdG9yKF9haWRsX2luLmdldCgpLCBpbl9yZWFkKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5fcmVhZCk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9yZXRfc3RhdHVzID0gQUlCaW5kZXJfdHJhbnNhY3QoCiAgICAgYXNCaW5kZXIoKS5nZXQoKSwKLSAgICAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDI4IC8qUmVwZWF0UGFyY2VsRmlsZURlc2NyaXB0b3IqLyksCisgICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzNCAvKlJlcGVhdFBhcmNlbEZpbGVEZXNjcmlwdG9yKi8pLAogICAgIF9haWRsX2luLmdldFIoKSwKICAgICBfYWlkbF9vdXQuZ2V0UigpLAogICAgIEZMQUdfQ0xFQVJfQlVGCkBAIC0yMjUwLDcgKzI3OTQsNyBAQAogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOwotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFJlcXVpcmVkUGFyY2VsRmlsZURlc2NyaXB0b3IoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfZXJyb3I6CkBAIC0yMjY4LDcgKzI4MTIsNyBAQAogICBBUGFyY2VsX21hcmtTZW5zaXRpdmUoX2FpZGxfaW4uZ2V0KCkpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKF9haWRsX2luLmdldCgpLCBpbl9pbnB1dCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX2lucHV0KTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvclNpemUoX2FpZGxfaW4uZ2V0KCksICpvdXRfcmVwZWF0ZWQpOwpAQCAtMjI3Niw3ICsyODIwLDcgQEAKIAogICBfYWlkbF9yZXRfc3RhdHVzID0gQUlCaW5kZXJfdHJhbnNhY3QoCiAgICAgYXNCaW5kZXIoKS5nZXQoKSwKLSAgICAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDI5IC8qUmV2ZXJzZVBhcmNlbEZpbGVEZXNjcmlwdG9yQXJyYXkqLyksCisgICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzNSAvKlJldmVyc2VQYXJjZWxGaWxlRGVzY3JpcHRvckFycmF5Ki8pLAogICAgIF9haWRsX2luLmdldFIoKSwKICAgICBfYWlkbF9vdXQuZ2V0UigpLAogICAgIEZMQUdfQ0xFQVJfQlVGCkBAIC0yMjk0LDEwICsyODM4LDEwIEBACiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47Ci0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX291dC5nZXQoKSwgb3V0X3JlcGVhdGVkKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgb3V0X3JlcGVhdGVkKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX2Vycm9yOgpAQCAtMjMxNSwxMiArMjg1OSwxMiBAQAogICBBUGFyY2VsX21hcmtTZW5zaXRpdmUoX2FpZGxfaW4uZ2V0KCkpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQzMihfYWlkbF9pbi5nZXQoKSwgaW5fY29kZSk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX2NvZGUpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KAogICAgIGFzQmluZGVyKCkuZ2V0KCksCi0gICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzMCAvKlRocm93U2VydmljZUV4Y2VwdGlvbiovKSwKKyAgICAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDM2IC8qVGhyb3dTZXJ2aWNlRXhjZXB0aW9uKi8pLAogICAgIF9haWRsX2luLmdldFIoKSwKICAgICBfYWlkbF9vdXQuZ2V0UigpLAogICAgIEZMQUdfQ0xFQVJfQlVGCkBAIC0yMzUzLDEyICsyODk3LDEyIEBACiAgIEFQYXJjZWxfbWFya1NlbnNpdGl2ZShfYWlkbF9pbi5nZXQoKSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX2FpZGxfaW4uZ2V0KCksIGluX2lucHV0KTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX2luLmdldCgpLCBpbl9pbnB1dCk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9yZXRfc3RhdHVzID0gQUlCaW5kZXJfdHJhbnNhY3QoCiAgICAgYXNCaW5kZXIoKS5nZXQoKSwKLSAgICAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDMxIC8qUmVwZWF0TnVsbGFibGVJbnRBcnJheSovKSwKKyAgICAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDM3IC8qUmVwZWF0TnVsbGFibGVJbnRBcnJheSovKSwKICAgICBfYWlkbF9pbi5nZXRSKCksCiAgICAgX2FpZGxfb3V0LmdldFIoKSwKICAgICBGTEFHX0NMRUFSX0JVRgpAQCAtMjM3Niw3ICsyOTIwLDcgQEAKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9lcnJvcjoKQEAgLTIzOTQsMTIgKzI5MzgsMTIgQEAKICAgQVBhcmNlbF9tYXJrU2Vuc2l0aXZlKF9haWRsX2luLmdldCgpKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlQnl0ZUFycmF5KF9haWRsX2luLmdldCgpLCAoaW5faW5wdXQgPyByZWludGVycHJldF9jYXN0PGNvbnN0IGludDhfdCo+KGluX2lucHV0LT5kYXRhKCkpIDogbnVsbHB0ciksIChpbl9pbnB1dCA/IGluX2lucHV0LT5zaXplKCkgOiAtMSkpOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX2lucHV0KTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl90cmFuc2FjdCgKICAgICBhc0JpbmRlcigpLmdldCgpLAotICAgIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzIgLypSZXBlYXROdWxsYWJsZUJ5dGVFbnVtQXJyYXkqLyksCisgICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzOCAvKlJlcGVhdE51bGxhYmxlQnl0ZUVudW1BcnJheSovKSwKICAgICBfYWlkbF9pbi5nZXRSKCksCiAgICAgX2FpZGxfb3V0LmdldFIoKSwKICAgICBGTEFHX0NMRUFSX0JVRgpAQCAtMjQxNyw3ICsyOTYxLDcgQEAKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEJ5dGVBcnJheShfYWlkbF9vdXQuZ2V0KCksIHN0YXRpY19jYXN0PHZvaWQqPihfYWlkbF9yZXR1cm4pLCBuZGs6OkFQYXJjZWxfbnVsbGFibGVTdGRWZWN0b3JBbGxvY2F0b3I8aW50OF90Pik7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX2Vycm9yOgpAQCAtMjQzNSwxMiArMjk3OSwxMiBAQAogICBBUGFyY2VsX21hcmtTZW5zaXRpdmUoX2FpZGxfaW4uZ2V0KCkpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQzMkFycmF5KF9haWRsX2luLmdldCgpLCAoaW5faW5wdXQgPyByZWludGVycHJldF9jYXN0PGNvbnN0IGludDMyX3QqPihpbl9pbnB1dC0+ZGF0YSgpKSA6IG51bGxwdHIpLCAoaW5faW5wdXQgPyBpbl9pbnB1dC0+c2l6ZSgpIDogLTEpKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX2luLmdldCgpLCBpbl9pbnB1dCk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9yZXRfc3RhdHVzID0gQUlCaW5kZXJfdHJhbnNhY3QoCiAgICAgYXNCaW5kZXIoKS5nZXQoKSwKLSAgICAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDMzIC8qUmVwZWF0TnVsbGFibGVJbnRFbnVtQXJyYXkqLyksCisgICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzOSAvKlJlcGVhdE51bGxhYmxlSW50RW51bUFycmF5Ki8pLAogICAgIF9haWRsX2luLmdldFIoKSwKICAgICBfYWlkbF9vdXQuZ2V0UigpLAogICAgIEZMQUdfQ0xFQVJfQlVGCkBAIC0yNDU4LDcgKzMwMDIsNyBAQAogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOwotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzJBcnJheShfYWlkbF9vdXQuZ2V0KCksIHN0YXRpY19jYXN0PHZvaWQqPihfYWlkbF9yZXR1cm4pLCBuZGs6OkFQYXJjZWxfbnVsbGFibGVTdGRWZWN0b3JBbGxvY2F0b3I8aW50MzJfdD4pOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9lcnJvcjoKQEAgLTI0NzYsMTIgKzMwMjAsMTIgQEAKICAgQVBhcmNlbF9tYXJrU2Vuc2l0aXZlKF9haWRsX2luLmdldCgpKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50NjRBcnJheShfYWlkbF9pbi5nZXQoKSwgKGluX2lucHV0ID8gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBpbnQ2NF90Kj4oaW5faW5wdXQtPmRhdGEoKSkgOiBudWxscHRyKSwgKGluX2lucHV0ID8gaW5faW5wdXQtPnNpemUoKSA6IC0xKSk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5faW5wdXQpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KAogICAgIGFzQmluZGVyKCkuZ2V0KCksCi0gICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzNCAvKlJlcGVhdE51bGxhYmxlTG9uZ0VudW1BcnJheSovKSwKKyAgICAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQwIC8qUmVwZWF0TnVsbGFibGVMb25nRW51bUFycmF5Ki8pLAogICAgIF9haWRsX2luLmdldFIoKSwKICAgICBfYWlkbF9vdXQuZ2V0UigpLAogICAgIEZMQUdfQ0xFQVJfQlVGCkBAIC0yNDk5LDcgKzMwNDMsNyBAQAogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOwotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50NjRBcnJheShfYWlkbF9vdXQuZ2V0KCksIHN0YXRpY19jYXN0PHZvaWQqPihfYWlkbF9yZXR1cm4pLCBuZGs6OkFQYXJjZWxfbnVsbGFibGVTdGRWZWN0b3JBbGxvY2F0b3I8aW50NjRfdD4pOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9lcnJvcjoKQEAgLTI1MTcsMTIgKzMwNjEsMTIgQEAKICAgQVBhcmNlbF9tYXJrU2Vuc2l0aXZlKF9haWRsX2luLmdldCgpKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVN0cmluZyhfYWlkbF9pbi5nZXQoKSwgaW5faW5wdXQpOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX2lucHV0KTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl90cmFuc2FjdCgKICAgICBhc0JpbmRlcigpLmdldCgpLAotICAgIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzUgLypSZXBlYXROdWxsYWJsZVN0cmluZyovKSwKKyAgICAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQxIC8qUmVwZWF0TnVsbGFibGVTdHJpbmcqLyksCiAgICAgX2FpZGxfaW4uZ2V0UigpLAogICAgIF9haWRsX291dC5nZXRSKCksCiAgICAgRkxBR19DTEVBUl9CVUYKQEAgLTI1NDAsNyArMzA4NCw3IEBACiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47Ci0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkU3RyaW5nKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfZXJyb3I6CkBAIC0yNTQ4LDcgKzMwOTIsNyBAQAogICBfYWlkbF9zdGF0dXNfcmV0dXJuOgogICByZXR1cm4gX2FpZGxfc3RhdHVzOwogfQotOjpuZGs6OlNjb3BlZEFTdGF0dXMgQnBUZXN0U2VydmljZTo6UmVwZWF0TnVsbGFibGVTdHJpbmdMaXN0KGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgaW5faW5wdXQsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogX2FpZGxfcmV0dXJuKSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBCcFRlc3RTZXJ2aWNlOjpSZXBlYXROdWxsYWJsZVN0cmluZ0xpc3QoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPj4+JiBpbl9pbnB1dCwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPj4+KiBfYWlkbF9yZXR1cm4pIHsKICAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBTVEFUVVNfT0s7CiAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1czsKICAgOjpuZGs6OlNjb3BlZEFQYXJjZWwgX2FpZGxfaW47CkBAIC0yNTU4LDEyICszMTAyLDEyIEBACiAgIEFQYXJjZWxfbWFya1NlbnNpdGl2ZShfYWlkbF9pbi5nZXQoKSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX2FpZGxfaW4uZ2V0KCksIGluX2lucHV0KTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX2luLmdldCgpLCBpbl9pbnB1dCk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9yZXRfc3RhdHVzID0gQUlCaW5kZXJfdHJhbnNhY3QoCiAgICAgYXNCaW5kZXIoKS5nZXQoKSwKLSAgICAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDM2IC8qUmVwZWF0TnVsbGFibGVTdHJpbmdMaXN0Ki8pLAorICAgIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDIgLypSZXBlYXROdWxsYWJsZVN0cmluZ0xpc3QqLyksCiAgICAgX2FpZGxfaW4uZ2V0UigpLAogICAgIF9haWRsX291dC5nZXRSKCksCiAgICAgRkxBR19DTEVBUl9CVUYKQEAgLTI1ODEsNyArMzEyNSw3IEBACiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47Ci0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfZXJyb3I6CkBAIC0yNTg5LDcgKzMxMzMsNyBAQAogICBfYWlkbF9zdGF0dXNfcmV0dXJuOgogICByZXR1cm4gX2FpZGxfc3RhdHVzOwogfQotOjpuZGs6OlNjb3BlZEFTdGF0dXMgQnBUZXN0U2VydmljZTo6UmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlKGNvbnN0IHN0ZDo6b3B0aW9uYWw8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6U3RydWN0dXJlZFBhcmNlbGFibGU+JiBpbl9pbnB1dCwgc3RkOjpvcHRpb25hbDw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpTdHJ1Y3R1cmVkUGFyY2VsYWJsZT4qIF9haWRsX3JldHVybikgeworOjpuZGs6OlNjb3BlZEFTdGF0dXMgQnBUZXN0U2VydmljZTo6UmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlKGNvbnN0IHN0ZDo6b3B0aW9uYWw8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eT4mIGluX2lucHV0LCBzdGQ6Om9wdGlvbmFsPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6RW1wdHk+KiBfYWlkbF9yZXR1cm4pIHsKICAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBTVEFUVVNfT0s7CiAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1czsKICAgOjpuZGs6OlNjb3BlZEFQYXJjZWwgX2FpZGxfaW47CkBAIC0yNTk5LDEyICszMTQzLDEyIEBACiAgIEFQYXJjZWxfbWFya1NlbnNpdGl2ZShfYWlkbF9pbi5nZXQoKSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZVBhcmNlbGFibGUoX2FpZGxfaW4uZ2V0KCksIGluX2lucHV0KTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX2luLmdldCgpLCBpbl9pbnB1dCk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9yZXRfc3RhdHVzID0gQUlCaW5kZXJfdHJhbnNhY3QoCiAgICAgYXNCaW5kZXIoKS5nZXQoKSwKLSAgICAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDM3IC8qUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlKi8pLAorICAgIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDMgLypSZXBlYXROdWxsYWJsZVBhcmNlbGFibGUqLyksCiAgICAgX2FpZGxfaW4uZ2V0UigpLAogICAgIF9haWRsX291dC5nZXRSKCksCiAgICAgRkxBR19DTEVBUl9CVUYKQEAgLTI2MjIsNyArMzE2Niw4OSBAQAogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOwotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlUGFyY2VsYWJsZShfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX2Vycm9yOgorICBfYWlkbF9zdGF0dXMuc2V0KEFTdGF0dXNfZnJvbVN0YXR1cyhfYWlkbF9yZXRfc3RhdHVzKSk7CisgIF9haWRsX3N0YXR1c19yZXR1cm46CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBCcFRlc3RTZXJ2aWNlOjpSZXBlYXROdWxsYWJsZVBhcmNlbGFibGVBcnJheShjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eT4+PiYgaW5faW5wdXQsIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5Pj4+KiBfYWlkbF9yZXR1cm4pIHsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBTVEFUVVNfT0s7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1czsKKyAgOjpuZGs6OlNjb3BlZEFQYXJjZWwgX2FpZGxfaW47CisgIDo6bmRrOjpTY29wZWRBUGFyY2VsIF9haWRsX291dDsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gQUlCaW5kZXJfcHJlcGFyZVRyYW5zYWN0aW9uKGFzQmluZGVyKCkuZ2V0KCksIF9haWRsX2luLmdldFIoKSk7CisgIEFQYXJjZWxfbWFya1NlbnNpdGl2ZShfYWlkbF9pbi5nZXQoKSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX2lucHV0KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl90cmFuc2FjdCgKKyAgICBhc0JpbmRlcigpLmdldCgpLAorICAgIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDQgLypSZXBlYXROdWxsYWJsZVBhcmNlbGFibGVBcnJheSovKSwKKyAgICBfYWlkbF9pbi5nZXRSKCksCisgICAgX2FpZGxfb3V0LmdldFIoKSwKKyAgICBGTEFHX0NMRUFSX0JVRgorICAgICNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgICB8IEZMQUdfUFJJVkFURV9MT0NBTAorICAgICNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgICAgKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgPT0gU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT04gJiYgSVRlc3RTZXJ2aWNlOjpnZXREZWZhdWx0SW1wbCgpKSB7CisgICAgX2FpZGxfc3RhdHVzID0gSVRlc3RTZXJ2aWNlOjpnZXREZWZhdWx0SW1wbCgpLT5SZXBlYXROdWxsYWJsZVBhcmNlbGFibGVBcnJheShpbl9pbnB1dCwgX2FpZGxfcmV0dXJuKTsKKyAgICBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47CisgIH0KKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRTdGF0dXNIZWFkZXIoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9zdGF0dXMuZ2V0UigpKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfZXJyb3I6CisgIF9haWRsX3N0YXR1cy5zZXQoQVN0YXR1c19mcm9tU3RhdHVzKF9haWRsX3JldF9zdGF0dXMpKTsKKyAgX2FpZGxfc3RhdHVzX3JldHVybjoKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKzo6bmRrOjpTY29wZWRBU3RhdHVzIEJwVGVzdFNlcnZpY2U6OlJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUxpc3QoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6RW1wdHk+Pj4mIGluX2lucHV0LCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eT4+PiogX2FpZGxfcmV0dXJuKSB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX09LOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIDo6bmRrOjpTY29wZWRBUGFyY2VsIF9haWRsX2luOworICA6Om5kazo6U2NvcGVkQVBhcmNlbCBfYWlkbF9vdXQ7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3ByZXBhcmVUcmFuc2FjdGlvbihhc0JpbmRlcigpLmdldCgpLCBfYWlkbF9pbi5nZXRSKCkpOworICBBUGFyY2VsX21hcmtTZW5zaXRpdmUoX2FpZGxfaW4uZ2V0KCkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX2luLmdldCgpLCBpbl9pbnB1dCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gQUlCaW5kZXJfdHJhbnNhY3QoCisgICAgYXNCaW5kZXIoKS5nZXQoKSwKKyAgICAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQ1IC8qUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlTGlzdCovKSwKKyAgICBfYWlkbF9pbi5nZXRSKCksCisgICAgX2FpZGxfb3V0LmdldFIoKSwKKyAgICBGTEFHX0NMRUFSX0JVRgorICAgICNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgICB8IEZMQUdfUFJJVkFURV9MT0NBTAorICAgICNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgICAgKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgPT0gU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT04gJiYgSVRlc3RTZXJ2aWNlOjpnZXREZWZhdWx0SW1wbCgpKSB7CisgICAgX2FpZGxfc3RhdHVzID0gSVRlc3RTZXJ2aWNlOjpnZXREZWZhdWx0SW1wbCgpLT5SZXBlYXROdWxsYWJsZVBhcmNlbGFibGVMaXN0KGluX2lucHV0LCBfYWlkbF9yZXR1cm4pOworICAgIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKKyAgfQorICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZFN0YXR1c0hlYWRlcihfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3N0YXR1cy5nZXRSKCkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9lcnJvcjoKQEAgLTI2NDAsMTIgKzMyNjYsMTIgQEAKICAgQVBhcmNlbF9tYXJrU2Vuc2l0aXZlKF9haWRsX2luLmdldCgpKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVJlcXVpcmVkU3Ryb25nQmluZGVyKF9haWRsX2luLmdldCgpLCBpbl9pbnB1dCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX2lucHV0KTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl90cmFuc2FjdCgKICAgICBhc0JpbmRlcigpLmdldCgpLAotICAgIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzggLypUYWtlc0FuSUJpbmRlciovKSwKKyAgICAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQ2IC8qVGFrZXNBbklCaW5kZXIqLyksCiAgICAgX2FpZGxfaW4uZ2V0UigpLAogICAgIF9haWRsX291dC5nZXRSKCksCiAgICAgRkxBR19DTEVBUl9CVUYKQEAgLTI2NzgsMTIgKzMzMDQsMTIgQEAKICAgQVBhcmNlbF9tYXJrU2Vuc2l0aXZlKF9haWRsX2luLmdldCgpKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlU3Ryb25nQmluZGVyKF9haWRsX2luLmdldCgpLCBpbl9pbnB1dCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5faW5wdXQpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KAogICAgIGFzQmluZGVyKCkuZ2V0KCksCi0gICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzOSAvKlRha2VzQU51bGxhYmxlSUJpbmRlciovKSwKKyAgICAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQ3IC8qVGFrZXNBTnVsbGFibGVJQmluZGVyKi8pLAogICAgIF9haWRsX2luLmdldFIoKSwKICAgICBfYWlkbF9vdXQuZ2V0UigpLAogICAgIEZMQUdfQ0xFQVJfQlVGCkBAIC0yNzA2LDYgKzMzMzIsODIgQEAKICAgX2FpZGxfc3RhdHVzX3JldHVybjoKICAgcmV0dXJuIF9haWRsX3N0YXR1czsKIH0KKzo6bmRrOjpTY29wZWRBU3RhdHVzIEJwVGVzdFNlcnZpY2U6OlRha2VzQW5JQmluZGVyTGlzdChjb25zdCBzdGQ6OnZlY3Rvcjw6Om5kazo6U3BBSUJpbmRlcj4mIGluX2lucHV0KSB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX09LOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIDo6bmRrOjpTY29wZWRBUGFyY2VsIF9haWRsX2luOworICA6Om5kazo6U2NvcGVkQVBhcmNlbCBfYWlkbF9vdXQ7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3ByZXBhcmVUcmFuc2FjdGlvbihhc0JpbmRlcigpLmdldCgpLCBfYWlkbF9pbi5nZXRSKCkpOworICBBUGFyY2VsX21hcmtTZW5zaXRpdmUoX2FpZGxfaW4uZ2V0KCkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5faW5wdXQpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KAorICAgIGFzQmluZGVyKCkuZ2V0KCksCisgICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0OCAvKlRha2VzQW5JQmluZGVyTGlzdCovKSwKKyAgICBfYWlkbF9pbi5nZXRSKCksCisgICAgX2FpZGxfb3V0LmdldFIoKSwKKyAgICBGTEFHX0NMRUFSX0JVRgorICAgICNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgICB8IEZMQUdfUFJJVkFURV9MT0NBTAorICAgICNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgICAgKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgPT0gU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT04gJiYgSVRlc3RTZXJ2aWNlOjpnZXREZWZhdWx0SW1wbCgpKSB7CisgICAgX2FpZGxfc3RhdHVzID0gSVRlc3RTZXJ2aWNlOjpnZXREZWZhdWx0SW1wbCgpLT5UYWtlc0FuSUJpbmRlckxpc3QoaW5faW5wdXQpOworICAgIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKKyAgfQorICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZFN0YXR1c0hlYWRlcihfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3N0YXR1cy5nZXRSKCkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOworICBfYWlkbF9lcnJvcjoKKyAgX2FpZGxfc3RhdHVzLnNldChBU3RhdHVzX2Zyb21TdGF0dXMoX2FpZGxfcmV0X3N0YXR1cykpOworICBfYWlkbF9zdGF0dXNfcmV0dXJuOgorICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorOjpuZGs6OlNjb3BlZEFTdGF0dXMgQnBUZXN0U2VydmljZTo6VGFrZXNBTnVsbGFibGVJQmluZGVyTGlzdChjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPDo6bmRrOjpTcEFJQmluZGVyPj4mIGluX2lucHV0KSB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX09LOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIDo6bmRrOjpTY29wZWRBUGFyY2VsIF9haWRsX2luOworICA6Om5kazo6U2NvcGVkQVBhcmNlbCBfYWlkbF9vdXQ7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3ByZXBhcmVUcmFuc2FjdGlvbihhc0JpbmRlcigpLmdldCgpLCBfYWlkbF9pbi5nZXRSKCkpOworICBBUGFyY2VsX21hcmtTZW5zaXRpdmUoX2FpZGxfaW4uZ2V0KCkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX2luLmdldCgpLCBpbl9pbnB1dCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gQUlCaW5kZXJfdHJhbnNhY3QoCisgICAgYXNCaW5kZXIoKS5nZXQoKSwKKyAgICAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQ5IC8qVGFrZXNBTnVsbGFibGVJQmluZGVyTGlzdCovKSwKKyAgICBfYWlkbF9pbi5nZXRSKCksCisgICAgX2FpZGxfb3V0LmdldFIoKSwKKyAgICBGTEFHX0NMRUFSX0JVRgorICAgICNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgICB8IEZMQUdfUFJJVkFURV9MT0NBTAorICAgICNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgICAgKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgPT0gU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT04gJiYgSVRlc3RTZXJ2aWNlOjpnZXREZWZhdWx0SW1wbCgpKSB7CisgICAgX2FpZGxfc3RhdHVzID0gSVRlc3RTZXJ2aWNlOjpnZXREZWZhdWx0SW1wbCgpLT5UYWtlc0FOdWxsYWJsZUlCaW5kZXJMaXN0KGluX2lucHV0KTsKKyAgICBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47CisgIH0KKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRTdGF0dXNIZWFkZXIoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9zdGF0dXMuZ2V0UigpKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKKyAgX2FpZGxfZXJyb3I6CisgIF9haWRsX3N0YXR1cy5zZXQoQVN0YXR1c19mcm9tU3RhdHVzKF9haWRsX3JldF9zdGF0dXMpKTsKKyAgX2FpZGxfc3RhdHVzX3JldHVybjoKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KIDo6bmRrOjpTY29wZWRBU3RhdHVzIEJwVGVzdFNlcnZpY2U6OlJlcGVhdFV0ZjhDcHBTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGluX3Rva2VuLCBzdGQ6OnN0cmluZyogX2FpZGxfcmV0dXJuKSB7CiAgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX09LOwogICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CkBAIC0yNzE2LDEyICszNDE4LDEyIEBACiAgIEFQYXJjZWxfbWFya1NlbnNpdGl2ZShfYWlkbF9pbi5nZXQoKSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVTdHJpbmcoX2FpZGxfaW4uZ2V0KCksIGluX3Rva2VuKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5fdG9rZW4pOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KAogICAgIGFzQmluZGVyKCkuZ2V0KCksCi0gICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0MCAvKlJlcGVhdFV0ZjhDcHBTdHJpbmcqLyksCisgICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1MCAvKlJlcGVhdFV0ZjhDcHBTdHJpbmcqLyksCiAgICAgX2FpZGxfaW4uZ2V0UigpLAogICAgIF9haWRsX291dC5nZXRSKCksCiAgICAgRkxBR19DTEVBUl9CVUYKQEAgLTI3MzksNyArMzQ0MSw3IEBACiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47Ci0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkU3RyaW5nKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX2Vycm9yOgpAQCAtMjc1NywxMiArMzQ1OSwxMiBAQAogICBBUGFyY2VsX21hcmtTZW5zaXRpdmUoX2FpZGxfaW4uZ2V0KCkpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlU3RyaW5nKF9haWRsX2luLmdldCgpLCBpbl90b2tlbik7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5fdG9rZW4pOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KAogICAgIGFzQmluZGVyKCkuZ2V0KCksCi0gICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0MSAvKlJlcGVhdE51bGxhYmxlVXRmOENwcFN0cmluZyovKSwKKyAgICAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDUxIC8qUmVwZWF0TnVsbGFibGVVdGY4Q3BwU3RyaW5nKi8pLAogICAgIF9haWRsX2luLmdldFIoKSwKICAgICBfYWlkbF9vdXQuZ2V0UigpLAogICAgIEZMQUdfQ0xFQVJfQlVGCkBAIC0yNzgwLDcgKzM0ODIsNyBAQAogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOwotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFN0cmluZyhfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX2Vycm9yOgpAQCAtMjc5OCw3ICszNTAwLDcgQEAKICAgQVBhcmNlbF9tYXJrU2Vuc2l0aXZlKF9haWRsX2luLmdldCgpKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihfYWlkbF9pbi5nZXQoKSwgaW5faW5wdXQpOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX2luLmdldCgpLCBpbl9pbnB1dCk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3JTaXplKF9haWRsX2luLmdldCgpLCAqb3V0X3JlcGVhdGVkKTsKQEAgLTI4MDYsNyArMzUwOCw3IEBACiAKICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KAogICAgIGFzQmluZGVyKCkuZ2V0KCksCi0gICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0MiAvKlJldmVyc2VVdGY4Q3BwU3RyaW5nKi8pLAorICAgIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNTIgLypSZXZlcnNlVXRmOENwcFN0cmluZyovKSwKICAgICBfYWlkbF9pbi5nZXRSKCksCiAgICAgX2FpZGxfb3V0LmdldFIoKSwKICAgICBGTEFHX0NMRUFSX0JVRgpAQCAtMjgyNCwxMCArMzUyNiwxMCBAQAogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOwotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihfYWlkbF9vdXQuZ2V0KCksIG91dF9yZXBlYXRlZCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIG91dF9yZXBlYXRlZCk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9lcnJvcjoKQEAgLTI4NDUsNyArMzU0Nyw3IEBACiAgIEFQYXJjZWxfbWFya1NlbnNpdGl2ZShfYWlkbF9pbi5nZXQoKSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX2FpZGxfaW4uZ2V0KCksIGluX2lucHV0KTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX2luLmdldCgpLCBpbl9pbnB1dCk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3JTaXplKF9haWRsX2luLmdldCgpLCAqb3V0X3JlcGVhdGVkKTsKQEAgLTI4NTMsNyArMzU1NSw3IEBACiAKICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KAogICAgIGFzQmluZGVyKCkuZ2V0KCksCi0gICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0MyAvKlJldmVyc2VOdWxsYWJsZVV0ZjhDcHBTdHJpbmcqLyksCisgICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1MyAvKlJldmVyc2VOdWxsYWJsZVV0ZjhDcHBTdHJpbmcqLyksCiAgICAgX2FpZGxfaW4uZ2V0UigpLAogICAgIF9haWRsX291dC5nZXRSKCksCiAgICAgRkxBR19DTEVBUl9CVUYKQEAgLTI4NzEsMTAgKzM1NzMsMTAgQEAKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihfYWlkbF9vdXQuZ2V0KCksIG91dF9yZXBlYXRlZCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX291dC5nZXQoKSwgb3V0X3JlcGVhdGVkKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX2Vycm9yOgpAQCAtMjg4Miw3ICszNTg0LDcgQEAKICAgX2FpZGxfc3RhdHVzX3JldHVybjoKICAgcmV0dXJuIF9haWRsX3N0YXR1czsKIH0KLTo6bmRrOjpTY29wZWRBU3RhdHVzIEJwVGVzdFNlcnZpY2U6OlJldmVyc2VVdGY4Q3BwU3RyaW5nTGlzdChjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGluX2lucHV0LCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIG91dF9yZXBlYXRlZCwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBfYWlkbF9yZXR1cm4pIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIEJwVGVzdFNlcnZpY2U6OlJldmVyc2VVdGY4Q3BwU3RyaW5nTGlzdChjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+Pj4mIGluX2lucHV0LCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+Pj4qIG91dF9yZXBlYXRlZCwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPj4+KiBfYWlkbF9yZXR1cm4pIHsKICAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBTVEFUVVNfT0s7CiAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1czsKICAgOjpuZGs6OlNjb3BlZEFQYXJjZWwgX2FpZGxfaW47CkBAIC0yODkyLDEyICszNTk0LDEyIEBACiAgIEFQYXJjZWxfbWFya1NlbnNpdGl2ZShfYWlkbF9pbi5nZXQoKSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX2FpZGxfaW4uZ2V0KCksIGluX2lucHV0KTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX2luLmdldCgpLCBpbl9pbnB1dCk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9yZXRfc3RhdHVzID0gQUlCaW5kZXJfdHJhbnNhY3QoCiAgICAgYXNCaW5kZXIoKS5nZXQoKSwKLSAgICAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQ0IC8qUmV2ZXJzZVV0ZjhDcHBTdHJpbmdMaXN0Ki8pLAorICAgIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNTQgLypSZXZlcnNlVXRmOENwcFN0cmluZ0xpc3QqLyksCiAgICAgX2FpZGxfaW4uZ2V0UigpLAogICAgIF9haWRsX291dC5nZXRSKCksCiAgICAgRkxBR19DTEVBUl9CVUYKQEAgLTI5MTUsMTAgKzM2MTcsMTAgQEAKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihfYWlkbF9vdXQuZ2V0KCksIG91dF9yZXBlYXRlZCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX291dC5nZXQoKSwgb3V0X3JlcGVhdGVkKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX2Vycm9yOgpAQCAtMjkzNiwxMiArMzYzOCwxMiBAQAogICBBUGFyY2VsX21hcmtTZW5zaXRpdmUoX2FpZGxfaW4uZ2V0KCkpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVCb29sKF9haWRsX2luLmdldCgpLCBpbl9yZXR1cm5fbnVsbCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX3JldHVybl9udWxsKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl90cmFuc2FjdCgKICAgICBhc0JpbmRlcigpLmdldCgpLAotICAgIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDUgLypHZXRDYWxsYmFjayovKSwKKyAgICAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDU1IC8qR2V0Q2FsbGJhY2sqLyksCiAgICAgX2FpZGxfaW4uZ2V0UigpLAogICAgIF9haWRsX291dC5nZXRSKCksCiAgICAgRkxBR19DTEVBUl9CVUYKQEAgLTI5NTksNyArMzY2MSw3IEBACiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47Ci0gIF9haWRsX3JldF9zdGF0dXMgPSA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjazo6cmVhZEZyb21QYXJjZWwoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9lcnJvcjoKQEAgLTI5NzcsMTIgKzM2NzksMTIgQEAKICAgQVBhcmNlbF9tYXJrU2Vuc2l0aXZlKF9haWRsX2luLmdldCgpKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVBhcmNlbGFibGUoX2FpZGxfaW4uZ2V0KCksICppbl9wYXJjZWwpOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX2luLmdldCgpLCAqaW5fcGFyY2VsKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl90cmFuc2FjdCgKICAgICBhc0JpbmRlcigpLmdldCgpLAotICAgIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDYgLypGaWxsT3V0U3RydWN0dXJlZFBhcmNlbGFibGUqLyksCisgICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1NiAvKkZpbGxPdXRTdHJ1Y3R1cmVkUGFyY2VsYWJsZSovKSwKICAgICBfYWlkbF9pbi5nZXRSKCksCiAgICAgX2FpZGxfb3V0LmdldFIoKSwKICAgICBGTEFHX0NMRUFSX0JVRgpAQCAtMzAwMCw3ICszNzAyLDE4MyBAQAogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOwotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFBhcmNlbGFibGUoX2FpZGxfb3V0LmdldCgpLCBpbl9wYXJjZWwpOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBpbl9wYXJjZWwpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfZXJyb3I6CisgIF9haWRsX3N0YXR1cy5zZXQoQVN0YXR1c19mcm9tU3RhdHVzKF9haWRsX3JldF9zdGF0dXMpKTsKKyAgX2FpZGxfc3RhdHVzX3JldHVybjoKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKzo6bmRrOjpTY29wZWRBU3RhdHVzIEJwVGVzdFNlcnZpY2U6OlJlcGVhdEV4dGVuZGFibGVQYXJjZWxhYmxlKGNvbnN0IDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OmV4dGVuc2lvbjo6RXh0ZW5kYWJsZVBhcmNlbGFibGUmIGluX2VwLCA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpleHRlbnNpb246OkV4dGVuZGFibGVQYXJjZWxhYmxlKiBvdXRfZXAyKSB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX09LOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIDo6bmRrOjpTY29wZWRBUGFyY2VsIF9haWRsX2luOworICA6Om5kazo6U2NvcGVkQVBhcmNlbCBfYWlkbF9vdXQ7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3ByZXBhcmVUcmFuc2FjdGlvbihhc0JpbmRlcigpLmdldCgpLCBfYWlkbF9pbi5nZXRSKCkpOworICBBUGFyY2VsX21hcmtTZW5zaXRpdmUoX2FpZGxfaW4uZ2V0KCkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5fZXApOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KAorICAgIGFzQmluZGVyKCkuZ2V0KCksCisgICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1NyAvKlJlcGVhdEV4dGVuZGFibGVQYXJjZWxhYmxlKi8pLAorICAgIF9haWRsX2luLmdldFIoKSwKKyAgICBfYWlkbF9vdXQuZ2V0UigpLAorICAgIEZMQUdfQ0xFQVJfQlVGCisgICAgI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICAgIHwgRkxBR19QUklWQVRFX0xPQ0FMCisgICAgI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgICApOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyA9PSBTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTiAmJiBJVGVzdFNlcnZpY2U6OmdldERlZmF1bHRJbXBsKCkpIHsKKyAgICBfYWlkbF9zdGF0dXMgPSBJVGVzdFNlcnZpY2U6OmdldERlZmF1bHRJbXBsKCktPlJlcGVhdEV4dGVuZGFibGVQYXJjZWxhYmxlKGluX2VwLCBvdXRfZXAyKTsKKyAgICBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47CisgIH0KKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRTdGF0dXNIZWFkZXIoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9zdGF0dXMuZ2V0UigpKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgb3V0X2VwMik7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9lcnJvcjoKKyAgX2FpZGxfc3RhdHVzLnNldChBU3RhdHVzX2Zyb21TdGF0dXMoX2FpZGxfcmV0X3N0YXR1cykpOworICBfYWlkbF9zdGF0dXNfcmV0dXJuOgorICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorOjpuZGs6OlNjb3BlZEFTdGF0dXMgQnBUZXN0U2VydmljZTo6UmV2ZXJzZUxpc3QoY29uc3QgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6UmVjdXJzaXZlTGlzdCYgaW5fbGlzdCwgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6UmVjdXJzaXZlTGlzdCogX2FpZGxfcmV0dXJuKSB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX09LOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIDo6bmRrOjpTY29wZWRBUGFyY2VsIF9haWRsX2luOworICA6Om5kazo6U2NvcGVkQVBhcmNlbCBfYWlkbF9vdXQ7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3ByZXBhcmVUcmFuc2FjdGlvbihhc0JpbmRlcigpLmdldCgpLCBfYWlkbF9pbi5nZXRSKCkpOworICBBUGFyY2VsX21hcmtTZW5zaXRpdmUoX2FpZGxfaW4uZ2V0KCkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5fbGlzdCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gQUlCaW5kZXJfdHJhbnNhY3QoCisgICAgYXNCaW5kZXIoKS5nZXQoKSwKKyAgICAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDU4IC8qUmV2ZXJzZUxpc3QqLyksCisgICAgX2FpZGxfaW4uZ2V0UigpLAorICAgIF9haWRsX291dC5nZXRSKCksCisgICAgRkxBR19DTEVBUl9CVUYKKyAgICAjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgICAgfCBGTEFHX1BSSVZBVEVfTE9DQUwKKyAgICAjZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICAgICk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzID09IFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OICYmIElUZXN0U2VydmljZTo6Z2V0RGVmYXVsdEltcGwoKSkgeworICAgIF9haWRsX3N0YXR1cyA9IElUZXN0U2VydmljZTo6Z2V0RGVmYXVsdEltcGwoKS0+UmV2ZXJzZUxpc3QoaW5fbGlzdCwgX2FpZGxfcmV0dXJuKTsKKyAgICBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47CisgIH0KKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRTdGF0dXNIZWFkZXIoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9zdGF0dXMuZ2V0UigpKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX2Vycm9yOgorICBfYWlkbF9zdGF0dXMuc2V0KEFTdGF0dXNfZnJvbVN0YXR1cyhfYWlkbF9yZXRfc3RhdHVzKSk7CisgIF9haWRsX3N0YXR1c19yZXR1cm46CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBCcFRlc3RTZXJ2aWNlOjpSZXZlcnNlSUJpbmRlckFycmF5KGNvbnN0IHN0ZDo6dmVjdG9yPDo6bmRrOjpTcEFJQmluZGVyPiYgaW5faW5wdXQsIHN0ZDo6dmVjdG9yPDo6bmRrOjpTcEFJQmluZGVyPiogb3V0X3JlcGVhdGVkLCBzdGQ6OnZlY3Rvcjw6Om5kazo6U3BBSUJpbmRlcj4qIF9haWRsX3JldHVybikgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19PSzsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOworICA6Om5kazo6U2NvcGVkQVBhcmNlbCBfYWlkbF9pbjsKKyAgOjpuZGs6OlNjb3BlZEFQYXJjZWwgX2FpZGxfb3V0OworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl9wcmVwYXJlVHJhbnNhY3Rpb24oYXNCaW5kZXIoKS5nZXQoKSwgX2FpZGxfaW4uZ2V0UigpKTsKKyAgQVBhcmNlbF9tYXJrU2Vuc2l0aXZlKF9haWRsX2luLmdldCgpKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX2lucHV0KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvclNpemUoX2FpZGxfaW4uZ2V0KCksICpvdXRfcmVwZWF0ZWQpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KAorICAgIGFzQmluZGVyKCkuZ2V0KCksCisgICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1OSAvKlJldmVyc2VJQmluZGVyQXJyYXkqLyksCisgICAgX2FpZGxfaW4uZ2V0UigpLAorICAgIF9haWRsX291dC5nZXRSKCksCisgICAgRkxBR19DTEVBUl9CVUYKKyAgICAjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgICAgfCBGTEFHX1BSSVZBVEVfTE9DQUwKKyAgICAjZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICAgICk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzID09IFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OICYmIElUZXN0U2VydmljZTo6Z2V0RGVmYXVsdEltcGwoKSkgeworICAgIF9haWRsX3N0YXR1cyA9IElUZXN0U2VydmljZTo6Z2V0RGVmYXVsdEltcGwoKS0+UmV2ZXJzZUlCaW5kZXJBcnJheShpbl9pbnB1dCwgb3V0X3JlcGVhdGVkLCBfYWlkbF9yZXR1cm4pOworICAgIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKKyAgfQorICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZFN0YXR1c0hlYWRlcihfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3N0YXR1cy5nZXRSKCkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgb3V0X3JlcGVhdGVkKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX2Vycm9yOgorICBfYWlkbF9zdGF0dXMuc2V0KEFTdGF0dXNfZnJvbVN0YXR1cyhfYWlkbF9yZXRfc3RhdHVzKSk7CisgIF9haWRsX3N0YXR1c19yZXR1cm46CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBCcFRlc3RTZXJ2aWNlOjpSZXZlcnNlTnVsbGFibGVJQmluZGVyQXJyYXkoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3Rvcjw6Om5kazo6U3BBSUJpbmRlcj4+JiBpbl9pbnB1dCwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3Rvcjw6Om5kazo6U3BBSUJpbmRlcj4+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8OjpuZGs6OlNwQUlCaW5kZXI+PiogX2FpZGxfcmV0dXJuKSB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX09LOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIDo6bmRrOjpTY29wZWRBUGFyY2VsIF9haWRsX2luOworICA6Om5kazo6U2NvcGVkQVBhcmNlbCBfYWlkbF9vdXQ7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3ByZXBhcmVUcmFuc2FjdGlvbihhc0JpbmRlcigpLmdldCgpLCBfYWlkbF9pbi5nZXRSKCkpOworICBBUGFyY2VsX21hcmtTZW5zaXRpdmUoX2FpZGxfaW4uZ2V0KCkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX2luLmdldCgpLCBpbl9pbnB1dCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3JTaXplKF9haWRsX2luLmdldCgpLCAqb3V0X3JlcGVhdGVkKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl90cmFuc2FjdCgKKyAgICBhc0JpbmRlcigpLmdldCgpLAorICAgIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNjAgLypSZXZlcnNlTnVsbGFibGVJQmluZGVyQXJyYXkqLyksCisgICAgX2FpZGxfaW4uZ2V0UigpLAorICAgIF9haWRsX291dC5nZXRSKCksCisgICAgRkxBR19DTEVBUl9CVUYKKyAgICAjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgICAgfCBGTEFHX1BSSVZBVEVfTE9DQUwKKyAgICAjZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICAgICk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzID09IFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OICYmIElUZXN0U2VydmljZTo6Z2V0RGVmYXVsdEltcGwoKSkgeworICAgIF9haWRsX3N0YXR1cyA9IElUZXN0U2VydmljZTo6Z2V0RGVmYXVsdEltcGwoKS0+UmV2ZXJzZU51bGxhYmxlSUJpbmRlckFycmF5KGluX2lucHV0LCBvdXRfcmVwZWF0ZWQsIF9haWRsX3JldHVybik7CisgICAgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOworICB9CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkU3RhdHVzSGVhZGVyKF9haWRsX291dC5nZXQoKSwgX2FpZGxfc3RhdHVzLmdldFIoKSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX291dC5nZXQoKSwgb3V0X3JlcGVhdGVkKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX2Vycm9yOgpAQCAtMzAyMCw3ICszODk4LDcgQEAKIAogICBfYWlkbF9yZXRfc3RhdHVzID0gQUlCaW5kZXJfdHJhbnNhY3QoCiAgICAgYXNCaW5kZXIoKS5nZXQoKSwKLSAgICAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQ3IC8qR2V0T2xkTmFtZUludGVyZmFjZSovKSwKKyAgICAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDYxIC8qR2V0T2xkTmFtZUludGVyZmFjZSovKSwKICAgICBfYWlkbF9pbi5nZXRSKCksCiAgICAgX2FpZGxfb3V0LmdldFIoKSwKICAgICBGTEFHX0NMRUFSX0JVRgpAQCAtMzAzOCw3ICszOTE2LDcgQEAKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklPbGROYW1lOjpyZWFkRnJvbVBhcmNlbChfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9lcnJvcjoKQEAgLTMwNTgsNyArMzkzNiw3IEBACiAKICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KAogICAgIGFzQmluZGVyKCkuZ2V0KCksCi0gICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0OCAvKkdldE5ld05hbWVJbnRlcmZhY2UqLyksCisgICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA2MiAvKkdldE5ld05hbWVJbnRlcmZhY2UqLyksCiAgICAgX2FpZGxfaW4uZ2V0UigpLAogICAgIF9haWRsX291dC5nZXRSKCksCiAgICAgRkxBR19DTEVBUl9CVUYKQEAgLTMwNzYsNyArMzk1NCw0OCBAQAogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOwotICBfYWlkbF9yZXRfc3RhdHVzID0gOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5ld05hbWU6OnJlYWRGcm9tUGFyY2VsKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX2Vycm9yOgorICBfYWlkbF9zdGF0dXMuc2V0KEFTdGF0dXNfZnJvbVN0YXR1cyhfYWlkbF9yZXRfc3RhdHVzKSk7CisgIF9haWRsX3N0YXR1c19yZXR1cm46CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBCcFRlc3RTZXJ2aWNlOjpHZXRVbmlvblRhZ3MoY29uc3Qgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6VW5pb24+JiBpbl9pbnB1dCwgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6VW5pb246OlRhZz4qIF9haWRsX3JldHVybikgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19PSzsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOworICA6Om5kazo6U2NvcGVkQVBhcmNlbCBfYWlkbF9pbjsKKyAgOjpuZGs6OlNjb3BlZEFQYXJjZWwgX2FpZGxfb3V0OworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl9wcmVwYXJlVHJhbnNhY3Rpb24oYXNCaW5kZXIoKS5nZXQoKSwgX2FpZGxfaW4uZ2V0UigpKTsKKyAgQVBhcmNlbF9tYXJrU2Vuc2l0aXZlKF9haWRsX2luLmdldCgpKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX2lucHV0KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl90cmFuc2FjdCgKKyAgICBhc0JpbmRlcigpLmdldCgpLAorICAgIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNjMgLypHZXRVbmlvblRhZ3MqLyksCisgICAgX2FpZGxfaW4uZ2V0UigpLAorICAgIF9haWRsX291dC5nZXRSKCksCisgICAgRkxBR19DTEVBUl9CVUYKKyAgICAjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgICAgfCBGTEFHX1BSSVZBVEVfTE9DQUwKKyAgICAjZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICAgICk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzID09IFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OICYmIElUZXN0U2VydmljZTo6Z2V0RGVmYXVsdEltcGwoKSkgeworICAgIF9haWRsX3N0YXR1cyA9IElUZXN0U2VydmljZTo6Z2V0RGVmYXVsdEltcGwoKS0+R2V0VW5pb25UYWdzKGluX2lucHV0LCBfYWlkbF9yZXR1cm4pOworICAgIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKKyAgfQorICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZFN0YXR1c0hlYWRlcihfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3N0YXR1cy5nZXRSKCkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfZXJyb3I6CkBAIC0zMDk2LDcgKzQwMTUsNyBAQAogCiAgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl90cmFuc2FjdCgKICAgICBhc0JpbmRlcigpLmdldCgpLAotICAgIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDkgLypHZXRDcHBKYXZhVGVzdHMqLyksCisgICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA2NCAvKkdldENwcEphdmFUZXN0cyovKSwKICAgICBfYWlkbF9pbi5nZXRSKCksCiAgICAgX2FpZGxfb3V0LmdldFIoKSwKICAgICBGTEFHX0NMRUFSX0JVRgpAQCAtMzExNCw3ICs0MDMzLDcgQEAKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZVN0cm9uZ0JpbmRlcihfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX2Vycm9yOgpAQCAtMzEzNCw3ICs0MDUzLDcgQEAKIAogICBfYWlkbF9yZXRfc3RhdHVzID0gQUlCaW5kZXJfdHJhbnNhY3QoCiAgICAgYXNCaW5kZXIoKS5nZXQoKSwKLSAgICAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDUwIC8qZ2V0QmFja2VuZFR5cGUqLyksCisgICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA2NSAvKmdldEJhY2tlbmRUeXBlKi8pLAogICAgIF9haWRsX2luLmdldFIoKSwKICAgICBfYWlkbF9vdXQuZ2V0UigpLAogICAgIEZMQUdfQ0xFQVJfQlVGCkBAIC0zMTUyLDcgKzQwNzEsNyBAQAogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOwotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkQnl0ZShfYWlkbF9vdXQuZ2V0KCksIHJlaW50ZXJwcmV0X2Nhc3Q8aW50OF90Kj4oX2FpZGxfcmV0dXJuKSk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9lcnJvcjoKQEAgLTMxNjQsNyArNDA4Myw3IEBACiBCblRlc3RTZXJ2aWNlOjpCblRlc3RTZXJ2aWNlKCkge30KIEJuVGVzdFNlcnZpY2U6On5CblRlc3RTZXJ2aWNlKCkge30KIDo6bmRrOjpTcEFJQmluZGVyIEJuVGVzdFNlcnZpY2U6OmNyZWF0ZUJpbmRlcigpIHsKLSAgQUlCaW5kZXIqIGJpbmRlciA9IEFJQmluZGVyX25ldyhfZ19haWRsX2NsYXp6LCBzdGF0aWNfY2FzdDx2b2lkKj4odGhpcykpOworICBBSUJpbmRlciogYmluZGVyID0gQUlCaW5kZXJfbmV3KF9nX2FpZGxfYW5kcm9pZF9haWRsX3Rlc3RzX0lUZXN0U2VydmljZV9jbGF6eiwgc3RhdGljX2Nhc3Q8dm9pZCo+KHRoaXMpKTsKICAgI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAogICBBSUJpbmRlcl9tYXJrQ29tcGlsYXRpb25Vbml0U3RhYmlsaXR5KGJpbmRlcik7CiAgICNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCkBAIC0zMTgwLDcgKzQwOTksNyBAQAogY29uc3QgY2hhciogSVRlc3RTZXJ2aWNlOjpTVFJJTkdfVEVTVF9DT05TVEFOVF9VVEY4ID0gImJheiI7CiAKIHN0ZDo6c2hhcmVkX3B0cjxJVGVzdFNlcnZpY2U+IElUZXN0U2VydmljZTo6ZnJvbUJpbmRlcihjb25zdCA6Om5kazo6U3BBSUJpbmRlciYgYmluZGVyKSB7Ci0gIGlmICghQUlCaW5kZXJfYXNzb2NpYXRlQ2xhc3MoYmluZGVyLmdldCgpLCBfZ19haWRsX2NsYXp6KSkgeyByZXR1cm4gbnVsbHB0cjsgfQorICBpZiAoIUFJQmluZGVyX2Fzc29jaWF0ZUNsYXNzKGJpbmRlci5nZXQoKSwgX2dfYWlkbF9hbmRyb2lkX2FpZGxfdGVzdHNfSVRlc3RTZXJ2aWNlX2NsYXp6KSkgeyByZXR1cm4gbnVsbHB0cjsgfQogICBzdGQ6OnNoYXJlZF9wdHI8OjpuZGs6OklDSW50ZXJmYWNlPiBpbnRlcmZhY2UgPSA6Om5kazo6SUNJbnRlcmZhY2U6OmFzSW50ZXJmYWNlKGJpbmRlci5nZXQoKSk7CiAgIGlmIChpbnRlcmZhY2UpIHsKICAgICByZXR1cm4gc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PElUZXN0U2VydmljZT4oaW50ZXJmYWNlKTsKQEAgLTMzNDgsNiArNDI2NywzNiBAQAogICBfYWlkbF9zdGF0dXMuc2V0KEFTdGF0dXNfZnJvbVN0YXR1cyhTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTikpOwogICByZXR1cm4gX2FpZGxfc3RhdHVzOwogfQorOjpuZGs6OlNjb3BlZEFTdGF0dXMgSVRlc3RTZXJ2aWNlRGVmYXVsdDo6R2V0SW50ZXJmYWNlQXJyYXkoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiAvKmluX25hbWVzKi8sIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4+KiAvKl9haWRsX3JldHVybiovKSB7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1czsKKyAgX2FpZGxfc3RhdHVzLnNldChBU3RhdHVzX2Zyb21TdGF0dXMoU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT04pKTsKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKzo6bmRrOjpTY29wZWRBU3RhdHVzIElUZXN0U2VydmljZURlZmF1bHQ6OlZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUFycmF5KGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4+JiAvKmluX3NlcnZpY2VzKi8sIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgLyppbl9uYW1lcyovLCBib29sKiAvKl9haWRsX3JldHVybiovKSB7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1czsKKyAgX2FpZGxfc3RhdHVzLnNldChBU3RhdHVzX2Zyb21TdGF0dXMoU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT04pKTsKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKzo6bmRrOjpTY29wZWRBU3RhdHVzIElUZXN0U2VydmljZURlZmF1bHQ6OkdldE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPj4+JiAvKmluX25hbWVzKi8sIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPj4+KiAvKl9haWRsX3JldHVybiovKSB7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1czsKKyAgX2FpZGxfc3RhdHVzLnNldChBU3RhdHVzX2Zyb21TdGF0dXMoU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT04pKTsKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKzo6bmRrOjpTY29wZWRBU3RhdHVzIElUZXN0U2VydmljZURlZmF1bHQ6OlZlcmlmeU5hbWVzV2l0aE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+Pj4mIC8qaW5fc2VydmljZXMqLywgY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPj4+JiAvKmluX25hbWVzKi8sIGJvb2wqIC8qX2FpZGxfcmV0dXJuKi8pIHsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOworICBfYWlkbF9zdGF0dXMuc2V0KEFTdGF0dXNfZnJvbVN0YXR1cyhTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTikpOworICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorOjpuZGs6OlNjb3BlZEFTdGF0dXMgSVRlc3RTZXJ2aWNlRGVmYXVsdDo6R2V0SW50ZXJmYWNlTGlzdChjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+Pj4mIC8qaW5fbmFtZXMqLywgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+Pj4qIC8qX2FpZGxfcmV0dXJuKi8pIHsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOworICBfYWlkbF9zdGF0dXMuc2V0KEFTdGF0dXNfZnJvbVN0YXR1cyhTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTikpOworICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorOjpuZGs6OlNjb3BlZEFTdGF0dXMgSVRlc3RTZXJ2aWNlRGVmYXVsdDo6VmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlTGlzdChjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4+PiYgLyppbl9zZXJ2aWNlcyovLCBjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+Pj4mIC8qaW5fbmFtZXMqLywgYm9vbCogLypfYWlkbF9yZXR1cm4qLykgeworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIF9haWRsX3N0YXR1cy5zZXQoQVN0YXR1c19mcm9tU3RhdHVzKFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OKSk7CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9CiA6Om5kazo6U2NvcGVkQVN0YXR1cyBJVGVzdFNlcnZpY2VEZWZhdWx0OjpSZXZlcnNlU3RyaW5nTGlzdChjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIC8qaW5faW5wdXQqLywgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiAvKm91dF9yZXBlYXRlZCovLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIC8qX2FpZGxfcmV0dXJuKi8pIHsKICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOwogICBfYWlkbF9zdGF0dXMuc2V0KEFTdGF0dXNfZnJvbVN0YXR1cyhTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTikpOwpAQCAtMzM5MywxMiArNDM0MiwyMiBAQAogICBfYWlkbF9zdGF0dXMuc2V0KEFTdGF0dXNfZnJvbVN0YXR1cyhTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTikpOwogICByZXR1cm4gX2FpZGxfc3RhdHVzOwogfQotOjpuZGs6OlNjb3BlZEFTdGF0dXMgSVRlc3RTZXJ2aWNlRGVmYXVsdDo6UmVwZWF0TnVsbGFibGVTdHJpbmdMaXN0KGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgLyppbl9pbnB1dCovLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIC8qX2FpZGxfcmV0dXJuKi8pIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIElUZXN0U2VydmljZURlZmF1bHQ6OlJlcGVhdE51bGxhYmxlU3RyaW5nTGlzdChjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+Pj4mIC8qaW5faW5wdXQqLywgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPj4+KiAvKl9haWRsX3JldHVybiovKSB7CiAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1czsKICAgX2FpZGxfc3RhdHVzLnNldChBU3RhdHVzX2Zyb21TdGF0dXMoU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT04pKTsKICAgcmV0dXJuIF9haWRsX3N0YXR1czsKIH0KLTo6bmRrOjpTY29wZWRBU3RhdHVzIElUZXN0U2VydmljZURlZmF1bHQ6OlJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZShjb25zdCBzdGQ6Om9wdGlvbmFsPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlN0cnVjdHVyZWRQYXJjZWxhYmxlPiYgLyppbl9pbnB1dCovLCBzdGQ6Om9wdGlvbmFsPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlN0cnVjdHVyZWRQYXJjZWxhYmxlPiogLypfYWlkbF9yZXR1cm4qLykgeworOjpuZGs6OlNjb3BlZEFTdGF0dXMgSVRlc3RTZXJ2aWNlRGVmYXVsdDo6UmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlKGNvbnN0IHN0ZDo6b3B0aW9uYWw8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eT4mIC8qaW5faW5wdXQqLywgc3RkOjpvcHRpb25hbDw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5PiogLypfYWlkbF9yZXR1cm4qLykgeworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIF9haWRsX3N0YXR1cy5zZXQoQVN0YXR1c19mcm9tU3RhdHVzKFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OKSk7CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBJVGVzdFNlcnZpY2VEZWZhdWx0OjpSZXBlYXROdWxsYWJsZVBhcmNlbGFibGVBcnJheShjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eT4+PiYgLyppbl9pbnB1dCovLCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eT4+PiogLypfYWlkbF9yZXR1cm4qLykgeworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIF9haWRsX3N0YXR1cy5zZXQoQVN0YXR1c19mcm9tU3RhdHVzKFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OKSk7CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBJVGVzdFNlcnZpY2VEZWZhdWx0OjpSZXBlYXROdWxsYWJsZVBhcmNlbGFibGVMaXN0KGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5Pj4+JiAvKmluX2lucHV0Ki8sIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5Pj4+KiAvKl9haWRsX3JldHVybiovKSB7CiAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1czsKICAgX2FpZGxfc3RhdHVzLnNldChBU3RhdHVzX2Zyb21TdGF0dXMoU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT04pKTsKICAgcmV0dXJuIF9haWRsX3N0YXR1czsKQEAgLTM0MTMsNiArNDM3MiwxNiBAQAogICBfYWlkbF9zdGF0dXMuc2V0KEFTdGF0dXNfZnJvbVN0YXR1cyhTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTikpOwogICByZXR1cm4gX2FpZGxfc3RhdHVzOwogfQorOjpuZGs6OlNjb3BlZEFTdGF0dXMgSVRlc3RTZXJ2aWNlRGVmYXVsdDo6VGFrZXNBbklCaW5kZXJMaXN0KGNvbnN0IHN0ZDo6dmVjdG9yPDo6bmRrOjpTcEFJQmluZGVyPiYgLyppbl9pbnB1dCovKSB7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1czsKKyAgX2FpZGxfc3RhdHVzLnNldChBU3RhdHVzX2Zyb21TdGF0dXMoU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT04pKTsKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKzo6bmRrOjpTY29wZWRBU3RhdHVzIElUZXN0U2VydmljZURlZmF1bHQ6OlRha2VzQU51bGxhYmxlSUJpbmRlckxpc3QoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3Rvcjw6Om5kazo6U3BBSUJpbmRlcj4+JiAvKmluX2lucHV0Ki8pIHsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOworICBfYWlkbF9zdGF0dXMuc2V0KEFTdGF0dXNfZnJvbVN0YXR1cyhTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTikpOworICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQogOjpuZGs6OlNjb3BlZEFTdGF0dXMgSVRlc3RTZXJ2aWNlRGVmYXVsdDo6UmVwZWF0VXRmOENwcFN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgLyppbl90b2tlbiovLCBzdGQ6OnN0cmluZyogLypfYWlkbF9yZXR1cm4qLykgewogICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CiAgIF9haWRsX3N0YXR1cy5zZXQoQVN0YXR1c19mcm9tU3RhdHVzKFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OKSk7CkBAIC0zNDMzLDcgKzQ0MDIsNyBAQAogICBfYWlkbF9zdGF0dXMuc2V0KEFTdGF0dXNfZnJvbVN0YXR1cyhTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTikpOwogICByZXR1cm4gX2FpZGxfc3RhdHVzOwogfQotOjpuZGs6OlNjb3BlZEFTdGF0dXMgSVRlc3RTZXJ2aWNlRGVmYXVsdDo6UmV2ZXJzZVV0ZjhDcHBTdHJpbmdMaXN0KGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgLyppbl9pbnB1dCovLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIC8qb3V0X3JlcGVhdGVkKi8sIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogLypfYWlkbF9yZXR1cm4qLykgeworOjpuZGs6OlNjb3BlZEFTdGF0dXMgSVRlc3RTZXJ2aWNlRGVmYXVsdDo6UmV2ZXJzZVV0ZjhDcHBTdHJpbmdMaXN0KGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4+PiYgLyppbl9pbnB1dCovLCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+Pj4qIC8qb3V0X3JlcGVhdGVkKi8sIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4+PiogLypfYWlkbF9yZXR1cm4qLykgewogICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CiAgIF9haWRsX3N0YXR1cy5zZXQoQVN0YXR1c19mcm9tU3RhdHVzKFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OKSk7CiAgIHJldHVybiBfYWlkbF9zdGF0dXM7CkBAIC0zNDQ4LDYgKzQ0MTcsMjYgQEAKICAgX2FpZGxfc3RhdHVzLnNldChBU3RhdHVzX2Zyb21TdGF0dXMoU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT04pKTsKICAgcmV0dXJuIF9haWRsX3N0YXR1czsKIH0KKzo6bmRrOjpTY29wZWRBU3RhdHVzIElUZXN0U2VydmljZURlZmF1bHQ6OlJlcGVhdEV4dGVuZGFibGVQYXJjZWxhYmxlKGNvbnN0IDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OmV4dGVuc2lvbjo6RXh0ZW5kYWJsZVBhcmNlbGFibGUmIC8qaW5fZXAqLywgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6ZXh0ZW5zaW9uOjpFeHRlbmRhYmxlUGFyY2VsYWJsZSogLypvdXRfZXAyKi8pIHsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOworICBfYWlkbF9zdGF0dXMuc2V0KEFTdGF0dXNfZnJvbVN0YXR1cyhTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTikpOworICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorOjpuZGs6OlNjb3BlZEFTdGF0dXMgSVRlc3RTZXJ2aWNlRGVmYXVsdDo6UmV2ZXJzZUxpc3QoY29uc3QgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6UmVjdXJzaXZlTGlzdCYgLyppbl9saXN0Ki8sIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlJlY3Vyc2l2ZUxpc3QqIC8qX2FpZGxfcmV0dXJuKi8pIHsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOworICBfYWlkbF9zdGF0dXMuc2V0KEFTdGF0dXNfZnJvbVN0YXR1cyhTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTikpOworICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorOjpuZGs6OlNjb3BlZEFTdGF0dXMgSVRlc3RTZXJ2aWNlRGVmYXVsdDo6UmV2ZXJzZUlCaW5kZXJBcnJheShjb25zdCBzdGQ6OnZlY3Rvcjw6Om5kazo6U3BBSUJpbmRlcj4mIC8qaW5faW5wdXQqLywgc3RkOjp2ZWN0b3I8OjpuZGs6OlNwQUlCaW5kZXI+KiAvKm91dF9yZXBlYXRlZCovLCBzdGQ6OnZlY3Rvcjw6Om5kazo6U3BBSUJpbmRlcj4qIC8qX2FpZGxfcmV0dXJuKi8pIHsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOworICBfYWlkbF9zdGF0dXMuc2V0KEFTdGF0dXNfZnJvbVN0YXR1cyhTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTikpOworICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorOjpuZGs6OlNjb3BlZEFTdGF0dXMgSVRlc3RTZXJ2aWNlRGVmYXVsdDo6UmV2ZXJzZU51bGxhYmxlSUJpbmRlckFycmF5KGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8OjpuZGs6OlNwQUlCaW5kZXI+PiYgLyppbl9pbnB1dCovLCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPDo6bmRrOjpTcEFJQmluZGVyPj4qIC8qb3V0X3JlcGVhdGVkKi8sIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8OjpuZGs6OlNwQUlCaW5kZXI+PiogLypfYWlkbF9yZXR1cm4qLykgeworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIF9haWRsX3N0YXR1cy5zZXQoQVN0YXR1c19mcm9tU3RhdHVzKFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OKSk7CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9CiA6Om5kazo6U2NvcGVkQVN0YXR1cyBJVGVzdFNlcnZpY2VEZWZhdWx0OjpHZXRPbGROYW1lSW50ZXJmYWNlKHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJT2xkTmFtZT4qIC8qX2FpZGxfcmV0dXJuKi8pIHsKICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOwogICBfYWlkbF9zdGF0dXMuc2V0KEFTdGF0dXNfZnJvbVN0YXR1cyhTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTikpOwpAQCAtMzQ1OCw2ICs0NDQ3LDExIEBACiAgIF9haWRsX3N0YXR1cy5zZXQoQVN0YXR1c19mcm9tU3RhdHVzKFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OKSk7CiAgIHJldHVybiBfYWlkbF9zdGF0dXM7CiB9Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBJVGVzdFNlcnZpY2VEZWZhdWx0OjpHZXRVbmlvblRhZ3MoY29uc3Qgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6VW5pb24+JiAvKmluX2lucHV0Ki8sIHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlVuaW9uOjpUYWc+KiAvKl9haWRsX3JldHVybiovKSB7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1czsKKyAgX2FpZGxfc3RhdHVzLnNldChBU3RhdHVzX2Zyb21TdGF0dXMoU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT04pKTsKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KIDo6bmRrOjpTY29wZWRBU3RhdHVzIElUZXN0U2VydmljZURlZmF1bHQ6OkdldENwcEphdmFUZXN0cyg6Om5kazo6U3BBSUJpbmRlciogLypfYWlkbF9yZXR1cm4qLykgewogICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CiAgIF9haWRsX3N0YXR1cy5zZXQoQVN0YXR1c19mcm9tU3RhdHVzKFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OKSk7CkBAIC0zNDc4LDMgKzQ0NzIsMjUzIEBACiB9ICAvLyBuYW1lc3BhY2UgYWlkbAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIH0gIC8vIG5hbWVzcGFjZSBhaWRsCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworY29uc3QgY2hhciogSVRlc3RTZXJ2aWNlOjpFbXB0eTo6ZGVzY3JpcHRvciA9ICJhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlLkVtcHR5IjsKKworYmluZGVyX3N0YXR1c190IElUZXN0U2VydmljZTo6RW1wdHk6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIF9haWRsX3BhcmNlbCkgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19PSzsKKyAgaW50MzJfdCBfYWlkbF9zdGFydF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpOworICBpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IDA7CisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihfYWlkbF9wYXJjZWwsICZfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChfYWlkbF9wYXJjZWxhYmxlX3NpemUgPCA0KSByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTsKKyAgaWYgKF9haWRsX3N0YXJ0X3BvcyA+IElOVDMyX01BWCAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuIFNUQVRVU19CQURfVkFMVUU7CisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9CitiaW5kZXJfc3RhdHVzX3QgSVRlc3RTZXJ2aWNlOjpFbXB0eTo6d3JpdGVUb1BhcmNlbChBUGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IHsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXM7CisgIHNpemVfdCBfYWlkbF9zdGFydF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpOworICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDMyKF9haWRsX3BhcmNlbCwgMCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgc2l6ZV90IF9haWRsX2VuZF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpOworICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3Bvcyk7CisgIEFQYXJjZWxfd3JpdGVJbnQzMihfYWlkbF9wYXJjZWwsIF9haWRsX2VuZF9wb3MgLSBfYWlkbF9zdGFydF9wb3MpOworICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX2VuZF9wb3MpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KKworfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworY29uc3QgY2hhciogSVRlc3RTZXJ2aWNlOjpDb21waWxlckNoZWNrczo6ZGVzY3JpcHRvciA9ICJhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlLkNvbXBpbGVyQ2hlY2tzIjsKKworYmluZGVyX3N0YXR1c190IElUZXN0U2VydmljZTo6Q29tcGlsZXJDaGVja3M6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIF9haWRsX3BhcmNlbCkgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19PSzsKKyAgaW50MzJfdCBfYWlkbF9zdGFydF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpOworICBpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IDA7CisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihfYWlkbF9wYXJjZWwsICZfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChfYWlkbF9wYXJjZWxhYmxlX3NpemUgPCA0KSByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTsKKyAgaWYgKF9haWRsX3N0YXJ0X3BvcyA+IElOVDMyX01BWCAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuIFNUQVRVU19CQURfVkFMVUU7CisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmYmluZGVyKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCAmbnVsbGFibGVfYmluZGVyKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmJpbmRlcl9hcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgJm51bGxhYmxlX2JpbmRlcl9hcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZiaW5kZXJfbGlzdCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgJm51bGxhYmxlX2JpbmRlcl9saXN0KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJnBmZCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgJm51bGxhYmxlX3BmZCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZwZmRfYXJyYXkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsICZudWxsYWJsZV9wZmRfYXJyYXkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmcGZkX2xpc3QpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsICZudWxsYWJsZV9wZmRfbGlzdCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZwYXJjZWwpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsICZudWxsYWJsZV9wYXJjZWwpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmcGFyY2VsX2FycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCAmbnVsbGFibGVfcGFyY2VsX2FycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJnBhcmNlbF9saXN0KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCAmbnVsbGFibGVfcGFyY2VsX2xpc3QpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9CitiaW5kZXJfc3RhdHVzX3QgSVRlc3RTZXJ2aWNlOjpDb21waWxlckNoZWNrczo6d3JpdGVUb1BhcmNlbChBUGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IHsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXM7CisgIHNpemVfdCBfYWlkbF9zdGFydF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpOworICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDMyKF9haWRsX3BhcmNlbCwgMCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGJpbmRlcik7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgbnVsbGFibGVfYmluZGVyKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgYmluZGVyX2FycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCBudWxsYWJsZV9iaW5kZXJfYXJyYXkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBiaW5kZXJfbGlzdCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgbnVsbGFibGVfYmluZGVyX2xpc3QpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBwZmQpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsIG51bGxhYmxlX3BmZCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIHBmZF9hcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgbnVsbGFibGVfcGZkX2FycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgcGZkX2xpc3QpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsIG51bGxhYmxlX3BmZF9saXN0KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgcGFyY2VsKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCBudWxsYWJsZV9wYXJjZWwpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBwYXJjZWxfYXJyYXkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsIG51bGxhYmxlX3BhcmNlbF9hcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIHBhcmNlbF9saXN0KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCBudWxsYWJsZV9wYXJjZWxfbGlzdCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgc2l6ZV90IF9haWRsX2VuZF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpOworICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3Bvcyk7CisgIEFQYXJjZWxfd3JpdGVJbnQzMihfYWlkbF9wYXJjZWwsIF9haWRsX2VuZF9wb3MgLSBfYWlkbF9zdGFydF9wb3MpOworICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX2VuZF9wb3MpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KKworfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lUZXN0U2VydmljZS5jcHAuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSVRlc3RTZXJ2aWNlLmNwcC5kCnNpbWlsYXJpdHkgaW5kZXggNjQlCnJlbmFtZSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSVRlc3RTZXJ2aWNlLmNwcC5kCnJlbmFtZSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lUZXN0U2VydmljZS5jcHAuZAppbmRleCA2MDE0ZDNmLi4xOWFjZDlmIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lUZXN0U2VydmljZS5jcHAuZAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lUZXN0U2VydmljZS5jcHAuZApAQCAtMSw0ICsxLDQgQEAKLW91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JVGVzdFNlcnZpY2UuY3BwIDogXAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lUZXN0U2VydmljZS5jcHAgOiBcCiAgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9JVGVzdFNlcnZpY2UuYWlkbCBcCiAgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9CYWNrZW5kVHlwZS5haWRsIFwKICAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0J5dGVFbnVtLmFpZGwgXApAQCAtNyw0ICs3LDggQEAKICAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0lPbGROYW1lLmFpZGwgXAogICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvSW50RW51bS5haWRsIFwKICAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0xvbmdFbnVtLmFpZGwgXAotICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvU3RydWN0dXJlZFBhcmNlbGFibGUuYWlkbAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvUmVjdXJzaXZlTGlzdC5haWRsIFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL1N0cnVjdHVyZWRQYXJjZWxhYmxlLmFpZGwgXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb24uYWlkbCBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vRXh0ZW5kYWJsZVBhcmNlbGFibGUuYWlkbCBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9Db25zdGFudEV4cHJlc3Npb25FbnVtLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSW50RW51bS5jcHAgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0ludEVudW0uY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0ludEVudW0uY3BwCnJlbmFtZSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0ludEVudW0uY3BwCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0ludEVudW0uY3BwLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0ludEVudW0uY3BwLmQKc2ltaWxhcml0eSBpbmRleCA2NyUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JbnRFbnVtLmNwcC5kCnJlbmFtZSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0ludEVudW0uY3BwLmQKaW5kZXggZjJiMzBjMy4uNjVlMzk3MiAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JbnRFbnVtLmNwcC5kCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSW50RW51bS5jcHAuZApAQCAtMSwyICsxLDIgQEAKLW91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JbnRFbnVtLmNwcCA6IFwKK291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JbnRFbnVtLmNwcCA6IFwKICAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0ludEVudW0uYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9MaXN0T2ZJbnRlcmZhY2VzLmNwcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvTGlzdE9mSW50ZXJmYWNlcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q5MGExMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvTGlzdE9mSW50ZXJmYWNlcy5jcHAKQEAgLTAsMCArMSw0NjUgQEAKKyNpbmNsdWRlICJhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9MaXN0T2ZJbnRlcmZhY2VzLmgiCisKKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wYXJjZWxfdXRpbHMuaD4KKworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK2NvbnN0IGNoYXIqIExpc3RPZkludGVyZmFjZXM6OmRlc2NyaXB0b3IgPSAiYW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMiOworCitiaW5kZXJfc3RhdHVzX3QgTGlzdE9mSW50ZXJmYWNlczo6cmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogX2FpZGxfcGFyY2VsKSB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX09LOworICBpbnQzMl90IF9haWRsX3N0YXJ0X3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIGludDMyX3QgX2FpZGxfcGFyY2VsYWJsZV9zaXplID0gMDsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyKF9haWRsX3BhcmNlbCwgJl9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKF9haWRsX3BhcmNlbGFibGVfc2l6ZSA8IDQpIHJldHVybiBTVEFUVVNfQkFEX1ZBTFVFOworICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gSU5UMzJfTUFYIC0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTsKKyAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KK2JpbmRlcl9zdGF0dXNfdCBMaXN0T2ZJbnRlcmZhY2VzOjp3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1czsKKyAgc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIoX2FpZGxfcGFyY2VsLCAwKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBzaXplX3QgX2FpZGxfZW5kX3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zKTsKKyAgQVBhcmNlbF93cml0ZUludDMyKF9haWRsX3BhcmNlbCwgX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfZW5kX3Bvcyk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CitzdGF0aWMgYmluZGVyX3N0YXR1c190IF9haWRsX2FuZHJvaWRfYWlkbF90ZXN0c19MaXN0T2ZJbnRlcmZhY2VzX0lFbXB0eUludGVyZmFjZV9vblRyYW5zYWN0KEFJQmluZGVyKiBfYWlkbF9iaW5kZXIsIHRyYW5zYWN0aW9uX2NvZGVfdCBfYWlkbF9jb2RlLCBjb25zdCBBUGFyY2VsKiBfYWlkbF9pbiwgQVBhcmNlbCogX2FpZGxfb3V0KSB7CisgICh2b2lkKV9haWRsX2luOworICAodm9pZClfYWlkbF9vdXQ7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT047CisgICh2b2lkKV9haWRsX2JpbmRlcjsKKyAgKHZvaWQpX2FpZGxfY29kZTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9CisKK3N0YXRpYyBBSUJpbmRlcl9DbGFzcyogX2dfYWlkbF9hbmRyb2lkX2FpZGxfdGVzdHNfTGlzdE9mSW50ZXJmYWNlc19JRW1wdHlJbnRlcmZhY2VfY2xhenogPSA6Om5kazo6SUNJbnRlcmZhY2U6OmRlZmluZUNsYXNzKExpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZTo6ZGVzY3JpcHRvciwgX2FpZGxfYW5kcm9pZF9haWRsX3Rlc3RzX0xpc3RPZkludGVyZmFjZXNfSUVtcHR5SW50ZXJmYWNlX29uVHJhbnNhY3QpOworCitMaXN0T2ZJbnRlcmZhY2VzOjpCcEVtcHR5SW50ZXJmYWNlOjpCcEVtcHR5SW50ZXJmYWNlKGNvbnN0IDo6bmRrOjpTcEFJQmluZGVyJiBiaW5kZXIpIDogQnBDSW50ZXJmYWNlKGJpbmRlcikge30KK0xpc3RPZkludGVyZmFjZXM6OkJwRW1wdHlJbnRlcmZhY2U6On5CcEVtcHR5SW50ZXJmYWNlKCkge30KKworLy8gU291cmNlIGZvciBCbkVtcHR5SW50ZXJmYWNlCitMaXN0T2ZJbnRlcmZhY2VzOjpCbkVtcHR5SW50ZXJmYWNlOjpCbkVtcHR5SW50ZXJmYWNlKCkge30KK0xpc3RPZkludGVyZmFjZXM6OkJuRW1wdHlJbnRlcmZhY2U6On5CbkVtcHR5SW50ZXJmYWNlKCkge30KKzo6bmRrOjpTcEFJQmluZGVyIExpc3RPZkludGVyZmFjZXM6OkJuRW1wdHlJbnRlcmZhY2U6OmNyZWF0ZUJpbmRlcigpIHsKKyAgQUlCaW5kZXIqIGJpbmRlciA9IEFJQmluZGVyX25ldyhfZ19haWRsX2FuZHJvaWRfYWlkbF90ZXN0c19MaXN0T2ZJbnRlcmZhY2VzX0lFbXB0eUludGVyZmFjZV9jbGF6eiwgc3RhdGljX2Nhc3Q8dm9pZCo+KHRoaXMpKTsKKyAgI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICBBSUJpbmRlcl9tYXJrQ29tcGlsYXRpb25Vbml0U3RhYmlsaXR5KGJpbmRlcik7CisgICNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgIHJldHVybiA6Om5kazo6U3BBSUJpbmRlcihiaW5kZXIpOworfQorLy8gU291cmNlIGZvciBJRW1wdHlJbnRlcmZhY2UKK2NvbnN0IGNoYXIqIExpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZTo6ZGVzY3JpcHRvciA9ICJhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UiOworTGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlOjpJRW1wdHlJbnRlcmZhY2UoKSB7fQorTGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlOjp+SUVtcHR5SW50ZXJmYWNlKCkge30KKworCitzdGQ6OnNoYXJlZF9wdHI8TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPiBMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U6OmZyb21CaW5kZXIoY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGJpbmRlcikgeworICBpZiAoIUFJQmluZGVyX2Fzc29jaWF0ZUNsYXNzKGJpbmRlci5nZXQoKSwgX2dfYWlkbF9hbmRyb2lkX2FpZGxfdGVzdHNfTGlzdE9mSW50ZXJmYWNlc19JRW1wdHlJbnRlcmZhY2VfY2xhenopKSB7IHJldHVybiBudWxscHRyOyB9CisgIHN0ZDo6c2hhcmVkX3B0cjw6Om5kazo6SUNJbnRlcmZhY2U+IGludGVyZmFjZSA9IDo6bmRrOjpJQ0ludGVyZmFjZTo6YXNJbnRlcmZhY2UoYmluZGVyLmdldCgpKTsKKyAgaWYgKGludGVyZmFjZSkgeworICAgIHJldHVybiBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8SUVtcHR5SW50ZXJmYWNlPihpbnRlcmZhY2UpOworICB9CisgIHJldHVybiA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxMaXN0T2ZJbnRlcmZhY2VzOjpCcEVtcHR5SW50ZXJmYWNlPihiaW5kZXIpOworfQorCitiaW5kZXJfc3RhdHVzX3QgTGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlOjp3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIHBhcmNlbCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElFbXB0eUludGVyZmFjZT4mIGluc3RhbmNlKSB7CisgIHJldHVybiBBUGFyY2VsX3dyaXRlU3Ryb25nQmluZGVyKHBhcmNlbCwgaW5zdGFuY2UgPyBpbnN0YW5jZS0+YXNCaW5kZXIoKS5nZXQoKSA6IG51bGxwdHIpOworfQorYmluZGVyX3N0YXR1c190IExpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZTo6cmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogcGFyY2VsLCBzdGQ6OnNoYXJlZF9wdHI8SUVtcHR5SW50ZXJmYWNlPiogaW5zdGFuY2UpIHsKKyAgOjpuZGs6OlNwQUlCaW5kZXIgYmluZGVyOworICBiaW5kZXJfc3RhdHVzX3Qgc3RhdHVzID0gQVBhcmNlbF9yZWFkU3Ryb25nQmluZGVyKHBhcmNlbCwgYmluZGVyLmdldFIoKSk7CisgIGlmIChzdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gc3RhdHVzOworICAqaW5zdGFuY2UgPSBJRW1wdHlJbnRlcmZhY2U6OmZyb21CaW5kZXIoYmluZGVyKTsKKyAgcmV0dXJuIFNUQVRVU19PSzsKK30KK2Jvb2wgTGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlOjpzZXREZWZhdWx0SW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SUVtcHR5SW50ZXJmYWNlPiYgaW1wbCkgeworICAvLyBPbmx5IG9uZSB1c2VyIG9mIHRoaXMgaW50ZXJmYWNlIGNhbiB1c2UgdGhpcyBmdW5jdGlvbgorICAvLyBhdCBhIHRpbWUuIFRoaXMgaXMgYSBoZXVyaXN0aWMgdG8gZGV0ZWN0IGlmIHR3byBkaWZmZXJlbnQKKyAgLy8gdXNlcnMgaW4gdGhlIHNhbWUgcHJvY2VzcyB1c2UgdGhpcyBmdW5jdGlvbi4KKyAgYXNzZXJ0KCFJRW1wdHlJbnRlcmZhY2U6OmRlZmF1bHRfaW1wbCk7CisgIGlmIChpbXBsKSB7CisgICAgSUVtcHR5SW50ZXJmYWNlOjpkZWZhdWx0X2ltcGwgPSBpbXBsOworICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KK2NvbnN0IHN0ZDo6c2hhcmVkX3B0cjxMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+JiBMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U6OmdldERlZmF1bHRJbXBsKCkgeworICByZXR1cm4gSUVtcHR5SW50ZXJmYWNlOjpkZWZhdWx0X2ltcGw7Cit9CitzdGQ6OnNoYXJlZF9wdHI8TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPiBMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U6OmRlZmF1bHRfaW1wbCA9IG51bGxwdHI7Cis6Om5kazo6U3BBSUJpbmRlciBMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2VEZWZhdWx0Ojphc0JpbmRlcigpIHsKKyAgcmV0dXJuIDo6bmRrOjpTcEFJQmluZGVyKCk7Cit9Citib29sIExpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZURlZmF1bHQ6OmlzUmVtb3RlKCkgeworICByZXR1cm4gZmFsc2U7Cit9Cit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CitzdGF0aWMgYmluZGVyX3N0YXR1c190IF9haWRsX2FuZHJvaWRfYWlkbF90ZXN0c19MaXN0T2ZJbnRlcmZhY2VzX0lNeUludGVyZmFjZV9vblRyYW5zYWN0KEFJQmluZGVyKiBfYWlkbF9iaW5kZXIsIHRyYW5zYWN0aW9uX2NvZGVfdCBfYWlkbF9jb2RlLCBjb25zdCBBUGFyY2VsKiBfYWlkbF9pbiwgQVBhcmNlbCogX2FpZGxfb3V0KSB7CisgICh2b2lkKV9haWRsX2luOworICAodm9pZClfYWlkbF9vdXQ7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT047CisgIHN0ZDo6c2hhcmVkX3B0cjxMaXN0T2ZJbnRlcmZhY2VzOjpCbk15SW50ZXJmYWNlPiBfYWlkbF9pbXBsID0gc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PExpc3RPZkludGVyZmFjZXM6OkJuTXlJbnRlcmZhY2U+KDo6bmRrOjpJQ0ludGVyZmFjZTo6YXNJbnRlcmZhY2UoX2FpZGxfYmluZGVyKSk7CisgIHN3aXRjaCAoX2FpZGxfY29kZSkgeworICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAwIC8qbWV0aG9kV2l0aEludGVyZmFjZXMqLyk6IHsKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+IGluX2lmYWNlOworICAgICAgc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4gaW5fbnVsbGFibGVfaWZhY2U7CisgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4gaW5faWZhY2VfbGlzdF9pbjsKKyAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+PiBvdXRfaWZhY2VfbGlzdF9vdXQ7CisgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4gaW5faWZhY2VfbGlzdF9pbm91dDsKKyAgICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PiBpbl9udWxsYWJsZV9pZmFjZV9saXN0X2luOworICAgICAgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+IG91dF9udWxsYWJsZV9pZmFjZV9saXN0X291dDsKKyAgICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PiBpbl9udWxsYWJsZV9pZmFjZV9saXN0X2lub3V0OworICAgICAgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+IF9haWRsX3JldHVybjsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX2luLCAmaW5faWZhY2UpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfaW4sICZpbl9udWxsYWJsZV9pZmFjZSk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfaW4sICZpbl9pZmFjZV9saXN0X2luKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9pbiwgJmluX2lmYWNlX2xpc3RfaW5vdXQpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfaW4sICZpbl9udWxsYWJsZV9pZmFjZV9saXN0X2luKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX2luLCAmaW5fbnVsbGFibGVfaWZhY2VfbGlzdF9pbm91dCk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXMgPSBfYWlkbF9pbXBsLT5tZXRob2RXaXRoSW50ZXJmYWNlcyhpbl9pZmFjZSwgaW5fbnVsbGFibGVfaWZhY2UsIGluX2lmYWNlX2xpc3RfaW4sICZvdXRfaWZhY2VfbGlzdF9vdXQsICZpbl9pZmFjZV9saXN0X2lub3V0LCBpbl9udWxsYWJsZV9pZmFjZV9saXN0X2luLCAmb3V0X251bGxhYmxlX2lmYWNlX2xpc3Rfb3V0LCAmaW5fbnVsbGFibGVfaWZhY2VfbGlzdF9pbm91dCwgJl9haWRsX3JldHVybik7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZVN0YXR1c0hlYWRlcihfYWlkbF9vdXQsIF9haWRsX3N0YXR1cy5nZXQoKSk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBicmVhazsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBvdXRfaWZhY2VfbGlzdF9vdXQpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIGluX2lmYWNlX2xpc3RfaW5vdXQpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX291dCwgb3V0X251bGxhYmxlX2lmYWNlX2xpc3Rfb3V0KTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9vdXQsIGluX251bGxhYmxlX2lmYWNlX2xpc3RfaW5vdXQpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorCitzdGF0aWMgQUlCaW5kZXJfQ2xhc3MqIF9nX2FpZGxfYW5kcm9pZF9haWRsX3Rlc3RzX0xpc3RPZkludGVyZmFjZXNfSU15SW50ZXJmYWNlX2NsYXp6ID0gOjpuZGs6OklDSW50ZXJmYWNlOjpkZWZpbmVDbGFzcyhMaXN0T2ZJbnRlcmZhY2VzOjpJTXlJbnRlcmZhY2U6OmRlc2NyaXB0b3IsIF9haWRsX2FuZHJvaWRfYWlkbF90ZXN0c19MaXN0T2ZJbnRlcmZhY2VzX0lNeUludGVyZmFjZV9vblRyYW5zYWN0KTsKKworTGlzdE9mSW50ZXJmYWNlczo6QnBNeUludGVyZmFjZTo6QnBNeUludGVyZmFjZShjb25zdCA6Om5kazo6U3BBSUJpbmRlciYgYmluZGVyKSA6IEJwQ0ludGVyZmFjZShiaW5kZXIpIHt9CitMaXN0T2ZJbnRlcmZhY2VzOjpCcE15SW50ZXJmYWNlOjp+QnBNeUludGVyZmFjZSgpIHt9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIExpc3RPZkludGVyZmFjZXM6OkJwTXlJbnRlcmZhY2U6Om1ldGhvZFdpdGhJbnRlcmZhY2VzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+JiBpbl9pZmFjZSwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4mIGluX251bGxhYmxlX2lmYWNlLCBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4mIGluX2lmYWNlX2xpc3RfaW4sIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Piogb3V0X2lmYWNlX2xpc3Rfb3V0LCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4qIGluX2lmYWNlX2xpc3RfaW5vdXQsIGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PiYgaW5fbnVsbGFibGVfaWZhY2VfbGlzdF9pbiwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+KiBvdXRfbnVsbGFibGVfaWZhY2VfbGlzdF9vdXQsIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PiogaW5fbnVsbGFibGVfaWZhY2VfbGlzdF9pbm91dCwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+KiBfYWlkbF9yZXR1cm4pIHsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBTVEFUVVNfT0s7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1czsKKyAgOjpuZGs6OlNjb3BlZEFQYXJjZWwgX2FpZGxfaW47CisgIDo6bmRrOjpTY29wZWRBUGFyY2VsIF9haWRsX291dDsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gQUlCaW5kZXJfcHJlcGFyZVRyYW5zYWN0aW9uKGFzQmluZGVyKCkuZ2V0KCksIF9haWRsX2luLmdldFIoKSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX2luLmdldCgpLCBpbl9pZmFjZSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX251bGxhYmxlX2lmYWNlKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX2lmYWNlX2xpc3RfaW4pOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgKmluX2lmYWNlX2xpc3RfaW5vdXQpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX2luLmdldCgpLCBpbl9udWxsYWJsZV9pZmFjZV9saXN0X2luKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9pbi5nZXQoKSwgKmluX251bGxhYmxlX2lmYWNlX2xpc3RfaW5vdXQpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KAorICAgIGFzQmluZGVyKCkuZ2V0KCksCisgICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAwIC8qbWV0aG9kV2l0aEludGVyZmFjZXMqLyksCisgICAgX2FpZGxfaW4uZ2V0UigpLAorICAgIF9haWRsX291dC5nZXRSKCksCisgICAgMAorICAgICNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgICB8IEZMQUdfUFJJVkFURV9MT0NBTAorICAgICNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgICAgKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgPT0gU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT04gJiYgSU15SW50ZXJmYWNlOjpnZXREZWZhdWx0SW1wbCgpKSB7CisgICAgX2FpZGxfc3RhdHVzID0gSU15SW50ZXJmYWNlOjpnZXREZWZhdWx0SW1wbCgpLT5tZXRob2RXaXRoSW50ZXJmYWNlcyhpbl9pZmFjZSwgaW5fbnVsbGFibGVfaWZhY2UsIGluX2lmYWNlX2xpc3RfaW4sIG91dF9pZmFjZV9saXN0X291dCwgaW5faWZhY2VfbGlzdF9pbm91dCwgaW5fbnVsbGFibGVfaWZhY2VfbGlzdF9pbiwgb3V0X251bGxhYmxlX2lmYWNlX2xpc3Rfb3V0LCBpbl9udWxsYWJsZV9pZmFjZV9saXN0X2lub3V0LCBfYWlkbF9yZXR1cm4pOworICAgIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKKyAgfQorICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZFN0YXR1c0hlYWRlcihfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3N0YXR1cy5nZXRSKCkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBvdXRfaWZhY2VfbGlzdF9vdXQpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgaW5faWZhY2VfbGlzdF9pbm91dCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9vdXQuZ2V0KCksIG91dF9udWxsYWJsZV9pZmFjZV9saXN0X291dCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9vdXQuZ2V0KCksIGluX251bGxhYmxlX2lmYWNlX2xpc3RfaW5vdXQpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfZXJyb3I6CisgIF9haWRsX3N0YXR1cy5zZXQoQVN0YXR1c19mcm9tU3RhdHVzKF9haWRsX3JldF9zdGF0dXMpKTsKKyAgX2FpZGxfc3RhdHVzX3JldHVybjoKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKy8vIFNvdXJjZSBmb3IgQm5NeUludGVyZmFjZQorTGlzdE9mSW50ZXJmYWNlczo6Qm5NeUludGVyZmFjZTo6Qm5NeUludGVyZmFjZSgpIHt9CitMaXN0T2ZJbnRlcmZhY2VzOjpCbk15SW50ZXJmYWNlOjp+Qm5NeUludGVyZmFjZSgpIHt9Cis6Om5kazo6U3BBSUJpbmRlciBMaXN0T2ZJbnRlcmZhY2VzOjpCbk15SW50ZXJmYWNlOjpjcmVhdGVCaW5kZXIoKSB7CisgIEFJQmluZGVyKiBiaW5kZXIgPSBBSUJpbmRlcl9uZXcoX2dfYWlkbF9hbmRyb2lkX2FpZGxfdGVzdHNfTGlzdE9mSW50ZXJmYWNlc19JTXlJbnRlcmZhY2VfY2xhenosIHN0YXRpY19jYXN0PHZvaWQqPih0aGlzKSk7CisgICNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgQUlCaW5kZXJfbWFya0NvbXBpbGF0aW9uVW5pdFN0YWJpbGl0eShiaW5kZXIpOworICAjZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICByZXR1cm4gOjpuZGs6OlNwQUlCaW5kZXIoYmluZGVyKTsKK30KKy8vIFNvdXJjZSBmb3IgSU15SW50ZXJmYWNlCitjb25zdCBjaGFyKiBMaXN0T2ZJbnRlcmZhY2VzOjpJTXlJbnRlcmZhY2U6OmRlc2NyaXB0b3IgPSAiYW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSU15SW50ZXJmYWNlIjsKK0xpc3RPZkludGVyZmFjZXM6OklNeUludGVyZmFjZTo6SU15SW50ZXJmYWNlKCkge30KK0xpc3RPZkludGVyZmFjZXM6OklNeUludGVyZmFjZTo6fklNeUludGVyZmFjZSgpIHt9CisKKworc3RkOjpzaGFyZWRfcHRyPExpc3RPZkludGVyZmFjZXM6OklNeUludGVyZmFjZT4gTGlzdE9mSW50ZXJmYWNlczo6SU15SW50ZXJmYWNlOjpmcm9tQmluZGVyKGNvbnN0IDo6bmRrOjpTcEFJQmluZGVyJiBiaW5kZXIpIHsKKyAgaWYgKCFBSUJpbmRlcl9hc3NvY2lhdGVDbGFzcyhiaW5kZXIuZ2V0KCksIF9nX2FpZGxfYW5kcm9pZF9haWRsX3Rlc3RzX0xpc3RPZkludGVyZmFjZXNfSU15SW50ZXJmYWNlX2NsYXp6KSkgeyByZXR1cm4gbnVsbHB0cjsgfQorICBzdGQ6OnNoYXJlZF9wdHI8OjpuZGs6OklDSW50ZXJmYWNlPiBpbnRlcmZhY2UgPSA6Om5kazo6SUNJbnRlcmZhY2U6OmFzSW50ZXJmYWNlKGJpbmRlci5nZXQoKSk7CisgIGlmIChpbnRlcmZhY2UpIHsKKyAgICByZXR1cm4gc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PElNeUludGVyZmFjZT4oaW50ZXJmYWNlKTsKKyAgfQorICByZXR1cm4gOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8TGlzdE9mSW50ZXJmYWNlczo6QnBNeUludGVyZmFjZT4oYmluZGVyKTsKK30KKworYmluZGVyX3N0YXR1c190IExpc3RPZkludGVyZmFjZXM6OklNeUludGVyZmFjZTo6d3JpdGVUb1BhcmNlbChBUGFyY2VsKiBwYXJjZWwsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJTXlJbnRlcmZhY2U+JiBpbnN0YW5jZSkgeworICByZXR1cm4gQVBhcmNlbF93cml0ZVN0cm9uZ0JpbmRlcihwYXJjZWwsIGluc3RhbmNlID8gaW5zdGFuY2UtPmFzQmluZGVyKCkuZ2V0KCkgOiBudWxscHRyKTsKK30KK2JpbmRlcl9zdGF0dXNfdCBMaXN0T2ZJbnRlcmZhY2VzOjpJTXlJbnRlcmZhY2U6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIHBhcmNlbCwgc3RkOjpzaGFyZWRfcHRyPElNeUludGVyZmFjZT4qIGluc3RhbmNlKSB7CisgIDo6bmRrOjpTcEFJQmluZGVyIGJpbmRlcjsKKyAgYmluZGVyX3N0YXR1c190IHN0YXR1cyA9IEFQYXJjZWxfcmVhZFN0cm9uZ0JpbmRlcihwYXJjZWwsIGJpbmRlci5nZXRSKCkpOworICBpZiAoc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIHN0YXR1czsKKyAgKmluc3RhbmNlID0gSU15SW50ZXJmYWNlOjpmcm9tQmluZGVyKGJpbmRlcik7CisgIHJldHVybiBTVEFUVVNfT0s7Cit9Citib29sIExpc3RPZkludGVyZmFjZXM6OklNeUludGVyZmFjZTo6c2V0RGVmYXVsdEltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElNeUludGVyZmFjZT4mIGltcGwpIHsKKyAgLy8gT25seSBvbmUgdXNlciBvZiB0aGlzIGludGVyZmFjZSBjYW4gdXNlIHRoaXMgZnVuY3Rpb24KKyAgLy8gYXQgYSB0aW1lLiBUaGlzIGlzIGEgaGV1cmlzdGljIHRvIGRldGVjdCBpZiB0d28gZGlmZmVyZW50CisgIC8vIHVzZXJzIGluIHRoZSBzYW1lIHByb2Nlc3MgdXNlIHRoaXMgZnVuY3Rpb24uCisgIGFzc2VydCghSU15SW50ZXJmYWNlOjpkZWZhdWx0X2ltcGwpOworICBpZiAoaW1wbCkgeworICAgIElNeUludGVyZmFjZTo6ZGVmYXVsdF9pbXBsID0gaW1wbDsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9Citjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TGlzdE9mSW50ZXJmYWNlczo6SU15SW50ZXJmYWNlPiYgTGlzdE9mSW50ZXJmYWNlczo6SU15SW50ZXJmYWNlOjpnZXREZWZhdWx0SW1wbCgpIHsKKyAgcmV0dXJuIElNeUludGVyZmFjZTo6ZGVmYXVsdF9pbXBsOworfQorc3RkOjpzaGFyZWRfcHRyPExpc3RPZkludGVyZmFjZXM6OklNeUludGVyZmFjZT4gTGlzdE9mSW50ZXJmYWNlczo6SU15SW50ZXJmYWNlOjpkZWZhdWx0X2ltcGwgPSBudWxscHRyOworOjpuZGs6OlNjb3BlZEFTdGF0dXMgTGlzdE9mSW50ZXJmYWNlczo6SU15SW50ZXJmYWNlRGVmYXVsdDo6bWV0aG9kV2l0aEludGVyZmFjZXMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4mIC8qaW5faWZhY2UqLywgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4mIC8qaW5fbnVsbGFibGVfaWZhY2UqLywgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+JiAvKmluX2lmYWNlX2xpc3RfaW4qLywgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+KiAvKm91dF9pZmFjZV9saXN0X291dCovLCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4qIC8qaW5faWZhY2VfbGlzdF9pbm91dCovLCBjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4mIC8qaW5fbnVsbGFibGVfaWZhY2VfbGlzdF9pbiovLCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4qIC8qb3V0X251bGxhYmxlX2lmYWNlX2xpc3Rfb3V0Ki8sIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PiogLyppbl9udWxsYWJsZV9pZmFjZV9saXN0X2lub3V0Ki8sIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PiogLypfYWlkbF9yZXR1cm4qLykgeworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIF9haWRsX3N0YXR1cy5zZXQoQVN0YXR1c19mcm9tU3RhdHVzKFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OKSk7CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9Cis6Om5kazo6U3BBSUJpbmRlciBMaXN0T2ZJbnRlcmZhY2VzOjpJTXlJbnRlcmZhY2VEZWZhdWx0Ojphc0JpbmRlcigpIHsKKyAgcmV0dXJuIDo6bmRrOjpTcEFJQmluZGVyKCk7Cit9Citib29sIExpc3RPZkludGVyZmFjZXM6OklNeUludGVyZmFjZURlZmF1bHQ6OmlzUmVtb3RlKCkgeworICByZXR1cm4gZmFsc2U7Cit9Cit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7Citjb25zdCBjaGFyKiBMaXN0T2ZJbnRlcmZhY2VzOjpNeVBhcmNlbGFibGU6OmRlc2NyaXB0b3IgPSAiYW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuTXlQYXJjZWxhYmxlIjsKKworYmluZGVyX3N0YXR1c190IExpc3RPZkludGVyZmFjZXM6Ok15UGFyY2VsYWJsZTo6cmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogX2FpZGxfcGFyY2VsKSB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX09LOworICBpbnQzMl90IF9haWRsX3N0YXJ0X3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIGludDMyX3QgX2FpZGxfcGFyY2VsYWJsZV9zaXplID0gMDsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyKF9haWRsX3BhcmNlbCwgJl9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKF9haWRsX3BhcmNlbGFibGVfc2l6ZSA8IDQpIHJldHVybiBTVEFUVVNfQkFEX1ZBTFVFOworICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gSU5UMzJfTUFYIC0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTsKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZpZmFjZSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgJm51bGxhYmxlX2lmYWNlKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmlmYWNlX2xpc3QpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsICZudWxsYWJsZV9pZmFjZV9saXN0KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorYmluZGVyX3N0YXR1c190IExpc3RPZkludGVyZmFjZXM6Ok15UGFyY2VsYWJsZTo6d3JpdGVUb1BhcmNlbChBUGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IHsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXM7CisgIHNpemVfdCBfYWlkbF9zdGFydF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpOworICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDMyKF9haWRsX3BhcmNlbCwgMCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGlmYWNlKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCBudWxsYWJsZV9pZmFjZSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGlmYWNlX2xpc3QpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsIG51bGxhYmxlX2lmYWNlX2xpc3QpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIHNpemVfdCBfYWlkbF9lbmRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKTsKKyAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MpOworICBBUGFyY2VsX3dyaXRlSW50MzIoX2FpZGxfcGFyY2VsLCBfYWlkbF9lbmRfcG9zIC0gX2FpZGxfc3RhcnRfcG9zKTsKKyAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9lbmRfcG9zKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK2NvbnN0IGNoYXIqIExpc3RPZkludGVyZmFjZXM6Ok15VW5pb246OmRlc2NyaXB0b3IgPSAiYW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuTXlVbmlvbiI7CisKK2JpbmRlcl9zdGF0dXNfdCBMaXN0T2ZJbnRlcmZhY2VzOjpNeVVuaW9uOjpyZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBfcGFyY2VsKSB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzOworICBpbnQzMl90IF9haWRsX3RhZzsKKyAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX3BhcmNlbCwgJl9haWRsX3RhZykpICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIHN3aXRjaCAoc3RhdGljX2Nhc3Q8VGFnPihfYWlkbF90YWcpKSB7CisgIGNhc2UgaWZhY2U6IHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPiBfYWlkbF92YWx1ZTsKKyAgICBpZiAoKF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfcGFyY2VsLCAmX2FpZGxfdmFsdWUpKSAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICAgIGlmIGNvbnN0ZXhwciAoc3RkOjppc190cml2aWFsbHlfY29weWFibGVfdjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4pIHsKKyAgICAgIHNldDxpZmFjZT4oX2FpZGxfdmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBOT0xJTlRORVhUTElORShwZXJmb3JtYW5jZS1tb3ZlLWNvbnN0LWFyZykKKyAgICAgIHNldDxpZmFjZT4oc3RkOjptb3ZlKF9haWRsX3ZhbHVlKSk7CisgICAgfQorICAgIHJldHVybiBTVEFUVVNfT0s7IH0KKyAgY2FzZSBudWxsYWJsZV9pZmFjZTogeworICAgIHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+IF9haWRsX3ZhbHVlOworICAgIGlmICgoX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX3BhcmNlbCwgJl9haWRsX3ZhbHVlKSkgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgICBpZiBjb25zdGV4cHIgKHN0ZDo6aXNfdHJpdmlhbGx5X2NvcHlhYmxlX3Y8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+KSB7CisgICAgICBzZXQ8bnVsbGFibGVfaWZhY2U+KF9haWRsX3ZhbHVlKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gTk9MSU5UTkVYVExJTkUocGVyZm9ybWFuY2UtbW92ZS1jb25zdC1hcmcpCisgICAgICBzZXQ8bnVsbGFibGVfaWZhY2U+KHN0ZDo6bW92ZShfYWlkbF92YWx1ZSkpOworICAgIH0KKyAgICByZXR1cm4gU1RBVFVTX09LOyB9CisgIGNhc2UgaWZhY2VfbGlzdDogeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+PiBfYWlkbF92YWx1ZTsKKyAgICBpZiAoKF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfcGFyY2VsLCAmX2FpZGxfdmFsdWUpKSAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICAgIGlmIGNvbnN0ZXhwciAoc3RkOjppc190cml2aWFsbHlfY29weWFibGVfdjxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+KSB7CisgICAgICBzZXQ8aWZhY2VfbGlzdD4oX2FpZGxfdmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBOT0xJTlRORVhUTElORShwZXJmb3JtYW5jZS1tb3ZlLWNvbnN0LWFyZykKKyAgICAgIHNldDxpZmFjZV9saXN0PihzdGQ6Om1vdmUoX2FpZGxfdmFsdWUpKTsKKyAgICB9CisgICAgcmV0dXJuIFNUQVRVU19PSzsgfQorICBjYXNlIG51bGxhYmxlX2lmYWNlX2xpc3Q6IHsKKyAgICBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4gX2FpZGxfdmFsdWU7CisgICAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfcGFyY2VsLCAmX2FpZGxfdmFsdWUpKSAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICAgIGlmIGNvbnN0ZXhwciAoc3RkOjppc190cml2aWFsbHlfY29weWFibGVfdjxzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4+KSB7CisgICAgICBzZXQ8bnVsbGFibGVfaWZhY2VfbGlzdD4oX2FpZGxfdmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBOT0xJTlRORVhUTElORShwZXJmb3JtYW5jZS1tb3ZlLWNvbnN0LWFyZykKKyAgICAgIHNldDxudWxsYWJsZV9pZmFjZV9saXN0PihzdGQ6Om1vdmUoX2FpZGxfdmFsdWUpKTsKKyAgICB9CisgICAgcmV0dXJuIFNUQVRVU19PSzsgfQorICB9CisgIHJldHVybiBTVEFUVVNfQkFEX1ZBTFVFOworfQorYmluZGVyX3N0YXR1c190IExpc3RPZkludGVyZmFjZXM6Ok15VW5pb246OndyaXRlVG9QYXJjZWwoQVBhcmNlbCogX3BhcmNlbCkgY29uc3QgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfcGFyY2VsLCBzdGF0aWNfY2FzdDxpbnQzMl90PihnZXRUYWcoKSkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICBzd2l0Y2ggKGdldFRhZygpKSB7CisgIGNhc2UgaWZhY2U6IHJldHVybiA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX3BhcmNlbCwgZ2V0PGlmYWNlPigpKTsKKyAgY2FzZSBudWxsYWJsZV9pZmFjZTogcmV0dXJuIDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9wYXJjZWwsIGdldDxudWxsYWJsZV9pZmFjZT4oKSk7CisgIGNhc2UgaWZhY2VfbGlzdDogcmV0dXJuIDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfcGFyY2VsLCBnZXQ8aWZhY2VfbGlzdD4oKSk7CisgIGNhc2UgbnVsbGFibGVfaWZhY2VfbGlzdDogcmV0dXJuIDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9wYXJjZWwsIGdldDxudWxsYWJsZV9pZmFjZV9saXN0PigpKTsKKyAgfQorICBfX2Fzc2VydDIoX19GSUxFX18sIF9fTElORV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fLCAiY2FuJ3QgcmVhY2ggaGVyZSIpOworfQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvTGlzdE9mSW50ZXJmYWNlcy5jcHAuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvTGlzdE9mSW50ZXJmYWNlcy5jcHAuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWRhOGQxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9MaXN0T2ZJbnRlcmZhY2VzLmNwcC5kCkBAIC0wLDAgKzEsMiBAQAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0xpc3RPZkludGVyZmFjZXMuY3BwIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvTGlzdE9mSW50ZXJmYWNlcy5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0xvbmdFbnVtLmNwcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvTG9uZ0VudW0uY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0xvbmdFbnVtLmNwcApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9Mb25nRW51bS5jcHAKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvTG9uZ0VudW0uY3BwLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0xvbmdFbnVtLmNwcC5kCnNpbWlsYXJpdHkgaW5kZXggNjclCnJlbmFtZSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvTG9uZ0VudW0uY3BwLmQKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvTG9uZ0VudW0uY3BwLmQKaW5kZXggZjA3YjQxZC4uZTI2ODQ5ZSAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9Mb25nRW51bS5jcHAuZAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0xvbmdFbnVtLmNwcC5kCkBAIC0xLDIgKzEsMiBAQAotb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0xvbmdFbnVtLmNwcCA6IFwKK291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9Mb25nRW51bS5jcHAgOiBcCiAgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9Mb25nRW51bS5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL090aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nLmNwcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwODIzODUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL090aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nLmNwcApAQCAtMCwwICsxLDQ5IEBACisjaW5jbHVkZSAiYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmcuaCIKKworI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3BhcmNlbF91dGlscy5oPgorCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworY29uc3QgY2hhciogT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmc6OmRlc2NyaXB0b3IgPSAiYW5kcm9pZC5haWRsLnRlc3RzLk90aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nIjsKKworYmluZGVyX3N0YXR1c190IE90aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nOjpyZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBfYWlkbF9wYXJjZWwpIHsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBTVEFUVVNfT0s7CisgIGludDMyX3QgX2FpZGxfc3RhcnRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKTsKKyAgaW50MzJfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSAwOworICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzIoX2FpZGxfcGFyY2VsLCAmX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9zaXplIDwgNCkgcmV0dXJuIFNUQVRVU19CQURfVkFMVUU7CisgIGlmIChfYWlkbF9zdGFydF9wb3MgPiBJTlQzMl9NQVggLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybiBTVEFUVVNfQkFEX1ZBTFVFOworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmZpZWxkKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorYmluZGVyX3N0YXR1c190IE90aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nOjp3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1czsKKyAgc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIoX2FpZGxfcGFyY2VsLCAwKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgZmllbGQpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIHNpemVfdCBfYWlkbF9lbmRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKTsKKyAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MpOworICBBUGFyY2VsX3dyaXRlSW50MzIoX2FpZGxfcGFyY2VsLCBfYWlkbF9lbmRfcG9zIC0gX2FpZGxfc3RhcnRfcG9zKTsKKyAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9lbmRfcG9zKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9PdGhlclBhcmNlbGFibGVGb3JUb1N0cmluZy5jcHAuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmcuY3BwLmQKc2ltaWxhcml0eSBpbmRleCA2NCUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9PdGhlclBhcmNlbGFibGVGb3JUb1N0cmluZy5jcHAuZApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9PdGhlclBhcmNlbGFibGVGb3JUb1N0cmluZy5jcHAuZAppbmRleCA1MzE3OWNmLi5kODY4MmZmIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL090aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nLmNwcC5kCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmcuY3BwLmQKQEAgLTEsMiArMSwyIEBACi1vdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmcuY3BwIDogXAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL090aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nLmNwcCA6IFwKICAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL090aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvUGFyY2VsYWJsZUZvclRvU3RyaW5nLmNwcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvUGFyY2VsYWJsZUZvclRvU3RyaW5nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2FjMTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9QYXJjZWxhYmxlRm9yVG9TdHJpbmcuY3BwCkBAIC0wLDAgKzEsMjY5IEBACisjaW5jbHVkZSAiYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvUGFyY2VsYWJsZUZvclRvU3RyaW5nLmgiCisKKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wYXJjZWxfdXRpbHMuaD4KKworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK2NvbnN0IGNoYXIqIFBhcmNlbGFibGVGb3JUb1N0cmluZzo6ZGVzY3JpcHRvciA9ICJhbmRyb2lkLmFpZGwudGVzdHMuUGFyY2VsYWJsZUZvclRvU3RyaW5nIjsKKworYmluZGVyX3N0YXR1c190IFBhcmNlbGFibGVGb3JUb1N0cmluZzo6cmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogX2FpZGxfcGFyY2VsKSB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX09LOworICBpbnQzMl90IF9haWRsX3N0YXJ0X3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIGludDMyX3QgX2FpZGxfcGFyY2VsYWJsZV9zaXplID0gMDsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyKF9haWRsX3BhcmNlbCwgJl9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKF9haWRsX3BhcmNlbGFibGVfc2l6ZSA8IDQpIHJldHVybiBTVEFUVVNfQkFEX1ZBTFVFOworICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gSU5UMzJfTUFYIC0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTsKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZpbnRWYWx1ZSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZpbnRBcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZsb25nVmFsdWUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmbG9uZ0FycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmRvdWJsZVZhbHVlKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmRvdWJsZUFycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmZsb2F0VmFsdWUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmZmxvYXRBcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZieXRlVmFsdWUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmYnl0ZUFycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmJvb2xlYW5WYWx1ZSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZib29sZWFuQXJyYXkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmc3RyaW5nVmFsdWUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmc3RyaW5nQXJyYXkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmc3RyaW5nTGlzdCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZwYXJjZWxhYmxlVmFsdWUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmcGFyY2VsYWJsZUFycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmVudW1WYWx1ZSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZlbnVtQXJyYXkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmbnVsbEFycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJm51bGxMaXN0KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJnBhcmNlbGFibGVHZW5lcmljKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJnVuaW9uVmFsdWUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9CitiaW5kZXJfc3RhdHVzX3QgUGFyY2VsYWJsZUZvclRvU3RyaW5nOjp3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1czsKKyAgc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIoX2FpZGxfcGFyY2VsLCAwKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgaW50VmFsdWUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBpbnRBcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGxvbmdWYWx1ZSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGxvbmdBcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGRvdWJsZVZhbHVlKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgZG91YmxlQXJyYXkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBmbG9hdFZhbHVlKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgZmxvYXRBcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGJ5dGVWYWx1ZSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGJ5dGVBcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGJvb2xlYW5WYWx1ZSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGJvb2xlYW5BcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIHN0cmluZ1ZhbHVlKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgc3RyaW5nQXJyYXkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBzdHJpbmdMaXN0KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgcGFyY2VsYWJsZVZhbHVlKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgcGFyY2VsYWJsZUFycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgZW51bVZhbHVlKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgZW51bUFycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgbnVsbEFycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgbnVsbExpc3QpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBwYXJjZWxhYmxlR2VuZXJpYyk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIHVuaW9uVmFsdWUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIHNpemVfdCBfYWlkbF9lbmRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKTsKKyAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MpOworICBBUGFyY2VsX3dyaXRlSW50MzIoX2FpZGxfcGFyY2VsLCBfYWlkbF9lbmRfcG9zIC0gX2FpZGxfc3RhcnRfcG9zKTsKKyAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9lbmRfcG9zKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9QYXJjZWxhYmxlRm9yVG9TdHJpbmcuY3BwLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1BhcmNlbGFibGVGb3JUb1N0cmluZy5jcHAuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDY1NGRmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9QYXJjZWxhYmxlRm9yVG9TdHJpbmcuY3BwLmQKQEAgLTAsMCArMSwxMCBAQAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1BhcmNlbGFibGVGb3JUb1N0cmluZy5jcHAgOiBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9QYXJjZWxhYmxlRm9yVG9TdHJpbmcuYWlkbCBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9HZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGUuYWlkbCBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9JbnRFbnVtLmFpZGwgXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmcuYWlkbCBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5haWRsIFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL1VuaW9uLmFpZGwgXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvQnl0ZUVudW0uYWlkbCBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9Mb25nRW51bS5haWRsIFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0NvbnN0YW50RXhwcmVzc2lvbkVudW0uYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9SZWN1cnNpdmVMaXN0LmNwcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvUmVjdXJzaXZlTGlzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRhNDI4ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvUmVjdXJzaXZlTGlzdC5jcHAKQEAgLTAsMCArMSw1OSBAQAorI2luY2x1ZGUgImFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL1JlY3Vyc2l2ZUxpc3QuaCIKKworI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3BhcmNlbF91dGlscy5oPgorCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworY29uc3QgY2hhciogUmVjdXJzaXZlTGlzdDo6ZGVzY3JpcHRvciA9ICJhbmRyb2lkLmFpZGwudGVzdHMuUmVjdXJzaXZlTGlzdCI7CisKK2JpbmRlcl9zdGF0dXNfdCBSZWN1cnNpdmVMaXN0OjpyZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBfYWlkbF9wYXJjZWwpIHsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBTVEFUVVNfT0s7CisgIGludDMyX3QgX2FpZGxfc3RhcnRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKTsKKyAgaW50MzJfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSAwOworICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzIoX2FpZGxfcGFyY2VsLCAmX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9zaXplIDwgNCkgcmV0dXJuIFNUQVRVU19CQURfVkFMVUU7CisgIGlmIChfYWlkbF9zdGFydF9wb3MgPiBJTlQzMl9NQVggLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybiBTVEFUVVNfQkFEX1ZBTFVFOworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJnZhbHVlKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCAmbmV4dCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KK2JpbmRlcl9zdGF0dXNfdCBSZWN1cnNpdmVMaXN0Ojp3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1czsKKyAgc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIoX2FpZGxfcGFyY2VsLCAwKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgdmFsdWUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsIG5leHQpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIHNpemVfdCBfYWlkbF9lbmRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKTsKKyAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MpOworICBBUGFyY2VsX3dyaXRlSW50MzIoX2FpZGxfcGFyY2VsLCBfYWlkbF9lbmRfcG9zIC0gX2FpZGxfc3RhcnRfcG9zKTsKKyAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9lbmRfcG9zKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9SZWN1cnNpdmVMaXN0LmNwcC5kIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9SZWN1cnNpdmVMaXN0LmNwcC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0MTM5NjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1JlY3Vyc2l2ZUxpc3QuY3BwLmQKQEAgLTAsMCArMSwyIEBACitvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvUmVjdXJzaXZlTGlzdC5jcHAgOiBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9SZWN1cnNpdmVMaXN0LmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvU3RydWN0dXJlZFBhcmNlbGFibGUuY3BwIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE5OWU3MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvU3RydWN0dXJlZFBhcmNlbGFibGUuY3BwCkBAIC0wLDAgKzEsNjI0IEBACisjaW5jbHVkZSAiYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvU3RydWN0dXJlZFBhcmNlbGFibGUuaCIKKworI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3BhcmNlbF91dGlscy5oPgorCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworY29uc3QgY2hhciogU3RydWN0dXJlZFBhcmNlbGFibGU6OmRlc2NyaXB0b3IgPSAiYW5kcm9pZC5haWRsLnRlc3RzLlN0cnVjdHVyZWRQYXJjZWxhYmxlIjsKKworYmluZGVyX3N0YXR1c190IFN0cnVjdHVyZWRQYXJjZWxhYmxlOjpyZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBfYWlkbF9wYXJjZWwpIHsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBTVEFUVVNfT0s7CisgIGludDMyX3QgX2FpZGxfc3RhcnRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKTsKKyAgaW50MzJfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSAwOworICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzIoX2FpZGxfcGFyY2VsLCAmX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9zaXplIDwgNCkgcmV0dXJuIFNUQVRVU19CQURfVkFMVUU7CisgIGlmIChfYWlkbF9zdGFydF9wb3MgPiBJTlQzMl9NQVggLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybiBTVEFUVVNfQkFEX1ZBTFVFOworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJnNob3VsZENvbnRhaW5UaHJlZUZzKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmYpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmc2hvdWxkQmVKZXJyeSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZzaG91bGRCZUJ5dGVCYXIpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmc2hvdWxkQmVJbnRCYXIpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmc2hvdWxkQmVMb25nQmFyKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJnNob3VsZENvbnRhaW5Ud29CeXRlRm9vcyk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZzaG91bGRDb250YWluVHdvSW50Rm9vcyk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZzaG91bGRDb250YWluVHdvTG9uZ0Zvb3MpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmc3RyaW5nRGVmYXVsdHNUb0Zvbyk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZieXRlRGVmYXVsdHNUb0ZvdXIpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmaW50RGVmYXVsdHNUb0ZpdmUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmbG9uZ0RlZmF1bHRzVG9OZWdhdGl2ZVNldmVuKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmJvb2xlYW5EZWZhdWx0c1RvVHJ1ZSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZjaGFyRGVmYXVsdHNUb0MpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmZmxvYXREZWZhdWx0c1RvUGkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmZG91YmxlV2l0aERlZmF1bHQpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmYXJyYXlEZWZhdWx0c1RvMTIzKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmFycmF5RGVmYXVsdHNUb0VtcHR5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmJvb2xEZWZhdWx0KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmJ5dGVEZWZhdWx0KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmludERlZmF1bHQpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmbG9uZ0RlZmF1bHQpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmZmxvYXREZWZhdWx0KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmRvdWJsZURlZmF1bHQpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmY2hlY2tEb3VibGVGcm9tRmxvYXQpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmY2hlY2tTdHJpbmdBcnJheTEpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmY2hlY2tTdHJpbmdBcnJheTIpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmaW50MzJfbWluKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmludDMyX21heCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZpbnQ2NF9tYXgpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmaGV4SW50MzJfbmVnXzEpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsICZpYmluZGVyKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmVtcHR5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmludDhfMSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZpbnQzMl8xKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmludDY0XzEpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmaGV4SW50MzJfcG9zXzEpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmaGV4SW50NjRfcG9zXzEpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmY29uc3RfZXhwcnNfMSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZjb25zdF9leHByc18yKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmNvbnN0X2V4cHJzXzMpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmY29uc3RfZXhwcnNfNCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZjb25zdF9leHByc181KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmNvbnN0X2V4cHJzXzYpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmY29uc3RfZXhwcnNfNyk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZjb25zdF9leHByc184KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmNvbnN0X2V4cHJzXzkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmY29uc3RfZXhwcnNfMTApOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmYWRkU3RyaW5nMSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZhZGRTdHJpbmcyKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJnNob3VsZFNldEJpdDBBbmRCaXQyKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCAmdSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgJnNob3VsZEJlQ29uc3RTMSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZkZWZhdWx0V2l0aEZvbyk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KK2JpbmRlcl9zdGF0dXNfdCBTdHJ1Y3R1cmVkUGFyY2VsYWJsZTo6d3JpdGVUb1BhcmNlbChBUGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IHsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXM7CisgIHNpemVfdCBfYWlkbF9zdGFydF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpOworICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDMyKF9haWRsX3BhcmNlbCwgMCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIHNob3VsZENvbnRhaW5UaHJlZUZzKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgZik7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIHNob3VsZEJlSmVycnkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBzaG91bGRCZUJ5dGVCYXIpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBzaG91bGRCZUludEJhcik7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIHNob3VsZEJlTG9uZ0Jhcik7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIHNob3VsZENvbnRhaW5Ud29CeXRlRm9vcyk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIHNob3VsZENvbnRhaW5Ud29JbnRGb29zKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgc2hvdWxkQ29udGFpblR3b0xvbmdGb29zKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgc3RyaW5nRGVmYXVsdHNUb0Zvbyk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGJ5dGVEZWZhdWx0c1RvRm91cik7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGludERlZmF1bHRzVG9GaXZlKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgbG9uZ0RlZmF1bHRzVG9OZWdhdGl2ZVNldmVuKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgYm9vbGVhbkRlZmF1bHRzVG9UcnVlKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgY2hhckRlZmF1bHRzVG9DKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgZmxvYXREZWZhdWx0c1RvUGkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBkb3VibGVXaXRoRGVmYXVsdCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGFycmF5RGVmYXVsdHNUbzEyMyk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGFycmF5RGVmYXVsdHNUb0VtcHR5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgYm9vbERlZmF1bHQpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBieXRlRGVmYXVsdCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGludERlZmF1bHQpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBsb25nRGVmYXVsdCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGZsb2F0RGVmYXVsdCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGRvdWJsZURlZmF1bHQpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBjaGVja0RvdWJsZUZyb21GbG9hdCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGNoZWNrU3RyaW5nQXJyYXkxKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgY2hlY2tTdHJpbmdBcnJheTIpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBpbnQzMl9taW4pOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBpbnQzMl9tYXgpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBpbnQ2NF9tYXgpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBoZXhJbnQzMl9uZWdfMSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgaWJpbmRlcik7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGVtcHR5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgaW50OF8xKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgaW50MzJfMSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGludDY0XzEpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBoZXhJbnQzMl9wb3NfMSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGhleEludDY0X3Bvc18xKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgY29uc3RfZXhwcnNfMSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGNvbnN0X2V4cHJzXzIpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBjb25zdF9leHByc18zKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgY29uc3RfZXhwcnNfNCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGNvbnN0X2V4cHJzXzUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBjb25zdF9leHByc182KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgY29uc3RfZXhwcnNfNyk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGNvbnN0X2V4cHJzXzgpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBjb25zdF9leHByc185KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgY29uc3RfZXhwcnNfMTApOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBhZGRTdHJpbmcxKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgYWRkU3RyaW5nMik7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIHNob3VsZFNldEJpdDBBbmRCaXQyKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCB1KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCBzaG91bGRCZUNvbnN0UzEpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBkZWZhdWx0V2l0aEZvbyk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgc2l6ZV90IF9haWRsX2VuZF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpOworICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3Bvcyk7CisgIEFQYXJjZWxfd3JpdGVJbnQzMihfYWlkbF9wYXJjZWwsIF9haWRsX2VuZF9wb3MgLSBfYWlkbF9zdGFydF9wb3MpOworICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX2VuZF9wb3MpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KKworfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworY29uc3QgY2hhciogU3RydWN0dXJlZFBhcmNlbGFibGU6OkVtcHR5OjpkZXNjcmlwdG9yID0gImFuZHJvaWQuYWlkbC50ZXN0cy5TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5FbXB0eSI7CisKK2JpbmRlcl9zdGF0dXNfdCBTdHJ1Y3R1cmVkUGFyY2VsYWJsZTo6RW1wdHk6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIF9haWRsX3BhcmNlbCkgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19PSzsKKyAgaW50MzJfdCBfYWlkbF9zdGFydF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpOworICBpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IDA7CisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihfYWlkbF9wYXJjZWwsICZfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChfYWlkbF9wYXJjZWxhYmxlX3NpemUgPCA0KSByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTsKKyAgaWYgKF9haWRsX3N0YXJ0X3BvcyA+IElOVDMyX01BWCAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuIFNUQVRVU19CQURfVkFMVUU7CisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9CitiaW5kZXJfc3RhdHVzX3QgU3RydWN0dXJlZFBhcmNlbGFibGU6OkVtcHR5Ojp3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1czsKKyAgc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIoX2FpZGxfcGFyY2VsLCAwKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBzaXplX3QgX2FpZGxfZW5kX3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zKTsKKyAgQVBhcmNlbF93cml0ZUludDMyKF9haWRsX3BhcmNlbCwgX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfZW5kX3Bvcyk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvU3RydWN0dXJlZFBhcmNlbGFibGUuY3BwLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1N0cnVjdHVyZWRQYXJjZWxhYmxlLmNwcC5kCnNpbWlsYXJpdHkgaW5kZXggODYlCnJlbmFtZSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvU3RydWN0dXJlZFBhcmNlbGFibGUuY3BwLmQKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvU3RydWN0dXJlZFBhcmNlbGFibGUuY3BwLmQKaW5kZXggMWI5MDJlNi4uN2U3YmRmNyAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5jcHAuZAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1N0cnVjdHVyZWRQYXJjZWxhYmxlLmNwcC5kCkBAIC0xLDQgKzEsNCBAQAotb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1N0cnVjdHVyZWRQYXJjZWxhYmxlLmNwcCA6IFwKK291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5jcHAgOiBcCiAgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5haWRsIFwKICAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0J5dGVFbnVtLmFpZGwgXAogICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvQ29uc3RhbnRFeHByZXNzaW9uRW51bS5haWRsIFwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb24uY3BwIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9Vbmlvbi5jcHAKc2ltaWxhcml0eSBpbmRleCA2NCUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9Vbmlvbi5jcHAKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb24uY3BwCmluZGV4IGE4MzhmZTAuLmE4OTg5YmMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb24uY3BwCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb24uY3BwCkBAIC0xMiwxMSArMTIsMTEgQEAKIGJpbmRlcl9zdGF0dXNfdCBVbmlvbjo6cmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogX3BhcmNlbCkgewogICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1czsKICAgaW50MzJfdCBfYWlkbF90YWc7Ci0gIGlmICgoX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyKF9wYXJjZWwsICZfYWlkbF90YWcpKSAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotICBzd2l0Y2ggKF9haWRsX3RhZykgeworICBpZiAoKF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfcGFyY2VsLCAmX2FpZGxfdGFnKSkgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgc3dpdGNoIChzdGF0aWNfY2FzdDxUYWc+KF9haWRsX3RhZykpIHsKICAgY2FzZSBuczogewogICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IF9haWRsX3ZhbHVlOwotICAgIGlmICgoX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX3BhcmNlbCwgJl9haWRsX3ZhbHVlKSkgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgICBpZiAoKF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfcGFyY2VsLCAmX2FpZGxfdmFsdWUpKSAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwogICAgIGlmIGNvbnN0ZXhwciAoc3RkOjppc190cml2aWFsbHlfY29weWFibGVfdjxzdGQ6OnZlY3RvcjxpbnQzMl90Pj4pIHsKICAgICAgIHNldDxucz4oX2FpZGxfdmFsdWUpOwogICAgIH0gZWxzZSB7CkBAIC0yNiw3ICsyNiw3IEBACiAgICAgcmV0dXJuIFNUQVRVU19PSzsgfQogICBjYXNlIG46IHsKICAgICBpbnQzMl90IF9haWRsX3ZhbHVlOwotICAgIGlmICgoX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyKF9wYXJjZWwsICZfYWlkbF92YWx1ZSkpICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgICAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX3BhcmNlbCwgJl9haWRsX3ZhbHVlKSkgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKICAgICBpZiBjb25zdGV4cHIgKHN0ZDo6aXNfdHJpdmlhbGx5X2NvcHlhYmxlX3Y8aW50MzJfdD4pIHsKICAgICAgIHNldDxuPihfYWlkbF92YWx1ZSk7CiAgICAgfSBlbHNlIHsKQEAgLTM2LDcgKzM2LDcgQEAKICAgICByZXR1cm4gU1RBVFVTX09LOyB9CiAgIGNhc2UgbTogewogICAgIGludDMyX3QgX2FpZGxfdmFsdWU7Ci0gICAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzIoX3BhcmNlbCwgJl9haWRsX3ZhbHVlKSkgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgICBpZiAoKF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfcGFyY2VsLCAmX2FpZGxfdmFsdWUpKSAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwogICAgIGlmIGNvbnN0ZXhwciAoc3RkOjppc190cml2aWFsbHlfY29weWFibGVfdjxpbnQzMl90PikgewogICAgICAgc2V0PG0+KF9haWRsX3ZhbHVlKTsKICAgICB9IGVsc2UgewpAQCAtNDYsNyArNDYsNyBAQAogICAgIHJldHVybiBTVEFUVVNfT0s7IH0KICAgY2FzZSBzOiB7CiAgICAgc3RkOjpzdHJpbmcgX2FpZGxfdmFsdWU7Ci0gICAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFN0cmluZyhfcGFyY2VsLCAmX2FpZGxfdmFsdWUpKSAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICAgIGlmICgoX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9wYXJjZWwsICZfYWlkbF92YWx1ZSkpICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CiAgICAgaWYgY29uc3RleHByIChzdGQ6OmlzX3RyaXZpYWxseV9jb3B5YWJsZV92PHN0ZDo6c3RyaW5nPikgewogICAgICAgc2V0PHM+KF9haWRsX3ZhbHVlKTsKICAgICB9IGVsc2UgewpAQCAtNTYsNyArNTYsNyBAQAogICAgIHJldHVybiBTVEFUVVNfT0s7IH0KICAgY2FzZSBpYmluZGVyOiB7CiAgICAgOjpuZGs6OlNwQUlCaW5kZXIgX2FpZGxfdmFsdWU7Ci0gICAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlU3Ryb25nQmluZGVyKF9wYXJjZWwsICZfYWlkbF92YWx1ZSkpICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgICAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfcGFyY2VsLCAmX2FpZGxfdmFsdWUpKSAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwogICAgIGlmIGNvbnN0ZXhwciAoc3RkOjppc190cml2aWFsbHlfY29weWFibGVfdjw6Om5kazo6U3BBSUJpbmRlcj4pIHsKICAgICAgIHNldDxpYmluZGVyPihfYWlkbF92YWx1ZSk7CiAgICAgfSBlbHNlIHsKQEAgLTY2LDcgKzY2LDcgQEAKICAgICByZXR1cm4gU1RBVFVTX09LOyB9CiAgIGNhc2Ugc3M6IHsKICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gX2FpZGxfdmFsdWU7Ci0gICAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihfcGFyY2VsLCAmX2FpZGxfdmFsdWUpKSAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICAgIGlmICgoX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9wYXJjZWwsICZfYWlkbF92YWx1ZSkpICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CiAgICAgaWYgY29uc3RleHByIChzdGQ6OmlzX3RyaXZpYWxseV9jb3B5YWJsZV92PHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPj4pIHsKICAgICAgIHNldDxzcz4oX2FpZGxfdmFsdWUpOwogICAgIH0gZWxzZSB7CkBAIC03Niw3ICs3Niw3IEBACiAgICAgcmV0dXJuIFNUQVRVU19PSzsgfQogICBjYXNlIGJlOiB7CiAgICAgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Qnl0ZUVudW0gX2FpZGxfdmFsdWU7Ci0gICAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkQnl0ZShfcGFyY2VsLCByZWludGVycHJldF9jYXN0PGludDhfdCo+KCZfYWlkbF92YWx1ZSkpKSAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICAgIGlmICgoX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9wYXJjZWwsICZfYWlkbF92YWx1ZSkpICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CiAgICAgaWYgY29uc3RleHByIChzdGQ6OmlzX3RyaXZpYWxseV9jb3B5YWJsZV92PDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJ5dGVFbnVtPikgewogICAgICAgc2V0PGJlPihfYWlkbF92YWx1ZSk7CiAgICAgfSBlbHNlIHsKQEAgLTg4LDE2ICs4OCwxNiBAQAogICByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTsKIH0KIGJpbmRlcl9zdGF0dXNfdCBVbmlvbjo6d3JpdGVUb1BhcmNlbChBUGFyY2VsKiBfcGFyY2VsKSBjb25zdCB7Ci0gIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDMyKF9wYXJjZWwsIGdldFRhZygpKTsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX3BhcmNlbCwgc3RhdGljX2Nhc3Q8aW50MzJfdD4oZ2V0VGFnKCkpKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKICAgc3dpdGNoIChnZXRUYWcoKSkgewotICBjYXNlIG5zOiByZXR1cm4gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX3BhcmNlbCwgZ2V0PG5zPigpKTsKLSAgY2FzZSBuOiByZXR1cm4gQVBhcmNlbF93cml0ZUludDMyKF9wYXJjZWwsIGdldDxuPigpKTsKLSAgY2FzZSBtOiByZXR1cm4gQVBhcmNlbF93cml0ZUludDMyKF9wYXJjZWwsIGdldDxtPigpKTsKLSAgY2FzZSBzOiByZXR1cm4gOjpuZGs6OkFQYXJjZWxfd3JpdGVTdHJpbmcoX3BhcmNlbCwgZ2V0PHM+KCkpOwotICBjYXNlIGliaW5kZXI6IHJldHVybiA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlU3Ryb25nQmluZGVyKF9wYXJjZWwsIGdldDxpYmluZGVyPigpKTsKLSAgY2FzZSBzczogcmV0dXJuIDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKF9wYXJjZWwsIGdldDxzcz4oKSk7Ci0gIGNhc2UgYmU6IHJldHVybiBBUGFyY2VsX3dyaXRlQnl0ZShfcGFyY2VsLCBzdGF0aWNfY2FzdDxpbnQ4X3Q+KGdldDxiZT4oKSkpOworICBjYXNlIG5zOiByZXR1cm4gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9wYXJjZWwsIGdldDxucz4oKSk7CisgIGNhc2UgbjogcmV0dXJuIDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfcGFyY2VsLCBnZXQ8bj4oKSk7CisgIGNhc2UgbTogcmV0dXJuIDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfcGFyY2VsLCBnZXQ8bT4oKSk7CisgIGNhc2UgczogcmV0dXJuIDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfcGFyY2VsLCBnZXQ8cz4oKSk7CisgIGNhc2UgaWJpbmRlcjogcmV0dXJuIDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9wYXJjZWwsIGdldDxpYmluZGVyPigpKTsKKyAgY2FzZSBzczogcmV0dXJuIDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfcGFyY2VsLCBnZXQ8c3M+KCkpOworICBjYXNlIGJlOiByZXR1cm4gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9wYXJjZWwsIGdldDxiZT4oKSk7CiAgIH0KICAgX19hc3NlcnQyKF9fRklMRV9fLCBfX0xJTkVfXywgX19QUkVUVFlfRlVOQ1RJT05fXywgImNhbid0IHJlYWNoIGhlcmUiKTsKIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb24uY3BwLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1VuaW9uLmNwcC5kCnNpbWlsYXJpdHkgaW5kZXggNzYlCnJlbmFtZSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb24uY3BwLmQKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb24uY3BwLmQKaW5kZXggMWJkZGM5MC4uMjg5MjE4MCAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9Vbmlvbi5jcHAuZAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1VuaW9uLmNwcC5kCkBAIC0xLDMgKzEsMyBAQAotb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1VuaW9uLmNwcCA6IFwKK291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9Vbmlvbi5jcHAgOiBcCiAgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9Vbmlvbi5haWRsIFwKICAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0J5dGVFbnVtLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb25XaXRoRmQuY3BwIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9VbmlvbldpdGhGZC5jcHAKc2ltaWxhcml0eSBpbmRleCA2NyUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9VbmlvbldpdGhGZC5jcHAKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb25XaXRoRmQuY3BwCmluZGV4IDE1M2NjMDYuLjFlZWZjM2UgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb25XaXRoRmQuY3BwCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb25XaXRoRmQuY3BwCkBAIC0xMSwxMSArMTEsMTEgQEAKIGJpbmRlcl9zdGF0dXNfdCBVbmlvbldpdGhGZDo6cmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogX3BhcmNlbCkgewogICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1czsKICAgaW50MzJfdCBfYWlkbF90YWc7Ci0gIGlmICgoX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyKF9wYXJjZWwsICZfYWlkbF90YWcpKSAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotICBzd2l0Y2ggKF9haWRsX3RhZykgeworICBpZiAoKF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfcGFyY2VsLCAmX2FpZGxfdGFnKSkgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgc3dpdGNoIChzdGF0aWNfY2FzdDxUYWc+KF9haWRsX3RhZykpIHsKICAgY2FzZSBudW06IHsKICAgICBpbnQzMl90IF9haWRsX3ZhbHVlOwotICAgIGlmICgoX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyKF9wYXJjZWwsICZfYWlkbF92YWx1ZSkpICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgICAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX3BhcmNlbCwgJl9haWRsX3ZhbHVlKSkgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKICAgICBpZiBjb25zdGV4cHIgKHN0ZDo6aXNfdHJpdmlhbGx5X2NvcHlhYmxlX3Y8aW50MzJfdD4pIHsKICAgICAgIHNldDxudW0+KF9haWRsX3ZhbHVlKTsKICAgICB9IGVsc2UgewpAQCAtMjUsNyArMjUsNyBAQAogICAgIHJldHVybiBTVEFUVVNfT0s7IH0KICAgY2FzZSBwZmQ6IHsKICAgICA6Om5kazo6U2NvcGVkRmlsZURlc2NyaXB0b3IgX2FpZGxfdmFsdWU7Ci0gICAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFJlcXVpcmVkUGFyY2VsRmlsZURlc2NyaXB0b3IoX3BhcmNlbCwgJl9haWRsX3ZhbHVlKSkgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgICBpZiAoKF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfcGFyY2VsLCAmX2FpZGxfdmFsdWUpKSAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwogICAgIGlmIGNvbnN0ZXhwciAoc3RkOjppc190cml2aWFsbHlfY29weWFibGVfdjw6Om5kazo6U2NvcGVkRmlsZURlc2NyaXB0b3I+KSB7CiAgICAgICBzZXQ8cGZkPihfYWlkbF92YWx1ZSk7CiAgICAgfSBlbHNlIHsKQEAgLTM3LDExICszNywxMSBAQAogICByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTsKIH0KIGJpbmRlcl9zdGF0dXNfdCBVbmlvbldpdGhGZDo6d3JpdGVUb1BhcmNlbChBUGFyY2VsKiBfcGFyY2VsKSBjb25zdCB7Ci0gIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDMyKF9wYXJjZWwsIGdldFRhZygpKTsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX3BhcmNlbCwgc3RhdGljX2Nhc3Q8aW50MzJfdD4oZ2V0VGFnKCkpKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKICAgc3dpdGNoIChnZXRUYWcoKSkgewotICBjYXNlIG51bTogcmV0dXJuIEFQYXJjZWxfd3JpdGVJbnQzMihfcGFyY2VsLCBnZXQ8bnVtPigpKTsKLSAgY2FzZSBwZmQ6IHJldHVybiA6Om5kazo6QVBhcmNlbF93cml0ZVJlcXVpcmVkUGFyY2VsRmlsZURlc2NyaXB0b3IoX3BhcmNlbCwgZ2V0PHBmZD4oKSk7CisgIGNhc2UgbnVtOiByZXR1cm4gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9wYXJjZWwsIGdldDxudW0+KCkpOworICBjYXNlIHBmZDogcmV0dXJuIDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfcGFyY2VsLCBnZXQ8cGZkPigpKTsKICAgfQogICBfX2Fzc2VydDIoX19GSUxFX18sIF9fTElORV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fLCAiY2FuJ3QgcmVhY2ggaGVyZSIpOwogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9VbmlvbldpdGhGZC5jcHAuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb25XaXRoRmQuY3BwLmQKc2ltaWxhcml0eSBpbmRleCA2NyUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9VbmlvbldpdGhGZC5jcHAuZApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9VbmlvbldpdGhGZC5jcHAuZAppbmRleCA1MjQ3YTc0Li5hNjk2YmM2IDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1VuaW9uV2l0aEZkLmNwcC5kCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb25XaXRoRmQuY3BwLmQKQEAgLTEsMiArMSwyIEBACi1vdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb25XaXRoRmQuY3BwIDogXAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1VuaW9uV2l0aEZkLmNwcCA6IFwKICAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL1VuaW9uV2l0aEZkLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0V4dGVuZGFibGVQYXJjZWxhYmxlLmNwcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0V4dGVuZGFibGVQYXJjZWxhYmxlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTgwM2JiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vRXh0ZW5kYWJsZVBhcmNlbGFibGUuY3BwCkBAIC0wLDAgKzEsOTEgQEAKKyNpbmNsdWRlICJhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vRXh0ZW5kYWJsZVBhcmNlbGFibGUuaCIKKworI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3BhcmNlbF91dGlscy5oPgorCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworbmFtZXNwYWNlIGV4dGVuc2lvbiB7Citjb25zdCBjaGFyKiBFeHRlbmRhYmxlUGFyY2VsYWJsZTo6ZGVzY3JpcHRvciA9ICJhbmRyb2lkLmFpZGwudGVzdHMuZXh0ZW5zaW9uLkV4dGVuZGFibGVQYXJjZWxhYmxlIjsKKworYmluZGVyX3N0YXR1c190IEV4dGVuZGFibGVQYXJjZWxhYmxlOjpyZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBfYWlkbF9wYXJjZWwpIHsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBTVEFUVVNfT0s7CisgIGludDMyX3QgX2FpZGxfc3RhcnRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKTsKKyAgaW50MzJfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSAwOworICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzIoX2FpZGxfcGFyY2VsLCAmX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9zaXplIDwgNCkgcmV0dXJuIFNUQVRVU19CQURfVkFMVUU7CisgIGlmIChfYWlkbF9zdGFydF9wb3MgPiBJTlQzMl9NQVggLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybiBTVEFUVVNfQkFEX1ZBTFVFOworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmEpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmYik7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZleHQpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmYyk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZleHQyKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorYmluZGVyX3N0YXR1c190IEV4dGVuZGFibGVQYXJjZWxhYmxlOjp3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1czsKKyAgc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIoX2FpZGxfcGFyY2VsLCAwKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgYSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGIpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBleHQpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBjKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgZXh0Mik7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgc2l6ZV90IF9haWRsX2VuZF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpOworICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3Bvcyk7CisgIEFQYXJjZWxfd3JpdGVJbnQzMihfYWlkbF9wYXJjZWwsIF9haWRsX2VuZF9wb3MgLSBfYWlkbF9zdGFydF9wb3MpOworICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX2VuZF9wb3MpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KKworfSAgLy8gbmFtZXNwYWNlIGV4dGVuc2lvbgorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9FeHRlbmRhYmxlUGFyY2VsYWJsZS5jcHAuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0V4dGVuZGFibGVQYXJjZWxhYmxlLmNwcC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYTFlNWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9FeHRlbmRhYmxlUGFyY2VsYWJsZS5jcHAuZApAQCAtMCwwICsxLDIgQEAKK291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vRXh0ZW5kYWJsZVBhcmNlbGFibGUuY3BwIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0V4dGVuZGFibGVQYXJjZWxhYmxlLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0LmNwcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjdlNTE5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQuY3BwCkBAIC0wLDAgKzEsNjEgQEAKKyNpbmNsdWRlICJhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQuaCIKKworI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3BhcmNlbF91dGlscy5oPgorCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworbmFtZXNwYWNlIGV4dGVuc2lvbiB7Citjb25zdCBjaGFyKiBNeUV4dDo6ZGVzY3JpcHRvciA9ICJhbmRyb2lkLmFpZGwudGVzdHMuZXh0ZW5zaW9uLk15RXh0IjsKKworYmluZGVyX3N0YXR1c190IE15RXh0OjpyZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBfYWlkbF9wYXJjZWwpIHsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBTVEFUVVNfT0s7CisgIGludDMyX3QgX2FpZGxfc3RhcnRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKTsKKyAgaW50MzJfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSAwOworICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzIoX2FpZGxfcGFyY2VsLCAmX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9zaXplIDwgNCkgcmV0dXJuIFNUQVRVU19CQURfVkFMVUU7CisgIGlmIChfYWlkbF9zdGFydF9wb3MgPiBJTlQzMl9NQVggLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybiBTVEFUVVNfQkFEX1ZBTFVFOworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmEpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmYik7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KK2JpbmRlcl9zdGF0dXNfdCBNeUV4dDo6d3JpdGVUb1BhcmNlbChBUGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IHsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXM7CisgIHNpemVfdCBfYWlkbF9zdGFydF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpOworICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDMyKF9haWRsX3BhcmNlbCwgMCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGEpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBiKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBzaXplX3QgX2FpZGxfZW5kX3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zKTsKKyAgQVBhcmNlbF93cml0ZUludDMyKF9haWRsX3BhcmNlbCwgX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfZW5kX3Bvcyk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorCit9ICAvLyBuYW1lc3BhY2UgZXh0ZW5zaW9uCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0LmNwcC5kIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQuY3BwLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE1ZWIwOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0LmNwcC5kCkBAIC0wLDAgKzEsMiBAQAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dC5jcHAgOiBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQuYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQyLmNwcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0Mi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYzMzM1NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0Mi5jcHAKQEAgLTAsMCArMSw3MSBAQAorI2luY2x1ZGUgImFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dDIuaCIKKworI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3BhcmNlbF91dGlscy5oPgorCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworbmFtZXNwYWNlIGV4dGVuc2lvbiB7Citjb25zdCBjaGFyKiBNeUV4dDI6OmRlc2NyaXB0b3IgPSAiYW5kcm9pZC5haWRsLnRlc3RzLmV4dGVuc2lvbi5NeUV4dDIiOworCitiaW5kZXJfc3RhdHVzX3QgTXlFeHQyOjpyZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBfYWlkbF9wYXJjZWwpIHsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBTVEFUVVNfT0s7CisgIGludDMyX3QgX2FpZGxfc3RhcnRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKTsKKyAgaW50MzJfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSAwOworICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzIoX2FpZGxfcGFyY2VsLCAmX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9zaXplIDwgNCkgcmV0dXJuIFNUQVRVU19CQURfVkFMVUU7CisgIGlmIChfYWlkbF9zdGFydF9wb3MgPiBJTlQzMl9NQVggLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybiBTVEFUVVNfQkFEX1ZBTFVFOworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmEpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmYik7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZjKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorYmluZGVyX3N0YXR1c190IE15RXh0Mjo6d3JpdGVUb1BhcmNlbChBUGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IHsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXM7CisgIHNpemVfdCBfYWlkbF9zdGFydF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpOworICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDMyKF9haWRsX3BhcmNlbCwgMCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGEpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBiKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgYyk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgc2l6ZV90IF9haWRsX2VuZF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpOworICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3Bvcyk7CisgIEFQYXJjZWxfd3JpdGVJbnQzMihfYWlkbF9wYXJjZWwsIF9haWRsX2VuZF9wb3MgLSBfYWlkbF9zdGFydF9wb3MpOworICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX2VuZF9wb3MpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KKworfSAgLy8gbmFtZXNwYWNlIGV4dGVuc2lvbgorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dDIuY3BwLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dDIuY3BwLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ2MDYyYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0Mi5jcHAuZApAQCAtMCwwICsxLDMgQEAKK291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQyLmNwcCA6IFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dDIuYWlkbCBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQuYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHRMaWtlLmNwcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0TGlrZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ3NTllYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0TGlrZS5jcHAKQEAgLTAsMCArMSw2MSBAQAorI2luY2x1ZGUgImFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dExpa2UuaCIKKworI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3BhcmNlbF91dGlscy5oPgorCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworbmFtZXNwYWNlIGV4dGVuc2lvbiB7Citjb25zdCBjaGFyKiBNeUV4dExpa2U6OmRlc2NyaXB0b3IgPSAiYW5kcm9pZC5haWRsLnRlc3RzLmV4dGVuc2lvbi5NeUV4dExpa2UiOworCitiaW5kZXJfc3RhdHVzX3QgTXlFeHRMaWtlOjpyZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBfYWlkbF9wYXJjZWwpIHsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBTVEFUVVNfT0s7CisgIGludDMyX3QgX2FpZGxfc3RhcnRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKTsKKyAgaW50MzJfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSAwOworICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzIoX2FpZGxfcGFyY2VsLCAmX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9zaXplIDwgNCkgcmV0dXJuIFNUQVRVU19CQURfVkFMVUU7CisgIGlmIChfYWlkbF9zdGFydF9wb3MgPiBJTlQzMl9NQVggLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybiBTVEFUVVNfQkFEX1ZBTFVFOworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmEpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmYik7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KK2JpbmRlcl9zdGF0dXNfdCBNeUV4dExpa2U6OndyaXRlVG9QYXJjZWwoQVBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzOworICBzaXplX3QgX2FpZGxfc3RhcnRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQzMihfYWlkbF9wYXJjZWwsIDApOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBhKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgYik7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgc2l6ZV90IF9haWRsX2VuZF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpOworICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3Bvcyk7CisgIEFQYXJjZWxfd3JpdGVJbnQzMihfYWlkbF9wYXJjZWwsIF9haWRsX2VuZF9wb3MgLSBfYWlkbF9zdGFydF9wb3MpOworICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX2VuZF9wb3MpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KKworfSAgLy8gbmFtZXNwYWNlIGV4dGVuc2lvbgorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dExpa2UuY3BwLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dExpa2UuY3BwLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTEyMjkyZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0TGlrZS5jcHAuZApAQCAtMCwwICsxLDIgQEAKK291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHRMaWtlLmNwcCA6IFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dExpa2UuYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvRGVlcGx5TmVzdGVkLmNwcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0RlZXBseU5lc3RlZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMyNDNhOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0RlZXBseU5lc3RlZC5jcHAKQEAgLTAsMCArMSwxOTkgQEAKKyNpbmNsdWRlICJhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvRGVlcGx5TmVzdGVkLmgiCisKKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wYXJjZWxfdXRpbHMuaD4KKworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK25hbWVzcGFjZSBuZXN0ZWQgeworY29uc3QgY2hhciogRGVlcGx5TmVzdGVkOjpkZXNjcmlwdG9yID0gImFuZHJvaWQuYWlkbC50ZXN0cy5uZXN0ZWQuRGVlcGx5TmVzdGVkIjsKKworYmluZGVyX3N0YXR1c190IERlZXBseU5lc3RlZDo6cmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogX2FpZGxfcGFyY2VsKSB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX09LOworICBpbnQzMl90IF9haWRsX3N0YXJ0X3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIGludDMyX3QgX2FpZGxfcGFyY2VsYWJsZV9zaXplID0gMDsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyKF9haWRsX3BhcmNlbCwgJl9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKF9haWRsX3BhcmNlbGFibGVfc2l6ZSA8IDQpIHJldHVybiBTVEFUVVNfQkFEX1ZBTFVFOworICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gSU5UMzJfTUFYIC0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTsKKyAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KK2JpbmRlcl9zdGF0dXNfdCBEZWVwbHlOZXN0ZWQ6OndyaXRlVG9QYXJjZWwoQVBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzOworICBzaXplX3QgX2FpZGxfc3RhcnRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQzMihfYWlkbF9wYXJjZWwsIDApOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIHNpemVfdCBfYWlkbF9lbmRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKTsKKyAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MpOworICBBUGFyY2VsX3dyaXRlSW50MzIoX2FpZGxfcGFyY2VsLCBfYWlkbF9lbmRfcG9zIC0gX2FpZGxfc3RhcnRfcG9zKTsKKyAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9lbmRfcG9zKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBuZXN0ZWQKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK25hbWVzcGFjZSBuZXN0ZWQgeworY29uc3QgY2hhciogRGVlcGx5TmVzdGVkOjpBOjpkZXNjcmlwdG9yID0gImFuZHJvaWQuYWlkbC50ZXN0cy5uZXN0ZWQuRGVlcGx5TmVzdGVkLkEiOworCitiaW5kZXJfc3RhdHVzX3QgRGVlcGx5TmVzdGVkOjpBOjpyZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBfYWlkbF9wYXJjZWwpIHsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBTVEFUVVNfT0s7CisgIGludDMyX3QgX2FpZGxfc3RhcnRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKTsKKyAgaW50MzJfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSAwOworICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzIoX2FpZGxfcGFyY2VsLCAmX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9zaXplIDwgNCkgcmV0dXJuIFNUQVRVU19CQURfVkFMVUU7CisgIGlmIChfYWlkbF9zdGFydF9wb3MgPiBJTlQzMl9NQVggLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybiBTVEFUVVNfQkFEX1ZBTFVFOworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9CitiaW5kZXJfc3RhdHVzX3QgRGVlcGx5TmVzdGVkOjpBOjp3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1czsKKyAgc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIoX2FpZGxfcGFyY2VsLCAwKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgZSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgc2l6ZV90IF9haWRsX2VuZF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpOworICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3Bvcyk7CisgIEFQYXJjZWxfd3JpdGVJbnQzMihfYWlkbF9wYXJjZWwsIF9haWRsX2VuZF9wb3MgLSBfYWlkbF9zdGFydF9wb3MpOworICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX2VuZF9wb3MpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KKworfSAgLy8gbmFtZXNwYWNlIG5lc3RlZAorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworbmFtZXNwYWNlIG5lc3RlZCB7Citjb25zdCBjaGFyKiBEZWVwbHlOZXN0ZWQ6OkI6OmRlc2NyaXB0b3IgPSAiYW5kcm9pZC5haWRsLnRlc3RzLm5lc3RlZC5EZWVwbHlOZXN0ZWQuQiI7CisKK2JpbmRlcl9zdGF0dXNfdCBEZWVwbHlOZXN0ZWQ6OkI6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIF9haWRsX3BhcmNlbCkgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19PSzsKKyAgaW50MzJfdCBfYWlkbF9zdGFydF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpOworICBpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IDA7CisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihfYWlkbF9wYXJjZWwsICZfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChfYWlkbF9wYXJjZWxhYmxlX3NpemUgPCA0KSByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTsKKyAgaWYgKF9haWRsX3N0YXJ0X3BvcyA+IElOVDMyX01BWCAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuIFNUQVRVU19CQURfVkFMVUU7CisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9CitiaW5kZXJfc3RhdHVzX3QgRGVlcGx5TmVzdGVkOjpCOjp3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1czsKKyAgc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIoX2FpZGxfcGFyY2VsLCAwKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBzaXplX3QgX2FpZGxfZW5kX3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zKTsKKyAgQVBhcmNlbF93cml0ZUludDMyKF9haWRsX3BhcmNlbCwgX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfZW5kX3Bvcyk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorCit9ICAvLyBuYW1lc3BhY2UgbmVzdGVkCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CituYW1lc3BhY2UgbmVzdGVkIHsKK2NvbnN0IGNoYXIqIERlZXBseU5lc3RlZDo6Qjo6Qzo6ZGVzY3JpcHRvciA9ICJhbmRyb2lkLmFpZGwudGVzdHMubmVzdGVkLkRlZXBseU5lc3RlZC5CLkMiOworCitiaW5kZXJfc3RhdHVzX3QgRGVlcGx5TmVzdGVkOjpCOjpDOjpyZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBfYWlkbF9wYXJjZWwpIHsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBTVEFUVVNfT0s7CisgIGludDMyX3QgX2FpZGxfc3RhcnRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKTsKKyAgaW50MzJfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSAwOworICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzIoX2FpZGxfcGFyY2VsLCAmX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9zaXplIDwgNCkgcmV0dXJuIFNUQVRVU19CQURfVkFMVUU7CisgIGlmIChfYWlkbF9zdGFydF9wb3MgPiBJTlQzMl9NQVggLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybiBTVEFUVVNfQkFEX1ZBTFVFOworICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorYmluZGVyX3N0YXR1c190IERlZXBseU5lc3RlZDo6Qjo6Qzo6d3JpdGVUb1BhcmNlbChBUGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IHsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXM7CisgIHNpemVfdCBfYWlkbF9zdGFydF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpOworICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDMyKF9haWRsX3BhcmNlbCwgMCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgc2l6ZV90IF9haWRsX2VuZF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpOworICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3Bvcyk7CisgIEFQYXJjZWxfd3JpdGVJbnQzMihfYWlkbF9wYXJjZWwsIF9haWRsX2VuZF9wb3MgLSBfYWlkbF9zdGFydF9wb3MpOworICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX2VuZF9wb3MpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KKworfSAgLy8gbmFtZXNwYWNlIG5lc3RlZAorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworbmFtZXNwYWNlIG5lc3RlZCB7Citjb25zdCBjaGFyKiBEZWVwbHlOZXN0ZWQ6OkI6OkM6OkQ6OmRlc2NyaXB0b3IgPSAiYW5kcm9pZC5haWRsLnRlc3RzLm5lc3RlZC5EZWVwbHlOZXN0ZWQuQi5DLkQiOworCitiaW5kZXJfc3RhdHVzX3QgRGVlcGx5TmVzdGVkOjpCOjpDOjpEOjpyZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBfYWlkbF9wYXJjZWwpIHsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBTVEFUVVNfT0s7CisgIGludDMyX3QgX2FpZGxfc3RhcnRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKTsKKyAgaW50MzJfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSAwOworICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzIoX2FpZGxfcGFyY2VsLCAmX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9zaXplIDwgNCkgcmV0dXJuIFNUQVRVU19CQURfVkFMVUU7CisgIGlmIChfYWlkbF9zdGFydF9wb3MgPiBJTlQzMl9NQVggLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybiBTVEFUVVNfQkFEX1ZBTFVFOworICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorYmluZGVyX3N0YXR1c190IERlZXBseU5lc3RlZDo6Qjo6Qzo6RDo6d3JpdGVUb1BhcmNlbChBUGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IHsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXM7CisgIHNpemVfdCBfYWlkbF9zdGFydF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpOworICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDMyKF9haWRsX3BhcmNlbCwgMCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgc2l6ZV90IF9haWRsX2VuZF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpOworICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3Bvcyk7CisgIEFQYXJjZWxfd3JpdGVJbnQzMihfYWlkbF9wYXJjZWwsIF9haWRsX2VuZF9wb3MgLSBfYWlkbF9zdGFydF9wb3MpOworICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX2VuZF9wb3MpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KKworfSAgLy8gbmFtZXNwYWNlIG5lc3RlZAorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9EZWVwbHlOZXN0ZWQuY3BwLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9EZWVwbHlOZXN0ZWQuY3BwLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk2NTk3MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0RlZXBseU5lc3RlZC5jcHAuZApAQCAtMCwwICsxLDIgQEAKK291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvRGVlcGx5TmVzdGVkLmNwcCA6IFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9EZWVwbHlOZXN0ZWQuYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvSU5lc3RlZFNlcnZpY2UuY3BwIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvSU5lc3RlZFNlcnZpY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiODcwNzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9JTmVzdGVkU2VydmljZS5jcHAKQEAgLTAsMCArMSwzOTcgQEAKKyNpbmNsdWRlICJhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvSU5lc3RlZFNlcnZpY2UuaCIKKworI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3BhcmNlbF91dGlscy5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9Cbk5lc3RlZFNlcnZpY2UuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvQnBOZXN0ZWRTZXJ2aWNlLmg+CisKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CituYW1lc3BhY2UgbmVzdGVkIHsKK3N0YXRpYyBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfYW5kcm9pZF9haWRsX3Rlc3RzX25lc3RlZF9JTmVzdGVkU2VydmljZV9vblRyYW5zYWN0KEFJQmluZGVyKiBfYWlkbF9iaW5kZXIsIHRyYW5zYWN0aW9uX2NvZGVfdCBfYWlkbF9jb2RlLCBjb25zdCBBUGFyY2VsKiBfYWlkbF9pbiwgQVBhcmNlbCogX2FpZGxfb3V0KSB7CisgICh2b2lkKV9haWRsX2luOworICAodm9pZClfYWlkbF9vdXQ7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT047CisgIHN0ZDo6c2hhcmVkX3B0cjxCbk5lc3RlZFNlcnZpY2U+IF9haWRsX2ltcGwgPSBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8Qm5OZXN0ZWRTZXJ2aWNlPig6Om5kazo6SUNJbnRlcmZhY2U6OmFzSW50ZXJmYWNlKF9haWRsX2JpbmRlcikpOworICBzd2l0Y2ggKF9haWRsX2NvZGUpIHsKKyAgICBjYXNlIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMCAvKmZsaXBTdGF0dXMqLyk6IHsKKyAgICAgIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6UGFyY2VsYWJsZVdpdGhOZXN0ZWQgaW5fcDsKKyAgICAgIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6SU5lc3RlZFNlcnZpY2U6OlJlc3VsdCBfYWlkbF9yZXR1cm47CisKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9pbiwgJmluX3ApOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzID0gX2FpZGxfaW1wbC0+ZmxpcFN0YXR1cyhpbl9wLCAmX2FpZGxfcmV0dXJuKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlU3RhdHVzSGVhZGVyKF9haWRsX291dCwgX2FpZGxfc3RhdHVzLmdldCgpKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMSAvKmZsaXBTdGF0dXNXaXRoQ2FsbGJhY2sqLyk6IHsKKyAgICAgIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6UGFyY2VsYWJsZVdpdGhOZXN0ZWQ6OlN0YXR1cyBpbl9zdGF0dXM7CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpJTmVzdGVkU2VydmljZTo6SUNhbGxiYWNrPiBpbl9jYjsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX2luLCAmaW5fc3RhdHVzKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9pbiwgJmluX2NiKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1cyA9IF9haWRsX2ltcGwtPmZsaXBTdGF0dXNXaXRoQ2FsbGJhY2soaW5fc3RhdHVzLCBpbl9jYik7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZVN0YXR1c0hlYWRlcihfYWlkbF9vdXQsIF9haWRsX3N0YXR1cy5nZXQoKSk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBicmVhazsKKworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorCitzdGF0aWMgQUlCaW5kZXJfQ2xhc3MqIF9nX2FpZGxfYW5kcm9pZF9haWRsX3Rlc3RzX25lc3RlZF9JTmVzdGVkU2VydmljZV9jbGF6eiA9IDo6bmRrOjpJQ0ludGVyZmFjZTo6ZGVmaW5lQ2xhc3MoSU5lc3RlZFNlcnZpY2U6OmRlc2NyaXB0b3IsIF9haWRsX2FuZHJvaWRfYWlkbF90ZXN0c19uZXN0ZWRfSU5lc3RlZFNlcnZpY2Vfb25UcmFuc2FjdCk7CisKK0JwTmVzdGVkU2VydmljZTo6QnBOZXN0ZWRTZXJ2aWNlKGNvbnN0IDo6bmRrOjpTcEFJQmluZGVyJiBiaW5kZXIpIDogQnBDSW50ZXJmYWNlKGJpbmRlcikge30KK0JwTmVzdGVkU2VydmljZTo6fkJwTmVzdGVkU2VydmljZSgpIHt9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIEJwTmVzdGVkU2VydmljZTo6ZmxpcFN0YXR1cyhjb25zdCA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OlBhcmNlbGFibGVXaXRoTmVzdGVkJiBpbl9wLCA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OklOZXN0ZWRTZXJ2aWNlOjpSZXN1bHQqIF9haWRsX3JldHVybikgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19PSzsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOworICA6Om5kazo6U2NvcGVkQVBhcmNlbCBfYWlkbF9pbjsKKyAgOjpuZGs6OlNjb3BlZEFQYXJjZWwgX2FpZGxfb3V0OworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl9wcmVwYXJlVHJhbnNhY3Rpb24oYXNCaW5kZXIoKS5nZXQoKSwgX2FpZGxfaW4uZ2V0UigpKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX3ApOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KAorICAgIGFzQmluZGVyKCkuZ2V0KCksCisgICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAwIC8qZmxpcFN0YXR1cyovKSwKKyAgICBfYWlkbF9pbi5nZXRSKCksCisgICAgX2FpZGxfb3V0LmdldFIoKSwKKyAgICAwCisgICAgI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICAgIHwgRkxBR19QUklWQVRFX0xPQ0FMCisgICAgI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgICApOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyA9PSBTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTiAmJiBJTmVzdGVkU2VydmljZTo6Z2V0RGVmYXVsdEltcGwoKSkgeworICAgIF9haWRsX3N0YXR1cyA9IElOZXN0ZWRTZXJ2aWNlOjpnZXREZWZhdWx0SW1wbCgpLT5mbGlwU3RhdHVzKGluX3AsIF9haWRsX3JldHVybik7CisgICAgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOworICB9CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkU3RhdHVzSGVhZGVyKF9haWRsX291dC5nZXQoKSwgX2FpZGxfc3RhdHVzLmdldFIoKSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9lcnJvcjoKKyAgX2FpZGxfc3RhdHVzLnNldChBU3RhdHVzX2Zyb21TdGF0dXMoX2FpZGxfcmV0X3N0YXR1cykpOworICBfYWlkbF9zdGF0dXNfcmV0dXJuOgorICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorOjpuZGs6OlNjb3BlZEFTdGF0dXMgQnBOZXN0ZWRTZXJ2aWNlOjpmbGlwU3RhdHVzV2l0aENhbGxiYWNrKDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6UGFyY2VsYWJsZVdpdGhOZXN0ZWQ6OlN0YXR1cyBpbl9zdGF0dXMsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OklOZXN0ZWRTZXJ2aWNlOjpJQ2FsbGJhY2s+JiBpbl9jYikgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19PSzsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOworICA6Om5kazo6U2NvcGVkQVBhcmNlbCBfYWlkbF9pbjsKKyAgOjpuZGs6OlNjb3BlZEFQYXJjZWwgX2FpZGxfb3V0OworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl9wcmVwYXJlVHJhbnNhY3Rpb24oYXNCaW5kZXIoKS5nZXQoKSwgX2FpZGxfaW4uZ2V0UigpKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX3N0YXR1cyk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX2luLmdldCgpLCBpbl9jYik7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gQUlCaW5kZXJfdHJhbnNhY3QoCisgICAgYXNCaW5kZXIoKS5nZXQoKSwKKyAgICAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDEgLypmbGlwU3RhdHVzV2l0aENhbGxiYWNrKi8pLAorICAgIF9haWRsX2luLmdldFIoKSwKKyAgICBfYWlkbF9vdXQuZ2V0UigpLAorICAgIDAKKyAgICAjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgICAgfCBGTEFHX1BSSVZBVEVfTE9DQUwKKyAgICAjZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICAgICk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzID09IFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OICYmIElOZXN0ZWRTZXJ2aWNlOjpnZXREZWZhdWx0SW1wbCgpKSB7CisgICAgX2FpZGxfc3RhdHVzID0gSU5lc3RlZFNlcnZpY2U6OmdldERlZmF1bHRJbXBsKCktPmZsaXBTdGF0dXNXaXRoQ2FsbGJhY2soaW5fc3RhdHVzLCBpbl9jYik7CisgICAgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOworICB9CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkU3RhdHVzSGVhZGVyKF9haWRsX291dC5nZXQoKSwgX2FpZGxfc3RhdHVzLmdldFIoKSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47CisgIF9haWRsX2Vycm9yOgorICBfYWlkbF9zdGF0dXMuc2V0KEFTdGF0dXNfZnJvbVN0YXR1cyhfYWlkbF9yZXRfc3RhdHVzKSk7CisgIF9haWRsX3N0YXR1c19yZXR1cm46CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9CisvLyBTb3VyY2UgZm9yIEJuTmVzdGVkU2VydmljZQorQm5OZXN0ZWRTZXJ2aWNlOjpCbk5lc3RlZFNlcnZpY2UoKSB7fQorQm5OZXN0ZWRTZXJ2aWNlOjp+Qm5OZXN0ZWRTZXJ2aWNlKCkge30KKzo6bmRrOjpTcEFJQmluZGVyIEJuTmVzdGVkU2VydmljZTo6Y3JlYXRlQmluZGVyKCkgeworICBBSUJpbmRlciogYmluZGVyID0gQUlCaW5kZXJfbmV3KF9nX2FpZGxfYW5kcm9pZF9haWRsX3Rlc3RzX25lc3RlZF9JTmVzdGVkU2VydmljZV9jbGF6eiwgc3RhdGljX2Nhc3Q8dm9pZCo+KHRoaXMpKTsKKyAgI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICBBSUJpbmRlcl9tYXJrQ29tcGlsYXRpb25Vbml0U3RhYmlsaXR5KGJpbmRlcik7CisgICNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgIHJldHVybiA6Om5kazo6U3BBSUJpbmRlcihiaW5kZXIpOworfQorLy8gU291cmNlIGZvciBJTmVzdGVkU2VydmljZQorY29uc3QgY2hhciogSU5lc3RlZFNlcnZpY2U6OmRlc2NyaXB0b3IgPSAiYW5kcm9pZC5haWRsLnRlc3RzLm5lc3RlZC5JTmVzdGVkU2VydmljZSI7CitJTmVzdGVkU2VydmljZTo6SU5lc3RlZFNlcnZpY2UoKSB7fQorSU5lc3RlZFNlcnZpY2U6On5JTmVzdGVkU2VydmljZSgpIHt9CisKKworc3RkOjpzaGFyZWRfcHRyPElOZXN0ZWRTZXJ2aWNlPiBJTmVzdGVkU2VydmljZTo6ZnJvbUJpbmRlcihjb25zdCA6Om5kazo6U3BBSUJpbmRlciYgYmluZGVyKSB7CisgIGlmICghQUlCaW5kZXJfYXNzb2NpYXRlQ2xhc3MoYmluZGVyLmdldCgpLCBfZ19haWRsX2FuZHJvaWRfYWlkbF90ZXN0c19uZXN0ZWRfSU5lc3RlZFNlcnZpY2VfY2xhenopKSB7IHJldHVybiBudWxscHRyOyB9CisgIHN0ZDo6c2hhcmVkX3B0cjw6Om5kazo6SUNJbnRlcmZhY2U+IGludGVyZmFjZSA9IDo6bmRrOjpJQ0ludGVyZmFjZTo6YXNJbnRlcmZhY2UoYmluZGVyLmdldCgpKTsKKyAgaWYgKGludGVyZmFjZSkgeworICAgIHJldHVybiBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8SU5lc3RlZFNlcnZpY2U+KGludGVyZmFjZSk7CisgIH0KKyAgcmV0dXJuIDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPEJwTmVzdGVkU2VydmljZT4oYmluZGVyKTsKK30KKworYmluZGVyX3N0YXR1c190IElOZXN0ZWRTZXJ2aWNlOjp3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIHBhcmNlbCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElOZXN0ZWRTZXJ2aWNlPiYgaW5zdGFuY2UpIHsKKyAgcmV0dXJuIEFQYXJjZWxfd3JpdGVTdHJvbmdCaW5kZXIocGFyY2VsLCBpbnN0YW5jZSA/IGluc3RhbmNlLT5hc0JpbmRlcigpLmdldCgpIDogbnVsbHB0cik7Cit9CitiaW5kZXJfc3RhdHVzX3QgSU5lc3RlZFNlcnZpY2U6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIHBhcmNlbCwgc3RkOjpzaGFyZWRfcHRyPElOZXN0ZWRTZXJ2aWNlPiogaW5zdGFuY2UpIHsKKyAgOjpuZGs6OlNwQUlCaW5kZXIgYmluZGVyOworICBiaW5kZXJfc3RhdHVzX3Qgc3RhdHVzID0gQVBhcmNlbF9yZWFkU3Ryb25nQmluZGVyKHBhcmNlbCwgYmluZGVyLmdldFIoKSk7CisgIGlmIChzdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gc3RhdHVzOworICAqaW5zdGFuY2UgPSBJTmVzdGVkU2VydmljZTo6ZnJvbUJpbmRlcihiaW5kZXIpOworICByZXR1cm4gU1RBVFVTX09LOworfQorYm9vbCBJTmVzdGVkU2VydmljZTo6c2V0RGVmYXVsdEltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElOZXN0ZWRTZXJ2aWNlPiYgaW1wbCkgeworICAvLyBPbmx5IG9uZSB1c2VyIG9mIHRoaXMgaW50ZXJmYWNlIGNhbiB1c2UgdGhpcyBmdW5jdGlvbgorICAvLyBhdCBhIHRpbWUuIFRoaXMgaXMgYSBoZXVyaXN0aWMgdG8gZGV0ZWN0IGlmIHR3byBkaWZmZXJlbnQKKyAgLy8gdXNlcnMgaW4gdGhlIHNhbWUgcHJvY2VzcyB1c2UgdGhpcyBmdW5jdGlvbi4KKyAgYXNzZXJ0KCFJTmVzdGVkU2VydmljZTo6ZGVmYXVsdF9pbXBsKTsKKyAgaWYgKGltcGwpIHsKKyAgICBJTmVzdGVkU2VydmljZTo6ZGVmYXVsdF9pbXBsID0gaW1wbDsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9Citjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SU5lc3RlZFNlcnZpY2U+JiBJTmVzdGVkU2VydmljZTo6Z2V0RGVmYXVsdEltcGwoKSB7CisgIHJldHVybiBJTmVzdGVkU2VydmljZTo6ZGVmYXVsdF9pbXBsOworfQorc3RkOjpzaGFyZWRfcHRyPElOZXN0ZWRTZXJ2aWNlPiBJTmVzdGVkU2VydmljZTo6ZGVmYXVsdF9pbXBsID0gbnVsbHB0cjsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIElOZXN0ZWRTZXJ2aWNlRGVmYXVsdDo6ZmxpcFN0YXR1cyhjb25zdCA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OlBhcmNlbGFibGVXaXRoTmVzdGVkJiAvKmluX3AqLywgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpJTmVzdGVkU2VydmljZTo6UmVzdWx0KiAvKl9haWRsX3JldHVybiovKSB7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1czsKKyAgX2FpZGxfc3RhdHVzLnNldChBU3RhdHVzX2Zyb21TdGF0dXMoU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT04pKTsKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKzo6bmRrOjpTY29wZWRBU3RhdHVzIElOZXN0ZWRTZXJ2aWNlRGVmYXVsdDo6ZmxpcFN0YXR1c1dpdGhDYWxsYmFjayg6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OlBhcmNlbGFibGVXaXRoTmVzdGVkOjpTdGF0dXMgLyppbl9zdGF0dXMqLywgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6SU5lc3RlZFNlcnZpY2U6OklDYWxsYmFjaz4mIC8qaW5fY2IqLykgeworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIF9haWRsX3N0YXR1cy5zZXQoQVN0YXR1c19mcm9tU3RhdHVzKFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OKSk7CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9Cis6Om5kazo6U3BBSUJpbmRlciBJTmVzdGVkU2VydmljZURlZmF1bHQ6OmFzQmluZGVyKCkgeworICByZXR1cm4gOjpuZGs6OlNwQUlCaW5kZXIoKTsKK30KK2Jvb2wgSU5lc3RlZFNlcnZpY2VEZWZhdWx0Ojppc1JlbW90ZSgpIHsKKyAgcmV0dXJuIGZhbHNlOworfQorfSAgLy8gbmFtZXNwYWNlIG5lc3RlZAorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworbmFtZXNwYWNlIG5lc3RlZCB7Citjb25zdCBjaGFyKiBJTmVzdGVkU2VydmljZTo6UmVzdWx0OjpkZXNjcmlwdG9yID0gImFuZHJvaWQuYWlkbC50ZXN0cy5uZXN0ZWQuSU5lc3RlZFNlcnZpY2UuUmVzdWx0IjsKKworYmluZGVyX3N0YXR1c190IElOZXN0ZWRTZXJ2aWNlOjpSZXN1bHQ6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIF9haWRsX3BhcmNlbCkgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19PSzsKKyAgaW50MzJfdCBfYWlkbF9zdGFydF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpOworICBpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IDA7CisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihfYWlkbF9wYXJjZWwsICZfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChfYWlkbF9wYXJjZWxhYmxlX3NpemUgPCA0KSByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTsKKyAgaWYgKF9haWRsX3N0YXJ0X3BvcyA+IElOVDMyX01BWCAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuIFNUQVRVU19CQURfVkFMVUU7CisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmc3RhdHVzKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorYmluZGVyX3N0YXR1c190IElOZXN0ZWRTZXJ2aWNlOjpSZXN1bHQ6OndyaXRlVG9QYXJjZWwoQVBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzOworICBzaXplX3QgX2FpZGxfc3RhcnRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQzMihfYWlkbF9wYXJjZWwsIDApOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBzdGF0dXMpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIHNpemVfdCBfYWlkbF9lbmRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKTsKKyAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MpOworICBBUGFyY2VsX3dyaXRlSW50MzIoX2FpZGxfcGFyY2VsLCBfYWlkbF9lbmRfcG9zIC0gX2FpZGxfc3RhcnRfcG9zKTsKKyAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9lbmRfcG9zKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBuZXN0ZWQKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK25hbWVzcGFjZSBuZXN0ZWQgeworc3RhdGljIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9hbmRyb2lkX2FpZGxfdGVzdHNfbmVzdGVkX0lOZXN0ZWRTZXJ2aWNlX0lDYWxsYmFja19vblRyYW5zYWN0KEFJQmluZGVyKiBfYWlkbF9iaW5kZXIsIHRyYW5zYWN0aW9uX2NvZGVfdCBfYWlkbF9jb2RlLCBjb25zdCBBUGFyY2VsKiBfYWlkbF9pbiwgQVBhcmNlbCogX2FpZGxfb3V0KSB7CisgICh2b2lkKV9haWRsX2luOworICAodm9pZClfYWlkbF9vdXQ7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT047CisgIHN0ZDo6c2hhcmVkX3B0cjxJTmVzdGVkU2VydmljZTo6Qm5DYWxsYmFjaz4gX2FpZGxfaW1wbCA9IHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxJTmVzdGVkU2VydmljZTo6Qm5DYWxsYmFjaz4oOjpuZGs6OklDSW50ZXJmYWNlOjphc0ludGVyZmFjZShfYWlkbF9iaW5kZXIpKTsKKyAgc3dpdGNoIChfYWlkbF9jb2RlKSB7CisgICAgY2FzZSAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDAgLypkb25lKi8pOiB7CisgICAgICA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OlBhcmNlbGFibGVXaXRoTmVzdGVkOjpTdGF0dXMgaW5fc3RhdHVzOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfaW4sICZpbl9zdGF0dXMpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzID0gX2FpZGxfaW1wbC0+ZG9uZShpbl9zdGF0dXMpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVTdGF0dXNIZWFkZXIoX2FpZGxfb3V0LCBfYWlkbF9zdGF0dXMuZ2V0KCkpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7CisKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KKworc3RhdGljIEFJQmluZGVyX0NsYXNzKiBfZ19haWRsX2FuZHJvaWRfYWlkbF90ZXN0c19uZXN0ZWRfSU5lc3RlZFNlcnZpY2VfSUNhbGxiYWNrX2NsYXp6ID0gOjpuZGs6OklDSW50ZXJmYWNlOjpkZWZpbmVDbGFzcyhJTmVzdGVkU2VydmljZTo6SUNhbGxiYWNrOjpkZXNjcmlwdG9yLCBfYWlkbF9hbmRyb2lkX2FpZGxfdGVzdHNfbmVzdGVkX0lOZXN0ZWRTZXJ2aWNlX0lDYWxsYmFja19vblRyYW5zYWN0KTsKKworSU5lc3RlZFNlcnZpY2U6OkJwQ2FsbGJhY2s6OkJwQ2FsbGJhY2soY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGJpbmRlcikgOiBCcENJbnRlcmZhY2UoYmluZGVyKSB7fQorSU5lc3RlZFNlcnZpY2U6OkJwQ2FsbGJhY2s6On5CcENhbGxiYWNrKCkge30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgSU5lc3RlZFNlcnZpY2U6OkJwQ2FsbGJhY2s6OmRvbmUoOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpQYXJjZWxhYmxlV2l0aE5lc3RlZDo6U3RhdHVzIGluX3N0YXR1cykgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19PSzsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOworICA6Om5kazo6U2NvcGVkQVBhcmNlbCBfYWlkbF9pbjsKKyAgOjpuZGs6OlNjb3BlZEFQYXJjZWwgX2FpZGxfb3V0OworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl9wcmVwYXJlVHJhbnNhY3Rpb24oYXNCaW5kZXIoKS5nZXQoKSwgX2FpZGxfaW4uZ2V0UigpKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX3N0YXR1cyk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gQUlCaW5kZXJfdHJhbnNhY3QoCisgICAgYXNCaW5kZXIoKS5nZXQoKSwKKyAgICAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDAgLypkb25lKi8pLAorICAgIF9haWRsX2luLmdldFIoKSwKKyAgICBfYWlkbF9vdXQuZ2V0UigpLAorICAgIDAKKyAgICAjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgICAgfCBGTEFHX1BSSVZBVEVfTE9DQUwKKyAgICAjZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICAgICk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzID09IFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OICYmIElDYWxsYmFjazo6Z2V0RGVmYXVsdEltcGwoKSkgeworICAgIF9haWRsX3N0YXR1cyA9IElDYWxsYmFjazo6Z2V0RGVmYXVsdEltcGwoKS0+ZG9uZShpbl9zdGF0dXMpOworICAgIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKKyAgfQorICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZFN0YXR1c0hlYWRlcihfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3N0YXR1cy5nZXRSKCkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOworICBfYWlkbF9lcnJvcjoKKyAgX2FpZGxfc3RhdHVzLnNldChBU3RhdHVzX2Zyb21TdGF0dXMoX2FpZGxfcmV0X3N0YXR1cykpOworICBfYWlkbF9zdGF0dXNfcmV0dXJuOgorICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorLy8gU291cmNlIGZvciBCbkNhbGxiYWNrCitJTmVzdGVkU2VydmljZTo6Qm5DYWxsYmFjazo6Qm5DYWxsYmFjaygpIHt9CitJTmVzdGVkU2VydmljZTo6Qm5DYWxsYmFjazo6fkJuQ2FsbGJhY2soKSB7fQorOjpuZGs6OlNwQUlCaW5kZXIgSU5lc3RlZFNlcnZpY2U6OkJuQ2FsbGJhY2s6OmNyZWF0ZUJpbmRlcigpIHsKKyAgQUlCaW5kZXIqIGJpbmRlciA9IEFJQmluZGVyX25ldyhfZ19haWRsX2FuZHJvaWRfYWlkbF90ZXN0c19uZXN0ZWRfSU5lc3RlZFNlcnZpY2VfSUNhbGxiYWNrX2NsYXp6LCBzdGF0aWNfY2FzdDx2b2lkKj4odGhpcykpOworICAjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgIEFJQmluZGVyX21hcmtDb21waWxhdGlvblVuaXRTdGFiaWxpdHkoYmluZGVyKTsKKyAgI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgcmV0dXJuIDo6bmRrOjpTcEFJQmluZGVyKGJpbmRlcik7Cit9CisvLyBTb3VyY2UgZm9yIElDYWxsYmFjaworY29uc3QgY2hhciogSU5lc3RlZFNlcnZpY2U6OklDYWxsYmFjazo6ZGVzY3JpcHRvciA9ICJhbmRyb2lkLmFpZGwudGVzdHMubmVzdGVkLklOZXN0ZWRTZXJ2aWNlLklDYWxsYmFjayI7CitJTmVzdGVkU2VydmljZTo6SUNhbGxiYWNrOjpJQ2FsbGJhY2soKSB7fQorSU5lc3RlZFNlcnZpY2U6OklDYWxsYmFjazo6fklDYWxsYmFjaygpIHt9CisKKworc3RkOjpzaGFyZWRfcHRyPElOZXN0ZWRTZXJ2aWNlOjpJQ2FsbGJhY2s+IElOZXN0ZWRTZXJ2aWNlOjpJQ2FsbGJhY2s6OmZyb21CaW5kZXIoY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGJpbmRlcikgeworICBpZiAoIUFJQmluZGVyX2Fzc29jaWF0ZUNsYXNzKGJpbmRlci5nZXQoKSwgX2dfYWlkbF9hbmRyb2lkX2FpZGxfdGVzdHNfbmVzdGVkX0lOZXN0ZWRTZXJ2aWNlX0lDYWxsYmFja19jbGF6eikpIHsgcmV0dXJuIG51bGxwdHI7IH0KKyAgc3RkOjpzaGFyZWRfcHRyPDo6bmRrOjpJQ0ludGVyZmFjZT4gaW50ZXJmYWNlID0gOjpuZGs6OklDSW50ZXJmYWNlOjphc0ludGVyZmFjZShiaW5kZXIuZ2V0KCkpOworICBpZiAoaW50ZXJmYWNlKSB7CisgICAgcmV0dXJuIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxJQ2FsbGJhY2s+KGludGVyZmFjZSk7CisgIH0KKyAgcmV0dXJuIDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPElOZXN0ZWRTZXJ2aWNlOjpCcENhbGxiYWNrPihiaW5kZXIpOworfQorCitiaW5kZXJfc3RhdHVzX3QgSU5lc3RlZFNlcnZpY2U6OklDYWxsYmFjazo6d3JpdGVUb1BhcmNlbChBUGFyY2VsKiBwYXJjZWwsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJQ2FsbGJhY2s+JiBpbnN0YW5jZSkgeworICByZXR1cm4gQVBhcmNlbF93cml0ZVN0cm9uZ0JpbmRlcihwYXJjZWwsIGluc3RhbmNlID8gaW5zdGFuY2UtPmFzQmluZGVyKCkuZ2V0KCkgOiBudWxscHRyKTsKK30KK2JpbmRlcl9zdGF0dXNfdCBJTmVzdGVkU2VydmljZTo6SUNhbGxiYWNrOjpyZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBwYXJjZWwsIHN0ZDo6c2hhcmVkX3B0cjxJQ2FsbGJhY2s+KiBpbnN0YW5jZSkgeworICA6Om5kazo6U3BBSUJpbmRlciBiaW5kZXI7CisgIGJpbmRlcl9zdGF0dXNfdCBzdGF0dXMgPSBBUGFyY2VsX3JlYWRTdHJvbmdCaW5kZXIocGFyY2VsLCBiaW5kZXIuZ2V0UigpKTsKKyAgaWYgKHN0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBzdGF0dXM7CisgICppbnN0YW5jZSA9IElDYWxsYmFjazo6ZnJvbUJpbmRlcihiaW5kZXIpOworICByZXR1cm4gU1RBVFVTX09LOworfQorYm9vbCBJTmVzdGVkU2VydmljZTo6SUNhbGxiYWNrOjpzZXREZWZhdWx0SW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SUNhbGxiYWNrPiYgaW1wbCkgeworICAvLyBPbmx5IG9uZSB1c2VyIG9mIHRoaXMgaW50ZXJmYWNlIGNhbiB1c2UgdGhpcyBmdW5jdGlvbgorICAvLyBhdCBhIHRpbWUuIFRoaXMgaXMgYSBoZXVyaXN0aWMgdG8gZGV0ZWN0IGlmIHR3byBkaWZmZXJlbnQKKyAgLy8gdXNlcnMgaW4gdGhlIHNhbWUgcHJvY2VzcyB1c2UgdGhpcyBmdW5jdGlvbi4KKyAgYXNzZXJ0KCFJQ2FsbGJhY2s6OmRlZmF1bHRfaW1wbCk7CisgIGlmIChpbXBsKSB7CisgICAgSUNhbGxiYWNrOjpkZWZhdWx0X2ltcGwgPSBpbXBsOworICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KK2NvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJTmVzdGVkU2VydmljZTo6SUNhbGxiYWNrPiYgSU5lc3RlZFNlcnZpY2U6OklDYWxsYmFjazo6Z2V0RGVmYXVsdEltcGwoKSB7CisgIHJldHVybiBJQ2FsbGJhY2s6OmRlZmF1bHRfaW1wbDsKK30KK3N0ZDo6c2hhcmVkX3B0cjxJTmVzdGVkU2VydmljZTo6SUNhbGxiYWNrPiBJTmVzdGVkU2VydmljZTo6SUNhbGxiYWNrOjpkZWZhdWx0X2ltcGwgPSBudWxscHRyOworOjpuZGs6OlNjb3BlZEFTdGF0dXMgSU5lc3RlZFNlcnZpY2U6OklDYWxsYmFja0RlZmF1bHQ6OmRvbmUoOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpQYXJjZWxhYmxlV2l0aE5lc3RlZDo6U3RhdHVzIC8qaW5fc3RhdHVzKi8pIHsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOworICBfYWlkbF9zdGF0dXMuc2V0KEFTdGF0dXNfZnJvbVN0YXR1cyhTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTikpOworICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorOjpuZGs6OlNwQUlCaW5kZXIgSU5lc3RlZFNlcnZpY2U6OklDYWxsYmFja0RlZmF1bHQ6OmFzQmluZGVyKCkgeworICByZXR1cm4gOjpuZGs6OlNwQUlCaW5kZXIoKTsKK30KK2Jvb2wgSU5lc3RlZFNlcnZpY2U6OklDYWxsYmFja0RlZmF1bHQ6OmlzUmVtb3RlKCkgeworICByZXR1cm4gZmFsc2U7Cit9Cit9ICAvLyBuYW1lc3BhY2UgbmVzdGVkCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0lOZXN0ZWRTZXJ2aWNlLmNwcC5kIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvSU5lc3RlZFNlcnZpY2UuY3BwLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ4MWVmMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0lOZXN0ZWRTZXJ2aWNlLmNwcC5kCkBAIC0wLDAgKzEsMyBAQAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9JTmVzdGVkU2VydmljZS5jcHAgOiBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvSU5lc3RlZFNlcnZpY2UuYWlkbCBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvUGFyY2VsYWJsZVdpdGhOZXN0ZWQuYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvUGFyY2VsYWJsZVdpdGhOZXN0ZWQuY3BwIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvUGFyY2VsYWJsZVdpdGhOZXN0ZWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNjZkMTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9QYXJjZWxhYmxlV2l0aE5lc3RlZC5jcHAKQEAgLTAsMCArMSw1MSBAQAorI2luY2x1ZGUgImFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9QYXJjZWxhYmxlV2l0aE5lc3RlZC5oIgorCisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcGFyY2VsX3V0aWxzLmg+CisKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CituYW1lc3BhY2UgbmVzdGVkIHsKK2NvbnN0IGNoYXIqIFBhcmNlbGFibGVXaXRoTmVzdGVkOjpkZXNjcmlwdG9yID0gImFuZHJvaWQuYWlkbC50ZXN0cy5uZXN0ZWQuUGFyY2VsYWJsZVdpdGhOZXN0ZWQiOworCitiaW5kZXJfc3RhdHVzX3QgUGFyY2VsYWJsZVdpdGhOZXN0ZWQ6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIF9haWRsX3BhcmNlbCkgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19PSzsKKyAgaW50MzJfdCBfYWlkbF9zdGFydF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpOworICBpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IDA7CisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihfYWlkbF9wYXJjZWwsICZfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChfYWlkbF9wYXJjZWxhYmxlX3NpemUgPCA0KSByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTsKKyAgaWYgKF9haWRsX3N0YXJ0X3BvcyA+IElOVDMyX01BWCAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuIFNUQVRVU19CQURfVkFMVUU7CisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmc3RhdHVzKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorYmluZGVyX3N0YXR1c190IFBhcmNlbGFibGVXaXRoTmVzdGVkOjp3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1czsKKyAgc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIoX2FpZGxfcGFyY2VsLCAwKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgc3RhdHVzKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBzaXplX3QgX2FpZGxfZW5kX3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zKTsKKyAgQVBhcmNlbF93cml0ZUludDMyKF9haWRsX3BhcmNlbCwgX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfZW5kX3Bvcyk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorCit9ICAvLyBuYW1lc3BhY2UgbmVzdGVkCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL1BhcmNlbGFibGVXaXRoTmVzdGVkLmNwcC5kIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvUGFyY2VsYWJsZVdpdGhOZXN0ZWQuY3BwLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U1ZjM2YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL1BhcmNlbGFibGVXaXRoTmVzdGVkLmNwcC5kCkBAIC0wLDAgKzEsMiBAQAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9QYXJjZWxhYmxlV2l0aE5lc3RlZC5jcHAgOiBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvUGFyY2VsYWJsZVdpdGhOZXN0ZWQuYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvRW51bVVuaW9uLmNwcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL0VudW1Vbmlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNmNDczZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL0VudW1Vbmlvbi5jcHAKQEAgLTAsMCArMSw3MSBAQAorI2luY2x1ZGUgImFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9FbnVtVW5pb24uaCIKKworI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3BhcmNlbF91dGlscy5oPgorCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworbmFtZXNwYWNlIHVuaW9ucyB7Citjb25zdCBjaGFyKiBFbnVtVW5pb246OmRlc2NyaXB0b3IgPSAiYW5kcm9pZC5haWRsLnRlc3RzLnVuaW9ucy5FbnVtVW5pb24iOworCitiaW5kZXJfc3RhdHVzX3QgRW51bVVuaW9uOjpyZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBfcGFyY2VsKSB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzOworICBpbnQzMl90IF9haWRsX3RhZzsKKyAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX3BhcmNlbCwgJl9haWRsX3RhZykpICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIHN3aXRjaCAoc3RhdGljX2Nhc3Q8VGFnPihfYWlkbF90YWcpKSB7CisgIGNhc2UgaW50RW51bTogeworICAgIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0gX2FpZGxfdmFsdWU7CisgICAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX3BhcmNlbCwgJl9haWRsX3ZhbHVlKSkgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgICBpZiBjb25zdGV4cHIgKHN0ZDo6aXNfdHJpdmlhbGx5X2NvcHlhYmxlX3Y8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bT4pIHsKKyAgICAgIHNldDxpbnRFbnVtPihfYWlkbF92YWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIE5PTElOVE5FWFRMSU5FKHBlcmZvcm1hbmNlLW1vdmUtY29uc3QtYXJnKQorICAgICAgc2V0PGludEVudW0+KHN0ZDo6bW92ZShfYWlkbF92YWx1ZSkpOworICAgIH0KKyAgICByZXR1cm4gU1RBVFVTX09LOyB9CisgIGNhc2UgbG9uZ0VudW06IHsKKyAgICA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMb25nRW51bSBfYWlkbF92YWx1ZTsKKyAgICBpZiAoKF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfcGFyY2VsLCAmX2FpZGxfdmFsdWUpKSAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICAgIGlmIGNvbnN0ZXhwciAoc3RkOjppc190cml2aWFsbHlfY29weWFibGVfdjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMb25nRW51bT4pIHsKKyAgICAgIHNldDxsb25nRW51bT4oX2FpZGxfdmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBOT0xJTlRORVhUTElORShwZXJmb3JtYW5jZS1tb3ZlLWNvbnN0LWFyZykKKyAgICAgIHNldDxsb25nRW51bT4oc3RkOjptb3ZlKF9haWRsX3ZhbHVlKSk7CisgICAgfQorICAgIHJldHVybiBTVEFUVVNfT0s7IH0KKyAgI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKKyAgI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMiCisgIGNhc2UgZGVwcmVjYXRlZEZpZWxkOiB7CisgICAgaW50MzJfdCBfYWlkbF92YWx1ZTsKKyAgICBpZiAoKF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfcGFyY2VsLCAmX2FpZGxfdmFsdWUpKSAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICAgIGlmIGNvbnN0ZXhwciAoc3RkOjppc190cml2aWFsbHlfY29weWFibGVfdjxpbnQzMl90PikgeworICAgICAgc2V0PGRlcHJlY2F0ZWRGaWVsZD4oX2FpZGxfdmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBOT0xJTlRORVhUTElORShwZXJmb3JtYW5jZS1tb3ZlLWNvbnN0LWFyZykKKyAgICAgIHNldDxkZXByZWNhdGVkRmllbGQ+KHN0ZDo6bW92ZShfYWlkbF92YWx1ZSkpOworICAgIH0KKyAgICByZXR1cm4gU1RBVFVTX09LOyB9CisgICNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKKyAgfQorICByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTsKK30KK2JpbmRlcl9zdGF0dXNfdCBFbnVtVW5pb246OndyaXRlVG9QYXJjZWwoQVBhcmNlbCogX3BhcmNlbCkgY29uc3QgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfcGFyY2VsLCBzdGF0aWNfY2FzdDxpbnQzMl90PihnZXRUYWcoKSkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICBzd2l0Y2ggKGdldFRhZygpKSB7CisgIGNhc2UgaW50RW51bTogcmV0dXJuIDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfcGFyY2VsLCBnZXQ8aW50RW51bT4oKSk7CisgIGNhc2UgbG9uZ0VudW06IHJldHVybiA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX3BhcmNlbCwgZ2V0PGxvbmdFbnVtPigpKTsKKyAgI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKKyAgI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMiCisgIGNhc2UgZGVwcmVjYXRlZEZpZWxkOiByZXR1cm4gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9wYXJjZWwsIGdldDxkZXByZWNhdGVkRmllbGQ+KCkpOworICAjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCisgIH0KKyAgX19hc3NlcnQyKF9fRklMRV9fLCBfX0xJTkVfXywgX19QUkVUVFlfRlVOQ1RJT05fXywgImNhbid0IHJlYWNoIGhlcmUiKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHVuaW9ucworfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9FbnVtVW5pb24uY3BwLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9FbnVtVW5pb24uY3BwLmQKc2ltaWxhcml0eSBpbmRleCA3OCUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvRW51bVVuaW9uLmNwcC5kCnJlbmFtZSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9FbnVtVW5pb24uY3BwLmQKaW5kZXggMDc4MWRmOS4uOWFkMTMzYyAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvRW51bVVuaW9uLmNwcC5kCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL0VudW1Vbmlvbi5jcHAuZApAQCAtMSw0ICsxLDQgQEAKLW91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvRW51bVVuaW9uLmNwcCA6IFwKK291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvRW51bVVuaW9uLmNwcCA6IFwKICAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9FbnVtVW5pb24uYWlkbCBcCiAgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9JbnRFbnVtLmFpZGwgXAogICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvTG9uZ0VudW0uYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvVW5pb25JblVuaW9uLmNwcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL1VuaW9uSW5Vbmlvbi5jcHAKc2ltaWxhcml0eSBpbmRleCA2OSUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvVW5pb25JblVuaW9uLmNwcApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvVW5pb25JblVuaW9uLmNwcAppbmRleCA3OWMzNmZmLi42NzBlYjM0IDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9VbmlvbkluVW5pb24uY3BwCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL1VuaW9uSW5Vbmlvbi5jcHAKQEAgLTEyLDExICsxMiwxMSBAQAogYmluZGVyX3N0YXR1c190IFVuaW9uSW5Vbmlvbjo6cmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogX3BhcmNlbCkgewogICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1czsKICAgaW50MzJfdCBfYWlkbF90YWc7Ci0gIGlmICgoX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyKF9wYXJjZWwsICZfYWlkbF90YWcpKSAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotICBzd2l0Y2ggKF9haWRsX3RhZykgeworICBpZiAoKF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfcGFyY2VsLCAmX2FpZGxfdGFnKSkgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgc3dpdGNoIChzdGF0aWNfY2FzdDxUYWc+KF9haWRsX3RhZykpIHsKICAgY2FzZSBmaXJzdDogewogICAgIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OnVuaW9uczo6RW51bVVuaW9uIF9haWRsX3ZhbHVlOwotICAgIGlmICgoX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRQYXJjZWxhYmxlKF9wYXJjZWwsICZfYWlkbF92YWx1ZSkpICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgICAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX3BhcmNlbCwgJl9haWRsX3ZhbHVlKSkgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKICAgICBpZiBjb25zdGV4cHIgKHN0ZDo6aXNfdHJpdmlhbGx5X2NvcHlhYmxlX3Y8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6dW5pb25zOjpFbnVtVW5pb24+KSB7CiAgICAgICBzZXQ8Zmlyc3Q+KF9haWRsX3ZhbHVlKTsKICAgICB9IGVsc2UgewpAQCAtMjYsNyArMjYsNyBAQAogICAgIHJldHVybiBTVEFUVVNfT0s7IH0KICAgY2FzZSBzZWNvbmQ6IHsKICAgICBpbnQzMl90IF9haWRsX3ZhbHVlOwotICAgIGlmICgoX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyKF9wYXJjZWwsICZfYWlkbF92YWx1ZSkpICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgICAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX3BhcmNlbCwgJl9haWRsX3ZhbHVlKSkgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKICAgICBpZiBjb25zdGV4cHIgKHN0ZDo6aXNfdHJpdmlhbGx5X2NvcHlhYmxlX3Y8aW50MzJfdD4pIHsKICAgICAgIHNldDxzZWNvbmQ+KF9haWRsX3ZhbHVlKTsKICAgICB9IGVsc2UgewpAQCAtMzgsMTEgKzM4LDExIEBACiAgIHJldHVybiBTVEFUVVNfQkFEX1ZBTFVFOwogfQogYmluZGVyX3N0YXR1c190IFVuaW9uSW5Vbmlvbjo6d3JpdGVUb1BhcmNlbChBUGFyY2VsKiBfcGFyY2VsKSBjb25zdCB7Ci0gIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDMyKF9wYXJjZWwsIGdldFRhZygpKTsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX3BhcmNlbCwgc3RhdGljX2Nhc3Q8aW50MzJfdD4oZ2V0VGFnKCkpKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKICAgc3dpdGNoIChnZXRUYWcoKSkgewotICBjYXNlIGZpcnN0OiByZXR1cm4gOjpuZGs6OkFQYXJjZWxfd3JpdGVQYXJjZWxhYmxlKF9wYXJjZWwsIGdldDxmaXJzdD4oKSk7Ci0gIGNhc2Ugc2Vjb25kOiByZXR1cm4gQVBhcmNlbF93cml0ZUludDMyKF9wYXJjZWwsIGdldDxzZWNvbmQ+KCkpOworICBjYXNlIGZpcnN0OiByZXR1cm4gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9wYXJjZWwsIGdldDxmaXJzdD4oKSk7CisgIGNhc2Ugc2Vjb25kOiByZXR1cm4gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9wYXJjZWwsIGdldDxzZWNvbmQ+KCkpOwogICB9CiAgIF9fYXNzZXJ0MihfX0ZJTEVfXywgX19MSU5FX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18sICJjYW4ndCByZWFjaCBoZXJlIik7CiB9CmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9FbnVtVW5pb24uY3BwLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9VbmlvbkluVW5pb24uY3BwLmQKc2ltaWxhcml0eSBpbmRleCA2NSUKY29weSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL0VudW1Vbmlvbi5jcHAuZApjb3B5IHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL1VuaW9uSW5Vbmlvbi5jcHAuZAppbmRleCAwNzgxZGY5Li4zNzExM2Q5IDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9FbnVtVW5pb24uY3BwLmQKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvVW5pb25JblVuaW9uLmNwcC5kCkBAIC0xLDQgKzEsNSBAQAotb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9FbnVtVW5pb24uY3BwIDogXAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9VbmlvbkluVW5pb24uY3BwIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL1VuaW9uSW5Vbmlvbi5haWRsIFwKICAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9FbnVtVW5pb24uYWlkbCBcCiAgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9JbnRFbnVtLmFpZGwgXAogICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvTG9uZ0VudW0uYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQXJyYXlPZkludGVyZmFjZXMuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0FycmF5T2ZJbnRlcmZhY2VzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJiOWU3YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0FycmF5T2ZJbnRlcmZhY2VzLmgKQEAgLTAsMCArMSwzMjMgQEAKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8YXJyYXk+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxvcHRpb25hbD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2YXJpYW50PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9lbnVtcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2liaW5kZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pbnRlcmZhY2VfdXRpbHMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wYXJjZWxhYmxlX3V0aWxzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfdG9fc3RyaW5nLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQXJyYXlPZkludGVyZmFjZXMuaD4KKyNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9zdGFiaWxpdHkuaD4KKyNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisKKyNpZm5kZWYgX19CSU9OSUNfXworI2RlZmluZSBfX2Fzc2VydDIoYSxiLGMsZCkgKCh2b2lkKTApCisjZW5kaWYKKworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK2NsYXNzIEFycmF5T2ZJbnRlcmZhY2VzIHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBzdGQ6OmZhbHNlX3R5cGUgZml4ZWRfc2l6ZTsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIGRlc2NyaXB0b3I7CisKKyAgY2xhc3MgSUVtcHR5SW50ZXJmYWNlIDogcHVibGljIDo6bmRrOjpJQ0ludGVyZmFjZSB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgY2hhciogZGVzY3JpcHRvcjsKKyAgICBJRW1wdHlJbnRlcmZhY2UoKTsKKyAgICB2aXJ0dWFsIH5JRW1wdHlJbnRlcmZhY2UoKTsKKworCisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxJRW1wdHlJbnRlcmZhY2U+IGZyb21CaW5kZXIoY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGJpbmRlcik7CisgICAgc3RhdGljIGJpbmRlcl9zdGF0dXNfdCB3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIHBhcmNlbCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElFbXB0eUludGVyZmFjZT4mIGluc3RhbmNlKTsKKyAgICBzdGF0aWMgYmluZGVyX3N0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIHBhcmNlbCwgc3RkOjpzaGFyZWRfcHRyPElFbXB0eUludGVyZmFjZT4qIGluc3RhbmNlKTsKKyAgICBzdGF0aWMgYm9vbCBzZXREZWZhdWx0SW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SUVtcHR5SW50ZXJmYWNlPiYgaW1wbCk7CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJRW1wdHlJbnRlcmZhY2U+JiBnZXREZWZhdWx0SW1wbCgpOworICBwcml2YXRlOgorICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8SUVtcHR5SW50ZXJmYWNlPiBkZWZhdWx0X2ltcGw7CisgIH07CisgIGNsYXNzIElFbXB0eUludGVyZmFjZURlZmF1bHQgOiBwdWJsaWMgSUVtcHR5SW50ZXJmYWNlIHsKKyAgcHVibGljOgorICAgIDo6bmRrOjpTcEFJQmluZGVyIGFzQmluZGVyKCkgb3ZlcnJpZGU7CisgICAgYm9vbCBpc1JlbW90ZSgpIG92ZXJyaWRlOworICB9OworICBjbGFzcyBCcEVtcHR5SW50ZXJmYWNlIDogcHVibGljIDo6bmRrOjpCcENJbnRlcmZhY2U8SUVtcHR5SW50ZXJmYWNlPiB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBCcEVtcHR5SW50ZXJmYWNlKGNvbnN0IDo6bmRrOjpTcEFJQmluZGVyJiBiaW5kZXIpOworICAgIHZpcnR1YWwgfkJwRW1wdHlJbnRlcmZhY2UoKTsKKworICB9OworICBjbGFzcyBCbkVtcHR5SW50ZXJmYWNlIDogcHVibGljIDo6bmRrOjpCbkNJbnRlcmZhY2U8SUVtcHR5SW50ZXJmYWNlPiB7CisgIHB1YmxpYzoKKyAgICBCbkVtcHR5SW50ZXJmYWNlKCk7CisgICAgdmlydHVhbCB+Qm5FbXB0eUludGVyZmFjZSgpOworICBwcm90ZWN0ZWQ6CisgICAgOjpuZGs6OlNwQUlCaW5kZXIgY3JlYXRlQmluZGVyKCkgb3ZlcnJpZGU7CisgIHByaXZhdGU6CisgIH07CisgIGNsYXNzIElNeUludGVyZmFjZSA6IHB1YmxpYyA6Om5kazo6SUNJbnRlcmZhY2UgeworICBwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGRlc2NyaXB0b3I7CisgICAgSU15SW50ZXJmYWNlKCk7CisgICAgdmlydHVhbCB+SU15SW50ZXJmYWNlKCk7CisKKyAgICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX21ldGhvZFdpdGhJbnRlcmZhY2VzID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDA7CisKKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPElNeUludGVyZmFjZT4gZnJvbUJpbmRlcihjb25zdCA6Om5kazo6U3BBSUJpbmRlciYgYmluZGVyKTsKKyAgICBzdGF0aWMgYmluZGVyX3N0YXR1c190IHdyaXRlVG9QYXJjZWwoQVBhcmNlbCogcGFyY2VsLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SU15SW50ZXJmYWNlPiYgaW5zdGFuY2UpOworICAgIHN0YXRpYyBiaW5kZXJfc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogcGFyY2VsLCBzdGQ6OnNoYXJlZF9wdHI8SU15SW50ZXJmYWNlPiogaW5zdGFuY2UpOworICAgIHN0YXRpYyBib29sIHNldERlZmF1bHRJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJTXlJbnRlcmZhY2U+JiBpbXBsKTsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElNeUludGVyZmFjZT4mIGdldERlZmF1bHRJbXBsKCk7CisgICAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBtZXRob2RXaXRoSW50ZXJmYWNlcyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4mIGluX2lmYWNlLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4mIGluX251bGxhYmxlX2lmYWNlLCBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+JiBpbl9pZmFjZV9hcnJheV9pbiwgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Piogb3V0X2lmYWNlX2FycmF5X291dCwgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+PiogaW5faWZhY2VfYXJyYXlfaW5vdXQsIGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4mIGluX251bGxhYmxlX2lmYWNlX2FycmF5X2luLCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+KiBvdXRfbnVsbGFibGVfaWZhY2VfYXJyYXlfb3V0LCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+KiBpbl9udWxsYWJsZV9pZmFjZV9hcnJheV9pbm91dCwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PiogX2FpZGxfcmV0dXJuKSA9IDA7CisgIHByaXZhdGU6CisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxJTXlJbnRlcmZhY2U+IGRlZmF1bHRfaW1wbDsKKyAgfTsKKyAgY2xhc3MgSU15SW50ZXJmYWNlRGVmYXVsdCA6IHB1YmxpYyBJTXlJbnRlcmZhY2UgeworICBwdWJsaWM6CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgbWV0aG9kV2l0aEludGVyZmFjZXMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+JiBpbl9pZmFjZSwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+JiBpbl9udWxsYWJsZV9pZmFjZSwgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+PiYgaW5faWZhY2VfYXJyYXlfaW4sIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4qIG91dF9pZmFjZV9hcnJheV9vdXQsIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4qIGluX2lmYWNlX2FycmF5X2lub3V0LCBjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+JiBpbl9udWxsYWJsZV9pZmFjZV9hcnJheV9pbiwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+Piogb3V0X251bGxhYmxlX2lmYWNlX2FycmF5X291dCwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PiogaW5fbnVsbGFibGVfaWZhY2VfYXJyYXlfaW5vdXQsIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNwQUlCaW5kZXIgYXNCaW5kZXIoKSBvdmVycmlkZTsKKyAgICBib29sIGlzUmVtb3RlKCkgb3ZlcnJpZGU7CisgIH07CisgIGNsYXNzIEJwTXlJbnRlcmZhY2UgOiBwdWJsaWMgOjpuZGs6OkJwQ0ludGVyZmFjZTxJTXlJbnRlcmZhY2U+IHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IEJwTXlJbnRlcmZhY2UoY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGJpbmRlcik7CisgICAgdmlydHVhbCB+QnBNeUludGVyZmFjZSgpOworCisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgbWV0aG9kV2l0aEludGVyZmFjZXMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+JiBpbl9pZmFjZSwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+JiBpbl9udWxsYWJsZV9pZmFjZSwgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+PiYgaW5faWZhY2VfYXJyYXlfaW4sIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4qIG91dF9pZmFjZV9hcnJheV9vdXQsIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4qIGluX2lmYWNlX2FycmF5X2lub3V0LCBjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+JiBpbl9udWxsYWJsZV9pZmFjZV9hcnJheV9pbiwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+Piogb3V0X251bGxhYmxlX2lmYWNlX2FycmF5X291dCwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PiogaW5fbnVsbGFibGVfaWZhY2VfYXJyYXlfaW5vdXQsIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIH07CisgIGNsYXNzIEJuTXlJbnRlcmZhY2UgOiBwdWJsaWMgOjpuZGs6OkJuQ0ludGVyZmFjZTxJTXlJbnRlcmZhY2U+IHsKKyAgcHVibGljOgorICAgIEJuTXlJbnRlcmZhY2UoKTsKKyAgICB2aXJ0dWFsIH5Cbk15SW50ZXJmYWNlKCk7CisgIHByb3RlY3RlZDoKKyAgICA6Om5kazo6U3BBSUJpbmRlciBjcmVhdGVCaW5kZXIoKSBvdmVycmlkZTsKKyAgcHJpdmF0ZToKKyAgfTsKKyAgY2xhc3MgTXlQYXJjZWxhYmxlIHsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgc3RkOjpmYWxzZV90eXBlIGZpeGVkX3NpemU7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGRlc2NyaXB0b3I7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4gaWZhY2U7CisgICAgc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+IG51bGxhYmxlX2lmYWNlOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4gaWZhY2VfYXJyYXk7CisgICAgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PiBudWxsYWJsZV9pZmFjZV9hcnJheTsKKworICAgIGJpbmRlcl9zdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBwYXJjZWwpOworICAgIGJpbmRlcl9zdGF0dXNfdCB3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIHBhcmNlbCkgY29uc3Q7CisKKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IE15UGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoaWZhY2UsIG51bGxhYmxlX2lmYWNlLCBpZmFjZV9hcnJheSwgbnVsbGFibGVfaWZhY2VfYXJyYXkpICE9IHN0ZDo6dGllKHJocy5pZmFjZSwgcmhzLm51bGxhYmxlX2lmYWNlLCByaHMuaWZhY2VfYXJyYXksIHJocy5udWxsYWJsZV9pZmFjZV9hcnJheSk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBNeVBhcmNlbGFibGUmIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKGlmYWNlLCBudWxsYWJsZV9pZmFjZSwgaWZhY2VfYXJyYXksIG51bGxhYmxlX2lmYWNlX2FycmF5KSA8IHN0ZDo6dGllKHJocy5pZmFjZSwgcmhzLm51bGxhYmxlX2lmYWNlLCByaHMuaWZhY2VfYXJyYXksIHJocy5udWxsYWJsZV9pZmFjZV9hcnJheSk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgTXlQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZShpZmFjZSwgbnVsbGFibGVfaWZhY2UsIGlmYWNlX2FycmF5LCBudWxsYWJsZV9pZmFjZV9hcnJheSkgPD0gc3RkOjp0aWUocmhzLmlmYWNlLCByaHMubnVsbGFibGVfaWZhY2UsIHJocy5pZmFjZV9hcnJheSwgcmhzLm51bGxhYmxlX2lmYWNlX2FycmF5KTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBNeVBhcmNlbGFibGUmIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKGlmYWNlLCBudWxsYWJsZV9pZmFjZSwgaWZhY2VfYXJyYXksIG51bGxhYmxlX2lmYWNlX2FycmF5KSA9PSBzdGQ6OnRpZShyaHMuaWZhY2UsIHJocy5udWxsYWJsZV9pZmFjZSwgcmhzLmlmYWNlX2FycmF5LCByaHMubnVsbGFibGVfaWZhY2VfYXJyYXkpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgTXlQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZShpZmFjZSwgbnVsbGFibGVfaWZhY2UsIGlmYWNlX2FycmF5LCBudWxsYWJsZV9pZmFjZV9hcnJheSkgPiBzdGQ6OnRpZShyaHMuaWZhY2UsIHJocy5udWxsYWJsZV9pZmFjZSwgcmhzLmlmYWNlX2FycmF5LCByaHMubnVsbGFibGVfaWZhY2VfYXJyYXkpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IE15UGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoaWZhY2UsIG51bGxhYmxlX2lmYWNlLCBpZmFjZV9hcnJheSwgbnVsbGFibGVfaWZhY2VfYXJyYXkpID49IHN0ZDo6dGllKHJocy5pZmFjZSwgcmhzLm51bGxhYmxlX2lmYWNlLCByaHMuaWZhY2VfYXJyYXksIHJocy5udWxsYWJsZV9pZmFjZV9hcnJheSk7CisgICAgfQorCisgICAgc3RhdGljIGNvbnN0IDo6bmRrOjpwYXJjZWxhYmxlX3N0YWJpbGl0eV90IF9haWRsX3N0YWJpbGl0eSA9IDo6bmRrOjpTVEFCSUxJVFlfTE9DQUw7CisgICAgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOworICAgICAgb3MgPDwgIk15UGFyY2VsYWJsZXsiOworICAgICAgb3MgPDwgImlmYWNlOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGlmYWNlKTsKKyAgICAgIG9zIDw8ICIsIG51bGxhYmxlX2lmYWNlOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKG51bGxhYmxlX2lmYWNlKTsKKyAgICAgIG9zIDw8ICIsIGlmYWNlX2FycmF5OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGlmYWNlX2FycmF5KTsKKyAgICAgIG9zIDw8ICIsIG51bGxhYmxlX2lmYWNlX2FycmF5OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKG51bGxhYmxlX2lmYWNlX2FycmF5KTsKKyAgICAgIG9zIDw8ICJ9IjsKKyAgICAgIHJldHVybiBvcy5zdHIoKTsKKyAgICB9CisgIH07CisgIGNsYXNzIE15VW5pb24geworICBwdWJsaWM6CisgICAgdHlwZWRlZiBzdGQ6OmZhbHNlX3R5cGUgZml4ZWRfc2l6ZTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciogZGVzY3JpcHRvcjsKKworICAgIGVudW0gY2xhc3MgVGFnIDogaW50MzJfdCB7CisgICAgICBpZmFjZSA9IDAsCisgICAgICBudWxsYWJsZV9pZmFjZSA9IDEsCisgICAgICBpZmFjZV9hcnJheSA9IDIsCisgICAgICBudWxsYWJsZV9pZmFjZV9hcnJheSA9IDMsCisgICAgfTsKKworICAgIC8vIEV4cG9zZSB0YWcgc3ltYm9scyBmb3IgbGVnYWN5IGNvZGUKKyAgICBzdGF0aWMgY29uc3QgaW5saW5lIFRhZyBpZmFjZSA9IFRhZzo6aWZhY2U7CisgICAgc3RhdGljIGNvbnN0IGlubGluZSBUYWcgbnVsbGFibGVfaWZhY2UgPSBUYWc6Om51bGxhYmxlX2lmYWNlOworICAgIHN0YXRpYyBjb25zdCBpbmxpbmUgVGFnIGlmYWNlX2FycmF5ID0gVGFnOjppZmFjZV9hcnJheTsKKyAgICBzdGF0aWMgY29uc3QgaW5saW5lIFRhZyBudWxsYWJsZV9pZmFjZV9hcnJheSA9IFRhZzo6bnVsbGFibGVfaWZhY2VfYXJyYXk7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIF9ub3Rfc2VsZiA9ICFzdGQ6OmlzX3NhbWVfdjxzdGQ6OnJlbW92ZV9jdl90PHN0ZDo6cmVtb3ZlX3JlZmVyZW5jZV90PF9UcD4+LCBNeVVuaW9uPjsKKworICAgIE15VW5pb24oKSA6IF92YWx1ZShzdGQ6OmluX3BsYWNlX2luZGV4PHN0YXRpY19jYXN0PHNpemVfdD4oaWZhY2UpPiwgc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+KCkpIHsgfQorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgPSBzdGQ6OmVuYWJsZV9pZl90PF9ub3Rfc2VsZjxfVHA+Pj4KKyAgICAvLyBOT0xJTlRORVhUTElORShnb29nbGUtZXhwbGljaXQtY29uc3RydWN0b3IpCisgICAgY29uc3RleHByIE15VW5pb24oX1RwJiYgX2FyZykKKyAgICAgICAgOiBfdmFsdWUoc3RkOjpmb3J3YXJkPF9UcD4oX2FyZykpIHt9CisKKyAgICB0ZW1wbGF0ZSA8c2l6ZV90IF9OcCwgdHlwZW5hbWUuLi4gX1RwPgorICAgIGNvbnN0ZXhwciBleHBsaWNpdCBNeVVuaW9uKHN0ZDo6aW5fcGxhY2VfaW5kZXhfdDxfTnA+LCBfVHAmJi4uLiBfYXJncykKKyAgICAgICAgOiBfdmFsdWUoc3RkOjppbl9wbGFjZV9pbmRleDxfTnA+LCBzdGQ6OmZvcndhcmQ8X1RwPihfYXJncykuLi4pIHt9CisKKyAgICB0ZW1wbGF0ZSA8VGFnIF90YWcsIHR5cGVuYW1lLi4uIF9UcD4KKyAgICBzdGF0aWMgTXlVbmlvbiBtYWtlKF9UcCYmLi4uIF9hcmdzKSB7CisgICAgICByZXR1cm4gTXlVbmlvbihzdGQ6OmluX3BsYWNlX2luZGV4PHN0YXRpY19jYXN0PHNpemVfdD4oX3RhZyk+LCBzdGQ6OmZvcndhcmQ8X1RwPihfYXJncykuLi4pOworICAgIH0KKworICAgIHRlbXBsYXRlIDxUYWcgX3RhZywgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZS4uLiBfVXA+CisgICAgc3RhdGljIE15VW5pb24gbWFrZShzdGQ6OmluaXRpYWxpemVyX2xpc3Q8X1RwPiBfaWwsIF9VcCYmLi4uIF9hcmdzKSB7CisgICAgICByZXR1cm4gTXlVbmlvbihzdGQ6OmluX3BsYWNlX2luZGV4PHN0YXRpY19jYXN0PHNpemVfdD4oX3RhZyk+LCBzdGQ6Om1vdmUoX2lsKSwgc3RkOjpmb3J3YXJkPF9VcD4oX2FyZ3MpLi4uKTsKKyAgICB9CisKKyAgICBUYWcgZ2V0VGFnKCkgY29uc3QgeworICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFRhZz4oX3ZhbHVlLmluZGV4KCkpOworICAgIH0KKworICAgIHRlbXBsYXRlIDxUYWcgX3RhZz4KKyAgICBjb25zdCBhdXRvJiBnZXQoKSBjb25zdCB7CisgICAgICBpZiAoZ2V0VGFnKCkgIT0gX3RhZykgeyBfX2Fzc2VydDIoX19GSUxFX18sIF9fTElORV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fLCAiYmFkIGFjY2VzczogYSB3cm9uZyB0YWciKTsgfQorICAgICAgcmV0dXJuIHN0ZDo6Z2V0PHN0YXRpY19jYXN0PHNpemVfdD4oX3RhZyk+KF92YWx1ZSk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPFRhZyBfdGFnPgorICAgIGF1dG8mIGdldCgpIHsKKyAgICAgIGlmIChnZXRUYWcoKSAhPSBfdGFnKSB7IF9fYXNzZXJ0MihfX0ZJTEVfXywgX19MSU5FX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18sICJiYWQgYWNjZXNzOiBhIHdyb25nIHRhZyIpOyB9CisgICAgICByZXR1cm4gc3RkOjpnZXQ8c3RhdGljX2Nhc3Q8c2l6ZV90PihfdGFnKT4oX3ZhbHVlKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8VGFnIF90YWcsIHR5cGVuYW1lLi4uIF9UcD4KKyAgICB2b2lkIHNldChfVHAmJi4uLiBfYXJncykgeworICAgICAgX3ZhbHVlLmVtcGxhY2U8c3RhdGljX2Nhc3Q8c2l6ZV90PihfdGFnKT4oc3RkOjpmb3J3YXJkPF9UcD4oX2FyZ3MpLi4uKTsKKyAgICB9CisKKyAgICBiaW5kZXJfc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogX3BhcmNlbCk7CisgICAgYmluZGVyX3N0YXR1c190IHdyaXRlVG9QYXJjZWwoQVBhcmNlbCogX3BhcmNlbCkgY29uc3Q7CisKKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IE15VW5pb24mIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIF92YWx1ZSAhPSByaHMuX3ZhbHVlOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgTXlVbmlvbiYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gX3ZhbHVlIDwgcmhzLl92YWx1ZTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBNeVVuaW9uJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBfdmFsdWUgPD0gcmhzLl92YWx1ZTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBNeVVuaW9uJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBfdmFsdWUgPT0gcmhzLl92YWx1ZTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IE15VW5pb24mIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIF92YWx1ZSA+IHJocy5fdmFsdWU7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgTXlVbmlvbiYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gX3ZhbHVlID49IHJocy5fdmFsdWU7CisgICAgfQorCisgICAgc3RhdGljIGNvbnN0IDo6bmRrOjpwYXJjZWxhYmxlX3N0YWJpbGl0eV90IF9haWRsX3N0YWJpbGl0eSA9IDo6bmRrOjpTVEFCSUxJVFlfTE9DQUw7CisgICAgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOworICAgICAgb3MgPDwgIk15VW5pb257IjsKKyAgICAgIHN3aXRjaCAoZ2V0VGFnKCkpIHsKKyAgICAgIGNhc2UgaWZhY2U6IG9zIDw8ICJpZmFjZTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhnZXQ8aWZhY2U+KCkpOyBicmVhazsKKyAgICAgIGNhc2UgbnVsbGFibGVfaWZhY2U6IG9zIDw8ICJudWxsYWJsZV9pZmFjZTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhnZXQ8bnVsbGFibGVfaWZhY2U+KCkpOyBicmVhazsKKyAgICAgIGNhc2UgaWZhY2VfYXJyYXk6IG9zIDw8ICJpZmFjZV9hcnJheTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhnZXQ8aWZhY2VfYXJyYXk+KCkpOyBicmVhazsKKyAgICAgIGNhc2UgbnVsbGFibGVfaWZhY2VfYXJyYXk6IG9zIDw8ICJudWxsYWJsZV9pZmFjZV9hcnJheTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhnZXQ8bnVsbGFibGVfaWZhY2VfYXJyYXk+KCkpOyBicmVhazsKKyAgICAgIH0KKyAgICAgIG9zIDw8ICJ9IjsKKyAgICAgIHJldHVybiBvcy5zdHIoKTsKKyAgICB9CisgIHByaXZhdGU6CisgICAgc3RkOjp2YXJpYW50PHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPiwgc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+LCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+LCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+PiBfdmFsdWU7CisgIH07CisKKyAgYmluZGVyX3N0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIHBhcmNlbCk7CisgIGJpbmRlcl9zdGF0dXNfdCB3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIHBhcmNlbCkgY29uc3Q7CisKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBBcnJheU9mSW50ZXJmYWNlcyYpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoKSAhPSBzdGQ6OnRpZSgpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBBcnJheU9mSW50ZXJmYWNlcyYpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoKSA8IHN0ZDo6dGllKCk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBBcnJheU9mSW50ZXJmYWNlcyYpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoKSA8PSBzdGQ6OnRpZSgpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgQXJyYXlPZkludGVyZmFjZXMmKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKCkgPT0gc3RkOjp0aWUoKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgQXJyYXlPZkludGVyZmFjZXMmKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKCkgPiBzdGQ6OnRpZSgpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgQXJyYXlPZkludGVyZmFjZXMmKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKCkgPj0gc3RkOjp0aWUoKTsKKyAgfQorCisgIHN0YXRpYyBjb25zdCA6Om5kazo6cGFyY2VsYWJsZV9zdGFiaWxpdHlfdCBfYWlkbF9zdGFiaWxpdHkgPSA6Om5kazo6U1RBQklMSVRZX0xPQ0FMOworICBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOworICAgIG9zIDw8ICJBcnJheU9mSW50ZXJmYWNlc3siOworICAgIG9zIDw8ICJ9IjsKKyAgICByZXR1cm4gb3Muc3RyKCk7CisgIH0KK307Cit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CitbW25vZGlzY2FyZF1dIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoQXJyYXlPZkludGVyZmFjZXM6Ok15VW5pb246OlRhZyB2YWwpIHsKKyAgc3dpdGNoKHZhbCkgeworICBjYXNlIEFycmF5T2ZJbnRlcmZhY2VzOjpNeVVuaW9uOjpUYWc6OmlmYWNlOgorICAgIHJldHVybiAiaWZhY2UiOworICBjYXNlIEFycmF5T2ZJbnRlcmZhY2VzOjpNeVVuaW9uOjpUYWc6Om51bGxhYmxlX2lmYWNlOgorICAgIHJldHVybiAibnVsbGFibGVfaWZhY2UiOworICBjYXNlIEFycmF5T2ZJbnRlcmZhY2VzOjpNeVVuaW9uOjpUYWc6OmlmYWNlX2FycmF5OgorICAgIHJldHVybiAiaWZhY2VfYXJyYXkiOworICBjYXNlIEFycmF5T2ZJbnRlcmZhY2VzOjpNeVVuaW9uOjpUYWc6Om51bGxhYmxlX2lmYWNlX2FycmF5OgorICAgIHJldHVybiAibnVsbGFibGVfaWZhY2VfYXJyYXkiOworICBkZWZhdWx0OgorICAgIHJldHVybiBzdGQ6OnRvX3N0cmluZyhzdGF0aWNfY2FzdDxpbnQzMl90Pih2YWwpKTsKKyAgfQorfQorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCituYW1lc3BhY2UgbmRrIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XYysrMTctZXh0ZW5zaW9ucyIKK3RlbXBsYXRlIDw+Citjb25zdGV4cHIgaW5saW5lIHN0ZDo6YXJyYXk8YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpNeVVuaW9uOjpUYWcsIDQ+IGVudW1fdmFsdWVzPGFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6TXlVbmlvbjo6VGFnPiA9IHsKKyAgYWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpNeVVuaW9uOjpUYWc6OmlmYWNlLAorICBhaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6Ok15VW5pb246OlRhZzo6bnVsbGFibGVfaWZhY2UsCisgIGFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6TXlVbmlvbjo6VGFnOjppZmFjZV9hcnJheSwKKyAgYWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpNeVVuaW9uOjpUYWc6Om51bGxhYmxlX2lmYWNlX2FycmF5LAorfTsKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIG5kawpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQmFja2VuZFR5cGUuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JhY2tlbmRUeXBlLmgKc2ltaWxhcml0eSBpbmRleCA4OSUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQmFja2VuZFR5cGUuaApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQmFja2VuZFR5cGUuaAppbmRleCA2ODM4Y2E3Li5mNjllNDMzIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CYWNrZW5kVHlwZS5oCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JhY2tlbmRUeXBlLmgKQEAgLTEsMTUgKzEsMTYgQEAKICNwcmFnbWEgb25jZQogCisjaW5jbHVkZSA8YXJyYXk+CiAjaW5jbHVkZSA8Y3N0ZGludD4KICNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8b3B0aW9uYWw+CiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9lbnVtcy5oPgogI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAogI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3N0YWJpbGl0eS5oPgogI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKLSNpbmNsdWRlIDxhcnJheT4KLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9lbnVtcy5oPgorCiBuYW1lc3BhY2UgYWlkbCB7CiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgYWlkbCB7CkBAIC0yMSw2ICsyMiwxNCBAQAogICBSVVNUID0gMywKIH07CiAKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKIFtbbm9kaXNjYXJkXV0gc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZyhCYWNrZW5kVHlwZSB2YWwpIHsKICAgc3dpdGNoKHZhbCkgewogICBjYXNlIEJhY2tlbmRUeXBlOjpDUFA6CkBAIC01Miw0ICs2MSw0IEBACiB9OwogI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAogfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIG5kawpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5EZXByZWNhdGVkUGFyY2VsYWJsZS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5BcnJheU9mSW50ZXJmYWNlcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5EZXByZWNhdGVkUGFyY2VsYWJsZS5oCmNvcHkgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5BcnJheU9mSW50ZXJmYWNlcy5oCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CbkJhY2tlbmRUeXBlLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CbkJhY2tlbmRUeXBlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuQmFja2VuZFR5cGUuaApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5CYWNrZW5kVHlwZS5oCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CbkJ5dGVFbnVtLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CbkJ5dGVFbnVtLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuQnl0ZUVudW0uaApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5CeXRlRW51bS5oCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CbkNvbnN0YW50RXhwcmVzc2lvbkVudW0uaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuQ29uc3RhbnRFeHByZXNzaW9uRW51bS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CbkNvbnN0YW50RXhwcmVzc2lvbkVudW0uaApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5Db25zdGFudEV4cHJlc3Npb25FbnVtLmgKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuRGVwcmVjYXRlZC5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5EZXByZWNhdGVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU2ZTlhNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuRGVwcmVjYXRlZC5oCkBAIC0wLDAgKzEsMzkgQEAKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvSURlcHJlY2F0ZWQuaCIKKworI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2liaW5kZXIuaD4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorCisjaWZuZGVmIF9fQklPTklDX18KKyNpZm5kZWYgX19hc3NlcnQyCisjZGVmaW5lIF9fYXNzZXJ0MihhLGIsYyxkKSAoKHZvaWQpMCkKKyNlbmRpZgorI2VuZGlmCisKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CitjbGFzcyBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKCJ0ZXN0IikpKSBCbkRlcHJlY2F0ZWQgOiBwdWJsaWMgOjpuZGs6OkJuQ0ludGVyZmFjZTxJRGVwcmVjYXRlZD4geworcHVibGljOgorICBCbkRlcHJlY2F0ZWQoKTsKKyAgdmlydHVhbCB+Qm5EZXByZWNhdGVkKCk7Citwcm90ZWN0ZWQ6CisgIDo6bmRrOjpTcEFJQmluZGVyIGNyZWF0ZUJpbmRlcigpIG92ZXJyaWRlOworcHJpdmF0ZToKK307CitjbGFzcyBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKCJ0ZXN0IikpKSBJRGVwcmVjYXRlZERlbGVnYXRvciA6IHB1YmxpYyBCbkRlcHJlY2F0ZWQgeworcHVibGljOgorICBleHBsaWNpdCBJRGVwcmVjYXRlZERlbGVnYXRvcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SURlcHJlY2F0ZWQ+ICZpbXBsKSA6IF9pbXBsKGltcGwpIHsKKyAgfQorCitwcm90ZWN0ZWQ6Citwcml2YXRlOgorICBzdGQ6OnNoYXJlZF9wdHI8SURlcHJlY2F0ZWQ+IF9pbXBsOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CbkRlcHJlY2F0ZWRFbnVtLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CbkRlcHJlY2F0ZWRFbnVtLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuRGVwcmVjYXRlZEVudW0uaApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5EZXByZWNhdGVkRW51bS5oCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CbkRlcHJlY2F0ZWRQYXJjZWxhYmxlLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CbkRlcHJlY2F0ZWRQYXJjZWxhYmxlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuRGVwcmVjYXRlZFBhcmNlbGFibGUuaApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5EZXByZWNhdGVkUGFyY2VsYWJsZS5oCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CblVuaW9uLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CbkZpeGVkU2l6ZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5Vbmlvbi5oCmNvcHkgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5GaXhlZFNpemUuaApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5HZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGUuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuR2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuR2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxlLmgKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuR2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxlLmgKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuSW50RW51bS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5JbnRFbnVtLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuSW50RW51bS5oCnJlbmFtZSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CbkludEVudW0uaApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5Vbmlvbi5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5MaXN0T2ZJbnRlcmZhY2VzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CblVuaW9uLmgKY29weSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9Cbkxpc3RPZkludGVyZmFjZXMuaApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5Mb25nRW51bS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5Mb25nRW51bS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CbkxvbmdFbnVtLmgKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuTG9uZ0VudW0uaApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5OYW1lZENhbGxiYWNrLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9Cbk5hbWVkQ2FsbGJhY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTQ2NWZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5OYW1lZENhbGxiYWNrLmgKQEAgLTAsMCArMSw0MiBAQAorI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9JTmFtZWRDYWxsYmFjay5oIgorCisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaWJpbmRlci5oPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisKKyNpZm5kZWYgX19CSU9OSUNfXworI2lmbmRlZiBfX2Fzc2VydDIKKyNkZWZpbmUgX19hc3NlcnQyKGEsYixjLGQpICgodm9pZCkwKQorI2VuZGlmCisjZW5kaWYKKworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK2NsYXNzIEJuTmFtZWRDYWxsYmFjayA6IHB1YmxpYyA6Om5kazo6Qm5DSW50ZXJmYWNlPElOYW1lZENhbGxiYWNrPiB7CitwdWJsaWM6CisgIEJuTmFtZWRDYWxsYmFjaygpOworICB2aXJ0dWFsIH5Cbk5hbWVkQ2FsbGJhY2soKTsKK3Byb3RlY3RlZDoKKyAgOjpuZGs6OlNwQUlCaW5kZXIgY3JlYXRlQmluZGVyKCkgb3ZlcnJpZGU7Citwcml2YXRlOgorfTsKK2NsYXNzIElOYW1lZENhbGxiYWNrRGVsZWdhdG9yIDogcHVibGljIEJuTmFtZWRDYWxsYmFjayB7CitwdWJsaWM6CisgIGV4cGxpY2l0IElOYW1lZENhbGxiYWNrRGVsZWdhdG9yKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJTmFtZWRDYWxsYmFjaz4gJmltcGwpIDogX2ltcGwoaW1wbCkgeworICB9CisKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgR2V0TmFtZShzdGQ6OnN0cmluZyogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9pbXBsLT5HZXROYW1lKF9haWRsX3JldHVybik7CisgIH0KK3Byb3RlY3RlZDoKK3ByaXZhdGU6CisgIHN0ZDo6c2hhcmVkX3B0cjxJTmFtZWRDYWxsYmFjaz4gX2ltcGw7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuTmV3TmFtZS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5OZXdOYW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhmY2JhYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuTmV3TmFtZS5oCkBAIC0wLDAgKzEsNDIgQEAKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvSU5ld05hbWUuaCIKKworI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2liaW5kZXIuaD4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorCisjaWZuZGVmIF9fQklPTklDX18KKyNpZm5kZWYgX19hc3NlcnQyCisjZGVmaW5lIF9fYXNzZXJ0MihhLGIsYyxkKSAoKHZvaWQpMCkKKyNlbmRpZgorI2VuZGlmCisKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CitjbGFzcyBCbk5ld05hbWUgOiBwdWJsaWMgOjpuZGs6OkJuQ0ludGVyZmFjZTxJTmV3TmFtZT4geworcHVibGljOgorICBCbk5ld05hbWUoKTsKKyAgdmlydHVhbCB+Qm5OZXdOYW1lKCk7Citwcm90ZWN0ZWQ6CisgIDo6bmRrOjpTcEFJQmluZGVyIGNyZWF0ZUJpbmRlcigpIG92ZXJyaWRlOworcHJpdmF0ZToKK307CitjbGFzcyBJTmV3TmFtZURlbGVnYXRvciA6IHB1YmxpYyBCbk5ld05hbWUgeworcHVibGljOgorICBleHBsaWNpdCBJTmV3TmFtZURlbGVnYXRvcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SU5ld05hbWU+ICZpbXBsKSA6IF9pbXBsKGltcGwpIHsKKyAgfQorCisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlYWxOYW1lKHN0ZDo6c3RyaW5nKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2ltcGwtPlJlYWxOYW1lKF9haWRsX3JldHVybik7CisgIH0KK3Byb3RlY3RlZDoKK3ByaXZhdGU6CisgIHN0ZDo6c2hhcmVkX3B0cjxJTmV3TmFtZT4gX2ltcGw7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuT2xkTmFtZS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5PbGROYW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA4ZmNjMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuT2xkTmFtZS5oCkBAIC0wLDAgKzEsNDIgQEAKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvSU9sZE5hbWUuaCIKKworI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2liaW5kZXIuaD4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorCisjaWZuZGVmIF9fQklPTklDX18KKyNpZm5kZWYgX19hc3NlcnQyCisjZGVmaW5lIF9fYXNzZXJ0MihhLGIsYyxkKSAoKHZvaWQpMCkKKyNlbmRpZgorI2VuZGlmCisKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CitjbGFzcyBCbk9sZE5hbWUgOiBwdWJsaWMgOjpuZGs6OkJuQ0ludGVyZmFjZTxJT2xkTmFtZT4geworcHVibGljOgorICBCbk9sZE5hbWUoKTsKKyAgdmlydHVhbCB+Qm5PbGROYW1lKCk7Citwcm90ZWN0ZWQ6CisgIDo6bmRrOjpTcEFJQmluZGVyIGNyZWF0ZUJpbmRlcigpIG92ZXJyaWRlOworcHJpdmF0ZToKK307CitjbGFzcyBJT2xkTmFtZURlbGVnYXRvciA6IHB1YmxpYyBCbk9sZE5hbWUgeworcHVibGljOgorICBleHBsaWNpdCBJT2xkTmFtZURlbGVnYXRvcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SU9sZE5hbWU+ICZpbXBsKSA6IF9pbXBsKGltcGwpIHsKKyAgfQorCisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlYWxOYW1lKHN0ZDo6c3RyaW5nKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2ltcGwtPlJlYWxOYW1lKF9haWRsX3JldHVybik7CisgIH0KK3Byb3RlY3RlZDoKK3ByaXZhdGU6CisgIHN0ZDo6c2hhcmVkX3B0cjxJT2xkTmFtZT4gX2ltcGw7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmcuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmcuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5PdGhlclBhcmNlbGFibGVGb3JUb1N0cmluZy5oCnJlbmFtZSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9Cbk90aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nLmgKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuUGFyY2VsYWJsZUZvclRvU3RyaW5nLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CblBhcmNlbGFibGVGb3JUb1N0cmluZy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CblBhcmNlbGFibGVGb3JUb1N0cmluZy5oCnJlbmFtZSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CblBhcmNlbGFibGVGb3JUb1N0cmluZy5oCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CblVuaW9uLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CblJlY3Vyc2l2ZUxpc3QuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuVW5pb24uaApjb3B5IHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuUmVjdXJzaXZlTGlzdC5oCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CblN0cnVjdHVyZWRQYXJjZWxhYmxlLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CblN0cnVjdHVyZWRQYXJjZWxhYmxlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuU3RydWN0dXJlZFBhcmNlbGFibGUuaApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5oCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CblRlc3RTZXJ2aWNlLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CblRlc3RTZXJ2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I1YTM3ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuVGVzdFNlcnZpY2UuaApAQCAtMCwwICsxLDIzNyBAQAorI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9JVGVzdFNlcnZpY2UuaCIKKworI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2liaW5kZXIuaD4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorCisjaWZuZGVmIF9fQklPTklDX18KKyNpZm5kZWYgX19hc3NlcnQyCisjZGVmaW5lIF9fYXNzZXJ0MihhLGIsYyxkKSAoKHZvaWQpMCkKKyNlbmRpZgorI2VuZGlmCisKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CitjbGFzcyBCblRlc3RTZXJ2aWNlIDogcHVibGljIDo6bmRrOjpCbkNJbnRlcmZhY2U8SVRlc3RTZXJ2aWNlPiB7CitwdWJsaWM6CisgIEJuVGVzdFNlcnZpY2UoKTsKKyAgdmlydHVhbCB+Qm5UZXN0U2VydmljZSgpOworcHJvdGVjdGVkOgorICA6Om5kazo6U3BBSUJpbmRlciBjcmVhdGVCaW5kZXIoKSBvdmVycmlkZTsKK3ByaXZhdGU6Cit9OworY2xhc3MgSVRlc3RTZXJ2aWNlRGVsZWdhdG9yIDogcHVibGljIEJuVGVzdFNlcnZpY2UgeworcHVibGljOgorICBleHBsaWNpdCBJVGVzdFNlcnZpY2VEZWxlZ2F0b3IoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElUZXN0U2VydmljZT4gJmltcGwpIDogX2ltcGwoaW1wbCkgeworICB9CisKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgVW5pbXBsZW1lbnRlZE1ldGhvZChpbnQzMl90IGluX2FyZywgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9pbXBsLT5VbmltcGxlbWVudGVkTWV0aG9kKGluX2FyZywgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6Om5kazo6U2NvcGVkQVN0YXR1cyBEZXByZWNhdGVkKCkgb3ZlcnJpZGUgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCgidG8gbWFrZSBzdXJlIHdlIGhhdmUgc29tZXRoaW5nIGluIHN5c3RlbS90b29scy9haWRsIHdoaWNoIGRvZXMgYSBjb21waWxlIGNoZWNrIG9mIGRlcHJlY2F0ZWQgYW5kIG1ha2Ugc3VyZSB0aGlzIGlzIHJlZmxlY3RlZCBpbiBnb2xkZW5zIikpKSB7CisgICAgcmV0dXJuIF9pbXBsLT5EZXByZWNhdGVkKCk7CisgIH0KKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgVGVzdE9uZXdheSgpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2ltcGwtPlRlc3RPbmV3YXkoKTsKKyAgfQorICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXRCb29sZWFuKGJvb2wgaW5fdG9rZW4sIGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfaW1wbC0+UmVwZWF0Qm9vbGVhbihpbl90b2tlbiwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXRCeXRlKGludDhfdCBpbl90b2tlbiwgaW50OF90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2ltcGwtPlJlcGVhdEJ5dGUoaW5fdG9rZW4sIF9haWRsX3JldHVybik7CisgIH0KKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0Q2hhcihjaGFyMTZfdCBpbl90b2tlbiwgY2hhcjE2X3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfaW1wbC0+UmVwZWF0Q2hhcihpbl90b2tlbiwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXRJbnQoaW50MzJfdCBpbl90b2tlbiwgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9pbXBsLT5SZXBlYXRJbnQoaW5fdG9rZW4sIF9haWRsX3JldHVybik7CisgIH0KKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0TG9uZyhpbnQ2NF90IGluX3Rva2VuLCBpbnQ2NF90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2ltcGwtPlJlcGVhdExvbmcoaW5fdG9rZW4sIF9haWRsX3JldHVybik7CisgIH0KKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0RmxvYXQoZmxvYXQgaW5fdG9rZW4sIGZsb2F0KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2ltcGwtPlJlcGVhdEZsb2F0KGluX3Rva2VuLCBfYWlkbF9yZXR1cm4pOworICB9CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdERvdWJsZShkb3VibGUgaW5fdG9rZW4sIGRvdWJsZSogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9pbXBsLT5SZXBlYXREb3VibGUoaW5fdG9rZW4sIF9haWRsX3JldHVybik7CisgIH0KKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0U3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl90b2tlbiwgc3RkOjpzdHJpbmcqIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfaW1wbC0+UmVwZWF0U3RyaW5nKGluX3Rva2VuLCBfYWlkbF9yZXR1cm4pOworICB9CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdEJ5dGVFbnVtKDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJ5dGVFbnVtIGluX3Rva2VuLCA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCeXRlRW51bSogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9pbXBsLT5SZXBlYXRCeXRlRW51bShpbl90b2tlbiwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXRJbnRFbnVtKDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0gaW5fdG9rZW4sIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfaW1wbC0+UmVwZWF0SW50RW51bShpbl90b2tlbiwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXRMb25nRW51bSg6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMb25nRW51bSBpbl90b2tlbiwgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfaW1wbC0+UmVwZWF0TG9uZ0VudW0oaW5fdG9rZW4sIF9haWRsX3JldHVybik7CisgIH0KKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZUJvb2xlYW4oY29uc3Qgc3RkOjp2ZWN0b3I8Ym9vbD4mIGluX2lucHV0LCBzdGQ6OnZlY3Rvcjxib29sPiogb3V0X3JlcGVhdGVkLCBzdGQ6OnZlY3Rvcjxib29sPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9pbXBsLT5SZXZlcnNlQm9vbGVhbihpbl9pbnB1dCwgb3V0X3JlcGVhdGVkLCBfYWlkbF9yZXR1cm4pOworICB9CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJldmVyc2VCeXRlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9pbnB1dCwgc3RkOjp2ZWN0b3I8dWludDhfdD4qIG91dF9yZXBlYXRlZCwgc3RkOjp2ZWN0b3I8dWludDhfdD4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfaW1wbC0+UmV2ZXJzZUJ5dGUoaW5faW5wdXQsIG91dF9yZXBlYXRlZCwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXZlcnNlQ2hhcihjb25zdCBzdGQ6OnZlY3RvcjxjaGFyMTZfdD4mIGluX2lucHV0LCBzdGQ6OnZlY3RvcjxjaGFyMTZfdD4qIG91dF9yZXBlYXRlZCwgc3RkOjp2ZWN0b3I8Y2hhcjE2X3Q+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2ltcGwtPlJldmVyc2VDaGFyKGluX2lucHV0LCBvdXRfcmVwZWF0ZWQsIF9haWRsX3JldHVybik7CisgIH0KKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZUludChjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgaW5faW5wdXQsIHN0ZDo6dmVjdG9yPGludDMyX3Q+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6dmVjdG9yPGludDMyX3Q+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2ltcGwtPlJldmVyc2VJbnQoaW5faW5wdXQsIG91dF9yZXBlYXRlZCwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXZlcnNlTG9uZyhjb25zdCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiYgaW5faW5wdXQsIHN0ZDo6dmVjdG9yPGludDY0X3Q+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6dmVjdG9yPGludDY0X3Q+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2ltcGwtPlJldmVyc2VMb25nKGluX2lucHV0LCBvdXRfcmVwZWF0ZWQsIF9haWRsX3JldHVybik7CisgIH0KKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZUZsb2F0KGNvbnN0IHN0ZDo6dmVjdG9yPGZsb2F0PiYgaW5faW5wdXQsIHN0ZDo6dmVjdG9yPGZsb2F0Piogb3V0X3JlcGVhdGVkLCBzdGQ6OnZlY3RvcjxmbG9hdD4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfaW1wbC0+UmV2ZXJzZUZsb2F0KGluX2lucHV0LCBvdXRfcmVwZWF0ZWQsIF9haWRsX3JldHVybik7CisgIH0KKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZURvdWJsZShjb25zdCBzdGQ6OnZlY3Rvcjxkb3VibGU+JiBpbl9pbnB1dCwgc3RkOjp2ZWN0b3I8ZG91YmxlPiogb3V0X3JlcGVhdGVkLCBzdGQ6OnZlY3Rvcjxkb3VibGU+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2ltcGwtPlJldmVyc2VEb3VibGUoaW5faW5wdXQsIG91dF9yZXBlYXRlZCwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXZlcnNlU3RyaW5nKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgaW5faW5wdXQsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogb3V0X3JlcGVhdGVkLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfaW1wbC0+UmV2ZXJzZVN0cmluZyhpbl9pbnB1dCwgb3V0X3JlcGVhdGVkLCBfYWlkbF9yZXR1cm4pOworICB9CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJldmVyc2VCeXRlRW51bShjb25zdCBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCeXRlRW51bT4mIGluX2lucHV0LCBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCeXRlRW51bT4qIG91dF9yZXBlYXRlZCwgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Qnl0ZUVudW0+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2ltcGwtPlJldmVyc2VCeXRlRW51bShpbl9pbnB1dCwgb3V0X3JlcGVhdGVkLCBfYWlkbF9yZXR1cm4pOworICB9CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJldmVyc2VJbnRFbnVtKGNvbnN0IHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0+JiBpbl9pbnB1dCwgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bT4qIG91dF9yZXBlYXRlZCwgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bT4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfaW1wbC0+UmV2ZXJzZUludEVudW0oaW5faW5wdXQsIG91dF9yZXBlYXRlZCwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXZlcnNlTG9uZ0VudW0oY29uc3Qgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0+JiBpbl9pbnB1dCwgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9pbXBsLT5SZXZlcnNlTG9uZ0VudW0oaW5faW5wdXQsIG91dF9yZXBlYXRlZCwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6Om5kazo6U2NvcGVkQVN0YXR1cyBHZXRPdGhlclRlc3RTZXJ2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl9uYW1lLCBzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2ltcGwtPkdldE90aGVyVGVzdFNlcnZpY2UoaW5fbmFtZSwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6Om5kazo6U2NvcGVkQVN0YXR1cyBWZXJpZnlOYW1lKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4mIGluX3NlcnZpY2UsIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl9uYW1lLCBib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2ltcGwtPlZlcmlmeU5hbWUoaW5fc2VydmljZSwgaW5fbmFtZSwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6Om5kazo6U2NvcGVkQVN0YXR1cyBHZXRJbnRlcmZhY2VBcnJheShjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGluX25hbWVzLCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9pbXBsLT5HZXRJbnRlcmZhY2VBcnJheShpbl9uYW1lcywgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6Om5kazo6U2NvcGVkQVN0YXR1cyBWZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VBcnJheShjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+PiYgaW5fc2VydmljZXMsIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgaW5fbmFtZXMsIGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfaW1wbC0+VmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlQXJyYXkoaW5fc2VydmljZXMsIGluX25hbWVzLCBfYWlkbF9yZXR1cm4pOworICB9CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIEdldE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPj4+JiBpbl9uYW1lcywgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+Pj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfaW1wbC0+R2V0TnVsbGFibGVJbnRlcmZhY2VBcnJheShpbl9uYW1lcywgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6Om5kazo6U2NvcGVkQVN0YXR1cyBWZXJpZnlOYW1lc1dpdGhOdWxsYWJsZUludGVyZmFjZUFycmF5KGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPj4+JiBpbl9zZXJ2aWNlcywgY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPj4+JiBpbl9uYW1lcywgYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9pbXBsLT5WZXJpZnlOYW1lc1dpdGhOdWxsYWJsZUludGVyZmFjZUFycmF5KGluX3NlcnZpY2VzLCBpbl9uYW1lcywgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6Om5kazo6U2NvcGVkQVN0YXR1cyBHZXRJbnRlcmZhY2VMaXN0KGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4+PiYgaW5fbmFtZXMsIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPj4+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2ltcGwtPkdldEludGVyZmFjZUxpc3QoaW5fbmFtZXMsIF9haWRsX3JldHVybik7CisgIH0KKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlTGlzdChjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4+PiYgaW5fc2VydmljZXMsIGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4+PiYgaW5fbmFtZXMsIGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfaW1wbC0+VmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlTGlzdChpbl9zZXJ2aWNlcywgaW5fbmFtZXMsIF9haWRsX3JldHVybik7CisgIH0KKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZVN0cmluZ0xpc3QoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBpbl9pbnB1dCwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9pbXBsLT5SZXZlcnNlU3RyaW5nTGlzdChpbl9pbnB1dCwgb3V0X3JlcGVhdGVkLCBfYWlkbF9yZXR1cm4pOworICB9CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdFBhcmNlbEZpbGVEZXNjcmlwdG9yKGNvbnN0IDo6bmRrOjpTY29wZWRGaWxlRGVzY3JpcHRvciYgaW5fcmVhZCwgOjpuZGs6OlNjb3BlZEZpbGVEZXNjcmlwdG9yKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2ltcGwtPlJlcGVhdFBhcmNlbEZpbGVEZXNjcmlwdG9yKGluX3JlYWQsIF9haWRsX3JldHVybik7CisgIH0KKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZVBhcmNlbEZpbGVEZXNjcmlwdG9yQXJyYXkoY29uc3Qgc3RkOjp2ZWN0b3I8OjpuZGs6OlNjb3BlZEZpbGVEZXNjcmlwdG9yPiYgaW5faW5wdXQsIHN0ZDo6dmVjdG9yPDo6bmRrOjpTY29wZWRGaWxlRGVzY3JpcHRvcj4qIG91dF9yZXBlYXRlZCwgc3RkOjp2ZWN0b3I8OjpuZGs6OlNjb3BlZEZpbGVEZXNjcmlwdG9yPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9pbXBsLT5SZXZlcnNlUGFyY2VsRmlsZURlc2NyaXB0b3JBcnJheShpbl9pbnB1dCwgb3V0X3JlcGVhdGVkLCBfYWlkbF9yZXR1cm4pOworICB9CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFRocm93U2VydmljZUV4Y2VwdGlvbihpbnQzMl90IGluX2NvZGUpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2ltcGwtPlRocm93U2VydmljZUV4Y2VwdGlvbihpbl9jb2RlKTsKKyAgfQorICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXROdWxsYWJsZUludEFycmF5KGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8aW50MzJfdD4+JiBpbl9pbnB1dCwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxpbnQzMl90Pj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfaW1wbC0+UmVwZWF0TnVsbGFibGVJbnRBcnJheShpbl9pbnB1dCwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXROdWxsYWJsZUJ5dGVFbnVtQXJyYXkoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCeXRlRW51bT4+JiBpbl9pbnB1dCwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCeXRlRW51bT4+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2ltcGwtPlJlcGVhdE51bGxhYmxlQnl0ZUVudW1BcnJheShpbl9pbnB1dCwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXROdWxsYWJsZUludEVudW1BcnJheShjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0+PiYgaW5faW5wdXQsIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bT4+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2ltcGwtPlJlcGVhdE51bGxhYmxlSW50RW51bUFycmF5KGluX2lucHV0LCBfYWlkbF9yZXR1cm4pOworICB9CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdE51bGxhYmxlTG9uZ0VudW1BcnJheShjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtPj4mIGluX2lucHV0LCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtPj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfaW1wbC0+UmVwZWF0TnVsbGFibGVMb25nRW51bUFycmF5KGluX2lucHV0LCBfYWlkbF9yZXR1cm4pOworICB9CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdE51bGxhYmxlU3RyaW5nKGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+JiBpbl9pbnB1dCwgc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfaW1wbC0+UmVwZWF0TnVsbGFibGVTdHJpbmcoaW5faW5wdXQsIF9haWRsX3JldHVybik7CisgIH0KKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0TnVsbGFibGVTdHJpbmdMaXN0KGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4+PiYgaW5faW5wdXQsIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4+PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9pbXBsLT5SZXBlYXROdWxsYWJsZVN0cmluZ0xpc3QoaW5faW5wdXQsIF9haWRsX3JldHVybik7CisgIH0KKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlKGNvbnN0IHN0ZDo6b3B0aW9uYWw8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eT4mIGluX2lucHV0LCBzdGQ6Om9wdGlvbmFsPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6RW1wdHk+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2ltcGwtPlJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZShpbl9pbnB1dCwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXROdWxsYWJsZVBhcmNlbGFibGVBcnJheShjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eT4+PiYgaW5faW5wdXQsIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5Pj4+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2ltcGwtPlJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUFycmF5KGluX2lucHV0LCBfYWlkbF9yZXR1cm4pOworICB9CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUxpc3QoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6RW1wdHk+Pj4mIGluX2lucHV0LCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eT4+PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9pbXBsLT5SZXBlYXROdWxsYWJsZVBhcmNlbGFibGVMaXN0KGluX2lucHV0LCBfYWlkbF9yZXR1cm4pOworICB9CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFRha2VzQW5JQmluZGVyKGNvbnN0IDo6bmRrOjpTcEFJQmluZGVyJiBpbl9pbnB1dCkgb3ZlcnJpZGUgeworICAgIHJldHVybiBfaW1wbC0+VGFrZXNBbklCaW5kZXIoaW5faW5wdXQpOworICB9CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFRha2VzQU51bGxhYmxlSUJpbmRlcihjb25zdCA6Om5kazo6U3BBSUJpbmRlciYgaW5faW5wdXQpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2ltcGwtPlRha2VzQU51bGxhYmxlSUJpbmRlcihpbl9pbnB1dCk7CisgIH0KKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgVGFrZXNBbklCaW5kZXJMaXN0KGNvbnN0IHN0ZDo6dmVjdG9yPDo6bmRrOjpTcEFJQmluZGVyPiYgaW5faW5wdXQpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2ltcGwtPlRha2VzQW5JQmluZGVyTGlzdChpbl9pbnB1dCk7CisgIH0KKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgVGFrZXNBTnVsbGFibGVJQmluZGVyTGlzdChjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPDo6bmRrOjpTcEFJQmluZGVyPj4mIGluX2lucHV0KSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9pbXBsLT5UYWtlc0FOdWxsYWJsZUlCaW5kZXJMaXN0KGluX2lucHV0KTsKKyAgfQorICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXRVdGY4Q3BwU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl90b2tlbiwgc3RkOjpzdHJpbmcqIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfaW1wbC0+UmVwZWF0VXRmOENwcFN0cmluZyhpbl90b2tlbiwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXROdWxsYWJsZVV0ZjhDcHBTdHJpbmcoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4mIGluX3Rva2VuLCBzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9pbXBsLT5SZXBlYXROdWxsYWJsZVV0ZjhDcHBTdHJpbmcoaW5fdG9rZW4sIF9haWRsX3JldHVybik7CisgIH0KKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZVV0ZjhDcHBTdHJpbmcoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBpbl9pbnB1dCwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9pbXBsLT5SZXZlcnNlVXRmOENwcFN0cmluZyhpbl9pbnB1dCwgb3V0X3JlcGVhdGVkLCBfYWlkbF9yZXR1cm4pOworICB9CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJldmVyc2VOdWxsYWJsZVV0ZjhDcHBTdHJpbmcoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPj4+JiBpbl9pbnB1dCwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPj4+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4+PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9pbXBsLT5SZXZlcnNlTnVsbGFibGVVdGY4Q3BwU3RyaW5nKGluX2lucHV0LCBvdXRfcmVwZWF0ZWQsIF9haWRsX3JldHVybik7CisgIH0KKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZVV0ZjhDcHBTdHJpbmdMaXN0KGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4+PiYgaW5faW5wdXQsIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4+Piogb3V0X3JlcGVhdGVkLCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+Pj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfaW1wbC0+UmV2ZXJzZVV0ZjhDcHBTdHJpbmdMaXN0KGluX2lucHV0LCBvdXRfcmVwZWF0ZWQsIF9haWRsX3JldHVybik7CisgIH0KKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgR2V0Q2FsbGJhY2soYm9vbCBpbl9yZXR1cm5fbnVsbCwgc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9pbXBsLT5HZXRDYWxsYmFjayhpbl9yZXR1cm5fbnVsbCwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6Om5kazo6U2NvcGVkQVN0YXR1cyBGaWxsT3V0U3RydWN0dXJlZFBhcmNlbGFibGUoOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6U3RydWN0dXJlZFBhcmNlbGFibGUqIGluX3BhcmNlbCkgb3ZlcnJpZGUgeworICAgIHJldHVybiBfaW1wbC0+RmlsbE91dFN0cnVjdHVyZWRQYXJjZWxhYmxlKGluX3BhcmNlbCk7CisgIH0KKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0RXh0ZW5kYWJsZVBhcmNlbGFibGUoY29uc3QgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6ZXh0ZW5zaW9uOjpFeHRlbmRhYmxlUGFyY2VsYWJsZSYgaW5fZXAsIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OmV4dGVuc2lvbjo6RXh0ZW5kYWJsZVBhcmNlbGFibGUqIG91dF9lcDIpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2ltcGwtPlJlcGVhdEV4dGVuZGFibGVQYXJjZWxhYmxlKGluX2VwLCBvdXRfZXAyKTsKKyAgfQorICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXZlcnNlTGlzdChjb25zdCA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpSZWN1cnNpdmVMaXN0JiBpbl9saXN0LCA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpSZWN1cnNpdmVMaXN0KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2ltcGwtPlJldmVyc2VMaXN0KGluX2xpc3QsIF9haWRsX3JldHVybik7CisgIH0KKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZUlCaW5kZXJBcnJheShjb25zdCBzdGQ6OnZlY3Rvcjw6Om5kazo6U3BBSUJpbmRlcj4mIGluX2lucHV0LCBzdGQ6OnZlY3Rvcjw6Om5kazo6U3BBSUJpbmRlcj4qIG91dF9yZXBlYXRlZCwgc3RkOjp2ZWN0b3I8OjpuZGs6OlNwQUlCaW5kZXI+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2ltcGwtPlJldmVyc2VJQmluZGVyQXJyYXkoaW5faW5wdXQsIG91dF9yZXBlYXRlZCwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXZlcnNlTnVsbGFibGVJQmluZGVyQXJyYXkoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3Rvcjw6Om5kazo6U3BBSUJpbmRlcj4+JiBpbl9pbnB1dCwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3Rvcjw6Om5kazo6U3BBSUJpbmRlcj4+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8OjpuZGs6OlNwQUlCaW5kZXI+PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9pbXBsLT5SZXZlcnNlTnVsbGFibGVJQmluZGVyQXJyYXkoaW5faW5wdXQsIG91dF9yZXBlYXRlZCwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6Om5kazo6U2NvcGVkQVN0YXR1cyBHZXRPbGROYW1lSW50ZXJmYWNlKHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJT2xkTmFtZT4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfaW1wbC0+R2V0T2xkTmFtZUludGVyZmFjZShfYWlkbF9yZXR1cm4pOworICB9CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIEdldE5ld05hbWVJbnRlcmZhY2Uoc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOZXdOYW1lPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9pbXBsLT5HZXROZXdOYW1lSW50ZXJmYWNlKF9haWRsX3JldHVybik7CisgIH0KKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgR2V0VW5pb25UYWdzKGNvbnN0IHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlVuaW9uPiYgaW5faW5wdXQsIHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlVuaW9uOjpUYWc+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2ltcGwtPkdldFVuaW9uVGFncyhpbl9pbnB1dCwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6Om5kazo6U2NvcGVkQVN0YXR1cyBHZXRDcHBKYXZhVGVzdHMoOjpuZGs6OlNwQUlCaW5kZXIqIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfaW1wbC0+R2V0Q3BwSmF2YVRlc3RzKF9haWRsX3JldHVybik7CisgIH0KKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0QmFja2VuZFR5cGUoOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QmFja2VuZFR5cGUqIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfaW1wbC0+Z2V0QmFja2VuZFR5cGUoX2FpZGxfcmV0dXJuKTsKKyAgfQorcHJvdGVjdGVkOgorcHJpdmF0ZToKKyAgc3RkOjpzaGFyZWRfcHRyPElUZXN0U2VydmljZT4gX2ltcGw7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuVW5pb24uaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuVW5pb24uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5Vbmlvbi5oCnJlbmFtZSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CblVuaW9uLmgKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuVW5pb25XaXRoRmQuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuVW5pb25XaXRoRmQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5VbmlvbldpdGhGZC5oCnJlbmFtZSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CblVuaW9uV2l0aEZkLmgKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwRGVwcmVjYXRlZFBhcmNlbGFibGUuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwQXJyYXlPZkludGVyZmFjZXMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwRGVwcmVjYXRlZFBhcmNlbGFibGUuaApjb3B5IHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwQXJyYXlPZkludGVyZmFjZXMuaApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBCYWNrZW5kVHlwZS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBCYWNrZW5kVHlwZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcEJhY2tlbmRUeXBlLmgKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwQmFja2VuZFR5cGUuaApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBCeXRlRW51bS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBCeXRlRW51bS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcEJ5dGVFbnVtLmgKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwQnl0ZUVudW0uaApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBDb25zdGFudEV4cHJlc3Npb25FbnVtLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcENvbnN0YW50RXhwcmVzc2lvbkVudW0uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBDb25zdGFudEV4cHJlc3Npb25FbnVtLmgKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwQ29uc3RhbnRFeHByZXNzaW9uRW51bS5oCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcERlcHJlY2F0ZWQuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwRGVwcmVjYXRlZC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcERlcHJlY2F0ZWQuaApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBEZXByZWNhdGVkLmgKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwRGVwcmVjYXRlZEVudW0uaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwRGVwcmVjYXRlZEVudW0uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBEZXByZWNhdGVkRW51bS5oCnJlbmFtZSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcERlcHJlY2F0ZWRFbnVtLmgKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwRGVwcmVjYXRlZFBhcmNlbGFibGUuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwRGVwcmVjYXRlZFBhcmNlbGFibGUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBEZXByZWNhdGVkUGFyY2VsYWJsZS5oCnJlbmFtZSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcERlcHJlY2F0ZWRQYXJjZWxhYmxlLmgKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwVW5pb24uaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwRml4ZWRTaXplLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcFVuaW9uLmgKY29weSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcEZpeGVkU2l6ZS5oCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcEdlbmVyaWNTdHJ1Y3R1cmVkUGFyY2VsYWJsZS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBHZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBHZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGUuaApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBHZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGUuaApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBJbnRFbnVtLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcEludEVudW0uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBJbnRFbnVtLmgKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwSW50RW51bS5oCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcFVuaW9uLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcExpc3RPZkludGVyZmFjZXMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwVW5pb24uaApjb3B5IHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwTGlzdE9mSW50ZXJmYWNlcy5oCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcExvbmdFbnVtLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcExvbmdFbnVtLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwTG9uZ0VudW0uaApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBMb25nRW51bS5oCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcE5hbWVkQ2FsbGJhY2suaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwTmFtZWRDYWxsYmFjay5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcE5hbWVkQ2FsbGJhY2suaApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBOYW1lZENhbGxiYWNrLmgKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwTmV3TmFtZS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBOZXdOYW1lLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwTmV3TmFtZS5oCnJlbmFtZSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcE5ld05hbWUuaApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBPbGROYW1lLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcE9sZE5hbWUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBPbGROYW1lLmgKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwT2xkTmFtZS5oCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcE90aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcE90aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmcuaApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBPdGhlclBhcmNlbGFibGVGb3JUb1N0cmluZy5oCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcFBhcmNlbGFibGVGb3JUb1N0cmluZy5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBQYXJjZWxhYmxlRm9yVG9TdHJpbmcuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBQYXJjZWxhYmxlRm9yVG9TdHJpbmcuaApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBQYXJjZWxhYmxlRm9yVG9TdHJpbmcuaApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBVbmlvbi5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBSZWN1cnNpdmVMaXN0LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcFVuaW9uLmgKY29weSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcFJlY3Vyc2l2ZUxpc3QuaApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBTdHJ1Y3R1cmVkUGFyY2VsYWJsZS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBTdHJ1Y3R1cmVkUGFyY2VsYWJsZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcFN0cnVjdHVyZWRQYXJjZWxhYmxlLmgKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwU3RydWN0dXJlZFBhcmNlbGFibGUuaApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBUZXN0U2VydmljZS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBUZXN0U2VydmljZS5oCnNpbWlsYXJpdHkgaW5kZXggNjYlCnJlbmFtZSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwVGVzdFNlcnZpY2UuaApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBUZXN0U2VydmljZS5oCmluZGV4IDMwYjBmYTAuLjJjZDk3NjggMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwVGVzdFNlcnZpY2UuaAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcFRlc3RTZXJ2aWNlLmgKQEAgLTQwLDYgKzQwLDEyIEBACiAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJldmVyc2VMb25nRW51bShjb25zdCBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMb25nRW51bT4mIGluX2lucHV0LCBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMb25nRW51bT4qIG91dF9yZXBlYXRlZCwgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogICA6Om5kazo6U2NvcGVkQVN0YXR1cyBHZXRPdGhlclRlc3RTZXJ2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl9uYW1lLCBzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogICA6Om5kazo6U2NvcGVkQVN0YXR1cyBWZXJpZnlOYW1lKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4mIGluX3NlcnZpY2UsIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl9uYW1lLCBib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBHZXRJbnRlcmZhY2VBcnJheShjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGluX25hbWVzLCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlQXJyYXkoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPj4mIGluX3NlcnZpY2VzLCBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGluX25hbWVzLCBib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBHZXROdWxsYWJsZUludGVyZmFjZUFycmF5KGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4+PiYgaW5fbmFtZXMsIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPj4+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBWZXJpZnlOYW1lc1dpdGhOdWxsYWJsZUludGVyZmFjZUFycmF5KGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPj4+JiBpbl9zZXJ2aWNlcywgY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPj4+JiBpbl9uYW1lcywgYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgR2V0SW50ZXJmYWNlTGlzdChjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+Pj4mIGluX25hbWVzLCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4+PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlTGlzdChjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4+PiYgaW5fc2VydmljZXMsIGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4+PiYgaW5fbmFtZXMsIGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJldmVyc2VTdHJpbmdMaXN0KGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgaW5faW5wdXQsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogb3V0X3JlcGVhdGVkLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdFBhcmNlbEZpbGVEZXNjcmlwdG9yKGNvbnN0IDo6bmRrOjpTY29wZWRGaWxlRGVzY3JpcHRvciYgaW5fcmVhZCwgOjpuZGs6OlNjb3BlZEZpbGVEZXNjcmlwdG9yKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXZlcnNlUGFyY2VsRmlsZURlc2NyaXB0b3JBcnJheShjb25zdCBzdGQ6OnZlY3Rvcjw6Om5kazo6U2NvcGVkRmlsZURlc2NyaXB0b3I+JiBpbl9pbnB1dCwgc3RkOjp2ZWN0b3I8OjpuZGs6OlNjb3BlZEZpbGVEZXNjcmlwdG9yPiogb3V0X3JlcGVhdGVkLCBzdGQ6OnZlY3Rvcjw6Om5kazo6U2NvcGVkRmlsZURlc2NyaXB0b3I+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwpAQCAtNDksMTkgKzU1LDI4IEBACiAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdE51bGxhYmxlSW50RW51bUFycmF5KGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bT4+JiBpbl9pbnB1dCwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtPj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdE51bGxhYmxlTG9uZ0VudW1BcnJheShjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtPj4mIGluX2lucHV0LCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtPj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdE51bGxhYmxlU3RyaW5nKGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+JiBpbl9pbnB1dCwgc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdE51bGxhYmxlU3RyaW5nTGlzdChjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGluX2lucHV0LCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZShjb25zdCBzdGQ6Om9wdGlvbmFsPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlN0cnVjdHVyZWRQYXJjZWxhYmxlPiYgaW5faW5wdXQsIHN0ZDo6b3B0aW9uYWw8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6U3RydWN0dXJlZFBhcmNlbGFibGU+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXROdWxsYWJsZVN0cmluZ0xpc3QoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPj4+JiBpbl9pbnB1dCwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPj4+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXROdWxsYWJsZVBhcmNlbGFibGUoY29uc3Qgc3RkOjpvcHRpb25hbDw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5PiYgaW5faW5wdXQsIHN0ZDo6b3B0aW9uYWw8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eT4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUFycmF5KGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5Pj4+JiBpbl9pbnB1dCwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6RW1wdHk+Pj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUxpc3QoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6RW1wdHk+Pj4mIGluX2lucHV0LCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eT4+PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgVGFrZXNBbklCaW5kZXIoY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGluX2lucHV0KSBvdmVycmlkZTsKICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgVGFrZXNBTnVsbGFibGVJQmluZGVyKGNvbnN0IDo6bmRrOjpTcEFJQmluZGVyJiBpbl9pbnB1dCkgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFRha2VzQW5JQmluZGVyTGlzdChjb25zdCBzdGQ6OnZlY3Rvcjw6Om5kazo6U3BBSUJpbmRlcj4mIGluX2lucHV0KSBvdmVycmlkZTsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgVGFrZXNBTnVsbGFibGVJQmluZGVyTGlzdChjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPDo6bmRrOjpTcEFJQmluZGVyPj4mIGluX2lucHV0KSBvdmVycmlkZTsKICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0VXRmOENwcFN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgaW5fdG9rZW4sIHN0ZDo6c3RyaW5nKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXROdWxsYWJsZVV0ZjhDcHBTdHJpbmcoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4mIGluX3Rva2VuLCBzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZVV0ZjhDcHBTdHJpbmcoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBpbl9pbnB1dCwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZU51bGxhYmxlVXRmOENwcFN0cmluZyhjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+Pj4mIGluX2lucHV0LCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+Pj4qIG91dF9yZXBlYXRlZCwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPj4+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXZlcnNlVXRmOENwcFN0cmluZ0xpc3QoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBpbl9pbnB1dCwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZVV0ZjhDcHBTdHJpbmdMaXN0KGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4+PiYgaW5faW5wdXQsIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4+Piogb3V0X3JlcGVhdGVkLCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+Pj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIEdldENhbGxiYWNrKGJvb2wgaW5fcmV0dXJuX251bGwsIHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIEZpbGxPdXRTdHJ1Y3R1cmVkUGFyY2VsYWJsZSg6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpTdHJ1Y3R1cmVkUGFyY2VsYWJsZSogaW5fcGFyY2VsKSBvdmVycmlkZTsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0RXh0ZW5kYWJsZVBhcmNlbGFibGUoY29uc3QgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6ZXh0ZW5zaW9uOjpFeHRlbmRhYmxlUGFyY2VsYWJsZSYgaW5fZXAsIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OmV4dGVuc2lvbjo6RXh0ZW5kYWJsZVBhcmNlbGFibGUqIG91dF9lcDIpIG92ZXJyaWRlOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXZlcnNlTGlzdChjb25zdCA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpSZWN1cnNpdmVMaXN0JiBpbl9saXN0LCA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpSZWN1cnNpdmVMaXN0KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXZlcnNlSUJpbmRlckFycmF5KGNvbnN0IHN0ZDo6dmVjdG9yPDo6bmRrOjpTcEFJQmluZGVyPiYgaW5faW5wdXQsIHN0ZDo6dmVjdG9yPDo6bmRrOjpTcEFJQmluZGVyPiogb3V0X3JlcGVhdGVkLCBzdGQ6OnZlY3Rvcjw6Om5kazo6U3BBSUJpbmRlcj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJldmVyc2VOdWxsYWJsZUlCaW5kZXJBcnJheShjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPDo6bmRrOjpTcEFJQmluZGVyPj4mIGluX2lucHV0LCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPDo6bmRrOjpTcEFJQmluZGVyPj4qIG91dF9yZXBlYXRlZCwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3Rvcjw6Om5kazo6U3BBSUJpbmRlcj4+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogICA6Om5kazo6U2NvcGVkQVN0YXR1cyBHZXRPbGROYW1lSW50ZXJmYWNlKHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJT2xkTmFtZT4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIEdldE5ld05hbWVJbnRlcmZhY2Uoc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOZXdOYW1lPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgR2V0VW5pb25UYWdzKGNvbnN0IHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlVuaW9uPiYgaW5faW5wdXQsIHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlVuaW9uOjpUYWc+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogICA6Om5kazo6U2NvcGVkQVN0YXR1cyBHZXRDcHBKYXZhVGVzdHMoOjpuZGs6OlNwQUlCaW5kZXIqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldEJhY2tlbmRUeXBlKDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJhY2tlbmRUeXBlKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogfTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwVW5pb24uaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwVW5pb24uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBVbmlvbi5oCnJlbmFtZSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcFVuaW9uLmgKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwVW5pb25XaXRoRmQuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwVW5pb25XaXRoRmQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBVbmlvbldpdGhGZC5oCnJlbmFtZSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcFVuaW9uV2l0aEZkLmgKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0J5dGVFbnVtLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CeXRlRW51bS5oCnNpbWlsYXJpdHkgaW5kZXggODglCnJlbmFtZSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0J5dGVFbnVtLmgKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0J5dGVFbnVtLmgKaW5kZXggMzBhYzllNS4uOWNiMDE0NiAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnl0ZUVudW0uaAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CeXRlRW51bS5oCkBAIC0xLDE1ICsxLDE2IEBACiAjcHJhZ21hIG9uY2UKIAorI2luY2x1ZGUgPGFycmF5PgogI2luY2x1ZGUgPGNzdGRpbnQ+CiAjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPG9wdGlvbmFsPgogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfZW51bXMuaD4KICNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKICNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9zdGFiaWxpdHkuaD4KICNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCi0jaW5jbHVkZSA8YXJyYXk+Ci0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfZW51bXMuaD4KKwogbmFtZXNwYWNlIGFpZGwgewogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGFpZGwgewpAQCAtMjAsNiArMjEsMTQgQEAKICAgQkFaID0gMywKIH07CiAKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKIFtbbm9kaXNjYXJkXV0gc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZyhCeXRlRW51bSB2YWwpIHsKICAgc3dpdGNoKHZhbCkgewogICBjYXNlIEJ5dGVFbnVtOjpGT086CkBAIC00OCw0ICs1Nyw0IEBACiB9OwogI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAogfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIG5kawpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQ29uc3RhbnRFeHByZXNzaW9uRW51bS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQ29uc3RhbnRFeHByZXNzaW9uRW51bS5oCnNpbWlsYXJpdHkgaW5kZXggOTIlCnJlbmFtZSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0NvbnN0YW50RXhwcmVzc2lvbkVudW0uaApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQ29uc3RhbnRFeHByZXNzaW9uRW51bS5oCmluZGV4IDE4MDJkODQuLjVmYmNjMDAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0NvbnN0YW50RXhwcmVzc2lvbkVudW0uaAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9Db25zdGFudEV4cHJlc3Npb25FbnVtLmgKQEAgLTEsMTUgKzEsMTYgQEAKICNwcmFnbWEgb25jZQogCisjaW5jbHVkZSA8YXJyYXk+CiAjaW5jbHVkZSA8Y3N0ZGludD4KICNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8b3B0aW9uYWw+CiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9lbnVtcy5oPgogI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAogI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3N0YWJpbGl0eS5oPgogI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKLSNpbmNsdWRlIDxhcnJheT4KLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9lbnVtcy5oPgorCiBuYW1lc3BhY2UgYWlkbCB7CiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgYWlkbCB7CkBAIC0yNyw2ICsyOCwxNCBAQAogICBoZXhJbnQ2NF8xID0gMSwKIH07CiAKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKIFtbbm9kaXNjYXJkXV0gc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZyhDb25zdGFudEV4cHJlc3Npb25FbnVtIHZhbCkgewogICBzd2l0Y2godmFsKSB7CiAgIGNhc2UgQ29uc3RhbnRFeHByZXNzaW9uRW51bTo6ZGVjSW50MzJfMToKQEAgLTU4LDQgKzY3LDQgQEAKIH07CiAjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCiB9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgbmRrCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9EZXByZWNhdGVkRW51bS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvRGVwcmVjYXRlZEVudW0uaApzaW1pbGFyaXR5IGluZGV4IDc1JQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9EZXByZWNhdGVkRW51bS5oCnJlbmFtZSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9EZXByZWNhdGVkRW51bS5oCmluZGV4IDg1M2M4MDguLmZjZTczNmIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0RlcHJlY2F0ZWRFbnVtLmgKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvRGVwcmVjYXRlZEVudW0uaApAQCAtMSwxNSArMSwxNiBAQAogI3ByYWdtYSBvbmNlCiAKKyNpbmNsdWRlIDxhcnJheT4KICNpbmNsdWRlIDxjc3RkaW50PgogI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxvcHRpb25hbD4KICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2VudW1zLmg+CiAjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCiAjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfc3RhYmlsaXR5Lmg+CiAjZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAotI2luY2x1ZGUgPGFycmF5PgotI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2VudW1zLmg+CisKIG5hbWVzcGFjZSBhaWRsIHsKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBhaWRsIHsKQEAgLTIwLDcgKzIxLDE2IEBACiAgIEMgPSAyLAogfTsKIAotW1tub2Rpc2NhcmRdXSBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKERlcHJlY2F0ZWRFbnVtIHZhbCkgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCgidGVzdCIpKSk7Cit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMiCiBbW25vZGlzY2FyZF1dIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoRGVwcmVjYXRlZEVudW0gdmFsKSB7CiAgIHN3aXRjaCh2YWwpIHsKICAgY2FzZSBEZXByZWNhdGVkRW51bTo6QToKQEAgLTMzLDYgKzQzLDcgQEAKICAgICByZXR1cm4gc3RkOjp0b19zdHJpbmcoc3RhdGljX2Nhc3Q8aW50MzJfdD4odmFsKSk7CiAgIH0KIH0KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKIH0gIC8vIG5hbWVzcGFjZSB0ZXN0cwogfSAgLy8gbmFtZXNwYWNlIGFpZGwKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCkBAIC00MSwxMiArNTIsMTMgQEAKIG5hbWVzcGFjZSBpbnRlcm5hbCB7CiAjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAogI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XYysrMTctZXh0ZW5zaW9ucyIKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2RlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIgogdGVtcGxhdGUgPD4KLWNvbnN0ZXhwciBpbmxpbmUgc3RkOjphcnJheTxhaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6RGVwcmVjYXRlZEVudW0sIDM+IF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQoInRlc3QiKSkpIGVudW1fdmFsdWVzPGFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpEZXByZWNhdGVkRW51bT4gPSB7Citjb25zdGV4cHIgaW5saW5lIHN0ZDo6YXJyYXk8YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkRlcHJlY2F0ZWRFbnVtLCAzPiBlbnVtX3ZhbHVlczxhaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6RGVwcmVjYXRlZEVudW0+ID0gewogICBhaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6RGVwcmVjYXRlZEVudW06OkEsCiAgIGFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpEZXByZWNhdGVkRW51bTo6QiwKICAgYWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkRlcHJlY2F0ZWRFbnVtOjpDLAogfTsKICNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKIH0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBuZGsKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0RlcHJlY2F0ZWRQYXJjZWxhYmxlLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9EZXByZWNhdGVkUGFyY2VsYWJsZS5oCnNpbWlsYXJpdHkgaW5kZXggOTklCnJlbmFtZSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0RlcHJlY2F0ZWRQYXJjZWxhYmxlLmgKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0RlcHJlY2F0ZWRQYXJjZWxhYmxlLmgKaW5kZXggNTI3MTliYy4uNWNjZWRjMiAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvRGVwcmVjYXRlZFBhcmNlbGFibGUuaAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9EZXByZWNhdGVkUGFyY2VsYWJsZS5oCkBAIC0xLDE1ICsxLDE3IEBACiAjcHJhZ21hIG9uY2UKLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pbnRlcmZhY2VfdXRpbHMuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wYXJjZWxhYmxlX3V0aWxzLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfdG9fc3RyaW5nLmg+CisKICNpbmNsdWRlIDxjc3RkaW50PgogI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxvcHRpb25hbD4KICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2ludGVyZmFjZV91dGlscy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3BhcmNlbGFibGVfdXRpbHMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl90b19zdHJpbmcuaD4KICNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKICNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9zdGFiaWxpdHkuaD4KICNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisKIG5hbWVzcGFjZSBhaWRsIHsKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBhaWRsIHsKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0ZpeGVkU2l6ZS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvRml4ZWRTaXplLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQxNzU3YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0ZpeGVkU2l6ZS5oCkBAIC0wLDAgKzEsMjk1IEBACisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGFycmF5PgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8b3B0aW9uYWw+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHR1cGxlPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmFyaWFudD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfZW51bXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pbnRlcmZhY2VfdXRpbHMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wYXJjZWxhYmxlX3V0aWxzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfdG9fc3RyaW5nLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvRml4ZWRTaXplLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvTG9uZ0VudW0uaD4KKyNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9zdGFiaWxpdHkuaD4KKyNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisKKyNpZm5kZWYgX19CSU9OSUNfXworI2RlZmluZSBfX2Fzc2VydDIoYSxiLGMsZCkgKCh2b2lkKTApCisjZW5kaWYKKworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK2NsYXNzIEZpeGVkU2l6ZSB7CitwdWJsaWM6CisgIHR5cGVkZWYgc3RkOjpmYWxzZV90eXBlIGZpeGVkX3NpemU7CisgIHN0YXRpYyBjb25zdCBjaGFyKiBkZXNjcmlwdG9yOworCisgIGNsYXNzIEZpeGVkVW5pb24geworICBwdWJsaWM6CisgICAgdHlwZWRlZiBzdGQ6OnRydWVfdHlwZSBmaXhlZF9zaXplOworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkZXNjcmlwdG9yOworCisgICAgZW51bSBjbGFzcyBUYWcgOiBpbnQ4X3QgeworICAgICAgYm9vbGVhblZhbHVlID0gMCwKKyAgICAgIGJ5dGVWYWx1ZSA9IDEsCisgICAgICBjaGFyVmFsdWUgPSAyLAorICAgICAgaW50VmFsdWUgPSAzLAorICAgICAgbG9uZ1ZhbHVlID0gNCwKKyAgICAgIGZsb2F0VmFsdWUgPSA1LAorICAgICAgZG91YmxlVmFsdWUgPSA2LAorICAgICAgZW51bVZhbHVlID0gNywKKyAgICB9OworCisgICAgLy8gRXhwb3NlIHRhZyBzeW1ib2xzIGZvciBsZWdhY3kgY29kZQorICAgIHN0YXRpYyBjb25zdCBpbmxpbmUgVGFnIGJvb2xlYW5WYWx1ZSA9IFRhZzo6Ym9vbGVhblZhbHVlOworICAgIHN0YXRpYyBjb25zdCBpbmxpbmUgVGFnIGJ5dGVWYWx1ZSA9IFRhZzo6Ynl0ZVZhbHVlOworICAgIHN0YXRpYyBjb25zdCBpbmxpbmUgVGFnIGNoYXJWYWx1ZSA9IFRhZzo6Y2hhclZhbHVlOworICAgIHN0YXRpYyBjb25zdCBpbmxpbmUgVGFnIGludFZhbHVlID0gVGFnOjppbnRWYWx1ZTsKKyAgICBzdGF0aWMgY29uc3QgaW5saW5lIFRhZyBsb25nVmFsdWUgPSBUYWc6OmxvbmdWYWx1ZTsKKyAgICBzdGF0aWMgY29uc3QgaW5saW5lIFRhZyBmbG9hdFZhbHVlID0gVGFnOjpmbG9hdFZhbHVlOworICAgIHN0YXRpYyBjb25zdCBpbmxpbmUgVGFnIGRvdWJsZVZhbHVlID0gVGFnOjpkb3VibGVWYWx1ZTsKKyAgICBzdGF0aWMgY29uc3QgaW5saW5lIFRhZyBlbnVtVmFsdWUgPSBUYWc6OmVudW1WYWx1ZTsKKworICAgIHRlbXBsYXRlIDxUYWcgX1RhZz4KKyAgICB1c2luZyBfYXQgPSB0eXBlbmFtZSBzdGQ6OnR1cGxlX2VsZW1lbnQ8c3RhdGljX2Nhc3Q8c2l6ZV90PihfVGFnKSwgc3RkOjp0dXBsZTxib29sLCBpbnQ4X3QsIGNoYXIxNl90LCBpbnQzMl90LCBpbnQ2NF90LCBmbG9hdCwgZG91YmxlLCA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMb25nRW51bT4+Ojp0eXBlOworICAgIHRlbXBsYXRlIDxUYWcgX1RhZywgdHlwZW5hbWUgX1R5cGU+CisgICAgc3RhdGljIEZpeGVkVW5pb24gbWFrZShfVHlwZSYmIF9hcmcpIHsKKyAgICAgIEZpeGVkVW5pb24gX2luc3Q7CisgICAgICBfaW5zdC5zZXQ8X1RhZz4oc3RkOjpmb3J3YXJkPF9UeXBlPihfYXJnKSk7CisgICAgICByZXR1cm4gX2luc3Q7CisgICAgfQorICAgIGNvbnN0ZXhwciBUYWcgZ2V0VGFnKCkgY29uc3QgeworICAgICAgcmV0dXJuIF90YWc7CisgICAgfQorICAgIHRlbXBsYXRlIDxUYWcgX1RhZz4KKyAgICBjb25zdCBfYXQ8X1RhZz4mIGdldCgpIGNvbnN0IHsKKyAgICAgIGlmIChfVGFnICE9IF90YWcpIHsgX19hc3NlcnQyKF9fRklMRV9fLCBfX0xJTkVfXywgX19QUkVUVFlfRlVOQ1RJT05fXywgImJhZCBhY2Nlc3M6IGEgd3JvbmcgdGFnIik7IH0KKyAgICAgIHJldHVybiAqKF9hdDxfVGFnPiopKCZfdmFsdWUpOworICAgIH0KKyAgICB0ZW1wbGF0ZSA8VGFnIF9UYWc+CisgICAgX2F0PF9UYWc+JiBnZXQoKSB7CisgICAgICBpZiAoX1RhZyAhPSBfdGFnKSB7IF9fYXNzZXJ0MihfX0ZJTEVfXywgX19MSU5FX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18sICJiYWQgYWNjZXNzOiBhIHdyb25nIHRhZyIpOyB9CisgICAgICByZXR1cm4gKihfYXQ8X1RhZz4qKSgmX3ZhbHVlKTsKKyAgICB9CisgICAgdGVtcGxhdGUgPFRhZyBfVGFnLCB0eXBlbmFtZSBfVHlwZT4KKyAgICB2b2lkIHNldChfVHlwZSYmIF9hcmcpIHsKKyAgICAgIF90YWcgPSBfVGFnOworICAgICAgZ2V0PF9UYWc+KCkgPSBzdGQ6OmZvcndhcmQ8X1R5cGU+KF9hcmcpOworICAgIH0KKyAgICBiaW5kZXJfc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogX3BhcmNlbCk7CisgICAgYmluZGVyX3N0YXR1c190IHdyaXRlVG9QYXJjZWwoQVBhcmNlbCogX3BhcmNlbCkgY29uc3Q7CisKKyAgICBzdGF0aWMgaW50IF9jbXAoY29uc3QgRml4ZWRVbmlvbiYgX2xocywgY29uc3QgRml4ZWRVbmlvbiYgX3JocykgeworICAgICAgcmV0dXJuIF9jbXBfdmFsdWUoX2xocy5nZXRUYWcoKSwgX3Jocy5nZXRUYWcoKSkgfHwgX2NtcF92YWx1ZV9hdDxlbnVtVmFsdWU+KF9saHMsIF9yaHMpOworICAgIH0KKyAgICB0ZW1wbGF0ZSA8VGFnIF9UYWc+CisgICAgc3RhdGljIGludCBfY21wX3ZhbHVlX2F0KGNvbnN0IEZpeGVkVW5pb24mIF9saHMsIGNvbnN0IEZpeGVkVW5pb24mIF9yaHMpIHsKKyAgICAgIGlmIGNvbnN0ZXhwciAoX1RhZyA9PSBib29sZWFuVmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIF9jbXBfdmFsdWUoX2xocy5nZXQ8X1RhZz4oKSwgX3Jocy5nZXQ8X1RhZz4oKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gKF9saHMuZ2V0VGFnKCkgPT0gX1RhZykKKyAgICAgICAgICA/IF9jbXBfdmFsdWUoX2xocy5nZXQ8X1RhZz4oKSwgX3Jocy5nZXQ8X1RhZz4oKSkKKyAgICAgICAgICA6IF9jbXBfdmFsdWVfYXQ8c3RhdGljX2Nhc3Q8VGFnPihzdGF0aWNfY2FzdDxzaXplX3Q+KF9UYWcpLTEpPihfbGhzLCBfcmhzKTsKKyAgICAgIH0KKyAgICB9CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UeXBlPgorICAgIHN0YXRpYyBpbnQgX2NtcF92YWx1ZShjb25zdCBfVHlwZSYgX2xocywgY29uc3QgX1R5cGUmIF9yaHMpIHsKKyAgICAgIHJldHVybiAoX2xocyA9PSBfcmhzKSA/IDAgOiAoX2xocyA8IF9yaHMpID8gLTEgOiAxOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEZpeGVkVW5pb24mX3JocykgY29uc3QgeworICAgICAgcmV0dXJuIF9jbXAoKnRoaXMsIF9yaHMpICE9IDA7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBGaXhlZFVuaW9uJl9yaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBfY21wKCp0aGlzLCBfcmhzKSA8IDA7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgRml4ZWRVbmlvbiZfcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gX2NtcCgqdGhpcywgX3JocykgPD0gMDsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBGaXhlZFVuaW9uJl9yaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBfY21wKCp0aGlzLCBfcmhzKSA9PSAwOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgRml4ZWRVbmlvbiZfcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gX2NtcCgqdGhpcywgX3JocykgPiAwOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IEZpeGVkVW5pb24mX3JocykgY29uc3QgeworICAgICAgcmV0dXJuIF9jbXAoKnRoaXMsIF9yaHMpID49IDA7CisgICAgfQorICAgIHN0YXRpYyBjb25zdCA6Om5kazo6cGFyY2VsYWJsZV9zdGFiaWxpdHlfdCBfYWlkbF9zdGFiaWxpdHkgPSA6Om5kazo6U1RBQklMSVRZX0xPQ0FMOworICAgIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsKKyAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvczsKKyAgICAgIG9zIDw8ICJGaXhlZFVuaW9ueyI7CisgICAgICBzd2l0Y2ggKGdldFRhZygpKSB7CisgICAgICBjYXNlIGJvb2xlYW5WYWx1ZTogb3MgPDwgImJvb2xlYW5WYWx1ZTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhnZXQ8Ym9vbGVhblZhbHVlPigpKTsgYnJlYWs7CisgICAgICBjYXNlIGJ5dGVWYWx1ZTogb3MgPDwgImJ5dGVWYWx1ZTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhnZXQ8Ynl0ZVZhbHVlPigpKTsgYnJlYWs7CisgICAgICBjYXNlIGNoYXJWYWx1ZTogb3MgPDwgImNoYXJWYWx1ZTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhnZXQ8Y2hhclZhbHVlPigpKTsgYnJlYWs7CisgICAgICBjYXNlIGludFZhbHVlOiBvcyA8PCAiaW50VmFsdWU6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoZ2V0PGludFZhbHVlPigpKTsgYnJlYWs7CisgICAgICBjYXNlIGxvbmdWYWx1ZTogb3MgPDwgImxvbmdWYWx1ZTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhnZXQ8bG9uZ1ZhbHVlPigpKTsgYnJlYWs7CisgICAgICBjYXNlIGZsb2F0VmFsdWU6IG9zIDw8ICJmbG9hdFZhbHVlOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGdldDxmbG9hdFZhbHVlPigpKTsgYnJlYWs7CisgICAgICBjYXNlIGRvdWJsZVZhbHVlOiBvcyA8PCAiZG91YmxlVmFsdWU6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoZ2V0PGRvdWJsZVZhbHVlPigpKTsgYnJlYWs7CisgICAgICBjYXNlIGVudW1WYWx1ZTogb3MgPDwgImVudW1WYWx1ZTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhnZXQ8ZW51bVZhbHVlPigpKTsgYnJlYWs7CisgICAgICB9CisgICAgICBvcyA8PCAifSI7CisgICAgICByZXR1cm4gb3Muc3RyKCk7CisgICAgfQorICBwcml2YXRlOgorICAgIFRhZyBfdGFnID0gYm9vbGVhblZhbHVlOworICAgIHVuaW9uIF92YWx1ZV90IHsKKyAgICAgIF92YWx1ZV90KCkge30KKyAgICAgIH5fdmFsdWVfdCgpIHt9CisgICAgICBib29sIGJvb2xlYW5WYWx1ZSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkICgxKSkpID0gYm9vbChmYWxzZSk7CisgICAgICBpbnQ4X3QgYnl0ZVZhbHVlIF9fYXR0cmlidXRlX18oKGFsaWduZWQgKDEpKSk7CisgICAgICBjaGFyMTZfdCBjaGFyVmFsdWUgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCAoMikpKTsKKyAgICAgIGludDMyX3QgaW50VmFsdWUgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCAoNCkpKTsKKyAgICAgIGludDY0X3QgbG9uZ1ZhbHVlIF9fYXR0cmlidXRlX18oKGFsaWduZWQgKDgpKSk7CisgICAgICBmbG9hdCBmbG9hdFZhbHVlIF9fYXR0cmlidXRlX18oKGFsaWduZWQgKDQpKSk7CisgICAgICBkb3VibGUgZG91YmxlVmFsdWUgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCAoOCkpKTsKKyAgICAgIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtIGVudW1WYWx1ZSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkICg4KSkpOworICAgIH0gX3ZhbHVlOworICB9OworICBjbGFzcyBGaXhlZFBhcmNlbGFibGUgeworICBwdWJsaWM6CisgICAgdHlwZWRlZiBzdGQ6OnRydWVfdHlwZSBmaXhlZF9zaXplOworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkZXNjcmlwdG9yOworCisgICAgYm9vbCBib29sZWFuVmFsdWUgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCAoMSkpKSA9IGZhbHNlOworICAgIGludDhfdCBieXRlVmFsdWUgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCAoMSkpKSA9IDA7CisgICAgY2hhcjE2X3QgY2hhclZhbHVlIF9fYXR0cmlidXRlX18oKGFsaWduZWQgKDIpKSkgPSAnXDAnOworICAgIGludDMyX3QgaW50VmFsdWUgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCAoNCkpKSA9IDA7CisgICAgaW50NjRfdCBsb25nVmFsdWUgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCAoOCkpKSA9IDBMOworICAgIGZsb2F0IGZsb2F0VmFsdWUgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCAoNCkpKSA9IDAuMDAwMDAwZjsKKyAgICBkb3VibGUgZG91YmxlVmFsdWUgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCAoOCkpKSA9IDAuMDAwMDAwOworICAgIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtIGVudW1WYWx1ZSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkICg4KSkpID0gOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW06OkZPTzsKKyAgICA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpGaXhlZFNpemU6OkZpeGVkVW5pb24gcGFyY2VsYWJsZVZhbHVlOworCisgICAgYmluZGVyX3N0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIHBhcmNlbCk7CisgICAgYmluZGVyX3N0YXR1c190IHdyaXRlVG9QYXJjZWwoQVBhcmNlbCogcGFyY2VsKSBjb25zdDsKKworICAgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgRml4ZWRQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZShib29sZWFuVmFsdWUsIGJ5dGVWYWx1ZSwgY2hhclZhbHVlLCBpbnRWYWx1ZSwgbG9uZ1ZhbHVlLCBmbG9hdFZhbHVlLCBkb3VibGVWYWx1ZSwgZW51bVZhbHVlLCBwYXJjZWxhYmxlVmFsdWUpICE9IHN0ZDo6dGllKHJocy5ib29sZWFuVmFsdWUsIHJocy5ieXRlVmFsdWUsIHJocy5jaGFyVmFsdWUsIHJocy5pbnRWYWx1ZSwgcmhzLmxvbmdWYWx1ZSwgcmhzLmZsb2F0VmFsdWUsIHJocy5kb3VibGVWYWx1ZSwgcmhzLmVudW1WYWx1ZSwgcmhzLnBhcmNlbGFibGVWYWx1ZSk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBGaXhlZFBhcmNlbGFibGUmIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKGJvb2xlYW5WYWx1ZSwgYnl0ZVZhbHVlLCBjaGFyVmFsdWUsIGludFZhbHVlLCBsb25nVmFsdWUsIGZsb2F0VmFsdWUsIGRvdWJsZVZhbHVlLCBlbnVtVmFsdWUsIHBhcmNlbGFibGVWYWx1ZSkgPCBzdGQ6OnRpZShyaHMuYm9vbGVhblZhbHVlLCByaHMuYnl0ZVZhbHVlLCByaHMuY2hhclZhbHVlLCByaHMuaW50VmFsdWUsIHJocy5sb25nVmFsdWUsIHJocy5mbG9hdFZhbHVlLCByaHMuZG91YmxlVmFsdWUsIHJocy5lbnVtVmFsdWUsIHJocy5wYXJjZWxhYmxlVmFsdWUpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IEZpeGVkUGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoYm9vbGVhblZhbHVlLCBieXRlVmFsdWUsIGNoYXJWYWx1ZSwgaW50VmFsdWUsIGxvbmdWYWx1ZSwgZmxvYXRWYWx1ZSwgZG91YmxlVmFsdWUsIGVudW1WYWx1ZSwgcGFyY2VsYWJsZVZhbHVlKSA8PSBzdGQ6OnRpZShyaHMuYm9vbGVhblZhbHVlLCByaHMuYnl0ZVZhbHVlLCByaHMuY2hhclZhbHVlLCByaHMuaW50VmFsdWUsIHJocy5sb25nVmFsdWUsIHJocy5mbG9hdFZhbHVlLCByaHMuZG91YmxlVmFsdWUsIHJocy5lbnVtVmFsdWUsIHJocy5wYXJjZWxhYmxlVmFsdWUpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEZpeGVkUGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoYm9vbGVhblZhbHVlLCBieXRlVmFsdWUsIGNoYXJWYWx1ZSwgaW50VmFsdWUsIGxvbmdWYWx1ZSwgZmxvYXRWYWx1ZSwgZG91YmxlVmFsdWUsIGVudW1WYWx1ZSwgcGFyY2VsYWJsZVZhbHVlKSA9PSBzdGQ6OnRpZShyaHMuYm9vbGVhblZhbHVlLCByaHMuYnl0ZVZhbHVlLCByaHMuY2hhclZhbHVlLCByaHMuaW50VmFsdWUsIHJocy5sb25nVmFsdWUsIHJocy5mbG9hdFZhbHVlLCByaHMuZG91YmxlVmFsdWUsIHJocy5lbnVtVmFsdWUsIHJocy5wYXJjZWxhYmxlVmFsdWUpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgRml4ZWRQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZShib29sZWFuVmFsdWUsIGJ5dGVWYWx1ZSwgY2hhclZhbHVlLCBpbnRWYWx1ZSwgbG9uZ1ZhbHVlLCBmbG9hdFZhbHVlLCBkb3VibGVWYWx1ZSwgZW51bVZhbHVlLCBwYXJjZWxhYmxlVmFsdWUpID4gc3RkOjp0aWUocmhzLmJvb2xlYW5WYWx1ZSwgcmhzLmJ5dGVWYWx1ZSwgcmhzLmNoYXJWYWx1ZSwgcmhzLmludFZhbHVlLCByaHMubG9uZ1ZhbHVlLCByaHMuZmxvYXRWYWx1ZSwgcmhzLmRvdWJsZVZhbHVlLCByaHMuZW51bVZhbHVlLCByaHMucGFyY2VsYWJsZVZhbHVlKTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBGaXhlZFBhcmNlbGFibGUmIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKGJvb2xlYW5WYWx1ZSwgYnl0ZVZhbHVlLCBjaGFyVmFsdWUsIGludFZhbHVlLCBsb25nVmFsdWUsIGZsb2F0VmFsdWUsIGRvdWJsZVZhbHVlLCBlbnVtVmFsdWUsIHBhcmNlbGFibGVWYWx1ZSkgPj0gc3RkOjp0aWUocmhzLmJvb2xlYW5WYWx1ZSwgcmhzLmJ5dGVWYWx1ZSwgcmhzLmNoYXJWYWx1ZSwgcmhzLmludFZhbHVlLCByaHMubG9uZ1ZhbHVlLCByaHMuZmxvYXRWYWx1ZSwgcmhzLmRvdWJsZVZhbHVlLCByaHMuZW51bVZhbHVlLCByaHMucGFyY2VsYWJsZVZhbHVlKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY29uc3QgOjpuZGs6OnBhcmNlbGFibGVfc3RhYmlsaXR5X3QgX2FpZGxfc3RhYmlsaXR5ID0gOjpuZGs6OlNUQUJJTElUWV9MT0NBTDsKKyAgICBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7CisgICAgICBvcyA8PCAiRml4ZWRQYXJjZWxhYmxleyI7CisgICAgICBvcyA8PCAiYm9vbGVhblZhbHVlOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGJvb2xlYW5WYWx1ZSk7CisgICAgICBvcyA8PCAiLCBieXRlVmFsdWU6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoYnl0ZVZhbHVlKTsKKyAgICAgIG9zIDw8ICIsIGNoYXJWYWx1ZTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhjaGFyVmFsdWUpOworICAgICAgb3MgPDwgIiwgaW50VmFsdWU6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaW50VmFsdWUpOworICAgICAgb3MgPDwgIiwgbG9uZ1ZhbHVlOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGxvbmdWYWx1ZSk7CisgICAgICBvcyA8PCAiLCBmbG9hdFZhbHVlOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGZsb2F0VmFsdWUpOworICAgICAgb3MgPDwgIiwgZG91YmxlVmFsdWU6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoZG91YmxlVmFsdWUpOworICAgICAgb3MgPDwgIiwgZW51bVZhbHVlOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGVudW1WYWx1ZSk7CisgICAgICBvcyA8PCAiLCBwYXJjZWxhYmxlVmFsdWU6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcocGFyY2VsYWJsZVZhbHVlKTsKKyAgICAgIG9zIDw8ICJ9IjsKKyAgICAgIHJldHVybiBvcy5zdHIoKTsKKyAgICB9CisgIH07CisKKyAgYmluZGVyX3N0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIHBhcmNlbCk7CisgIGJpbmRlcl9zdGF0dXNfdCB3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIHBhcmNlbCkgY29uc3Q7CisKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBGaXhlZFNpemUmKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKCkgIT0gc3RkOjp0aWUoKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgRml4ZWRTaXplJikgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZSgpIDwgc3RkOjp0aWUoKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IEZpeGVkU2l6ZSYpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoKSA8PSBzdGQ6OnRpZSgpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgRml4ZWRTaXplJikgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZSgpID09IHN0ZDo6dGllKCk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IEZpeGVkU2l6ZSYpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoKSA+IHN0ZDo6dGllKCk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBGaXhlZFNpemUmKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKCkgPj0gc3RkOjp0aWUoKTsKKyAgfQorCisgIHN0YXRpYyBjb25zdCA6Om5kazo6cGFyY2VsYWJsZV9zdGFiaWxpdHlfdCBfYWlkbF9zdGFiaWxpdHkgPSA6Om5kazo6U1RBQklMSVRZX0xPQ0FMOworICBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOworICAgIG9zIDw8ICJGaXhlZFNpemV7IjsKKyAgICBvcyA8PCAifSI7CisgICAgcmV0dXJuIG9zLnN0cigpOworICB9Cit9OworfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworW1tub2Rpc2NhcmRdXSBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKEZpeGVkU2l6ZTo6Rml4ZWRVbmlvbjo6VGFnIHZhbCkgeworICBzd2l0Y2godmFsKSB7CisgIGNhc2UgRml4ZWRTaXplOjpGaXhlZFVuaW9uOjpUYWc6OmJvb2xlYW5WYWx1ZToKKyAgICByZXR1cm4gImJvb2xlYW5WYWx1ZSI7CisgIGNhc2UgRml4ZWRTaXplOjpGaXhlZFVuaW9uOjpUYWc6OmJ5dGVWYWx1ZToKKyAgICByZXR1cm4gImJ5dGVWYWx1ZSI7CisgIGNhc2UgRml4ZWRTaXplOjpGaXhlZFVuaW9uOjpUYWc6OmNoYXJWYWx1ZToKKyAgICByZXR1cm4gImNoYXJWYWx1ZSI7CisgIGNhc2UgRml4ZWRTaXplOjpGaXhlZFVuaW9uOjpUYWc6OmludFZhbHVlOgorICAgIHJldHVybiAiaW50VmFsdWUiOworICBjYXNlIEZpeGVkU2l6ZTo6Rml4ZWRVbmlvbjo6VGFnOjpsb25nVmFsdWU6CisgICAgcmV0dXJuICJsb25nVmFsdWUiOworICBjYXNlIEZpeGVkU2l6ZTo6Rml4ZWRVbmlvbjo6VGFnOjpmbG9hdFZhbHVlOgorICAgIHJldHVybiAiZmxvYXRWYWx1ZSI7CisgIGNhc2UgRml4ZWRTaXplOjpGaXhlZFVuaW9uOjpUYWc6OmRvdWJsZVZhbHVlOgorICAgIHJldHVybiAiZG91YmxlVmFsdWUiOworICBjYXNlIEZpeGVkU2l6ZTo6Rml4ZWRVbmlvbjo6VGFnOjplbnVtVmFsdWU6CisgICAgcmV0dXJuICJlbnVtVmFsdWUiOworICBkZWZhdWx0OgorICAgIHJldHVybiBzdGQ6OnRvX3N0cmluZyhzdGF0aWNfY2FzdDxpbnQ4X3Q+KHZhbCkpOworICB9Cit9Cit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKK25hbWVzcGFjZSBuZGsgeworbmFtZXNwYWNlIGludGVybmFsIHsKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdjKysxNy1leHRlbnNpb25zIgordGVtcGxhdGUgPD4KK2NvbnN0ZXhwciBpbmxpbmUgc3RkOjphcnJheTxhaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Rml4ZWRTaXplOjpGaXhlZFVuaW9uOjpUYWcsIDg+IGVudW1fdmFsdWVzPGFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpGaXhlZFNpemU6OkZpeGVkVW5pb246OlRhZz4gPSB7CisgIGFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpGaXhlZFNpemU6OkZpeGVkVW5pb246OlRhZzo6Ym9vbGVhblZhbHVlLAorICBhaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Rml4ZWRTaXplOjpGaXhlZFVuaW9uOjpUYWc6OmJ5dGVWYWx1ZSwKKyAgYWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkZpeGVkU2l6ZTo6Rml4ZWRVbmlvbjo6VGFnOjpjaGFyVmFsdWUsCisgIGFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpGaXhlZFNpemU6OkZpeGVkVW5pb246OlRhZzo6aW50VmFsdWUsCisgIGFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpGaXhlZFNpemU6OkZpeGVkVW5pb246OlRhZzo6bG9uZ1ZhbHVlLAorICBhaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Rml4ZWRTaXplOjpGaXhlZFVuaW9uOjpUYWc6OmZsb2F0VmFsdWUsCisgIGFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpGaXhlZFNpemU6OkZpeGVkVW5pb246OlRhZzo6ZG91YmxlVmFsdWUsCisgIGFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpGaXhlZFNpemU6OkZpeGVkVW5pb246OlRhZzo6ZW51bVZhbHVlLAorfTsKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIG5kawpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvR2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxlLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9HZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGUuaApzaW1pbGFyaXR5IGluZGV4IDY5JQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9HZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGUuaApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvR2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxlLmgKaW5kZXggMTEzYWZmNC4uZWMwMTg5OSAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvR2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxlLmgKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvR2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxlLmgKQEAgLTEsMTUgKzEsMTcgQEAKICNwcmFnbWEgb25jZQotI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2ludGVyZmFjZV91dGlscy5oPgotI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3BhcmNlbGFibGVfdXRpbHMuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl90b19zdHJpbmcuaD4KKwogI2luY2x1ZGUgPGNzdGRpbnQ+CiAjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPG9wdGlvbmFsPgogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaW50ZXJmYWNlX3V0aWxzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcGFyY2VsYWJsZV91dGlscy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3RvX3N0cmluZy5oPgogI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAogI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3N0YWJpbGl0eS5oPgogI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKwogbmFtZXNwYWNlIGFpZGwgewogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGFpZGwgewpAQCAtNzEsNDggKzczLDQ5IEBACiBjb25zdCBjaGFyKiBHZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGU8VCwgVSwgQj46OmRlc2NyaXB0b3IgPSAiYW5kcm9pZC5haWRsLnRlc3RzLkdlbmVyaWNTdHJ1Y3R1cmVkUGFyY2VsYWJsZSI7CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVLCB0eXBlbmFtZSBCPgotYmluZGVyX3N0YXR1c190IEdlbmVyaWNTdHJ1Y3R1cmVkUGFyY2VsYWJsZTxULCBVLCBCPjo6cmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogcGFyY2VsKSB7Ci0gIGludDMyX3QgX2FpZGxfcGFyY2VsYWJsZV9zaXplOwotICBpbnQzMl90IF9haWRsX3N0YXJ0X3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCk7Ci0gIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzIocGFyY2VsLCAmX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKK2JpbmRlcl9zdGF0dXNfdCBHZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGU8VCwgVSwgQj46OnJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIF9haWRsX3BhcmNlbCkgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19PSzsKKyAgaW50MzJfdCBfYWlkbF9zdGFydF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpOworICBpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IDA7CisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihfYWlkbF9wYXJjZWwsICZfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChfYWlkbF9wYXJjZWxhYmxlX3NpemUgPCA0KSByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTsKICAgaWYgKF9haWRsX3N0YXJ0X3BvcyA+IElOVDMyX01BWCAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuIFNUQVRVU19CQURfVkFMVUU7Ci0gIGlmIChfYWlkbF9wYXJjZWxhYmxlX3NpemUgPCAwKSByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKICAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKICAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzIocGFyY2VsLCAmYSk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZhKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKIAotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKICAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKICAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzIocGFyY2VsLCAmYik7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZiKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKIAotICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CiB9CiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVSwgdHlwZW5hbWUgQj4KLWJpbmRlcl9zdGF0dXNfdCBHZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGU8VCwgVSwgQj46OndyaXRlVG9QYXJjZWwoQVBhcmNlbCogcGFyY2VsKSBjb25zdCB7CitiaW5kZXJfc3RhdHVzX3QgR2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxlPFQsIFUsIEI+Ojp3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgewogICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1czsKLSAgc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCk7Ci0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIocGFyY2VsLCAwKTsKKyAgc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIoX2FpZGxfcGFyY2VsLCAwKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDMyKHBhcmNlbCwgYSk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBhKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDMyKHBhcmNlbCwgYik7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBiKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKIAotICBzaXplX3QgX2FpZGxfZW5kX3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCk7Ci0gIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zKTsKLSAgQVBhcmNlbF93cml0ZUludDMyKHBhcmNlbCwgX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7Ci0gIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfZW5kX3Bvcyk7CisgIHNpemVfdCBfYWlkbF9lbmRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKTsKKyAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MpOworICBBUGFyY2VsX3dyaXRlSW50MzIoX2FpZGxfcGFyY2VsLCBfYWlkbF9lbmRfcG9zIC0gX2FpZGxfc3RhcnRfcG9zKTsKKyAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9lbmRfcG9zKTsKICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CiB9CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0lEZXByZWNhdGVkLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9JRGVwcmVjYXRlZC5oCnNpbWlsYXJpdHkgaW5kZXggOTklCnJlbmFtZSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0lEZXByZWNhdGVkLmgKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0lEZXByZWNhdGVkLmgKaW5kZXggODBkNTU4OS4uNGM4YzY3YyAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvSURlcHJlY2F0ZWQuaAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9JRGVwcmVjYXRlZC5oCkBAIC0xLDEyICsxLDExIEBACiAjcHJhZ21hIG9uY2UKIAotI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2ludGVyZmFjZV91dGlscy5oPgotCiAjaW5jbHVkZSA8Y3N0ZGludD4KICNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8b3B0aW9uYWw+CiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pbnRlcmZhY2VfdXRpbHMuaD4KICNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKICNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9zdGFiaWxpdHkuaD4KICNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9JTmFtZWRDYWxsYmFjay5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvSU5hbWVkQ2FsbGJhY2suaApzaW1pbGFyaXR5IGluZGV4IDk5JQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9JTmFtZWRDYWxsYmFjay5oCnJlbmFtZSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9JTmFtZWRDYWxsYmFjay5oCmluZGV4IGQzOGM3ZTEuLmNhMTRjMGYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0lOYW1lZENhbGxiYWNrLmgKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvSU5hbWVkQ2FsbGJhY2suaApAQCAtMSwxMiArMSwxMSBAQAogI3ByYWdtYSBvbmNlCiAKLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pbnRlcmZhY2VfdXRpbHMuaD4KLQogI2luY2x1ZGUgPGNzdGRpbnQ+CiAjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPG9wdGlvbmFsPgogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaW50ZXJmYWNlX3V0aWxzLmg+CiAjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCiAjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfc3RhYmlsaXR5Lmg+CiAjZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvSU5ld05hbWUuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0lOZXdOYW1lLmgKc2ltaWxhcml0eSBpbmRleCA5OSUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvSU5ld05hbWUuaApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvSU5ld05hbWUuaAppbmRleCAxZjkzZDVmLi41YzQyZjlkIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9JTmV3TmFtZS5oCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0lOZXdOYW1lLmgKQEAgLTEsMTIgKzEsMTEgQEAKICNwcmFnbWEgb25jZQogCi0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaW50ZXJmYWNlX3V0aWxzLmg+Ci0KICNpbmNsdWRlIDxjc3RkaW50PgogI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxvcHRpb25hbD4KICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2ludGVyZmFjZV91dGlscy5oPgogI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAogI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3N0YWJpbGl0eS5oPgogI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0lPbGROYW1lLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9JT2xkTmFtZS5oCnNpbWlsYXJpdHkgaW5kZXggOTklCnJlbmFtZSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0lPbGROYW1lLmgKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0lPbGROYW1lLmgKaW5kZXggYzRhNGY3OS4uYmZmOTA1ZCAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvSU9sZE5hbWUuaAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9JT2xkTmFtZS5oCkBAIC0xLDEyICsxLDExIEBACiAjcHJhZ21hIG9uY2UKIAotI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2ludGVyZmFjZV91dGlscy5oPgotCiAjaW5jbHVkZSA8Y3N0ZGludD4KICNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8b3B0aW9uYWw+CiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pbnRlcmZhY2VfdXRpbHMuaD4KICNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKICNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9zdGFiaWxpdHkuaD4KICNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9JVGVzdFNlcnZpY2UuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0lUZXN0U2VydmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMzk2YjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9JVGVzdFNlcnZpY2UuaApAQCAtMCwwICsxLDQzNiBAQAorI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxvcHRpb25hbD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2liaW5kZXJfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pbnRlcmZhY2VfdXRpbHMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wYXJjZWxfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wYXJjZWxhYmxlX3V0aWxzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfdG9fc3RyaW5nLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQmFja2VuZFR5cGUuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CeXRlRW51bS5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0lOYW1lZENhbGxiYWNrLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvSU5ld05hbWUuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9JT2xkTmFtZS5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0lUZXN0U2VydmljZS5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0ludEVudW0uaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9Mb25nRW51bS5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL1JlY3Vyc2l2ZUxpc3QuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL1VuaW9uLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0V4dGVuZGFibGVQYXJjZWxhYmxlLmg+CisjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfc3RhYmlsaXR5Lmg+CisjZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworY2xhc3MgSVRlc3RTZXJ2aWNlIDogcHVibGljIDo6bmRrOjpJQ0ludGVyZmFjZSB7CitwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBjaGFyKiBkZXNjcmlwdG9yOworICBJVGVzdFNlcnZpY2UoKTsKKyAgdmlydHVhbCB+SVRlc3RTZXJ2aWNlKCk7CisKKyAgY2xhc3MgRW1wdHkgeworICBwdWJsaWM6CisgICAgdHlwZWRlZiBzdGQ6OmZhbHNlX3R5cGUgZml4ZWRfc2l6ZTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciogZGVzY3JpcHRvcjsKKworCisgICAgYmluZGVyX3N0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIHBhcmNlbCk7CisgICAgYmluZGVyX3N0YXR1c190IHdyaXRlVG9QYXJjZWwoQVBhcmNlbCogcGFyY2VsKSBjb25zdDsKKworICAgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgRW1wdHkmKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoKSAhPSBzdGQ6OnRpZSgpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgRW1wdHkmKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoKSA8IHN0ZDo6dGllKCk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgRW1wdHkmKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoKSA8PSBzdGQ6OnRpZSgpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEVtcHR5JikgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKCkgPT0gc3RkOjp0aWUoKTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IEVtcHR5JikgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKCkgPiBzdGQ6OnRpZSgpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IEVtcHR5JikgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKCkgPj0gc3RkOjp0aWUoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY29uc3QgOjpuZGs6OnBhcmNlbGFibGVfc3RhYmlsaXR5X3QgX2FpZGxfc3RhYmlsaXR5ID0gOjpuZGs6OlNUQUJJTElUWV9MT0NBTDsKKyAgICBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7CisgICAgICBvcyA8PCAiRW1wdHl7IjsKKyAgICAgIG9zIDw8ICJ9IjsKKyAgICAgIHJldHVybiBvcy5zdHIoKTsKKyAgICB9CisgIH07CisgIGNsYXNzIENvbXBpbGVyQ2hlY2tzIHsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgc3RkOjpmYWxzZV90eXBlIGZpeGVkX3NpemU7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGRlc2NyaXB0b3I7CisKKyAgICA6Om5kazo6U3BBSUJpbmRlciBiaW5kZXI7CisgICAgOjpuZGs6OlNwQUlCaW5kZXIgbnVsbGFibGVfYmluZGVyOworICAgIHN0ZDo6dmVjdG9yPDo6bmRrOjpTcEFJQmluZGVyPiBiaW5kZXJfYXJyYXk7CisgICAgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3Rvcjw6Om5kazo6U3BBSUJpbmRlcj4+IG51bGxhYmxlX2JpbmRlcl9hcnJheTsKKyAgICBzdGQ6OnZlY3Rvcjw6Om5kazo6U3BBSUJpbmRlcj4gYmluZGVyX2xpc3Q7CisgICAgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3Rvcjw6Om5kazo6U3BBSUJpbmRlcj4+IG51bGxhYmxlX2JpbmRlcl9saXN0OworICAgIDo6bmRrOjpTY29wZWRGaWxlRGVzY3JpcHRvciBwZmQ7CisgICAgOjpuZGs6OlNjb3BlZEZpbGVEZXNjcmlwdG9yIG51bGxhYmxlX3BmZDsKKyAgICBzdGQ6OnZlY3Rvcjw6Om5kazo6U2NvcGVkRmlsZURlc2NyaXB0b3I+IHBmZF9hcnJheTsKKyAgICBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPDo6bmRrOjpTY29wZWRGaWxlRGVzY3JpcHRvcj4+IG51bGxhYmxlX3BmZF9hcnJheTsKKyAgICBzdGQ6OnZlY3Rvcjw6Om5kazo6U2NvcGVkRmlsZURlc2NyaXB0b3I+IHBmZF9saXN0OworICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8OjpuZGs6OlNjb3BlZEZpbGVEZXNjcmlwdG9yPj4gbnVsbGFibGVfcGZkX2xpc3Q7CisgICAgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eSBwYXJjZWw7CisgICAgc3RkOjpvcHRpb25hbDw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5PiBudWxsYWJsZV9wYXJjZWw7CisgICAgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eT4gcGFyY2VsX2FycmF5OworICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5Pj4+IG51bGxhYmxlX3BhcmNlbF9hcnJheTsKKyAgICBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5PiBwYXJjZWxfbGlzdDsKKyAgICBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eT4+PiBudWxsYWJsZV9wYXJjZWxfbGlzdDsKKworICAgIGJpbmRlcl9zdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBwYXJjZWwpOworICAgIGJpbmRlcl9zdGF0dXNfdCB3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIHBhcmNlbCkgY29uc3Q7CisKKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IENvbXBpbGVyQ2hlY2tzJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZShiaW5kZXIsIG51bGxhYmxlX2JpbmRlciwgYmluZGVyX2FycmF5LCBudWxsYWJsZV9iaW5kZXJfYXJyYXksIGJpbmRlcl9saXN0LCBudWxsYWJsZV9iaW5kZXJfbGlzdCwgcGZkLCBudWxsYWJsZV9wZmQsIHBmZF9hcnJheSwgbnVsbGFibGVfcGZkX2FycmF5LCBwZmRfbGlzdCwgbnVsbGFibGVfcGZkX2xpc3QsIHBhcmNlbCwgbnVsbGFibGVfcGFyY2VsLCBwYXJjZWxfYXJyYXksIG51bGxhYmxlX3BhcmNlbF9hcnJheSwgcGFyY2VsX2xpc3QsIG51bGxhYmxlX3BhcmNlbF9saXN0KSAhPSBzdGQ6OnRpZShyaHMuYmluZGVyLCByaHMubnVsbGFibGVfYmluZGVyLCByaHMuYmluZGVyX2FycmF5LCByaHMubnVsbGFibGVfYmluZGVyX2FycmF5LCByaHMuYmluZGVyX2xpc3QsIHJocy5udWxsYWJsZV9iaW5kZXJfbGlzdCwgcmhzLnBmZCwgcmhzLm51bGxhYmxlX3BmZCwgcmhzLnBmZF9hcnJheSwgcmhzLm51bGxhYmxlX3BmZF9hcnJheSwgcmhzLnBmZF9saXN0LCByaHMubnVsbGFibGVfcGZkX2xpc3QsIHJocy5wYXJjZWwsIHJocy5udWxsYWJsZV9wYXJjZWwsIHJocy5wYXJjZWxfYXJyYXksIHJocy5udWxsYWJsZV9wYXJjZWxfYXJyYXksIHJocy5wYXJjZWxfbGlzdCwgcmhzLm51bGxhYmxlX3BhcmNlbF9saXN0KTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IENvbXBpbGVyQ2hlY2tzJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZShiaW5kZXIsIG51bGxhYmxlX2JpbmRlciwgYmluZGVyX2FycmF5LCBudWxsYWJsZV9iaW5kZXJfYXJyYXksIGJpbmRlcl9saXN0LCBudWxsYWJsZV9iaW5kZXJfbGlzdCwgcGZkLCBudWxsYWJsZV9wZmQsIHBmZF9hcnJheSwgbnVsbGFibGVfcGZkX2FycmF5LCBwZmRfbGlzdCwgbnVsbGFibGVfcGZkX2xpc3QsIHBhcmNlbCwgbnVsbGFibGVfcGFyY2VsLCBwYXJjZWxfYXJyYXksIG51bGxhYmxlX3BhcmNlbF9hcnJheSwgcGFyY2VsX2xpc3QsIG51bGxhYmxlX3BhcmNlbF9saXN0KSA8IHN0ZDo6dGllKHJocy5iaW5kZXIsIHJocy5udWxsYWJsZV9iaW5kZXIsIHJocy5iaW5kZXJfYXJyYXksIHJocy5udWxsYWJsZV9iaW5kZXJfYXJyYXksIHJocy5iaW5kZXJfbGlzdCwgcmhzLm51bGxhYmxlX2JpbmRlcl9saXN0LCByaHMucGZkLCByaHMubnVsbGFibGVfcGZkLCByaHMucGZkX2FycmF5LCByaHMubnVsbGFibGVfcGZkX2FycmF5LCByaHMucGZkX2xpc3QsIHJocy5udWxsYWJsZV9wZmRfbGlzdCwgcmhzLnBhcmNlbCwgcmhzLm51bGxhYmxlX3BhcmNlbCwgcmhzLnBhcmNlbF9hcnJheSwgcmhzLm51bGxhYmxlX3BhcmNlbF9hcnJheSwgcmhzLnBhcmNlbF9saXN0LCByaHMubnVsbGFibGVfcGFyY2VsX2xpc3QpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IENvbXBpbGVyQ2hlY2tzJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZShiaW5kZXIsIG51bGxhYmxlX2JpbmRlciwgYmluZGVyX2FycmF5LCBudWxsYWJsZV9iaW5kZXJfYXJyYXksIGJpbmRlcl9saXN0LCBudWxsYWJsZV9iaW5kZXJfbGlzdCwgcGZkLCBudWxsYWJsZV9wZmQsIHBmZF9hcnJheSwgbnVsbGFibGVfcGZkX2FycmF5LCBwZmRfbGlzdCwgbnVsbGFibGVfcGZkX2xpc3QsIHBhcmNlbCwgbnVsbGFibGVfcGFyY2VsLCBwYXJjZWxfYXJyYXksIG51bGxhYmxlX3BhcmNlbF9hcnJheSwgcGFyY2VsX2xpc3QsIG51bGxhYmxlX3BhcmNlbF9saXN0KSA8PSBzdGQ6OnRpZShyaHMuYmluZGVyLCByaHMubnVsbGFibGVfYmluZGVyLCByaHMuYmluZGVyX2FycmF5LCByaHMubnVsbGFibGVfYmluZGVyX2FycmF5LCByaHMuYmluZGVyX2xpc3QsIHJocy5udWxsYWJsZV9iaW5kZXJfbGlzdCwgcmhzLnBmZCwgcmhzLm51bGxhYmxlX3BmZCwgcmhzLnBmZF9hcnJheSwgcmhzLm51bGxhYmxlX3BmZF9hcnJheSwgcmhzLnBmZF9saXN0LCByaHMubnVsbGFibGVfcGZkX2xpc3QsIHJocy5wYXJjZWwsIHJocy5udWxsYWJsZV9wYXJjZWwsIHJocy5wYXJjZWxfYXJyYXksIHJocy5udWxsYWJsZV9wYXJjZWxfYXJyYXksIHJocy5wYXJjZWxfbGlzdCwgcmhzLm51bGxhYmxlX3BhcmNlbF9saXN0KTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDb21waWxlckNoZWNrcyYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoYmluZGVyLCBudWxsYWJsZV9iaW5kZXIsIGJpbmRlcl9hcnJheSwgbnVsbGFibGVfYmluZGVyX2FycmF5LCBiaW5kZXJfbGlzdCwgbnVsbGFibGVfYmluZGVyX2xpc3QsIHBmZCwgbnVsbGFibGVfcGZkLCBwZmRfYXJyYXksIG51bGxhYmxlX3BmZF9hcnJheSwgcGZkX2xpc3QsIG51bGxhYmxlX3BmZF9saXN0LCBwYXJjZWwsIG51bGxhYmxlX3BhcmNlbCwgcGFyY2VsX2FycmF5LCBudWxsYWJsZV9wYXJjZWxfYXJyYXksIHBhcmNlbF9saXN0LCBudWxsYWJsZV9wYXJjZWxfbGlzdCkgPT0gc3RkOjp0aWUocmhzLmJpbmRlciwgcmhzLm51bGxhYmxlX2JpbmRlciwgcmhzLmJpbmRlcl9hcnJheSwgcmhzLm51bGxhYmxlX2JpbmRlcl9hcnJheSwgcmhzLmJpbmRlcl9saXN0LCByaHMubnVsbGFibGVfYmluZGVyX2xpc3QsIHJocy5wZmQsIHJocy5udWxsYWJsZV9wZmQsIHJocy5wZmRfYXJyYXksIHJocy5udWxsYWJsZV9wZmRfYXJyYXksIHJocy5wZmRfbGlzdCwgcmhzLm51bGxhYmxlX3BmZF9saXN0LCByaHMucGFyY2VsLCByaHMubnVsbGFibGVfcGFyY2VsLCByaHMucGFyY2VsX2FycmF5LCByaHMubnVsbGFibGVfcGFyY2VsX2FycmF5LCByaHMucGFyY2VsX2xpc3QsIHJocy5udWxsYWJsZV9wYXJjZWxfbGlzdCk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPihjb25zdCBDb21waWxlckNoZWNrcyYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoYmluZGVyLCBudWxsYWJsZV9iaW5kZXIsIGJpbmRlcl9hcnJheSwgbnVsbGFibGVfYmluZGVyX2FycmF5LCBiaW5kZXJfbGlzdCwgbnVsbGFibGVfYmluZGVyX2xpc3QsIHBmZCwgbnVsbGFibGVfcGZkLCBwZmRfYXJyYXksIG51bGxhYmxlX3BmZF9hcnJheSwgcGZkX2xpc3QsIG51bGxhYmxlX3BmZF9saXN0LCBwYXJjZWwsIG51bGxhYmxlX3BhcmNlbCwgcGFyY2VsX2FycmF5LCBudWxsYWJsZV9wYXJjZWxfYXJyYXksIHBhcmNlbF9saXN0LCBudWxsYWJsZV9wYXJjZWxfbGlzdCkgPiBzdGQ6OnRpZShyaHMuYmluZGVyLCByaHMubnVsbGFibGVfYmluZGVyLCByaHMuYmluZGVyX2FycmF5LCByaHMubnVsbGFibGVfYmluZGVyX2FycmF5LCByaHMuYmluZGVyX2xpc3QsIHJocy5udWxsYWJsZV9iaW5kZXJfbGlzdCwgcmhzLnBmZCwgcmhzLm51bGxhYmxlX3BmZCwgcmhzLnBmZF9hcnJheSwgcmhzLm51bGxhYmxlX3BmZF9hcnJheSwgcmhzLnBmZF9saXN0LCByaHMubnVsbGFibGVfcGZkX2xpc3QsIHJocy5wYXJjZWwsIHJocy5udWxsYWJsZV9wYXJjZWwsIHJocy5wYXJjZWxfYXJyYXksIHJocy5udWxsYWJsZV9wYXJjZWxfYXJyYXksIHJocy5wYXJjZWxfbGlzdCwgcmhzLm51bGxhYmxlX3BhcmNlbF9saXN0KTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBDb21waWxlckNoZWNrcyYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoYmluZGVyLCBudWxsYWJsZV9iaW5kZXIsIGJpbmRlcl9hcnJheSwgbnVsbGFibGVfYmluZGVyX2FycmF5LCBiaW5kZXJfbGlzdCwgbnVsbGFibGVfYmluZGVyX2xpc3QsIHBmZCwgbnVsbGFibGVfcGZkLCBwZmRfYXJyYXksIG51bGxhYmxlX3BmZF9hcnJheSwgcGZkX2xpc3QsIG51bGxhYmxlX3BmZF9saXN0LCBwYXJjZWwsIG51bGxhYmxlX3BhcmNlbCwgcGFyY2VsX2FycmF5LCBudWxsYWJsZV9wYXJjZWxfYXJyYXksIHBhcmNlbF9saXN0LCBudWxsYWJsZV9wYXJjZWxfbGlzdCkgPj0gc3RkOjp0aWUocmhzLmJpbmRlciwgcmhzLm51bGxhYmxlX2JpbmRlciwgcmhzLmJpbmRlcl9hcnJheSwgcmhzLm51bGxhYmxlX2JpbmRlcl9hcnJheSwgcmhzLmJpbmRlcl9saXN0LCByaHMubnVsbGFibGVfYmluZGVyX2xpc3QsIHJocy5wZmQsIHJocy5udWxsYWJsZV9wZmQsIHJocy5wZmRfYXJyYXksIHJocy5udWxsYWJsZV9wZmRfYXJyYXksIHJocy5wZmRfbGlzdCwgcmhzLm51bGxhYmxlX3BmZF9saXN0LCByaHMucGFyY2VsLCByaHMubnVsbGFibGVfcGFyY2VsLCByaHMucGFyY2VsX2FycmF5LCByaHMubnVsbGFibGVfcGFyY2VsX2FycmF5LCByaHMucGFyY2VsX2xpc3QsIHJocy5udWxsYWJsZV9wYXJjZWxfbGlzdCk7CisgICAgfQorCisgICAgc3RhdGljIGNvbnN0IDo6bmRrOjpwYXJjZWxhYmxlX3N0YWJpbGl0eV90IF9haWRsX3N0YWJpbGl0eSA9IDo6bmRrOjpTVEFCSUxJVFlfTE9DQUw7CisgICAgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOworICAgICAgb3MgPDwgIkNvbXBpbGVyQ2hlY2tzeyI7CisgICAgICBvcyA8PCAiYmluZGVyOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGJpbmRlcik7CisgICAgICBvcyA8PCAiLCBudWxsYWJsZV9iaW5kZXI6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcobnVsbGFibGVfYmluZGVyKTsKKyAgICAgIG9zIDw8ICIsIGJpbmRlcl9hcnJheTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhiaW5kZXJfYXJyYXkpOworICAgICAgb3MgPDwgIiwgbnVsbGFibGVfYmluZGVyX2FycmF5OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKG51bGxhYmxlX2JpbmRlcl9hcnJheSk7CisgICAgICBvcyA8PCAiLCBiaW5kZXJfbGlzdDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhiaW5kZXJfbGlzdCk7CisgICAgICBvcyA8PCAiLCBudWxsYWJsZV9iaW5kZXJfbGlzdDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhudWxsYWJsZV9iaW5kZXJfbGlzdCk7CisgICAgICBvcyA8PCAiLCBwZmQ6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcocGZkKTsKKyAgICAgIG9zIDw8ICIsIG51bGxhYmxlX3BmZDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhudWxsYWJsZV9wZmQpOworICAgICAgb3MgPDwgIiwgcGZkX2FycmF5OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKHBmZF9hcnJheSk7CisgICAgICBvcyA8PCAiLCBudWxsYWJsZV9wZmRfYXJyYXk6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcobnVsbGFibGVfcGZkX2FycmF5KTsKKyAgICAgIG9zIDw8ICIsIHBmZF9saXN0OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKHBmZF9saXN0KTsKKyAgICAgIG9zIDw8ICIsIG51bGxhYmxlX3BmZF9saXN0OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKG51bGxhYmxlX3BmZF9saXN0KTsKKyAgICAgIG9zIDw8ICIsIHBhcmNlbDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhwYXJjZWwpOworICAgICAgb3MgPDwgIiwgbnVsbGFibGVfcGFyY2VsOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKG51bGxhYmxlX3BhcmNlbCk7CisgICAgICBvcyA8PCAiLCBwYXJjZWxfYXJyYXk6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcocGFyY2VsX2FycmF5KTsKKyAgICAgIG9zIDw8ICIsIG51bGxhYmxlX3BhcmNlbF9hcnJheTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhudWxsYWJsZV9wYXJjZWxfYXJyYXkpOworICAgICAgb3MgPDwgIiwgcGFyY2VsX2xpc3Q6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcocGFyY2VsX2xpc3QpOworICAgICAgb3MgPDwgIiwgbnVsbGFibGVfcGFyY2VsX2xpc3Q6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcobnVsbGFibGVfcGFyY2VsX2xpc3QpOworICAgICAgb3MgPDwgIn0iOworICAgICAgcmV0dXJuIG9zLnN0cigpOworICAgIH0KKyAgfTsKKyAgZW51bSA6IGludDMyX3QgeyBURVNUX0NPTlNUQU5UID0gNDIgfTsKKyAgZW51bSA6IGludDMyX3QgeyBURVNUX0NPTlNUQU5UMiA9IC00MiB9OworICBlbnVtIDogaW50MzJfdCB7IFRFU1RfQ09OU1RBTlQzID0gNDIgfTsKKyAgZW51bSA6IGludDMyX3QgeyBURVNUX0NPTlNUQU5UNCA9IDQgfTsKKyAgZW51bSA6IGludDMyX3QgeyBURVNUX0NPTlNUQU5UNSA9IC00IH07CisgIGVudW0gOiBpbnQzMl90IHsgVEVTVF9DT05TVEFOVDYgPSAwIH07CisgIGVudW0gOiBpbnQzMl90IHsgVEVTVF9DT05TVEFOVDcgPSAwIH07CisgIGVudW0gOiBpbnQzMl90IHsgVEVTVF9DT05TVEFOVDggPSAwIH07CisgIGVudW0gOiBpbnQzMl90IHsgVEVTVF9DT05TVEFOVDkgPSA4NiB9OworICBlbnVtIDogaW50MzJfdCB7IFRFU1RfQ09OU1RBTlQxMCA9IDE2NSB9OworICBlbnVtIDogaW50MzJfdCB7IFRFU1RfQ09OU1RBTlQxMSA9IDI1MCB9OworICBlbnVtIDogaW50MzJfdCB7IFRFU1RfQ09OU1RBTlQxMiA9IC0xIH07CisgIGVudW0gOiBpbnQ4X3QgeyBCWVRFX1RFU1RfQ09OU1RBTlQgPSAxNyB9OworICBlbnVtIDogaW50NjRfdCB7IExPTkdfVEVTVF9DT05TVEFOVCA9IDEwOTk1MTE2Mjc3NzZMIH07CisgIHN0YXRpYyBjb25zdCBjaGFyKiBTVFJJTkdfVEVTVF9DT05TVEFOVDsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIFNUUklOR19URVNUX0NPTlNUQU5UMjsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIFNUUklOR19URVNUX0NPTlNUQU5UX1VURjg7CisgIGVudW0gOiBpbnQzMl90IHsgQTEgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTIgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTMgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTQgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTUgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTYgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTcgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTggPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTkgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTEwID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEExMSA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBMTIgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTEzID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEExNCA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBMTUgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTE2ID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEExNyA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBMTggPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTE5ID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEEyMCA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBMjEgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTIyID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEEyMyA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBMjQgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTI1ID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEEyNiA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBMjcgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTI4ID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEEyOSA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBMzAgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTMxID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEEzMiA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBMzMgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTM0ID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEEzNSA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBMzYgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTM3ID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEEzOCA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBMzkgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTQwID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEE0MSA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBNDIgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTQzID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEE0NCA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBNDUgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTQ2ID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEE0NyA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBNDggPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTQ5ID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEE1MCA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBNTEgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTUyID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEE1MyA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBNTQgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTU1ID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEE1NiA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBNTcgPSAxIH07CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fVW5pbXBsZW1lbnRlZE1ldGhvZCA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAwOworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX0RlcHJlY2F0ZWQgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMTsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9UZXN0T25ld2F5ID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDI7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0Qm9vbGVhbiA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzOworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdEJ5dGUgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXBlYXRDaGFyID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDU7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0SW50ID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDY7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0TG9uZyA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA3OworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdEZsb2F0ID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDg7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0RG91YmxlID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDk7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0U3RyaW5nID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDEwOworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdEJ5dGVFbnVtID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDExOworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdEludEVudW0gPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMTI7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0TG9uZ0VudW0gPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMTM7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmV2ZXJzZUJvb2xlYW4gPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMTQ7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmV2ZXJzZUJ5dGUgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMTU7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmV2ZXJzZUNoYXIgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMTY7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmV2ZXJzZUludCA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAxNzsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXZlcnNlTG9uZyA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAxODsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXZlcnNlRmxvYXQgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMTk7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmV2ZXJzZURvdWJsZSA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyMDsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXZlcnNlU3RyaW5nID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDIxOworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JldmVyc2VCeXRlRW51bSA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyMjsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXZlcnNlSW50RW51bSA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyMzsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXZlcnNlTG9uZ0VudW0gPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMjQ7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fR2V0T3RoZXJUZXN0U2VydmljZSA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyNTsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9WZXJpZnlOYW1lID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDI2OworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX0dldEludGVyZmFjZUFycmF5ID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDI3OworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1ZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUFycmF5ID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDI4OworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX0dldE51bGxhYmxlSW50ZXJmYWNlQXJyYXkgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMjk7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fVmVyaWZ5TmFtZXNXaXRoTnVsbGFibGVJbnRlcmZhY2VBcnJheSA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzMDsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9HZXRJbnRlcmZhY2VMaXN0ID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDMxOworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1ZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUxpc3QgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzI7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmV2ZXJzZVN0cmluZ0xpc3QgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzM7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0UGFyY2VsRmlsZURlc2NyaXB0b3IgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzQ7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmV2ZXJzZVBhcmNlbEZpbGVEZXNjcmlwdG9yQXJyYXkgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzU7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fVGhyb3dTZXJ2aWNlRXhjZXB0aW9uID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDM2OworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdE51bGxhYmxlSW50QXJyYXkgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzc7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0TnVsbGFibGVCeXRlRW51bUFycmF5ID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDM4OworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdE51bGxhYmxlSW50RW51bUFycmF5ID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDM5OworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdE51bGxhYmxlTG9uZ0VudW1BcnJheSA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0MDsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXBlYXROdWxsYWJsZVN0cmluZyA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0MTsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXBlYXROdWxsYWJsZVN0cmluZ0xpc3QgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDI7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQzOworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUFycmF5ID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQ0OworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUxpc3QgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDU7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fVGFrZXNBbklCaW5kZXIgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDY7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fVGFrZXNBTnVsbGFibGVJQmluZGVyID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQ3OworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1Rha2VzQW5JQmluZGVyTGlzdCA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0ODsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9UYWtlc0FOdWxsYWJsZUlCaW5kZXJMaXN0ID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQ5OworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdFV0ZjhDcHBTdHJpbmcgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNTA7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0TnVsbGFibGVVdGY4Q3BwU3RyaW5nID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDUxOworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JldmVyc2VVdGY4Q3BwU3RyaW5nID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDUyOworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JldmVyc2VOdWxsYWJsZVV0ZjhDcHBTdHJpbmcgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNTM7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmV2ZXJzZVV0ZjhDcHBTdHJpbmdMaXN0ID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDU0OworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX0dldENhbGxiYWNrID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDU1OworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX0ZpbGxPdXRTdHJ1Y3R1cmVkUGFyY2VsYWJsZSA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1NjsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXBlYXRFeHRlbmRhYmxlUGFyY2VsYWJsZSA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1NzsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXZlcnNlTGlzdCA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1ODsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXZlcnNlSUJpbmRlckFycmF5ID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDU5OworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JldmVyc2VOdWxsYWJsZUlCaW5kZXJBcnJheSA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA2MDsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9HZXRPbGROYW1lSW50ZXJmYWNlID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDYxOworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX0dldE5ld05hbWVJbnRlcmZhY2UgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNjI7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fR2V0VW5pb25UYWdzID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDYzOworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX0dldENwcEphdmFUZXN0cyA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA2NDsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9nZXRCYWNrZW5kVHlwZSA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA2NTsKKworICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPElUZXN0U2VydmljZT4gZnJvbUJpbmRlcihjb25zdCA6Om5kazo6U3BBSUJpbmRlciYgYmluZGVyKTsKKyAgc3RhdGljIGJpbmRlcl9zdGF0dXNfdCB3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIHBhcmNlbCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElUZXN0U2VydmljZT4mIGluc3RhbmNlKTsKKyAgc3RhdGljIGJpbmRlcl9zdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBwYXJjZWwsIHN0ZDo6c2hhcmVkX3B0cjxJVGVzdFNlcnZpY2U+KiBpbnN0YW5jZSk7CisgIHN0YXRpYyBib29sIHNldERlZmF1bHRJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJVGVzdFNlcnZpY2U+JiBpbXBsKTsKKyAgc3RhdGljIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJVGVzdFNlcnZpY2U+JiBnZXREZWZhdWx0SW1wbCgpOworICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFVuaW1wbGVtZW50ZWRNZXRob2QoaW50MzJfdCBpbl9hcmcsIGludDMyX3QqIF9haWRsX3JldHVybikgPSAwOworICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIERlcHJlY2F0ZWQoKSBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKCJ0byBtYWtlIHN1cmUgd2UgaGF2ZSBzb21ldGhpbmcgaW4gc3lzdGVtL3Rvb2xzL2FpZGwgd2hpY2ggZG9lcyBhIGNvbXBpbGUgY2hlY2sgb2YgZGVwcmVjYXRlZCBhbmQgbWFrZSBzdXJlIHRoaXMgaXMgcmVmbGVjdGVkIGluIGdvbGRlbnMiKSkpID0gMDsKKyAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBUZXN0T25ld2F5KCkgPSAwOworICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdEJvb2xlYW4oYm9vbCBpbl90b2tlbiwgYm9vbCogX2FpZGxfcmV0dXJuKSA9IDA7CisgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0Qnl0ZShpbnQ4X3QgaW5fdG9rZW4sIGludDhfdCogX2FpZGxfcmV0dXJuKSA9IDA7CisgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0Q2hhcihjaGFyMTZfdCBpbl90b2tlbiwgY2hhcjE2X3QqIF9haWRsX3JldHVybikgPSAwOworICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdEludChpbnQzMl90IGluX3Rva2VuLCBpbnQzMl90KiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXRMb25nKGludDY0X3QgaW5fdG9rZW4sIGludDY0X3QqIF9haWRsX3JldHVybikgPSAwOworICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdEZsb2F0KGZsb2F0IGluX3Rva2VuLCBmbG9hdCogX2FpZGxfcmV0dXJuKSA9IDA7CisgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0RG91YmxlKGRvdWJsZSBpbl90b2tlbiwgZG91YmxlKiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXRTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGluX3Rva2VuLCBzdGQ6OnN0cmluZyogX2FpZGxfcmV0dXJuKSA9IDA7CisgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0Qnl0ZUVudW0oOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Qnl0ZUVudW0gaW5fdG9rZW4sIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJ5dGVFbnVtKiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXRJbnRFbnVtKDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0gaW5fdG9rZW4sIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0qIF9haWRsX3JldHVybikgPSAwOworICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdExvbmdFbnVtKDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtIGluX3Rva2VuLCA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMb25nRW51bSogX2FpZGxfcmV0dXJuKSA9IDA7CisgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZUJvb2xlYW4oY29uc3Qgc3RkOjp2ZWN0b3I8Ym9vbD4mIGluX2lucHV0LCBzdGQ6OnZlY3Rvcjxib29sPiogb3V0X3JlcGVhdGVkLCBzdGQ6OnZlY3Rvcjxib29sPiogX2FpZGxfcmV0dXJuKSA9IDA7CisgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZUJ5dGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX2lucHV0LCBzdGQ6OnZlY3Rvcjx1aW50OF90Piogb3V0X3JlcGVhdGVkLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiogX2FpZGxfcmV0dXJuKSA9IDA7CisgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZUNoYXIoY29uc3Qgc3RkOjp2ZWN0b3I8Y2hhcjE2X3Q+JiBpbl9pbnB1dCwgc3RkOjp2ZWN0b3I8Y2hhcjE2X3Q+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6dmVjdG9yPGNoYXIxNl90PiogX2FpZGxfcmV0dXJuKSA9IDA7CisgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZUludChjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgaW5faW5wdXQsIHN0ZDo6dmVjdG9yPGludDMyX3Q+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6dmVjdG9yPGludDMyX3Q+KiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXZlcnNlTG9uZyhjb25zdCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiYgaW5faW5wdXQsIHN0ZDo6dmVjdG9yPGludDY0X3Q+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6dmVjdG9yPGludDY0X3Q+KiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXZlcnNlRmxvYXQoY29uc3Qgc3RkOjp2ZWN0b3I8ZmxvYXQ+JiBpbl9pbnB1dCwgc3RkOjp2ZWN0b3I8ZmxvYXQ+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6dmVjdG9yPGZsb2F0PiogX2FpZGxfcmV0dXJuKSA9IDA7CisgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZURvdWJsZShjb25zdCBzdGQ6OnZlY3Rvcjxkb3VibGU+JiBpbl9pbnB1dCwgc3RkOjp2ZWN0b3I8ZG91YmxlPiogb3V0X3JlcGVhdGVkLCBzdGQ6OnZlY3Rvcjxkb3VibGU+KiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXZlcnNlU3RyaW5nKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgaW5faW5wdXQsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogb3V0X3JlcGVhdGVkLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIF9haWRsX3JldHVybikgPSAwOworICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJldmVyc2VCeXRlRW51bShjb25zdCBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCeXRlRW51bT4mIGluX2lucHV0LCBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCeXRlRW51bT4qIG91dF9yZXBlYXRlZCwgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Qnl0ZUVudW0+KiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXZlcnNlSW50RW51bShjb25zdCBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtPiYgaW5faW5wdXQsIHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0+KiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXZlcnNlTG9uZ0VudW0oY29uc3Qgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0+JiBpbl9pbnB1dCwgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtPiogX2FpZGxfcmV0dXJuKSA9IDA7CisgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgR2V0T3RoZXJUZXN0U2VydmljZShjb25zdCBzdGQ6OnN0cmluZyYgaW5fbmFtZSwgc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPiogX2FpZGxfcmV0dXJuKSA9IDA7CisgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgVmVyaWZ5TmFtZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+JiBpbl9zZXJ2aWNlLCBjb25zdCBzdGQ6OnN0cmluZyYgaW5fbmFtZSwgYm9vbCogX2FpZGxfcmV0dXJuKSA9IDA7CisgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgR2V0SW50ZXJmYWNlQXJyYXkoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBpbl9uYW1lcywgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPj4qIF9haWRsX3JldHVybikgPSAwOworICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUFycmF5KGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4+JiBpbl9zZXJ2aWNlcywgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBpbl9uYW1lcywgYm9vbCogX2FpZGxfcmV0dXJuKSA9IDA7CisgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgR2V0TnVsbGFibGVJbnRlcmZhY2VBcnJheShjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+Pj4mIGluX25hbWVzLCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4+PiogX2FpZGxfcmV0dXJuKSA9IDA7CisgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgVmVyaWZ5TmFtZXNXaXRoTnVsbGFibGVJbnRlcmZhY2VBcnJheShjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4+PiYgaW5fc2VydmljZXMsIGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4+PiYgaW5fbmFtZXMsIGJvb2wqIF9haWRsX3JldHVybikgPSAwOworICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIEdldEludGVyZmFjZUxpc3QoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPj4+JiBpbl9uYW1lcywgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+Pj4qIF9haWRsX3JldHVybikgPSAwOworICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUxpc3QoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+Pj4mIGluX3NlcnZpY2VzLCBjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+Pj4mIGluX25hbWVzLCBib29sKiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXZlcnNlU3RyaW5nTGlzdChjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGluX2lucHV0LCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIG91dF9yZXBlYXRlZCwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXRQYXJjZWxGaWxlRGVzY3JpcHRvcihjb25zdCA6Om5kazo6U2NvcGVkRmlsZURlc2NyaXB0b3ImIGluX3JlYWQsIDo6bmRrOjpTY29wZWRGaWxlRGVzY3JpcHRvciogX2FpZGxfcmV0dXJuKSA9IDA7CisgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZVBhcmNlbEZpbGVEZXNjcmlwdG9yQXJyYXkoY29uc3Qgc3RkOjp2ZWN0b3I8OjpuZGs6OlNjb3BlZEZpbGVEZXNjcmlwdG9yPiYgaW5faW5wdXQsIHN0ZDo6dmVjdG9yPDo6bmRrOjpTY29wZWRGaWxlRGVzY3JpcHRvcj4qIG91dF9yZXBlYXRlZCwgc3RkOjp2ZWN0b3I8OjpuZGs6OlNjb3BlZEZpbGVEZXNjcmlwdG9yPiogX2FpZGxfcmV0dXJuKSA9IDA7CisgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgVGhyb3dTZXJ2aWNlRXhjZXB0aW9uKGludDMyX3QgaW5fY29kZSkgPSAwOworICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdE51bGxhYmxlSW50QXJyYXkoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxpbnQzMl90Pj4mIGluX2lucHV0LCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPGludDMyX3Q+PiogX2FpZGxfcmV0dXJuKSA9IDA7CisgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0TnVsbGFibGVCeXRlRW51bUFycmF5KGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Qnl0ZUVudW0+PiYgaW5faW5wdXQsIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Qnl0ZUVudW0+PiogX2FpZGxfcmV0dXJuKSA9IDA7CisgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0TnVsbGFibGVJbnRFbnVtQXJyYXkoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtPj4mIGluX2lucHV0LCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0+PiogX2FpZGxfcmV0dXJuKSA9IDA7CisgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0TnVsbGFibGVMb25nRW51bUFycmF5KGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0+PiYgaW5faW5wdXQsIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0+PiogX2FpZGxfcmV0dXJuKSA9IDA7CisgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0TnVsbGFibGVTdHJpbmcoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4mIGluX2lucHV0LCBzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiogX2FpZGxfcmV0dXJuKSA9IDA7CisgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0TnVsbGFibGVTdHJpbmdMaXN0KGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4+PiYgaW5faW5wdXQsIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4+PiogX2FpZGxfcmV0dXJuKSA9IDA7CisgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlKGNvbnN0IHN0ZDo6b3B0aW9uYWw8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eT4mIGluX2lucHV0LCBzdGQ6Om9wdGlvbmFsPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6RW1wdHk+KiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXROdWxsYWJsZVBhcmNlbGFibGVBcnJheShjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eT4+PiYgaW5faW5wdXQsIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5Pj4+KiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXROdWxsYWJsZVBhcmNlbGFibGVMaXN0KGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5Pj4+JiBpbl9pbnB1dCwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6RW1wdHk+Pj4qIF9haWRsX3JldHVybikgPSAwOworICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFRha2VzQW5JQmluZGVyKGNvbnN0IDo6bmRrOjpTcEFJQmluZGVyJiBpbl9pbnB1dCkgPSAwOworICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFRha2VzQU51bGxhYmxlSUJpbmRlcihjb25zdCA6Om5kazo6U3BBSUJpbmRlciYgaW5faW5wdXQpID0gMDsKKyAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBUYWtlc0FuSUJpbmRlckxpc3QoY29uc3Qgc3RkOjp2ZWN0b3I8OjpuZGs6OlNwQUlCaW5kZXI+JiBpbl9pbnB1dCkgPSAwOworICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFRha2VzQU51bGxhYmxlSUJpbmRlckxpc3QoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3Rvcjw6Om5kazo6U3BBSUJpbmRlcj4+JiBpbl9pbnB1dCkgPSAwOworICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdFV0ZjhDcHBTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGluX3Rva2VuLCBzdGQ6OnN0cmluZyogX2FpZGxfcmV0dXJuKSA9IDA7CisgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0TnVsbGFibGVVdGY4Q3BwU3RyaW5nKGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+JiBpbl90b2tlbiwgc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4qIF9haWRsX3JldHVybikgPSAwOworICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJldmVyc2VVdGY4Q3BwU3RyaW5nKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgaW5faW5wdXQsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogb3V0X3JlcGVhdGVkLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIF9haWRsX3JldHVybikgPSAwOworICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJldmVyc2VOdWxsYWJsZVV0ZjhDcHBTdHJpbmcoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPj4+JiBpbl9pbnB1dCwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPj4+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4+PiogX2FpZGxfcmV0dXJuKSA9IDA7CisgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZVV0ZjhDcHBTdHJpbmdMaXN0KGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4+PiYgaW5faW5wdXQsIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4+Piogb3V0X3JlcGVhdGVkLCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+Pj4qIF9haWRsX3JldHVybikgPSAwOworICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIEdldENhbGxiYWNrKGJvb2wgaW5fcmV0dXJuX251bGwsIHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4qIF9haWRsX3JldHVybikgPSAwOworICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIEZpbGxPdXRTdHJ1Y3R1cmVkUGFyY2VsYWJsZSg6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpTdHJ1Y3R1cmVkUGFyY2VsYWJsZSogaW5fcGFyY2VsKSA9IDA7CisgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0RXh0ZW5kYWJsZVBhcmNlbGFibGUoY29uc3QgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6ZXh0ZW5zaW9uOjpFeHRlbmRhYmxlUGFyY2VsYWJsZSYgaW5fZXAsIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OmV4dGVuc2lvbjo6RXh0ZW5kYWJsZVBhcmNlbGFibGUqIG91dF9lcDIpID0gMDsKKyAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXZlcnNlTGlzdChjb25zdCA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpSZWN1cnNpdmVMaXN0JiBpbl9saXN0LCA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpSZWN1cnNpdmVMaXN0KiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXZlcnNlSUJpbmRlckFycmF5KGNvbnN0IHN0ZDo6dmVjdG9yPDo6bmRrOjpTcEFJQmluZGVyPiYgaW5faW5wdXQsIHN0ZDo6dmVjdG9yPDo6bmRrOjpTcEFJQmluZGVyPiogb3V0X3JlcGVhdGVkLCBzdGQ6OnZlY3Rvcjw6Om5kazo6U3BBSUJpbmRlcj4qIF9haWRsX3JldHVybikgPSAwOworICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJldmVyc2VOdWxsYWJsZUlCaW5kZXJBcnJheShjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPDo6bmRrOjpTcEFJQmluZGVyPj4mIGluX2lucHV0LCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPDo6bmRrOjpTcEFJQmluZGVyPj4qIG91dF9yZXBlYXRlZCwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3Rvcjw6Om5kazo6U3BBSUJpbmRlcj4+KiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBHZXRPbGROYW1lSW50ZXJmYWNlKHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJT2xkTmFtZT4qIF9haWRsX3JldHVybikgPSAwOworICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIEdldE5ld05hbWVJbnRlcmZhY2Uoc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOZXdOYW1lPiogX2FpZGxfcmV0dXJuKSA9IDA7CisgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgR2V0VW5pb25UYWdzKGNvbnN0IHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlVuaW9uPiYgaW5faW5wdXQsIHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlVuaW9uOjpUYWc+KiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBHZXRDcHBKYXZhVGVzdHMoOjpuZGs6OlNwQUlCaW5kZXIqIF9haWRsX3JldHVybikgPSAwOworICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldEJhY2tlbmRUeXBlKDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJhY2tlbmRUeXBlKiBfYWlkbF9yZXR1cm4pID0gMDsKK3ByaXZhdGU6CisgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8SVRlc3RTZXJ2aWNlPiBkZWZhdWx0X2ltcGw7Cit9OworY2xhc3MgSVRlc3RTZXJ2aWNlRGVmYXVsdCA6IHB1YmxpYyBJVGVzdFNlcnZpY2UgeworcHVibGljOgorICA6Om5kazo6U2NvcGVkQVN0YXR1cyBVbmltcGxlbWVudGVkTWV0aG9kKGludDMyX3QgaW5fYXJnLCBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBEZXByZWNhdGVkKCkgb3ZlcnJpZGUgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCgidG8gbWFrZSBzdXJlIHdlIGhhdmUgc29tZXRoaW5nIGluIHN5c3RlbS90b29scy9haWRsIHdoaWNoIGRvZXMgYSBjb21waWxlIGNoZWNrIG9mIGRlcHJlY2F0ZWQgYW5kIG1ha2Ugc3VyZSB0aGlzIGlzIHJlZmxlY3RlZCBpbiBnb2xkZW5zIikpKTsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgVGVzdE9uZXdheSgpIG92ZXJyaWRlOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXRCb29sZWFuKGJvb2wgaW5fdG9rZW4sIGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdEJ5dGUoaW50OF90IGluX3Rva2VuLCBpbnQ4X3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdENoYXIoY2hhcjE2X3QgaW5fdG9rZW4sIGNoYXIxNl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXRJbnQoaW50MzJfdCBpbl90b2tlbiwgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0TG9uZyhpbnQ2NF90IGluX3Rva2VuLCBpbnQ2NF90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXRGbG9hdChmbG9hdCBpbl90b2tlbiwgZmxvYXQqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdERvdWJsZShkb3VibGUgaW5fdG9rZW4sIGRvdWJsZSogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0U3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl90b2tlbiwgc3RkOjpzdHJpbmcqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdEJ5dGVFbnVtKDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJ5dGVFbnVtIGluX3Rva2VuLCA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCeXRlRW51bSogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0SW50RW51bSg6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtIGluX3Rva2VuLCA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXRMb25nRW51bSg6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMb25nRW51bSBpbl90b2tlbiwgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJldmVyc2VCb29sZWFuKGNvbnN0IHN0ZDo6dmVjdG9yPGJvb2w+JiBpbl9pbnB1dCwgc3RkOjp2ZWN0b3I8Ym9vbD4qIG91dF9yZXBlYXRlZCwgc3RkOjp2ZWN0b3I8Ym9vbD4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJldmVyc2VCeXRlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9pbnB1dCwgc3RkOjp2ZWN0b3I8dWludDhfdD4qIG91dF9yZXBlYXRlZCwgc3RkOjp2ZWN0b3I8dWludDhfdD4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJldmVyc2VDaGFyKGNvbnN0IHN0ZDo6dmVjdG9yPGNoYXIxNl90PiYgaW5faW5wdXQsIHN0ZDo6dmVjdG9yPGNoYXIxNl90Piogb3V0X3JlcGVhdGVkLCBzdGQ6OnZlY3RvcjxjaGFyMTZfdD4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJldmVyc2VJbnQoY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIGluX2lucHV0LCBzdGQ6OnZlY3RvcjxpbnQzMl90Piogb3V0X3JlcGVhdGVkLCBzdGQ6OnZlY3RvcjxpbnQzMl90PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZUxvbmcoY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4mIGluX2lucHV0LCBzdGQ6OnZlY3RvcjxpbnQ2NF90Piogb3V0X3JlcGVhdGVkLCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZUZsb2F0KGNvbnN0IHN0ZDo6dmVjdG9yPGZsb2F0PiYgaW5faW5wdXQsIHN0ZDo6dmVjdG9yPGZsb2F0Piogb3V0X3JlcGVhdGVkLCBzdGQ6OnZlY3RvcjxmbG9hdD4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJldmVyc2VEb3VibGUoY29uc3Qgc3RkOjp2ZWN0b3I8ZG91YmxlPiYgaW5faW5wdXQsIHN0ZDo6dmVjdG9yPGRvdWJsZT4qIG91dF9yZXBlYXRlZCwgc3RkOjp2ZWN0b3I8ZG91YmxlPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZVN0cmluZyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGluX2lucHV0LCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIG91dF9yZXBlYXRlZCwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXZlcnNlQnl0ZUVudW0oY29uc3Qgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Qnl0ZUVudW0+JiBpbl9pbnB1dCwgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Qnl0ZUVudW0+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJ5dGVFbnVtPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZUludEVudW0oY29uc3Qgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bT4mIGluX2lucHV0LCBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtPiogb3V0X3JlcGVhdGVkLCBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZUxvbmdFbnVtKGNvbnN0IHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtPiYgaW5faW5wdXQsIHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtPiogb3V0X3JlcGVhdGVkLCBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMb25nRW51bT4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIEdldE90aGVyVGVzdFNlcnZpY2UoY29uc3Qgc3RkOjpzdHJpbmcmIGluX25hbWUsIHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFZlcmlmeU5hbWUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPiYgaW5fc2VydmljZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGluX25hbWUsIGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIEdldEludGVyZmFjZUFycmF5KGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgaW5fbmFtZXMsIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBWZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VBcnJheShjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+PiYgaW5fc2VydmljZXMsIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgaW5fbmFtZXMsIGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIEdldE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPj4+JiBpbl9uYW1lcywgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+Pj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFZlcmlmeU5hbWVzV2l0aE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+Pj4mIGluX3NlcnZpY2VzLCBjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+Pj4mIGluX25hbWVzLCBib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBHZXRJbnRlcmZhY2VMaXN0KGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4+PiYgaW5fbmFtZXMsIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPj4+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBWZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VMaXN0KGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPj4+JiBpbl9zZXJ2aWNlcywgY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPj4+JiBpbl9uYW1lcywgYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZVN0cmluZ0xpc3QoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBpbl9pbnB1dCwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0UGFyY2VsRmlsZURlc2NyaXB0b3IoY29uc3QgOjpuZGs6OlNjb3BlZEZpbGVEZXNjcmlwdG9yJiBpbl9yZWFkLCA6Om5kazo6U2NvcGVkRmlsZURlc2NyaXB0b3IqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJldmVyc2VQYXJjZWxGaWxlRGVzY3JpcHRvckFycmF5KGNvbnN0IHN0ZDo6dmVjdG9yPDo6bmRrOjpTY29wZWRGaWxlRGVzY3JpcHRvcj4mIGluX2lucHV0LCBzdGQ6OnZlY3Rvcjw6Om5kazo6U2NvcGVkRmlsZURlc2NyaXB0b3I+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6dmVjdG9yPDo6bmRrOjpTY29wZWRGaWxlRGVzY3JpcHRvcj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFRocm93U2VydmljZUV4Y2VwdGlvbihpbnQzMl90IGluX2NvZGUpIG92ZXJyaWRlOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXROdWxsYWJsZUludEFycmF5KGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8aW50MzJfdD4+JiBpbl9pbnB1dCwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxpbnQzMl90Pj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdE51bGxhYmxlQnl0ZUVudW1BcnJheShjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJ5dGVFbnVtPj4mIGluX2lucHV0LCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJ5dGVFbnVtPj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdE51bGxhYmxlSW50RW51bUFycmF5KGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bT4+JiBpbl9pbnB1dCwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtPj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdE51bGxhYmxlTG9uZ0VudW1BcnJheShjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtPj4mIGluX2lucHV0LCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtPj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdE51bGxhYmxlU3RyaW5nKGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+JiBpbl9pbnB1dCwgc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdE51bGxhYmxlU3RyaW5nTGlzdChjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+Pj4mIGluX2lucHV0LCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+Pj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZShjb25zdCBzdGQ6Om9wdGlvbmFsPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6RW1wdHk+JiBpbl9pbnB1dCwgc3RkOjpvcHRpb25hbDw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlQXJyYXkoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6RW1wdHk+Pj4mIGluX2lucHV0LCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eT4+PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlTGlzdChjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eT4+PiYgaW5faW5wdXQsIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5Pj4+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBUYWtlc0FuSUJpbmRlcihjb25zdCA6Om5kazo6U3BBSUJpbmRlciYgaW5faW5wdXQpIG92ZXJyaWRlOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBUYWtlc0FOdWxsYWJsZUlCaW5kZXIoY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGluX2lucHV0KSBvdmVycmlkZTsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgVGFrZXNBbklCaW5kZXJMaXN0KGNvbnN0IHN0ZDo6dmVjdG9yPDo6bmRrOjpTcEFJQmluZGVyPiYgaW5faW5wdXQpIG92ZXJyaWRlOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBUYWtlc0FOdWxsYWJsZUlCaW5kZXJMaXN0KGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8OjpuZGs6OlNwQUlCaW5kZXI+PiYgaW5faW5wdXQpIG92ZXJyaWRlOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXRVdGY4Q3BwU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl90b2tlbiwgc3RkOjpzdHJpbmcqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdE51bGxhYmxlVXRmOENwcFN0cmluZyhjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiYgaW5fdG9rZW4sIHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXZlcnNlVXRmOENwcFN0cmluZyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGluX2lucHV0LCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIG91dF9yZXBlYXRlZCwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXZlcnNlTnVsbGFibGVVdGY4Q3BwU3RyaW5nKGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4+PiYgaW5faW5wdXQsIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4+Piogb3V0X3JlcGVhdGVkLCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+Pj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJldmVyc2VVdGY4Q3BwU3RyaW5nTGlzdChjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+Pj4mIGluX2lucHV0LCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+Pj4qIG91dF9yZXBlYXRlZCwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPj4+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBHZXRDYWxsYmFjayhib29sIGluX3JldHVybl9udWxsLCBzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBGaWxsT3V0U3RydWN0dXJlZFBhcmNlbGFibGUoOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6U3RydWN0dXJlZFBhcmNlbGFibGUqIGluX3BhcmNlbCkgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdEV4dGVuZGFibGVQYXJjZWxhYmxlKGNvbnN0IDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OmV4dGVuc2lvbjo6RXh0ZW5kYWJsZVBhcmNlbGFibGUmIGluX2VwLCA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpleHRlbnNpb246OkV4dGVuZGFibGVQYXJjZWxhYmxlKiBvdXRfZXAyKSBvdmVycmlkZTsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZUxpc3QoY29uc3QgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6UmVjdXJzaXZlTGlzdCYgaW5fbGlzdCwgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6UmVjdXJzaXZlTGlzdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZUlCaW5kZXJBcnJheShjb25zdCBzdGQ6OnZlY3Rvcjw6Om5kazo6U3BBSUJpbmRlcj4mIGluX2lucHV0LCBzdGQ6OnZlY3Rvcjw6Om5kazo6U3BBSUJpbmRlcj4qIG91dF9yZXBlYXRlZCwgc3RkOjp2ZWN0b3I8OjpuZGs6OlNwQUlCaW5kZXI+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXZlcnNlTnVsbGFibGVJQmluZGVyQXJyYXkoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3Rvcjw6Om5kazo6U3BBSUJpbmRlcj4+JiBpbl9pbnB1dCwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3Rvcjw6Om5kazo6U3BBSUJpbmRlcj4+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8OjpuZGs6OlNwQUlCaW5kZXI+PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgR2V0T2xkTmFtZUludGVyZmFjZShzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU9sZE5hbWU+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBHZXROZXdOYW1lSW50ZXJmYWNlKHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmV3TmFtZT4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIEdldFVuaW9uVGFncyhjb25zdCBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpVbmlvbj4mIGluX2lucHV0LCBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpVbmlvbjo6VGFnPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgR2V0Q3BwSmF2YVRlc3RzKDo6bmRrOjpTcEFJQmluZGVyKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXRCYWNrZW5kVHlwZSg6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCYWNrZW5kVHlwZSogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgOjpuZGs6OlNwQUlCaW5kZXIgYXNCaW5kZXIoKSBvdmVycmlkZTsKKyAgYm9vbCBpc1JlbW90ZSgpIG92ZXJyaWRlOworfTsKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvSW50RW51bS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvSW50RW51bS5oCnNpbWlsYXJpdHkgaW5kZXggNjglCnJlbmFtZSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0ludEVudW0uaApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvSW50RW51bS5oCmluZGV4IGI1ZjlhYzkuLmQyNzJlYjMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0ludEVudW0uaAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9JbnRFbnVtLmgKQEAgLTEsMTUgKzEsMTYgQEAKICNwcmFnbWEgb25jZQogCisjaW5jbHVkZSA8YXJyYXk+CiAjaW5jbHVkZSA8Y3N0ZGludD4KICNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8b3B0aW9uYWw+CiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9lbnVtcy5oPgogI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAogI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3N0YWJpbGl0eS5oPgogI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKLSNpbmNsdWRlIDxhcnJheT4KLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9lbnVtcy5oPgorCiBuYW1lc3BhY2UgYWlkbCB7CiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgYWlkbCB7CkBAIC0xOCw4ICsxOSwxOSBAQAogICBGT08gPSAxMDAwLAogICBCQVIgPSAyMDAwLAogICBCQVogPSAyMDAxLAorICBRVVggX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCgiZG8gbm90IHVzZSB0aGlzIikpKSA9IDIwMDIsCiB9OwogCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMiCiBbW25vZGlzY2FyZF1dIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoSW50RW51bSB2YWwpIHsKICAgc3dpdGNoKHZhbCkgewogICBjYXNlIEludEVudW06OkZPTzoKQEAgLTI4LDEwICs0MCwxMyBAQAogICAgIHJldHVybiAiQkFSIjsKICAgY2FzZSBJbnRFbnVtOjpCQVo6CiAgICAgcmV0dXJuICJCQVoiOworICBjYXNlIEludEVudW06OlFVWDoKKyAgICByZXR1cm4gIlFVWCI7CiAgIGRlZmF1bHQ6CiAgICAgcmV0dXJuIHN0ZDo6dG9fc3RyaW5nKHN0YXRpY19jYXN0PGludDMyX3Q+KHZhbCkpOwogICB9CiB9CisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCiB9ICAvLyBuYW1lc3BhY2UgdGVzdHMKIH0gIC8vIG5hbWVzcGFjZSBhaWRsCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApAQCAtNDAsMTIgKzU1LDE0IEBACiBuYW1lc3BhY2UgaW50ZXJuYWwgewogI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKICNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2MrKzE3LWV4dGVuc2lvbnMiCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdkZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIKIHRlbXBsYXRlIDw+Ci1jb25zdGV4cHIgaW5saW5lIHN0ZDo6YXJyYXk8YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0sIDM+IGVudW1fdmFsdWVzPGFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtPiA9IHsKK2NvbnN0ZXhwciBpbmxpbmUgc3RkOjphcnJheTxhaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bSwgND4gZW51bV92YWx1ZXM8YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0+ID0gewogICBhaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bTo6Rk9PLAogICBhaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bTo6QkFSLAogICBhaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bTo6QkFaLAorICBhaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bTo6UVVYLAogfTsKICNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKIH0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBuZGsKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0xpc3RPZkludGVyZmFjZXMuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0xpc3RPZkludGVyZmFjZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGRjOTY4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvTGlzdE9mSW50ZXJmYWNlcy5oCkBAIC0wLDAgKzEsMzIzIEBACisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGFycmF5PgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8b3B0aW9uYWw+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmFyaWFudD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfZW51bXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pYmluZGVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaW50ZXJmYWNlX3V0aWxzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcGFyY2VsYWJsZV91dGlscy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3RvX3N0cmluZy5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0xpc3RPZkludGVyZmFjZXMuaD4KKyNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9zdGFiaWxpdHkuaD4KKyNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisKKyNpZm5kZWYgX19CSU9OSUNfXworI2RlZmluZSBfX2Fzc2VydDIoYSxiLGMsZCkgKCh2b2lkKTApCisjZW5kaWYKKworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK2NsYXNzIExpc3RPZkludGVyZmFjZXMgeworcHVibGljOgorICB0eXBlZGVmIHN0ZDo6ZmFsc2VfdHlwZSBmaXhlZF9zaXplOworICBzdGF0aWMgY29uc3QgY2hhciogZGVzY3JpcHRvcjsKKworICBjbGFzcyBJRW1wdHlJbnRlcmZhY2UgOiBwdWJsaWMgOjpuZGs6OklDSW50ZXJmYWNlIHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkZXNjcmlwdG9yOworICAgIElFbXB0eUludGVyZmFjZSgpOworICAgIHZpcnR1YWwgfklFbXB0eUludGVyZmFjZSgpOworCisKKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPElFbXB0eUludGVyZmFjZT4gZnJvbUJpbmRlcihjb25zdCA6Om5kazo6U3BBSUJpbmRlciYgYmluZGVyKTsKKyAgICBzdGF0aWMgYmluZGVyX3N0YXR1c190IHdyaXRlVG9QYXJjZWwoQVBhcmNlbCogcGFyY2VsLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SUVtcHR5SW50ZXJmYWNlPiYgaW5zdGFuY2UpOworICAgIHN0YXRpYyBiaW5kZXJfc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogcGFyY2VsLCBzdGQ6OnNoYXJlZF9wdHI8SUVtcHR5SW50ZXJmYWNlPiogaW5zdGFuY2UpOworICAgIHN0YXRpYyBib29sIHNldERlZmF1bHRJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJRW1wdHlJbnRlcmZhY2U+JiBpbXBsKTsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElFbXB0eUludGVyZmFjZT4mIGdldERlZmF1bHRJbXBsKCk7CisgIHByaXZhdGU6CisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxJRW1wdHlJbnRlcmZhY2U+IGRlZmF1bHRfaW1wbDsKKyAgfTsKKyAgY2xhc3MgSUVtcHR5SW50ZXJmYWNlRGVmYXVsdCA6IHB1YmxpYyBJRW1wdHlJbnRlcmZhY2UgeworICBwdWJsaWM6CisgICAgOjpuZGs6OlNwQUlCaW5kZXIgYXNCaW5kZXIoKSBvdmVycmlkZTsKKyAgICBib29sIGlzUmVtb3RlKCkgb3ZlcnJpZGU7CisgIH07CisgIGNsYXNzIEJwRW1wdHlJbnRlcmZhY2UgOiBwdWJsaWMgOjpuZGs6OkJwQ0ludGVyZmFjZTxJRW1wdHlJbnRlcmZhY2U+IHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IEJwRW1wdHlJbnRlcmZhY2UoY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGJpbmRlcik7CisgICAgdmlydHVhbCB+QnBFbXB0eUludGVyZmFjZSgpOworCisgIH07CisgIGNsYXNzIEJuRW1wdHlJbnRlcmZhY2UgOiBwdWJsaWMgOjpuZGs6OkJuQ0ludGVyZmFjZTxJRW1wdHlJbnRlcmZhY2U+IHsKKyAgcHVibGljOgorICAgIEJuRW1wdHlJbnRlcmZhY2UoKTsKKyAgICB2aXJ0dWFsIH5CbkVtcHR5SW50ZXJmYWNlKCk7CisgIHByb3RlY3RlZDoKKyAgICA6Om5kazo6U3BBSUJpbmRlciBjcmVhdGVCaW5kZXIoKSBvdmVycmlkZTsKKyAgcHJpdmF0ZToKKyAgfTsKKyAgY2xhc3MgSU15SW50ZXJmYWNlIDogcHVibGljIDo6bmRrOjpJQ0ludGVyZmFjZSB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgY2hhciogZGVzY3JpcHRvcjsKKyAgICBJTXlJbnRlcmZhY2UoKTsKKyAgICB2aXJ0dWFsIH5JTXlJbnRlcmZhY2UoKTsKKworICAgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fbWV0aG9kV2l0aEludGVyZmFjZXMgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMDsKKworICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8SU15SW50ZXJmYWNlPiBmcm9tQmluZGVyKGNvbnN0IDo6bmRrOjpTcEFJQmluZGVyJiBiaW5kZXIpOworICAgIHN0YXRpYyBiaW5kZXJfc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChBUGFyY2VsKiBwYXJjZWwsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJTXlJbnRlcmZhY2U+JiBpbnN0YW5jZSk7CisgICAgc3RhdGljIGJpbmRlcl9zdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBwYXJjZWwsIHN0ZDo6c2hhcmVkX3B0cjxJTXlJbnRlcmZhY2U+KiBpbnN0YW5jZSk7CisgICAgc3RhdGljIGJvb2wgc2V0RGVmYXVsdEltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElNeUludGVyZmFjZT4mIGltcGwpOworICAgIHN0YXRpYyBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SU15SW50ZXJmYWNlPiYgZ2V0RGVmYXVsdEltcGwoKTsKKyAgICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIG1ldGhvZFdpdGhJbnRlcmZhY2VzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+JiBpbl9pZmFjZSwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4mIGluX251bGxhYmxlX2lmYWNlLCBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4mIGluX2lmYWNlX2xpc3RfaW4sIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Piogb3V0X2lmYWNlX2xpc3Rfb3V0LCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4qIGluX2lmYWNlX2xpc3RfaW5vdXQsIGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PiYgaW5fbnVsbGFibGVfaWZhY2VfbGlzdF9pbiwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+KiBvdXRfbnVsbGFibGVfaWZhY2VfbGlzdF9vdXQsIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PiogaW5fbnVsbGFibGVfaWZhY2VfbGlzdF9pbm91dCwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+KiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgcHJpdmF0ZToKKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPElNeUludGVyZmFjZT4gZGVmYXVsdF9pbXBsOworICB9OworICBjbGFzcyBJTXlJbnRlcmZhY2VEZWZhdWx0IDogcHVibGljIElNeUludGVyZmFjZSB7CisgIHB1YmxpYzoKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBtZXRob2RXaXRoSW50ZXJmYWNlcyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPiYgaW5faWZhY2UsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+JiBpbl9udWxsYWJsZV9pZmFjZSwgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+JiBpbl9pZmFjZV9saXN0X2luLCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4qIG91dF9pZmFjZV9saXN0X291dCwgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+KiBpbl9pZmFjZV9saXN0X2lub3V0LCBjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4mIGluX251bGxhYmxlX2lmYWNlX2xpc3RfaW4sIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+Piogb3V0X251bGxhYmxlX2lmYWNlX2xpc3Rfb3V0LCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4qIGluX251bGxhYmxlX2lmYWNlX2xpc3RfaW5vdXQsIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U3BBSUJpbmRlciBhc0JpbmRlcigpIG92ZXJyaWRlOworICAgIGJvb2wgaXNSZW1vdGUoKSBvdmVycmlkZTsKKyAgfTsKKyAgY2xhc3MgQnBNeUludGVyZmFjZSA6IHB1YmxpYyA6Om5kazo6QnBDSW50ZXJmYWNlPElNeUludGVyZmFjZT4geworICBwdWJsaWM6CisgICAgZXhwbGljaXQgQnBNeUludGVyZmFjZShjb25zdCA6Om5kazo6U3BBSUJpbmRlciYgYmluZGVyKTsKKyAgICB2aXJ0dWFsIH5CcE15SW50ZXJmYWNlKCk7CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBtZXRob2RXaXRoSW50ZXJmYWNlcyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPiYgaW5faWZhY2UsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+JiBpbl9udWxsYWJsZV9pZmFjZSwgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+JiBpbl9pZmFjZV9saXN0X2luLCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4qIG91dF9pZmFjZV9saXN0X291dCwgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+KiBpbl9pZmFjZV9saXN0X2lub3V0LCBjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4mIGluX251bGxhYmxlX2lmYWNlX2xpc3RfaW4sIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+Piogb3V0X251bGxhYmxlX2lmYWNlX2xpc3Rfb3V0LCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4qIGluX251bGxhYmxlX2lmYWNlX2xpc3RfaW5vdXQsIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgfTsKKyAgY2xhc3MgQm5NeUludGVyZmFjZSA6IHB1YmxpYyA6Om5kazo6Qm5DSW50ZXJmYWNlPElNeUludGVyZmFjZT4geworICBwdWJsaWM6CisgICAgQm5NeUludGVyZmFjZSgpOworICAgIHZpcnR1YWwgfkJuTXlJbnRlcmZhY2UoKTsKKyAgcHJvdGVjdGVkOgorICAgIDo6bmRrOjpTcEFJQmluZGVyIGNyZWF0ZUJpbmRlcigpIG92ZXJyaWRlOworICBwcml2YXRlOgorICB9OworICBjbGFzcyBNeVBhcmNlbGFibGUgeworICBwdWJsaWM6CisgICAgdHlwZWRlZiBzdGQ6OmZhbHNlX3R5cGUgZml4ZWRfc2l6ZTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciogZGVzY3JpcHRvcjsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+IGlmYWNlOworICAgIHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+IG51bGxhYmxlX2lmYWNlOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+PiBpZmFjZV9saXN0OworICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PiBudWxsYWJsZV9pZmFjZV9saXN0OworCisgICAgYmluZGVyX3N0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIHBhcmNlbCk7CisgICAgYmluZGVyX3N0YXR1c190IHdyaXRlVG9QYXJjZWwoQVBhcmNlbCogcGFyY2VsKSBjb25zdDsKKworICAgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgTXlQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZShpZmFjZSwgbnVsbGFibGVfaWZhY2UsIGlmYWNlX2xpc3QsIG51bGxhYmxlX2lmYWNlX2xpc3QpICE9IHN0ZDo6dGllKHJocy5pZmFjZSwgcmhzLm51bGxhYmxlX2lmYWNlLCByaHMuaWZhY2VfbGlzdCwgcmhzLm51bGxhYmxlX2lmYWNlX2xpc3QpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgTXlQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZShpZmFjZSwgbnVsbGFibGVfaWZhY2UsIGlmYWNlX2xpc3QsIG51bGxhYmxlX2lmYWNlX2xpc3QpIDwgc3RkOjp0aWUocmhzLmlmYWNlLCByaHMubnVsbGFibGVfaWZhY2UsIHJocy5pZmFjZV9saXN0LCByaHMubnVsbGFibGVfaWZhY2VfbGlzdCk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgTXlQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZShpZmFjZSwgbnVsbGFibGVfaWZhY2UsIGlmYWNlX2xpc3QsIG51bGxhYmxlX2lmYWNlX2xpc3QpIDw9IHN0ZDo6dGllKHJocy5pZmFjZSwgcmhzLm51bGxhYmxlX2lmYWNlLCByaHMuaWZhY2VfbGlzdCwgcmhzLm51bGxhYmxlX2lmYWNlX2xpc3QpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE15UGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoaWZhY2UsIG51bGxhYmxlX2lmYWNlLCBpZmFjZV9saXN0LCBudWxsYWJsZV9pZmFjZV9saXN0KSA9PSBzdGQ6OnRpZShyaHMuaWZhY2UsIHJocy5udWxsYWJsZV9pZmFjZSwgcmhzLmlmYWNlX2xpc3QsIHJocy5udWxsYWJsZV9pZmFjZV9saXN0KTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IE15UGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoaWZhY2UsIG51bGxhYmxlX2lmYWNlLCBpZmFjZV9saXN0LCBudWxsYWJsZV9pZmFjZV9saXN0KSA+IHN0ZDo6dGllKHJocy5pZmFjZSwgcmhzLm51bGxhYmxlX2lmYWNlLCByaHMuaWZhY2VfbGlzdCwgcmhzLm51bGxhYmxlX2lmYWNlX2xpc3QpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IE15UGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoaWZhY2UsIG51bGxhYmxlX2lmYWNlLCBpZmFjZV9saXN0LCBudWxsYWJsZV9pZmFjZV9saXN0KSA+PSBzdGQ6OnRpZShyaHMuaWZhY2UsIHJocy5udWxsYWJsZV9pZmFjZSwgcmhzLmlmYWNlX2xpc3QsIHJocy5udWxsYWJsZV9pZmFjZV9saXN0KTsKKyAgICB9CisKKyAgICBzdGF0aWMgY29uc3QgOjpuZGs6OnBhcmNlbGFibGVfc3RhYmlsaXR5X3QgX2FpZGxfc3RhYmlsaXR5ID0gOjpuZGs6OlNUQUJJTElUWV9MT0NBTDsKKyAgICBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7CisgICAgICBvcyA8PCAiTXlQYXJjZWxhYmxleyI7CisgICAgICBvcyA8PCAiaWZhY2U6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaWZhY2UpOworICAgICAgb3MgPDwgIiwgbnVsbGFibGVfaWZhY2U6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcobnVsbGFibGVfaWZhY2UpOworICAgICAgb3MgPDwgIiwgaWZhY2VfbGlzdDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpZmFjZV9saXN0KTsKKyAgICAgIG9zIDw8ICIsIG51bGxhYmxlX2lmYWNlX2xpc3Q6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcobnVsbGFibGVfaWZhY2VfbGlzdCk7CisgICAgICBvcyA8PCAifSI7CisgICAgICByZXR1cm4gb3Muc3RyKCk7CisgICAgfQorICB9OworICBjbGFzcyBNeVVuaW9uIHsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgc3RkOjpmYWxzZV90eXBlIGZpeGVkX3NpemU7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGRlc2NyaXB0b3I7CisKKyAgICBlbnVtIGNsYXNzIFRhZyA6IGludDMyX3QgeworICAgICAgaWZhY2UgPSAwLAorICAgICAgbnVsbGFibGVfaWZhY2UgPSAxLAorICAgICAgaWZhY2VfbGlzdCA9IDIsCisgICAgICBudWxsYWJsZV9pZmFjZV9saXN0ID0gMywKKyAgICB9OworCisgICAgLy8gRXhwb3NlIHRhZyBzeW1ib2xzIGZvciBsZWdhY3kgY29kZQorICAgIHN0YXRpYyBjb25zdCBpbmxpbmUgVGFnIGlmYWNlID0gVGFnOjppZmFjZTsKKyAgICBzdGF0aWMgY29uc3QgaW5saW5lIFRhZyBudWxsYWJsZV9pZmFjZSA9IFRhZzo6bnVsbGFibGVfaWZhY2U7CisgICAgc3RhdGljIGNvbnN0IGlubGluZSBUYWcgaWZhY2VfbGlzdCA9IFRhZzo6aWZhY2VfbGlzdDsKKyAgICBzdGF0aWMgY29uc3QgaW5saW5lIFRhZyBudWxsYWJsZV9pZmFjZV9saXN0ID0gVGFnOjpudWxsYWJsZV9pZmFjZV9saXN0OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBfbm90X3NlbGYgPSAhc3RkOjppc19zYW1lX3Y8c3RkOjpyZW1vdmVfY3ZfdDxzdGQ6OnJlbW92ZV9yZWZlcmVuY2VfdDxfVHA+PiwgTXlVbmlvbj47CisKKyAgICBNeVVuaW9uKCkgOiBfdmFsdWUoc3RkOjppbl9wbGFjZV9pbmRleDxzdGF0aWNfY2FzdDxzaXplX3Q+KGlmYWNlKT4sIHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+KCkpIHsgfQorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgPSBzdGQ6OmVuYWJsZV9pZl90PF9ub3Rfc2VsZjxfVHA+Pj4KKyAgICAvLyBOT0xJTlRORVhUTElORShnb29nbGUtZXhwbGljaXQtY29uc3RydWN0b3IpCisgICAgY29uc3RleHByIE15VW5pb24oX1RwJiYgX2FyZykKKyAgICAgICAgOiBfdmFsdWUoc3RkOjpmb3J3YXJkPF9UcD4oX2FyZykpIHt9CisKKyAgICB0ZW1wbGF0ZSA8c2l6ZV90IF9OcCwgdHlwZW5hbWUuLi4gX1RwPgorICAgIGNvbnN0ZXhwciBleHBsaWNpdCBNeVVuaW9uKHN0ZDo6aW5fcGxhY2VfaW5kZXhfdDxfTnA+LCBfVHAmJi4uLiBfYXJncykKKyAgICAgICAgOiBfdmFsdWUoc3RkOjppbl9wbGFjZV9pbmRleDxfTnA+LCBzdGQ6OmZvcndhcmQ8X1RwPihfYXJncykuLi4pIHt9CisKKyAgICB0ZW1wbGF0ZSA8VGFnIF90YWcsIHR5cGVuYW1lLi4uIF9UcD4KKyAgICBzdGF0aWMgTXlVbmlvbiBtYWtlKF9UcCYmLi4uIF9hcmdzKSB7CisgICAgICByZXR1cm4gTXlVbmlvbihzdGQ6OmluX3BsYWNlX2luZGV4PHN0YXRpY19jYXN0PHNpemVfdD4oX3RhZyk+LCBzdGQ6OmZvcndhcmQ8X1RwPihfYXJncykuLi4pOworICAgIH0KKworICAgIHRlbXBsYXRlIDxUYWcgX3RhZywgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZS4uLiBfVXA+CisgICAgc3RhdGljIE15VW5pb24gbWFrZShzdGQ6OmluaXRpYWxpemVyX2xpc3Q8X1RwPiBfaWwsIF9VcCYmLi4uIF9hcmdzKSB7CisgICAgICByZXR1cm4gTXlVbmlvbihzdGQ6OmluX3BsYWNlX2luZGV4PHN0YXRpY19jYXN0PHNpemVfdD4oX3RhZyk+LCBzdGQ6Om1vdmUoX2lsKSwgc3RkOjpmb3J3YXJkPF9VcD4oX2FyZ3MpLi4uKTsKKyAgICB9CisKKyAgICBUYWcgZ2V0VGFnKCkgY29uc3QgeworICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFRhZz4oX3ZhbHVlLmluZGV4KCkpOworICAgIH0KKworICAgIHRlbXBsYXRlIDxUYWcgX3RhZz4KKyAgICBjb25zdCBhdXRvJiBnZXQoKSBjb25zdCB7CisgICAgICBpZiAoZ2V0VGFnKCkgIT0gX3RhZykgeyBfX2Fzc2VydDIoX19GSUxFX18sIF9fTElORV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fLCAiYmFkIGFjY2VzczogYSB3cm9uZyB0YWciKTsgfQorICAgICAgcmV0dXJuIHN0ZDo6Z2V0PHN0YXRpY19jYXN0PHNpemVfdD4oX3RhZyk+KF92YWx1ZSk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPFRhZyBfdGFnPgorICAgIGF1dG8mIGdldCgpIHsKKyAgICAgIGlmIChnZXRUYWcoKSAhPSBfdGFnKSB7IF9fYXNzZXJ0MihfX0ZJTEVfXywgX19MSU5FX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18sICJiYWQgYWNjZXNzOiBhIHdyb25nIHRhZyIpOyB9CisgICAgICByZXR1cm4gc3RkOjpnZXQ8c3RhdGljX2Nhc3Q8c2l6ZV90PihfdGFnKT4oX3ZhbHVlKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8VGFnIF90YWcsIHR5cGVuYW1lLi4uIF9UcD4KKyAgICB2b2lkIHNldChfVHAmJi4uLiBfYXJncykgeworICAgICAgX3ZhbHVlLmVtcGxhY2U8c3RhdGljX2Nhc3Q8c2l6ZV90PihfdGFnKT4oc3RkOjpmb3J3YXJkPF9UcD4oX2FyZ3MpLi4uKTsKKyAgICB9CisKKyAgICBiaW5kZXJfc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogX3BhcmNlbCk7CisgICAgYmluZGVyX3N0YXR1c190IHdyaXRlVG9QYXJjZWwoQVBhcmNlbCogX3BhcmNlbCkgY29uc3Q7CisKKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IE15VW5pb24mIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIF92YWx1ZSAhPSByaHMuX3ZhbHVlOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgTXlVbmlvbiYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gX3ZhbHVlIDwgcmhzLl92YWx1ZTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBNeVVuaW9uJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBfdmFsdWUgPD0gcmhzLl92YWx1ZTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBNeVVuaW9uJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBfdmFsdWUgPT0gcmhzLl92YWx1ZTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IE15VW5pb24mIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIF92YWx1ZSA+IHJocy5fdmFsdWU7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgTXlVbmlvbiYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gX3ZhbHVlID49IHJocy5fdmFsdWU7CisgICAgfQorCisgICAgc3RhdGljIGNvbnN0IDo6bmRrOjpwYXJjZWxhYmxlX3N0YWJpbGl0eV90IF9haWRsX3N0YWJpbGl0eSA9IDo6bmRrOjpTVEFCSUxJVFlfTE9DQUw7CisgICAgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOworICAgICAgb3MgPDwgIk15VW5pb257IjsKKyAgICAgIHN3aXRjaCAoZ2V0VGFnKCkpIHsKKyAgICAgIGNhc2UgaWZhY2U6IG9zIDw8ICJpZmFjZTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhnZXQ8aWZhY2U+KCkpOyBicmVhazsKKyAgICAgIGNhc2UgbnVsbGFibGVfaWZhY2U6IG9zIDw8ICJudWxsYWJsZV9pZmFjZTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhnZXQ8bnVsbGFibGVfaWZhY2U+KCkpOyBicmVhazsKKyAgICAgIGNhc2UgaWZhY2VfbGlzdDogb3MgPDwgImlmYWNlX2xpc3Q6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoZ2V0PGlmYWNlX2xpc3Q+KCkpOyBicmVhazsKKyAgICAgIGNhc2UgbnVsbGFibGVfaWZhY2VfbGlzdDogb3MgPDwgIm51bGxhYmxlX2lmYWNlX2xpc3Q6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoZ2V0PG51bGxhYmxlX2lmYWNlX2xpc3Q+KCkpOyBicmVhazsKKyAgICAgIH0KKyAgICAgIG9zIDw8ICJ9IjsKKyAgICAgIHJldHVybiBvcy5zdHIoKTsKKyAgICB9CisgIHByaXZhdGU6CisgICAgc3RkOjp2YXJpYW50PHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+LCBzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPiwgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+LCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4+IF92YWx1ZTsKKyAgfTsKKworICBiaW5kZXJfc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogcGFyY2VsKTsKKyAgYmluZGVyX3N0YXR1c190IHdyaXRlVG9QYXJjZWwoQVBhcmNlbCogcGFyY2VsKSBjb25zdDsKKworICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IExpc3RPZkludGVyZmFjZXMmKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKCkgIT0gc3RkOjp0aWUoKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgTGlzdE9mSW50ZXJmYWNlcyYpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoKSA8IHN0ZDo6dGllKCk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBMaXN0T2ZJbnRlcmZhY2VzJikgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZSgpIDw9IHN0ZDo6dGllKCk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBMaXN0T2ZJbnRlcmZhY2VzJikgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZSgpID09IHN0ZDo6dGllKCk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IExpc3RPZkludGVyZmFjZXMmKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKCkgPiBzdGQ6OnRpZSgpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgTGlzdE9mSW50ZXJmYWNlcyYpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoKSA+PSBzdGQ6OnRpZSgpOworICB9CisKKyAgc3RhdGljIGNvbnN0IDo6bmRrOjpwYXJjZWxhYmxlX3N0YWJpbGl0eV90IF9haWRsX3N0YWJpbGl0eSA9IDo6bmRrOjpTVEFCSUxJVFlfTE9DQUw7CisgIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7CisgICAgb3MgPDwgIkxpc3RPZkludGVyZmFjZXN7IjsKKyAgICBvcyA8PCAifSI7CisgICAgcmV0dXJuIG9zLnN0cigpOworICB9Cit9OworfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworW1tub2Rpc2NhcmRdXSBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKExpc3RPZkludGVyZmFjZXM6Ok15VW5pb246OlRhZyB2YWwpIHsKKyAgc3dpdGNoKHZhbCkgeworICBjYXNlIExpc3RPZkludGVyZmFjZXM6Ok15VW5pb246OlRhZzo6aWZhY2U6CisgICAgcmV0dXJuICJpZmFjZSI7CisgIGNhc2UgTGlzdE9mSW50ZXJmYWNlczo6TXlVbmlvbjo6VGFnOjpudWxsYWJsZV9pZmFjZToKKyAgICByZXR1cm4gIm51bGxhYmxlX2lmYWNlIjsKKyAgY2FzZSBMaXN0T2ZJbnRlcmZhY2VzOjpNeVVuaW9uOjpUYWc6OmlmYWNlX2xpc3Q6CisgICAgcmV0dXJuICJpZmFjZV9saXN0IjsKKyAgY2FzZSBMaXN0T2ZJbnRlcmZhY2VzOjpNeVVuaW9uOjpUYWc6Om51bGxhYmxlX2lmYWNlX2xpc3Q6CisgICAgcmV0dXJuICJudWxsYWJsZV9pZmFjZV9saXN0IjsKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gc3RkOjp0b19zdHJpbmcoc3RhdGljX2Nhc3Q8aW50MzJfdD4odmFsKSk7CisgIH0KK30KK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorbmFtZXNwYWNlIG5kayB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2MrKzE3LWV4dGVuc2lvbnMiCit0ZW1wbGF0ZSA8PgorY29uc3RleHByIGlubGluZSBzdGQ6OmFycmF5PGFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpNeVVuaW9uOjpUYWcsIDQ+IGVudW1fdmFsdWVzPGFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpNeVVuaW9uOjpUYWc+ID0geworICBhaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6TXlVbmlvbjo6VGFnOjppZmFjZSwKKyAgYWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6Ok15VW5pb246OlRhZzo6bnVsbGFibGVfaWZhY2UsCisgIGFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpNeVVuaW9uOjpUYWc6OmlmYWNlX2xpc3QsCisgIGFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpNeVVuaW9uOjpUYWc6Om51bGxhYmxlX2lmYWNlX2xpc3QsCit9OworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAorfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgbmRrCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9Mb25nRW51bS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvTG9uZ0VudW0uaApzaW1pbGFyaXR5IGluZGV4IDg4JQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9Mb25nRW51bS5oCnJlbmFtZSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9Mb25nRW51bS5oCmluZGV4IDUwODFjODkuLjk3ZWMzYTAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0xvbmdFbnVtLmgKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvTG9uZ0VudW0uaApAQCAtMSwxNSArMSwxNiBAQAogI3ByYWdtYSBvbmNlCiAKKyNpbmNsdWRlIDxhcnJheT4KICNpbmNsdWRlIDxjc3RkaW50PgogI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxvcHRpb25hbD4KICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2VudW1zLmg+CiAjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCiAjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfc3RhYmlsaXR5Lmg+CiAjZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAotI2luY2x1ZGUgPGFycmF5PgotI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2VudW1zLmg+CisKIG5hbWVzcGFjZSBhaWRsIHsKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBhaWRsIHsKQEAgLTIwLDYgKzIxLDE0IEBACiAgIEJBWiA9IDIwMDAwMDAwMDAwMUwsCiB9OwogCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CiBbW25vZGlzY2FyZF1dIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoTG9uZ0VudW0gdmFsKSB7CiAgIHN3aXRjaCh2YWwpIHsKICAgY2FzZSBMb25nRW51bTo6Rk9POgpAQCAtNDgsNCArNTcsNCBAQAogfTsKICNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKIH0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBuZGsKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL090aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9PdGhlclBhcmNlbGFibGVGb3JUb1N0cmluZy5oCnNpbWlsYXJpdHkgaW5kZXggOTklCnJlbmFtZSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL090aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nLmgKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL090aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nLmgKaW5kZXggZWY3NWQ3MS4uOTA0ZDI2OSAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmcuaAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9PdGhlclBhcmNlbGFibGVGb3JUb1N0cmluZy5oCkBAIC0xLDE1ICsxLDE3IEBACiAjcHJhZ21hIG9uY2UKLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pbnRlcmZhY2VfdXRpbHMuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wYXJjZWxhYmxlX3V0aWxzLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfdG9fc3RyaW5nLmg+CisKICNpbmNsdWRlIDxjc3RkaW50PgogI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxvcHRpb25hbD4KICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2ludGVyZmFjZV91dGlscy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3BhcmNlbGFibGVfdXRpbHMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl90b19zdHJpbmcuaD4KICNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKICNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9zdGFiaWxpdHkuaD4KICNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisKIG5hbWVzcGFjZSBhaWRsIHsKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBhaWRsIHsKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL1BhcmNlbGFibGVGb3JUb1N0cmluZy5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvUGFyY2VsYWJsZUZvclRvU3RyaW5nLmgKc2ltaWxhcml0eSBpbmRleCA5OSUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvUGFyY2VsYWJsZUZvclRvU3RyaW5nLmgKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL1BhcmNlbGFibGVGb3JUb1N0cmluZy5oCmluZGV4IGM3NDAwMWQuLjI5ZGU3OWQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL1BhcmNlbGFibGVGb3JUb1N0cmluZy5oCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL1BhcmNlbGFibGVGb3JUb1N0cmluZy5oCkBAIC0xLDIwICsxLDIyIEBACiAjcHJhZ21hIG9uY2UKLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pbnRlcmZhY2VfdXRpbHMuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wYXJjZWxhYmxlX3V0aWxzLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfdG9fc3RyaW5nLmg+CisKICNpbmNsdWRlIDxjc3RkaW50PgogI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxvcHRpb25hbD4KICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dmVjdG9yPgotI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAotI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3N0YWJpbGl0eS5oPgotI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pbnRlcmZhY2VfdXRpbHMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wYXJjZWxhYmxlX3V0aWxzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfdG9fc3RyaW5nLmg+CiAjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvR2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxlLmg+CiAjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvSW50RW51bS5oPgogI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL090aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nLmg+CiAjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvU3RydWN0dXJlZFBhcmNlbGFibGUuaD4KICNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9Vbmlvbi5oPgorI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3N0YWJpbGl0eS5oPgorI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKwogbmFtZXNwYWNlIGFpZGwgewogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGFpZGwgewpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvUmVjdXJzaXZlTGlzdC5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvUmVjdXJzaXZlTGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhYmQxMzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9SZWN1cnNpdmVMaXN0LmgKQEAgLTAsMCArMSw2MyBAQAorI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxvcHRpb25hbD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2ludGVyZmFjZV91dGlscy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3BhcmNlbGFibGVfdXRpbHMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl90b19zdHJpbmcuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9SZWN1cnNpdmVMaXN0Lmg+CisjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfc3RhYmlsaXR5Lmg+CisjZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworY2xhc3MgUmVjdXJzaXZlTGlzdCB7CitwdWJsaWM6CisgIHR5cGVkZWYgc3RkOjpmYWxzZV90eXBlIGZpeGVkX3NpemU7CisgIHN0YXRpYyBjb25zdCBjaGFyKiBkZXNjcmlwdG9yOworCisgIGludDMyX3QgdmFsdWUgPSAwOworICBzdGQ6OnVuaXF1ZV9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6UmVjdXJzaXZlTGlzdD4gbmV4dDsKKworICBiaW5kZXJfc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogcGFyY2VsKTsKKyAgYmluZGVyX3N0YXR1c190IHdyaXRlVG9QYXJjZWwoQVBhcmNlbCogcGFyY2VsKSBjb25zdDsKKworICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFJlY3Vyc2l2ZUxpc3QmIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZSh2YWx1ZSwgbmV4dCkgIT0gc3RkOjp0aWUocmhzLnZhbHVlLCByaHMubmV4dCk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFJlY3Vyc2l2ZUxpc3QmIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZSh2YWx1ZSwgbmV4dCkgPCBzdGQ6OnRpZShyaHMudmFsdWUsIHJocy5uZXh0KTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IFJlY3Vyc2l2ZUxpc3QmIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZSh2YWx1ZSwgbmV4dCkgPD0gc3RkOjp0aWUocmhzLnZhbHVlLCByaHMubmV4dCk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBSZWN1cnNpdmVMaXN0JiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUodmFsdWUsIG5leHQpID09IHN0ZDo6dGllKHJocy52YWx1ZSwgcmhzLm5leHQpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPihjb25zdCBSZWN1cnNpdmVMaXN0JiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUodmFsdWUsIG5leHQpID4gc3RkOjp0aWUocmhzLnZhbHVlLCByaHMubmV4dCk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBSZWN1cnNpdmVMaXN0JiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUodmFsdWUsIG5leHQpID49IHN0ZDo6dGllKHJocy52YWx1ZSwgcmhzLm5leHQpOworICB9CisKKyAgc3RhdGljIGNvbnN0IDo6bmRrOjpwYXJjZWxhYmxlX3N0YWJpbGl0eV90IF9haWRsX3N0YWJpbGl0eSA9IDo6bmRrOjpTVEFCSUxJVFlfTE9DQUw7CisgIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7CisgICAgb3MgPDwgIlJlY3Vyc2l2ZUxpc3R7IjsKKyAgICBvcyA8PCAidmFsdWU6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcodmFsdWUpOworICAgIG9zIDw8ICIsIG5leHQ6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcobmV4dCk7CisgICAgb3MgPDwgIn0iOworICAgIHJldHVybiBvcy5zdHIoKTsKKyAgfQorfTsKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvU3RydWN0dXJlZFBhcmNlbGFibGUuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL1N0cnVjdHVyZWRQYXJjZWxhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVjN2Q1YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL1N0cnVjdHVyZWRQYXJjZWxhYmxlLmgKQEAgLTAsMCArMSwyMTMgQEAKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8b3B0aW9uYWw+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pbnRlcmZhY2VfdXRpbHMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wYXJjZWxhYmxlX3V0aWxzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfdG9fc3RyaW5nLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnl0ZUVudW0uaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9Db25zdGFudEV4cHJlc3Npb25FbnVtLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvSW50RW51bS5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0xvbmdFbnVtLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvU3RydWN0dXJlZFBhcmNlbGFibGUuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9Vbmlvbi5oPgorI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3N0YWJpbGl0eS5oPgorI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK2NsYXNzIFN0cnVjdHVyZWRQYXJjZWxhYmxlIHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBzdGQ6OmZhbHNlX3R5cGUgZml4ZWRfc2l6ZTsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIGRlc2NyaXB0b3I7CisKKyAgY2xhc3MgRW1wdHkgeworICBwdWJsaWM6CisgICAgdHlwZWRlZiBzdGQ6OmZhbHNlX3R5cGUgZml4ZWRfc2l6ZTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciogZGVzY3JpcHRvcjsKKworCisgICAgYmluZGVyX3N0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIHBhcmNlbCk7CisgICAgYmluZGVyX3N0YXR1c190IHdyaXRlVG9QYXJjZWwoQVBhcmNlbCogcGFyY2VsKSBjb25zdDsKKworICAgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgRW1wdHkmKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoKSAhPSBzdGQ6OnRpZSgpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgRW1wdHkmKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoKSA8IHN0ZDo6dGllKCk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgRW1wdHkmKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoKSA8PSBzdGQ6OnRpZSgpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEVtcHR5JikgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKCkgPT0gc3RkOjp0aWUoKTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IEVtcHR5JikgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKCkgPiBzdGQ6OnRpZSgpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IEVtcHR5JikgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKCkgPj0gc3RkOjp0aWUoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY29uc3QgOjpuZGs6OnBhcmNlbGFibGVfc3RhYmlsaXR5X3QgX2FpZGxfc3RhYmlsaXR5ID0gOjpuZGs6OlNUQUJJTElUWV9MT0NBTDsKKyAgICBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7CisgICAgICBvcyA8PCAiRW1wdHl7IjsKKyAgICAgIG9zIDw8ICJ9IjsKKyAgICAgIHJldHVybiBvcy5zdHIoKTsKKyAgICB9CisgIH07CisgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IHNob3VsZENvbnRhaW5UaHJlZUZzOworICBpbnQzMl90IGYgPSAwOworICBzdGQ6OnN0cmluZyBzaG91bGRCZUplcnJ5OworICA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCeXRlRW51bSBzaG91bGRCZUJ5dGVCYXIgPSA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCeXRlRW51bSgwKTsKKyAgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bSBzaG91bGRCZUludEJhciA9IDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0oMCk7CisgIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtIHNob3VsZEJlTG9uZ0JhciA9IDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtKDApOworICBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCeXRlRW51bT4gc2hvdWxkQ29udGFpblR3b0J5dGVGb29zOworICBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtPiBzaG91bGRDb250YWluVHdvSW50Rm9vczsKKyAgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0+IHNob3VsZENvbnRhaW5Ud29Mb25nRm9vczsKKyAgc3RkOjpzdHJpbmcgc3RyaW5nRGVmYXVsdHNUb0ZvbyA9ICJmb28iOworICBpbnQ4X3QgYnl0ZURlZmF1bHRzVG9Gb3VyID0gNDsKKyAgaW50MzJfdCBpbnREZWZhdWx0c1RvRml2ZSA9IDU7CisgIGludDY0X3QgbG9uZ0RlZmF1bHRzVG9OZWdhdGl2ZVNldmVuID0gLTdMOworICBib29sIGJvb2xlYW5EZWZhdWx0c1RvVHJ1ZSA9IHRydWU7CisgIGNoYXIxNl90IGNoYXJEZWZhdWx0c1RvQyA9ICdDJzsKKyAgZmxvYXQgZmxvYXREZWZhdWx0c1RvUGkgPSAzLjE0MDAwMGY7CisgIGRvdWJsZSBkb3VibGVXaXRoRGVmYXVsdCA9IC0zMTQwMDAwMDAwMDAwMDAwMDAuMDAwMDAwOworICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBhcnJheURlZmF1bHRzVG8xMjMgPSB7MSwgMiwgM307CisgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IGFycmF5RGVmYXVsdHNUb0VtcHR5ID0ge307CisgIGJvb2wgYm9vbERlZmF1bHQgPSBmYWxzZTsKKyAgaW50OF90IGJ5dGVEZWZhdWx0ID0gMDsKKyAgaW50MzJfdCBpbnREZWZhdWx0ID0gMDsKKyAgaW50NjRfdCBsb25nRGVmYXVsdCA9IDBMOworICBmbG9hdCBmbG9hdERlZmF1bHQgPSAwLjAwMDAwMGY7CisgIGRvdWJsZSBkb3VibGVEZWZhdWx0ID0gMC4wMDAwMDA7CisgIGRvdWJsZSBjaGVja0RvdWJsZUZyb21GbG9hdCA9IDMuMTQwMDAwOworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY2hlY2tTdHJpbmdBcnJheTEgPSB7ImEiLCAiYiJ9OworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY2hlY2tTdHJpbmdBcnJheTIgPSB7ImEiLCAiYiJ9OworICBpbnQzMl90IGludDMyX21pbiA9IC0yMTQ3NDgzNjQ4OworICBpbnQzMl90IGludDMyX21heCA9IDIxNDc0ODM2NDc7CisgIGludDY0X3QgaW50NjRfbWF4ID0gOTIyMzM3MjAzNjg1NDc3NTgwN0w7CisgIGludDMyX3QgaGV4SW50MzJfbmVnXzEgPSAtMTsKKyAgOjpuZGs6OlNwQUlCaW5kZXIgaWJpbmRlcjsKKyAgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6U3RydWN0dXJlZFBhcmNlbGFibGU6OkVtcHR5IGVtcHR5OworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBpbnQ4XzEgPSB7MSwgMSwgMSwgMSwgMX07CisgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IGludDMyXzEgPSB7MSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMX07CisgIHN0ZDo6dmVjdG9yPGludDY0X3Q+IGludDY0XzEgPSB7MUwsIDFMLCAxTCwgMUwsIDFMLCAxTCwgMUwsIDFMLCAxTCwgMUx9OworICBpbnQzMl90IGhleEludDMyX3Bvc18xID0gMTsKKyAgaW50MzJfdCBoZXhJbnQ2NF9wb3NfMSA9IDE7CisgIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkNvbnN0YW50RXhwcmVzc2lvbkVudW0gY29uc3RfZXhwcnNfMSA9IDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkNvbnN0YW50RXhwcmVzc2lvbkVudW0oMCk7CisgIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkNvbnN0YW50RXhwcmVzc2lvbkVudW0gY29uc3RfZXhwcnNfMiA9IDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkNvbnN0YW50RXhwcmVzc2lvbkVudW0oMCk7CisgIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkNvbnN0YW50RXhwcmVzc2lvbkVudW0gY29uc3RfZXhwcnNfMyA9IDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkNvbnN0YW50RXhwcmVzc2lvbkVudW0oMCk7CisgIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkNvbnN0YW50RXhwcmVzc2lvbkVudW0gY29uc3RfZXhwcnNfNCA9IDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkNvbnN0YW50RXhwcmVzc2lvbkVudW0oMCk7CisgIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkNvbnN0YW50RXhwcmVzc2lvbkVudW0gY29uc3RfZXhwcnNfNSA9IDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkNvbnN0YW50RXhwcmVzc2lvbkVudW0oMCk7CisgIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkNvbnN0YW50RXhwcmVzc2lvbkVudW0gY29uc3RfZXhwcnNfNiA9IDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkNvbnN0YW50RXhwcmVzc2lvbkVudW0oMCk7CisgIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkNvbnN0YW50RXhwcmVzc2lvbkVudW0gY29uc3RfZXhwcnNfNyA9IDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkNvbnN0YW50RXhwcmVzc2lvbkVudW0oMCk7CisgIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkNvbnN0YW50RXhwcmVzc2lvbkVudW0gY29uc3RfZXhwcnNfOCA9IDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkNvbnN0YW50RXhwcmVzc2lvbkVudW0oMCk7CisgIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkNvbnN0YW50RXhwcmVzc2lvbkVudW0gY29uc3RfZXhwcnNfOSA9IDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkNvbnN0YW50RXhwcmVzc2lvbkVudW0oMCk7CisgIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkNvbnN0YW50RXhwcmVzc2lvbkVudW0gY29uc3RfZXhwcnNfMTAgPSA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpDb25zdGFudEV4cHJlc3Npb25FbnVtKDApOworICBzdGQ6OnN0cmluZyBhZGRTdHJpbmcxID0gImhlbGxvIHdvcmxkISI7CisgIHN0ZDo6c3RyaW5nIGFkZFN0cmluZzIgPSAiVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZy4iOworICBpbnQzMl90IHNob3VsZFNldEJpdDBBbmRCaXQyID0gMDsKKyAgc3RkOjpvcHRpb25hbDw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpVbmlvbj4gdTsKKyAgc3RkOjpvcHRpb25hbDw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpVbmlvbj4gc2hvdWxkQmVDb25zdFMxOworICA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtIGRlZmF1bHRXaXRoRm9vID0gOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bTo6Rk9POworCisgIGJpbmRlcl9zdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBwYXJjZWwpOworICBiaW5kZXJfc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChBUGFyY2VsKiBwYXJjZWwpIGNvbnN0OworCisgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgU3RydWN0dXJlZFBhcmNlbGFibGUmIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZShzaG91bGRDb250YWluVGhyZWVGcywgZiwgc2hvdWxkQmVKZXJyeSwgc2hvdWxkQmVCeXRlQmFyLCBzaG91bGRCZUludEJhciwgc2hvdWxkQmVMb25nQmFyLCBzaG91bGRDb250YWluVHdvQnl0ZUZvb3MsIHNob3VsZENvbnRhaW5Ud29JbnRGb29zLCBzaG91bGRDb250YWluVHdvTG9uZ0Zvb3MsIHN0cmluZ0RlZmF1bHRzVG9Gb28sIGJ5dGVEZWZhdWx0c1RvRm91ciwgaW50RGVmYXVsdHNUb0ZpdmUsIGxvbmdEZWZhdWx0c1RvTmVnYXRpdmVTZXZlbiwgYm9vbGVhbkRlZmF1bHRzVG9UcnVlLCBjaGFyRGVmYXVsdHNUb0MsIGZsb2F0RGVmYXVsdHNUb1BpLCBkb3VibGVXaXRoRGVmYXVsdCwgYXJyYXlEZWZhdWx0c1RvMTIzLCBhcnJheURlZmF1bHRzVG9FbXB0eSwgYm9vbERlZmF1bHQsIGJ5dGVEZWZhdWx0LCBpbnREZWZhdWx0LCBsb25nRGVmYXVsdCwgZmxvYXREZWZhdWx0LCBkb3VibGVEZWZhdWx0LCBjaGVja0RvdWJsZUZyb21GbG9hdCwgY2hlY2tTdHJpbmdBcnJheTEsIGNoZWNrU3RyaW5nQXJyYXkyLCBpbnQzMl9taW4sIGludDMyX21heCwgaW50NjRfbWF4LCBoZXhJbnQzMl9uZWdfMSwgaWJpbmRlciwgZW1wdHksIGludDhfMSwgaW50MzJfMSwgaW50NjRfMSwgaGV4SW50MzJfcG9zXzEsIGhleEludDY0X3Bvc18xLCBjb25zdF9leHByc18xLCBjb25zdF9leHByc18yLCBjb25zdF9leHByc18zLCBjb25zdF9leHByc180LCBjb25zdF9leHByc181LCBjb25zdF9leHByc182LCBjb25zdF9leHByc183LCBjb25zdF9leHByc184LCBjb25zdF9leHByc185LCBjb25zdF9leHByc18xMCwgYWRkU3RyaW5nMSwgYWRkU3RyaW5nMiwgc2hvdWxkU2V0Qml0MEFuZEJpdDIsIHUsIHNob3VsZEJlQ29uc3RTMSwgZGVmYXVsdFdpdGhGb28pICE9IHN0ZDo6dGllKHJocy5zaG91bGRDb250YWluVGhyZWVGcywgcmhzLmYsIHJocy5zaG91bGRCZUplcnJ5LCByaHMuc2hvdWxkQmVCeXRlQmFyLCByaHMuc2hvdWxkQmVJbnRCYXIsIHJocy5zaG91bGRCZUxvbmdCYXIsIHJocy5zaG91bGRDb250YWluVHdvQnl0ZUZvb3MsIHJocy5zaG91bGRDb250YWluVHdvSW50Rm9vcywgcmhzLnNob3VsZENvbnRhaW5Ud29Mb25nRm9vcywgcmhzLnN0cmluZ0RlZmF1bHRzVG9Gb28sIHJocy5ieXRlRGVmYXVsdHNUb0ZvdXIsIHJocy5pbnREZWZhdWx0c1RvRml2ZSwgcmhzLmxvbmdEZWZhdWx0c1RvTmVnYXRpdmVTZXZlbiwgcmhzLmJvb2xlYW5EZWZhdWx0c1RvVHJ1ZSwgcmhzLmNoYXJEZWZhdWx0c1RvQywgcmhzLmZsb2F0RGVmYXVsdHNUb1BpLCByaHMuZG91YmxlV2l0aERlZmF1bHQsIHJocy5hcnJheURlZmF1bHRzVG8xMjMsIHJocy5hcnJheURlZmF1bHRzVG9FbXB0eSwgcmhzLmJvb2xEZWZhdWx0LCByaHMuYnl0ZURlZmF1bHQsIHJocy5pbnREZWZhdWx0LCByaHMubG9uZ0RlZmF1bHQsIHJocy5mbG9hdERlZmF1bHQsIHJocy5kb3VibGVEZWZhdWx0LCByaHMuY2hlY2tEb3VibGVGcm9tRmxvYXQsIHJocy5jaGVja1N0cmluZ0FycmF5MSwgcmhzLmNoZWNrU3RyaW5nQXJyYXkyLCByaHMuaW50MzJfbWluLCByaHMuaW50MzJfbWF4LCByaHMuaW50NjRfbWF4LCByaHMuaGV4SW50MzJfbmVnXzEsIHJocy5pYmluZGVyLCByaHMuZW1wdHksIHJocy5pbnQ4XzEsIHJocy5pbnQzMl8xLCByaHMuaW50NjRfMSwgcmhzLmhleEludDMyX3Bvc18xLCByaHMuaGV4SW50NjRfcG9zXzEsIHJocy5jb25zdF9leHByc18xLCByaHMuY29uc3RfZXhwcnNfMiwgcmhzLmNvbnN0X2V4cHJzXzMsIHJocy5jb25zdF9leHByc180LCByaHMuY29uc3RfZXhwcnNfNSwgcmhzLmNvbnN0X2V4cHJzXzYsIHJocy5jb25zdF9leHByc183LCByaHMuY29uc3RfZXhwcnNfOCwgcmhzLmNvbnN0X2V4cHJzXzksIHJocy5jb25zdF9leHByc18xMCwgcmhzLmFkZFN0cmluZzEsIHJocy5hZGRTdHJpbmcyLCByaHMuc2hvdWxkU2V0Qml0MEFuZEJpdDIsIHJocy51LCByaHMuc2hvdWxkQmVDb25zdFMxLCByaHMuZGVmYXVsdFdpdGhGb28pOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBTdHJ1Y3R1cmVkUGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKHNob3VsZENvbnRhaW5UaHJlZUZzLCBmLCBzaG91bGRCZUplcnJ5LCBzaG91bGRCZUJ5dGVCYXIsIHNob3VsZEJlSW50QmFyLCBzaG91bGRCZUxvbmdCYXIsIHNob3VsZENvbnRhaW5Ud29CeXRlRm9vcywgc2hvdWxkQ29udGFpblR3b0ludEZvb3MsIHNob3VsZENvbnRhaW5Ud29Mb25nRm9vcywgc3RyaW5nRGVmYXVsdHNUb0ZvbywgYnl0ZURlZmF1bHRzVG9Gb3VyLCBpbnREZWZhdWx0c1RvRml2ZSwgbG9uZ0RlZmF1bHRzVG9OZWdhdGl2ZVNldmVuLCBib29sZWFuRGVmYXVsdHNUb1RydWUsIGNoYXJEZWZhdWx0c1RvQywgZmxvYXREZWZhdWx0c1RvUGksIGRvdWJsZVdpdGhEZWZhdWx0LCBhcnJheURlZmF1bHRzVG8xMjMsIGFycmF5RGVmYXVsdHNUb0VtcHR5LCBib29sRGVmYXVsdCwgYnl0ZURlZmF1bHQsIGludERlZmF1bHQsIGxvbmdEZWZhdWx0LCBmbG9hdERlZmF1bHQsIGRvdWJsZURlZmF1bHQsIGNoZWNrRG91YmxlRnJvbUZsb2F0LCBjaGVja1N0cmluZ0FycmF5MSwgY2hlY2tTdHJpbmdBcnJheTIsIGludDMyX21pbiwgaW50MzJfbWF4LCBpbnQ2NF9tYXgsIGhleEludDMyX25lZ18xLCBpYmluZGVyLCBlbXB0eSwgaW50OF8xLCBpbnQzMl8xLCBpbnQ2NF8xLCBoZXhJbnQzMl9wb3NfMSwgaGV4SW50NjRfcG9zXzEsIGNvbnN0X2V4cHJzXzEsIGNvbnN0X2V4cHJzXzIsIGNvbnN0X2V4cHJzXzMsIGNvbnN0X2V4cHJzXzQsIGNvbnN0X2V4cHJzXzUsIGNvbnN0X2V4cHJzXzYsIGNvbnN0X2V4cHJzXzcsIGNvbnN0X2V4cHJzXzgsIGNvbnN0X2V4cHJzXzksIGNvbnN0X2V4cHJzXzEwLCBhZGRTdHJpbmcxLCBhZGRTdHJpbmcyLCBzaG91bGRTZXRCaXQwQW5kQml0MiwgdSwgc2hvdWxkQmVDb25zdFMxLCBkZWZhdWx0V2l0aEZvbykgPCBzdGQ6OnRpZShyaHMuc2hvdWxkQ29udGFpblRocmVlRnMsIHJocy5mLCByaHMuc2hvdWxkQmVKZXJyeSwgcmhzLnNob3VsZEJlQnl0ZUJhciwgcmhzLnNob3VsZEJlSW50QmFyLCByaHMuc2hvdWxkQmVMb25nQmFyLCByaHMuc2hvdWxkQ29udGFpblR3b0J5dGVGb29zLCByaHMuc2hvdWxkQ29udGFpblR3b0ludEZvb3MsIHJocy5zaG91bGRDb250YWluVHdvTG9uZ0Zvb3MsIHJocy5zdHJpbmdEZWZhdWx0c1RvRm9vLCByaHMuYnl0ZURlZmF1bHRzVG9Gb3VyLCByaHMuaW50RGVmYXVsdHNUb0ZpdmUsIHJocy5sb25nRGVmYXVsdHNUb05lZ2F0aXZlU2V2ZW4sIHJocy5ib29sZWFuRGVmYXVsdHNUb1RydWUsIHJocy5jaGFyRGVmYXVsdHNUb0MsIHJocy5mbG9hdERlZmF1bHRzVG9QaSwgcmhzLmRvdWJsZVdpdGhEZWZhdWx0LCByaHMuYXJyYXlEZWZhdWx0c1RvMTIzLCByaHMuYXJyYXlEZWZhdWx0c1RvRW1wdHksIHJocy5ib29sRGVmYXVsdCwgcmhzLmJ5dGVEZWZhdWx0LCByaHMuaW50RGVmYXVsdCwgcmhzLmxvbmdEZWZhdWx0LCByaHMuZmxvYXREZWZhdWx0LCByaHMuZG91YmxlRGVmYXVsdCwgcmhzLmNoZWNrRG91YmxlRnJvbUZsb2F0LCByaHMuY2hlY2tTdHJpbmdBcnJheTEsIHJocy5jaGVja1N0cmluZ0FycmF5MiwgcmhzLmludDMyX21pbiwgcmhzLmludDMyX21heCwgcmhzLmludDY0X21heCwgcmhzLmhleEludDMyX25lZ18xLCByaHMuaWJpbmRlciwgcmhzLmVtcHR5LCByaHMuaW50OF8xLCByaHMuaW50MzJfMSwgcmhzLmludDY0XzEsIHJocy5oZXhJbnQzMl9wb3NfMSwgcmhzLmhleEludDY0X3Bvc18xLCByaHMuY29uc3RfZXhwcnNfMSwgcmhzLmNvbnN0X2V4cHJzXzIsIHJocy5jb25zdF9leHByc18zLCByaHMuY29uc3RfZXhwcnNfNCwgcmhzLmNvbnN0X2V4cHJzXzUsIHJocy5jb25zdF9leHByc182LCByaHMuY29uc3RfZXhwcnNfNywgcmhzLmNvbnN0X2V4cHJzXzgsIHJocy5jb25zdF9leHByc185LCByaHMuY29uc3RfZXhwcnNfMTAsIHJocy5hZGRTdHJpbmcxLCByaHMuYWRkU3RyaW5nMiwgcmhzLnNob3VsZFNldEJpdDBBbmRCaXQyLCByaHMudSwgcmhzLnNob3VsZEJlQ29uc3RTMSwgcmhzLmRlZmF1bHRXaXRoRm9vKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IFN0cnVjdHVyZWRQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoc2hvdWxkQ29udGFpblRocmVlRnMsIGYsIHNob3VsZEJlSmVycnksIHNob3VsZEJlQnl0ZUJhciwgc2hvdWxkQmVJbnRCYXIsIHNob3VsZEJlTG9uZ0Jhciwgc2hvdWxkQ29udGFpblR3b0J5dGVGb29zLCBzaG91bGRDb250YWluVHdvSW50Rm9vcywgc2hvdWxkQ29udGFpblR3b0xvbmdGb29zLCBzdHJpbmdEZWZhdWx0c1RvRm9vLCBieXRlRGVmYXVsdHNUb0ZvdXIsIGludERlZmF1bHRzVG9GaXZlLCBsb25nRGVmYXVsdHNUb05lZ2F0aXZlU2V2ZW4sIGJvb2xlYW5EZWZhdWx0c1RvVHJ1ZSwgY2hhckRlZmF1bHRzVG9DLCBmbG9hdERlZmF1bHRzVG9QaSwgZG91YmxlV2l0aERlZmF1bHQsIGFycmF5RGVmYXVsdHNUbzEyMywgYXJyYXlEZWZhdWx0c1RvRW1wdHksIGJvb2xEZWZhdWx0LCBieXRlRGVmYXVsdCwgaW50RGVmYXVsdCwgbG9uZ0RlZmF1bHQsIGZsb2F0RGVmYXVsdCwgZG91YmxlRGVmYXVsdCwgY2hlY2tEb3VibGVGcm9tRmxvYXQsIGNoZWNrU3RyaW5nQXJyYXkxLCBjaGVja1N0cmluZ0FycmF5MiwgaW50MzJfbWluLCBpbnQzMl9tYXgsIGludDY0X21heCwgaGV4SW50MzJfbmVnXzEsIGliaW5kZXIsIGVtcHR5LCBpbnQ4XzEsIGludDMyXzEsIGludDY0XzEsIGhleEludDMyX3Bvc18xLCBoZXhJbnQ2NF9wb3NfMSwgY29uc3RfZXhwcnNfMSwgY29uc3RfZXhwcnNfMiwgY29uc3RfZXhwcnNfMywgY29uc3RfZXhwcnNfNCwgY29uc3RfZXhwcnNfNSwgY29uc3RfZXhwcnNfNiwgY29uc3RfZXhwcnNfNywgY29uc3RfZXhwcnNfOCwgY29uc3RfZXhwcnNfOSwgY29uc3RfZXhwcnNfMTAsIGFkZFN0cmluZzEsIGFkZFN0cmluZzIsIHNob3VsZFNldEJpdDBBbmRCaXQyLCB1LCBzaG91bGRCZUNvbnN0UzEsIGRlZmF1bHRXaXRoRm9vKSA8PSBzdGQ6OnRpZShyaHMuc2hvdWxkQ29udGFpblRocmVlRnMsIHJocy5mLCByaHMuc2hvdWxkQmVKZXJyeSwgcmhzLnNob3VsZEJlQnl0ZUJhciwgcmhzLnNob3VsZEJlSW50QmFyLCByaHMuc2hvdWxkQmVMb25nQmFyLCByaHMuc2hvdWxkQ29udGFpblR3b0J5dGVGb29zLCByaHMuc2hvdWxkQ29udGFpblR3b0ludEZvb3MsIHJocy5zaG91bGRDb250YWluVHdvTG9uZ0Zvb3MsIHJocy5zdHJpbmdEZWZhdWx0c1RvRm9vLCByaHMuYnl0ZURlZmF1bHRzVG9Gb3VyLCByaHMuaW50RGVmYXVsdHNUb0ZpdmUsIHJocy5sb25nRGVmYXVsdHNUb05lZ2F0aXZlU2V2ZW4sIHJocy5ib29sZWFuRGVmYXVsdHNUb1RydWUsIHJocy5jaGFyRGVmYXVsdHNUb0MsIHJocy5mbG9hdERlZmF1bHRzVG9QaSwgcmhzLmRvdWJsZVdpdGhEZWZhdWx0LCByaHMuYXJyYXlEZWZhdWx0c1RvMTIzLCByaHMuYXJyYXlEZWZhdWx0c1RvRW1wdHksIHJocy5ib29sRGVmYXVsdCwgcmhzLmJ5dGVEZWZhdWx0LCByaHMuaW50RGVmYXVsdCwgcmhzLmxvbmdEZWZhdWx0LCByaHMuZmxvYXREZWZhdWx0LCByaHMuZG91YmxlRGVmYXVsdCwgcmhzLmNoZWNrRG91YmxlRnJvbUZsb2F0LCByaHMuY2hlY2tTdHJpbmdBcnJheTEsIHJocy5jaGVja1N0cmluZ0FycmF5MiwgcmhzLmludDMyX21pbiwgcmhzLmludDMyX21heCwgcmhzLmludDY0X21heCwgcmhzLmhleEludDMyX25lZ18xLCByaHMuaWJpbmRlciwgcmhzLmVtcHR5LCByaHMuaW50OF8xLCByaHMuaW50MzJfMSwgcmhzLmludDY0XzEsIHJocy5oZXhJbnQzMl9wb3NfMSwgcmhzLmhleEludDY0X3Bvc18xLCByaHMuY29uc3RfZXhwcnNfMSwgcmhzLmNvbnN0X2V4cHJzXzIsIHJocy5jb25zdF9leHByc18zLCByaHMuY29uc3RfZXhwcnNfNCwgcmhzLmNvbnN0X2V4cHJzXzUsIHJocy5jb25zdF9leHByc182LCByaHMuY29uc3RfZXhwcnNfNywgcmhzLmNvbnN0X2V4cHJzXzgsIHJocy5jb25zdF9leHByc185LCByaHMuY29uc3RfZXhwcnNfMTAsIHJocy5hZGRTdHJpbmcxLCByaHMuYWRkU3RyaW5nMiwgcmhzLnNob3VsZFNldEJpdDBBbmRCaXQyLCByaHMudSwgcmhzLnNob3VsZEJlQ29uc3RTMSwgcmhzLmRlZmF1bHRXaXRoRm9vKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFN0cnVjdHVyZWRQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoc2hvdWxkQ29udGFpblRocmVlRnMsIGYsIHNob3VsZEJlSmVycnksIHNob3VsZEJlQnl0ZUJhciwgc2hvdWxkQmVJbnRCYXIsIHNob3VsZEJlTG9uZ0Jhciwgc2hvdWxkQ29udGFpblR3b0J5dGVGb29zLCBzaG91bGRDb250YWluVHdvSW50Rm9vcywgc2hvdWxkQ29udGFpblR3b0xvbmdGb29zLCBzdHJpbmdEZWZhdWx0c1RvRm9vLCBieXRlRGVmYXVsdHNUb0ZvdXIsIGludERlZmF1bHRzVG9GaXZlLCBsb25nRGVmYXVsdHNUb05lZ2F0aXZlU2V2ZW4sIGJvb2xlYW5EZWZhdWx0c1RvVHJ1ZSwgY2hhckRlZmF1bHRzVG9DLCBmbG9hdERlZmF1bHRzVG9QaSwgZG91YmxlV2l0aERlZmF1bHQsIGFycmF5RGVmYXVsdHNUbzEyMywgYXJyYXlEZWZhdWx0c1RvRW1wdHksIGJvb2xEZWZhdWx0LCBieXRlRGVmYXVsdCwgaW50RGVmYXVsdCwgbG9uZ0RlZmF1bHQsIGZsb2F0RGVmYXVsdCwgZG91YmxlRGVmYXVsdCwgY2hlY2tEb3VibGVGcm9tRmxvYXQsIGNoZWNrU3RyaW5nQXJyYXkxLCBjaGVja1N0cmluZ0FycmF5MiwgaW50MzJfbWluLCBpbnQzMl9tYXgsIGludDY0X21heCwgaGV4SW50MzJfbmVnXzEsIGliaW5kZXIsIGVtcHR5LCBpbnQ4XzEsIGludDMyXzEsIGludDY0XzEsIGhleEludDMyX3Bvc18xLCBoZXhJbnQ2NF9wb3NfMSwgY29uc3RfZXhwcnNfMSwgY29uc3RfZXhwcnNfMiwgY29uc3RfZXhwcnNfMywgY29uc3RfZXhwcnNfNCwgY29uc3RfZXhwcnNfNSwgY29uc3RfZXhwcnNfNiwgY29uc3RfZXhwcnNfNywgY29uc3RfZXhwcnNfOCwgY29uc3RfZXhwcnNfOSwgY29uc3RfZXhwcnNfMTAsIGFkZFN0cmluZzEsIGFkZFN0cmluZzIsIHNob3VsZFNldEJpdDBBbmRCaXQyLCB1LCBzaG91bGRCZUNvbnN0UzEsIGRlZmF1bHRXaXRoRm9vKSA9PSBzdGQ6OnRpZShyaHMuc2hvdWxkQ29udGFpblRocmVlRnMsIHJocy5mLCByaHMuc2hvdWxkQmVKZXJyeSwgcmhzLnNob3VsZEJlQnl0ZUJhciwgcmhzLnNob3VsZEJlSW50QmFyLCByaHMuc2hvdWxkQmVMb25nQmFyLCByaHMuc2hvdWxkQ29udGFpblR3b0J5dGVGb29zLCByaHMuc2hvdWxkQ29udGFpblR3b0ludEZvb3MsIHJocy5zaG91bGRDb250YWluVHdvTG9uZ0Zvb3MsIHJocy5zdHJpbmdEZWZhdWx0c1RvRm9vLCByaHMuYnl0ZURlZmF1bHRzVG9Gb3VyLCByaHMuaW50RGVmYXVsdHNUb0ZpdmUsIHJocy5sb25nRGVmYXVsdHNUb05lZ2F0aXZlU2V2ZW4sIHJocy5ib29sZWFuRGVmYXVsdHNUb1RydWUsIHJocy5jaGFyRGVmYXVsdHNUb0MsIHJocy5mbG9hdERlZmF1bHRzVG9QaSwgcmhzLmRvdWJsZVdpdGhEZWZhdWx0LCByaHMuYXJyYXlEZWZhdWx0c1RvMTIzLCByaHMuYXJyYXlEZWZhdWx0c1RvRW1wdHksIHJocy5ib29sRGVmYXVsdCwgcmhzLmJ5dGVEZWZhdWx0LCByaHMuaW50RGVmYXVsdCwgcmhzLmxvbmdEZWZhdWx0LCByaHMuZmxvYXREZWZhdWx0LCByaHMuZG91YmxlRGVmYXVsdCwgcmhzLmNoZWNrRG91YmxlRnJvbUZsb2F0LCByaHMuY2hlY2tTdHJpbmdBcnJheTEsIHJocy5jaGVja1N0cmluZ0FycmF5MiwgcmhzLmludDMyX21pbiwgcmhzLmludDMyX21heCwgcmhzLmludDY0X21heCwgcmhzLmhleEludDMyX25lZ18xLCByaHMuaWJpbmRlciwgcmhzLmVtcHR5LCByaHMuaW50OF8xLCByaHMuaW50MzJfMSwgcmhzLmludDY0XzEsIHJocy5oZXhJbnQzMl9wb3NfMSwgcmhzLmhleEludDY0X3Bvc18xLCByaHMuY29uc3RfZXhwcnNfMSwgcmhzLmNvbnN0X2V4cHJzXzIsIHJocy5jb25zdF9leHByc18zLCByaHMuY29uc3RfZXhwcnNfNCwgcmhzLmNvbnN0X2V4cHJzXzUsIHJocy5jb25zdF9leHByc182LCByaHMuY29uc3RfZXhwcnNfNywgcmhzLmNvbnN0X2V4cHJzXzgsIHJocy5jb25zdF9leHByc185LCByaHMuY29uc3RfZXhwcnNfMTAsIHJocy5hZGRTdHJpbmcxLCByaHMuYWRkU3RyaW5nMiwgcmhzLnNob3VsZFNldEJpdDBBbmRCaXQyLCByaHMudSwgcmhzLnNob3VsZEJlQ29uc3RTMSwgcmhzLmRlZmF1bHRXaXRoRm9vKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgU3RydWN0dXJlZFBhcmNlbGFibGUmIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZShzaG91bGRDb250YWluVGhyZWVGcywgZiwgc2hvdWxkQmVKZXJyeSwgc2hvdWxkQmVCeXRlQmFyLCBzaG91bGRCZUludEJhciwgc2hvdWxkQmVMb25nQmFyLCBzaG91bGRDb250YWluVHdvQnl0ZUZvb3MsIHNob3VsZENvbnRhaW5Ud29JbnRGb29zLCBzaG91bGRDb250YWluVHdvTG9uZ0Zvb3MsIHN0cmluZ0RlZmF1bHRzVG9Gb28sIGJ5dGVEZWZhdWx0c1RvRm91ciwgaW50RGVmYXVsdHNUb0ZpdmUsIGxvbmdEZWZhdWx0c1RvTmVnYXRpdmVTZXZlbiwgYm9vbGVhbkRlZmF1bHRzVG9UcnVlLCBjaGFyRGVmYXVsdHNUb0MsIGZsb2F0RGVmYXVsdHNUb1BpLCBkb3VibGVXaXRoRGVmYXVsdCwgYXJyYXlEZWZhdWx0c1RvMTIzLCBhcnJheURlZmF1bHRzVG9FbXB0eSwgYm9vbERlZmF1bHQsIGJ5dGVEZWZhdWx0LCBpbnREZWZhdWx0LCBsb25nRGVmYXVsdCwgZmxvYXREZWZhdWx0LCBkb3VibGVEZWZhdWx0LCBjaGVja0RvdWJsZUZyb21GbG9hdCwgY2hlY2tTdHJpbmdBcnJheTEsIGNoZWNrU3RyaW5nQXJyYXkyLCBpbnQzMl9taW4sIGludDMyX21heCwgaW50NjRfbWF4LCBoZXhJbnQzMl9uZWdfMSwgaWJpbmRlciwgZW1wdHksIGludDhfMSwgaW50MzJfMSwgaW50NjRfMSwgaGV4SW50MzJfcG9zXzEsIGhleEludDY0X3Bvc18xLCBjb25zdF9leHByc18xLCBjb25zdF9leHByc18yLCBjb25zdF9leHByc18zLCBjb25zdF9leHByc180LCBjb25zdF9leHByc181LCBjb25zdF9leHByc182LCBjb25zdF9leHByc183LCBjb25zdF9leHByc184LCBjb25zdF9leHByc185LCBjb25zdF9leHByc18xMCwgYWRkU3RyaW5nMSwgYWRkU3RyaW5nMiwgc2hvdWxkU2V0Qml0MEFuZEJpdDIsIHUsIHNob3VsZEJlQ29uc3RTMSwgZGVmYXVsdFdpdGhGb28pID4gc3RkOjp0aWUocmhzLnNob3VsZENvbnRhaW5UaHJlZUZzLCByaHMuZiwgcmhzLnNob3VsZEJlSmVycnksIHJocy5zaG91bGRCZUJ5dGVCYXIsIHJocy5zaG91bGRCZUludEJhciwgcmhzLnNob3VsZEJlTG9uZ0JhciwgcmhzLnNob3VsZENvbnRhaW5Ud29CeXRlRm9vcywgcmhzLnNob3VsZENvbnRhaW5Ud29JbnRGb29zLCByaHMuc2hvdWxkQ29udGFpblR3b0xvbmdGb29zLCByaHMuc3RyaW5nRGVmYXVsdHNUb0ZvbywgcmhzLmJ5dGVEZWZhdWx0c1RvRm91ciwgcmhzLmludERlZmF1bHRzVG9GaXZlLCByaHMubG9uZ0RlZmF1bHRzVG9OZWdhdGl2ZVNldmVuLCByaHMuYm9vbGVhbkRlZmF1bHRzVG9UcnVlLCByaHMuY2hhckRlZmF1bHRzVG9DLCByaHMuZmxvYXREZWZhdWx0c1RvUGksIHJocy5kb3VibGVXaXRoRGVmYXVsdCwgcmhzLmFycmF5RGVmYXVsdHNUbzEyMywgcmhzLmFycmF5RGVmYXVsdHNUb0VtcHR5LCByaHMuYm9vbERlZmF1bHQsIHJocy5ieXRlRGVmYXVsdCwgcmhzLmludERlZmF1bHQsIHJocy5sb25nRGVmYXVsdCwgcmhzLmZsb2F0RGVmYXVsdCwgcmhzLmRvdWJsZURlZmF1bHQsIHJocy5jaGVja0RvdWJsZUZyb21GbG9hdCwgcmhzLmNoZWNrU3RyaW5nQXJyYXkxLCByaHMuY2hlY2tTdHJpbmdBcnJheTIsIHJocy5pbnQzMl9taW4sIHJocy5pbnQzMl9tYXgsIHJocy5pbnQ2NF9tYXgsIHJocy5oZXhJbnQzMl9uZWdfMSwgcmhzLmliaW5kZXIsIHJocy5lbXB0eSwgcmhzLmludDhfMSwgcmhzLmludDMyXzEsIHJocy5pbnQ2NF8xLCByaHMuaGV4SW50MzJfcG9zXzEsIHJocy5oZXhJbnQ2NF9wb3NfMSwgcmhzLmNvbnN0X2V4cHJzXzEsIHJocy5jb25zdF9leHByc18yLCByaHMuY29uc3RfZXhwcnNfMywgcmhzLmNvbnN0X2V4cHJzXzQsIHJocy5jb25zdF9leHByc181LCByaHMuY29uc3RfZXhwcnNfNiwgcmhzLmNvbnN0X2V4cHJzXzcsIHJocy5jb25zdF9leHByc184LCByaHMuY29uc3RfZXhwcnNfOSwgcmhzLmNvbnN0X2V4cHJzXzEwLCByaHMuYWRkU3RyaW5nMSwgcmhzLmFkZFN0cmluZzIsIHJocy5zaG91bGRTZXRCaXQwQW5kQml0MiwgcmhzLnUsIHJocy5zaG91bGRCZUNvbnN0UzEsIHJocy5kZWZhdWx0V2l0aEZvbyk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBTdHJ1Y3R1cmVkUGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKHNob3VsZENvbnRhaW5UaHJlZUZzLCBmLCBzaG91bGRCZUplcnJ5LCBzaG91bGRCZUJ5dGVCYXIsIHNob3VsZEJlSW50QmFyLCBzaG91bGRCZUxvbmdCYXIsIHNob3VsZENvbnRhaW5Ud29CeXRlRm9vcywgc2hvdWxkQ29udGFpblR3b0ludEZvb3MsIHNob3VsZENvbnRhaW5Ud29Mb25nRm9vcywgc3RyaW5nRGVmYXVsdHNUb0ZvbywgYnl0ZURlZmF1bHRzVG9Gb3VyLCBpbnREZWZhdWx0c1RvRml2ZSwgbG9uZ0RlZmF1bHRzVG9OZWdhdGl2ZVNldmVuLCBib29sZWFuRGVmYXVsdHNUb1RydWUsIGNoYXJEZWZhdWx0c1RvQywgZmxvYXREZWZhdWx0c1RvUGksIGRvdWJsZVdpdGhEZWZhdWx0LCBhcnJheURlZmF1bHRzVG8xMjMsIGFycmF5RGVmYXVsdHNUb0VtcHR5LCBib29sRGVmYXVsdCwgYnl0ZURlZmF1bHQsIGludERlZmF1bHQsIGxvbmdEZWZhdWx0LCBmbG9hdERlZmF1bHQsIGRvdWJsZURlZmF1bHQsIGNoZWNrRG91YmxlRnJvbUZsb2F0LCBjaGVja1N0cmluZ0FycmF5MSwgY2hlY2tTdHJpbmdBcnJheTIsIGludDMyX21pbiwgaW50MzJfbWF4LCBpbnQ2NF9tYXgsIGhleEludDMyX25lZ18xLCBpYmluZGVyLCBlbXB0eSwgaW50OF8xLCBpbnQzMl8xLCBpbnQ2NF8xLCBoZXhJbnQzMl9wb3NfMSwgaGV4SW50NjRfcG9zXzEsIGNvbnN0X2V4cHJzXzEsIGNvbnN0X2V4cHJzXzIsIGNvbnN0X2V4cHJzXzMsIGNvbnN0X2V4cHJzXzQsIGNvbnN0X2V4cHJzXzUsIGNvbnN0X2V4cHJzXzYsIGNvbnN0X2V4cHJzXzcsIGNvbnN0X2V4cHJzXzgsIGNvbnN0X2V4cHJzXzksIGNvbnN0X2V4cHJzXzEwLCBhZGRTdHJpbmcxLCBhZGRTdHJpbmcyLCBzaG91bGRTZXRCaXQwQW5kQml0MiwgdSwgc2hvdWxkQmVDb25zdFMxLCBkZWZhdWx0V2l0aEZvbykgPj0gc3RkOjp0aWUocmhzLnNob3VsZENvbnRhaW5UaHJlZUZzLCByaHMuZiwgcmhzLnNob3VsZEJlSmVycnksIHJocy5zaG91bGRCZUJ5dGVCYXIsIHJocy5zaG91bGRCZUludEJhciwgcmhzLnNob3VsZEJlTG9uZ0JhciwgcmhzLnNob3VsZENvbnRhaW5Ud29CeXRlRm9vcywgcmhzLnNob3VsZENvbnRhaW5Ud29JbnRGb29zLCByaHMuc2hvdWxkQ29udGFpblR3b0xvbmdGb29zLCByaHMuc3RyaW5nRGVmYXVsdHNUb0ZvbywgcmhzLmJ5dGVEZWZhdWx0c1RvRm91ciwgcmhzLmludERlZmF1bHRzVG9GaXZlLCByaHMubG9uZ0RlZmF1bHRzVG9OZWdhdGl2ZVNldmVuLCByaHMuYm9vbGVhbkRlZmF1bHRzVG9UcnVlLCByaHMuY2hhckRlZmF1bHRzVG9DLCByaHMuZmxvYXREZWZhdWx0c1RvUGksIHJocy5kb3VibGVXaXRoRGVmYXVsdCwgcmhzLmFycmF5RGVmYXVsdHNUbzEyMywgcmhzLmFycmF5RGVmYXVsdHNUb0VtcHR5LCByaHMuYm9vbERlZmF1bHQsIHJocy5ieXRlRGVmYXVsdCwgcmhzLmludERlZmF1bHQsIHJocy5sb25nRGVmYXVsdCwgcmhzLmZsb2F0RGVmYXVsdCwgcmhzLmRvdWJsZURlZmF1bHQsIHJocy5jaGVja0RvdWJsZUZyb21GbG9hdCwgcmhzLmNoZWNrU3RyaW5nQXJyYXkxLCByaHMuY2hlY2tTdHJpbmdBcnJheTIsIHJocy5pbnQzMl9taW4sIHJocy5pbnQzMl9tYXgsIHJocy5pbnQ2NF9tYXgsIHJocy5oZXhJbnQzMl9uZWdfMSwgcmhzLmliaW5kZXIsIHJocy5lbXB0eSwgcmhzLmludDhfMSwgcmhzLmludDMyXzEsIHJocy5pbnQ2NF8xLCByaHMuaGV4SW50MzJfcG9zXzEsIHJocy5oZXhJbnQ2NF9wb3NfMSwgcmhzLmNvbnN0X2V4cHJzXzEsIHJocy5jb25zdF9leHByc18yLCByaHMuY29uc3RfZXhwcnNfMywgcmhzLmNvbnN0X2V4cHJzXzQsIHJocy5jb25zdF9leHByc181LCByaHMuY29uc3RfZXhwcnNfNiwgcmhzLmNvbnN0X2V4cHJzXzcsIHJocy5jb25zdF9leHByc184LCByaHMuY29uc3RfZXhwcnNfOSwgcmhzLmNvbnN0X2V4cHJzXzEwLCByaHMuYWRkU3RyaW5nMSwgcmhzLmFkZFN0cmluZzIsIHJocy5zaG91bGRTZXRCaXQwQW5kQml0MiwgcmhzLnUsIHJocy5zaG91bGRCZUNvbnN0UzEsIHJocy5kZWZhdWx0V2l0aEZvbyk7CisgIH0KKworICBzdGF0aWMgY29uc3QgOjpuZGs6OnBhcmNlbGFibGVfc3RhYmlsaXR5X3QgX2FpZGxfc3RhYmlsaXR5ID0gOjpuZGs6OlNUQUJJTElUWV9MT0NBTDsKKyAgZW51bSA6IGludDMyX3QgeyBCSVQwID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEJJVDEgPSAyIH07CisgIGVudW0gOiBpbnQzMl90IHsgQklUMiA9IDQgfTsKKyAgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvczsKKyAgICBvcyA8PCAiU3RydWN0dXJlZFBhcmNlbGFibGV7IjsKKyAgICBvcyA8PCAic2hvdWxkQ29udGFpblRocmVlRnM6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoc2hvdWxkQ29udGFpblRocmVlRnMpOworICAgIG9zIDw8ICIsIGY6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoZik7CisgICAgb3MgPDwgIiwgc2hvdWxkQmVKZXJyeTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhzaG91bGRCZUplcnJ5KTsKKyAgICBvcyA8PCAiLCBzaG91bGRCZUJ5dGVCYXI6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoc2hvdWxkQmVCeXRlQmFyKTsKKyAgICBvcyA8PCAiLCBzaG91bGRCZUludEJhcjogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhzaG91bGRCZUludEJhcik7CisgICAgb3MgPDwgIiwgc2hvdWxkQmVMb25nQmFyOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKHNob3VsZEJlTG9uZ0Jhcik7CisgICAgb3MgPDwgIiwgc2hvdWxkQ29udGFpblR3b0J5dGVGb29zOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKHNob3VsZENvbnRhaW5Ud29CeXRlRm9vcyk7CisgICAgb3MgPDwgIiwgc2hvdWxkQ29udGFpblR3b0ludEZvb3M6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoc2hvdWxkQ29udGFpblR3b0ludEZvb3MpOworICAgIG9zIDw8ICIsIHNob3VsZENvbnRhaW5Ud29Mb25nRm9vczogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhzaG91bGRDb250YWluVHdvTG9uZ0Zvb3MpOworICAgIG9zIDw8ICIsIHN0cmluZ0RlZmF1bHRzVG9Gb286ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoc3RyaW5nRGVmYXVsdHNUb0Zvbyk7CisgICAgb3MgPDwgIiwgYnl0ZURlZmF1bHRzVG9Gb3VyOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGJ5dGVEZWZhdWx0c1RvRm91cik7CisgICAgb3MgPDwgIiwgaW50RGVmYXVsdHNUb0ZpdmU6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaW50RGVmYXVsdHNUb0ZpdmUpOworICAgIG9zIDw8ICIsIGxvbmdEZWZhdWx0c1RvTmVnYXRpdmVTZXZlbjogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhsb25nRGVmYXVsdHNUb05lZ2F0aXZlU2V2ZW4pOworICAgIG9zIDw8ICIsIGJvb2xlYW5EZWZhdWx0c1RvVHJ1ZTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhib29sZWFuRGVmYXVsdHNUb1RydWUpOworICAgIG9zIDw8ICIsIGNoYXJEZWZhdWx0c1RvQzogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhjaGFyRGVmYXVsdHNUb0MpOworICAgIG9zIDw8ICIsIGZsb2F0RGVmYXVsdHNUb1BpOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGZsb2F0RGVmYXVsdHNUb1BpKTsKKyAgICBvcyA8PCAiLCBkb3VibGVXaXRoRGVmYXVsdDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhkb3VibGVXaXRoRGVmYXVsdCk7CisgICAgb3MgPDwgIiwgYXJyYXlEZWZhdWx0c1RvMTIzOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGFycmF5RGVmYXVsdHNUbzEyMyk7CisgICAgb3MgPDwgIiwgYXJyYXlEZWZhdWx0c1RvRW1wdHk6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoYXJyYXlEZWZhdWx0c1RvRW1wdHkpOworICAgIG9zIDw8ICIsIGJvb2xEZWZhdWx0OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGJvb2xEZWZhdWx0KTsKKyAgICBvcyA8PCAiLCBieXRlRGVmYXVsdDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhieXRlRGVmYXVsdCk7CisgICAgb3MgPDwgIiwgaW50RGVmYXVsdDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbnREZWZhdWx0KTsKKyAgICBvcyA8PCAiLCBsb25nRGVmYXVsdDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhsb25nRGVmYXVsdCk7CisgICAgb3MgPDwgIiwgZmxvYXREZWZhdWx0OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGZsb2F0RGVmYXVsdCk7CisgICAgb3MgPDwgIiwgZG91YmxlRGVmYXVsdDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhkb3VibGVEZWZhdWx0KTsKKyAgICBvcyA8PCAiLCBjaGVja0RvdWJsZUZyb21GbG9hdDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhjaGVja0RvdWJsZUZyb21GbG9hdCk7CisgICAgb3MgPDwgIiwgY2hlY2tTdHJpbmdBcnJheTE6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoY2hlY2tTdHJpbmdBcnJheTEpOworICAgIG9zIDw8ICIsIGNoZWNrU3RyaW5nQXJyYXkyOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGNoZWNrU3RyaW5nQXJyYXkyKTsKKyAgICBvcyA8PCAiLCBpbnQzMl9taW46ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaW50MzJfbWluKTsKKyAgICBvcyA8PCAiLCBpbnQzMl9tYXg6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaW50MzJfbWF4KTsKKyAgICBvcyA8PCAiLCBpbnQ2NF9tYXg6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaW50NjRfbWF4KTsKKyAgICBvcyA8PCAiLCBoZXhJbnQzMl9uZWdfMTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhoZXhJbnQzMl9uZWdfMSk7CisgICAgb3MgPDwgIiwgaWJpbmRlcjogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpYmluZGVyKTsKKyAgICBvcyA8PCAiLCBlbXB0eTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhlbXB0eSk7CisgICAgb3MgPDwgIiwgaW50OF8xOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGludDhfMSk7CisgICAgb3MgPDwgIiwgaW50MzJfMTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbnQzMl8xKTsKKyAgICBvcyA8PCAiLCBpbnQ2NF8xOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGludDY0XzEpOworICAgIG9zIDw8ICIsIGhleEludDMyX3Bvc18xOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGhleEludDMyX3Bvc18xKTsKKyAgICBvcyA8PCAiLCBoZXhJbnQ2NF9wb3NfMTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhoZXhJbnQ2NF9wb3NfMSk7CisgICAgb3MgPDwgIiwgY29uc3RfZXhwcnNfMTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhjb25zdF9leHByc18xKTsKKyAgICBvcyA8PCAiLCBjb25zdF9leHByc18yOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGNvbnN0X2V4cHJzXzIpOworICAgIG9zIDw8ICIsIGNvbnN0X2V4cHJzXzM6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoY29uc3RfZXhwcnNfMyk7CisgICAgb3MgPDwgIiwgY29uc3RfZXhwcnNfNDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhjb25zdF9leHByc180KTsKKyAgICBvcyA8PCAiLCBjb25zdF9leHByc181OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGNvbnN0X2V4cHJzXzUpOworICAgIG9zIDw8ICIsIGNvbnN0X2V4cHJzXzY6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoY29uc3RfZXhwcnNfNik7CisgICAgb3MgPDwgIiwgY29uc3RfZXhwcnNfNzogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhjb25zdF9leHByc183KTsKKyAgICBvcyA8PCAiLCBjb25zdF9leHByc184OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGNvbnN0X2V4cHJzXzgpOworICAgIG9zIDw8ICIsIGNvbnN0X2V4cHJzXzk6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoY29uc3RfZXhwcnNfOSk7CisgICAgb3MgPDwgIiwgY29uc3RfZXhwcnNfMTA6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoY29uc3RfZXhwcnNfMTApOworICAgIG9zIDw8ICIsIGFkZFN0cmluZzE6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoYWRkU3RyaW5nMSk7CisgICAgb3MgPDwgIiwgYWRkU3RyaW5nMjogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhhZGRTdHJpbmcyKTsKKyAgICBvcyA8PCAiLCBzaG91bGRTZXRCaXQwQW5kQml0MjogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhzaG91bGRTZXRCaXQwQW5kQml0Mik7CisgICAgb3MgPDwgIiwgdTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyh1KTsKKyAgICBvcyA8PCAiLCBzaG91bGRCZUNvbnN0UzE6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoc2hvdWxkQmVDb25zdFMxKTsKKyAgICBvcyA8PCAiLCBkZWZhdWx0V2l0aEZvbzogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhkZWZhdWx0V2l0aEZvbyk7CisgICAgb3MgPDwgIn0iOworICAgIHJldHVybiBvcy5zdHIoKTsKKyAgfQorfTsKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb24uaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL1VuaW9uLmgKc2ltaWxhcml0eSBpbmRleCA2MSUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb24uaApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb24uaAppbmRleCBiOTBmNmM0Li5hOTRkMDNmIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9Vbmlvbi5oCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL1VuaW9uLmgKQEAgLTEsMjEgKzEsMjMgQEAKICNwcmFnbWEgb25jZQotI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2ludGVyZmFjZV91dGlscy5oPgotI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3BhcmNlbGFibGVfdXRpbHMuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl90b19zdHJpbmcuaD4KIAorI2luY2x1ZGUgPGFycmF5PgogI2luY2x1ZGUgPGNhc3NlcnQ+Ci0jaW5jbHVkZSA8dHlwZV90cmFpdHM+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLSNpbmNsdWRlIDx2YXJpYW50PgogI2luY2x1ZGUgPGNzdGRpbnQ+CiAjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPG9wdGlvbmFsPgogI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZhcmlhbnQ+CiAjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2VudW1zLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaW50ZXJmYWNlX3V0aWxzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcGFyY2VsYWJsZV91dGlscy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3RvX3N0cmluZy5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0J5dGVFbnVtLmg+CiAjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCiAjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfc3RhYmlsaXR5Lmg+CiAjZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAotI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0J5dGVFbnVtLmg+CiAKICNpZm5kZWYgX19CSU9OSUNfXwogI2RlZmluZSBfX2Fzc2VydDIoYSxiLGMsZCkgKCh2b2lkKTApCkBAIC0zMCwyNCArMzIsMjkgQEAKICAgdHlwZWRlZiBzdGQ6OmZhbHNlX3R5cGUgZml4ZWRfc2l6ZTsKICAgc3RhdGljIGNvbnN0IGNoYXIqIGRlc2NyaXB0b3I7CiAKLSAgZW51bSBUYWcgOiBpbnQzMl90IHsKLSAgICBucyA9IDAsICAvLyBpbnRbXSBuczsKLSAgICBuLCAgLy8gaW50IG47Ci0gICAgbSwgIC8vIGludCBtOwotICAgIHMsICAvLyBTdHJpbmcgczsKLSAgICBpYmluZGVyLCAgLy8gSUJpbmRlciBpYmluZGVyOwotICAgIHNzLCAgLy8gTGlzdDxTdHJpbmc+IHNzOwotICAgIGJlLCAgLy8gYW5kcm9pZC5haWRsLnRlc3RzLkJ5dGVFbnVtIGJlOworICBlbnVtIGNsYXNzIFRhZyA6IGludDMyX3QgeworICAgIG5zID0gMCwKKyAgICBuID0gMSwKKyAgICBtID0gMiwKKyAgICBzID0gMywKKyAgICBpYmluZGVyID0gNCwKKyAgICBzcyA9IDUsCisgICAgYmUgPSA2LAogICB9OwogCisgIC8vIEV4cG9zZSB0YWcgc3ltYm9scyBmb3IgbGVnYWN5IGNvZGUKKyAgc3RhdGljIGNvbnN0IGlubGluZSBUYWcgbnMgPSBUYWc6Om5zOworICBzdGF0aWMgY29uc3QgaW5saW5lIFRhZyBuID0gVGFnOjpuOworICBzdGF0aWMgY29uc3QgaW5saW5lIFRhZyBtID0gVGFnOjptOworICBzdGF0aWMgY29uc3QgaW5saW5lIFRhZyBzID0gVGFnOjpzOworICBzdGF0aWMgY29uc3QgaW5saW5lIFRhZyBpYmluZGVyID0gVGFnOjppYmluZGVyOworICBzdGF0aWMgY29uc3QgaW5saW5lIFRhZyBzcyA9IFRhZzo6c3M7CisgIHN0YXRpYyBjb25zdCBpbmxpbmUgVGFnIGJlID0gVGFnOjpiZTsKKwogICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CiAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBfbm90X3NlbGYgPSAhc3RkOjppc19zYW1lX3Y8c3RkOjpyZW1vdmVfY3ZfdDxzdGQ6OnJlbW92ZV9yZWZlcmVuY2VfdDxfVHA+PiwgVW5pb24+OwogCi0gIFVuaW9uKCkgOiBfdmFsdWUoc3RkOjppbl9wbGFjZV9pbmRleDxucz4sIHN0ZDo6dmVjdG9yPGludDMyX3Q+KHt9KSkgeyB9Ci0gIFVuaW9uKGNvbnN0IFVuaW9uJikgPSBkZWZhdWx0OwotICBVbmlvbihVbmlvbiYmKSA9IGRlZmF1bHQ7Ci0gIFVuaW9uJiBvcGVyYXRvcj0oY29uc3QgVW5pb24mKSA9IGRlZmF1bHQ7Ci0gIFVuaW9uJiBvcGVyYXRvcj0oVW5pb24mJikgPSBkZWZhdWx0OworICBVbmlvbigpIDogX3ZhbHVlKHN0ZDo6aW5fcGxhY2VfaW5kZXg8c3RhdGljX2Nhc3Q8c2l6ZV90Pihucyk+LCBzdGQ6OnZlY3RvcjxpbnQzMl90Pih7fSkpIHsgfQogCiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lID0gc3RkOjplbmFibGVfaWZfdDxfbm90X3NlbGY8X1RwPj4+CiAgIC8vIE5PTElOVE5FWFRMSU5FKGdvb2dsZS1leHBsaWNpdC1jb25zdHJ1Y3RvcikKQEAgLTYwLDEyICs2NywxMiBAQAogCiAgIHRlbXBsYXRlIDxUYWcgX3RhZywgdHlwZW5hbWUuLi4gX1RwPgogICBzdGF0aWMgVW5pb24gbWFrZShfVHAmJi4uLiBfYXJncykgewotICAgIHJldHVybiBVbmlvbihzdGQ6OmluX3BsYWNlX2luZGV4PF90YWc+LCBzdGQ6OmZvcndhcmQ8X1RwPihfYXJncykuLi4pOworICAgIHJldHVybiBVbmlvbihzdGQ6OmluX3BsYWNlX2luZGV4PHN0YXRpY19jYXN0PHNpemVfdD4oX3RhZyk+LCBzdGQ6OmZvcndhcmQ8X1RwPihfYXJncykuLi4pOwogICB9CiAKICAgdGVtcGxhdGUgPFRhZyBfdGFnLCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lLi4uIF9VcD4KICAgc3RhdGljIFVuaW9uIG1ha2Uoc3RkOjppbml0aWFsaXplcl9saXN0PF9UcD4gX2lsLCBfVXAmJi4uLiBfYXJncykgewotICAgIHJldHVybiBVbmlvbihzdGQ6OmluX3BsYWNlX2luZGV4PF90YWc+LCBzdGQ6Om1vdmUoX2lsKSwgc3RkOjpmb3J3YXJkPF9VcD4oX2FyZ3MpLi4uKTsKKyAgICByZXR1cm4gVW5pb24oc3RkOjppbl9wbGFjZV9pbmRleDxzdGF0aWNfY2FzdDxzaXplX3Q+KF90YWcpPiwgc3RkOjptb3ZlKF9pbCksIHN0ZDo6Zm9yd2FyZDxfVXA+KF9hcmdzKS4uLik7CiAgIH0KIAogICBUYWcgZ2V0VGFnKCkgY29uc3QgewpAQCAtNzUsMTggKzgyLDE4IEBACiAgIHRlbXBsYXRlIDxUYWcgX3RhZz4KICAgY29uc3QgYXV0byYgZ2V0KCkgY29uc3QgewogICAgIGlmIChnZXRUYWcoKSAhPSBfdGFnKSB7IF9fYXNzZXJ0MihfX0ZJTEVfXywgX19MSU5FX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18sICJiYWQgYWNjZXNzOiBhIHdyb25nIHRhZyIpOyB9Ci0gICAgcmV0dXJuIHN0ZDo6Z2V0PF90YWc+KF92YWx1ZSk7CisgICAgcmV0dXJuIHN0ZDo6Z2V0PHN0YXRpY19jYXN0PHNpemVfdD4oX3RhZyk+KF92YWx1ZSk7CiAgIH0KIAogICB0ZW1wbGF0ZSA8VGFnIF90YWc+CiAgIGF1dG8mIGdldCgpIHsKICAgICBpZiAoZ2V0VGFnKCkgIT0gX3RhZykgeyBfX2Fzc2VydDIoX19GSUxFX18sIF9fTElORV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fLCAiYmFkIGFjY2VzczogYSB3cm9uZyB0YWciKTsgfQotICAgIHJldHVybiBzdGQ6OmdldDxfdGFnPihfdmFsdWUpOworICAgIHJldHVybiBzdGQ6OmdldDxzdGF0aWNfY2FzdDxzaXplX3Q+KF90YWcpPihfdmFsdWUpOwogICB9CiAKICAgdGVtcGxhdGUgPFRhZyBfdGFnLCB0eXBlbmFtZS4uLiBfVHA+CiAgIHZvaWQgc2V0KF9UcCYmLi4uIF9hcmdzKSB7Ci0gICAgX3ZhbHVlLmVtcGxhY2U8X3RhZz4oc3RkOjpmb3J3YXJkPF9UcD4oX2FyZ3MpLi4uKTsKKyAgICBfdmFsdWUuZW1wbGFjZTxzdGF0aWNfY2FzdDxzaXplX3Q+KF90YWcpPihzdGQ6OmZvcndhcmQ8X1RwPihfYXJncykuLi4pOwogICB9CiAKICAgYmluZGVyX3N0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIF9wYXJjZWwpOwpAQCAtMTM1LDMgKzE0Miw0OCBAQAogfSAgLy8gbmFtZXNwYWNlIGFpZGwKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAorbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK1tbbm9kaXNjYXJkXV0gc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZyhVbmlvbjo6VGFnIHZhbCkgeworICBzd2l0Y2godmFsKSB7CisgIGNhc2UgVW5pb246OlRhZzo6bnM6CisgICAgcmV0dXJuICJucyI7CisgIGNhc2UgVW5pb246OlRhZzo6bjoKKyAgICByZXR1cm4gIm4iOworICBjYXNlIFVuaW9uOjpUYWc6Om06CisgICAgcmV0dXJuICJtIjsKKyAgY2FzZSBVbmlvbjo6VGFnOjpzOgorICAgIHJldHVybiAicyI7CisgIGNhc2UgVW5pb246OlRhZzo6aWJpbmRlcjoKKyAgICByZXR1cm4gImliaW5kZXIiOworICBjYXNlIFVuaW9uOjpUYWc6OnNzOgorICAgIHJldHVybiAic3MiOworICBjYXNlIFVuaW9uOjpUYWc6OmJlOgorICAgIHJldHVybiAiYmUiOworICBkZWZhdWx0OgorICAgIHJldHVybiBzdGQ6OnRvX3N0cmluZyhzdGF0aWNfY2FzdDxpbnQzMl90Pih2YWwpKTsKKyAgfQorfQorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCituYW1lc3BhY2UgbmRrIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XYysrMTctZXh0ZW5zaW9ucyIKK3RlbXBsYXRlIDw+Citjb25zdGV4cHIgaW5saW5lIHN0ZDo6YXJyYXk8YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlVuaW9uOjpUYWcsIDc+IGVudW1fdmFsdWVzPGFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpVbmlvbjo6VGFnPiA9IHsKKyAgYWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlVuaW9uOjpUYWc6Om5zLAorICBhaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6VW5pb246OlRhZzo6biwKKyAgYWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlVuaW9uOjpUYWc6Om0sCisgIGFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpVbmlvbjo6VGFnOjpzLAorICBhaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6VW5pb246OlRhZzo6aWJpbmRlciwKKyAgYWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlVuaW9uOjpUYWc6OnNzLAorICBhaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6VW5pb246OlRhZzo6YmUsCit9OworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAorfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgbmRrCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9VbmlvbldpdGhGZC5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb25XaXRoRmQuaApzaW1pbGFyaXR5IGluZGV4IDY2JQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9VbmlvbldpdGhGZC5oCnJlbmFtZSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9VbmlvbldpdGhGZC5oCmluZGV4IDdkMDQ1ZWMuLjk4NmI1NDIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL1VuaW9uV2l0aEZkLmgKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb25XaXRoRmQuaApAQCAtMSwxNyArMSwxOSBAQAogI3ByYWdtYSBvbmNlCi0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaW50ZXJmYWNlX3V0aWxzLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcGFyY2VsYWJsZV91dGlscy5oPgotI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3RvX3N0cmluZy5oPgogCisjaW5jbHVkZSA8YXJyYXk+CiAjaW5jbHVkZSA8Y2Fzc2VydD4KLSNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KLSNpbmNsdWRlIDx1dGlsaXR5PgotI2luY2x1ZGUgPHZhcmlhbnQ+CiAjaW5jbHVkZSA8Y3N0ZGludD4KICNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8b3B0aW9uYWw+CiAjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmFyaWFudD4KICNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfZW51bXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pbnRlcmZhY2VfdXRpbHMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wYXJjZWxhYmxlX3V0aWxzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfdG9fc3RyaW5nLmg+CiAjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCiAjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfc3RhYmlsaXR5Lmg+CiAjZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVApAQCAtMjksMTkgKzMxLDE5IEBACiAgIHR5cGVkZWYgc3RkOjpmYWxzZV90eXBlIGZpeGVkX3NpemU7CiAgIHN0YXRpYyBjb25zdCBjaGFyKiBkZXNjcmlwdG9yOwogCi0gIGVudW0gVGFnIDogaW50MzJfdCB7Ci0gICAgbnVtID0gMCwgIC8vIGludCBudW07Ci0gICAgcGZkLCAgLy8gUGFyY2VsRmlsZURlc2NyaXB0b3IgcGZkOworICBlbnVtIGNsYXNzIFRhZyA6IGludDMyX3QgeworICAgIG51bSA9IDAsCisgICAgcGZkID0gMSwKICAgfTsKIAorICAvLyBFeHBvc2UgdGFnIHN5bWJvbHMgZm9yIGxlZ2FjeSBjb2RlCisgIHN0YXRpYyBjb25zdCBpbmxpbmUgVGFnIG51bSA9IFRhZzo6bnVtOworICBzdGF0aWMgY29uc3QgaW5saW5lIFRhZyBwZmQgPSBUYWc6OnBmZDsKKwogICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CiAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBfbm90X3NlbGYgPSAhc3RkOjppc19zYW1lX3Y8c3RkOjpyZW1vdmVfY3ZfdDxzdGQ6OnJlbW92ZV9yZWZlcmVuY2VfdDxfVHA+PiwgVW5pb25XaXRoRmQ+OwogCi0gIFVuaW9uV2l0aEZkKCkgOiBfdmFsdWUoc3RkOjppbl9wbGFjZV9pbmRleDxudW0+LCBpbnQzMl90KDApKSB7IH0KLSAgVW5pb25XaXRoRmQoY29uc3QgVW5pb25XaXRoRmQmKSA9IGRlZmF1bHQ7Ci0gIFVuaW9uV2l0aEZkKFVuaW9uV2l0aEZkJiYpID0gZGVmYXVsdDsKLSAgVW5pb25XaXRoRmQmIG9wZXJhdG9yPShjb25zdCBVbmlvbldpdGhGZCYpID0gZGVmYXVsdDsKLSAgVW5pb25XaXRoRmQmIG9wZXJhdG9yPShVbmlvbldpdGhGZCYmKSA9IGRlZmF1bHQ7CisgIFVuaW9uV2l0aEZkKCkgOiBfdmFsdWUoc3RkOjppbl9wbGFjZV9pbmRleDxzdGF0aWNfY2FzdDxzaXplX3Q+KG51bSk+LCBpbnQzMl90KDApKSB7IH0KIAogICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSA9IHN0ZDo6ZW5hYmxlX2lmX3Q8X25vdF9zZWxmPF9UcD4+PgogICAvLyBOT0xJTlRORVhUTElORShnb29nbGUtZXhwbGljaXQtY29uc3RydWN0b3IpCkBAIC01NCwxMiArNTYsMTIgQEAKIAogICB0ZW1wbGF0ZSA8VGFnIF90YWcsIHR5cGVuYW1lLi4uIF9UcD4KICAgc3RhdGljIFVuaW9uV2l0aEZkIG1ha2UoX1RwJiYuLi4gX2FyZ3MpIHsKLSAgICByZXR1cm4gVW5pb25XaXRoRmQoc3RkOjppbl9wbGFjZV9pbmRleDxfdGFnPiwgc3RkOjpmb3J3YXJkPF9UcD4oX2FyZ3MpLi4uKTsKKyAgICByZXR1cm4gVW5pb25XaXRoRmQoc3RkOjppbl9wbGFjZV9pbmRleDxzdGF0aWNfY2FzdDxzaXplX3Q+KF90YWcpPiwgc3RkOjpmb3J3YXJkPF9UcD4oX2FyZ3MpLi4uKTsKICAgfQogCiAgIHRlbXBsYXRlIDxUYWcgX3RhZywgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZS4uLiBfVXA+CiAgIHN0YXRpYyBVbmlvbldpdGhGZCBtYWtlKHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxfVHA+IF9pbCwgX1VwJiYuLi4gX2FyZ3MpIHsKLSAgICByZXR1cm4gVW5pb25XaXRoRmQoc3RkOjppbl9wbGFjZV9pbmRleDxfdGFnPiwgc3RkOjptb3ZlKF9pbCksIHN0ZDo6Zm9yd2FyZDxfVXA+KF9hcmdzKS4uLik7CisgICAgcmV0dXJuIFVuaW9uV2l0aEZkKHN0ZDo6aW5fcGxhY2VfaW5kZXg8c3RhdGljX2Nhc3Q8c2l6ZV90PihfdGFnKT4sIHN0ZDo6bW92ZShfaWwpLCBzdGQ6OmZvcndhcmQ8X1VwPihfYXJncykuLi4pOwogICB9CiAKICAgVGFnIGdldFRhZygpIGNvbnN0IHsKQEAgLTY5LDE4ICs3MSwxOCBAQAogICB0ZW1wbGF0ZSA8VGFnIF90YWc+CiAgIGNvbnN0IGF1dG8mIGdldCgpIGNvbnN0IHsKICAgICBpZiAoZ2V0VGFnKCkgIT0gX3RhZykgeyBfX2Fzc2VydDIoX19GSUxFX18sIF9fTElORV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fLCAiYmFkIGFjY2VzczogYSB3cm9uZyB0YWciKTsgfQotICAgIHJldHVybiBzdGQ6OmdldDxfdGFnPihfdmFsdWUpOworICAgIHJldHVybiBzdGQ6OmdldDxzdGF0aWNfY2FzdDxzaXplX3Q+KF90YWcpPihfdmFsdWUpOwogICB9CiAKICAgdGVtcGxhdGUgPFRhZyBfdGFnPgogICBhdXRvJiBnZXQoKSB7CiAgICAgaWYgKGdldFRhZygpICE9IF90YWcpIHsgX19hc3NlcnQyKF9fRklMRV9fLCBfX0xJTkVfXywgX19QUkVUVFlfRlVOQ1RJT05fXywgImJhZCBhY2Nlc3M6IGEgd3JvbmcgdGFnIik7IH0KLSAgICByZXR1cm4gc3RkOjpnZXQ8X3RhZz4oX3ZhbHVlKTsKKyAgICByZXR1cm4gc3RkOjpnZXQ8c3RhdGljX2Nhc3Q8c2l6ZV90PihfdGFnKT4oX3ZhbHVlKTsKICAgfQogCiAgIHRlbXBsYXRlIDxUYWcgX3RhZywgdHlwZW5hbWUuLi4gX1RwPgogICB2b2lkIHNldChfVHAmJi4uLiBfYXJncykgewotICAgIF92YWx1ZS5lbXBsYWNlPF90YWc+KHN0ZDo6Zm9yd2FyZDxfVHA+KF9hcmdzKS4uLik7CisgICAgX3ZhbHVlLmVtcGxhY2U8c3RhdGljX2Nhc3Q8c2l6ZV90PihfdGFnKT4oc3RkOjpmb3J3YXJkPF9UcD4oX2FyZ3MpLi4uKTsKICAgfQogCiAgIGJpbmRlcl9zdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBfcGFyY2VsKTsKQEAgLTEyMywzICsxMjUsMzMgQEAKIH0gIC8vIG5hbWVzcGFjZSBhaWRsCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogfSAgLy8gbmFtZXNwYWNlIGFpZGwKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CitbW25vZGlzY2FyZF1dIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoVW5pb25XaXRoRmQ6OlRhZyB2YWwpIHsKKyAgc3dpdGNoKHZhbCkgeworICBjYXNlIFVuaW9uV2l0aEZkOjpUYWc6Om51bToKKyAgICByZXR1cm4gIm51bSI7CisgIGNhc2UgVW5pb25XaXRoRmQ6OlRhZzo6cGZkOgorICAgIHJldHVybiAicGZkIjsKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gc3RkOjp0b19zdHJpbmcoc3RhdGljX2Nhc3Q8aW50MzJfdD4odmFsKSk7CisgIH0KK30KK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorbmFtZXNwYWNlIG5kayB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2MrKzE3LWV4dGVuc2lvbnMiCit0ZW1wbGF0ZSA8PgorY29uc3RleHByIGlubGluZSBzdGQ6OmFycmF5PGFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpVbmlvbldpdGhGZDo6VGFnLCAyPiBlbnVtX3ZhbHVlczxhaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6VW5pb25XaXRoRmQ6OlRhZz4gPSB7CisgIGFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpVbmlvbldpdGhGZDo6VGFnOjpudW0sCisgIGFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpVbmlvbldpdGhGZDo6VGFnOjpwZmQsCit9OworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAorfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgbmRrCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CbkRlcHJlY2F0ZWRQYXJjZWxhYmxlLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vQm5FeHRlbmRhYmxlUGFyY2VsYWJsZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5EZXByZWNhdGVkUGFyY2VsYWJsZS5oCmNvcHkgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0JuRXh0ZW5kYWJsZVBhcmNlbGFibGUuaApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5Vbmlvbi5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0JuTXlFeHQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuVW5pb24uaApjb3B5IHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9Cbk15RXh0LmgKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuVW5pb24uaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9Cbk15RXh0Mi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5Vbmlvbi5oCmNvcHkgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0JuTXlFeHQyLmgKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuVW5pb24uaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9Cbk15RXh0TGlrZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5Vbmlvbi5oCmNvcHkgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0JuTXlFeHRMaWtlLmgKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwRGVwcmVjYXRlZFBhcmNlbGFibGUuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9CcEV4dGVuZGFibGVQYXJjZWxhYmxlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcERlcHJlY2F0ZWRQYXJjZWxhYmxlLmgKY29weSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vQnBFeHRlbmRhYmxlUGFyY2VsYWJsZS5oCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcFVuaW9uLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vQnBNeUV4dC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBVbmlvbi5oCmNvcHkgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0JwTXlFeHQuaApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBVbmlvbi5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0JwTXlFeHQyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcFVuaW9uLmgKY29weSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vQnBNeUV4dDIuaApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBVbmlvbi5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0JwTXlFeHRMaWtlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcFVuaW9uLmgKY29weSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vQnBNeUV4dExpa2UuaApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0V4dGVuZGFibGVQYXJjZWxhYmxlLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vRXh0ZW5kYWJsZVBhcmNlbGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWZlMzZlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0V4dGVuZGFibGVQYXJjZWxhYmxlLmgKQEAgLTAsMCArMSw3MCBAQAorI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxvcHRpb25hbD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2ludGVyZmFjZV91dGlscy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3BhcmNlbGFibGVfdXRpbHMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl90b19zdHJpbmcuaD4KKyNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9zdGFiaWxpdHkuaD4KKyNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CituYW1lc3BhY2UgZXh0ZW5zaW9uIHsKK2NsYXNzIEV4dGVuZGFibGVQYXJjZWxhYmxlIHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBzdGQ6OmZhbHNlX3R5cGUgZml4ZWRfc2l6ZTsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIGRlc2NyaXB0b3I7CisKKyAgaW50MzJfdCBhID0gMDsKKyAgc3RkOjpzdHJpbmcgYjsKKyAgOjpuZGs6OkFQYXJjZWxhYmxlSG9sZGVyIGV4dHs6Om5kazo6U1RBQklMSVRZX0xPQ0FMfTsKKyAgaW50NjRfdCBjID0gMEw7CisgIDo6bmRrOjpBUGFyY2VsYWJsZUhvbGRlciBleHQyezo6bmRrOjpTVEFCSUxJVFlfTE9DQUx9OworCisgIGJpbmRlcl9zdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBwYXJjZWwpOworICBiaW5kZXJfc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChBUGFyY2VsKiBwYXJjZWwpIGNvbnN0OworCisgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgRXh0ZW5kYWJsZVBhcmNlbGFibGUmIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZShhLCBiLCBleHQsIGMsIGV4dDIpICE9IHN0ZDo6dGllKHJocy5hLCByaHMuYiwgcmhzLmV4dCwgcmhzLmMsIHJocy5leHQyKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgRXh0ZW5kYWJsZVBhcmNlbGFibGUmIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZShhLCBiLCBleHQsIGMsIGV4dDIpIDwgc3RkOjp0aWUocmhzLmEsIHJocy5iLCByaHMuZXh0LCByaHMuYywgcmhzLmV4dDIpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgRXh0ZW5kYWJsZVBhcmNlbGFibGUmIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZShhLCBiLCBleHQsIGMsIGV4dDIpIDw9IHN0ZDo6dGllKHJocy5hLCByaHMuYiwgcmhzLmV4dCwgcmhzLmMsIHJocy5leHQyKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEV4dGVuZGFibGVQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoYSwgYiwgZXh0LCBjLCBleHQyKSA9PSBzdGQ6OnRpZShyaHMuYSwgcmhzLmIsIHJocy5leHQsIHJocy5jLCByaHMuZXh0Mik7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IEV4dGVuZGFibGVQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoYSwgYiwgZXh0LCBjLCBleHQyKSA+IHN0ZDo6dGllKHJocy5hLCByaHMuYiwgcmhzLmV4dCwgcmhzLmMsIHJocy5leHQyKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IEV4dGVuZGFibGVQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoYSwgYiwgZXh0LCBjLCBleHQyKSA+PSBzdGQ6OnRpZShyaHMuYSwgcmhzLmIsIHJocy5leHQsIHJocy5jLCByaHMuZXh0Mik7CisgIH0KKworICBzdGF0aWMgY29uc3QgOjpuZGs6OnBhcmNlbGFibGVfc3RhYmlsaXR5X3QgX2FpZGxfc3RhYmlsaXR5ID0gOjpuZGs6OlNUQUJJTElUWV9MT0NBTDsKKyAgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvczsKKyAgICBvcyA8PCAiRXh0ZW5kYWJsZVBhcmNlbGFibGV7IjsKKyAgICBvcyA8PCAiYTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhhKTsKKyAgICBvcyA8PCAiLCBiOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGIpOworICAgIG9zIDw8ICIsIGV4dDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhleHQpOworICAgIG9zIDw8ICIsIGM6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoYyk7CisgICAgb3MgPDwgIiwgZXh0MjogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhleHQyKTsKKyAgICBvcyA8PCAifSI7CisgICAgcmV0dXJuIG9zLnN0cigpOworICB9Cit9OworfSAgLy8gbmFtZXNwYWNlIGV4dGVuc2lvbgorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwZDM5ZjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQuaApAQCAtMCwwICsxLDY0IEBACisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG9wdGlvbmFsPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaW50ZXJmYWNlX3V0aWxzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcGFyY2VsYWJsZV91dGlscy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3RvX3N0cmluZy5oPgorI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3N0YWJpbGl0eS5oPgorI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK25hbWVzcGFjZSBleHRlbnNpb24geworY2xhc3MgTXlFeHQgeworcHVibGljOgorICB0eXBlZGVmIHN0ZDo6ZmFsc2VfdHlwZSBmaXhlZF9zaXplOworICBzdGF0aWMgY29uc3QgY2hhciogZGVzY3JpcHRvcjsKKworICBpbnQzMl90IGEgPSAwOworICBzdGQ6OnN0cmluZyBiOworCisgIGJpbmRlcl9zdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBwYXJjZWwpOworICBiaW5kZXJfc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChBUGFyY2VsKiBwYXJjZWwpIGNvbnN0OworCisgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgTXlFeHQmIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZShhLCBiKSAhPSBzdGQ6OnRpZShyaHMuYSwgcmhzLmIpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBNeUV4dCYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKGEsIGIpIDwgc3RkOjp0aWUocmhzLmEsIHJocy5iKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IE15RXh0JiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoYSwgYikgPD0gc3RkOjp0aWUocmhzLmEsIHJocy5iKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE15RXh0JiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoYSwgYikgPT0gc3RkOjp0aWUocmhzLmEsIHJocy5iKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgTXlFeHQmIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZShhLCBiKSA+IHN0ZDo6dGllKHJocy5hLCByaHMuYik7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBNeUV4dCYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKGEsIGIpID49IHN0ZDo6dGllKHJocy5hLCByaHMuYik7CisgIH0KKworICBzdGF0aWMgY29uc3QgOjpuZGs6OnBhcmNlbGFibGVfc3RhYmlsaXR5X3QgX2FpZGxfc3RhYmlsaXR5ID0gOjpuZGs6OlNUQUJJTElUWV9MT0NBTDsKKyAgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvczsKKyAgICBvcyA8PCAiTXlFeHR7IjsKKyAgICBvcyA8PCAiYTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhhKTsKKyAgICBvcyA8PCAiLCBiOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGIpOworICAgIG9zIDw8ICJ9IjsKKyAgICByZXR1cm4gb3Muc3RyKCk7CisgIH0KK307Cit9ICAvLyBuYW1lc3BhY2UgZXh0ZW5zaW9uCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dDIuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dDIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTIxYjU1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0Mi5oCkBAIC0wLDAgKzEsNjcgQEAKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8b3B0aW9uYWw+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pbnRlcmZhY2VfdXRpbHMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wYXJjZWxhYmxlX3V0aWxzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfdG9fc3RyaW5nLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0Lmg+CisjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfc3RhYmlsaXR5Lmg+CisjZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworbmFtZXNwYWNlIGV4dGVuc2lvbiB7CitjbGFzcyBNeUV4dDIgeworcHVibGljOgorICB0eXBlZGVmIHN0ZDo6ZmFsc2VfdHlwZSBmaXhlZF9zaXplOworICBzdGF0aWMgY29uc3QgY2hhciogZGVzY3JpcHRvcjsKKworICBpbnQzMl90IGEgPSAwOworICA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpleHRlbnNpb246Ok15RXh0IGI7CisgIHN0ZDo6c3RyaW5nIGM7CisKKyAgYmluZGVyX3N0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIHBhcmNlbCk7CisgIGJpbmRlcl9zdGF0dXNfdCB3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIHBhcmNlbCkgY29uc3Q7CisKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBNeUV4dDImIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZShhLCBiLCBjKSAhPSBzdGQ6OnRpZShyaHMuYSwgcmhzLmIsIHJocy5jKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgTXlFeHQyJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoYSwgYiwgYykgPCBzdGQ6OnRpZShyaHMuYSwgcmhzLmIsIHJocy5jKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IE15RXh0MiYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKGEsIGIsIGMpIDw9IHN0ZDo6dGllKHJocy5hLCByaHMuYiwgcmhzLmMpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgTXlFeHQyJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoYSwgYiwgYykgPT0gc3RkOjp0aWUocmhzLmEsIHJocy5iLCByaHMuYyk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IE15RXh0MiYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKGEsIGIsIGMpID4gc3RkOjp0aWUocmhzLmEsIHJocy5iLCByaHMuYyk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBNeUV4dDImIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZShhLCBiLCBjKSA+PSBzdGQ6OnRpZShyaHMuYSwgcmhzLmIsIHJocy5jKTsKKyAgfQorCisgIHN0YXRpYyBjb25zdCA6Om5kazo6cGFyY2VsYWJsZV9zdGFiaWxpdHlfdCBfYWlkbF9zdGFiaWxpdHkgPSA6Om5kazo6U1RBQklMSVRZX0xPQ0FMOworICBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOworICAgIG9zIDw8ICJNeUV4dDJ7IjsKKyAgICBvcyA8PCAiYTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhhKTsKKyAgICBvcyA8PCAiLCBiOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGIpOworICAgIG9zIDw8ICIsIGM6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoYyk7CisgICAgb3MgPDwgIn0iOworICAgIHJldHVybiBvcy5zdHIoKTsKKyAgfQorfTsKK30gIC8vIG5hbWVzcGFjZSBleHRlbnNpb24KK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0TGlrZS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0TGlrZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ODdlMTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHRMaWtlLmgKQEAgLTAsMCArMSw2NCBAQAorI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxvcHRpb25hbD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2ludGVyZmFjZV91dGlscy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3BhcmNlbGFibGVfdXRpbHMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl90b19zdHJpbmcuaD4KKyNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9zdGFiaWxpdHkuaD4KKyNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CituYW1lc3BhY2UgZXh0ZW5zaW9uIHsKK2NsYXNzIE15RXh0TGlrZSB7CitwdWJsaWM6CisgIHR5cGVkZWYgc3RkOjpmYWxzZV90eXBlIGZpeGVkX3NpemU7CisgIHN0YXRpYyBjb25zdCBjaGFyKiBkZXNjcmlwdG9yOworCisgIGludDMyX3QgYSA9IDA7CisgIHN0ZDo6c3RyaW5nIGI7CisKKyAgYmluZGVyX3N0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIHBhcmNlbCk7CisgIGJpbmRlcl9zdGF0dXNfdCB3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIHBhcmNlbCkgY29uc3Q7CisKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBNeUV4dExpa2UmIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZShhLCBiKSAhPSBzdGQ6OnRpZShyaHMuYSwgcmhzLmIpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBNeUV4dExpa2UmIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZShhLCBiKSA8IHN0ZDo6dGllKHJocy5hLCByaHMuYik7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBNeUV4dExpa2UmIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZShhLCBiKSA8PSBzdGQ6OnRpZShyaHMuYSwgcmhzLmIpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgTXlFeHRMaWtlJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoYSwgYikgPT0gc3RkOjp0aWUocmhzLmEsIHJocy5iKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgTXlFeHRMaWtlJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoYSwgYikgPiBzdGQ6OnRpZShyaHMuYSwgcmhzLmIpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgTXlFeHRMaWtlJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoYSwgYikgPj0gc3RkOjp0aWUocmhzLmEsIHJocy5iKTsKKyAgfQorCisgIHN0YXRpYyBjb25zdCA6Om5kazo6cGFyY2VsYWJsZV9zdGFiaWxpdHlfdCBfYWlkbF9zdGFiaWxpdHkgPSA6Om5kazo6U1RBQklMSVRZX0xPQ0FMOworICBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOworICAgIG9zIDw8ICJNeUV4dExpa2V7IjsKKyAgICBvcyA8PCAiYTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhhKTsKKyAgICBvcyA8PCAiLCBiOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGIpOworICAgIG9zIDw8ICJ9IjsKKyAgICByZXR1cm4gb3Muc3RyKCk7CisgIH0KK307Cit9ICAvLyBuYW1lc3BhY2UgZXh0ZW5zaW9uCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuVW5pb25XaXRoRmQuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9CbkRlZXBseU5lc3RlZC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5VbmlvbldpdGhGZC5oCmNvcHkgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0JuRGVlcGx5TmVzdGVkLmgKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9Cbk5lc3RlZFNlcnZpY2UuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9Cbk5lc3RlZFNlcnZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmM5N2FiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0JuTmVzdGVkU2VydmljZS5oCkBAIC0wLDAgKzEsNDcgQEAKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0lOZXN0ZWRTZXJ2aWNlLmgiCisKKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pYmluZGVyLmg+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKworI2lmbmRlZiBfX0JJT05JQ19fCisjaWZuZGVmIF9fYXNzZXJ0MgorI2RlZmluZSBfX2Fzc2VydDIoYSxiLGMsZCkgKCh2b2lkKTApCisjZW5kaWYKKyNlbmRpZgorCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworbmFtZXNwYWNlIG5lc3RlZCB7CitjbGFzcyBCbk5lc3RlZFNlcnZpY2UgOiBwdWJsaWMgOjpuZGs6OkJuQ0ludGVyZmFjZTxJTmVzdGVkU2VydmljZT4geworcHVibGljOgorICBCbk5lc3RlZFNlcnZpY2UoKTsKKyAgdmlydHVhbCB+Qm5OZXN0ZWRTZXJ2aWNlKCk7Citwcm90ZWN0ZWQ6CisgIDo6bmRrOjpTcEFJQmluZGVyIGNyZWF0ZUJpbmRlcigpIG92ZXJyaWRlOworcHJpdmF0ZToKK307CitjbGFzcyBJTmVzdGVkU2VydmljZURlbGVnYXRvciA6IHB1YmxpYyBCbk5lc3RlZFNlcnZpY2UgeworcHVibGljOgorICBleHBsaWNpdCBJTmVzdGVkU2VydmljZURlbGVnYXRvcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SU5lc3RlZFNlcnZpY2U+ICZpbXBsKSA6IF9pbXBsKGltcGwpIHsKKyAgfQorCisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGZsaXBTdGF0dXMoY29uc3QgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpQYXJjZWxhYmxlV2l0aE5lc3RlZCYgaW5fcCwgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpJTmVzdGVkU2VydmljZTo6UmVzdWx0KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2ltcGwtPmZsaXBTdGF0dXMoaW5fcCwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6Om5kazo6U2NvcGVkQVN0YXR1cyBmbGlwU3RhdHVzV2l0aENhbGxiYWNrKDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6UGFyY2VsYWJsZVdpdGhOZXN0ZWQ6OlN0YXR1cyBpbl9zdGF0dXMsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OklOZXN0ZWRTZXJ2aWNlOjpJQ2FsbGJhY2s+JiBpbl9jYikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfaW1wbC0+ZmxpcFN0YXR1c1dpdGhDYWxsYmFjayhpbl9zdGF0dXMsIGluX2NiKTsKKyAgfQorcHJvdGVjdGVkOgorcHJpdmF0ZToKKyAgc3RkOjpzaGFyZWRfcHRyPElOZXN0ZWRTZXJ2aWNlPiBfaW1wbDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBuZXN0ZWQKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5VbmlvbldpdGhGZC5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0JuUGFyY2VsYWJsZVdpdGhOZXN0ZWQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuVW5pb25XaXRoRmQuaApjb3B5IHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9CblBhcmNlbGFibGVXaXRoTmVzdGVkLmgKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwVW5pb25XaXRoRmQuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9CcERlZXBseU5lc3RlZC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBVbmlvbldpdGhGZC5oCmNvcHkgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0JwRGVlcGx5TmVzdGVkLmgKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9CcE5lc3RlZFNlcnZpY2UuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9CcE5lc3RlZFNlcnZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2FjNDc2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0JwTmVzdGVkU2VydmljZS5oCkBAIC0wLDAgKzEsMjQgQEAKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0lOZXN0ZWRTZXJ2aWNlLmgiCisKKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pYmluZGVyLmg+CisKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CituYW1lc3BhY2UgbmVzdGVkIHsKK2NsYXNzIEJwTmVzdGVkU2VydmljZSA6IHB1YmxpYyA6Om5kazo6QnBDSW50ZXJmYWNlPElOZXN0ZWRTZXJ2aWNlPiB7CitwdWJsaWM6CisgIGV4cGxpY2l0IEJwTmVzdGVkU2VydmljZShjb25zdCA6Om5kazo6U3BBSUJpbmRlciYgYmluZGVyKTsKKyAgdmlydHVhbCB+QnBOZXN0ZWRTZXJ2aWNlKCk7CisKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZmxpcFN0YXR1cyhjb25zdCA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OlBhcmNlbGFibGVXaXRoTmVzdGVkJiBpbl9wLCA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OklOZXN0ZWRTZXJ2aWNlOjpSZXN1bHQqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGZsaXBTdGF0dXNXaXRoQ2FsbGJhY2soOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpQYXJjZWxhYmxlV2l0aE5lc3RlZDo6U3RhdHVzIGluX3N0YXR1cywgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6SU5lc3RlZFNlcnZpY2U6OklDYWxsYmFjaz4mIGluX2NiKSBvdmVycmlkZTsKK307Cit9ICAvLyBuYW1lc3BhY2UgbmVzdGVkCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwVW5pb25XaXRoRmQuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9CcFBhcmNlbGFibGVXaXRoTmVzdGVkLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcFVuaW9uV2l0aEZkLmgKY29weSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvQnBQYXJjZWxhYmxlV2l0aE5lc3RlZC5oCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvRGVlcGx5TmVzdGVkLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvRGVlcGx5TmVzdGVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUxNjc1MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9EZWVwbHlOZXN0ZWQuaApAQCAtMCwwICsxLDI0MiBAQAorI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxhcnJheT4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxvcHRpb25hbD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2VudW1zLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaW50ZXJmYWNlX3V0aWxzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcGFyY2VsYWJsZV91dGlscy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3RvX3N0cmluZy5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9EZWVwbHlOZXN0ZWQuaD4KKyNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9zdGFiaWxpdHkuaD4KKyNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CituYW1lc3BhY2UgbmVzdGVkIHsKK2NsYXNzIERlZXBseU5lc3RlZCB7CitwdWJsaWM6CisgIHR5cGVkZWYgc3RkOjpmYWxzZV90eXBlIGZpeGVkX3NpemU7CisgIHN0YXRpYyBjb25zdCBjaGFyKiBkZXNjcmlwdG9yOworCisgIGNsYXNzIEIgeworICBwdWJsaWM6CisgICAgdHlwZWRlZiBzdGQ6OmZhbHNlX3R5cGUgZml4ZWRfc2l6ZTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciogZGVzY3JpcHRvcjsKKworICAgIGNsYXNzIEMgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgc3RkOjpmYWxzZV90eXBlIGZpeGVkX3NpemU7CisgICAgICBzdGF0aWMgY29uc3QgY2hhciogZGVzY3JpcHRvcjsKKworICAgICAgY2xhc3MgRCB7CisgICAgICBwdWJsaWM6CisgICAgICAgIHR5cGVkZWYgc3RkOjpmYWxzZV90eXBlIGZpeGVkX3NpemU7CisgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkZXNjcmlwdG9yOworCisgICAgICAgIGVudW0gY2xhc3MgRSA6IGludDhfdCB7CisgICAgICAgICAgT0sgPSAwLAorICAgICAgICB9OworCisKKyAgICAgICAgYmluZGVyX3N0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIHBhcmNlbCk7CisgICAgICAgIGJpbmRlcl9zdGF0dXNfdCB3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIHBhcmNlbCkgY29uc3Q7CisKKyAgICAgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBEJikgY29uc3QgeworICAgICAgICAgIHJldHVybiBzdGQ6OnRpZSgpICE9IHN0ZDo6dGllKCk7CisgICAgICAgIH0KKyAgICAgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEQmKSBjb25zdCB7CisgICAgICAgICAgcmV0dXJuIHN0ZDo6dGllKCkgPCBzdGQ6OnRpZSgpOworICAgICAgICB9CisgICAgICAgIGlubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgRCYpIGNvbnN0IHsKKyAgICAgICAgICByZXR1cm4gc3RkOjp0aWUoKSA8PSBzdGQ6OnRpZSgpOworICAgICAgICB9CisgICAgICAgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgRCYpIGNvbnN0IHsKKyAgICAgICAgICByZXR1cm4gc3RkOjp0aWUoKSA9PSBzdGQ6OnRpZSgpOworICAgICAgICB9CisgICAgICAgIGlubGluZSBib29sIG9wZXJhdG9yPihjb25zdCBEJikgY29uc3QgeworICAgICAgICAgIHJldHVybiBzdGQ6OnRpZSgpID4gc3RkOjp0aWUoKTsKKyAgICAgICAgfQorICAgICAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IEQmKSBjb25zdCB7CisgICAgICAgICAgcmV0dXJuIHN0ZDo6dGllKCkgPj0gc3RkOjp0aWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBjb25zdCA6Om5kazo6cGFyY2VsYWJsZV9zdGFiaWxpdHlfdCBfYWlkbF9zdGFiaWxpdHkgPSA6Om5kazo6U1RBQklMSVRZX0xPQ0FMOworICAgICAgICBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOworICAgICAgICAgIG9zIDw8ICJEeyI7CisgICAgICAgICAgb3MgPDwgIn0iOworICAgICAgICAgIHJldHVybiBvcy5zdHIoKTsKKyAgICAgICAgfQorICAgICAgfTsKKworICAgICAgYmluZGVyX3N0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIHBhcmNlbCk7CisgICAgICBiaW5kZXJfc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChBUGFyY2VsKiBwYXJjZWwpIGNvbnN0OworCisgICAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEMmKSBjb25zdCB7CisgICAgICAgIHJldHVybiBzdGQ6OnRpZSgpICE9IHN0ZDo6dGllKCk7CisgICAgICB9CisgICAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgQyYpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6dGllKCkgPCBzdGQ6OnRpZSgpOworICAgICAgfQorICAgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBDJikgY29uc3QgeworICAgICAgICByZXR1cm4gc3RkOjp0aWUoKSA8PSBzdGQ6OnRpZSgpOworICAgICAgfQorICAgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDJikgY29uc3QgeworICAgICAgICByZXR1cm4gc3RkOjp0aWUoKSA9PSBzdGQ6OnRpZSgpOworICAgICAgfQorICAgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IEMmKSBjb25zdCB7CisgICAgICAgIHJldHVybiBzdGQ6OnRpZSgpID4gc3RkOjp0aWUoKTsKKyAgICAgIH0KKyAgICAgIGlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgQyYpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6dGllKCkgPj0gc3RkOjp0aWUoKTsKKyAgICAgIH0KKworICAgICAgc3RhdGljIGNvbnN0IDo6bmRrOjpwYXJjZWxhYmxlX3N0YWJpbGl0eV90IF9haWRsX3N0YWJpbGl0eSA9IDo6bmRrOjpTVEFCSUxJVFlfTE9DQUw7CisgICAgICBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvczsKKyAgICAgICAgb3MgPDwgIkN7IjsKKyAgICAgICAgb3MgPDwgIn0iOworICAgICAgICByZXR1cm4gb3Muc3RyKCk7CisgICAgICB9CisgICAgfTsKKworICAgIGJpbmRlcl9zdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBwYXJjZWwpOworICAgIGJpbmRlcl9zdGF0dXNfdCB3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIHBhcmNlbCkgY29uc3Q7CisKKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEImKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoKSAhPSBzdGQ6OnRpZSgpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgQiYpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZSgpIDwgc3RkOjp0aWUoKTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBCJikgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKCkgPD0gc3RkOjp0aWUoKTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBCJikgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKCkgPT0gc3RkOjp0aWUoKTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IEImKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoKSA+IHN0ZDo6dGllKCk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgQiYpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZSgpID49IHN0ZDo6dGllKCk7CisgICAgfQorCisgICAgc3RhdGljIGNvbnN0IDo6bmRrOjpwYXJjZWxhYmxlX3N0YWJpbGl0eV90IF9haWRsX3N0YWJpbGl0eSA9IDo6bmRrOjpTVEFCSUxJVFlfTE9DQUw7CisgICAgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOworICAgICAgb3MgPDwgIkJ7IjsKKyAgICAgIG9zIDw8ICJ9IjsKKyAgICAgIHJldHVybiBvcy5zdHIoKTsKKyAgICB9CisgIH07CisgIGNsYXNzIEEgeworICBwdWJsaWM6CisgICAgdHlwZWRlZiBzdGQ6OmZhbHNlX3R5cGUgZml4ZWRfc2l6ZTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciogZGVzY3JpcHRvcjsKKworICAgIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6RGVlcGx5TmVzdGVkOjpCOjpDOjpEOjpFIGUgPSA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OkRlZXBseU5lc3RlZDo6Qjo6Qzo6RDo6RTo6T0s7CisKKyAgICBiaW5kZXJfc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogcGFyY2VsKTsKKyAgICBiaW5kZXJfc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChBUGFyY2VsKiBwYXJjZWwpIGNvbnN0OworCisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBBJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZShlKSAhPSBzdGQ6OnRpZShyaHMuZSk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBBJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZShlKSA8IHN0ZDo6dGllKHJocy5lKTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBBJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZShlKSA8PSBzdGQ6OnRpZShyaHMuZSk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgQSYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoZSkgPT0gc3RkOjp0aWUocmhzLmUpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgQSYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoZSkgPiBzdGQ6OnRpZShyaHMuZSk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgQSYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoZSkgPj0gc3RkOjp0aWUocmhzLmUpOworICAgIH0KKworICAgIHN0YXRpYyBjb25zdCA6Om5kazo6cGFyY2VsYWJsZV9zdGFiaWxpdHlfdCBfYWlkbF9zdGFiaWxpdHkgPSA6Om5kazo6U1RBQklMSVRZX0xPQ0FMOworICAgIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsKKyAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvczsKKyAgICAgIG9zIDw8ICJBeyI7CisgICAgICBvcyA8PCAiZTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhlKTsKKyAgICAgIG9zIDw8ICJ9IjsKKyAgICAgIHJldHVybiBvcy5zdHIoKTsKKyAgICB9CisgIH07CisKKyAgYmluZGVyX3N0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIHBhcmNlbCk7CisgIGJpbmRlcl9zdGF0dXNfdCB3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIHBhcmNlbCkgY29uc3Q7CisKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBEZWVwbHlOZXN0ZWQmKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKCkgIT0gc3RkOjp0aWUoKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgRGVlcGx5TmVzdGVkJikgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZSgpIDwgc3RkOjp0aWUoKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IERlZXBseU5lc3RlZCYpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoKSA8PSBzdGQ6OnRpZSgpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgRGVlcGx5TmVzdGVkJikgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZSgpID09IHN0ZDo6dGllKCk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IERlZXBseU5lc3RlZCYpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoKSA+IHN0ZDo6dGllKCk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBEZWVwbHlOZXN0ZWQmKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKCkgPj0gc3RkOjp0aWUoKTsKKyAgfQorCisgIHN0YXRpYyBjb25zdCA6Om5kazo6cGFyY2VsYWJsZV9zdGFiaWxpdHlfdCBfYWlkbF9zdGFiaWxpdHkgPSA6Om5kazo6U1RBQklMSVRZX0xPQ0FMOworICBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOworICAgIG9zIDw8ICJEZWVwbHlOZXN0ZWR7IjsKKyAgICBvcyA8PCAifSI7CisgICAgcmV0dXJuIG9zLnN0cigpOworICB9Cit9OworfSAgLy8gbmFtZXNwYWNlIG5lc3RlZAorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworbmFtZXNwYWNlIG5lc3RlZCB7CitbW25vZGlzY2FyZF1dIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoRGVlcGx5TmVzdGVkOjpCOjpDOjpEOjpFIHZhbCkgeworICBzd2l0Y2godmFsKSB7CisgIGNhc2UgRGVlcGx5TmVzdGVkOjpCOjpDOjpEOjpFOjpPSzoKKyAgICByZXR1cm4gIk9LIjsKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gc3RkOjp0b19zdHJpbmcoc3RhdGljX2Nhc3Q8aW50OF90Pih2YWwpKTsKKyAgfQorfQorfSAgLy8gbmFtZXNwYWNlIG5lc3RlZAorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCituYW1lc3BhY2UgbmRrIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XYysrMTctZXh0ZW5zaW9ucyIKK3RlbXBsYXRlIDw+Citjb25zdGV4cHIgaW5saW5lIHN0ZDo6YXJyYXk8YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6RGVlcGx5TmVzdGVkOjpCOjpDOjpEOjpFLCAxPiBlbnVtX3ZhbHVlczxhaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpEZWVwbHlOZXN0ZWQ6OkI6OkM6OkQ6OkU+ID0geworICBhaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpEZWVwbHlOZXN0ZWQ6OkI6OkM6OkQ6OkU6Ok9LLAorfTsKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIG5kawpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0lOZXN0ZWRTZXJ2aWNlLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvSU5lc3RlZFNlcnZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjUyNmQxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0lOZXN0ZWRTZXJ2aWNlLmgKQEAgLTAsMCArMSwxMjkgQEAKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8b3B0aW9uYWw+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pYmluZGVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaW50ZXJmYWNlX3V0aWxzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcGFyY2VsYWJsZV91dGlscy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3RvX3N0cmluZy5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9JTmVzdGVkU2VydmljZS5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9QYXJjZWxhYmxlV2l0aE5lc3RlZC5oPgorI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3N0YWJpbGl0eS5oPgorI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK25hbWVzcGFjZSBuZXN0ZWQgeworY2xhc3MgSU5lc3RlZFNlcnZpY2UgOiBwdWJsaWMgOjpuZGs6OklDSW50ZXJmYWNlIHsKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IGNoYXIqIGRlc2NyaXB0b3I7CisgIElOZXN0ZWRTZXJ2aWNlKCk7CisgIHZpcnR1YWwgfklOZXN0ZWRTZXJ2aWNlKCk7CisKKyAgY2xhc3MgUmVzdWx0IHsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgc3RkOjpmYWxzZV90eXBlIGZpeGVkX3NpemU7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGRlc2NyaXB0b3I7CisKKyAgICA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OlBhcmNlbGFibGVXaXRoTmVzdGVkOjpTdGF0dXMgc3RhdHVzID0gOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpQYXJjZWxhYmxlV2l0aE5lc3RlZDo6U3RhdHVzOjpPSzsKKworICAgIGJpbmRlcl9zdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBwYXJjZWwpOworICAgIGJpbmRlcl9zdGF0dXNfdCB3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIHBhcmNlbCkgY29uc3Q7CisKKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFJlc3VsdCYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoc3RhdHVzKSAhPSBzdGQ6OnRpZShyaHMuc3RhdHVzKTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFJlc3VsdCYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoc3RhdHVzKSA8IHN0ZDo6dGllKHJocy5zdGF0dXMpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IFJlc3VsdCYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoc3RhdHVzKSA8PSBzdGQ6OnRpZShyaHMuc3RhdHVzKTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBSZXN1bHQmIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKHN0YXR1cykgPT0gc3RkOjp0aWUocmhzLnN0YXR1cyk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPihjb25zdCBSZXN1bHQmIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKHN0YXR1cykgPiBzdGQ6OnRpZShyaHMuc3RhdHVzKTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBSZXN1bHQmIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKHN0YXR1cykgPj0gc3RkOjp0aWUocmhzLnN0YXR1cyk7CisgICAgfQorCisgICAgc3RhdGljIGNvbnN0IDo6bmRrOjpwYXJjZWxhYmxlX3N0YWJpbGl0eV90IF9haWRsX3N0YWJpbGl0eSA9IDo6bmRrOjpTVEFCSUxJVFlfTE9DQUw7CisgICAgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOworICAgICAgb3MgPDwgIlJlc3VsdHsiOworICAgICAgb3MgPDwgInN0YXR1czogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhzdGF0dXMpOworICAgICAgb3MgPDwgIn0iOworICAgICAgcmV0dXJuIG9zLnN0cigpOworICAgIH0KKyAgfTsKKyAgY2xhc3MgSUNhbGxiYWNrIDogcHVibGljIDo6bmRrOjpJQ0ludGVyZmFjZSB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgY2hhciogZGVzY3JpcHRvcjsKKyAgICBJQ2FsbGJhY2soKTsKKyAgICB2aXJ0dWFsIH5JQ2FsbGJhY2soKTsKKworICAgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fZG9uZSA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAwOworCisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxJQ2FsbGJhY2s+IGZyb21CaW5kZXIoY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGJpbmRlcik7CisgICAgc3RhdGljIGJpbmRlcl9zdGF0dXNfdCB3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIHBhcmNlbCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElDYWxsYmFjaz4mIGluc3RhbmNlKTsKKyAgICBzdGF0aWMgYmluZGVyX3N0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIHBhcmNlbCwgc3RkOjpzaGFyZWRfcHRyPElDYWxsYmFjaz4qIGluc3RhbmNlKTsKKyAgICBzdGF0aWMgYm9vbCBzZXREZWZhdWx0SW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SUNhbGxiYWNrPiYgaW1wbCk7CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJQ2FsbGJhY2s+JiBnZXREZWZhdWx0SW1wbCgpOworICAgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZG9uZSg6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OlBhcmNlbGFibGVXaXRoTmVzdGVkOjpTdGF0dXMgaW5fc3RhdHVzKSA9IDA7CisgIHByaXZhdGU6CisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxJQ2FsbGJhY2s+IGRlZmF1bHRfaW1wbDsKKyAgfTsKKyAgY2xhc3MgSUNhbGxiYWNrRGVmYXVsdCA6IHB1YmxpYyBJQ2FsbGJhY2sgeworICBwdWJsaWM6CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZG9uZSg6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OlBhcmNlbGFibGVXaXRoTmVzdGVkOjpTdGF0dXMgaW5fc3RhdHVzKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U3BBSUJpbmRlciBhc0JpbmRlcigpIG92ZXJyaWRlOworICAgIGJvb2wgaXNSZW1vdGUoKSBvdmVycmlkZTsKKyAgfTsKKyAgY2xhc3MgQnBDYWxsYmFjayA6IHB1YmxpYyA6Om5kazo6QnBDSW50ZXJmYWNlPElDYWxsYmFjaz4geworICBwdWJsaWM6CisgICAgZXhwbGljaXQgQnBDYWxsYmFjayhjb25zdCA6Om5kazo6U3BBSUJpbmRlciYgYmluZGVyKTsKKyAgICB2aXJ0dWFsIH5CcENhbGxiYWNrKCk7CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBkb25lKDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6UGFyY2VsYWJsZVdpdGhOZXN0ZWQ6OlN0YXR1cyBpbl9zdGF0dXMpIG92ZXJyaWRlOworICB9OworICBjbGFzcyBCbkNhbGxiYWNrIDogcHVibGljIDo6bmRrOjpCbkNJbnRlcmZhY2U8SUNhbGxiYWNrPiB7CisgIHB1YmxpYzoKKyAgICBCbkNhbGxiYWNrKCk7CisgICAgdmlydHVhbCB+Qm5DYWxsYmFjaygpOworICBwcm90ZWN0ZWQ6CisgICAgOjpuZGs6OlNwQUlCaW5kZXIgY3JlYXRlQmluZGVyKCkgb3ZlcnJpZGU7CisgIHByaXZhdGU6CisgIH07CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fZmxpcFN0YXR1cyA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAwOworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX2ZsaXBTdGF0dXNXaXRoQ2FsbGJhY2sgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMTsKKworICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPElOZXN0ZWRTZXJ2aWNlPiBmcm9tQmluZGVyKGNvbnN0IDo6bmRrOjpTcEFJQmluZGVyJiBiaW5kZXIpOworICBzdGF0aWMgYmluZGVyX3N0YXR1c190IHdyaXRlVG9QYXJjZWwoQVBhcmNlbCogcGFyY2VsLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SU5lc3RlZFNlcnZpY2U+JiBpbnN0YW5jZSk7CisgIHN0YXRpYyBiaW5kZXJfc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogcGFyY2VsLCBzdGQ6OnNoYXJlZF9wdHI8SU5lc3RlZFNlcnZpY2U+KiBpbnN0YW5jZSk7CisgIHN0YXRpYyBib29sIHNldERlZmF1bHRJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJTmVzdGVkU2VydmljZT4mIGltcGwpOworICBzdGF0aWMgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElOZXN0ZWRTZXJ2aWNlPiYgZ2V0RGVmYXVsdEltcGwoKTsKKyAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBmbGlwU3RhdHVzKGNvbnN0IDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6UGFyY2VsYWJsZVdpdGhOZXN0ZWQmIGluX3AsIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6SU5lc3RlZFNlcnZpY2U6OlJlc3VsdCogX2FpZGxfcmV0dXJuKSA9IDA7CisgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZmxpcFN0YXR1c1dpdGhDYWxsYmFjayg6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OlBhcmNlbGFibGVXaXRoTmVzdGVkOjpTdGF0dXMgaW5fc3RhdHVzLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpJTmVzdGVkU2VydmljZTo6SUNhbGxiYWNrPiYgaW5fY2IpID0gMDsKK3ByaXZhdGU6CisgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8SU5lc3RlZFNlcnZpY2U+IGRlZmF1bHRfaW1wbDsKK307CitjbGFzcyBJTmVzdGVkU2VydmljZURlZmF1bHQgOiBwdWJsaWMgSU5lc3RlZFNlcnZpY2UgeworcHVibGljOgorICA6Om5kazo6U2NvcGVkQVN0YXR1cyBmbGlwU3RhdHVzKGNvbnN0IDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6UGFyY2VsYWJsZVdpdGhOZXN0ZWQmIGluX3AsIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6SU5lc3RlZFNlcnZpY2U6OlJlc3VsdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZmxpcFN0YXR1c1dpdGhDYWxsYmFjayg6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OlBhcmNlbGFibGVXaXRoTmVzdGVkOjpTdGF0dXMgaW5fc3RhdHVzLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpJTmVzdGVkU2VydmljZTo6SUNhbGxiYWNrPiYgaW5fY2IpIG92ZXJyaWRlOworICA6Om5kazo6U3BBSUJpbmRlciBhc0JpbmRlcigpIG92ZXJyaWRlOworICBib29sIGlzUmVtb3RlKCkgb3ZlcnJpZGU7Cit9OworfSAgLy8gbmFtZXNwYWNlIG5lc3RlZAorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvUGFyY2VsYWJsZVdpdGhOZXN0ZWQuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9QYXJjZWxhYmxlV2l0aE5lc3RlZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwY2VlOTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvUGFyY2VsYWJsZVdpdGhOZXN0ZWQuaApAQCAtMCwwICsxLDEwMiBAQAorI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxhcnJheT4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxvcHRpb25hbD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2VudW1zLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaW50ZXJmYWNlX3V0aWxzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcGFyY2VsYWJsZV91dGlscy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3RvX3N0cmluZy5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9QYXJjZWxhYmxlV2l0aE5lc3RlZC5oPgorI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3N0YWJpbGl0eS5oPgorI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK25hbWVzcGFjZSBuZXN0ZWQgeworY2xhc3MgUGFyY2VsYWJsZVdpdGhOZXN0ZWQgeworcHVibGljOgorICB0eXBlZGVmIHN0ZDo6ZmFsc2VfdHlwZSBmaXhlZF9zaXplOworICBzdGF0aWMgY29uc3QgY2hhciogZGVzY3JpcHRvcjsKKworICBlbnVtIGNsYXNzIFN0YXR1cyA6IGludDhfdCB7CisgICAgT0sgPSAwLAorICAgIE5PVF9PSyA9IDEsCisgIH07CisKKyAgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpQYXJjZWxhYmxlV2l0aE5lc3RlZDo6U3RhdHVzIHN0YXR1cyA9IDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6UGFyY2VsYWJsZVdpdGhOZXN0ZWQ6OlN0YXR1czo6T0s7CisKKyAgYmluZGVyX3N0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIHBhcmNlbCk7CisgIGJpbmRlcl9zdGF0dXNfdCB3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIHBhcmNlbCkgY29uc3Q7CisKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBQYXJjZWxhYmxlV2l0aE5lc3RlZCYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKHN0YXR1cykgIT0gc3RkOjp0aWUocmhzLnN0YXR1cyk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFBhcmNlbGFibGVXaXRoTmVzdGVkJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoc3RhdHVzKSA8IHN0ZDo6dGllKHJocy5zdGF0dXMpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgUGFyY2VsYWJsZVdpdGhOZXN0ZWQmIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZShzdGF0dXMpIDw9IHN0ZDo6dGllKHJocy5zdGF0dXMpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgUGFyY2VsYWJsZVdpdGhOZXN0ZWQmIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZShzdGF0dXMpID09IHN0ZDo6dGllKHJocy5zdGF0dXMpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPihjb25zdCBQYXJjZWxhYmxlV2l0aE5lc3RlZCYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKHN0YXR1cykgPiBzdGQ6OnRpZShyaHMuc3RhdHVzKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IFBhcmNlbGFibGVXaXRoTmVzdGVkJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoc3RhdHVzKSA+PSBzdGQ6OnRpZShyaHMuc3RhdHVzKTsKKyAgfQorCisgIHN0YXRpYyBjb25zdCA6Om5kazo6cGFyY2VsYWJsZV9zdGFiaWxpdHlfdCBfYWlkbF9zdGFiaWxpdHkgPSA6Om5kazo6U1RBQklMSVRZX0xPQ0FMOworICBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOworICAgIG9zIDw8ICJQYXJjZWxhYmxlV2l0aE5lc3RlZHsiOworICAgIG9zIDw8ICJzdGF0dXM6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoc3RhdHVzKTsKKyAgICBvcyA8PCAifSI7CisgICAgcmV0dXJuIG9zLnN0cigpOworICB9Cit9OworfSAgLy8gbmFtZXNwYWNlIG5lc3RlZAorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworbmFtZXNwYWNlIG5lc3RlZCB7CitbW25vZGlzY2FyZF1dIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoUGFyY2VsYWJsZVdpdGhOZXN0ZWQ6OlN0YXR1cyB2YWwpIHsKKyAgc3dpdGNoKHZhbCkgeworICBjYXNlIFBhcmNlbGFibGVXaXRoTmVzdGVkOjpTdGF0dXM6Ok9LOgorICAgIHJldHVybiAiT0siOworICBjYXNlIFBhcmNlbGFibGVXaXRoTmVzdGVkOjpTdGF0dXM6Ok5PVF9PSzoKKyAgICByZXR1cm4gIk5PVF9PSyI7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIHN0ZDo6dG9fc3RyaW5nKHN0YXRpY19jYXN0PGludDhfdD4odmFsKSk7CisgIH0KK30KK30gIC8vIG5hbWVzcGFjZSBuZXN0ZWQKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorbmFtZXNwYWNlIG5kayB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2MrKzE3LWV4dGVuc2lvbnMiCit0ZW1wbGF0ZSA8PgorY29uc3RleHByIGlubGluZSBzdGQ6OmFycmF5PGFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OlBhcmNlbGFibGVXaXRoTmVzdGVkOjpTdGF0dXMsIDI+IGVudW1fdmFsdWVzPGFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OlBhcmNlbGFibGVXaXRoTmVzdGVkOjpTdGF0dXM+ID0geworICBhaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpQYXJjZWxhYmxlV2l0aE5lc3RlZDo6U3RhdHVzOjpPSywKKyAgYWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6UGFyY2VsYWJsZVdpdGhOZXN0ZWQ6OlN0YXR1czo6Tk9UX09LLAorfTsKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIG5kawpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL0JuRW51bVVuaW9uLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvQm5FbnVtVW5pb24uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL0JuRW51bVVuaW9uLmgKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9CbkVudW1Vbmlvbi5oCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvQm5VbmlvbkluVW5pb24uaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9CblVuaW9uSW5Vbmlvbi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvQm5VbmlvbkluVW5pb24uaApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL0JuVW5pb25JblVuaW9uLmgKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9CcEVudW1Vbmlvbi5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL0JwRW51bVVuaW9uLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9CcEVudW1Vbmlvbi5oCnJlbmFtZSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvQnBFbnVtVW5pb24uaApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL0JwVW5pb25JblVuaW9uLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvQnBVbmlvbkluVW5pb24uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL0JwVW5pb25JblVuaW9uLmgKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9CcFVuaW9uSW5Vbmlvbi5oCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvRW51bVVuaW9uLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvRW51bVVuaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE5MGY1MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9FbnVtVW5pb24uaApAQCAtMCwwICsxLDE3NiBAQAorI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxhcnJheT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG9wdGlvbmFsPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZhcmlhbnQ+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2VudW1zLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaW50ZXJmYWNlX3V0aWxzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcGFyY2VsYWJsZV91dGlscy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3RvX3N0cmluZy5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0ludEVudW0uaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9Mb25nRW51bS5oPgorI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3N0YWJpbGl0eS5oPgorI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKworI2lmbmRlZiBfX0JJT05JQ19fCisjZGVmaW5lIF9fYXNzZXJ0MihhLGIsYyxkKSAoKHZvaWQpMCkKKyNlbmRpZgorCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworbmFtZXNwYWNlIHVuaW9ucyB7CitjbGFzcyBFbnVtVW5pb24geworcHVibGljOgorICB0eXBlZGVmIHN0ZDo6ZmFsc2VfdHlwZSBmaXhlZF9zaXplOworICBzdGF0aWMgY29uc3QgY2hhciogZGVzY3JpcHRvcjsKKworICBlbnVtIGNsYXNzIFRhZyA6IGludDMyX3QgeworICAgIGludEVudW0gPSAwLAorICAgIGxvbmdFbnVtID0gMSwKKyAgICBkZXByZWNhdGVkRmllbGQgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCgiZG8gbm90IHVzZSB0aGlzIikpKSA9IDIsCisgIH07CisKKyAgLy8gRXhwb3NlIHRhZyBzeW1ib2xzIGZvciBsZWdhY3kgY29kZQorICBzdGF0aWMgY29uc3QgaW5saW5lIFRhZyBpbnRFbnVtID0gVGFnOjppbnRFbnVtOworICBzdGF0aWMgY29uc3QgaW5saW5lIFRhZyBsb25nRW51bSA9IFRhZzo6bG9uZ0VudW07CisgIHN0YXRpYyBjb25zdCBpbmxpbmUgVGFnIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQoImRvIG5vdCB1c2UgdGhpcyIpKSkgZGVwcmVjYXRlZEZpZWxkID0gVGFnOjpkZXByZWNhdGVkRmllbGQ7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICBzdGF0aWMgY29uc3RleHByIGJvb2wgX25vdF9zZWxmID0gIXN0ZDo6aXNfc2FtZV92PHN0ZDo6cmVtb3ZlX2N2X3Q8c3RkOjpyZW1vdmVfcmVmZXJlbmNlX3Q8X1RwPj4sIEVudW1Vbmlvbj47CisKKyAgRW51bVVuaW9uKCkgOiBfdmFsdWUoc3RkOjppbl9wbGFjZV9pbmRleDxzdGF0aWNfY2FzdDxzaXplX3Q+KGludEVudW0pPiwgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bSg6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtOjpGT08pKSB7IH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSA9IHN0ZDo6ZW5hYmxlX2lmX3Q8X25vdF9zZWxmPF9UcD4+PgorICAvLyBOT0xJTlRORVhUTElORShnb29nbGUtZXhwbGljaXQtY29uc3RydWN0b3IpCisgIGNvbnN0ZXhwciBFbnVtVW5pb24oX1RwJiYgX2FyZykKKyAgICAgIDogX3ZhbHVlKHN0ZDo6Zm9yd2FyZDxfVHA+KF9hcmcpKSB7fQorCisgIHRlbXBsYXRlIDxzaXplX3QgX05wLCB0eXBlbmFtZS4uLiBfVHA+CisgIGNvbnN0ZXhwciBleHBsaWNpdCBFbnVtVW5pb24oc3RkOjppbl9wbGFjZV9pbmRleF90PF9OcD4sIF9UcCYmLi4uIF9hcmdzKQorICAgICAgOiBfdmFsdWUoc3RkOjppbl9wbGFjZV9pbmRleDxfTnA+LCBzdGQ6OmZvcndhcmQ8X1RwPihfYXJncykuLi4pIHt9CisKKyAgdGVtcGxhdGUgPFRhZyBfdGFnLCB0eXBlbmFtZS4uLiBfVHA+CisgIHN0YXRpYyBFbnVtVW5pb24gbWFrZShfVHAmJi4uLiBfYXJncykgeworICAgIHJldHVybiBFbnVtVW5pb24oc3RkOjppbl9wbGFjZV9pbmRleDxzdGF0aWNfY2FzdDxzaXplX3Q+KF90YWcpPiwgc3RkOjpmb3J3YXJkPF9UcD4oX2FyZ3MpLi4uKTsKKyAgfQorCisgIHRlbXBsYXRlIDxUYWcgX3RhZywgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZS4uLiBfVXA+CisgIHN0YXRpYyBFbnVtVW5pb24gbWFrZShzdGQ6OmluaXRpYWxpemVyX2xpc3Q8X1RwPiBfaWwsIF9VcCYmLi4uIF9hcmdzKSB7CisgICAgcmV0dXJuIEVudW1VbmlvbihzdGQ6OmluX3BsYWNlX2luZGV4PHN0YXRpY19jYXN0PHNpemVfdD4oX3RhZyk+LCBzdGQ6Om1vdmUoX2lsKSwgc3RkOjpmb3J3YXJkPF9VcD4oX2FyZ3MpLi4uKTsKKyAgfQorCisgIFRhZyBnZXRUYWcoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFRhZz4oX3ZhbHVlLmluZGV4KCkpOworICB9CisKKyAgdGVtcGxhdGUgPFRhZyBfdGFnPgorICBjb25zdCBhdXRvJiBnZXQoKSBjb25zdCB7CisgICAgaWYgKGdldFRhZygpICE9IF90YWcpIHsgX19hc3NlcnQyKF9fRklMRV9fLCBfX0xJTkVfXywgX19QUkVUVFlfRlVOQ1RJT05fXywgImJhZCBhY2Nlc3M6IGEgd3JvbmcgdGFnIik7IH0KKyAgICByZXR1cm4gc3RkOjpnZXQ8c3RhdGljX2Nhc3Q8c2l6ZV90PihfdGFnKT4oX3ZhbHVlKTsKKyAgfQorCisgIHRlbXBsYXRlIDxUYWcgX3RhZz4KKyAgYXV0byYgZ2V0KCkgeworICAgIGlmIChnZXRUYWcoKSAhPSBfdGFnKSB7IF9fYXNzZXJ0MihfX0ZJTEVfXywgX19MSU5FX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18sICJiYWQgYWNjZXNzOiBhIHdyb25nIHRhZyIpOyB9CisgICAgcmV0dXJuIHN0ZDo6Z2V0PHN0YXRpY19jYXN0PHNpemVfdD4oX3RhZyk+KF92YWx1ZSk7CisgIH0KKworICB0ZW1wbGF0ZSA8VGFnIF90YWcsIHR5cGVuYW1lLi4uIF9UcD4KKyAgdm9pZCBzZXQoX1RwJiYuLi4gX2FyZ3MpIHsKKyAgICBfdmFsdWUuZW1wbGFjZTxzdGF0aWNfY2FzdDxzaXplX3Q+KF90YWcpPihzdGQ6OmZvcndhcmQ8X1RwPihfYXJncykuLi4pOworICB9CisKKyAgYmluZGVyX3N0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIF9wYXJjZWwpOworICBiaW5kZXJfc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChBUGFyY2VsKiBfcGFyY2VsKSBjb25zdDsKKworICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEVudW1VbmlvbiYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIF92YWx1ZSAhPSByaHMuX3ZhbHVlOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBFbnVtVW5pb24mIHJocykgY29uc3QgeworICAgIHJldHVybiBfdmFsdWUgPCByaHMuX3ZhbHVlOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgRW51bVVuaW9uJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gX3ZhbHVlIDw9IHJocy5fdmFsdWU7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBFbnVtVW5pb24mIHJocykgY29uc3QgeworICAgIHJldHVybiBfdmFsdWUgPT0gcmhzLl92YWx1ZTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgRW51bVVuaW9uJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gX3ZhbHVlID4gcmhzLl92YWx1ZTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IEVudW1VbmlvbiYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIF92YWx1ZSA+PSByaHMuX3ZhbHVlOworICB9CisKKyAgc3RhdGljIGNvbnN0IDo6bmRrOjpwYXJjZWxhYmxlX3N0YWJpbGl0eV90IF9haWRsX3N0YWJpbGl0eSA9IDo6bmRrOjpTVEFCSUxJVFlfTE9DQUw7CisgIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7CisgICAgb3MgPDwgIkVudW1VbmlvbnsiOworICAgIHN3aXRjaCAoZ2V0VGFnKCkpIHsKKyAgICBjYXNlIGludEVudW06IG9zIDw8ICJpbnRFbnVtOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGdldDxpbnRFbnVtPigpKTsgYnJlYWs7CisgICAgY2FzZSBsb25nRW51bTogb3MgPDwgImxvbmdFbnVtOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGdldDxsb25nRW51bT4oKSk7IGJyZWFrOworICAgICNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCisgICAgI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMiCisgICAgY2FzZSBkZXByZWNhdGVkRmllbGQ6IG9zIDw8ICJkZXByZWNhdGVkRmllbGQ6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoZ2V0PGRlcHJlY2F0ZWRGaWVsZD4oKSk7IGJyZWFrOworICAgICNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKKyAgICB9CisgICAgb3MgPDwgIn0iOworICAgIHJldHVybiBvcy5zdHIoKTsKKyAgfQorcHJpdmF0ZToKKyAgc3RkOjp2YXJpYW50PDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0sIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtLCBpbnQzMl90PiBfdmFsdWU7Cit9OworfSAgLy8gbmFtZXNwYWNlIHVuaW9ucworfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworbmFtZXNwYWNlIHVuaW9ucyB7CisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMiCitbW25vZGlzY2FyZF1dIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoRW51bVVuaW9uOjpUYWcgdmFsKSB7CisgIHN3aXRjaCh2YWwpIHsKKyAgY2FzZSBFbnVtVW5pb246OlRhZzo6aW50RW51bToKKyAgICByZXR1cm4gImludEVudW0iOworICBjYXNlIEVudW1Vbmlvbjo6VGFnOjpsb25nRW51bToKKyAgICByZXR1cm4gImxvbmdFbnVtIjsKKyAgY2FzZSBFbnVtVW5pb246OlRhZzo6ZGVwcmVjYXRlZEZpZWxkOgorICAgIHJldHVybiAiZGVwcmVjYXRlZEZpZWxkIjsKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gc3RkOjp0b19zdHJpbmcoc3RhdGljX2Nhc3Q8aW50MzJfdD4odmFsKSk7CisgIH0KK30KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKK30gIC8vIG5hbWVzcGFjZSB1bmlvbnMKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorbmFtZXNwYWNlIG5kayB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2MrKzE3LWV4dGVuc2lvbnMiCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdkZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIKK3RlbXBsYXRlIDw+Citjb25zdGV4cHIgaW5saW5lIHN0ZDo6YXJyYXk8YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OnVuaW9uczo6RW51bVVuaW9uOjpUYWcsIDM+IGVudW1fdmFsdWVzPGFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjp1bmlvbnM6OkVudW1Vbmlvbjo6VGFnPiA9IHsKKyAgYWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OnVuaW9uczo6RW51bVVuaW9uOjpUYWc6OmludEVudW0sCisgIGFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjp1bmlvbnM6OkVudW1Vbmlvbjo6VGFnOjpsb25nRW51bSwKKyAgYWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OnVuaW9uczo6RW51bVVuaW9uOjpUYWc6OmRlcHJlY2F0ZWRGaWVsZCwKK307CisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBuZGsKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9VbmlvbkluVW5pb24uaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9VbmlvbkluVW5pb24uaApzaW1pbGFyaXR5IGluZGV4IDY1JQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvVW5pb25JblVuaW9uLmgKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9VbmlvbkluVW5pb24uaAppbmRleCA5ZDU3YmU0Li5hNDFkZmJiIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvVW5pb25JblVuaW9uLmgKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL1VuaW9uSW5Vbmlvbi5oCkBAIC0xLDIxICsxLDIzIEBACiAjcHJhZ21hIG9uY2UKLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pbnRlcmZhY2VfdXRpbHMuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wYXJjZWxhYmxlX3V0aWxzLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfdG9fc3RyaW5nLmg+CiAKKyNpbmNsdWRlIDxhcnJheT4KICNpbmNsdWRlIDxjYXNzZXJ0PgotI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0jaW5jbHVkZSA8dmFyaWFudD4KICNpbmNsdWRlIDxjc3RkaW50PgogI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxvcHRpb25hbD4KICNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2YXJpYW50PgogI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9lbnVtcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2ludGVyZmFjZV91dGlscy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3BhcmNlbGFibGVfdXRpbHMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl90b19zdHJpbmcuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvRW51bVVuaW9uLmg+CiAjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCiAjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfc3RhYmlsaXR5Lmg+CiAjZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAotI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9FbnVtVW5pb24uaD4KIAogI2lmbmRlZiBfX0JJT05JQ19fCiAjZGVmaW5lIF9fYXNzZXJ0MihhLGIsYyxkKSAoKHZvaWQpMCkKQEAgLTMxLDE5ICszMywxOSBAQAogICB0eXBlZGVmIHN0ZDo6ZmFsc2VfdHlwZSBmaXhlZF9zaXplOwogICBzdGF0aWMgY29uc3QgY2hhciogZGVzY3JpcHRvcjsKIAotICBlbnVtIFRhZyA6IGludDMyX3QgewotICAgIGZpcnN0ID0gMCwgIC8vIGFuZHJvaWQuYWlkbC50ZXN0cy51bmlvbnMuRW51bVVuaW9uIGZpcnN0OwotICAgIHNlY29uZCwgIC8vIGludCBzZWNvbmQ7CisgIGVudW0gY2xhc3MgVGFnIDogaW50MzJfdCB7CisgICAgZmlyc3QgPSAwLAorICAgIHNlY29uZCA9IDEsCiAgIH07CiAKKyAgLy8gRXhwb3NlIHRhZyBzeW1ib2xzIGZvciBsZWdhY3kgY29kZQorICBzdGF0aWMgY29uc3QgaW5saW5lIFRhZyBmaXJzdCA9IFRhZzo6Zmlyc3Q7CisgIHN0YXRpYyBjb25zdCBpbmxpbmUgVGFnIHNlY29uZCA9IFRhZzo6c2Vjb25kOworCiAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KICAgc3RhdGljIGNvbnN0ZXhwciBib29sIF9ub3Rfc2VsZiA9ICFzdGQ6OmlzX3NhbWVfdjxzdGQ6OnJlbW92ZV9jdl90PHN0ZDo6cmVtb3ZlX3JlZmVyZW5jZV90PF9UcD4+LCBVbmlvbkluVW5pb24+OwogCi0gIFVuaW9uSW5VbmlvbigpIDogX3ZhbHVlKHN0ZDo6aW5fcGxhY2VfaW5kZXg8Zmlyc3Q+LCA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjp1bmlvbnM6OkVudW1VbmlvbigpKSB7IH0KLSAgVW5pb25JblVuaW9uKGNvbnN0IFVuaW9uSW5VbmlvbiYpID0gZGVmYXVsdDsKLSAgVW5pb25JblVuaW9uKFVuaW9uSW5VbmlvbiYmKSA9IGRlZmF1bHQ7Ci0gIFVuaW9uSW5VbmlvbiYgb3BlcmF0b3I9KGNvbnN0IFVuaW9uSW5VbmlvbiYpID0gZGVmYXVsdDsKLSAgVW5pb25JblVuaW9uJiBvcGVyYXRvcj0oVW5pb25JblVuaW9uJiYpID0gZGVmYXVsdDsKKyAgVW5pb25JblVuaW9uKCkgOiBfdmFsdWUoc3RkOjppbl9wbGFjZV9pbmRleDxzdGF0aWNfY2FzdDxzaXplX3Q+KGZpcnN0KT4sIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OnVuaW9uczo6RW51bVVuaW9uKCkpIHsgfQogCiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lID0gc3RkOjplbmFibGVfaWZfdDxfbm90X3NlbGY8X1RwPj4+CiAgIC8vIE5PTElOVE5FWFRMSU5FKGdvb2dsZS1leHBsaWNpdC1jb25zdHJ1Y3RvcikKQEAgLTU2LDEyICs1OCwxMiBAQAogCiAgIHRlbXBsYXRlIDxUYWcgX3RhZywgdHlwZW5hbWUuLi4gX1RwPgogICBzdGF0aWMgVW5pb25JblVuaW9uIG1ha2UoX1RwJiYuLi4gX2FyZ3MpIHsKLSAgICByZXR1cm4gVW5pb25JblVuaW9uKHN0ZDo6aW5fcGxhY2VfaW5kZXg8X3RhZz4sIHN0ZDo6Zm9yd2FyZDxfVHA+KF9hcmdzKS4uLik7CisgICAgcmV0dXJuIFVuaW9uSW5VbmlvbihzdGQ6OmluX3BsYWNlX2luZGV4PHN0YXRpY19jYXN0PHNpemVfdD4oX3RhZyk+LCBzdGQ6OmZvcndhcmQ8X1RwPihfYXJncykuLi4pOwogICB9CiAKICAgdGVtcGxhdGUgPFRhZyBfdGFnLCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lLi4uIF9VcD4KICAgc3RhdGljIFVuaW9uSW5VbmlvbiBtYWtlKHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxfVHA+IF9pbCwgX1VwJiYuLi4gX2FyZ3MpIHsKLSAgICByZXR1cm4gVW5pb25JblVuaW9uKHN0ZDo6aW5fcGxhY2VfaW5kZXg8X3RhZz4sIHN0ZDo6bW92ZShfaWwpLCBzdGQ6OmZvcndhcmQ8X1VwPihfYXJncykuLi4pOworICAgIHJldHVybiBVbmlvbkluVW5pb24oc3RkOjppbl9wbGFjZV9pbmRleDxzdGF0aWNfY2FzdDxzaXplX3Q+KF90YWcpPiwgc3RkOjptb3ZlKF9pbCksIHN0ZDo6Zm9yd2FyZDxfVXA+KF9hcmdzKS4uLik7CiAgIH0KIAogICBUYWcgZ2V0VGFnKCkgY29uc3QgewpAQCAtNzEsMTggKzczLDE4IEBACiAgIHRlbXBsYXRlIDxUYWcgX3RhZz4KICAgY29uc3QgYXV0byYgZ2V0KCkgY29uc3QgewogICAgIGlmIChnZXRUYWcoKSAhPSBfdGFnKSB7IF9fYXNzZXJ0MihfX0ZJTEVfXywgX19MSU5FX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18sICJiYWQgYWNjZXNzOiBhIHdyb25nIHRhZyIpOyB9Ci0gICAgcmV0dXJuIHN0ZDo6Z2V0PF90YWc+KF92YWx1ZSk7CisgICAgcmV0dXJuIHN0ZDo6Z2V0PHN0YXRpY19jYXN0PHNpemVfdD4oX3RhZyk+KF92YWx1ZSk7CiAgIH0KIAogICB0ZW1wbGF0ZSA8VGFnIF90YWc+CiAgIGF1dG8mIGdldCgpIHsKICAgICBpZiAoZ2V0VGFnKCkgIT0gX3RhZykgeyBfX2Fzc2VydDIoX19GSUxFX18sIF9fTElORV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fLCAiYmFkIGFjY2VzczogYSB3cm9uZyB0YWciKTsgfQotICAgIHJldHVybiBzdGQ6OmdldDxfdGFnPihfdmFsdWUpOworICAgIHJldHVybiBzdGQ6OmdldDxzdGF0aWNfY2FzdDxzaXplX3Q+KF90YWcpPihfdmFsdWUpOwogICB9CiAKICAgdGVtcGxhdGUgPFRhZyBfdGFnLCB0eXBlbmFtZS4uLiBfVHA+CiAgIHZvaWQgc2V0KF9UcCYmLi4uIF9hcmdzKSB7Ci0gICAgX3ZhbHVlLmVtcGxhY2U8X3RhZz4oc3RkOjpmb3J3YXJkPF9UcD4oX2FyZ3MpLi4uKTsKKyAgICBfdmFsdWUuZW1wbGFjZTxzdGF0aWNfY2FzdDxzaXplX3Q+KF90YWcpPihzdGQ6OmZvcndhcmQ8X1RwPihfYXJncykuLi4pOwogICB9CiAKICAgYmluZGVyX3N0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIF9wYXJjZWwpOwpAQCAtMTI2LDMgKzEyOCwzNSBAQAogfSAgLy8gbmFtZXNwYWNlIGFpZGwKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAorbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK25hbWVzcGFjZSB1bmlvbnMgeworW1tub2Rpc2NhcmRdXSBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKFVuaW9uSW5Vbmlvbjo6VGFnIHZhbCkgeworICBzd2l0Y2godmFsKSB7CisgIGNhc2UgVW5pb25JblVuaW9uOjpUYWc6OmZpcnN0OgorICAgIHJldHVybiAiZmlyc3QiOworICBjYXNlIFVuaW9uSW5Vbmlvbjo6VGFnOjpzZWNvbmQ6CisgICAgcmV0dXJuICJzZWNvbmQiOworICBkZWZhdWx0OgorICAgIHJldHVybiBzdGQ6OnRvX3N0cmluZyhzdGF0aWNfY2FzdDxpbnQzMl90Pih2YWwpKTsKKyAgfQorfQorfSAgLy8gbmFtZXNwYWNlIHVuaW9ucworfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCituYW1lc3BhY2UgbmRrIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XYysrMTctZXh0ZW5zaW9ucyIKK3RlbXBsYXRlIDw+Citjb25zdGV4cHIgaW5saW5lIHN0ZDo6YXJyYXk8YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OnVuaW9uczo6VW5pb25JblVuaW9uOjpUYWcsIDI+IGVudW1fdmFsdWVzPGFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjp1bmlvbnM6OlVuaW9uSW5Vbmlvbjo6VGFnPiA9IHsKKyAgYWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OnVuaW9uczo6VW5pb25JblVuaW9uOjpUYWc6OmZpcnN0LAorICBhaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6dW5pb25zOjpVbmlvbkluVW5pb246OlRhZzo6c2Vjb25kLAorfTsKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIG5kawpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL3RpbWVzdGFtcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi90aW1lc3RhbXAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi90aW1lc3RhbXAKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi90aW1lc3RhbXAKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvRGVwcmVjYXRlZFBhcmNlbGFibGUuY3BwIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9EZXByZWNhdGVkUGFyY2VsYWJsZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzZmM2YzIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9EZXByZWNhdGVkUGFyY2VsYWJsZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jaW5jbHVkZSAiYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvRGVwcmVjYXRlZFBhcmNlbGFibGUuaCIKLQotI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3BhcmNlbF91dGlscy5oPgotCi1uYW1lc3BhY2UgYWlkbCB7Ci1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgYWlkbCB7Ci1uYW1lc3BhY2UgdGVzdHMgewotY29uc3QgY2hhciogRGVwcmVjYXRlZFBhcmNlbGFibGU6OmRlc2NyaXB0b3IgPSAiYW5kcm9pZC5haWRsLnRlc3RzLkRlcHJlY2F0ZWRQYXJjZWxhYmxlIjsKLQotYmluZGVyX3N0YXR1c190IERlcHJlY2F0ZWRQYXJjZWxhYmxlOjpyZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBwYXJjZWwpIHsKLSAgaW50MzJfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemU7Ci0gIGludDMyX3QgX2FpZGxfc3RhcnRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKTsKLSAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihwYXJjZWwsICZfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwotICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gSU5UMzJfTUFYIC0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTsKLSAgaWYgKF9haWRsX3BhcmNlbGFibGVfc2l6ZSA8IDApIHJldHVybiBTVEFUVVNfQkFEX1ZBTFVFOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci19Ci1iaW5kZXJfc3RhdHVzX3QgRGVwcmVjYXRlZFBhcmNlbGFibGU6OndyaXRlVG9QYXJjZWwoQVBhcmNlbCogcGFyY2VsKSBjb25zdCB7Ci0gIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzOwotICBzaXplX3QgX2FpZGxfc3RhcnRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKTsKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQzMihwYXJjZWwsIDApOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIHNpemVfdCBfYWlkbF9lbmRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKTsKLSAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MpOwotICBBUGFyY2VsX3dyaXRlSW50MzIocGFyY2VsLCBfYWlkbF9lbmRfcG9zIC0gX2FpZGxfc3RhcnRfcG9zKTsKLSAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9lbmRfcG9zKTsKLSAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0cwotfSAgLy8gbmFtZXNwYWNlIGFpZGwKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi19ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9PdGhlclBhcmNlbGFibGVGb3JUb1N0cmluZy5jcHAgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL090aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTczMjJkOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL090aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLSNpbmNsdWRlICJhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9PdGhlclBhcmNlbGFibGVGb3JUb1N0cmluZy5oIgotCi0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcGFyY2VsX3V0aWxzLmg+Ci0KLW5hbWVzcGFjZSBhaWRsIHsKLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBhaWRsIHsKLW5hbWVzcGFjZSB0ZXN0cyB7Ci1jb25zdCBjaGFyKiBPdGhlclBhcmNlbGFibGVGb3JUb1N0cmluZzo6ZGVzY3JpcHRvciA9ICJhbmRyb2lkLmFpZGwudGVzdHMuT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmciOwotCi1iaW5kZXJfc3RhdHVzX3QgT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmc6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIHBhcmNlbCkgewotICBpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfc2l6ZTsKLSAgaW50MzJfdCBfYWlkbF9zdGFydF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpOwotICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyKHBhcmNlbCwgJl9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gIGlmIChfYWlkbF9zdGFydF9wb3MgPiBJTlQzMl9NQVggLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybiBTVEFUVVNfQkFEX1ZBTFVFOwotICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9zaXplIDwgMCkgcmV0dXJuIFNUQVRVU19CQURfVkFMVUU7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7Ci0gICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwotICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotICB9Ci0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkU3RyaW5nKHBhcmNlbCwgJmZpZWxkKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotfQotYmluZGVyX3N0YXR1c190IE90aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nOjp3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIHBhcmNlbCkgY29uc3QgewotICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1czsKLSAgc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCk7Ci0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIocGFyY2VsLCAwKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVTdHJpbmcocGFyY2VsLCBmaWVsZCk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgc2l6ZV90IF9haWRsX2VuZF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpOwotICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3Bvcyk7Ci0gIEFQYXJjZWxfd3JpdGVJbnQzMihwYXJjZWwsIF9haWRsX2VuZF9wb3MgLSBfYWlkbF9zdGFydF9wb3MpOwotICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX2VuZF9wb3MpOwotICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RzCi19ICAvLyBuYW1lc3BhY2UgYWlkbAotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLX0gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1BhcmNlbGFibGVGb3JUb1N0cmluZy5jcHAgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1BhcmNlbGFibGVGb3JUb1N0cmluZy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1YWQwYTcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9QYXJjZWxhYmxlRm9yVG9TdHJpbmcuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjY4ICswLDAgQEAKLSNpbmNsdWRlICJhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9QYXJjZWxhYmxlRm9yVG9TdHJpbmcuaCIKLQotI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3BhcmNlbF91dGlscy5oPgotCi1uYW1lc3BhY2UgYWlkbCB7Ci1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgYWlkbCB7Ci1uYW1lc3BhY2UgdGVzdHMgewotY29uc3QgY2hhciogUGFyY2VsYWJsZUZvclRvU3RyaW5nOjpkZXNjcmlwdG9yID0gImFuZHJvaWQuYWlkbC50ZXN0cy5QYXJjZWxhYmxlRm9yVG9TdHJpbmciOwotCi1iaW5kZXJfc3RhdHVzX3QgUGFyY2VsYWJsZUZvclRvU3RyaW5nOjpyZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBwYXJjZWwpIHsKLSAgaW50MzJfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemU7Ci0gIGludDMyX3QgX2FpZGxfc3RhcnRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKTsKLSAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihwYXJjZWwsICZfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwotICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gSU5UMzJfTUFYIC0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTsKLSAgaWYgKF9haWRsX3BhcmNlbGFibGVfc2l6ZSA8IDApIHJldHVybiBTVEFUVVNfQkFEX1ZBTFVFOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewotICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLSAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzIocGFyY2VsLCAmaW50VmFsdWUpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewotICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLSAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihwYXJjZWwsICZpbnRBcnJheSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7Ci0gICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwotICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotICB9Ci0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQ2NChwYXJjZWwsICZsb25nVmFsdWUpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewotICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLSAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihwYXJjZWwsICZsb25nQXJyYXkpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewotICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLSAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkRG91YmxlKHBhcmNlbCwgJmRvdWJsZVZhbHVlKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IocGFyY2VsLCAmZG91YmxlQXJyYXkpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewotICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLSAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkRmxvYXQocGFyY2VsLCAmZmxvYXRWYWx1ZSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7Ci0gICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwotICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotICB9Ci0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKHBhcmNlbCwgJmZsb2F0QXJyYXkpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewotICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLSAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkQnl0ZShwYXJjZWwsICZieXRlVmFsdWUpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewotICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLSAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihwYXJjZWwsICZieXRlQXJyYXkpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewotICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLSAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkQm9vbChwYXJjZWwsICZib29sZWFuVmFsdWUpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewotICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLSAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihwYXJjZWwsICZib29sZWFuQXJyYXkpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewotICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLSAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFN0cmluZyhwYXJjZWwsICZzdHJpbmdWYWx1ZSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7Ci0gICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwotICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotICB9Ci0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKHBhcmNlbCwgJnN0cmluZ0FycmF5KTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IocGFyY2VsLCAmc3RyaW5nTGlzdCk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7Ci0gICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwotICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotICB9Ci0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkUGFyY2VsYWJsZShwYXJjZWwsICZwYXJjZWxhYmxlVmFsdWUpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewotICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLSAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihwYXJjZWwsICZwYXJjZWxhYmxlQXJyYXkpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewotICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLSAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzIocGFyY2VsLCByZWludGVycHJldF9jYXN0PGludDMyX3QqPigmZW51bVZhbHVlKSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7Ci0gICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwotICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotICB9Ci0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMkFycmF5KHBhcmNlbCwgc3RhdGljX2Nhc3Q8dm9pZCo+KCZlbnVtQXJyYXkpLCBuZGs6OkFQYXJjZWxfc3RkVmVjdG9yQWxsb2NhdG9yPGludDMyX3Q+KTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IocGFyY2VsLCAmbnVsbEFycmF5KTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IocGFyY2VsLCAmbnVsbExpc3QpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewotICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLSAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFBhcmNlbGFibGUocGFyY2VsLCAmcGFyY2VsYWJsZUdlbmVyaWMpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewotICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLSAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFBhcmNlbGFibGUocGFyY2VsLCAmdW5pb25WYWx1ZSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwotICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLX0KLWJpbmRlcl9zdGF0dXNfdCBQYXJjZWxhYmxlRm9yVG9TdHJpbmc6OndyaXRlVG9QYXJjZWwoQVBhcmNlbCogcGFyY2VsKSBjb25zdCB7Ci0gIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzOwotICBzaXplX3QgX2FpZGxfc3RhcnRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKTsKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQzMihwYXJjZWwsIDApOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIocGFyY2VsLCBpbnRWYWx1ZSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKHBhcmNlbCwgaW50QXJyYXkpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50NjQocGFyY2VsLCBsb25nVmFsdWUpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihwYXJjZWwsIGxvbmdBcnJheSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVEb3VibGUocGFyY2VsLCBkb3VibGVWYWx1ZSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKHBhcmNlbCwgZG91YmxlQXJyYXkpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlRmxvYXQocGFyY2VsLCBmbG9hdFZhbHVlKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IocGFyY2VsLCBmbG9hdEFycmF5KTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUJ5dGUocGFyY2VsLCBieXRlVmFsdWUpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihwYXJjZWwsIGJ5dGVBcnJheSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVCb29sKHBhcmNlbCwgYm9vbGVhblZhbHVlKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IocGFyY2VsLCBib29sZWFuQXJyYXkpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVN0cmluZyhwYXJjZWwsIHN0cmluZ1ZhbHVlKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IocGFyY2VsLCBzdHJpbmdBcnJheSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKHBhcmNlbCwgc3RyaW5nTGlzdCk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlUGFyY2VsYWJsZShwYXJjZWwsIHBhcmNlbGFibGVWYWx1ZSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKHBhcmNlbCwgcGFyY2VsYWJsZUFycmF5KTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDMyKHBhcmNlbCwgc3RhdGljX2Nhc3Q8aW50MzJfdD4oZW51bVZhbHVlKSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQzMkFycmF5KHBhcmNlbCwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBpbnQzMl90Kj4oZW51bUFycmF5LmRhdGEoKSksIGVudW1BcnJheS5zaXplKCkpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihwYXJjZWwsIG51bGxBcnJheSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKHBhcmNlbCwgbnVsbExpc3QpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVBhcmNlbGFibGUocGFyY2VsLCBwYXJjZWxhYmxlR2VuZXJpYyk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlUGFyY2VsYWJsZShwYXJjZWwsIHVuaW9uVmFsdWUpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIHNpemVfdCBfYWlkbF9lbmRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKTsKLSAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MpOwotICBBUGFyY2VsX3dyaXRlSW50MzIocGFyY2VsLCBfYWlkbF9lbmRfcG9zIC0gX2FpZGxfc3RhcnRfcG9zKTsKLSAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9lbmRfcG9zKTsKLSAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0cwotfSAgLy8gbmFtZXNwYWNlIGFpZGwKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi19ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9QYXJjZWxhYmxlRm9yVG9TdHJpbmcuY3BwLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1BhcmNlbGFibGVGb3JUb1N0cmluZy5jcHAuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjlmY2FjYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1BhcmNlbGFibGVGb3JUb1N0cmluZy5jcHAuZAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1BhcmNlbGFibGVGb3JUb1N0cmluZy5jcHAgOiBcCi0gIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9QYXJjZWxhYmxlRm9yVG9TdHJpbmcuYWlkbCBcCi0gIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9HZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGUuYWlkbCBcCi0gIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9JbnRFbnVtLmFpZGwgXAotICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmcuYWlkbCBcCi0gIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5haWRsIFwKLSAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL1VuaW9uLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvU3RydWN0dXJlZFBhcmNlbGFibGUuY3BwIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNzU4OGEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NjggKzAsMCBAQAotI2luY2x1ZGUgImFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL1N0cnVjdHVyZWRQYXJjZWxhYmxlLmgiCi0KLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wYXJjZWxfdXRpbHMuaD4KLQotbmFtZXNwYWNlIGFpZGwgewotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGFpZGwgewotbmFtZXNwYWNlIHRlc3RzIHsKLWNvbnN0IGNoYXIqIFN0cnVjdHVyZWRQYXJjZWxhYmxlOjpkZXNjcmlwdG9yID0gImFuZHJvaWQuYWlkbC50ZXN0cy5TdHJ1Y3R1cmVkUGFyY2VsYWJsZSI7Ci0KLWJpbmRlcl9zdGF0dXNfdCBTdHJ1Y3R1cmVkUGFyY2VsYWJsZTo6cmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogcGFyY2VsKSB7Ci0gIGludDMyX3QgX2FpZGxfcGFyY2VsYWJsZV9zaXplOwotICBpbnQzMl90IF9haWRsX3N0YXJ0X3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCk7Ci0gIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzIocGFyY2VsLCAmX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgaWYgKF9haWRsX3N0YXJ0X3BvcyA+IElOVDMyX01BWCAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuIFNUQVRVU19CQURfVkFMVUU7Ci0gIGlmIChfYWlkbF9wYXJjZWxhYmxlX3NpemUgPCAwKSByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IocGFyY2VsLCAmc2hvdWxkQ29udGFpblRocmVlRnMpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewotICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLSAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzIocGFyY2VsLCAmZik7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7Ci0gICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwotICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotICB9Ci0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkU3RyaW5nKHBhcmNlbCwgJnNob3VsZEJlSmVycnkpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewotICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLSAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkQnl0ZShwYXJjZWwsIHJlaW50ZXJwcmV0X2Nhc3Q8aW50OF90Kj4oJnNob3VsZEJlQnl0ZUJhcikpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewotICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLSAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzIocGFyY2VsLCByZWludGVycHJldF9jYXN0PGludDMyX3QqPigmc2hvdWxkQmVJbnRCYXIpKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDY0KHBhcmNlbCwgcmVpbnRlcnByZXRfY2FzdDxpbnQ2NF90Kj4oJnNob3VsZEJlTG9uZ0JhcikpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewotICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLSAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkQnl0ZUFycmF5KHBhcmNlbCwgc3RhdGljX2Nhc3Q8dm9pZCo+KCZzaG91bGRDb250YWluVHdvQnl0ZUZvb3MpLCBuZGs6OkFQYXJjZWxfc3RkVmVjdG9yQWxsb2NhdG9yPGludDhfdD4pOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewotICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLSAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzJBcnJheShwYXJjZWwsIHN0YXRpY19jYXN0PHZvaWQqPigmc2hvdWxkQ29udGFpblR3b0ludEZvb3MpLCBuZGs6OkFQYXJjZWxfc3RkVmVjdG9yQWxsb2NhdG9yPGludDMyX3Q+KTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDY0QXJyYXkocGFyY2VsLCBzdGF0aWNfY2FzdDx2b2lkKj4oJnNob3VsZENvbnRhaW5Ud29Mb25nRm9vcyksIG5kazo6QVBhcmNlbF9zdGRWZWN0b3JBbGxvY2F0b3I8aW50NjRfdD4pOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewotICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLSAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFN0cmluZyhwYXJjZWwsICZzdHJpbmdEZWZhdWx0c1RvRm9vKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEJ5dGUocGFyY2VsLCAmYnl0ZURlZmF1bHRzVG9Gb3VyKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyKHBhcmNlbCwgJmludERlZmF1bHRzVG9GaXZlKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDY0KHBhcmNlbCwgJmxvbmdEZWZhdWx0c1RvTmVnYXRpdmVTZXZlbik7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7Ci0gICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwotICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotICB9Ci0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRCb29sKHBhcmNlbCwgJmJvb2xlYW5EZWZhdWx0c1RvVHJ1ZSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7Ci0gICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwotICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotICB9Ci0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRDaGFyKHBhcmNlbCwgJmNoYXJEZWZhdWx0c1RvQyk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7Ci0gICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwotICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotICB9Ci0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRGbG9hdChwYXJjZWwsICZmbG9hdERlZmF1bHRzVG9QaSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7Ci0gICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwotICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotICB9Ci0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWREb3VibGUocGFyY2VsLCAmZG91YmxlV2l0aERlZmF1bHQpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewotICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLSAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihwYXJjZWwsICZhcnJheURlZmF1bHRzVG8xMjMpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewotICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLSAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihwYXJjZWwsICZhcnJheURlZmF1bHRzVG9FbXB0eSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7Ci0gICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwotICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotICB9Ci0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRCb29sKHBhcmNlbCwgJmJvb2xEZWZhdWx0KTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEJ5dGUocGFyY2VsLCAmYnl0ZURlZmF1bHQpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewotICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLSAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzIocGFyY2VsLCAmaW50RGVmYXVsdCk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7Ci0gICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwotICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotICB9Ci0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQ2NChwYXJjZWwsICZsb25nRGVmYXVsdCk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7Ci0gICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwotICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotICB9Ci0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRGbG9hdChwYXJjZWwsICZmbG9hdERlZmF1bHQpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewotICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLSAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkRG91YmxlKHBhcmNlbCwgJmRvdWJsZURlZmF1bHQpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewotICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLSAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkRG91YmxlKHBhcmNlbCwgJmNoZWNrRG91YmxlRnJvbUZsb2F0KTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IocGFyY2VsLCAmY2hlY2tTdHJpbmdBcnJheTEpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewotICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLSAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihwYXJjZWwsICZjaGVja1N0cmluZ0FycmF5Mik7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7Ci0gICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwotICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotICB9Ci0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihwYXJjZWwsICZpbnQzMl9taW4pOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewotICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLSAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzIocGFyY2VsLCAmaW50MzJfbWF4KTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDY0KHBhcmNlbCwgJmludDY0X21heCk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7Ci0gICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwotICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotICB9Ci0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihwYXJjZWwsICZoZXhJbnQzMl9uZWdfMSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7Ci0gICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwotICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotICB9Ci0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVTdHJvbmdCaW5kZXIocGFyY2VsLCAmaWJpbmRlcik7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7Ci0gICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwotICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotICB9Ci0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKHBhcmNlbCwgJmludDMyXzEpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewotICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLSAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihwYXJjZWwsICZpbnQ2NF8xKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyKHBhcmNlbCwgJmhleEludDMyX3Bvc18xKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyKHBhcmNlbCwgJmhleEludDY0X3Bvc18xKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyKHBhcmNlbCwgcmVpbnRlcnByZXRfY2FzdDxpbnQzMl90Kj4oJmNvbnN0X2V4cHJzXzEpKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyKHBhcmNlbCwgcmVpbnRlcnByZXRfY2FzdDxpbnQzMl90Kj4oJmNvbnN0X2V4cHJzXzIpKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyKHBhcmNlbCwgcmVpbnRlcnByZXRfY2FzdDxpbnQzMl90Kj4oJmNvbnN0X2V4cHJzXzMpKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyKHBhcmNlbCwgcmVpbnRlcnByZXRfY2FzdDxpbnQzMl90Kj4oJmNvbnN0X2V4cHJzXzQpKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyKHBhcmNlbCwgcmVpbnRlcnByZXRfY2FzdDxpbnQzMl90Kj4oJmNvbnN0X2V4cHJzXzUpKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyKHBhcmNlbCwgcmVpbnRlcnByZXRfY2FzdDxpbnQzMl90Kj4oJmNvbnN0X2V4cHJzXzYpKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyKHBhcmNlbCwgcmVpbnRlcnByZXRfY2FzdDxpbnQzMl90Kj4oJmNvbnN0X2V4cHJzXzcpKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyKHBhcmNlbCwgcmVpbnRlcnByZXRfY2FzdDxpbnQzMl90Kj4oJmNvbnN0X2V4cHJzXzgpKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyKHBhcmNlbCwgcmVpbnRlcnByZXRfY2FzdDxpbnQzMl90Kj4oJmNvbnN0X2V4cHJzXzkpKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyKHBhcmNlbCwgcmVpbnRlcnByZXRfY2FzdDxpbnQzMl90Kj4oJmNvbnN0X2V4cHJzXzEwKSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7Ci0gICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwotICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotICB9Ci0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkU3RyaW5nKHBhcmNlbCwgJmFkZFN0cmluZzEpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewotICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLSAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFN0cmluZyhwYXJjZWwsICZhZGRTdHJpbmcyKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyKHBhcmNlbCwgJnNob3VsZFNldEJpdDBBbmRCaXQyKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZVBhcmNlbGFibGUocGFyY2VsLCAmdSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7Ci0gICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwotICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotICB9Ci0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVQYXJjZWxhYmxlKHBhcmNlbCwgJnNob3VsZEJlQ29uc3RTMSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7Ci0gICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwotICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotICB9Ci0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihwYXJjZWwsIHJlaW50ZXJwcmV0X2Nhc3Q8aW50MzJfdCo+KCZkZWZhdWx0V2l0aEZvbykpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci19Ci1iaW5kZXJfc3RhdHVzX3QgU3RydWN0dXJlZFBhcmNlbGFibGU6OndyaXRlVG9QYXJjZWwoQVBhcmNlbCogcGFyY2VsKSBjb25zdCB7Ci0gIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzOwotICBzaXplX3QgX2FpZGxfc3RhcnRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKTsKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQzMihwYXJjZWwsIDApOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihwYXJjZWwsIHNob3VsZENvbnRhaW5UaHJlZUZzKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDMyKHBhcmNlbCwgZik7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlU3RyaW5nKHBhcmNlbCwgc2hvdWxkQmVKZXJyeSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVCeXRlKHBhcmNlbCwgc3RhdGljX2Nhc3Q8aW50OF90PihzaG91bGRCZUJ5dGVCYXIpKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDMyKHBhcmNlbCwgc3RhdGljX2Nhc3Q8aW50MzJfdD4oc2hvdWxkQmVJbnRCYXIpKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDY0KHBhcmNlbCwgc3RhdGljX2Nhc3Q8aW50NjRfdD4oc2hvdWxkQmVMb25nQmFyKSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVCeXRlQXJyYXkocGFyY2VsLCByZWludGVycHJldF9jYXN0PGNvbnN0IGludDhfdCo+KHNob3VsZENvbnRhaW5Ud29CeXRlRm9vcy5kYXRhKCkpLCBzaG91bGRDb250YWluVHdvQnl0ZUZvb3Muc2l6ZSgpKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDMyQXJyYXkocGFyY2VsLCByZWludGVycHJldF9jYXN0PGNvbnN0IGludDMyX3QqPihzaG91bGRDb250YWluVHdvSW50Rm9vcy5kYXRhKCkpLCBzaG91bGRDb250YWluVHdvSW50Rm9vcy5zaXplKCkpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50NjRBcnJheShwYXJjZWwsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgaW50NjRfdCo+KHNob3VsZENvbnRhaW5Ud29Mb25nRm9vcy5kYXRhKCkpLCBzaG91bGRDb250YWluVHdvTG9uZ0Zvb3Muc2l6ZSgpKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVTdHJpbmcocGFyY2VsLCBzdHJpbmdEZWZhdWx0c1RvRm9vKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUJ5dGUocGFyY2VsLCBieXRlRGVmYXVsdHNUb0ZvdXIpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIocGFyY2VsLCBpbnREZWZhdWx0c1RvRml2ZSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQ2NChwYXJjZWwsIGxvbmdEZWZhdWx0c1RvTmVnYXRpdmVTZXZlbik7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVCb29sKHBhcmNlbCwgYm9vbGVhbkRlZmF1bHRzVG9UcnVlKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUNoYXIocGFyY2VsLCBjaGFyRGVmYXVsdHNUb0MpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlRmxvYXQocGFyY2VsLCBmbG9hdERlZmF1bHRzVG9QaSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVEb3VibGUocGFyY2VsLCBkb3VibGVXaXRoRGVmYXVsdCk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKHBhcmNlbCwgYXJyYXlEZWZhdWx0c1RvMTIzKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IocGFyY2VsLCBhcnJheURlZmF1bHRzVG9FbXB0eSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVCb29sKHBhcmNlbCwgYm9vbERlZmF1bHQpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlQnl0ZShwYXJjZWwsIGJ5dGVEZWZhdWx0KTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDMyKHBhcmNlbCwgaW50RGVmYXVsdCk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQ2NChwYXJjZWwsIGxvbmdEZWZhdWx0KTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUZsb2F0KHBhcmNlbCwgZmxvYXREZWZhdWx0KTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZURvdWJsZShwYXJjZWwsIGRvdWJsZURlZmF1bHQpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlRG91YmxlKHBhcmNlbCwgY2hlY2tEb3VibGVGcm9tRmxvYXQpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihwYXJjZWwsIGNoZWNrU3RyaW5nQXJyYXkxKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IocGFyY2VsLCBjaGVja1N0cmluZ0FycmF5Mik7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQzMihwYXJjZWwsIGludDMyX21pbik7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQzMihwYXJjZWwsIGludDMyX21heCk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQ2NChwYXJjZWwsIGludDY0X21heCk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQzMihwYXJjZWwsIGhleEludDMyX25lZ18xKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZVN0cm9uZ0JpbmRlcihwYXJjZWwsIGliaW5kZXIpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihwYXJjZWwsIGludDMyXzEpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihwYXJjZWwsIGludDY0XzEpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIocGFyY2VsLCBoZXhJbnQzMl9wb3NfMSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQzMihwYXJjZWwsIGhleEludDY0X3Bvc18xKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDMyKHBhcmNlbCwgc3RhdGljX2Nhc3Q8aW50MzJfdD4oY29uc3RfZXhwcnNfMSkpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIocGFyY2VsLCBzdGF0aWNfY2FzdDxpbnQzMl90Pihjb25zdF9leHByc18yKSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQzMihwYXJjZWwsIHN0YXRpY19jYXN0PGludDMyX3Q+KGNvbnN0X2V4cHJzXzMpKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDMyKHBhcmNlbCwgc3RhdGljX2Nhc3Q8aW50MzJfdD4oY29uc3RfZXhwcnNfNCkpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIocGFyY2VsLCBzdGF0aWNfY2FzdDxpbnQzMl90Pihjb25zdF9leHByc181KSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQzMihwYXJjZWwsIHN0YXRpY19jYXN0PGludDMyX3Q+KGNvbnN0X2V4cHJzXzYpKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDMyKHBhcmNlbCwgc3RhdGljX2Nhc3Q8aW50MzJfdD4oY29uc3RfZXhwcnNfNykpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIocGFyY2VsLCBzdGF0aWNfY2FzdDxpbnQzMl90Pihjb25zdF9leHByc184KSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQzMihwYXJjZWwsIHN0YXRpY19jYXN0PGludDMyX3Q+KGNvbnN0X2V4cHJzXzkpKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDMyKHBhcmNlbCwgc3RhdGljX2Nhc3Q8aW50MzJfdD4oY29uc3RfZXhwcnNfMTApKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVTdHJpbmcocGFyY2VsLCBhZGRTdHJpbmcxKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVTdHJpbmcocGFyY2VsLCBhZGRTdHJpbmcyKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDMyKHBhcmNlbCwgc2hvdWxkU2V0Qml0MEFuZEJpdDIpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlUGFyY2VsYWJsZShwYXJjZWwsIHUpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlUGFyY2VsYWJsZShwYXJjZWwsIHNob3VsZEJlQ29uc3RTMSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQzMihwYXJjZWwsIHN0YXRpY19jYXN0PGludDMyX3Q+KGRlZmF1bHRXaXRoRm9vKSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgc2l6ZV90IF9haWRsX2VuZF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpOwotICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3Bvcyk7Ci0gIEFQYXJjZWxfd3JpdGVJbnQzMihwYXJjZWwsIF9haWRsX2VuZF9wb3MgLSBfYWlkbF9zdGFydF9wb3MpOwotICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX2VuZF9wb3MpOwotICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RzCi19ICAvLyBuYW1lc3BhY2UgYWlkbAotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLX0gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9FbnVtVW5pb24uY3BwIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvRW51bVVuaW9uLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVmN2M2OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9FbnVtVW5pb24uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotI2luY2x1ZGUgImFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9FbnVtVW5pb24uaCIKLQotI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3BhcmNlbF91dGlscy5oPgotCi1uYW1lc3BhY2UgYWlkbCB7Ci1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgYWlkbCB7Ci1uYW1lc3BhY2UgdGVzdHMgewotbmFtZXNwYWNlIHVuaW9ucyB7Ci1jb25zdCBjaGFyKiBFbnVtVW5pb246OmRlc2NyaXB0b3IgPSAiYW5kcm9pZC5haWRsLnRlc3RzLnVuaW9ucy5FbnVtVW5pb24iOwotCi1iaW5kZXJfc3RhdHVzX3QgRW51bVVuaW9uOjpyZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBfcGFyY2VsKSB7Ci0gIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzOwotICBpbnQzMl90IF9haWRsX3RhZzsKLSAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzIoX3BhcmNlbCwgJl9haWRsX3RhZykpICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIHN3aXRjaCAoX2FpZGxfdGFnKSB7Ci0gIGNhc2UgaW50RW51bTogewotICAgIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0gX2FpZGxfdmFsdWU7Ci0gICAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzIoX3BhcmNlbCwgcmVpbnRlcnByZXRfY2FzdDxpbnQzMl90Kj4oJl9haWRsX3ZhbHVlKSkpICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gICAgaWYgY29uc3RleHByIChzdGQ6OmlzX3RyaXZpYWxseV9jb3B5YWJsZV92PDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0+KSB7Ci0gICAgICBzZXQ8aW50RW51bT4oX2FpZGxfdmFsdWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBOT0xJTlRORVhUTElORShwZXJmb3JtYW5jZS1tb3ZlLWNvbnN0LWFyZykKLSAgICAgIHNldDxpbnRFbnVtPihzdGQ6Om1vdmUoX2FpZGxfdmFsdWUpKTsKLSAgICB9Ci0gICAgcmV0dXJuIFNUQVRVU19PSzsgfQotICBjYXNlIGxvbmdFbnVtOiB7Ci0gICAgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0gX2FpZGxfdmFsdWU7Ci0gICAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50NjQoX3BhcmNlbCwgcmVpbnRlcnByZXRfY2FzdDxpbnQ2NF90Kj4oJl9haWRsX3ZhbHVlKSkpICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gICAgaWYgY29uc3RleHByIChzdGQ6OmlzX3RyaXZpYWxseV9jb3B5YWJsZV92PDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtPikgewotICAgICAgc2V0PGxvbmdFbnVtPihfYWlkbF92YWx1ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIE5PTElOVE5FWFRMSU5FKHBlcmZvcm1hbmNlLW1vdmUtY29uc3QtYXJnKQotICAgICAgc2V0PGxvbmdFbnVtPihzdGQ6Om1vdmUoX2FpZGxfdmFsdWUpKTsKLSAgICB9Ci0gICAgcmV0dXJuIFNUQVRVU19PSzsgfQotICB9Ci0gIHJldHVybiBTVEFUVVNfQkFEX1ZBTFVFOwotfQotYmluZGVyX3N0YXR1c190IEVudW1Vbmlvbjo6d3JpdGVUb1BhcmNlbChBUGFyY2VsKiBfcGFyY2VsKSBjb25zdCB7Ci0gIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDMyKF9wYXJjZWwsIGdldFRhZygpKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLSAgc3dpdGNoIChnZXRUYWcoKSkgewotICBjYXNlIGludEVudW06IHJldHVybiBBUGFyY2VsX3dyaXRlSW50MzIoX3BhcmNlbCwgc3RhdGljX2Nhc3Q8aW50MzJfdD4oZ2V0PGludEVudW0+KCkpKTsKLSAgY2FzZSBsb25nRW51bTogcmV0dXJuIEFQYXJjZWxfd3JpdGVJbnQ2NChfcGFyY2VsLCBzdGF0aWNfY2FzdDxpbnQ2NF90PihnZXQ8bG9uZ0VudW0+KCkpKTsKLSAgfQotICBfX2Fzc2VydDIoX19GSUxFX18sIF9fTElORV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fLCAiY2FuJ3QgcmVhY2ggaGVyZSIpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgdW5pb25zCi19ICAvLyBuYW1lc3BhY2UgdGVzdHMKLX0gIC8vIG5hbWVzcGFjZSBhaWRsCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL1VuaW9uSW5Vbmlvbi5jcHAuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL1VuaW9uSW5Vbmlvbi5jcHAuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI0MTMxOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9VbmlvbkluVW5pb24uY3BwLmQKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLW91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvVW5pb25JblVuaW9uLmNwcCA6IFwKLSAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9VbmlvbkluVW5pb24uYWlkbCBcCi0gIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvRW51bVVuaW9uLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuRGVwcmVjYXRlZC5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5EZXByZWNhdGVkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiNmYwNDIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5EZXByZWNhdGVkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgImFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0lEZXByZWNhdGVkLmgiCi0KLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pYmluZGVyLmg+Ci0KLW5hbWVzcGFjZSBhaWRsIHsKLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBhaWRsIHsKLW5hbWVzcGFjZSB0ZXN0cyB7Ci1jbGFzcyBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKCJ0ZXN0IikpKSBCbkRlcHJlY2F0ZWQgOiBwdWJsaWMgOjpuZGs6OkJuQ0ludGVyZmFjZTxJRGVwcmVjYXRlZD4gewotcHVibGljOgotICBCbkRlcHJlY2F0ZWQoKTsKLSAgdmlydHVhbCB+Qm5EZXByZWNhdGVkKCk7Ci1wcm90ZWN0ZWQ6Ci0gIDo6bmRrOjpTcEFJQmluZGVyIGNyZWF0ZUJpbmRlcigpIG92ZXJyaWRlOwotcHJpdmF0ZToKLX07Ci19ICAvLyBuYW1lc3BhY2UgdGVzdHMKLX0gIC8vIG5hbWVzcGFjZSBhaWRsCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuTmFtZWRDYWxsYmFjay5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5OYW1lZENhbGxiYWNrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMzhhMjguLjAwMDAwMDAKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5OYW1lZENhbGxiYWNrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgImFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0lOYW1lZENhbGxiYWNrLmgiCi0KLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pYmluZGVyLmg+Ci0KLW5hbWVzcGFjZSBhaWRsIHsKLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBhaWRsIHsKLW5hbWVzcGFjZSB0ZXN0cyB7Ci1jbGFzcyBCbk5hbWVkQ2FsbGJhY2sgOiBwdWJsaWMgOjpuZGs6OkJuQ0ludGVyZmFjZTxJTmFtZWRDYWxsYmFjaz4gewotcHVibGljOgotICBCbk5hbWVkQ2FsbGJhY2soKTsKLSAgdmlydHVhbCB+Qm5OYW1lZENhbGxiYWNrKCk7Ci1wcm90ZWN0ZWQ6Ci0gIDo6bmRrOjpTcEFJQmluZGVyIGNyZWF0ZUJpbmRlcigpIG92ZXJyaWRlOwotcHJpdmF0ZToKLX07Ci19ICAvLyBuYW1lc3BhY2UgdGVzdHMKLX0gIC8vIG5hbWVzcGFjZSBhaWRsCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuTmV3TmFtZS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5OZXdOYW1lLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyZDhhN2IuLjAwMDAwMDAKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5OZXdOYW1lLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgImFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0lOZXdOYW1lLmgiCi0KLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pYmluZGVyLmg+Ci0KLW5hbWVzcGFjZSBhaWRsIHsKLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBhaWRsIHsKLW5hbWVzcGFjZSB0ZXN0cyB7Ci1jbGFzcyBCbk5ld05hbWUgOiBwdWJsaWMgOjpuZGs6OkJuQ0ludGVyZmFjZTxJTmV3TmFtZT4gewotcHVibGljOgotICBCbk5ld05hbWUoKTsKLSAgdmlydHVhbCB+Qm5OZXdOYW1lKCk7Ci1wcm90ZWN0ZWQ6Ci0gIDo6bmRrOjpTcEFJQmluZGVyIGNyZWF0ZUJpbmRlcigpIG92ZXJyaWRlOwotcHJpdmF0ZToKLX07Ci19ICAvLyBuYW1lc3BhY2UgdGVzdHMKLX0gIC8vIG5hbWVzcGFjZSBhaWRsCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuT2xkTmFtZS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5PbGROYW1lLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNzgyZDEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5PbGROYW1lLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgImFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0lPbGROYW1lLmgiCi0KLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pYmluZGVyLmg+Ci0KLW5hbWVzcGFjZSBhaWRsIHsKLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBhaWRsIHsKLW5hbWVzcGFjZSB0ZXN0cyB7Ci1jbGFzcyBCbk9sZE5hbWUgOiBwdWJsaWMgOjpuZGs6OkJuQ0ludGVyZmFjZTxJT2xkTmFtZT4gewotcHVibGljOgotICBCbk9sZE5hbWUoKTsKLSAgdmlydHVhbCB+Qm5PbGROYW1lKCk7Ci1wcm90ZWN0ZWQ6Ci0gIDo6bmRrOjpTcEFJQmluZGVyIGNyZWF0ZUJpbmRlcigpIG92ZXJyaWRlOwotcHJpdmF0ZToKLX07Ci19ICAvLyBuYW1lc3BhY2UgdGVzdHMKLX0gIC8vIG5hbWVzcGFjZSBhaWRsCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuVGVzdFNlcnZpY2UuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuVGVzdFNlcnZpY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMzNTkyYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CblRlc3RTZXJ2aWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgImFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0lUZXN0U2VydmljZS5oIgotCi0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaWJpbmRlci5oPgotCi1uYW1lc3BhY2UgYWlkbCB7Ci1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgYWlkbCB7Ci1uYW1lc3BhY2UgdGVzdHMgewotY2xhc3MgQm5UZXN0U2VydmljZSA6IHB1YmxpYyA6Om5kazo6Qm5DSW50ZXJmYWNlPElUZXN0U2VydmljZT4gewotcHVibGljOgotICBCblRlc3RTZXJ2aWNlKCk7Ci0gIHZpcnR1YWwgfkJuVGVzdFNlcnZpY2UoKTsKLXByb3RlY3RlZDoKLSAgOjpuZGs6OlNwQUlCaW5kZXIgY3JlYXRlQmluZGVyKCkgb3ZlcnJpZGU7Ci1wcml2YXRlOgotfTsKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0cwotfSAgLy8gbmFtZXNwYWNlIGFpZGwKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi19ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvSVRlc3RTZXJ2aWNlLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9JVGVzdFNlcnZpY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJmODEzMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9JVGVzdFNlcnZpY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDI3OCArMCwwIEBACi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2ludGVyZmFjZV91dGlscy5oPgotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8b3B0aW9uYWw+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9zdGFiaWxpdHkuaD4KLSNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCi0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcGFyY2VsX3BsYXRmb3JtLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaWJpbmRlcl9wbGF0Zm9ybS5oPgotI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JhY2tlbmRUeXBlLmg+Ci0jaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnl0ZUVudW0uaD4KLSNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9JTmFtZWRDYWxsYmFjay5oPgotI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0lOZXdOYW1lLmg+Ci0jaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvSU9sZE5hbWUuaD4KLSNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9JbnRFbnVtLmg+Ci0jaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvTG9uZ0VudW0uaD4KLSNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5oPgotCi1uYW1lc3BhY2UgYWlkbCB7Ci1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgYWlkbCB7Ci1uYW1lc3BhY2UgdGVzdHMgewotY2xhc3MgSVRlc3RTZXJ2aWNlIDogcHVibGljIDo6bmRrOjpJQ0ludGVyZmFjZSB7Ci1wdWJsaWM6Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBkZXNjcmlwdG9yOwotICBJVGVzdFNlcnZpY2UoKTsKLSAgdmlydHVhbCB+SVRlc3RTZXJ2aWNlKCk7Ci0KLSAgZW51bSA6IGludDMyX3QgeyBURVNUX0NPTlNUQU5UID0gNDIgfTsKLSAgZW51bSA6IGludDMyX3QgeyBURVNUX0NPTlNUQU5UMiA9IC00MiB9OwotICBlbnVtIDogaW50MzJfdCB7IFRFU1RfQ09OU1RBTlQzID0gNDIgfTsKLSAgZW51bSA6IGludDMyX3QgeyBURVNUX0NPTlNUQU5UNCA9IDQgfTsKLSAgZW51bSA6IGludDMyX3QgeyBURVNUX0NPTlNUQU5UNSA9IC00IH07Ci0gIGVudW0gOiBpbnQzMl90IHsgVEVTVF9DT05TVEFOVDYgPSAwIH07Ci0gIGVudW0gOiBpbnQzMl90IHsgVEVTVF9DT05TVEFOVDcgPSAwIH07Ci0gIGVudW0gOiBpbnQzMl90IHsgVEVTVF9DT05TVEFOVDggPSAwIH07Ci0gIGVudW0gOiBpbnQzMl90IHsgVEVTVF9DT05TVEFOVDkgPSA4NiB9OwotICBlbnVtIDogaW50MzJfdCB7IFRFU1RfQ09OU1RBTlQxMCA9IDE2NSB9OwotICBlbnVtIDogaW50MzJfdCB7IFRFU1RfQ09OU1RBTlQxMSA9IDI1MCB9OwotICBlbnVtIDogaW50MzJfdCB7IFRFU1RfQ09OU1RBTlQxMiA9IC0xIH07Ci0gIGVudW0gOiBpbnQ4X3QgeyBCWVRFX1RFU1RfQ09OU1RBTlQgPSAxNyB9OwotICBlbnVtIDogaW50NjRfdCB7IExPTkdfVEVTVF9DT05TVEFOVCA9IDEwOTk1MTE2Mjc3NzZMIH07Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBTVFJJTkdfVEVTVF9DT05TVEFOVDsKLSAgc3RhdGljIGNvbnN0IGNoYXIqIFNUUklOR19URVNUX0NPTlNUQU5UMjsKLSAgc3RhdGljIGNvbnN0IGNoYXIqIFNUUklOR19URVNUX0NPTlNUQU5UX1VURjg7Ci0gIGVudW0gOiBpbnQzMl90IHsgQTEgPSAxIH07Ci0gIGVudW0gOiBpbnQzMl90IHsgQTIgPSAxIH07Ci0gIGVudW0gOiBpbnQzMl90IHsgQTMgPSAxIH07Ci0gIGVudW0gOiBpbnQzMl90IHsgQTQgPSAxIH07Ci0gIGVudW0gOiBpbnQzMl90IHsgQTUgPSAxIH07Ci0gIGVudW0gOiBpbnQzMl90IHsgQTYgPSAxIH07Ci0gIGVudW0gOiBpbnQzMl90IHsgQTcgPSAxIH07Ci0gIGVudW0gOiBpbnQzMl90IHsgQTggPSAxIH07Ci0gIGVudW0gOiBpbnQzMl90IHsgQTkgPSAxIH07Ci0gIGVudW0gOiBpbnQzMl90IHsgQTEwID0gMSB9OwotICBlbnVtIDogaW50MzJfdCB7IEExMSA9IDEgfTsKLSAgZW51bSA6IGludDMyX3QgeyBBMTIgPSAxIH07Ci0gIGVudW0gOiBpbnQzMl90IHsgQTEzID0gMSB9OwotICBlbnVtIDogaW50MzJfdCB7IEExNCA9IDEgfTsKLSAgZW51bSA6IGludDMyX3QgeyBBMTUgPSAxIH07Ci0gIGVudW0gOiBpbnQzMl90IHsgQTE2ID0gMSB9OwotICBlbnVtIDogaW50MzJfdCB7IEExNyA9IDEgfTsKLSAgZW51bSA6IGludDMyX3QgeyBBMTggPSAxIH07Ci0gIGVudW0gOiBpbnQzMl90IHsgQTE5ID0gMSB9OwotICBlbnVtIDogaW50MzJfdCB7IEEyMCA9IDEgfTsKLSAgZW51bSA6IGludDMyX3QgeyBBMjEgPSAxIH07Ci0gIGVudW0gOiBpbnQzMl90IHsgQTIyID0gMSB9OwotICBlbnVtIDogaW50MzJfdCB7IEEyMyA9IDEgfTsKLSAgZW51bSA6IGludDMyX3QgeyBBMjQgPSAxIH07Ci0gIGVudW0gOiBpbnQzMl90IHsgQTI1ID0gMSB9OwotICBlbnVtIDogaW50MzJfdCB7IEEyNiA9IDEgfTsKLSAgZW51bSA6IGludDMyX3QgeyBBMjcgPSAxIH07Ci0gIGVudW0gOiBpbnQzMl90IHsgQTI4ID0gMSB9OwotICBlbnVtIDogaW50MzJfdCB7IEEyOSA9IDEgfTsKLSAgZW51bSA6IGludDMyX3QgeyBBMzAgPSAxIH07Ci0gIGVudW0gOiBpbnQzMl90IHsgQTMxID0gMSB9OwotICBlbnVtIDogaW50MzJfdCB7IEEzMiA9IDEgfTsKLSAgZW51bSA6IGludDMyX3QgeyBBMzMgPSAxIH07Ci0gIGVudW0gOiBpbnQzMl90IHsgQTM0ID0gMSB9OwotICBlbnVtIDogaW50MzJfdCB7IEEzNSA9IDEgfTsKLSAgZW51bSA6IGludDMyX3QgeyBBMzYgPSAxIH07Ci0gIGVudW0gOiBpbnQzMl90IHsgQTM3ID0gMSB9OwotICBlbnVtIDogaW50MzJfdCB7IEEzOCA9IDEgfTsKLSAgZW51bSA6IGludDMyX3QgeyBBMzkgPSAxIH07Ci0gIGVudW0gOiBpbnQzMl90IHsgQTQwID0gMSB9OwotICBlbnVtIDogaW50MzJfdCB7IEE0MSA9IDEgfTsKLSAgZW51bSA6IGludDMyX3QgeyBBNDIgPSAxIH07Ci0gIGVudW0gOiBpbnQzMl90IHsgQTQzID0gMSB9OwotICBlbnVtIDogaW50MzJfdCB7IEE0NCA9IDEgfTsKLSAgZW51bSA6IGludDMyX3QgeyBBNDUgPSAxIH07Ci0gIGVudW0gOiBpbnQzMl90IHsgQTQ2ID0gMSB9OwotICBlbnVtIDogaW50MzJfdCB7IEE0NyA9IDEgfTsKLSAgZW51bSA6IGludDMyX3QgeyBBNDggPSAxIH07Ci0gIGVudW0gOiBpbnQzMl90IHsgQTQ5ID0gMSB9OwotICBlbnVtIDogaW50MzJfdCB7IEE1MCA9IDEgfTsKLSAgZW51bSA6IGludDMyX3QgeyBBNTEgPSAxIH07Ci0gIGVudW0gOiBpbnQzMl90IHsgQTUyID0gMSB9OwotICBlbnVtIDogaW50MzJfdCB7IEE1MyA9IDEgfTsKLSAgZW51bSA6IGludDMyX3QgeyBBNTQgPSAxIH07Ci0gIGVudW0gOiBpbnQzMl90IHsgQTU1ID0gMSB9OwotICBlbnVtIDogaW50MzJfdCB7IEE1NiA9IDEgfTsKLSAgZW51bSA6IGludDMyX3QgeyBBNTcgPSAxIH07Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fVW5pbXBsZW1lbnRlZE1ldGhvZCA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAwOwotICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX0RlcHJlY2F0ZWQgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMTsKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9UZXN0T25ld2F5ID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDI7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0Qm9vbGVhbiA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzOwotICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdEJ5dGUgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDsKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXBlYXRDaGFyID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDU7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0SW50ID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDY7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0TG9uZyA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA3OwotICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdEZsb2F0ID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDg7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0RG91YmxlID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDk7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0U3RyaW5nID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDEwOwotICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdEJ5dGVFbnVtID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDExOwotICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdEludEVudW0gPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMTI7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0TG9uZ0VudW0gPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMTM7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmV2ZXJzZUJvb2xlYW4gPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMTQ7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmV2ZXJzZUJ5dGUgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMTU7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmV2ZXJzZUNoYXIgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMTY7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmV2ZXJzZUludCA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAxNzsKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXZlcnNlTG9uZyA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAxODsKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXZlcnNlRmxvYXQgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMTk7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmV2ZXJzZURvdWJsZSA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyMDsKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXZlcnNlU3RyaW5nID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDIxOwotICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JldmVyc2VCeXRlRW51bSA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyMjsKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXZlcnNlSW50RW51bSA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyMzsKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXZlcnNlTG9uZ0VudW0gPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMjQ7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fR2V0T3RoZXJUZXN0U2VydmljZSA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyNTsKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9WZXJpZnlOYW1lID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDI2OwotICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JldmVyc2VTdHJpbmdMaXN0ID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDI3OwotICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdFBhcmNlbEZpbGVEZXNjcmlwdG9yID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDI4OwotICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JldmVyc2VQYXJjZWxGaWxlRGVzY3JpcHRvckFycmF5ID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDI5OwotICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1Rocm93U2VydmljZUV4Y2VwdGlvbiA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzMDsKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXBlYXROdWxsYWJsZUludEFycmF5ID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDMxOwotICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdE51bGxhYmxlQnl0ZUVudW1BcnJheSA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzMjsKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXBlYXROdWxsYWJsZUludEVudW1BcnJheSA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzMzsKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXBlYXROdWxsYWJsZUxvbmdFbnVtQXJyYXkgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzQ7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0TnVsbGFibGVTdHJpbmcgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzU7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0TnVsbGFibGVTdHJpbmdMaXN0ID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDM2OwotICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdE51bGxhYmxlUGFyY2VsYWJsZSA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzNzsKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9UYWtlc0FuSUJpbmRlciA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzODsKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9UYWtlc0FOdWxsYWJsZUlCaW5kZXIgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzk7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0VXRmOENwcFN0cmluZyA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0MDsKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXBlYXROdWxsYWJsZVV0ZjhDcHBTdHJpbmcgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDE7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmV2ZXJzZVV0ZjhDcHBTdHJpbmcgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDI7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmV2ZXJzZU51bGxhYmxlVXRmOENwcFN0cmluZyA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0MzsKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXZlcnNlVXRmOENwcFN0cmluZ0xpc3QgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDQ7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fR2V0Q2FsbGJhY2sgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDU7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fRmlsbE91dFN0cnVjdHVyZWRQYXJjZWxhYmxlID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQ2OwotICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX0dldE9sZE5hbWVJbnRlcmZhY2UgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDc7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fR2V0TmV3TmFtZUludGVyZmFjZSA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0ODsKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9HZXRDcHBKYXZhVGVzdHMgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDk7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fZ2V0QmFja2VuZFR5cGUgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNTA7Ci0KLSAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxJVGVzdFNlcnZpY2U+IGZyb21CaW5kZXIoY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGJpbmRlcik7Ci0gIHN0YXRpYyBiaW5kZXJfc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChBUGFyY2VsKiBwYXJjZWwsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJVGVzdFNlcnZpY2U+JiBpbnN0YW5jZSk7Ci0gIHN0YXRpYyBiaW5kZXJfc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogcGFyY2VsLCBzdGQ6OnNoYXJlZF9wdHI8SVRlc3RTZXJ2aWNlPiogaW5zdGFuY2UpOwotICBzdGF0aWMgYm9vbCBzZXREZWZhdWx0SW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVRlc3RTZXJ2aWNlPiYgaW1wbCk7Ci0gIHN0YXRpYyBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVRlc3RTZXJ2aWNlPiYgZ2V0RGVmYXVsdEltcGwoKTsKLSAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBVbmltcGxlbWVudGVkTWV0aG9kKGludDMyX3QgaW5fYXJnLCBpbnQzMl90KiBfYWlkbF9yZXR1cm4pID0gMDsKLSAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBEZXByZWNhdGVkKCkgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCgidG8gbWFrZSBzdXJlIHdlIGhhdmUgc29tZXRoaW5nIGluIHN5c3RlbS90b29scy9haWRsIHdoaWNoIGRvZXMgYSBjb21waWxlIGNoZWNrIG9mIGRlcHJlY2F0ZWQgYW5kIG1ha2Ugc3VyZSB0aGlzIGlzIHJlZmxlY3RlZCBpbiBnb2xkZW5zIikpKSA9IDA7Ci0gIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgVGVzdE9uZXdheSgpID0gMDsKLSAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXRCb29sZWFuKGJvb2wgaW5fdG9rZW4sIGJvb2wqIF9haWRsX3JldHVybikgPSAwOwotICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdEJ5dGUoaW50OF90IGluX3Rva2VuLCBpbnQ4X3QqIF9haWRsX3JldHVybikgPSAwOwotICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdENoYXIoY2hhcjE2X3QgaW5fdG9rZW4sIGNoYXIxNl90KiBfYWlkbF9yZXR1cm4pID0gMDsKLSAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXRJbnQoaW50MzJfdCBpbl90b2tlbiwgaW50MzJfdCogX2FpZGxfcmV0dXJuKSA9IDA7Ci0gIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0TG9uZyhpbnQ2NF90IGluX3Rva2VuLCBpbnQ2NF90KiBfYWlkbF9yZXR1cm4pID0gMDsKLSAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXRGbG9hdChmbG9hdCBpbl90b2tlbiwgZmxvYXQqIF9haWRsX3JldHVybikgPSAwOwotICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdERvdWJsZShkb3VibGUgaW5fdG9rZW4sIGRvdWJsZSogX2FpZGxfcmV0dXJuKSA9IDA7Ci0gIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0U3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl90b2tlbiwgc3RkOjpzdHJpbmcqIF9haWRsX3JldHVybikgPSAwOwotICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdEJ5dGVFbnVtKDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJ5dGVFbnVtIGluX3Rva2VuLCA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCeXRlRW51bSogX2FpZGxfcmV0dXJuKSA9IDA7Ci0gIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0SW50RW51bSg6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtIGluX3Rva2VuLCA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtKiBfYWlkbF9yZXR1cm4pID0gMDsKLSAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXRMb25nRW51bSg6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMb25nRW51bSBpbl90b2tlbiwgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0qIF9haWRsX3JldHVybikgPSAwOwotICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJldmVyc2VCb29sZWFuKGNvbnN0IHN0ZDo6dmVjdG9yPGJvb2w+JiBpbl9pbnB1dCwgc3RkOjp2ZWN0b3I8Ym9vbD4qIG91dF9yZXBlYXRlZCwgc3RkOjp2ZWN0b3I8Ym9vbD4qIF9haWRsX3JldHVybikgPSAwOwotICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJldmVyc2VCeXRlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9pbnB1dCwgc3RkOjp2ZWN0b3I8dWludDhfdD4qIG91dF9yZXBlYXRlZCwgc3RkOjp2ZWN0b3I8dWludDhfdD4qIF9haWRsX3JldHVybikgPSAwOwotICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJldmVyc2VDaGFyKGNvbnN0IHN0ZDo6dmVjdG9yPGNoYXIxNl90PiYgaW5faW5wdXQsIHN0ZDo6dmVjdG9yPGNoYXIxNl90Piogb3V0X3JlcGVhdGVkLCBzdGQ6OnZlY3RvcjxjaGFyMTZfdD4qIF9haWRsX3JldHVybikgPSAwOwotICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJldmVyc2VJbnQoY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIGluX2lucHV0LCBzdGQ6OnZlY3RvcjxpbnQzMl90Piogb3V0X3JlcGVhdGVkLCBzdGQ6OnZlY3RvcjxpbnQzMl90PiogX2FpZGxfcmV0dXJuKSA9IDA7Ci0gIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZUxvbmcoY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4mIGluX2lucHV0LCBzdGQ6OnZlY3RvcjxpbnQ2NF90Piogb3V0X3JlcGVhdGVkLCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiogX2FpZGxfcmV0dXJuKSA9IDA7Ci0gIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZUZsb2F0KGNvbnN0IHN0ZDo6dmVjdG9yPGZsb2F0PiYgaW5faW5wdXQsIHN0ZDo6dmVjdG9yPGZsb2F0Piogb3V0X3JlcGVhdGVkLCBzdGQ6OnZlY3RvcjxmbG9hdD4qIF9haWRsX3JldHVybikgPSAwOwotICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJldmVyc2VEb3VibGUoY29uc3Qgc3RkOjp2ZWN0b3I8ZG91YmxlPiYgaW5faW5wdXQsIHN0ZDo6dmVjdG9yPGRvdWJsZT4qIG91dF9yZXBlYXRlZCwgc3RkOjp2ZWN0b3I8ZG91YmxlPiogX2FpZGxfcmV0dXJuKSA9IDA7Ci0gIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZVN0cmluZyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGluX2lucHV0LCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIG91dF9yZXBlYXRlZCwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBfYWlkbF9yZXR1cm4pID0gMDsKLSAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXZlcnNlQnl0ZUVudW0oY29uc3Qgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Qnl0ZUVudW0+JiBpbl9pbnB1dCwgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Qnl0ZUVudW0+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJ5dGVFbnVtPiogX2FpZGxfcmV0dXJuKSA9IDA7Ci0gIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZUludEVudW0oY29uc3Qgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bT4mIGluX2lucHV0LCBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtPiogb3V0X3JlcGVhdGVkLCBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtPiogX2FpZGxfcmV0dXJuKSA9IDA7Ci0gIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZUxvbmdFbnVtKGNvbnN0IHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtPiYgaW5faW5wdXQsIHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtPiogb3V0X3JlcGVhdGVkLCBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMb25nRW51bT4qIF9haWRsX3JldHVybikgPSAwOwotICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIEdldE90aGVyVGVzdFNlcnZpY2UoY29uc3Qgc3RkOjpzdHJpbmcmIGluX25hbWUsIHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4qIF9haWRsX3JldHVybikgPSAwOwotICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFZlcmlmeU5hbWUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPiYgaW5fc2VydmljZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGluX25hbWUsIGJvb2wqIF9haWRsX3JldHVybikgPSAwOwotICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJldmVyc2VTdHJpbmdMaXN0KGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgaW5faW5wdXQsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogb3V0X3JlcGVhdGVkLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIF9haWRsX3JldHVybikgPSAwOwotICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdFBhcmNlbEZpbGVEZXNjcmlwdG9yKGNvbnN0IDo6bmRrOjpTY29wZWRGaWxlRGVzY3JpcHRvciYgaW5fcmVhZCwgOjpuZGs6OlNjb3BlZEZpbGVEZXNjcmlwdG9yKiBfYWlkbF9yZXR1cm4pID0gMDsKLSAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXZlcnNlUGFyY2VsRmlsZURlc2NyaXB0b3JBcnJheShjb25zdCBzdGQ6OnZlY3Rvcjw6Om5kazo6U2NvcGVkRmlsZURlc2NyaXB0b3I+JiBpbl9pbnB1dCwgc3RkOjp2ZWN0b3I8OjpuZGs6OlNjb3BlZEZpbGVEZXNjcmlwdG9yPiogb3V0X3JlcGVhdGVkLCBzdGQ6OnZlY3Rvcjw6Om5kazo6U2NvcGVkRmlsZURlc2NyaXB0b3I+KiBfYWlkbF9yZXR1cm4pID0gMDsKLSAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBUaHJvd1NlcnZpY2VFeGNlcHRpb24oaW50MzJfdCBpbl9jb2RlKSA9IDA7Ci0gIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0TnVsbGFibGVJbnRBcnJheShjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPGludDMyX3Q+PiYgaW5faW5wdXQsIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8aW50MzJfdD4+KiBfYWlkbF9yZXR1cm4pID0gMDsKLSAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXROdWxsYWJsZUJ5dGVFbnVtQXJyYXkoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCeXRlRW51bT4+JiBpbl9pbnB1dCwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCeXRlRW51bT4+KiBfYWlkbF9yZXR1cm4pID0gMDsKLSAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXROdWxsYWJsZUludEVudW1BcnJheShjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0+PiYgaW5faW5wdXQsIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bT4+KiBfYWlkbF9yZXR1cm4pID0gMDsKLSAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXROdWxsYWJsZUxvbmdFbnVtQXJyYXkoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMb25nRW51bT4+JiBpbl9pbnB1dCwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMb25nRW51bT4+KiBfYWlkbF9yZXR1cm4pID0gMDsKLSAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXROdWxsYWJsZVN0cmluZyhjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiYgaW5faW5wdXQsIHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+KiBfYWlkbF9yZXR1cm4pID0gMDsKLSAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXROdWxsYWJsZVN0cmluZ0xpc3QoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBpbl9pbnB1dCwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBfYWlkbF9yZXR1cm4pID0gMDsKLSAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXROdWxsYWJsZVBhcmNlbGFibGUoY29uc3Qgc3RkOjpvcHRpb25hbDw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpTdHJ1Y3R1cmVkUGFyY2VsYWJsZT4mIGluX2lucHV0LCBzdGQ6Om9wdGlvbmFsPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlN0cnVjdHVyZWRQYXJjZWxhYmxlPiogX2FpZGxfcmV0dXJuKSA9IDA7Ci0gIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgVGFrZXNBbklCaW5kZXIoY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGluX2lucHV0KSA9IDA7Ci0gIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgVGFrZXNBTnVsbGFibGVJQmluZGVyKGNvbnN0IDo6bmRrOjpTcEFJQmluZGVyJiBpbl9pbnB1dCkgPSAwOwotICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdFV0ZjhDcHBTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGluX3Rva2VuLCBzdGQ6OnN0cmluZyogX2FpZGxfcmV0dXJuKSA9IDA7Ci0gIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0TnVsbGFibGVVdGY4Q3BwU3RyaW5nKGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+JiBpbl90b2tlbiwgc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4qIF9haWRsX3JldHVybikgPSAwOwotICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJldmVyc2VVdGY4Q3BwU3RyaW5nKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgaW5faW5wdXQsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogb3V0X3JlcGVhdGVkLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIF9haWRsX3JldHVybikgPSAwOwotICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJldmVyc2VOdWxsYWJsZVV0ZjhDcHBTdHJpbmcoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPj4+JiBpbl9pbnB1dCwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPj4+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4+PiogX2FpZGxfcmV0dXJuKSA9IDA7Ci0gIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZVV0ZjhDcHBTdHJpbmdMaXN0KGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgaW5faW5wdXQsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogb3V0X3JlcGVhdGVkLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIF9haWRsX3JldHVybikgPSAwOwotICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIEdldENhbGxiYWNrKGJvb2wgaW5fcmV0dXJuX251bGwsIHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4qIF9haWRsX3JldHVybikgPSAwOwotICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIEZpbGxPdXRTdHJ1Y3R1cmVkUGFyY2VsYWJsZSg6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpTdHJ1Y3R1cmVkUGFyY2VsYWJsZSogaW5fcGFyY2VsKSA9IDA7Ci0gIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgR2V0T2xkTmFtZUludGVyZmFjZShzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU9sZE5hbWU+KiBfYWlkbF9yZXR1cm4pID0gMDsKLSAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBHZXROZXdOYW1lSW50ZXJmYWNlKHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmV3TmFtZT4qIF9haWRsX3JldHVybikgPSAwOwotICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIEdldENwcEphdmFUZXN0cyg6Om5kazo6U3BBSUJpbmRlciogX2FpZGxfcmV0dXJuKSA9IDA7Ci0gIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0QmFja2VuZFR5cGUoOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QmFja2VuZFR5cGUqIF9haWRsX3JldHVybikgPSAwOwotcHJpdmF0ZToKLSAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxJVGVzdFNlcnZpY2U+IGRlZmF1bHRfaW1wbDsKLX07Ci1jbGFzcyBJVGVzdFNlcnZpY2VEZWZhdWx0IDogcHVibGljIElUZXN0U2VydmljZSB7Ci1wdWJsaWM6Ci0gIDo6bmRrOjpTY29wZWRBU3RhdHVzIFVuaW1wbGVtZW50ZWRNZXRob2QoaW50MzJfdCBpbl9hcmcsIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gIDo6bmRrOjpTY29wZWRBU3RhdHVzIERlcHJlY2F0ZWQoKSBvdmVycmlkZSBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKCJ0byBtYWtlIHN1cmUgd2UgaGF2ZSBzb21ldGhpbmcgaW4gc3lzdGVtL3Rvb2xzL2FpZGwgd2hpY2ggZG9lcyBhIGNvbXBpbGUgY2hlY2sgb2YgZGVwcmVjYXRlZCBhbmQgbWFrZSBzdXJlIHRoaXMgaXMgcmVmbGVjdGVkIGluIGdvbGRlbnMiKSkpOwotICA6Om5kazo6U2NvcGVkQVN0YXR1cyBUZXN0T25ld2F5KCkgb3ZlcnJpZGU7Ci0gIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdEJvb2xlYW4oYm9vbCBpbl90b2tlbiwgYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0Qnl0ZShpbnQ4X3QgaW5fdG9rZW4sIGludDhfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0Q2hhcihjaGFyMTZfdCBpbl90b2tlbiwgY2hhcjE2X3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdEludChpbnQzMl90IGluX3Rva2VuLCBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXRMb25nKGludDY0X3QgaW5fdG9rZW4sIGludDY0X3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdEZsb2F0KGZsb2F0IGluX3Rva2VuLCBmbG9hdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0RG91YmxlKGRvdWJsZSBpbl90b2tlbiwgZG91YmxlKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXRTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGluX3Rva2VuLCBzdGQ6OnN0cmluZyogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0Qnl0ZUVudW0oOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Qnl0ZUVudW0gaW5fdG9rZW4sIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJ5dGVFbnVtKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXRJbnRFbnVtKDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0gaW5fdG9rZW4sIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdExvbmdFbnVtKDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtIGluX3Rva2VuLCA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMb25nRW51bSogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZUJvb2xlYW4oY29uc3Qgc3RkOjp2ZWN0b3I8Ym9vbD4mIGluX2lucHV0LCBzdGQ6OnZlY3Rvcjxib29sPiogb3V0X3JlcGVhdGVkLCBzdGQ6OnZlY3Rvcjxib29sPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZUJ5dGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX2lucHV0LCBzdGQ6OnZlY3Rvcjx1aW50OF90Piogb3V0X3JlcGVhdGVkLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZUNoYXIoY29uc3Qgc3RkOjp2ZWN0b3I8Y2hhcjE2X3Q+JiBpbl9pbnB1dCwgc3RkOjp2ZWN0b3I8Y2hhcjE2X3Q+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6dmVjdG9yPGNoYXIxNl90PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZUludChjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgaW5faW5wdXQsIHN0ZDo6dmVjdG9yPGludDMyX3Q+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6dmVjdG9yPGludDMyX3Q+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXZlcnNlTG9uZyhjb25zdCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiYgaW5faW5wdXQsIHN0ZDo6dmVjdG9yPGludDY0X3Q+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6dmVjdG9yPGludDY0X3Q+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXZlcnNlRmxvYXQoY29uc3Qgc3RkOjp2ZWN0b3I8ZmxvYXQ+JiBpbl9pbnB1dCwgc3RkOjp2ZWN0b3I8ZmxvYXQ+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6dmVjdG9yPGZsb2F0PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZURvdWJsZShjb25zdCBzdGQ6OnZlY3Rvcjxkb3VibGU+JiBpbl9pbnB1dCwgc3RkOjp2ZWN0b3I8ZG91YmxlPiogb3V0X3JlcGVhdGVkLCBzdGQ6OnZlY3Rvcjxkb3VibGU+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXZlcnNlU3RyaW5nKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgaW5faW5wdXQsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogb3V0X3JlcGVhdGVkLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJldmVyc2VCeXRlRW51bShjb25zdCBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCeXRlRW51bT4mIGluX2lucHV0LCBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCeXRlRW51bT4qIG91dF9yZXBlYXRlZCwgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Qnl0ZUVudW0+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXZlcnNlSW50RW51bShjb25zdCBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtPiYgaW5faW5wdXQsIHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXZlcnNlTG9uZ0VudW0oY29uc3Qgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0+JiBpbl9pbnB1dCwgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgR2V0T3RoZXJUZXN0U2VydmljZShjb25zdCBzdGQ6OnN0cmluZyYgaW5fbmFtZSwgc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgVmVyaWZ5TmFtZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+JiBpbl9zZXJ2aWNlLCBjb25zdCBzdGQ6OnN0cmluZyYgaW5fbmFtZSwgYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZVN0cmluZ0xpc3QoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBpbl9pbnB1dCwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0UGFyY2VsRmlsZURlc2NyaXB0b3IoY29uc3QgOjpuZGs6OlNjb3BlZEZpbGVEZXNjcmlwdG9yJiBpbl9yZWFkLCA6Om5kazo6U2NvcGVkRmlsZURlc2NyaXB0b3IqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJldmVyc2VQYXJjZWxGaWxlRGVzY3JpcHRvckFycmF5KGNvbnN0IHN0ZDo6dmVjdG9yPDo6bmRrOjpTY29wZWRGaWxlRGVzY3JpcHRvcj4mIGluX2lucHV0LCBzdGQ6OnZlY3Rvcjw6Om5kazo6U2NvcGVkRmlsZURlc2NyaXB0b3I+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6dmVjdG9yPDo6bmRrOjpTY29wZWRGaWxlRGVzY3JpcHRvcj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gIDo6bmRrOjpTY29wZWRBU3RhdHVzIFRocm93U2VydmljZUV4Y2VwdGlvbihpbnQzMl90IGluX2NvZGUpIG92ZXJyaWRlOwotICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXROdWxsYWJsZUludEFycmF5KGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8aW50MzJfdD4+JiBpbl9pbnB1dCwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxpbnQzMl90Pj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdE51bGxhYmxlQnl0ZUVudW1BcnJheShjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJ5dGVFbnVtPj4mIGluX2lucHV0LCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJ5dGVFbnVtPj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdE51bGxhYmxlSW50RW51bUFycmF5KGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bT4+JiBpbl9pbnB1dCwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtPj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdE51bGxhYmxlTG9uZ0VudW1BcnJheShjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtPj4mIGluX2lucHV0LCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtPj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdE51bGxhYmxlU3RyaW5nKGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+JiBpbl9pbnB1dCwgc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdE51bGxhYmxlU3RyaW5nTGlzdChjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGluX2lucHV0LCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZShjb25zdCBzdGQ6Om9wdGlvbmFsPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlN0cnVjdHVyZWRQYXJjZWxhYmxlPiYgaW5faW5wdXQsIHN0ZDo6b3B0aW9uYWw8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6U3RydWN0dXJlZFBhcmNlbGFibGU+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICA6Om5kazo6U2NvcGVkQVN0YXR1cyBUYWtlc0FuSUJpbmRlcihjb25zdCA6Om5kazo6U3BBSUJpbmRlciYgaW5faW5wdXQpIG92ZXJyaWRlOwotICA6Om5kazo6U2NvcGVkQVN0YXR1cyBUYWtlc0FOdWxsYWJsZUlCaW5kZXIoY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGluX2lucHV0KSBvdmVycmlkZTsKLSAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0VXRmOENwcFN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgaW5fdG9rZW4sIHN0ZDo6c3RyaW5nKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXROdWxsYWJsZVV0ZjhDcHBTdHJpbmcoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4mIGluX3Rva2VuLCBzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZVV0ZjhDcHBTdHJpbmcoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBpbl9pbnB1dCwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZU51bGxhYmxlVXRmOENwcFN0cmluZyhjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+Pj4mIGluX2lucHV0LCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+Pj4qIG91dF9yZXBlYXRlZCwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPj4+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXZlcnNlVXRmOENwcFN0cmluZ0xpc3QoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBpbl9pbnB1dCwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgR2V0Q2FsbGJhY2soYm9vbCBpbl9yZXR1cm5fbnVsbCwgc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgRmlsbE91dFN0cnVjdHVyZWRQYXJjZWxhYmxlKDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlN0cnVjdHVyZWRQYXJjZWxhYmxlKiBpbl9wYXJjZWwpIG92ZXJyaWRlOwotICA6Om5kazo6U2NvcGVkQVN0YXR1cyBHZXRPbGROYW1lSW50ZXJmYWNlKHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJT2xkTmFtZT4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gIDo6bmRrOjpTY29wZWRBU3RhdHVzIEdldE5ld05hbWVJbnRlcmZhY2Uoc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOZXdOYW1lPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgR2V0Q3BwSmF2YVRlc3RzKDo6bmRrOjpTcEFJQmluZGVyKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXRCYWNrZW5kVHlwZSg6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCYWNrZW5kVHlwZSogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgOjpuZGs6OlNwQUlCaW5kZXIgYXNCaW5kZXIoKSBvdmVycmlkZTsKLSAgYm9vbCBpc1JlbW90ZSgpIG92ZXJyaWRlOwotfTsKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0cwotfSAgLy8gbmFtZXNwYWNlIGFpZGwKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi19ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvU3RydWN0dXJlZFBhcmNlbGFibGUuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL1N0cnVjdHVyZWRQYXJjZWxhYmxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NjVhZjUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvU3RydWN0dXJlZFBhcmNlbGFibGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0jcHJhZ21hIG9uY2UKLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pbnRlcmZhY2VfdXRpbHMuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wYXJjZWxhYmxlX3V0aWxzLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfdG9fc3RyaW5nLmg+Ci0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8b3B0aW9uYWw+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9zdGFiaWxpdHkuaD4KLSNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCi0jaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnl0ZUVudW0uaD4KLSNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9Db25zdGFudEV4cHJlc3Npb25FbnVtLmg+Ci0jaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvSW50RW51bS5oPgotI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0xvbmdFbnVtLmg+Ci0jaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb24uaD4KLW5hbWVzcGFjZSBhaWRsIHsKLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBhaWRsIHsKLW5hbWVzcGFjZSB0ZXN0cyB7Ci1jbGFzcyBTdHJ1Y3R1cmVkUGFyY2VsYWJsZSB7Ci1wdWJsaWM6Ci0gIHR5cGVkZWYgc3RkOjpmYWxzZV90eXBlIGZpeGVkX3NpemU7Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBkZXNjcmlwdG9yOwotCi0gIHN0ZDo6dmVjdG9yPGludDMyX3Q+IHNob3VsZENvbnRhaW5UaHJlZUZzOwotICBpbnQzMl90IGYgPSAwOwotICBzdGQ6OnN0cmluZyBzaG91bGRCZUplcnJ5OwotICA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCeXRlRW51bSBzaG91bGRCZUJ5dGVCYXIgPSA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCeXRlRW51bSgwKTsKLSAgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bSBzaG91bGRCZUludEJhciA9IDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0oMCk7Ci0gIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtIHNob3VsZEJlTG9uZ0JhciA9IDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtKDApOwotICBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCeXRlRW51bT4gc2hvdWxkQ29udGFpblR3b0J5dGVGb29zOwotICBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtPiBzaG91bGRDb250YWluVHdvSW50Rm9vczsKLSAgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0+IHNob3VsZENvbnRhaW5Ud29Mb25nRm9vczsKLSAgc3RkOjpzdHJpbmcgc3RyaW5nRGVmYXVsdHNUb0ZvbyA9ICJmb28iOwotICBpbnQ4X3QgYnl0ZURlZmF1bHRzVG9Gb3VyID0gNDsKLSAgaW50MzJfdCBpbnREZWZhdWx0c1RvRml2ZSA9IDU7Ci0gIGludDY0X3QgbG9uZ0RlZmF1bHRzVG9OZWdhdGl2ZVNldmVuID0gLTdMOwotICBib29sIGJvb2xlYW5EZWZhdWx0c1RvVHJ1ZSA9IHRydWU7Ci0gIGNoYXIxNl90IGNoYXJEZWZhdWx0c1RvQyA9ICdDJzsKLSAgZmxvYXQgZmxvYXREZWZhdWx0c1RvUGkgPSAzLjE0MDAwMGY7Ci0gIGRvdWJsZSBkb3VibGVXaXRoRGVmYXVsdCA9IC0zMTQwMDAwMDAwMDAwMDAwMDAuMDAwMDAwOwotICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBhcnJheURlZmF1bHRzVG8xMjMgPSB7MSwgMiwgM307Ci0gIHN0ZDo6dmVjdG9yPGludDMyX3Q+IGFycmF5RGVmYXVsdHNUb0VtcHR5ID0ge307Ci0gIGJvb2wgYm9vbERlZmF1bHQgPSBmYWxzZTsKLSAgaW50OF90IGJ5dGVEZWZhdWx0ID0gMDsKLSAgaW50MzJfdCBpbnREZWZhdWx0ID0gMDsKLSAgaW50NjRfdCBsb25nRGVmYXVsdCA9IDBMOwotICBmbG9hdCBmbG9hdERlZmF1bHQgPSAwLjAwMDAwMGY7Ci0gIGRvdWJsZSBkb3VibGVEZWZhdWx0ID0gMC4wMDAwMDA7Ci0gIGRvdWJsZSBjaGVja0RvdWJsZUZyb21GbG9hdCA9IDMuMTQwMDAwOwotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY2hlY2tTdHJpbmdBcnJheTEgPSB7ImEiLCAiYiJ9OwotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY2hlY2tTdHJpbmdBcnJheTIgPSB7ImEiLCAiYiJ9OwotICBpbnQzMl90IGludDMyX21pbiA9IC0yMTQ3NDgzNjQ4OwotICBpbnQzMl90IGludDMyX21heCA9IDIxNDc0ODM2NDc7Ci0gIGludDY0X3QgaW50NjRfbWF4ID0gOTIyMzM3MjAzNjg1NDc3NTgwN0w7Ci0gIGludDMyX3QgaGV4SW50MzJfbmVnXzEgPSAtMTsKLSAgOjpuZGs6OlNwQUlCaW5kZXIgaWJpbmRlcjsKLSAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gaW50MzJfMSA9IHsxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxfTsKLSAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gaW50NjRfMSA9IHsxTCwgMUwsIDFMLCAxTCwgMUwsIDFMLCAxTCwgMUwsIDFMLCAxTH07Ci0gIGludDMyX3QgaGV4SW50MzJfcG9zXzEgPSAxOwotICBpbnQzMl90IGhleEludDY0X3Bvc18xID0gMTsKLSAgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSBjb25zdF9leHByc18xID0gOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSgwKTsKLSAgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSBjb25zdF9leHByc18yID0gOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSgwKTsKLSAgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSBjb25zdF9leHByc18zID0gOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSgwKTsKLSAgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSBjb25zdF9leHByc180ID0gOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSgwKTsKLSAgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSBjb25zdF9leHByc181ID0gOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSgwKTsKLSAgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSBjb25zdF9leHByc182ID0gOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSgwKTsKLSAgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSBjb25zdF9leHByc183ID0gOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSgwKTsKLSAgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSBjb25zdF9leHByc184ID0gOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSgwKTsKLSAgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSBjb25zdF9leHByc185ID0gOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSgwKTsKLSAgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSBjb25zdF9leHByc18xMCA9IDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkNvbnN0YW50RXhwcmVzc2lvbkVudW0oMCk7Ci0gIHN0ZDo6c3RyaW5nIGFkZFN0cmluZzEgPSAiaGVsbG8gd29ybGQhIjsKLSAgc3RkOjpzdHJpbmcgYWRkU3RyaW5nMiA9ICJUaGUgcXVpY2sgYnJvd24gZm94IGp1bXBzIG92ZXIgdGhlIGxhenkgZG9nLiI7Ci0gIGludDMyX3Qgc2hvdWxkU2V0Qml0MEFuZEJpdDIgPSAwOwotICBzdGQ6Om9wdGlvbmFsPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlVuaW9uPiB1OwotICBzdGQ6Om9wdGlvbmFsPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlVuaW9uPiBzaG91bGRCZUNvbnN0UzE7Ci0gIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0gZGVmYXVsdFdpdGhGb28gPSA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtOjpGT087Ci0KLSAgYmluZGVyX3N0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIHBhcmNlbCk7Ci0gIGJpbmRlcl9zdGF0dXNfdCB3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIHBhcmNlbCkgY29uc3Q7Ci0KLSAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBTdHJ1Y3R1cmVkUGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0ZDo6dGllKHNob3VsZENvbnRhaW5UaHJlZUZzLCBmLCBzaG91bGRCZUplcnJ5LCBzaG91bGRCZUJ5dGVCYXIsIHNob3VsZEJlSW50QmFyLCBzaG91bGRCZUxvbmdCYXIsIHNob3VsZENvbnRhaW5Ud29CeXRlRm9vcywgc2hvdWxkQ29udGFpblR3b0ludEZvb3MsIHNob3VsZENvbnRhaW5Ud29Mb25nRm9vcywgc3RyaW5nRGVmYXVsdHNUb0ZvbywgYnl0ZURlZmF1bHRzVG9Gb3VyLCBpbnREZWZhdWx0c1RvRml2ZSwgbG9uZ0RlZmF1bHRzVG9OZWdhdGl2ZVNldmVuLCBib29sZWFuRGVmYXVsdHNUb1RydWUsIGNoYXJEZWZhdWx0c1RvQywgZmxvYXREZWZhdWx0c1RvUGksIGRvdWJsZVdpdGhEZWZhdWx0LCBhcnJheURlZmF1bHRzVG8xMjMsIGFycmF5RGVmYXVsdHNUb0VtcHR5LCBib29sRGVmYXVsdCwgYnl0ZURlZmF1bHQsIGludERlZmF1bHQsIGxvbmdEZWZhdWx0LCBmbG9hdERlZmF1bHQsIGRvdWJsZURlZmF1bHQsIGNoZWNrRG91YmxlRnJvbUZsb2F0LCBjaGVja1N0cmluZ0FycmF5MSwgY2hlY2tTdHJpbmdBcnJheTIsIGludDMyX21pbiwgaW50MzJfbWF4LCBpbnQ2NF9tYXgsIGhleEludDMyX25lZ18xLCBpYmluZGVyLCBpbnQzMl8xLCBpbnQ2NF8xLCBoZXhJbnQzMl9wb3NfMSwgaGV4SW50NjRfcG9zXzEsIGNvbnN0X2V4cHJzXzEsIGNvbnN0X2V4cHJzXzIsIGNvbnN0X2V4cHJzXzMsIGNvbnN0X2V4cHJzXzQsIGNvbnN0X2V4cHJzXzUsIGNvbnN0X2V4cHJzXzYsIGNvbnN0X2V4cHJzXzcsIGNvbnN0X2V4cHJzXzgsIGNvbnN0X2V4cHJzXzksIGNvbnN0X2V4cHJzXzEwLCBhZGRTdHJpbmcxLCBhZGRTdHJpbmcyLCBzaG91bGRTZXRCaXQwQW5kQml0MiwgdSwgc2hvdWxkQmVDb25zdFMxLCBkZWZhdWx0V2l0aEZvbykgIT0gc3RkOjp0aWUocmhzLnNob3VsZENvbnRhaW5UaHJlZUZzLCByaHMuZiwgcmhzLnNob3VsZEJlSmVycnksIHJocy5zaG91bGRCZUJ5dGVCYXIsIHJocy5zaG91bGRCZUludEJhciwgcmhzLnNob3VsZEJlTG9uZ0JhciwgcmhzLnNob3VsZENvbnRhaW5Ud29CeXRlRm9vcywgcmhzLnNob3VsZENvbnRhaW5Ud29JbnRGb29zLCByaHMuc2hvdWxkQ29udGFpblR3b0xvbmdGb29zLCByaHMuc3RyaW5nRGVmYXVsdHNUb0ZvbywgcmhzLmJ5dGVEZWZhdWx0c1RvRm91ciwgcmhzLmludERlZmF1bHRzVG9GaXZlLCByaHMubG9uZ0RlZmF1bHRzVG9OZWdhdGl2ZVNldmVuLCByaHMuYm9vbGVhbkRlZmF1bHRzVG9UcnVlLCByaHMuY2hhckRlZmF1bHRzVG9DLCByaHMuZmxvYXREZWZhdWx0c1RvUGksIHJocy5kb3VibGVXaXRoRGVmYXVsdCwgcmhzLmFycmF5RGVmYXVsdHNUbzEyMywgcmhzLmFycmF5RGVmYXVsdHNUb0VtcHR5LCByaHMuYm9vbERlZmF1bHQsIHJocy5ieXRlRGVmYXVsdCwgcmhzLmludERlZmF1bHQsIHJocy5sb25nRGVmYXVsdCwgcmhzLmZsb2F0RGVmYXVsdCwgcmhzLmRvdWJsZURlZmF1bHQsIHJocy5jaGVja0RvdWJsZUZyb21GbG9hdCwgcmhzLmNoZWNrU3RyaW5nQXJyYXkxLCByaHMuY2hlY2tTdHJpbmdBcnJheTIsIHJocy5pbnQzMl9taW4sIHJocy5pbnQzMl9tYXgsIHJocy5pbnQ2NF9tYXgsIHJocy5oZXhJbnQzMl9uZWdfMSwgcmhzLmliaW5kZXIsIHJocy5pbnQzMl8xLCByaHMuaW50NjRfMSwgcmhzLmhleEludDMyX3Bvc18xLCByaHMuaGV4SW50NjRfcG9zXzEsIHJocy5jb25zdF9leHByc18xLCByaHMuY29uc3RfZXhwcnNfMiwgcmhzLmNvbnN0X2V4cHJzXzMsIHJocy5jb25zdF9leHByc180LCByaHMuY29uc3RfZXhwcnNfNSwgcmhzLmNvbnN0X2V4cHJzXzYsIHJocy5jb25zdF9leHByc183LCByaHMuY29uc3RfZXhwcnNfOCwgcmhzLmNvbnN0X2V4cHJzXzksIHJocy5jb25zdF9leHByc18xMCwgcmhzLmFkZFN0cmluZzEsIHJocy5hZGRTdHJpbmcyLCByaHMuc2hvdWxkU2V0Qml0MEFuZEJpdDIsIHJocy51LCByaHMuc2hvdWxkQmVDb25zdFMxLCByaHMuZGVmYXVsdFdpdGhGb28pOwotICB9Ci0gIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBTdHJ1Y3R1cmVkUGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0ZDo6dGllKHNob3VsZENvbnRhaW5UaHJlZUZzLCBmLCBzaG91bGRCZUplcnJ5LCBzaG91bGRCZUJ5dGVCYXIsIHNob3VsZEJlSW50QmFyLCBzaG91bGRCZUxvbmdCYXIsIHNob3VsZENvbnRhaW5Ud29CeXRlRm9vcywgc2hvdWxkQ29udGFpblR3b0ludEZvb3MsIHNob3VsZENvbnRhaW5Ud29Mb25nRm9vcywgc3RyaW5nRGVmYXVsdHNUb0ZvbywgYnl0ZURlZmF1bHRzVG9Gb3VyLCBpbnREZWZhdWx0c1RvRml2ZSwgbG9uZ0RlZmF1bHRzVG9OZWdhdGl2ZVNldmVuLCBib29sZWFuRGVmYXVsdHNUb1RydWUsIGNoYXJEZWZhdWx0c1RvQywgZmxvYXREZWZhdWx0c1RvUGksIGRvdWJsZVdpdGhEZWZhdWx0LCBhcnJheURlZmF1bHRzVG8xMjMsIGFycmF5RGVmYXVsdHNUb0VtcHR5LCBib29sRGVmYXVsdCwgYnl0ZURlZmF1bHQsIGludERlZmF1bHQsIGxvbmdEZWZhdWx0LCBmbG9hdERlZmF1bHQsIGRvdWJsZURlZmF1bHQsIGNoZWNrRG91YmxlRnJvbUZsb2F0LCBjaGVja1N0cmluZ0FycmF5MSwgY2hlY2tTdHJpbmdBcnJheTIsIGludDMyX21pbiwgaW50MzJfbWF4LCBpbnQ2NF9tYXgsIGhleEludDMyX25lZ18xLCBpYmluZGVyLCBpbnQzMl8xLCBpbnQ2NF8xLCBoZXhJbnQzMl9wb3NfMSwgaGV4SW50NjRfcG9zXzEsIGNvbnN0X2V4cHJzXzEsIGNvbnN0X2V4cHJzXzIsIGNvbnN0X2V4cHJzXzMsIGNvbnN0X2V4cHJzXzQsIGNvbnN0X2V4cHJzXzUsIGNvbnN0X2V4cHJzXzYsIGNvbnN0X2V4cHJzXzcsIGNvbnN0X2V4cHJzXzgsIGNvbnN0X2V4cHJzXzksIGNvbnN0X2V4cHJzXzEwLCBhZGRTdHJpbmcxLCBhZGRTdHJpbmcyLCBzaG91bGRTZXRCaXQwQW5kQml0MiwgdSwgc2hvdWxkQmVDb25zdFMxLCBkZWZhdWx0V2l0aEZvbykgPCBzdGQ6OnRpZShyaHMuc2hvdWxkQ29udGFpblRocmVlRnMsIHJocy5mLCByaHMuc2hvdWxkQmVKZXJyeSwgcmhzLnNob3VsZEJlQnl0ZUJhciwgcmhzLnNob3VsZEJlSW50QmFyLCByaHMuc2hvdWxkQmVMb25nQmFyLCByaHMuc2hvdWxkQ29udGFpblR3b0J5dGVGb29zLCByaHMuc2hvdWxkQ29udGFpblR3b0ludEZvb3MsIHJocy5zaG91bGRDb250YWluVHdvTG9uZ0Zvb3MsIHJocy5zdHJpbmdEZWZhdWx0c1RvRm9vLCByaHMuYnl0ZURlZmF1bHRzVG9Gb3VyLCByaHMuaW50RGVmYXVsdHNUb0ZpdmUsIHJocy5sb25nRGVmYXVsdHNUb05lZ2F0aXZlU2V2ZW4sIHJocy5ib29sZWFuRGVmYXVsdHNUb1RydWUsIHJocy5jaGFyRGVmYXVsdHNUb0MsIHJocy5mbG9hdERlZmF1bHRzVG9QaSwgcmhzLmRvdWJsZVdpdGhEZWZhdWx0LCByaHMuYXJyYXlEZWZhdWx0c1RvMTIzLCByaHMuYXJyYXlEZWZhdWx0c1RvRW1wdHksIHJocy5ib29sRGVmYXVsdCwgcmhzLmJ5dGVEZWZhdWx0LCByaHMuaW50RGVmYXVsdCwgcmhzLmxvbmdEZWZhdWx0LCByaHMuZmxvYXREZWZhdWx0LCByaHMuZG91YmxlRGVmYXVsdCwgcmhzLmNoZWNrRG91YmxlRnJvbUZsb2F0LCByaHMuY2hlY2tTdHJpbmdBcnJheTEsIHJocy5jaGVja1N0cmluZ0FycmF5MiwgcmhzLmludDMyX21pbiwgcmhzLmludDMyX21heCwgcmhzLmludDY0X21heCwgcmhzLmhleEludDMyX25lZ18xLCByaHMuaWJpbmRlciwgcmhzLmludDMyXzEsIHJocy5pbnQ2NF8xLCByaHMuaGV4SW50MzJfcG9zXzEsIHJocy5oZXhJbnQ2NF9wb3NfMSwgcmhzLmNvbnN0X2V4cHJzXzEsIHJocy5jb25zdF9leHByc18yLCByaHMuY29uc3RfZXhwcnNfMywgcmhzLmNvbnN0X2V4cHJzXzQsIHJocy5jb25zdF9leHByc181LCByaHMuY29uc3RfZXhwcnNfNiwgcmhzLmNvbnN0X2V4cHJzXzcsIHJocy5jb25zdF9leHByc184LCByaHMuY29uc3RfZXhwcnNfOSwgcmhzLmNvbnN0X2V4cHJzXzEwLCByaHMuYWRkU3RyaW5nMSwgcmhzLmFkZFN0cmluZzIsIHJocy5zaG91bGRTZXRCaXQwQW5kQml0MiwgcmhzLnUsIHJocy5zaG91bGRCZUNvbnN0UzEsIHJocy5kZWZhdWx0V2l0aEZvbyk7Ci0gIH0KLSAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBTdHJ1Y3R1cmVkUGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0ZDo6dGllKHNob3VsZENvbnRhaW5UaHJlZUZzLCBmLCBzaG91bGRCZUplcnJ5LCBzaG91bGRCZUJ5dGVCYXIsIHNob3VsZEJlSW50QmFyLCBzaG91bGRCZUxvbmdCYXIsIHNob3VsZENvbnRhaW5Ud29CeXRlRm9vcywgc2hvdWxkQ29udGFpblR3b0ludEZvb3MsIHNob3VsZENvbnRhaW5Ud29Mb25nRm9vcywgc3RyaW5nRGVmYXVsdHNUb0ZvbywgYnl0ZURlZmF1bHRzVG9Gb3VyLCBpbnREZWZhdWx0c1RvRml2ZSwgbG9uZ0RlZmF1bHRzVG9OZWdhdGl2ZVNldmVuLCBib29sZWFuRGVmYXVsdHNUb1RydWUsIGNoYXJEZWZhdWx0c1RvQywgZmxvYXREZWZhdWx0c1RvUGksIGRvdWJsZVdpdGhEZWZhdWx0LCBhcnJheURlZmF1bHRzVG8xMjMsIGFycmF5RGVmYXVsdHNUb0VtcHR5LCBib29sRGVmYXVsdCwgYnl0ZURlZmF1bHQsIGludERlZmF1bHQsIGxvbmdEZWZhdWx0LCBmbG9hdERlZmF1bHQsIGRvdWJsZURlZmF1bHQsIGNoZWNrRG91YmxlRnJvbUZsb2F0LCBjaGVja1N0cmluZ0FycmF5MSwgY2hlY2tTdHJpbmdBcnJheTIsIGludDMyX21pbiwgaW50MzJfbWF4LCBpbnQ2NF9tYXgsIGhleEludDMyX25lZ18xLCBpYmluZGVyLCBpbnQzMl8xLCBpbnQ2NF8xLCBoZXhJbnQzMl9wb3NfMSwgaGV4SW50NjRfcG9zXzEsIGNvbnN0X2V4cHJzXzEsIGNvbnN0X2V4cHJzXzIsIGNvbnN0X2V4cHJzXzMsIGNvbnN0X2V4cHJzXzQsIGNvbnN0X2V4cHJzXzUsIGNvbnN0X2V4cHJzXzYsIGNvbnN0X2V4cHJzXzcsIGNvbnN0X2V4cHJzXzgsIGNvbnN0X2V4cHJzXzksIGNvbnN0X2V4cHJzXzEwLCBhZGRTdHJpbmcxLCBhZGRTdHJpbmcyLCBzaG91bGRTZXRCaXQwQW5kQml0MiwgdSwgc2hvdWxkQmVDb25zdFMxLCBkZWZhdWx0V2l0aEZvbykgPD0gc3RkOjp0aWUocmhzLnNob3VsZENvbnRhaW5UaHJlZUZzLCByaHMuZiwgcmhzLnNob3VsZEJlSmVycnksIHJocy5zaG91bGRCZUJ5dGVCYXIsIHJocy5zaG91bGRCZUludEJhciwgcmhzLnNob3VsZEJlTG9uZ0JhciwgcmhzLnNob3VsZENvbnRhaW5Ud29CeXRlRm9vcywgcmhzLnNob3VsZENvbnRhaW5Ud29JbnRGb29zLCByaHMuc2hvdWxkQ29udGFpblR3b0xvbmdGb29zLCByaHMuc3RyaW5nRGVmYXVsdHNUb0ZvbywgcmhzLmJ5dGVEZWZhdWx0c1RvRm91ciwgcmhzLmludERlZmF1bHRzVG9GaXZlLCByaHMubG9uZ0RlZmF1bHRzVG9OZWdhdGl2ZVNldmVuLCByaHMuYm9vbGVhbkRlZmF1bHRzVG9UcnVlLCByaHMuY2hhckRlZmF1bHRzVG9DLCByaHMuZmxvYXREZWZhdWx0c1RvUGksIHJocy5kb3VibGVXaXRoRGVmYXVsdCwgcmhzLmFycmF5RGVmYXVsdHNUbzEyMywgcmhzLmFycmF5RGVmYXVsdHNUb0VtcHR5LCByaHMuYm9vbERlZmF1bHQsIHJocy5ieXRlRGVmYXVsdCwgcmhzLmludERlZmF1bHQsIHJocy5sb25nRGVmYXVsdCwgcmhzLmZsb2F0RGVmYXVsdCwgcmhzLmRvdWJsZURlZmF1bHQsIHJocy5jaGVja0RvdWJsZUZyb21GbG9hdCwgcmhzLmNoZWNrU3RyaW5nQXJyYXkxLCByaHMuY2hlY2tTdHJpbmdBcnJheTIsIHJocy5pbnQzMl9taW4sIHJocy5pbnQzMl9tYXgsIHJocy5pbnQ2NF9tYXgsIHJocy5oZXhJbnQzMl9uZWdfMSwgcmhzLmliaW5kZXIsIHJocy5pbnQzMl8xLCByaHMuaW50NjRfMSwgcmhzLmhleEludDMyX3Bvc18xLCByaHMuaGV4SW50NjRfcG9zXzEsIHJocy5jb25zdF9leHByc18xLCByaHMuY29uc3RfZXhwcnNfMiwgcmhzLmNvbnN0X2V4cHJzXzMsIHJocy5jb25zdF9leHByc180LCByaHMuY29uc3RfZXhwcnNfNSwgcmhzLmNvbnN0X2V4cHJzXzYsIHJocy5jb25zdF9leHByc183LCByaHMuY29uc3RfZXhwcnNfOCwgcmhzLmNvbnN0X2V4cHJzXzksIHJocy5jb25zdF9leHByc18xMCwgcmhzLmFkZFN0cmluZzEsIHJocy5hZGRTdHJpbmcyLCByaHMuc2hvdWxkU2V0Qml0MEFuZEJpdDIsIHJocy51LCByaHMuc2hvdWxkQmVDb25zdFMxLCByaHMuZGVmYXVsdFdpdGhGb28pOwotICB9Ci0gIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgU3RydWN0dXJlZFBhcmNlbGFibGUmIHJocykgY29uc3QgewotICAgIHJldHVybiBzdGQ6OnRpZShzaG91bGRDb250YWluVGhyZWVGcywgZiwgc2hvdWxkQmVKZXJyeSwgc2hvdWxkQmVCeXRlQmFyLCBzaG91bGRCZUludEJhciwgc2hvdWxkQmVMb25nQmFyLCBzaG91bGRDb250YWluVHdvQnl0ZUZvb3MsIHNob3VsZENvbnRhaW5Ud29JbnRGb29zLCBzaG91bGRDb250YWluVHdvTG9uZ0Zvb3MsIHN0cmluZ0RlZmF1bHRzVG9Gb28sIGJ5dGVEZWZhdWx0c1RvRm91ciwgaW50RGVmYXVsdHNUb0ZpdmUsIGxvbmdEZWZhdWx0c1RvTmVnYXRpdmVTZXZlbiwgYm9vbGVhbkRlZmF1bHRzVG9UcnVlLCBjaGFyRGVmYXVsdHNUb0MsIGZsb2F0RGVmYXVsdHNUb1BpLCBkb3VibGVXaXRoRGVmYXVsdCwgYXJyYXlEZWZhdWx0c1RvMTIzLCBhcnJheURlZmF1bHRzVG9FbXB0eSwgYm9vbERlZmF1bHQsIGJ5dGVEZWZhdWx0LCBpbnREZWZhdWx0LCBsb25nRGVmYXVsdCwgZmxvYXREZWZhdWx0LCBkb3VibGVEZWZhdWx0LCBjaGVja0RvdWJsZUZyb21GbG9hdCwgY2hlY2tTdHJpbmdBcnJheTEsIGNoZWNrU3RyaW5nQXJyYXkyLCBpbnQzMl9taW4sIGludDMyX21heCwgaW50NjRfbWF4LCBoZXhJbnQzMl9uZWdfMSwgaWJpbmRlciwgaW50MzJfMSwgaW50NjRfMSwgaGV4SW50MzJfcG9zXzEsIGhleEludDY0X3Bvc18xLCBjb25zdF9leHByc18xLCBjb25zdF9leHByc18yLCBjb25zdF9leHByc18zLCBjb25zdF9leHByc180LCBjb25zdF9leHByc181LCBjb25zdF9leHByc182LCBjb25zdF9leHByc183LCBjb25zdF9leHByc184LCBjb25zdF9leHByc185LCBjb25zdF9leHByc18xMCwgYWRkU3RyaW5nMSwgYWRkU3RyaW5nMiwgc2hvdWxkU2V0Qml0MEFuZEJpdDIsIHUsIHNob3VsZEJlQ29uc3RTMSwgZGVmYXVsdFdpdGhGb28pID09IHN0ZDo6dGllKHJocy5zaG91bGRDb250YWluVGhyZWVGcywgcmhzLmYsIHJocy5zaG91bGRCZUplcnJ5LCByaHMuc2hvdWxkQmVCeXRlQmFyLCByaHMuc2hvdWxkQmVJbnRCYXIsIHJocy5zaG91bGRCZUxvbmdCYXIsIHJocy5zaG91bGRDb250YWluVHdvQnl0ZUZvb3MsIHJocy5zaG91bGRDb250YWluVHdvSW50Rm9vcywgcmhzLnNob3VsZENvbnRhaW5Ud29Mb25nRm9vcywgcmhzLnN0cmluZ0RlZmF1bHRzVG9Gb28sIHJocy5ieXRlRGVmYXVsdHNUb0ZvdXIsIHJocy5pbnREZWZhdWx0c1RvRml2ZSwgcmhzLmxvbmdEZWZhdWx0c1RvTmVnYXRpdmVTZXZlbiwgcmhzLmJvb2xlYW5EZWZhdWx0c1RvVHJ1ZSwgcmhzLmNoYXJEZWZhdWx0c1RvQywgcmhzLmZsb2F0RGVmYXVsdHNUb1BpLCByaHMuZG91YmxlV2l0aERlZmF1bHQsIHJocy5hcnJheURlZmF1bHRzVG8xMjMsIHJocy5hcnJheURlZmF1bHRzVG9FbXB0eSwgcmhzLmJvb2xEZWZhdWx0LCByaHMuYnl0ZURlZmF1bHQsIHJocy5pbnREZWZhdWx0LCByaHMubG9uZ0RlZmF1bHQsIHJocy5mbG9hdERlZmF1bHQsIHJocy5kb3VibGVEZWZhdWx0LCByaHMuY2hlY2tEb3VibGVGcm9tRmxvYXQsIHJocy5jaGVja1N0cmluZ0FycmF5MSwgcmhzLmNoZWNrU3RyaW5nQXJyYXkyLCByaHMuaW50MzJfbWluLCByaHMuaW50MzJfbWF4LCByaHMuaW50NjRfbWF4LCByaHMuaGV4SW50MzJfbmVnXzEsIHJocy5pYmluZGVyLCByaHMuaW50MzJfMSwgcmhzLmludDY0XzEsIHJocy5oZXhJbnQzMl9wb3NfMSwgcmhzLmhleEludDY0X3Bvc18xLCByaHMuY29uc3RfZXhwcnNfMSwgcmhzLmNvbnN0X2V4cHJzXzIsIHJocy5jb25zdF9leHByc18zLCByaHMuY29uc3RfZXhwcnNfNCwgcmhzLmNvbnN0X2V4cHJzXzUsIHJocy5jb25zdF9leHByc182LCByaHMuY29uc3RfZXhwcnNfNywgcmhzLmNvbnN0X2V4cHJzXzgsIHJocy5jb25zdF9leHByc185LCByaHMuY29uc3RfZXhwcnNfMTAsIHJocy5hZGRTdHJpbmcxLCByaHMuYWRkU3RyaW5nMiwgcmhzLnNob3VsZFNldEJpdDBBbmRCaXQyLCByaHMudSwgcmhzLnNob3VsZEJlQ29uc3RTMSwgcmhzLmRlZmF1bHRXaXRoRm9vKTsKLSAgfQotICBpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgU3RydWN0dXJlZFBhcmNlbGFibGUmIHJocykgY29uc3QgewotICAgIHJldHVybiBzdGQ6OnRpZShzaG91bGRDb250YWluVGhyZWVGcywgZiwgc2hvdWxkQmVKZXJyeSwgc2hvdWxkQmVCeXRlQmFyLCBzaG91bGRCZUludEJhciwgc2hvdWxkQmVMb25nQmFyLCBzaG91bGRDb250YWluVHdvQnl0ZUZvb3MsIHNob3VsZENvbnRhaW5Ud29JbnRGb29zLCBzaG91bGRDb250YWluVHdvTG9uZ0Zvb3MsIHN0cmluZ0RlZmF1bHRzVG9Gb28sIGJ5dGVEZWZhdWx0c1RvRm91ciwgaW50RGVmYXVsdHNUb0ZpdmUsIGxvbmdEZWZhdWx0c1RvTmVnYXRpdmVTZXZlbiwgYm9vbGVhbkRlZmF1bHRzVG9UcnVlLCBjaGFyRGVmYXVsdHNUb0MsIGZsb2F0RGVmYXVsdHNUb1BpLCBkb3VibGVXaXRoRGVmYXVsdCwgYXJyYXlEZWZhdWx0c1RvMTIzLCBhcnJheURlZmF1bHRzVG9FbXB0eSwgYm9vbERlZmF1bHQsIGJ5dGVEZWZhdWx0LCBpbnREZWZhdWx0LCBsb25nRGVmYXVsdCwgZmxvYXREZWZhdWx0LCBkb3VibGVEZWZhdWx0LCBjaGVja0RvdWJsZUZyb21GbG9hdCwgY2hlY2tTdHJpbmdBcnJheTEsIGNoZWNrU3RyaW5nQXJyYXkyLCBpbnQzMl9taW4sIGludDMyX21heCwgaW50NjRfbWF4LCBoZXhJbnQzMl9uZWdfMSwgaWJpbmRlciwgaW50MzJfMSwgaW50NjRfMSwgaGV4SW50MzJfcG9zXzEsIGhleEludDY0X3Bvc18xLCBjb25zdF9leHByc18xLCBjb25zdF9leHByc18yLCBjb25zdF9leHByc18zLCBjb25zdF9leHByc180LCBjb25zdF9leHByc181LCBjb25zdF9leHByc182LCBjb25zdF9leHByc183LCBjb25zdF9leHByc184LCBjb25zdF9leHByc185LCBjb25zdF9leHByc18xMCwgYWRkU3RyaW5nMSwgYWRkU3RyaW5nMiwgc2hvdWxkU2V0Qml0MEFuZEJpdDIsIHUsIHNob3VsZEJlQ29uc3RTMSwgZGVmYXVsdFdpdGhGb28pID4gc3RkOjp0aWUocmhzLnNob3VsZENvbnRhaW5UaHJlZUZzLCByaHMuZiwgcmhzLnNob3VsZEJlSmVycnksIHJocy5zaG91bGRCZUJ5dGVCYXIsIHJocy5zaG91bGRCZUludEJhciwgcmhzLnNob3VsZEJlTG9uZ0JhciwgcmhzLnNob3VsZENvbnRhaW5Ud29CeXRlRm9vcywgcmhzLnNob3VsZENvbnRhaW5Ud29JbnRGb29zLCByaHMuc2hvdWxkQ29udGFpblR3b0xvbmdGb29zLCByaHMuc3RyaW5nRGVmYXVsdHNUb0ZvbywgcmhzLmJ5dGVEZWZhdWx0c1RvRm91ciwgcmhzLmludERlZmF1bHRzVG9GaXZlLCByaHMubG9uZ0RlZmF1bHRzVG9OZWdhdGl2ZVNldmVuLCByaHMuYm9vbGVhbkRlZmF1bHRzVG9UcnVlLCByaHMuY2hhckRlZmF1bHRzVG9DLCByaHMuZmxvYXREZWZhdWx0c1RvUGksIHJocy5kb3VibGVXaXRoRGVmYXVsdCwgcmhzLmFycmF5RGVmYXVsdHNUbzEyMywgcmhzLmFycmF5RGVmYXVsdHNUb0VtcHR5LCByaHMuYm9vbERlZmF1bHQsIHJocy5ieXRlRGVmYXVsdCwgcmhzLmludERlZmF1bHQsIHJocy5sb25nRGVmYXVsdCwgcmhzLmZsb2F0RGVmYXVsdCwgcmhzLmRvdWJsZURlZmF1bHQsIHJocy5jaGVja0RvdWJsZUZyb21GbG9hdCwgcmhzLmNoZWNrU3RyaW5nQXJyYXkxLCByaHMuY2hlY2tTdHJpbmdBcnJheTIsIHJocy5pbnQzMl9taW4sIHJocy5pbnQzMl9tYXgsIHJocy5pbnQ2NF9tYXgsIHJocy5oZXhJbnQzMl9uZWdfMSwgcmhzLmliaW5kZXIsIHJocy5pbnQzMl8xLCByaHMuaW50NjRfMSwgcmhzLmhleEludDMyX3Bvc18xLCByaHMuaGV4SW50NjRfcG9zXzEsIHJocy5jb25zdF9leHByc18xLCByaHMuY29uc3RfZXhwcnNfMiwgcmhzLmNvbnN0X2V4cHJzXzMsIHJocy5jb25zdF9leHByc180LCByaHMuY29uc3RfZXhwcnNfNSwgcmhzLmNvbnN0X2V4cHJzXzYsIHJocy5jb25zdF9leHByc183LCByaHMuY29uc3RfZXhwcnNfOCwgcmhzLmNvbnN0X2V4cHJzXzksIHJocy5jb25zdF9leHByc18xMCwgcmhzLmFkZFN0cmluZzEsIHJocy5hZGRTdHJpbmcyLCByaHMuc2hvdWxkU2V0Qml0MEFuZEJpdDIsIHJocy51LCByaHMuc2hvdWxkQmVDb25zdFMxLCByaHMuZGVmYXVsdFdpdGhGb28pOwotICB9Ci0gIGlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgU3RydWN0dXJlZFBhcmNlbGFibGUmIHJocykgY29uc3QgewotICAgIHJldHVybiBzdGQ6OnRpZShzaG91bGRDb250YWluVGhyZWVGcywgZiwgc2hvdWxkQmVKZXJyeSwgc2hvdWxkQmVCeXRlQmFyLCBzaG91bGRCZUludEJhciwgc2hvdWxkQmVMb25nQmFyLCBzaG91bGRDb250YWluVHdvQnl0ZUZvb3MsIHNob3VsZENvbnRhaW5Ud29JbnRGb29zLCBzaG91bGRDb250YWluVHdvTG9uZ0Zvb3MsIHN0cmluZ0RlZmF1bHRzVG9Gb28sIGJ5dGVEZWZhdWx0c1RvRm91ciwgaW50RGVmYXVsdHNUb0ZpdmUsIGxvbmdEZWZhdWx0c1RvTmVnYXRpdmVTZXZlbiwgYm9vbGVhbkRlZmF1bHRzVG9UcnVlLCBjaGFyRGVmYXVsdHNUb0MsIGZsb2F0RGVmYXVsdHNUb1BpLCBkb3VibGVXaXRoRGVmYXVsdCwgYXJyYXlEZWZhdWx0c1RvMTIzLCBhcnJheURlZmF1bHRzVG9FbXB0eSwgYm9vbERlZmF1bHQsIGJ5dGVEZWZhdWx0LCBpbnREZWZhdWx0LCBsb25nRGVmYXVsdCwgZmxvYXREZWZhdWx0LCBkb3VibGVEZWZhdWx0LCBjaGVja0RvdWJsZUZyb21GbG9hdCwgY2hlY2tTdHJpbmdBcnJheTEsIGNoZWNrU3RyaW5nQXJyYXkyLCBpbnQzMl9taW4sIGludDMyX21heCwgaW50NjRfbWF4LCBoZXhJbnQzMl9uZWdfMSwgaWJpbmRlciwgaW50MzJfMSwgaW50NjRfMSwgaGV4SW50MzJfcG9zXzEsIGhleEludDY0X3Bvc18xLCBjb25zdF9leHByc18xLCBjb25zdF9leHByc18yLCBjb25zdF9leHByc18zLCBjb25zdF9leHByc180LCBjb25zdF9leHByc181LCBjb25zdF9leHByc182LCBjb25zdF9leHByc183LCBjb25zdF9leHByc184LCBjb25zdF9leHByc185LCBjb25zdF9leHByc18xMCwgYWRkU3RyaW5nMSwgYWRkU3RyaW5nMiwgc2hvdWxkU2V0Qml0MEFuZEJpdDIsIHUsIHNob3VsZEJlQ29uc3RTMSwgZGVmYXVsdFdpdGhGb28pID49IHN0ZDo6dGllKHJocy5zaG91bGRDb250YWluVGhyZWVGcywgcmhzLmYsIHJocy5zaG91bGRCZUplcnJ5LCByaHMuc2hvdWxkQmVCeXRlQmFyLCByaHMuc2hvdWxkQmVJbnRCYXIsIHJocy5zaG91bGRCZUxvbmdCYXIsIHJocy5zaG91bGRDb250YWluVHdvQnl0ZUZvb3MsIHJocy5zaG91bGRDb250YWluVHdvSW50Rm9vcywgcmhzLnNob3VsZENvbnRhaW5Ud29Mb25nRm9vcywgcmhzLnN0cmluZ0RlZmF1bHRzVG9Gb28sIHJocy5ieXRlRGVmYXVsdHNUb0ZvdXIsIHJocy5pbnREZWZhdWx0c1RvRml2ZSwgcmhzLmxvbmdEZWZhdWx0c1RvTmVnYXRpdmVTZXZlbiwgcmhzLmJvb2xlYW5EZWZhdWx0c1RvVHJ1ZSwgcmhzLmNoYXJEZWZhdWx0c1RvQywgcmhzLmZsb2F0RGVmYXVsdHNUb1BpLCByaHMuZG91YmxlV2l0aERlZmF1bHQsIHJocy5hcnJheURlZmF1bHRzVG8xMjMsIHJocy5hcnJheURlZmF1bHRzVG9FbXB0eSwgcmhzLmJvb2xEZWZhdWx0LCByaHMuYnl0ZURlZmF1bHQsIHJocy5pbnREZWZhdWx0LCByaHMubG9uZ0RlZmF1bHQsIHJocy5mbG9hdERlZmF1bHQsIHJocy5kb3VibGVEZWZhdWx0LCByaHMuY2hlY2tEb3VibGVGcm9tRmxvYXQsIHJocy5jaGVja1N0cmluZ0FycmF5MSwgcmhzLmNoZWNrU3RyaW5nQXJyYXkyLCByaHMuaW50MzJfbWluLCByaHMuaW50MzJfbWF4LCByaHMuaW50NjRfbWF4LCByaHMuaGV4SW50MzJfbmVnXzEsIHJocy5pYmluZGVyLCByaHMuaW50MzJfMSwgcmhzLmludDY0XzEsIHJocy5oZXhJbnQzMl9wb3NfMSwgcmhzLmhleEludDY0X3Bvc18xLCByaHMuY29uc3RfZXhwcnNfMSwgcmhzLmNvbnN0X2V4cHJzXzIsIHJocy5jb25zdF9leHByc18zLCByaHMuY29uc3RfZXhwcnNfNCwgcmhzLmNvbnN0X2V4cHJzXzUsIHJocy5jb25zdF9leHByc182LCByaHMuY29uc3RfZXhwcnNfNywgcmhzLmNvbnN0X2V4cHJzXzgsIHJocy5jb25zdF9leHByc185LCByaHMuY29uc3RfZXhwcnNfMTAsIHJocy5hZGRTdHJpbmcxLCByaHMuYWRkU3RyaW5nMiwgcmhzLnNob3VsZFNldEJpdDBBbmRCaXQyLCByaHMudSwgcmhzLnNob3VsZEJlQ29uc3RTMSwgcmhzLmRlZmF1bHRXaXRoRm9vKTsKLSAgfQotCi0gIHN0YXRpYyBjb25zdCA6Om5kazo6cGFyY2VsYWJsZV9zdGFiaWxpdHlfdCBfYWlkbF9zdGFiaWxpdHkgPSA6Om5kazo6U1RBQklMSVRZX0xPQ0FMOwotICBlbnVtIDogaW50MzJfdCB7IEJJVDAgPSAxIH07Ci0gIGVudW0gOiBpbnQzMl90IHsgQklUMSA9IDIgfTsKLSAgZW51bSA6IGludDMyX3QgeyBCSVQyID0gNCB9OwotICBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7Ci0gICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOwotICAgIG9zIDw8ICJTdHJ1Y3R1cmVkUGFyY2VsYWJsZXsiOwotICAgIG9zIDw8ICJzaG91bGRDb250YWluVGhyZWVGczogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhzaG91bGRDb250YWluVGhyZWVGcyk7Ci0gICAgb3MgPDwgIiwgZjogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhmKTsKLSAgICBvcyA8PCAiLCBzaG91bGRCZUplcnJ5OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKHNob3VsZEJlSmVycnkpOwotICAgIG9zIDw8ICIsIHNob3VsZEJlQnl0ZUJhcjogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhzaG91bGRCZUJ5dGVCYXIpOwotICAgIG9zIDw8ICIsIHNob3VsZEJlSW50QmFyOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKHNob3VsZEJlSW50QmFyKTsKLSAgICBvcyA8PCAiLCBzaG91bGRCZUxvbmdCYXI6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoc2hvdWxkQmVMb25nQmFyKTsKLSAgICBvcyA8PCAiLCBzaG91bGRDb250YWluVHdvQnl0ZUZvb3M6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoc2hvdWxkQ29udGFpblR3b0J5dGVGb29zKTsKLSAgICBvcyA8PCAiLCBzaG91bGRDb250YWluVHdvSW50Rm9vczogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhzaG91bGRDb250YWluVHdvSW50Rm9vcyk7Ci0gICAgb3MgPDwgIiwgc2hvdWxkQ29udGFpblR3b0xvbmdGb29zOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKHNob3VsZENvbnRhaW5Ud29Mb25nRm9vcyk7Ci0gICAgb3MgPDwgIiwgc3RyaW5nRGVmYXVsdHNUb0ZvbzogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhzdHJpbmdEZWZhdWx0c1RvRm9vKTsKLSAgICBvcyA8PCAiLCBieXRlRGVmYXVsdHNUb0ZvdXI6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoYnl0ZURlZmF1bHRzVG9Gb3VyKTsKLSAgICBvcyA8PCAiLCBpbnREZWZhdWx0c1RvRml2ZTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbnREZWZhdWx0c1RvRml2ZSk7Ci0gICAgb3MgPDwgIiwgbG9uZ0RlZmF1bHRzVG9OZWdhdGl2ZVNldmVuOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGxvbmdEZWZhdWx0c1RvTmVnYXRpdmVTZXZlbik7Ci0gICAgb3MgPDwgIiwgYm9vbGVhbkRlZmF1bHRzVG9UcnVlOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGJvb2xlYW5EZWZhdWx0c1RvVHJ1ZSk7Ci0gICAgb3MgPDwgIiwgY2hhckRlZmF1bHRzVG9DOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGNoYXJEZWZhdWx0c1RvQyk7Ci0gICAgb3MgPDwgIiwgZmxvYXREZWZhdWx0c1RvUGk6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoZmxvYXREZWZhdWx0c1RvUGkpOwotICAgIG9zIDw8ICIsIGRvdWJsZVdpdGhEZWZhdWx0OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGRvdWJsZVdpdGhEZWZhdWx0KTsKLSAgICBvcyA8PCAiLCBhcnJheURlZmF1bHRzVG8xMjM6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoYXJyYXlEZWZhdWx0c1RvMTIzKTsKLSAgICBvcyA8PCAiLCBhcnJheURlZmF1bHRzVG9FbXB0eTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhhcnJheURlZmF1bHRzVG9FbXB0eSk7Ci0gICAgb3MgPDwgIiwgYm9vbERlZmF1bHQ6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoYm9vbERlZmF1bHQpOwotICAgIG9zIDw8ICIsIGJ5dGVEZWZhdWx0OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGJ5dGVEZWZhdWx0KTsKLSAgICBvcyA8PCAiLCBpbnREZWZhdWx0OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGludERlZmF1bHQpOwotICAgIG9zIDw8ICIsIGxvbmdEZWZhdWx0OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGxvbmdEZWZhdWx0KTsKLSAgICBvcyA8PCAiLCBmbG9hdERlZmF1bHQ6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoZmxvYXREZWZhdWx0KTsKLSAgICBvcyA8PCAiLCBkb3VibGVEZWZhdWx0OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGRvdWJsZURlZmF1bHQpOwotICAgIG9zIDw8ICIsIGNoZWNrRG91YmxlRnJvbUZsb2F0OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGNoZWNrRG91YmxlRnJvbUZsb2F0KTsKLSAgICBvcyA8PCAiLCBjaGVja1N0cmluZ0FycmF5MTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhjaGVja1N0cmluZ0FycmF5MSk7Ci0gICAgb3MgPDwgIiwgY2hlY2tTdHJpbmdBcnJheTI6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoY2hlY2tTdHJpbmdBcnJheTIpOwotICAgIG9zIDw8ICIsIGludDMyX21pbjogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbnQzMl9taW4pOwotICAgIG9zIDw8ICIsIGludDMyX21heDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbnQzMl9tYXgpOwotICAgIG9zIDw8ICIsIGludDY0X21heDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbnQ2NF9tYXgpOwotICAgIG9zIDw8ICIsIGhleEludDMyX25lZ18xOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGhleEludDMyX25lZ18xKTsKLSAgICBvcyA8PCAiLCBpYmluZGVyOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGliaW5kZXIpOwotICAgIG9zIDw8ICIsIGludDMyXzE6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaW50MzJfMSk7Ci0gICAgb3MgPDwgIiwgaW50NjRfMTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbnQ2NF8xKTsKLSAgICBvcyA8PCAiLCBoZXhJbnQzMl9wb3NfMTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhoZXhJbnQzMl9wb3NfMSk7Ci0gICAgb3MgPDwgIiwgaGV4SW50NjRfcG9zXzE6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaGV4SW50NjRfcG9zXzEpOwotICAgIG9zIDw8ICIsIGNvbnN0X2V4cHJzXzE6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoY29uc3RfZXhwcnNfMSk7Ci0gICAgb3MgPDwgIiwgY29uc3RfZXhwcnNfMjogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhjb25zdF9leHByc18yKTsKLSAgICBvcyA8PCAiLCBjb25zdF9leHByc18zOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGNvbnN0X2V4cHJzXzMpOwotICAgIG9zIDw8ICIsIGNvbnN0X2V4cHJzXzQ6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoY29uc3RfZXhwcnNfNCk7Ci0gICAgb3MgPDwgIiwgY29uc3RfZXhwcnNfNTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhjb25zdF9leHByc181KTsKLSAgICBvcyA8PCAiLCBjb25zdF9leHByc182OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGNvbnN0X2V4cHJzXzYpOwotICAgIG9zIDw8ICIsIGNvbnN0X2V4cHJzXzc6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoY29uc3RfZXhwcnNfNyk7Ci0gICAgb3MgPDwgIiwgY29uc3RfZXhwcnNfODogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhjb25zdF9leHByc184KTsKLSAgICBvcyA8PCAiLCBjb25zdF9leHByc185OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGNvbnN0X2V4cHJzXzkpOwotICAgIG9zIDw8ICIsIGNvbnN0X2V4cHJzXzEwOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGNvbnN0X2V4cHJzXzEwKTsKLSAgICBvcyA8PCAiLCBhZGRTdHJpbmcxOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGFkZFN0cmluZzEpOwotICAgIG9zIDw8ICIsIGFkZFN0cmluZzI6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoYWRkU3RyaW5nMik7Ci0gICAgb3MgPDwgIiwgc2hvdWxkU2V0Qml0MEFuZEJpdDI6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoc2hvdWxkU2V0Qml0MEFuZEJpdDIpOwotICAgIG9zIDw8ICIsIHU6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcodSk7Ci0gICAgb3MgPDwgIiwgc2hvdWxkQmVDb25zdFMxOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKHNob3VsZEJlQ29uc3RTMSk7Ci0gICAgb3MgPDwgIiwgZGVmYXVsdFdpdGhGb286ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoZGVmYXVsdFdpdGhGb28pOwotICAgIG9zIDw8ICJ9IjsKLSAgICByZXR1cm4gb3Muc3RyKCk7Ci0gIH0KLX07Ci19ICAvLyBuYW1lc3BhY2UgdGVzdHMKLX0gIC8vIG5hbWVzcGFjZSBhaWRsCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9FbnVtVW5pb24uaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9FbnVtVW5pb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYxMzQ1Yy4uMDAwMDAwMAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvRW51bVVuaW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotI3ByYWdtYSBvbmNlCi0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaW50ZXJmYWNlX3V0aWxzLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcGFyY2VsYWJsZV91dGlscy5oPgotI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3RvX3N0cmluZy5oPgotCi0jaW5jbHVkZSA8Y2Fzc2VydD4KLSNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KLSNpbmNsdWRlIDx1dGlsaXR5PgotI2luY2x1ZGUgPHZhcmlhbnQ+Ci0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8b3B0aW9uYWw+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9zdGFiaWxpdHkuaD4KLSNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCi0jaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvSW50RW51bS5oPgotI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0xvbmdFbnVtLmg+Ci0KLSNpZm5kZWYgX19CSU9OSUNfXwotI2RlZmluZSBfX2Fzc2VydDIoYSxiLGMsZCkgKCh2b2lkKTApCi0jZW5kaWYKLQotbmFtZXNwYWNlIGFpZGwgewotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGFpZGwgewotbmFtZXNwYWNlIHRlc3RzIHsKLW5hbWVzcGFjZSB1bmlvbnMgewotY2xhc3MgRW51bVVuaW9uIHsKLXB1YmxpYzoKLSAgdHlwZWRlZiBzdGQ6OmZhbHNlX3R5cGUgZml4ZWRfc2l6ZTsKLSAgc3RhdGljIGNvbnN0IGNoYXIqIGRlc2NyaXB0b3I7Ci0KLSAgZW51bSBUYWcgOiBpbnQzMl90IHsKLSAgICBpbnRFbnVtID0gMCwgIC8vIGFuZHJvaWQuYWlkbC50ZXN0cy5JbnRFbnVtIGludEVudW07Ci0gICAgbG9uZ0VudW0sICAvLyBhbmRyb2lkLmFpZGwudGVzdHMuTG9uZ0VudW0gbG9uZ0VudW07Ci0gIH07Ci0KLSAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgotICBzdGF0aWMgY29uc3RleHByIGJvb2wgX25vdF9zZWxmID0gIXN0ZDo6aXNfc2FtZV92PHN0ZDo6cmVtb3ZlX2N2X3Q8c3RkOjpyZW1vdmVfcmVmZXJlbmNlX3Q8X1RwPj4sIEVudW1Vbmlvbj47Ci0KLSAgRW51bVVuaW9uKCkgOiBfdmFsdWUoc3RkOjppbl9wbGFjZV9pbmRleDxpbnRFbnVtPiwgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bSg6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtOjpGT08pKSB7IH0KLSAgRW51bVVuaW9uKGNvbnN0IEVudW1VbmlvbiYpID0gZGVmYXVsdDsKLSAgRW51bVVuaW9uKEVudW1VbmlvbiYmKSA9IGRlZmF1bHQ7Ci0gIEVudW1VbmlvbiYgb3BlcmF0b3I9KGNvbnN0IEVudW1VbmlvbiYpID0gZGVmYXVsdDsKLSAgRW51bVVuaW9uJiBvcGVyYXRvcj0oRW51bVVuaW9uJiYpID0gZGVmYXVsdDsKLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSA9IHN0ZDo6ZW5hYmxlX2lmX3Q8X25vdF9zZWxmPF9UcD4+PgotICAvLyBOT0xJTlRORVhUTElORShnb29nbGUtZXhwbGljaXQtY29uc3RydWN0b3IpCi0gIGNvbnN0ZXhwciBFbnVtVW5pb24oX1RwJiYgX2FyZykKLSAgICAgIDogX3ZhbHVlKHN0ZDo6Zm9yd2FyZDxfVHA+KF9hcmcpKSB7fQotCi0gIHRlbXBsYXRlIDxzaXplX3QgX05wLCB0eXBlbmFtZS4uLiBfVHA+Ci0gIGNvbnN0ZXhwciBleHBsaWNpdCBFbnVtVW5pb24oc3RkOjppbl9wbGFjZV9pbmRleF90PF9OcD4sIF9UcCYmLi4uIF9hcmdzKQotICAgICAgOiBfdmFsdWUoc3RkOjppbl9wbGFjZV9pbmRleDxfTnA+LCBzdGQ6OmZvcndhcmQ8X1RwPihfYXJncykuLi4pIHt9Ci0KLSAgdGVtcGxhdGUgPFRhZyBfdGFnLCB0eXBlbmFtZS4uLiBfVHA+Ci0gIHN0YXRpYyBFbnVtVW5pb24gbWFrZShfVHAmJi4uLiBfYXJncykgewotICAgIHJldHVybiBFbnVtVW5pb24oc3RkOjppbl9wbGFjZV9pbmRleDxfdGFnPiwgc3RkOjpmb3J3YXJkPF9UcD4oX2FyZ3MpLi4uKTsKLSAgfQotCi0gIHRlbXBsYXRlIDxUYWcgX3RhZywgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZS4uLiBfVXA+Ci0gIHN0YXRpYyBFbnVtVW5pb24gbWFrZShzdGQ6OmluaXRpYWxpemVyX2xpc3Q8X1RwPiBfaWwsIF9VcCYmLi4uIF9hcmdzKSB7Ci0gICAgcmV0dXJuIEVudW1VbmlvbihzdGQ6OmluX3BsYWNlX2luZGV4PF90YWc+LCBzdGQ6Om1vdmUoX2lsKSwgc3RkOjpmb3J3YXJkPF9VcD4oX2FyZ3MpLi4uKTsKLSAgfQotCi0gIFRhZyBnZXRUYWcoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFRhZz4oX3ZhbHVlLmluZGV4KCkpOwotICB9Ci0KLSAgdGVtcGxhdGUgPFRhZyBfdGFnPgotICBjb25zdCBhdXRvJiBnZXQoKSBjb25zdCB7Ci0gICAgaWYgKGdldFRhZygpICE9IF90YWcpIHsgX19hc3NlcnQyKF9fRklMRV9fLCBfX0xJTkVfXywgX19QUkVUVFlfRlVOQ1RJT05fXywgImJhZCBhY2Nlc3M6IGEgd3JvbmcgdGFnIik7IH0KLSAgICByZXR1cm4gc3RkOjpnZXQ8X3RhZz4oX3ZhbHVlKTsKLSAgfQotCi0gIHRlbXBsYXRlIDxUYWcgX3RhZz4KLSAgYXV0byYgZ2V0KCkgewotICAgIGlmIChnZXRUYWcoKSAhPSBfdGFnKSB7IF9fYXNzZXJ0MihfX0ZJTEVfXywgX19MSU5FX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18sICJiYWQgYWNjZXNzOiBhIHdyb25nIHRhZyIpOyB9Ci0gICAgcmV0dXJuIHN0ZDo6Z2V0PF90YWc+KF92YWx1ZSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8VGFnIF90YWcsIHR5cGVuYW1lLi4uIF9UcD4KLSAgdm9pZCBzZXQoX1RwJiYuLi4gX2FyZ3MpIHsKLSAgICBfdmFsdWUuZW1wbGFjZTxfdGFnPihzdGQ6OmZvcndhcmQ8X1RwPihfYXJncykuLi4pOwotICB9Ci0KLSAgYmluZGVyX3N0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIF9wYXJjZWwpOwotICBiaW5kZXJfc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChBUGFyY2VsKiBfcGFyY2VsKSBjb25zdDsKLQotICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEVudW1VbmlvbiYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuIF92YWx1ZSAhPSByaHMuX3ZhbHVlOwotICB9Ci0gIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBFbnVtVW5pb24mIHJocykgY29uc3QgewotICAgIHJldHVybiBfdmFsdWUgPCByaHMuX3ZhbHVlOwotICB9Ci0gIGlubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgRW51bVVuaW9uJiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gX3ZhbHVlIDw9IHJocy5fdmFsdWU7Ci0gIH0KLSAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBFbnVtVW5pb24mIHJocykgY29uc3QgewotICAgIHJldHVybiBfdmFsdWUgPT0gcmhzLl92YWx1ZTsKLSAgfQotICBpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgRW51bVVuaW9uJiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gX3ZhbHVlID4gcmhzLl92YWx1ZTsKLSAgfQotICBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IEVudW1VbmlvbiYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuIF92YWx1ZSA+PSByaHMuX3ZhbHVlOwotICB9Ci0KLSAgc3RhdGljIGNvbnN0IDo6bmRrOjpwYXJjZWxhYmxlX3N0YWJpbGl0eV90IF9haWRsX3N0YWJpbGl0eSA9IDo6bmRrOjpTVEFCSUxJVFlfTE9DQUw7Ci0gIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsKLSAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7Ci0gICAgb3MgPDwgIkVudW1VbmlvbnsiOwotICAgIHN3aXRjaCAoZ2V0VGFnKCkpIHsKLSAgICBjYXNlIGludEVudW06IG9zIDw8ICJpbnRFbnVtOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGdldDxpbnRFbnVtPigpKTsgYnJlYWs7Ci0gICAgY2FzZSBsb25nRW51bTogb3MgPDwgImxvbmdFbnVtOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGdldDxsb25nRW51bT4oKSk7IGJyZWFrOwotICAgIH0KLSAgICBvcyA8PCAifSI7Ci0gICAgcmV0dXJuIG9zLnN0cigpOwotICB9Ci1wcml2YXRlOgotICBzdGQ6OnZhcmlhbnQ8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bSwgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0+IF92YWx1ZTsKLX07Ci19ICAvLyBuYW1lc3BhY2UgdW5pb25zCi19ICAvLyBuYW1lc3BhY2UgdGVzdHMKLX0gIC8vIG5hbWVzcGFjZSBhaWRsCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1wZXJtaXNzaW9uLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9JUHJvdGVjdGVkLmphdmEgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcGVybWlzc2lvbi1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vSVByb3RlY3RlZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMGFjYjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcGVybWlzc2lvbi1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vSVByb3RlY3RlZC5qYXZhCkBAIC0wLDAgKzEsMjA3IEBACisvKgorICogVGhpcyBmaWxlIGlzIGF1dG8tZ2VuZXJhdGVkLiAgRE8gTk9UIE1PRElGWS4KKyAqLworcGFja2FnZSBhbmRyb2lkLmFpZGwudGVzdHMucGVybWlzc2lvbjsKK3B1YmxpYyBpbnRlcmZhY2UgSVByb3RlY3RlZCBleHRlbmRzIGFuZHJvaWQub3MuSUludGVyZmFjZQoreworICAvKiogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3IgSVByb3RlY3RlZC4gKi8KKyAgcHVibGljIHN0YXRpYyBjbGFzcyBEZWZhdWx0IGltcGxlbWVudHMgYW5kcm9pZC5haWRsLnRlc3RzLnBlcm1pc3Npb24uSVByb3RlY3RlZAorICB7CisgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIFBlcm1pc3Npb25Qcm90ZWN0ZWQoKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBNdWx0aXBsZVBlcm1pc3Npb25zQWxsKCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgTXVsdGlwbGVQZXJtaXNzaW9uc0FueSgpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIE5vbk1hbmlmZXN0UGVybWlzc2lvbigpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICB9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgfQorICAvKiogTG9jYWwtc2lkZSBJUEMgaW1wbGVtZW50YXRpb24gc3R1YiBjbGFzcy4gKi8KKyAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBTdHViIGV4dGVuZHMgYW5kcm9pZC5vcy5CaW5kZXIgaW1wbGVtZW50cyBhbmRyb2lkLmFpZGwudGVzdHMucGVybWlzc2lvbi5JUHJvdGVjdGVkCisgIHsKKyAgICAvKiogQ29uc3RydWN0IHRoZSBzdHViIGF0IGF0dGFjaCBpdCB0byB0aGUgaW50ZXJmYWNlLiAqLworICAgIHB1YmxpYyBTdHViKCkKKyAgICB7CisgICAgICB0aGlzLmF0dGFjaEludGVyZmFjZSh0aGlzLCBERVNDUklQVE9SKTsKKyAgICB9CisgICAgLyoqCisgICAgICogQ2FzdCBhbiBJQmluZGVyIG9iamVjdCBpbnRvIGFuIGFuZHJvaWQuYWlkbC50ZXN0cy5wZXJtaXNzaW9uLklQcm90ZWN0ZWQgaW50ZXJmYWNlLAorICAgICAqIGdlbmVyYXRpbmcgYSBwcm94eSBpZiBuZWVkZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBhbmRyb2lkLmFpZGwudGVzdHMucGVybWlzc2lvbi5JUHJvdGVjdGVkIGFzSW50ZXJmYWNlKGFuZHJvaWQub3MuSUJpbmRlciBvYmopCisgICAgeworICAgICAgaWYgKChvYmo9PW51bGwpKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgICAgYW5kcm9pZC5vcy5JSW50ZXJmYWNlIGlpbiA9IG9iai5xdWVyeUxvY2FsSW50ZXJmYWNlKERFU0NSSVBUT1IpOworICAgICAgaWYgKCgoaWluIT1udWxsKSYmKGlpbiBpbnN0YW5jZW9mIGFuZHJvaWQuYWlkbC50ZXN0cy5wZXJtaXNzaW9uLklQcm90ZWN0ZWQpKSkgeworICAgICAgICByZXR1cm4gKChhbmRyb2lkLmFpZGwudGVzdHMucGVybWlzc2lvbi5JUHJvdGVjdGVkKWlpbik7CisgICAgICB9CisgICAgICByZXR1cm4gbmV3IGFuZHJvaWQuYWlkbC50ZXN0cy5wZXJtaXNzaW9uLklQcm90ZWN0ZWQuU3R1Yi5Qcm94eShvYmopOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCisgICAgeworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgYm9vbGVhbiBvblRyYW5zYWN0KGludCBjb2RlLCBhbmRyb2lkLm9zLlBhcmNlbCBkYXRhLCBhbmRyb2lkLm9zLlBhcmNlbCByZXBseSwgaW50IGZsYWdzKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICBqYXZhLmxhbmcuU3RyaW5nIGRlc2NyaXB0b3IgPSBERVNDUklQVE9SOworICAgICAgaWYgKGNvZGUgPj0gYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gJiYgY29kZSA8PSBhbmRyb2lkLm9zLklCaW5kZXIuTEFTVF9DQUxMX1RSQU5TQUNUSU9OKSB7CisgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShkZXNjcmlwdG9yKTsKKyAgICAgIH0KKyAgICAgIHN3aXRjaCAoY29kZSkKKyAgICAgIHsKKyAgICAgICAgY2FzZSBJTlRFUkZBQ0VfVFJBTlNBQ1RJT046CisgICAgICAgIHsKKyAgICAgICAgICByZXBseS53cml0ZVN0cmluZyhkZXNjcmlwdG9yKTsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgc3dpdGNoIChjb2RlKQorICAgICAgeworICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX1Blcm1pc3Npb25Qcm90ZWN0ZWQ6CisgICAgICAgIHsKKyAgICAgICAgICBpZiAoKHRoaXMucGVybWlzc2lvbkNoZWNrZXJXcmFwcGVyKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5SRUFEX1BIT05FX1NUQVRFLCB0aGlzLmdldENhbGxpbmdQaWQoKSwgbmV3IGFuZHJvaWQuY29udGVudC5BdHRyaWJ1dGlvblNvdXJjZShnZXRDYWxsaW5nVWlkKCksIG51bGwsIG51bGwpKSE9dHJ1ZSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbigiQWNjZXNzIGRlbmllZCwgcmVxdWlyZXM6IGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5SRUFEX1BIT05FX1NUQVRFIik7CisgICAgICAgICAgfQorICAgICAgICAgIHRoaXMuUGVybWlzc2lvblByb3RlY3RlZCgpOworICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX011bHRpcGxlUGVybWlzc2lvbnNBbGw6CisgICAgICAgIHsKKyAgICAgICAgICBpZiAoKCh0aGlzLnBlcm1pc3Npb25DaGVja2VyV3JhcHBlcihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uSU5URVJORVQsIHRoaXMuZ2V0Q2FsbGluZ1BpZCgpLCBuZXcgYW5kcm9pZC5jb250ZW50LkF0dHJpYnV0aW9uU291cmNlKGdldENhbGxpbmdVaWQoKSwgbnVsbCwgbnVsbCkpJiZ0aGlzLnBlcm1pc3Npb25DaGVja2VyV3JhcHBlcihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uVklCUkFURSwgdGhpcy5nZXRDYWxsaW5nUGlkKCksIG5ldyBhbmRyb2lkLmNvbnRlbnQuQXR0cmlidXRpb25Tb3VyY2UoZ2V0Q2FsbGluZ1VpZCgpLCBudWxsLCBudWxsKSkpIT10cnVlKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCJBY2Nlc3MgZGVuaWVkLCByZXF1aXJlczogYWxsT2YgPSB7YW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLklOVEVSTkVULCBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uVklCUkFURX0iKTsKKyAgICAgICAgICB9CisgICAgICAgICAgdGhpcy5NdWx0aXBsZVBlcm1pc3Npb25zQWxsKCk7CisgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fTXVsdGlwbGVQZXJtaXNzaW9uc0FueToKKyAgICAgICAgeworICAgICAgICAgIGlmICgoKHRoaXMucGVybWlzc2lvbkNoZWNrZXJXcmFwcGVyKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5JTlRFUk5FVCwgdGhpcy5nZXRDYWxsaW5nUGlkKCksIG5ldyBhbmRyb2lkLmNvbnRlbnQuQXR0cmlidXRpb25Tb3VyY2UoZ2V0Q2FsbGluZ1VpZCgpLCBudWxsLCBudWxsKSl8fHRoaXMucGVybWlzc2lvbkNoZWNrZXJXcmFwcGVyKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5WSUJSQVRFLCB0aGlzLmdldENhbGxpbmdQaWQoKSwgbmV3IGFuZHJvaWQuY29udGVudC5BdHRyaWJ1dGlvblNvdXJjZShnZXRDYWxsaW5nVWlkKCksIG51bGwsIG51bGwpKSkhPXRydWUpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oIkFjY2VzcyBkZW5pZWQsIHJlcXVpcmVzOiBhbnlPZiA9IHthbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uSU5URVJORVQsIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5WSUJSQVRFfSIpOworICAgICAgICAgIH0KKyAgICAgICAgICB0aGlzLk11bHRpcGxlUGVybWlzc2lvbnNBbnkoKTsKKyAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9Ob25NYW5pZmVzdFBlcm1pc3Npb246CisgICAgICAgIHsKKyAgICAgICAgICBpZiAoKHRoaXMucGVybWlzc2lvbkNoZWNrZXJXcmFwcGVyKGFuZHJvaWQubmV0Lk5ldHdvcmtTdGFjay5QRVJNSVNTSU9OX01BSU5MSU5FX05FVFdPUktfU1RBQ0ssIHRoaXMuZ2V0Q2FsbGluZ1BpZCgpLCBuZXcgYW5kcm9pZC5jb250ZW50LkF0dHJpYnV0aW9uU291cmNlKGdldENhbGxpbmdVaWQoKSwgbnVsbCwgbnVsbCkpIT10cnVlKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCJBY2Nlc3MgZGVuaWVkLCByZXF1aXJlczogYW5kcm9pZC5uZXQuTmV0d29ya1N0YWNrLlBFUk1JU1NJT05fTUFJTkxJTkVfTkVUV09SS19TVEFDSyIpOworICAgICAgICAgIH0KKyAgICAgICAgICB0aGlzLk5vbk1hbmlmZXN0UGVybWlzc2lvbigpOworICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIHN1cGVyLm9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFByb3h5IGltcGxlbWVudHMgYW5kcm9pZC5haWRsLnRlc3RzLnBlcm1pc3Npb24uSVByb3RlY3RlZAorICAgIHsKKyAgICAgIHByaXZhdGUgYW5kcm9pZC5vcy5JQmluZGVyIG1SZW1vdGU7CisgICAgICBQcm94eShhbmRyb2lkLm9zLklCaW5kZXIgcmVtb3RlKQorICAgICAgeworICAgICAgICBtUmVtb3RlID0gcmVtb3RlOworICAgICAgfQorICAgICAgQE92ZXJyaWRlIHB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKQorICAgICAgeworICAgICAgICByZXR1cm4gbVJlbW90ZTsKKyAgICAgIH0KKyAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEludGVyZmFjZURlc2NyaXB0b3IoKQorICAgICAgeworICAgICAgICByZXR1cm4gREVTQ1JJUFRPUjsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBQZXJtaXNzaW9uUHJvdGVjdGVkKCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgICB7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICB0cnkgeworICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7CisgICAgICAgICAgYm9vbGVhbiBfc3RhdHVzID0gbVJlbW90ZS50cmFuc2FjdChTdHViLlRSQU5TQUNUSU9OX1Blcm1pc3Npb25Qcm90ZWN0ZWQsIF9kYXRhLCBfcmVwbHksIDApOworICAgICAgICAgIF9yZXBseS5yZWFkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgX3JlcGx5LnJlY3ljbGUoKTsKKyAgICAgICAgICBfZGF0YS5yZWN5Y2xlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBNdWx0aXBsZVBlcm1pc3Npb25zQWxsKCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgICB7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICB0cnkgeworICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7CisgICAgICAgICAgYm9vbGVhbiBfc3RhdHVzID0gbVJlbW90ZS50cmFuc2FjdChTdHViLlRSQU5TQUNUSU9OX011bHRpcGxlUGVybWlzc2lvbnNBbGwsIF9kYXRhLCBfcmVwbHksIDApOworICAgICAgICAgIF9yZXBseS5yZWFkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgX3JlcGx5LnJlY3ljbGUoKTsKKyAgICAgICAgICBfZGF0YS5yZWN5Y2xlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBNdWx0aXBsZVBlcm1pc3Npb25zQW55KCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgICB7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICB0cnkgeworICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7CisgICAgICAgICAgYm9vbGVhbiBfc3RhdHVzID0gbVJlbW90ZS50cmFuc2FjdChTdHViLlRSQU5TQUNUSU9OX011bHRpcGxlUGVybWlzc2lvbnNBbnksIF9kYXRhLCBfcmVwbHksIDApOworICAgICAgICAgIF9yZXBseS5yZWFkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgX3JlcGx5LnJlY3ljbGUoKTsKKyAgICAgICAgICBfZGF0YS5yZWN5Y2xlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBOb25NYW5pZmVzdFBlcm1pc3Npb24oKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICAgIHsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKKyAgICAgICAgICBib29sZWFuIF9zdGF0dXMgPSBtUmVtb3RlLnRyYW5zYWN0KFN0dWIuVFJBTlNBQ1RJT05fTm9uTWFuaWZlc3RQZXJtaXNzaW9uLCBfZGF0YSwgX3JlcGx5LCAwKTsKKyAgICAgICAgICBfcmVwbHkucmVhZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICAgIF9yZXBseS5yZWN5Y2xlKCk7CisgICAgICAgICAgX2RhdGEucmVjeWNsZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHByaXZhdGUgYm9vbGVhbiBwZXJtaXNzaW9uQ2hlY2tlcldyYXBwZXIoCisgICAgICAgIFN0cmluZyBwZXJtaXNzaW9uLCBpbnQgcGlkLCBhbmRyb2lkLmNvbnRlbnQuQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpIHsKKyAgICAgIGFuZHJvaWQuY29udGVudC5Db250ZXh0IGN0eCA9CisgICAgICAgICAgYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQuY3VycmVudEFjdGl2aXR5VGhyZWFkKCkuZ2V0U3lzdGVtQ29udGV4dCgpOworICAgICAgcmV0dXJuIChhbmRyb2lkLmNvbnRlbnQuUGVybWlzc2lvbkNoZWNrZXIuY2hlY2tQZXJtaXNzaW9uRm9yRGF0YURlbGl2ZXJ5KAorICAgICAgICAgICAgICBjdHgsIHBlcm1pc3Npb24sIHBpZCwgYXR0cmlidXRpb25Tb3VyY2UsICIiIC8qbWVzc2FnZSovKSA9PQorICAgICAgICAgIGFuZHJvaWQuY29udGVudC5QZXJtaXNzaW9uQ2hlY2tlci5QRVJNSVNTSU9OX0dSQU5URUQpOworICAgIH0KKyAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX1Blcm1pc3Npb25Qcm90ZWN0ZWQgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAwKTsKKyAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX011bHRpcGxlUGVybWlzc2lvbnNBbGwgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAxKTsKKyAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX011bHRpcGxlUGVybWlzc2lvbnNBbnkgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyKTsKKyAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX05vbk1hbmlmZXN0UGVybWlzc2lvbiA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDMpOworICB9CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERVNDUklQVE9SID0gImFuZHJvaWQkYWlkbCR0ZXN0cyRwZXJtaXNzaW9uJElQcm90ZWN0ZWQiLnJlcGxhY2UoJyQnLCAnLicpOworICBAYW5kcm9pZC5hbm5vdGF0aW9uLkVuZm9yY2VQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5SRUFEX1BIT05FX1NUQVRFKQorICBwdWJsaWMgdm9pZCBQZXJtaXNzaW9uUHJvdGVjdGVkKCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworICBAYW5kcm9pZC5hbm5vdGF0aW9uLkVuZm9yY2VQZXJtaXNzaW9uKGFsbE9mID0ge2FuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5JTlRFUk5FVCwgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLlZJQlJBVEV9KQorICBwdWJsaWMgdm9pZCBNdWx0aXBsZVBlcm1pc3Npb25zQWxsKCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworICBAYW5kcm9pZC5hbm5vdGF0aW9uLkVuZm9yY2VQZXJtaXNzaW9uKGFueU9mID0ge2FuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5JTlRFUk5FVCwgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLlZJQlJBVEV9KQorICBwdWJsaWMgdm9pZCBNdWx0aXBsZVBlcm1pc3Npb25zQW55KCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworICBAYW5kcm9pZC5hbm5vdGF0aW9uLkVuZm9yY2VQZXJtaXNzaW9uKGFuZHJvaWQubmV0Lk5ldHdvcmtTdGFjay5QRVJNSVNTSU9OX01BSU5MSU5FX05FVFdPUktfU1RBQ0spCisgIHB1YmxpYyB2b2lkIE5vbk1hbmlmZXN0UGVybWlzc2lvbigpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1wZXJtaXNzaW9uLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9JUHJvdGVjdGVkLmphdmEuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1wZXJtaXNzaW9uLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9JUHJvdGVjdGVkLmphdmEuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTJlNGJmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXBlcm1pc3Npb24tamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9wZXJtaXNzaW9uL0lQcm90ZWN0ZWQuamF2YS5kCkBAIC0wLDAgKzEsMiBAQAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtcGVybWlzc2lvbi1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vSVByb3RlY3RlZC5qYXZhIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9JUHJvdGVjdGVkLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1wZXJtaXNzaW9uLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9JUHJvdGVjdGVkSW50ZXJmYWNlLmphdmEgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcGVybWlzc2lvbi1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vSVByb3RlY3RlZEludGVyZmFjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZDFjMWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcGVybWlzc2lvbi1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vSVByb3RlY3RlZEludGVyZmFjZS5qYXZhCkBAIC0wLDAgKzEsMTUyIEBACisvKgorICogVGhpcyBmaWxlIGlzIGF1dG8tZ2VuZXJhdGVkLiAgRE8gTk9UIE1PRElGWS4KKyAqLworcGFja2FnZSBhbmRyb2lkLmFpZGwudGVzdHMucGVybWlzc2lvbjsKK0BhbmRyb2lkLmFubm90YXRpb24uRW5mb3JjZVBlcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkFDQ0VTU19GSU5FX0xPQ0FUSU9OKQorcHVibGljIGludGVyZmFjZSBJUHJvdGVjdGVkSW50ZXJmYWNlIGV4dGVuZHMgYW5kcm9pZC5vcy5JSW50ZXJmYWNlCit7CisgIC8qKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciBJUHJvdGVjdGVkSW50ZXJmYWNlLiAqLworICBwdWJsaWMgc3RhdGljIGNsYXNzIERlZmF1bHQgaW1wbGVtZW50cyBhbmRyb2lkLmFpZGwudGVzdHMucGVybWlzc2lvbi5JUHJvdGVjdGVkSW50ZXJmYWNlCisgIHsKKyAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgTWV0aG9kMSgpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIE1ldGhvZDIoKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgIH0KKyAgLyoqIExvY2FsLXNpZGUgSVBDIGltcGxlbWVudGF0aW9uIHN0dWIgY2xhc3MuICovCisgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgU3R1YiBleHRlbmRzIGFuZHJvaWQub3MuQmluZGVyIGltcGxlbWVudHMgYW5kcm9pZC5haWRsLnRlc3RzLnBlcm1pc3Npb24uSVByb3RlY3RlZEludGVyZmFjZQorICB7CisgICAgLyoqIENvbnN0cnVjdCB0aGUgc3R1YiBhdCBhdHRhY2ggaXQgdG8gdGhlIGludGVyZmFjZS4gKi8KKyAgICBwdWJsaWMgU3R1YigpCisgICAgeworICAgICAgdGhpcy5hdHRhY2hJbnRlcmZhY2UodGhpcywgREVTQ1JJUFRPUik7CisgICAgfQorICAgIC8qKgorICAgICAqIENhc3QgYW4gSUJpbmRlciBvYmplY3QgaW50byBhbiBhbmRyb2lkLmFpZGwudGVzdHMucGVybWlzc2lvbi5JUHJvdGVjdGVkSW50ZXJmYWNlIGludGVyZmFjZSwKKyAgICAgKiBnZW5lcmF0aW5nIGEgcHJveHkgaWYgbmVlZGVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5haWRsLnRlc3RzLnBlcm1pc3Npb24uSVByb3RlY3RlZEludGVyZmFjZSBhc0ludGVyZmFjZShhbmRyb2lkLm9zLklCaW5kZXIgb2JqKQorICAgIHsKKyAgICAgIGlmICgob2JqPT1udWxsKSkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICAgIGFuZHJvaWQub3MuSUludGVyZmFjZSBpaW4gPSBvYmoucXVlcnlMb2NhbEludGVyZmFjZShERVNDUklQVE9SKTsKKyAgICAgIGlmICgoKGlpbiE9bnVsbCkmJihpaW4gaW5zdGFuY2VvZiBhbmRyb2lkLmFpZGwudGVzdHMucGVybWlzc2lvbi5JUHJvdGVjdGVkSW50ZXJmYWNlKSkpIHsKKyAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5haWRsLnRlc3RzLnBlcm1pc3Npb24uSVByb3RlY3RlZEludGVyZmFjZSlpaW4pOworICAgICAgfQorICAgICAgcmV0dXJuIG5ldyBhbmRyb2lkLmFpZGwudGVzdHMucGVybWlzc2lvbi5JUHJvdGVjdGVkSW50ZXJmYWNlLlN0dWIuUHJveHkob2JqKTsKKyAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKQorICAgIHsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gb25UcmFuc2FjdChpbnQgY29kZSwgYW5kcm9pZC5vcy5QYXJjZWwgZGF0YSwgYW5kcm9pZC5vcy5QYXJjZWwgcmVwbHksIGludCBmbGFncykgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgamF2YS5sYW5nLlN0cmluZyBkZXNjcmlwdG9yID0gREVTQ1JJUFRPUjsKKyAgICAgIGlmIChjb2RlID49IGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICYmIGNvZGUgPD0gYW5kcm9pZC5vcy5JQmluZGVyLkxBU1RfQ0FMTF9UUkFOU0FDVElPTikgeworICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoZGVzY3JpcHRvcik7CisgICAgICB9CisgICAgICBzd2l0Y2ggKGNvZGUpCisgICAgICB7CisgICAgICAgIGNhc2UgSU5URVJGQUNFX1RSQU5TQUNUSU9OOgorICAgICAgICB7CisgICAgICAgICAgcmVwbHkud3JpdGVTdHJpbmcoZGVzY3JpcHRvcik7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHN3aXRjaCAoY29kZSkKKyAgICAgIHsKKyAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9NZXRob2QxOgorICAgICAgICB7CisgICAgICAgICAgaWYgKCh0aGlzLnBlcm1pc3Npb25DaGVja2VyV3JhcHBlcihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQUNDRVNTX0ZJTkVfTE9DQVRJT04sIHRoaXMuZ2V0Q2FsbGluZ1BpZCgpLCBuZXcgYW5kcm9pZC5jb250ZW50LkF0dHJpYnV0aW9uU291cmNlKGdldENhbGxpbmdVaWQoKSwgbnVsbCwgbnVsbCkpIT10cnVlKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCJBY2Nlc3MgZGVuaWVkLCByZXF1aXJlczogYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkFDQ0VTU19GSU5FX0xPQ0FUSU9OIik7CisgICAgICAgICAgfQorICAgICAgICAgIHRoaXMuTWV0aG9kMSgpOworICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX01ldGhvZDI6CisgICAgICAgIHsKKyAgICAgICAgICBpZiAoKHRoaXMucGVybWlzc2lvbkNoZWNrZXJXcmFwcGVyKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5BQ0NFU1NfRklORV9MT0NBVElPTiwgdGhpcy5nZXRDYWxsaW5nUGlkKCksIG5ldyBhbmRyb2lkLmNvbnRlbnQuQXR0cmlidXRpb25Tb3VyY2UoZ2V0Q2FsbGluZ1VpZCgpLCBudWxsLCBudWxsKSkhPXRydWUpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oIkFjY2VzcyBkZW5pZWQsIHJlcXVpcmVzOiBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQUNDRVNTX0ZJTkVfTE9DQVRJT04iKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKCh0aGlzLnBlcm1pc3Npb25DaGVja2VyV3JhcHBlcihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uSU5URVJORVQsIHRoaXMuZ2V0Q2FsbGluZ1BpZCgpLCBuZXcgYW5kcm9pZC5jb250ZW50LkF0dHJpYnV0aW9uU291cmNlKGdldENhbGxpbmdVaWQoKSwgbnVsbCwgbnVsbCkpIT10cnVlKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCJBY2Nlc3MgZGVuaWVkLCByZXF1aXJlczogYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLklOVEVSTkVUIik7CisgICAgICAgICAgfQorICAgICAgICAgIHRoaXMuTWV0aG9kMigpOworICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIHN1cGVyLm9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFByb3h5IGltcGxlbWVudHMgYW5kcm9pZC5haWRsLnRlc3RzLnBlcm1pc3Npb24uSVByb3RlY3RlZEludGVyZmFjZQorICAgIHsKKyAgICAgIHByaXZhdGUgYW5kcm9pZC5vcy5JQmluZGVyIG1SZW1vdGU7CisgICAgICBQcm94eShhbmRyb2lkLm9zLklCaW5kZXIgcmVtb3RlKQorICAgICAgeworICAgICAgICBtUmVtb3RlID0gcmVtb3RlOworICAgICAgfQorICAgICAgQE92ZXJyaWRlIHB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKQorICAgICAgeworICAgICAgICByZXR1cm4gbVJlbW90ZTsKKyAgICAgIH0KKyAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEludGVyZmFjZURlc2NyaXB0b3IoKQorICAgICAgeworICAgICAgICByZXR1cm4gREVTQ1JJUFRPUjsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBNZXRob2QxKCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgICB7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICB0cnkgeworICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7CisgICAgICAgICAgYm9vbGVhbiBfc3RhdHVzID0gbVJlbW90ZS50cmFuc2FjdChTdHViLlRSQU5TQUNUSU9OX01ldGhvZDEsIF9kYXRhLCBfcmVwbHksIDApOworICAgICAgICAgIF9yZXBseS5yZWFkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgX3JlcGx5LnJlY3ljbGUoKTsKKyAgICAgICAgICBfZGF0YS5yZWN5Y2xlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBNZXRob2QyKCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgICB7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICB0cnkgeworICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7CisgICAgICAgICAgYm9vbGVhbiBfc3RhdHVzID0gbVJlbW90ZS50cmFuc2FjdChTdHViLlRSQU5TQUNUSU9OX01ldGhvZDIsIF9kYXRhLCBfcmVwbHksIDApOworICAgICAgICAgIF9yZXBseS5yZWFkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgX3JlcGx5LnJlY3ljbGUoKTsKKyAgICAgICAgICBfZGF0YS5yZWN5Y2xlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcHJpdmF0ZSBib29sZWFuIHBlcm1pc3Npb25DaGVja2VyV3JhcHBlcigKKyAgICAgICAgU3RyaW5nIHBlcm1pc3Npb24sIGludCBwaWQsIGFuZHJvaWQuY29udGVudC5BdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSkgeworICAgICAgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgY3R4ID0KKyAgICAgICAgICBhbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZC5jdXJyZW50QWN0aXZpdHlUaHJlYWQoKS5nZXRTeXN0ZW1Db250ZXh0KCk7CisgICAgICByZXR1cm4gKGFuZHJvaWQuY29udGVudC5QZXJtaXNzaW9uQ2hlY2tlci5jaGVja1Blcm1pc3Npb25Gb3JEYXRhRGVsaXZlcnkoCisgICAgICAgICAgICAgIGN0eCwgcGVybWlzc2lvbiwgcGlkLCBhdHRyaWJ1dGlvblNvdXJjZSwgIiIgLyptZXNzYWdlKi8pID09CisgICAgICAgICAgYW5kcm9pZC5jb250ZW50LlBlcm1pc3Npb25DaGVja2VyLlBFUk1JU1NJT05fR1JBTlRFRCk7CisgICAgfQorICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fTWV0aG9kMSA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDApOworICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fTWV0aG9kMiA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDEpOworICB9CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERVNDUklQVE9SID0gImFuZHJvaWQkYWlkbCR0ZXN0cyRwZXJtaXNzaW9uJElQcm90ZWN0ZWRJbnRlcmZhY2UiLnJlcGxhY2UoJyQnLCAnLicpOworICBwdWJsaWMgdm9pZCBNZXRob2QxKCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworICBAYW5kcm9pZC5hbm5vdGF0aW9uLkVuZm9yY2VQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5JTlRFUk5FVCkKKyAgcHVibGljIHZvaWQgTWV0aG9kMigpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1wZXJtaXNzaW9uLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9JUHJvdGVjdGVkSW50ZXJmYWNlLmphdmEuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1wZXJtaXNzaW9uLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9JUHJvdGVjdGVkSW50ZXJmYWNlLmphdmEuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTM2ZTM4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXBlcm1pc3Npb24tamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9wZXJtaXNzaW9uL0lQcm90ZWN0ZWRJbnRlcmZhY2UuamF2YS5kCkBAIC0wLDAgKzEsMiBAQAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtcGVybWlzc2lvbi1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vSVByb3RlY3RlZEludGVyZmFjZS5qYXZhIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9JUHJvdGVjdGVkSW50ZXJmYWNlLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1wZXJtaXNzaW9uLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9wbGF0Zm9ybS9JUHJvdGVjdGVkLmphdmEgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcGVybWlzc2lvbi1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vcGxhdGZvcm0vSVByb3RlY3RlZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNmQ5NmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcGVybWlzc2lvbi1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vcGxhdGZvcm0vSVByb3RlY3RlZC5qYXZhCkBAIC0wLDAgKzEsMTI0IEBACisvKgorICogVGhpcyBmaWxlIGlzIGF1dG8tZ2VuZXJhdGVkLiAgRE8gTk9UIE1PRElGWS4KKyAqLworcGFja2FnZSBhbmRyb2lkLmFpZGwudGVzdHMucGVybWlzc2lvbi5wbGF0Zm9ybTsKK3B1YmxpYyBpbnRlcmZhY2UgSVByb3RlY3RlZCBleHRlbmRzIGFuZHJvaWQub3MuSUludGVyZmFjZQoreworICAvKiogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3IgSVByb3RlY3RlZC4gKi8KKyAgcHVibGljIHN0YXRpYyBjbGFzcyBEZWZhdWx0IGltcGxlbWVudHMgYW5kcm9pZC5haWRsLnRlc3RzLnBlcm1pc3Npb24ucGxhdGZvcm0uSVByb3RlY3RlZAorICB7CisgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIFByb3RlY3RlZFdpdGhTb3VyY2VBdHRyaWJ1dGlvbihhbmRyb2lkLmNvbnRlbnQuQXR0cmlidXRpb25Tb3VyY2Ugc291cmNlKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgIH0KKyAgLyoqIExvY2FsLXNpZGUgSVBDIGltcGxlbWVudGF0aW9uIHN0dWIgY2xhc3MuICovCisgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgU3R1YiBleHRlbmRzIGFuZHJvaWQub3MuQmluZGVyIGltcGxlbWVudHMgYW5kcm9pZC5haWRsLnRlc3RzLnBlcm1pc3Npb24ucGxhdGZvcm0uSVByb3RlY3RlZAorICB7CisgICAgLyoqIENvbnN0cnVjdCB0aGUgc3R1YiBhdCBhdHRhY2ggaXQgdG8gdGhlIGludGVyZmFjZS4gKi8KKyAgICBwdWJsaWMgU3R1YigpCisgICAgeworICAgICAgdGhpcy5hdHRhY2hJbnRlcmZhY2UodGhpcywgREVTQ1JJUFRPUik7CisgICAgfQorICAgIC8qKgorICAgICAqIENhc3QgYW4gSUJpbmRlciBvYmplY3QgaW50byBhbiBhbmRyb2lkLmFpZGwudGVzdHMucGVybWlzc2lvbi5wbGF0Zm9ybS5JUHJvdGVjdGVkIGludGVyZmFjZSwKKyAgICAgKiBnZW5lcmF0aW5nIGEgcHJveHkgaWYgbmVlZGVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5haWRsLnRlc3RzLnBlcm1pc3Npb24ucGxhdGZvcm0uSVByb3RlY3RlZCBhc0ludGVyZmFjZShhbmRyb2lkLm9zLklCaW5kZXIgb2JqKQorICAgIHsKKyAgICAgIGlmICgob2JqPT1udWxsKSkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICAgIGFuZHJvaWQub3MuSUludGVyZmFjZSBpaW4gPSBvYmoucXVlcnlMb2NhbEludGVyZmFjZShERVNDUklQVE9SKTsKKyAgICAgIGlmICgoKGlpbiE9bnVsbCkmJihpaW4gaW5zdGFuY2VvZiBhbmRyb2lkLmFpZGwudGVzdHMucGVybWlzc2lvbi5wbGF0Zm9ybS5JUHJvdGVjdGVkKSkpIHsKKyAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5haWRsLnRlc3RzLnBlcm1pc3Npb24ucGxhdGZvcm0uSVByb3RlY3RlZClpaW4pOworICAgICAgfQorICAgICAgcmV0dXJuIG5ldyBhbmRyb2lkLmFpZGwudGVzdHMucGVybWlzc2lvbi5wbGF0Zm9ybS5JUHJvdGVjdGVkLlN0dWIuUHJveHkob2JqKTsKKyAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKQorICAgIHsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gb25UcmFuc2FjdChpbnQgY29kZSwgYW5kcm9pZC5vcy5QYXJjZWwgZGF0YSwgYW5kcm9pZC5vcy5QYXJjZWwgcmVwbHksIGludCBmbGFncykgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgamF2YS5sYW5nLlN0cmluZyBkZXNjcmlwdG9yID0gREVTQ1JJUFRPUjsKKyAgICAgIGlmIChjb2RlID49IGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICYmIGNvZGUgPD0gYW5kcm9pZC5vcy5JQmluZGVyLkxBU1RfQ0FMTF9UUkFOU0FDVElPTikgeworICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoZGVzY3JpcHRvcik7CisgICAgICB9CisgICAgICBzd2l0Y2ggKGNvZGUpCisgICAgICB7CisgICAgICAgIGNhc2UgSU5URVJGQUNFX1RSQU5TQUNUSU9OOgorICAgICAgICB7CisgICAgICAgICAgcmVwbHkud3JpdGVTdHJpbmcoZGVzY3JpcHRvcik7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHN3aXRjaCAoY29kZSkKKyAgICAgIHsKKyAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9Qcm90ZWN0ZWRXaXRoU291cmNlQXR0cmlidXRpb246CisgICAgICAgIHsKKyAgICAgICAgICBhbmRyb2lkLmNvbnRlbnQuQXR0cmlidXRpb25Tb3VyY2UgX2FyZzA7CisgICAgICAgICAgX2FyZzAgPSBkYXRhLnJlYWRUeXBlZE9iamVjdChhbmRyb2lkLmNvbnRlbnQuQXR0cmlidXRpb25Tb3VyY2UuQ1JFQVRPUik7CisgICAgICAgICAgZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsKKyAgICAgICAgICBpZiAoKCh0aGlzLnBlcm1pc3Npb25DaGVja2VyV3JhcHBlcihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uSU5URVJORVQsIHRoaXMuZ2V0Q2FsbGluZ1BpZCgpLCBfYXJnMCkmJnRoaXMucGVybWlzc2lvbkNoZWNrZXJXcmFwcGVyKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5WSUJSQVRFLCB0aGlzLmdldENhbGxpbmdQaWQoKSwgX2FyZzApKSE9dHJ1ZSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbigiQWNjZXNzIGRlbmllZCwgcmVxdWlyZXM6IGFsbE9mID0ge2FuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5JTlRFUk5FVCwgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLlZJQlJBVEV9Iik7CisgICAgICAgICAgfQorICAgICAgICAgIHRoaXMuUHJvdGVjdGVkV2l0aFNvdXJjZUF0dHJpYnV0aW9uKF9hcmcwKTsKKyAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBzdXBlci5vblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBQcm94eSBpbXBsZW1lbnRzIGFuZHJvaWQuYWlkbC50ZXN0cy5wZXJtaXNzaW9uLnBsYXRmb3JtLklQcm90ZWN0ZWQKKyAgICB7CisgICAgICBwcml2YXRlIGFuZHJvaWQub3MuSUJpbmRlciBtUmVtb3RlOworICAgICAgUHJveHkoYW5kcm9pZC5vcy5JQmluZGVyIHJlbW90ZSkKKyAgICAgIHsKKyAgICAgICAgbVJlbW90ZSA9IHJlbW90ZTsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIG1SZW1vdGU7CisgICAgICB9CisgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIERFU0NSSVBUT1I7CisgICAgICB9CisgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgUHJvdGVjdGVkV2l0aFNvdXJjZUF0dHJpYnV0aW9uKGFuZHJvaWQuY29udGVudC5BdHRyaWJ1dGlvblNvdXJjZSBzb3VyY2UpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgICAgeworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOworICAgICAgICAgIF9kYXRhLndyaXRlVHlwZWRPYmplY3Qoc291cmNlLCAwKTsKKyAgICAgICAgICBib29sZWFuIF9zdGF0dXMgPSBtUmVtb3RlLnRyYW5zYWN0KFN0dWIuVFJBTlNBQ1RJT05fUHJvdGVjdGVkV2l0aFNvdXJjZUF0dHJpYnV0aW9uLCBfZGF0YSwgX3JlcGx5LCAwKTsKKyAgICAgICAgICBfcmVwbHkucmVhZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICAgIF9yZXBseS5yZWN5Y2xlKCk7CisgICAgICAgICAgX2RhdGEucmVjeWNsZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHByaXZhdGUgYm9vbGVhbiBwZXJtaXNzaW9uQ2hlY2tlcldyYXBwZXIoCisgICAgICAgIFN0cmluZyBwZXJtaXNzaW9uLCBpbnQgcGlkLCBhbmRyb2lkLmNvbnRlbnQuQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpIHsKKyAgICAgIGFuZHJvaWQuY29udGVudC5Db250ZXh0IGN0eCA9CisgICAgICAgICAgYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQuY3VycmVudEFjdGl2aXR5VGhyZWFkKCkuZ2V0U3lzdGVtQ29udGV4dCgpOworICAgICAgcmV0dXJuIChhbmRyb2lkLmNvbnRlbnQuUGVybWlzc2lvbkNoZWNrZXIuY2hlY2tQZXJtaXNzaW9uRm9yRGF0YURlbGl2ZXJ5KAorICAgICAgICAgICAgICBjdHgsIHBlcm1pc3Npb24sIHBpZCwgYXR0cmlidXRpb25Tb3VyY2UsICIiIC8qbWVzc2FnZSovKSA9PQorICAgICAgICAgIGFuZHJvaWQuY29udGVudC5QZXJtaXNzaW9uQ2hlY2tlci5QRVJNSVNTSU9OX0dSQU5URUQpOworICAgIH0KKyAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX1Byb3RlY3RlZFdpdGhTb3VyY2VBdHRyaWJ1dGlvbiA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDApOworICB9CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERVNDUklQVE9SID0gImFuZHJvaWQkYWlkbCR0ZXN0cyRwZXJtaXNzaW9uJHBsYXRmb3JtJElQcm90ZWN0ZWQiLnJlcGxhY2UoJyQnLCAnLicpOworICBAYW5kcm9pZC5hbm5vdGF0aW9uLkVuZm9yY2VQZXJtaXNzaW9uKGFsbE9mID0ge2FuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5JTlRFUk5FVCwgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLlZJQlJBVEV9KQorICBwdWJsaWMgdm9pZCBQcm90ZWN0ZWRXaXRoU291cmNlQXR0cmlidXRpb24oYW5kcm9pZC5jb250ZW50LkF0dHJpYnV0aW9uU291cmNlIHNvdXJjZSkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXBlcm1pc3Npb24tamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9wZXJtaXNzaW9uL3BsYXRmb3JtL0lQcm90ZWN0ZWQuamF2YS5kIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXBlcm1pc3Npb24tamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9wZXJtaXNzaW9uL3BsYXRmb3JtL0lQcm90ZWN0ZWQuamF2YS5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ODY2YTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcGVybWlzc2lvbi1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vcGxhdGZvcm0vSVByb3RlY3RlZC5qYXZhLmQKQEAgLTAsMCArMSwzIEBACitvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LWludGVyZmFjZS1wZXJtaXNzaW9uLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9wbGF0Zm9ybS9JUHJvdGVjdGVkLmphdmEgOiBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9wZXJtaXNzaW9uL3BsYXRmb3JtL0lQcm90ZWN0ZWQuYWlkbCBcCisgIGZyYW1ld29ya3MvYmFzZS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0F0dHJpYnV0aW9uU291cmNlLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi90aW1lc3RhbXAgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcGVybWlzc2lvbi1qYXZhLXNvdXJjZS9nZW4vdGltZXN0YW1wCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL3RpbWVzdGFtcApjb3B5IHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1wZXJtaXNzaW9uLWphdmEtc291cmNlL2dlbi90aW1lc3RhbXAKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1wbGF0Zm9ybS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vcGxhdGZvcm0vSVByb3RlY3RlZC5qYXZhIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXBsYXRmb3JtLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9wbGF0Zm9ybS9JUHJvdGVjdGVkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I2ZDk2ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1wbGF0Zm9ybS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vcGxhdGZvcm0vSVByb3RlY3RlZC5qYXZhCkBAIC0wLDAgKzEsMTI0IEBACisvKgorICogVGhpcyBmaWxlIGlzIGF1dG8tZ2VuZXJhdGVkLiAgRE8gTk9UIE1PRElGWS4KKyAqLworcGFja2FnZSBhbmRyb2lkLmFpZGwudGVzdHMucGVybWlzc2lvbi5wbGF0Zm9ybTsKK3B1YmxpYyBpbnRlcmZhY2UgSVByb3RlY3RlZCBleHRlbmRzIGFuZHJvaWQub3MuSUludGVyZmFjZQoreworICAvKiogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3IgSVByb3RlY3RlZC4gKi8KKyAgcHVibGljIHN0YXRpYyBjbGFzcyBEZWZhdWx0IGltcGxlbWVudHMgYW5kcm9pZC5haWRsLnRlc3RzLnBlcm1pc3Npb24ucGxhdGZvcm0uSVByb3RlY3RlZAorICB7CisgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIFByb3RlY3RlZFdpdGhTb3VyY2VBdHRyaWJ1dGlvbihhbmRyb2lkLmNvbnRlbnQuQXR0cmlidXRpb25Tb3VyY2Ugc291cmNlKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgIH0KKyAgLyoqIExvY2FsLXNpZGUgSVBDIGltcGxlbWVudGF0aW9uIHN0dWIgY2xhc3MuICovCisgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgU3R1YiBleHRlbmRzIGFuZHJvaWQub3MuQmluZGVyIGltcGxlbWVudHMgYW5kcm9pZC5haWRsLnRlc3RzLnBlcm1pc3Npb24ucGxhdGZvcm0uSVByb3RlY3RlZAorICB7CisgICAgLyoqIENvbnN0cnVjdCB0aGUgc3R1YiBhdCBhdHRhY2ggaXQgdG8gdGhlIGludGVyZmFjZS4gKi8KKyAgICBwdWJsaWMgU3R1YigpCisgICAgeworICAgICAgdGhpcy5hdHRhY2hJbnRlcmZhY2UodGhpcywgREVTQ1JJUFRPUik7CisgICAgfQorICAgIC8qKgorICAgICAqIENhc3QgYW4gSUJpbmRlciBvYmplY3QgaW50byBhbiBhbmRyb2lkLmFpZGwudGVzdHMucGVybWlzc2lvbi5wbGF0Zm9ybS5JUHJvdGVjdGVkIGludGVyZmFjZSwKKyAgICAgKiBnZW5lcmF0aW5nIGEgcHJveHkgaWYgbmVlZGVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5haWRsLnRlc3RzLnBlcm1pc3Npb24ucGxhdGZvcm0uSVByb3RlY3RlZCBhc0ludGVyZmFjZShhbmRyb2lkLm9zLklCaW5kZXIgb2JqKQorICAgIHsKKyAgICAgIGlmICgob2JqPT1udWxsKSkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICAgIGFuZHJvaWQub3MuSUludGVyZmFjZSBpaW4gPSBvYmoucXVlcnlMb2NhbEludGVyZmFjZShERVNDUklQVE9SKTsKKyAgICAgIGlmICgoKGlpbiE9bnVsbCkmJihpaW4gaW5zdGFuY2VvZiBhbmRyb2lkLmFpZGwudGVzdHMucGVybWlzc2lvbi5wbGF0Zm9ybS5JUHJvdGVjdGVkKSkpIHsKKyAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5haWRsLnRlc3RzLnBlcm1pc3Npb24ucGxhdGZvcm0uSVByb3RlY3RlZClpaW4pOworICAgICAgfQorICAgICAgcmV0dXJuIG5ldyBhbmRyb2lkLmFpZGwudGVzdHMucGVybWlzc2lvbi5wbGF0Zm9ybS5JUHJvdGVjdGVkLlN0dWIuUHJveHkob2JqKTsKKyAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKQorICAgIHsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gb25UcmFuc2FjdChpbnQgY29kZSwgYW5kcm9pZC5vcy5QYXJjZWwgZGF0YSwgYW5kcm9pZC5vcy5QYXJjZWwgcmVwbHksIGludCBmbGFncykgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgamF2YS5sYW5nLlN0cmluZyBkZXNjcmlwdG9yID0gREVTQ1JJUFRPUjsKKyAgICAgIGlmIChjb2RlID49IGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICYmIGNvZGUgPD0gYW5kcm9pZC5vcy5JQmluZGVyLkxBU1RfQ0FMTF9UUkFOU0FDVElPTikgeworICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoZGVzY3JpcHRvcik7CisgICAgICB9CisgICAgICBzd2l0Y2ggKGNvZGUpCisgICAgICB7CisgICAgICAgIGNhc2UgSU5URVJGQUNFX1RSQU5TQUNUSU9OOgorICAgICAgICB7CisgICAgICAgICAgcmVwbHkud3JpdGVTdHJpbmcoZGVzY3JpcHRvcik7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHN3aXRjaCAoY29kZSkKKyAgICAgIHsKKyAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9Qcm90ZWN0ZWRXaXRoU291cmNlQXR0cmlidXRpb246CisgICAgICAgIHsKKyAgICAgICAgICBhbmRyb2lkLmNvbnRlbnQuQXR0cmlidXRpb25Tb3VyY2UgX2FyZzA7CisgICAgICAgICAgX2FyZzAgPSBkYXRhLnJlYWRUeXBlZE9iamVjdChhbmRyb2lkLmNvbnRlbnQuQXR0cmlidXRpb25Tb3VyY2UuQ1JFQVRPUik7CisgICAgICAgICAgZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsKKyAgICAgICAgICBpZiAoKCh0aGlzLnBlcm1pc3Npb25DaGVja2VyV3JhcHBlcihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uSU5URVJORVQsIHRoaXMuZ2V0Q2FsbGluZ1BpZCgpLCBfYXJnMCkmJnRoaXMucGVybWlzc2lvbkNoZWNrZXJXcmFwcGVyKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5WSUJSQVRFLCB0aGlzLmdldENhbGxpbmdQaWQoKSwgX2FyZzApKSE9dHJ1ZSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbigiQWNjZXNzIGRlbmllZCwgcmVxdWlyZXM6IGFsbE9mID0ge2FuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5JTlRFUk5FVCwgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLlZJQlJBVEV9Iik7CisgICAgICAgICAgfQorICAgICAgICAgIHRoaXMuUHJvdGVjdGVkV2l0aFNvdXJjZUF0dHJpYnV0aW9uKF9hcmcwKTsKKyAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBzdXBlci5vblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBQcm94eSBpbXBsZW1lbnRzIGFuZHJvaWQuYWlkbC50ZXN0cy5wZXJtaXNzaW9uLnBsYXRmb3JtLklQcm90ZWN0ZWQKKyAgICB7CisgICAgICBwcml2YXRlIGFuZHJvaWQub3MuSUJpbmRlciBtUmVtb3RlOworICAgICAgUHJveHkoYW5kcm9pZC5vcy5JQmluZGVyIHJlbW90ZSkKKyAgICAgIHsKKyAgICAgICAgbVJlbW90ZSA9IHJlbW90ZTsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIG1SZW1vdGU7CisgICAgICB9CisgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIERFU0NSSVBUT1I7CisgICAgICB9CisgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgUHJvdGVjdGVkV2l0aFNvdXJjZUF0dHJpYnV0aW9uKGFuZHJvaWQuY29udGVudC5BdHRyaWJ1dGlvblNvdXJjZSBzb3VyY2UpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgICAgeworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOworICAgICAgICAgIF9kYXRhLndyaXRlVHlwZWRPYmplY3Qoc291cmNlLCAwKTsKKyAgICAgICAgICBib29sZWFuIF9zdGF0dXMgPSBtUmVtb3RlLnRyYW5zYWN0KFN0dWIuVFJBTlNBQ1RJT05fUHJvdGVjdGVkV2l0aFNvdXJjZUF0dHJpYnV0aW9uLCBfZGF0YSwgX3JlcGx5LCAwKTsKKyAgICAgICAgICBfcmVwbHkucmVhZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICAgIF9yZXBseS5yZWN5Y2xlKCk7CisgICAgICAgICAgX2RhdGEucmVjeWNsZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHByaXZhdGUgYm9vbGVhbiBwZXJtaXNzaW9uQ2hlY2tlcldyYXBwZXIoCisgICAgICAgIFN0cmluZyBwZXJtaXNzaW9uLCBpbnQgcGlkLCBhbmRyb2lkLmNvbnRlbnQuQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpIHsKKyAgICAgIGFuZHJvaWQuY29udGVudC5Db250ZXh0IGN0eCA9CisgICAgICAgICAgYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQuY3VycmVudEFjdGl2aXR5VGhyZWFkKCkuZ2V0U3lzdGVtQ29udGV4dCgpOworICAgICAgcmV0dXJuIChhbmRyb2lkLmNvbnRlbnQuUGVybWlzc2lvbkNoZWNrZXIuY2hlY2tQZXJtaXNzaW9uRm9yRGF0YURlbGl2ZXJ5KAorICAgICAgICAgICAgICBjdHgsIHBlcm1pc3Npb24sIHBpZCwgYXR0cmlidXRpb25Tb3VyY2UsICIiIC8qbWVzc2FnZSovKSA9PQorICAgICAgICAgIGFuZHJvaWQuY29udGVudC5QZXJtaXNzaW9uQ2hlY2tlci5QRVJNSVNTSU9OX0dSQU5URUQpOworICAgIH0KKyAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX1Byb3RlY3RlZFdpdGhTb3VyY2VBdHRyaWJ1dGlvbiA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDApOworICB9CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERVNDUklQVE9SID0gImFuZHJvaWQkYWlkbCR0ZXN0cyRwZXJtaXNzaW9uJHBsYXRmb3JtJElQcm90ZWN0ZWQiLnJlcGxhY2UoJyQnLCAnLicpOworICBAYW5kcm9pZC5hbm5vdGF0aW9uLkVuZm9yY2VQZXJtaXNzaW9uKGFsbE9mID0ge2FuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5JTlRFUk5FVCwgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLlZJQlJBVEV9KQorICBwdWJsaWMgdm9pZCBQcm90ZWN0ZWRXaXRoU291cmNlQXR0cmlidXRpb24oYW5kcm9pZC5jb250ZW50LkF0dHJpYnV0aW9uU291cmNlIHNvdXJjZSkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXBsYXRmb3JtLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9wbGF0Zm9ybS9JUHJvdGVjdGVkLmphdmEuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1wbGF0Zm9ybS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vcGxhdGZvcm0vSVByb3RlY3RlZC5qYXZhLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFlNTAwZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1wbGF0Zm9ybS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vcGxhdGZvcm0vSVByb3RlY3RlZC5qYXZhLmQKQEAgLTAsMCArMSwzIEBACitvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LWludGVyZmFjZS1wbGF0Zm9ybS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vcGxhdGZvcm0vSVByb3RlY3RlZC5qYXZhIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9wbGF0Zm9ybS9JUHJvdGVjdGVkLmFpZGwgXAorICBmcmFtZXdvcmtzL2Jhc2UvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9BdHRyaWJ1dGlvblNvdXJjZS5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vdGltZXN0YW1wIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXBsYXRmb3JtLWphdmEtc291cmNlL2dlbi90aW1lc3RhbXAKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vdGltZXN0YW1wCmNvcHkgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXBsYXRmb3JtLWphdmEtc291cmNlL2dlbi90aW1lc3RhbXAKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0FycmF5T2ZJbnRlcmZhY2VzLnJzIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvQXJyYXlPZkludGVyZmFjZXMucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJiMDVkYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0FycmF5T2ZJbnRlcmZhY2VzLnJzCkBAIC0wLDAgKzEsNDA3IEBACisjIVtmb3JiaWQodW5zYWZlX2NvZGUpXQorIyFbcnVzdGZtdDo6c2tpcF0KKyNbZGVyaXZlKERlYnVnKV0KK3B1YiBzdHJ1Y3QgQXJyYXlPZkludGVyZmFjZXMgeworfQoraW1wbCBEZWZhdWx0IGZvciBBcnJheU9mSW50ZXJmYWNlcyB7CisgIGZuIGRlZmF1bHQoKSAtPiBTZWxmIHsKKyAgICBTZWxmIHsKKyAgICB9CisgIH0KK30KK2ltcGwgYmluZGVyOjpQYXJjZWxhYmxlIGZvciBBcnJheU9mSW50ZXJmYWNlcyB7CisgIGZuIHdyaXRlX3RvX3BhcmNlbCgmc2VsZiwgcGFyY2VsOiAmbXV0IGJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsKSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsKKyAgICBwYXJjZWwuc2l6ZWRfd3JpdGUofHN1YnBhcmNlbHwgeworICAgICAgT2soKCkpCisgICAgfSkKKyAgfQorICBmbiByZWFkX2Zyb21fcGFyY2VsKCZtdXQgc2VsZiwgcGFyY2VsOiAmYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWwpIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4geworICAgIHBhcmNlbC5zaXplZF9yZWFkKHxzdWJwYXJjZWx8IHsKKyAgICAgIE9rKCgpKQorICAgIH0pCisgIH0KK30KK2JpbmRlcjo6aW1wbF9zZXJpYWxpemVfZm9yX3BhcmNlbGFibGUhKEFycmF5T2ZJbnRlcmZhY2VzKTsKK2JpbmRlcjo6aW1wbF9kZXNlcmlhbGl6ZV9mb3JfcGFyY2VsYWJsZSEoQXJyYXlPZkludGVyZmFjZXMpOworaW1wbCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWxhYmxlTWV0YWRhdGEgZm9yIEFycmF5T2ZJbnRlcmZhY2VzIHsKKyAgZm4gZ2V0X2Rlc2NyaXB0b3IoKSAtPiAmJ3N0YXRpYyBzdHIgeyAiYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzIiB9Cit9CitwdWIgbW9kIElFbXB0eUludGVyZmFjZSB7CisgICMhW2FsbG93KG5vbl91cHBlcl9jYXNlX2dsb2JhbHMpXQorICAjIVthbGxvdyhub25fc25ha2VfY2FzZSldCisgICNbYWxsb3codW51c2VkX2ltcG9ydHMpXSB1c2UgYmluZGVyOjpiaW5kZXJfaW1wbDo6SUJpbmRlckludGVybmFsOworICB1c2UgYmluZGVyOjpkZWNsYXJlX2JpbmRlcl9pbnRlcmZhY2U7CisgIGRlY2xhcmVfYmluZGVyX2ludGVyZmFjZSEgeworICAgIElFbXB0eUludGVyZmFjZVsiYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZSJdIHsKKyAgICAgIG5hdGl2ZTogQm5FbXB0eUludGVyZmFjZShvbl90cmFuc2FjdCksCisgICAgICBwcm94eTogQnBFbXB0eUludGVyZmFjZSB7CisgICAgICB9LAorICAgICAgYXN5bmM6IElFbXB0eUludGVyZmFjZUFzeW5jLAorICAgIH0KKyAgfQorICBwdWIgdHJhaXQgSUVtcHR5SW50ZXJmYWNlOiBiaW5kZXI6OkludGVyZmFjZSArIFNlbmQgeworICAgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHdoZXJlIFNlbGY6IFNpemVkIHsgImFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UiIH0KKyAgICBmbiBnZXREZWZhdWx0SW1wbCgpIC0+IElFbXB0eUludGVyZmFjZURlZmF1bHRSZWYgd2hlcmUgU2VsZjogU2l6ZWQgeworICAgICAgREVGQVVMVF9JTVBMLmxvY2soKS51bndyYXAoKS5jbG9uZSgpCisgICAgfQorICAgIGZuIHNldERlZmF1bHRJbXBsKGQ6IElFbXB0eUludGVyZmFjZURlZmF1bHRSZWYpIC0+IElFbXB0eUludGVyZmFjZURlZmF1bHRSZWYgd2hlcmUgU2VsZjogU2l6ZWQgeworICAgICAgc3RkOjptZW06OnJlcGxhY2UoJm11dCAqREVGQVVMVF9JTVBMLmxvY2soKS51bndyYXAoKSwgZCkKKyAgICB9CisgIH0KKyAgcHViIHRyYWl0IElFbXB0eUludGVyZmFjZUFzeW5jPFA+OiBiaW5kZXI6OkludGVyZmFjZSArIFNlbmQgeworICAgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHdoZXJlIFNlbGY6IFNpemVkIHsgImFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UiIH0KKyAgfQorICAjWzo6YXN5bmNfdHJhaXQ6OmFzeW5jX3RyYWl0XQorICBwdWIgdHJhaXQgSUVtcHR5SW50ZXJmYWNlQXN5bmNTZXJ2ZXI6IGJpbmRlcjo6SW50ZXJmYWNlICsgU2VuZCB7CisgICAgZm4gZ2V0X2Rlc2NyaXB0b3IoKSAtPiAmJ3N0YXRpYyBzdHIgd2hlcmUgU2VsZjogU2l6ZWQgeyAiYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZSIgfQorICB9CisgIGltcGwgQm5FbXB0eUludGVyZmFjZSB7CisgICAgLy8vIENyZWF0ZSBhIG5ldyBhc3luYyBiaW5kZXIgc2VydmljZS4KKyAgICBwdWIgZm4gbmV3X2FzeW5jX2JpbmRlcjxULCBSPihpbm5lcjogVCwgcnQ6IFIsIGZlYXR1cmVzOiBiaW5kZXI6OkJpbmRlckZlYXR1cmVzKSAtPiBiaW5kZXI6OlN0cm9uZzxkeW4gSUVtcHR5SW50ZXJmYWNlPgorICAgIHdoZXJlCisgICAgICBUOiBJRW1wdHlJbnRlcmZhY2VBc3luY1NlcnZlciArIGJpbmRlcjo6SW50ZXJmYWNlICsgU2VuZCArIFN5bmMgKyAnc3RhdGljLAorICAgICAgUjogYmluZGVyOjpiaW5kZXJfaW1wbDo6QmluZGVyQXN5bmNSdW50aW1lICsgU2VuZCArIFN5bmMgKyAnc3RhdGljLAorICAgIHsKKyAgICAgIHN0cnVjdCBXcmFwcGVyPFQsIFI+IHsKKyAgICAgICAgX2lubmVyOiBULAorICAgICAgICBfcnQ6IFIsCisgICAgICB9CisgICAgICBpbXBsPFQsIFI+IGJpbmRlcjo6SW50ZXJmYWNlIGZvciBXcmFwcGVyPFQsIFI+IHdoZXJlIFQ6IGJpbmRlcjo6SW50ZXJmYWNlLCBSOiBTZW5kICsgU3luYyB7CisgICAgICAgIGZuIGFzX2JpbmRlcigmc2VsZikgLT4gYmluZGVyOjpTcElCaW5kZXIgeyBzZWxmLl9pbm5lci5hc19iaW5kZXIoKSB9CisgICAgICAgIGZuIGR1bXAoJnNlbGYsIF9maWxlOiAmc3RkOjpmczo6RmlsZSwgX2FyZ3M6ICZbJnN0ZDo6ZmZpOjpDU3RyXSkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7IHNlbGYuX2lubmVyLmR1bXAoX2ZpbGUsIF9hcmdzKSB9CisgICAgICB9CisgICAgICBpbXBsPFQsIFI+IElFbXB0eUludGVyZmFjZSBmb3IgV3JhcHBlcjxULCBSPgorICAgICAgd2hlcmUKKyAgICAgICAgVDogSUVtcHR5SW50ZXJmYWNlQXN5bmNTZXJ2ZXIgKyBTZW5kICsgU3luYyArICdzdGF0aWMsCisgICAgICAgIFI6IGJpbmRlcjo6YmluZGVyX2ltcGw6OkJpbmRlckFzeW5jUnVudGltZSArIFNlbmQgKyBTeW5jICsgJ3N0YXRpYywKKyAgICAgIHsKKyAgICAgIH0KKyAgICAgIGxldCB3cmFwcGVkID0gV3JhcHBlciB7IF9pbm5lcjogaW5uZXIsIF9ydDogcnQgfTsKKyAgICAgIFNlbGY6Om5ld19iaW5kZXIod3JhcHBlZCwgZmVhdHVyZXMpCisgICAgfQorICB9CisgIHB1YiB0cmFpdCBJRW1wdHlJbnRlcmZhY2VEZWZhdWx0OiBTZW5kICsgU3luYyB7CisgIH0KKyAgcHViIG1vZCB0cmFuc2FjdGlvbnMgeworICB9CisgIHB1YiB0eXBlIElFbXB0eUludGVyZmFjZURlZmF1bHRSZWYgPSBPcHRpb248c3RkOjpzeW5jOjpBcmM8ZHluIElFbXB0eUludGVyZmFjZURlZmF1bHQ+PjsKKyAgdXNlIGxhenlfc3RhdGljOjpsYXp5X3N0YXRpYzsKKyAgbGF6eV9zdGF0aWMhIHsKKyAgICBzdGF0aWMgcmVmIERFRkFVTFRfSU1QTDogc3RkOjpzeW5jOjpNdXRleDxJRW1wdHlJbnRlcmZhY2VEZWZhdWx0UmVmPiA9IHN0ZDo6c3luYzo6TXV0ZXg6Om5ldyhOb25lKTsKKyAgfQorICBpbXBsIEJwRW1wdHlJbnRlcmZhY2UgeworICB9CisgIGltcGwgSUVtcHR5SW50ZXJmYWNlIGZvciBCcEVtcHR5SW50ZXJmYWNlIHsKKyAgfQorICBpbXBsPFA6IGJpbmRlcjo6QmluZGVyQXN5bmNQb29sPiBJRW1wdHlJbnRlcmZhY2VBc3luYzxQPiBmb3IgQnBFbXB0eUludGVyZmFjZSB7CisgIH0KKyAgaW1wbCBJRW1wdHlJbnRlcmZhY2UgZm9yIGJpbmRlcjo6YmluZGVyX2ltcGw6OkJpbmRlcjxCbkVtcHR5SW50ZXJmYWNlPiB7CisgIH0KKyAgZm4gb25fdHJhbnNhY3QoX2FpZGxfc2VydmljZTogJmR5biBJRW1wdHlJbnRlcmZhY2UsIF9haWRsX2NvZGU6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSwgX2FpZGxfZGF0YTogJmJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsPCdfPiwgX2FpZGxfcmVwbHk6ICZtdXQgYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWw8J18+KSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsKKyAgICBtYXRjaCBfYWlkbF9jb2RlIHsKKyAgICAgIF8gPT4gRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikKKyAgICB9CisgIH0KK30KK3B1YiBtb2QgSU15SW50ZXJmYWNlIHsKKyAgIyFbYWxsb3cobm9uX3VwcGVyX2Nhc2VfZ2xvYmFscyldCisgICMhW2FsbG93KG5vbl9zbmFrZV9jYXNlKV0KKyAgI1thbGxvdyh1bnVzZWRfaW1wb3J0cyldIHVzZSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpJQmluZGVySW50ZXJuYWw7CisgIHVzZSBiaW5kZXI6OmRlY2xhcmVfYmluZGVyX2ludGVyZmFjZTsKKyAgZGVjbGFyZV9iaW5kZXJfaW50ZXJmYWNlISB7CisgICAgSU15SW50ZXJmYWNlWyJhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSU15SW50ZXJmYWNlIl0geworICAgICAgbmF0aXZlOiBCbk15SW50ZXJmYWNlKG9uX3RyYW5zYWN0KSwKKyAgICAgIHByb3h5OiBCcE15SW50ZXJmYWNlIHsKKyAgICAgIH0sCisgICAgICBhc3luYzogSU15SW50ZXJmYWNlQXN5bmMsCisgICAgfQorICB9CisgIHB1YiB0cmFpdCBJTXlJbnRlcmZhY2U6IGJpbmRlcjo6SW50ZXJmYWNlICsgU2VuZCB7CisgICAgZm4gZ2V0X2Rlc2NyaXB0b3IoKSAtPiAmJ3N0YXRpYyBzdHIgd2hlcmUgU2VsZjogU2l6ZWQgeyAiYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklNeUludGVyZmFjZSIgfQorICAgIGZuIG1ldGhvZFdpdGhJbnRlcmZhY2VzKCZzZWxmLCBfYXJnX2lmYWNlOiAmYmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4sIF9hcmdfbnVsbGFibGVfaWZhY2U6IE9wdGlvbjwmYmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+LCBfYXJnX2lmYWNlX2FycmF5X2luOiAmW2JpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+XSwgX2FyZ19pZmFjZV9hcnJheV9vdXQ6ICZtdXQgVmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+LCBfYXJnX2lmYWNlX2FycmF5X2lub3V0OiAmbXV0IFZlYzxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4sIF9hcmdfbnVsbGFibGVfaWZhY2VfYXJyYXlfaW46IE9wdGlvbjwmW09wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj5dPiwgX2FyZ19udWxsYWJsZV9pZmFjZV9hcnJheV9vdXQ6ICZtdXQgT3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+Pj4sIF9hcmdfbnVsbGFibGVfaWZhY2VfYXJyYXlfaW5vdXQ6ICZtdXQgT3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+Pj4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4+PjsKKyAgICBmbiBnZXREZWZhdWx0SW1wbCgpIC0+IElNeUludGVyZmFjZURlZmF1bHRSZWYgd2hlcmUgU2VsZjogU2l6ZWQgeworICAgICAgREVGQVVMVF9JTVBMLmxvY2soKS51bndyYXAoKS5jbG9uZSgpCisgICAgfQorICAgIGZuIHNldERlZmF1bHRJbXBsKGQ6IElNeUludGVyZmFjZURlZmF1bHRSZWYpIC0+IElNeUludGVyZmFjZURlZmF1bHRSZWYgd2hlcmUgU2VsZjogU2l6ZWQgeworICAgICAgc3RkOjptZW06OnJlcGxhY2UoJm11dCAqREVGQVVMVF9JTVBMLmxvY2soKS51bndyYXAoKSwgZCkKKyAgICB9CisgIH0KKyAgcHViIHRyYWl0IElNeUludGVyZmFjZUFzeW5jPFA+OiBiaW5kZXI6OkludGVyZmFjZSArIFNlbmQgeworICAgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHdoZXJlIFNlbGY6IFNpemVkIHsgImFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JTXlJbnRlcmZhY2UiIH0KKyAgICBmbiBtZXRob2RXaXRoSW50ZXJmYWNlczwnYT4oJidhIHNlbGYsIF9hcmdfaWZhY2U6ICYnYSBiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPiwgX2FyZ19udWxsYWJsZV9pZmFjZTogT3B0aW9uPCYnYSBiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4sIF9hcmdfaWZhY2VfYXJyYXlfaW46ICYnYSBbYmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT5dLCBfYXJnX2lmYWNlX2FycmF5X291dDogJidhIG11dCBWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4sIF9hcmdfaWZhY2VfYXJyYXlfaW5vdXQ6ICYnYSBtdXQgVmVjPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+PiwgX2FyZ19udWxsYWJsZV9pZmFjZV9hcnJheV9pbjogT3B0aW9uPCYnYSBbT3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pl0+LCBfYXJnX251bGxhYmxlX2lmYWNlX2FycmF5X291dDogJidhIG11dCBPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+PiwgX2FyZ19udWxsYWJsZV9pZmFjZV9hcnJheV9pbm91dDogJidhIG11dCBPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+PikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4+Pj47CisgIH0KKyAgI1s6OmFzeW5jX3RyYWl0Ojphc3luY190cmFpdF0KKyAgcHViIHRyYWl0IElNeUludGVyZmFjZUFzeW5jU2VydmVyOiBiaW5kZXI6OkludGVyZmFjZSArIFNlbmQgeworICAgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHdoZXJlIFNlbGY6IFNpemVkIHsgImFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JTXlJbnRlcmZhY2UiIH0KKyAgICBhc3luYyBmbiBtZXRob2RXaXRoSW50ZXJmYWNlcygmc2VsZiwgX2FyZ19pZmFjZTogJmJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+LCBfYXJnX251bGxhYmxlX2lmYWNlOiBPcHRpb248JmJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+PiwgX2FyZ19pZmFjZV9hcnJheV9pbjogJltiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPl0sIF9hcmdfaWZhY2VfYXJyYXlfb3V0OiAmbXV0IFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+PiwgX2FyZ19pZmFjZV9hcnJheV9pbm91dDogJm11dCBWZWM8YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+LCBfYXJnX251bGxhYmxlX2lmYWNlX2FycmF5X2luOiBPcHRpb248JltPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+XT4sIF9hcmdfbnVsbGFibGVfaWZhY2VfYXJyYXlfb3V0OiAmbXV0IE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4+LCBfYXJnX251bGxhYmxlX2lmYWNlX2FycmF5X2lub3V0OiAmbXV0IE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+Pj47CisgIH0KKyAgaW1wbCBCbk15SW50ZXJmYWNlIHsKKyAgICAvLy8gQ3JlYXRlIGEgbmV3IGFzeW5jIGJpbmRlciBzZXJ2aWNlLgorICAgIHB1YiBmbiBuZXdfYXN5bmNfYmluZGVyPFQsIFI+KGlubmVyOiBULCBydDogUiwgZmVhdHVyZXM6IGJpbmRlcjo6QmluZGVyRmVhdHVyZXMpIC0+IGJpbmRlcjo6U3Ryb25nPGR5biBJTXlJbnRlcmZhY2U+CisgICAgd2hlcmUKKyAgICAgIFQ6IElNeUludGVyZmFjZUFzeW5jU2VydmVyICsgYmluZGVyOjpJbnRlcmZhY2UgKyBTZW5kICsgU3luYyArICdzdGF0aWMsCisgICAgICBSOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpCaW5kZXJBc3luY1J1bnRpbWUgKyBTZW5kICsgU3luYyArICdzdGF0aWMsCisgICAgeworICAgICAgc3RydWN0IFdyYXBwZXI8VCwgUj4geworICAgICAgICBfaW5uZXI6IFQsCisgICAgICAgIF9ydDogUiwKKyAgICAgIH0KKyAgICAgIGltcGw8VCwgUj4gYmluZGVyOjpJbnRlcmZhY2UgZm9yIFdyYXBwZXI8VCwgUj4gd2hlcmUgVDogYmluZGVyOjpJbnRlcmZhY2UsIFI6IFNlbmQgKyBTeW5jIHsKKyAgICAgICAgZm4gYXNfYmluZGVyKCZzZWxmKSAtPiBiaW5kZXI6OlNwSUJpbmRlciB7IHNlbGYuX2lubmVyLmFzX2JpbmRlcigpIH0KKyAgICAgICAgZm4gZHVtcCgmc2VsZiwgX2ZpbGU6ICZzdGQ6OmZzOjpGaWxlLCBfYXJnczogJlsmc3RkOjpmZmk6OkNTdHJdKSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsgc2VsZi5faW5uZXIuZHVtcChfZmlsZSwgX2FyZ3MpIH0KKyAgICAgIH0KKyAgICAgIGltcGw8VCwgUj4gSU15SW50ZXJmYWNlIGZvciBXcmFwcGVyPFQsIFI+CisgICAgICB3aGVyZQorICAgICAgICBUOiBJTXlJbnRlcmZhY2VBc3luY1NlcnZlciArIFNlbmQgKyBTeW5jICsgJ3N0YXRpYywKKyAgICAgICAgUjogYmluZGVyOjpiaW5kZXJfaW1wbDo6QmluZGVyQXN5bmNSdW50aW1lICsgU2VuZCArIFN5bmMgKyAnc3RhdGljLAorICAgICAgeworICAgICAgICBmbiBtZXRob2RXaXRoSW50ZXJmYWNlcygmc2VsZiwgX2FyZ19pZmFjZTogJmJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+LCBfYXJnX251bGxhYmxlX2lmYWNlOiBPcHRpb248JmJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+PiwgX2FyZ19pZmFjZV9hcnJheV9pbjogJltiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPl0sIF9hcmdfaWZhY2VfYXJyYXlfb3V0OiAmbXV0IFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+PiwgX2FyZ19pZmFjZV9hcnJheV9pbm91dDogJm11dCBWZWM8YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+LCBfYXJnX251bGxhYmxlX2lmYWNlX2FycmF5X2luOiBPcHRpb248JltPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+XT4sIF9hcmdfbnVsbGFibGVfaWZhY2VfYXJyYXlfb3V0OiAmbXV0IE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4+LCBfYXJnX251bGxhYmxlX2lmYWNlX2FycmF5X2lub3V0OiAmbXV0IE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+Pj4geworICAgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLm1ldGhvZFdpdGhJbnRlcmZhY2VzKF9hcmdfaWZhY2UsIF9hcmdfbnVsbGFibGVfaWZhY2UsIF9hcmdfaWZhY2VfYXJyYXlfaW4sIF9hcmdfaWZhY2VfYXJyYXlfb3V0LCBfYXJnX2lmYWNlX2FycmF5X2lub3V0LCBfYXJnX251bGxhYmxlX2lmYWNlX2FycmF5X2luLCBfYXJnX251bGxhYmxlX2lmYWNlX2FycmF5X291dCwgX2FyZ19udWxsYWJsZV9pZmFjZV9hcnJheV9pbm91dCkpCisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGxldCB3cmFwcGVkID0gV3JhcHBlciB7IF9pbm5lcjogaW5uZXIsIF9ydDogcnQgfTsKKyAgICAgIFNlbGY6Om5ld19iaW5kZXIod3JhcHBlZCwgZmVhdHVyZXMpCisgICAgfQorICB9CisgIHB1YiB0cmFpdCBJTXlJbnRlcmZhY2VEZWZhdWx0OiBTZW5kICsgU3luYyB7CisgICAgZm4gbWV0aG9kV2l0aEludGVyZmFjZXMoJnNlbGYsIF9hcmdfaWZhY2U6ICZiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPiwgX2FyZ19udWxsYWJsZV9pZmFjZTogT3B0aW9uPCZiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4sIF9hcmdfaWZhY2VfYXJyYXlfaW46ICZbYmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT5dLCBfYXJnX2lmYWNlX2FycmF5X291dDogJm11dCBWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4sIF9hcmdfaWZhY2VfYXJyYXlfaW5vdXQ6ICZtdXQgVmVjPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+PiwgX2FyZ19udWxsYWJsZV9pZmFjZV9hcnJheV9pbjogT3B0aW9uPCZbT3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pl0+LCBfYXJnX251bGxhYmxlX2lmYWNlX2FycmF5X291dDogJm11dCBPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+PiwgX2FyZ19udWxsYWJsZV9pZmFjZV9hcnJheV9pbm91dDogJm11dCBPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+PikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+Pj4+IHsKKyAgICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQorICAgIH0KKyAgfQorICBwdWIgbW9kIHRyYW5zYWN0aW9ucyB7CisgICAgcHViIGNvbnN0IG1ldGhvZFdpdGhJbnRlcmZhY2VzOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMDsKKyAgfQorICBwdWIgdHlwZSBJTXlJbnRlcmZhY2VEZWZhdWx0UmVmID0gT3B0aW9uPHN0ZDo6c3luYzo6QXJjPGR5biBJTXlJbnRlcmZhY2VEZWZhdWx0Pj47CisgIHVzZSBsYXp5X3N0YXRpYzo6bGF6eV9zdGF0aWM7CisgIGxhenlfc3RhdGljISB7CisgICAgc3RhdGljIHJlZiBERUZBVUxUX0lNUEw6IHN0ZDo6c3luYzo6TXV0ZXg8SU15SW50ZXJmYWNlRGVmYXVsdFJlZj4gPSBzdGQ6OnN5bmM6Ok11dGV4OjpuZXcoTm9uZSk7CisgIH0KKyAgaW1wbCBCcE15SW50ZXJmYWNlIHsKKyAgICBmbiBidWlsZF9wYXJjZWxfbWV0aG9kV2l0aEludGVyZmFjZXMoJnNlbGYsIF9hcmdfaWZhY2U6ICZiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPiwgX2FyZ19udWxsYWJsZV9pZmFjZTogT3B0aW9uPCZiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4sIF9hcmdfaWZhY2VfYXJyYXlfaW46ICZbYmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT5dLCBfYXJnX2lmYWNlX2FycmF5X291dDogJm11dCBWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4sIF9hcmdfaWZhY2VfYXJyYXlfaW5vdXQ6ICZtdXQgVmVjPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+PiwgX2FyZ19udWxsYWJsZV9pZmFjZV9hcnJheV9pbjogT3B0aW9uPCZbT3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pl0+LCBfYXJnX251bGxhYmxlX2lmYWNlX2FycmF5X291dDogJm11dCBPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+PiwgX2FyZ19udWxsYWJsZV9pZmFjZV9hcnJheV9pbm91dDogJm11dCBPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+PikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsPiB7CisgICAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgICBhaWRsX2RhdGEud3JpdGUoX2FyZ19pZmFjZSk/OworICAgICAgYWlkbF9kYXRhLndyaXRlKCZfYXJnX251bGxhYmxlX2lmYWNlKT87CisgICAgICBhaWRsX2RhdGEud3JpdGUoX2FyZ19pZmFjZV9hcnJheV9pbik/OworICAgICAgYWlkbF9kYXRhLndyaXRlX3NsaWNlX3NpemUoU29tZShfYXJnX2lmYWNlX2FycmF5X291dCkpPzsKKyAgICAgIGFpZGxfZGF0YS53cml0ZShfYXJnX2lmYWNlX2FycmF5X2lub3V0KT87CisgICAgICBhaWRsX2RhdGEud3JpdGUoJl9hcmdfbnVsbGFibGVfaWZhY2VfYXJyYXlfaW4pPzsKKyAgICAgIGFpZGxfZGF0YS53cml0ZV9zbGljZV9zaXplKF9hcmdfbnVsbGFibGVfaWZhY2VfYXJyYXlfb3V0LmFzX2RlcmVmKCkpPzsKKyAgICAgIGFpZGxfZGF0YS53cml0ZShfYXJnX251bGxhYmxlX2lmYWNlX2FycmF5X2lub3V0KT87CisgICAgICBPayhhaWRsX2RhdGEpCisgICAgfQorICAgIGZuIHJlYWRfcmVzcG9uc2VfbWV0aG9kV2l0aEludGVyZmFjZXMoJnNlbGYsIF9hcmdfaWZhY2U6ICZiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPiwgX2FyZ19udWxsYWJsZV9pZmFjZTogT3B0aW9uPCZiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4sIF9hcmdfaWZhY2VfYXJyYXlfaW46ICZbYmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT5dLCBfYXJnX2lmYWNlX2FycmF5X291dDogJm11dCBWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4sIF9hcmdfaWZhY2VfYXJyYXlfaW5vdXQ6ICZtdXQgVmVjPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+PiwgX2FyZ19udWxsYWJsZV9pZmFjZV9hcnJheV9pbjogT3B0aW9uPCZbT3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pl0+LCBfYXJnX251bGxhYmxlX2lmYWNlX2FycmF5X291dDogJm11dCBPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+PiwgX2FyZ19udWxsYWJsZV9pZmFjZV9hcnJheV9pbm91dDogJm11dCBPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+PiwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+Pj4geworICAgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgeworICAgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSU15SW50ZXJmYWNlPjo6Z2V0RGVmYXVsdEltcGwoKSB7CisgICAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5tZXRob2RXaXRoSW50ZXJmYWNlcyhfYXJnX2lmYWNlLCBfYXJnX251bGxhYmxlX2lmYWNlLCBfYXJnX2lmYWNlX2FycmF5X2luLCBfYXJnX2lmYWNlX2FycmF5X291dCwgX2FyZ19pZmFjZV9hcnJheV9pbm91dCwgX2FyZ19udWxsYWJsZV9pZmFjZV9hcnJheV9pbiwgX2FyZ19udWxsYWJsZV9pZmFjZV9hcnJheV9vdXQsIF9hcmdfbnVsbGFibGVfaWZhY2VfYXJyYXlfaW5vdXQpOworICAgICAgICB9CisgICAgICB9CisgICAgICBsZXQgX2FpZGxfcmVwbHkgPSBfYWlkbF9yZXBseT87CisgICAgICBsZXQgX2FpZGxfc3RhdHVzOiBiaW5kZXI6OlN0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWQoKT87CisgICAgICBpZiAhX2FpZGxfc3RhdHVzLmlzX29rKCkgeyByZXR1cm4gRXJyKF9haWRsX3N0YXR1cyk7IH0KKyAgICAgIGxldCBfYWlkbF9yZXR1cm46IE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4+ID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKKyAgICAgIF9haWRsX3JlcGx5LnJlYWRfb250byhfYXJnX2lmYWNlX2FycmF5X291dCk/OworICAgICAgX2FpZGxfcmVwbHkucmVhZF9vbnRvKF9hcmdfaWZhY2VfYXJyYXlfaW5vdXQpPzsKKyAgICAgIF9haWRsX3JlcGx5LnJlYWRfb250byhfYXJnX251bGxhYmxlX2lmYWNlX2FycmF5X291dCk/OworICAgICAgX2FpZGxfcmVwbHkucmVhZF9vbnRvKF9hcmdfbnVsbGFibGVfaWZhY2VfYXJyYXlfaW5vdXQpPzsKKyAgICAgIE9rKF9haWRsX3JldHVybikKKyAgICB9CisgIH0KKyAgaW1wbCBJTXlJbnRlcmZhY2UgZm9yIEJwTXlJbnRlcmZhY2UgeworICAgIGZuIG1ldGhvZFdpdGhJbnRlcmZhY2VzKCZzZWxmLCBfYXJnX2lmYWNlOiAmYmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4sIF9hcmdfbnVsbGFibGVfaWZhY2U6IE9wdGlvbjwmYmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+LCBfYXJnX2lmYWNlX2FycmF5X2luOiAmW2JpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+XSwgX2FyZ19pZmFjZV9hcnJheV9vdXQ6ICZtdXQgVmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+LCBfYXJnX2lmYWNlX2FycmF5X2lub3V0OiAmbXV0IFZlYzxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4sIF9hcmdfbnVsbGFibGVfaWZhY2VfYXJyYXlfaW46IE9wdGlvbjwmW09wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj5dPiwgX2FyZ19udWxsYWJsZV9pZmFjZV9hcnJheV9vdXQ6ICZtdXQgT3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+Pj4sIF9hcmdfbnVsbGFibGVfaWZhY2VfYXJyYXlfaW5vdXQ6ICZtdXQgT3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+Pj4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4+PiB7CisgICAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX21ldGhvZFdpdGhJbnRlcmZhY2VzKF9hcmdfaWZhY2UsIF9hcmdfbnVsbGFibGVfaWZhY2UsIF9hcmdfaWZhY2VfYXJyYXlfaW4sIF9hcmdfaWZhY2VfYXJyYXlfb3V0LCBfYXJnX2lmYWNlX2FycmF5X2lub3V0LCBfYXJnX251bGxhYmxlX2lmYWNlX2FycmF5X2luLCBfYXJnX251bGxhYmxlX2lmYWNlX2FycmF5X291dCwgX2FyZ19udWxsYWJsZV9pZmFjZV9hcnJheV9pbm91dCk/OworICAgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6bWV0aG9kV2l0aEludGVyZmFjZXMsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCk7CisgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfbWV0aG9kV2l0aEludGVyZmFjZXMoX2FyZ19pZmFjZSwgX2FyZ19udWxsYWJsZV9pZmFjZSwgX2FyZ19pZmFjZV9hcnJheV9pbiwgX2FyZ19pZmFjZV9hcnJheV9vdXQsIF9hcmdfaWZhY2VfYXJyYXlfaW5vdXQsIF9hcmdfbnVsbGFibGVfaWZhY2VfYXJyYXlfaW4sIF9hcmdfbnVsbGFibGVfaWZhY2VfYXJyYXlfb3V0LCBfYXJnX251bGxhYmxlX2lmYWNlX2FycmF5X2lub3V0LCBfYWlkbF9yZXBseSkKKyAgICB9CisgIH0KKyAgaW1wbDxQOiBiaW5kZXI6OkJpbmRlckFzeW5jUG9vbD4gSU15SW50ZXJmYWNlQXN5bmM8UD4gZm9yIEJwTXlJbnRlcmZhY2UgeworICAgIGZuIG1ldGhvZFdpdGhJbnRlcmZhY2VzPCdhPigmJ2Egc2VsZiwgX2FyZ19pZmFjZTogJidhIGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+LCBfYXJnX251bGxhYmxlX2lmYWNlOiBPcHRpb248JidhIGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+PiwgX2FyZ19pZmFjZV9hcnJheV9pbjogJidhIFtiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPl0sIF9hcmdfaWZhY2VfYXJyYXlfb3V0OiAmJ2EgbXV0IFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+PiwgX2FyZ19pZmFjZV9hcnJheV9pbm91dDogJidhIG11dCBWZWM8YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+LCBfYXJnX251bGxhYmxlX2lmYWNlX2FycmF5X2luOiBPcHRpb248JidhIFtPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+XT4sIF9hcmdfbnVsbGFibGVfaWZhY2VfYXJyYXlfb3V0OiAmJ2EgbXV0IE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4+LCBfYXJnX251bGxhYmxlX2lmYWNlX2FycmF5X2lub3V0OiAmJ2EgbXV0IE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4+KSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+Pj4+PiB7CisgICAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX21ldGhvZFdpdGhJbnRlcmZhY2VzKF9hcmdfaWZhY2UsIF9hcmdfbnVsbGFibGVfaWZhY2UsIF9hcmdfaWZhY2VfYXJyYXlfaW4sIF9hcmdfaWZhY2VfYXJyYXlfb3V0LCBfYXJnX2lmYWNlX2FycmF5X2lub3V0LCBfYXJnX251bGxhYmxlX2lmYWNlX2FycmF5X2luLCBfYXJnX251bGxhYmxlX2lmYWNlX2FycmF5X291dCwgX2FyZ19udWxsYWJsZV9pZmFjZV9hcnJheV9pbm91dCkgeworICAgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgICB9OworICAgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgICBQOjpzcGF3bigKKyAgICAgICAgbW92ZSB8fCBiaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6bWV0aG9kV2l0aEludGVyZmFjZXMsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfbWV0aG9kV2l0aEludGVyZmFjZXMoX2FyZ19pZmFjZSwgX2FyZ19udWxsYWJsZV9pZmFjZSwgX2FyZ19pZmFjZV9hcnJheV9pbiwgX2FyZ19pZmFjZV9hcnJheV9vdXQsIF9hcmdfaWZhY2VfYXJyYXlfaW5vdXQsIF9hcmdfbnVsbGFibGVfaWZhY2VfYXJyYXlfaW4sIF9hcmdfbnVsbGFibGVfaWZhY2VfYXJyYXlfb3V0LCBfYXJnX251bGxhYmxlX2lmYWNlX2FycmF5X2lub3V0LCBfYWlkbF9yZXBseSkKKyAgICAgICAgfQorICAgICAgKQorICAgIH0KKyAgfQorICBpbXBsIElNeUludGVyZmFjZSBmb3IgYmluZGVyOjpiaW5kZXJfaW1wbDo6QmluZGVyPEJuTXlJbnRlcmZhY2U+IHsKKyAgICBmbiBtZXRob2RXaXRoSW50ZXJmYWNlcygmc2VsZiwgX2FyZ19pZmFjZTogJmJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+LCBfYXJnX251bGxhYmxlX2lmYWNlOiBPcHRpb248JmJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+PiwgX2FyZ19pZmFjZV9hcnJheV9pbjogJltiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPl0sIF9hcmdfaWZhY2VfYXJyYXlfb3V0OiAmbXV0IFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+PiwgX2FyZ19pZmFjZV9hcnJheV9pbm91dDogJm11dCBWZWM8YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+LCBfYXJnX251bGxhYmxlX2lmYWNlX2FycmF5X2luOiBPcHRpb248JltPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+XT4sIF9hcmdfbnVsbGFibGVfaWZhY2VfYXJyYXlfb3V0OiAmbXV0IE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4+LCBfYXJnX251bGxhYmxlX2lmYWNlX2FycmF5X2lub3V0OiAmbXV0IE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+Pj4geyBzZWxmLjAubWV0aG9kV2l0aEludGVyZmFjZXMoX2FyZ19pZmFjZSwgX2FyZ19udWxsYWJsZV9pZmFjZSwgX2FyZ19pZmFjZV9hcnJheV9pbiwgX2FyZ19pZmFjZV9hcnJheV9vdXQsIF9hcmdfaWZhY2VfYXJyYXlfaW5vdXQsIF9hcmdfbnVsbGFibGVfaWZhY2VfYXJyYXlfaW4sIF9hcmdfbnVsbGFibGVfaWZhY2VfYXJyYXlfb3V0LCBfYXJnX251bGxhYmxlX2lmYWNlX2FycmF5X2lub3V0KSB9CisgIH0KKyAgZm4gb25fdHJhbnNhY3QoX2FpZGxfc2VydmljZTogJmR5biBJTXlJbnRlcmZhY2UsIF9haWRsX2NvZGU6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSwgX2FpZGxfZGF0YTogJmJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsPCdfPiwgX2FpZGxfcmVwbHk6ICZtdXQgYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWw8J18+KSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsKKyAgICBtYXRjaCBfYWlkbF9jb2RlIHsKKyAgICAgIHRyYW5zYWN0aW9uczo6bWV0aG9kV2l0aEludGVyZmFjZXMgPT4geworICAgICAgICBsZXQgX2FyZ19pZmFjZTogYmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4gPSBfYWlkbF9kYXRhLnJlYWQoKT87CisgICAgICAgIGxldCBfYXJnX251bGxhYmxlX2lmYWNlOiBPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+ID0gX2FpZGxfZGF0YS5yZWFkKCk/OworICAgICAgICBsZXQgX2FyZ19pZmFjZV9hcnJheV9pbjogVmVjPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+PiA9IF9haWRsX2RhdGEucmVhZCgpPzsKKyAgICAgICAgbGV0IG11dCBfYXJnX2lmYWNlX2FycmF5X291dDogVmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+ID0gRGVmYXVsdDo6ZGVmYXVsdCgpOworICAgICAgICBfYWlkbF9kYXRhLnJlc2l6ZV9vdXRfdmVjKCZtdXQgX2FyZ19pZmFjZV9hcnJheV9vdXQpPzsKKyAgICAgICAgbGV0IG11dCBfYXJnX2lmYWNlX2FycmF5X2lub3V0OiBWZWM8YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+ID0gX2FpZGxfZGF0YS5yZWFkKCk/OworICAgICAgICBsZXQgX2FyZ19udWxsYWJsZV9pZmFjZV9hcnJheV9pbjogT3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+Pj4gPSBfYWlkbF9kYXRhLnJlYWQoKT87CisgICAgICAgIGxldCBtdXQgX2FyZ19udWxsYWJsZV9pZmFjZV9hcnJheV9vdXQ6IE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4+ID0gRGVmYXVsdDo6ZGVmYXVsdCgpOworICAgICAgICBfYWlkbF9kYXRhLnJlc2l6ZV9udWxsYWJsZV9vdXRfdmVjKCZtdXQgX2FyZ19udWxsYWJsZV9pZmFjZV9hcnJheV9vdXQpPzsKKyAgICAgICAgbGV0IG11dCBfYXJnX251bGxhYmxlX2lmYWNlX2FycmF5X2lub3V0OiBPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+PiA9IF9haWRsX2RhdGEucmVhZCgpPzsKKyAgICAgICAgbGV0IF9haWRsX3JldHVybiA9IF9haWRsX3NlcnZpY2UubWV0aG9kV2l0aEludGVyZmFjZXMoJl9hcmdfaWZhY2UsIF9hcmdfbnVsbGFibGVfaWZhY2UuYXNfcmVmKCksICZfYXJnX2lmYWNlX2FycmF5X2luLCAmbXV0IF9hcmdfaWZhY2VfYXJyYXlfb3V0LCAmbXV0IF9hcmdfaWZhY2VfYXJyYXlfaW5vdXQsIF9hcmdfbnVsbGFibGVfaWZhY2VfYXJyYXlfaW4uYXNfZGVyZWYoKSwgJm11dCBfYXJnX251bGxhYmxlX2lmYWNlX2FycmF5X291dCwgJm11dCBfYXJnX251bGxhYmxlX2lmYWNlX2FycmF5X2lub3V0KTsKKyAgICAgICAgbWF0Y2ggJl9haWRsX3JldHVybiB7CisgICAgICAgICAgT2soX2FpZGxfcmV0dXJuKSA9PiB7CisgICAgICAgICAgICBfYWlkbF9yZXBseS53cml0ZSgmYmluZGVyOjpTdGF0dXM6OmZyb20oYmluZGVyOjpTdGF0dXNDb2RlOjpPSykpPzsKKyAgICAgICAgICAgIF9haWRsX3JlcGx5LndyaXRlKF9haWRsX3JldHVybik/OworICAgICAgICAgICAgX2FpZGxfcmVwbHkud3JpdGUoJl9hcmdfaWZhY2VfYXJyYXlfb3V0KT87CisgICAgICAgICAgICBfYWlkbF9yZXBseS53cml0ZSgmX2FyZ19pZmFjZV9hcnJheV9pbm91dCk/OworICAgICAgICAgICAgX2FpZGxfcmVwbHkud3JpdGUoJl9hcmdfbnVsbGFibGVfaWZhY2VfYXJyYXlfb3V0KT87CisgICAgICAgICAgICBfYWlkbF9yZXBseS53cml0ZSgmX2FyZ19udWxsYWJsZV9pZmFjZV9hcnJheV9pbm91dCk/OworICAgICAgICAgIH0KKyAgICAgICAgICBFcnIoX2FpZGxfc3RhdHVzKSA9PiBfYWlkbF9yZXBseS53cml0ZShfYWlkbF9zdGF0dXMpPworICAgICAgICB9CisgICAgICAgIE9rKCgpKQorICAgICAgfQorICAgICAgXyA9PiBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKQorICAgIH0KKyAgfQorfQorcHViIG1vZCBNeVBhcmNlbGFibGUgeworICAjW2Rlcml2ZShEZWJ1ZyldCisgIHB1YiBzdHJ1Y3QgTXlQYXJjZWxhYmxlIHsKKyAgICBwdWIgaWZhY2U6IE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4sCisgICAgcHViIG51bGxhYmxlX2lmYWNlOiBPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+LAorICAgIHB1YiBpZmFjZV9hcnJheTogVmVjPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+PiwKKyAgICBwdWIgbnVsbGFibGVfaWZhY2VfYXJyYXk6IE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4+LAorICB9CisgIGltcGwgRGVmYXVsdCBmb3IgTXlQYXJjZWxhYmxlIHsKKyAgICBmbiBkZWZhdWx0KCkgLT4gU2VsZiB7CisgICAgICBTZWxmIHsKKyAgICAgICAgaWZhY2U6IERlZmF1bHQ6OmRlZmF1bHQoKSwKKyAgICAgICAgbnVsbGFibGVfaWZhY2U6IERlZmF1bHQ6OmRlZmF1bHQoKSwKKyAgICAgICAgaWZhY2VfYXJyYXk6IERlZmF1bHQ6OmRlZmF1bHQoKSwKKyAgICAgICAgbnVsbGFibGVfaWZhY2VfYXJyYXk6IERlZmF1bHQ6OmRlZmF1bHQoKSwKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaW1wbCBiaW5kZXI6OlBhcmNlbGFibGUgZm9yIE15UGFyY2VsYWJsZSB7CisgICAgZm4gd3JpdGVfdG9fcGFyY2VsKCZzZWxmLCBwYXJjZWw6ICZtdXQgYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWwpIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4geworICAgICAgcGFyY2VsLnNpemVkX3dyaXRlKHxzdWJwYXJjZWx8IHsKKyAgICAgICAgbGV0IF9fZmllbGRfcmVmID0gc2VsZi5pZmFjZS5hc19yZWYoKS5va19vcihiaW5kZXI6OlN0YXR1c0NvZGU6OlVORVhQRUNURURfTlVMTCk/OworICAgICAgICBzdWJwYXJjZWwud3JpdGUoX19maWVsZF9yZWYpPzsKKyAgICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLm51bGxhYmxlX2lmYWNlKT87CisgICAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5pZmFjZV9hcnJheSk/OworICAgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYubnVsbGFibGVfaWZhY2VfYXJyYXkpPzsKKyAgICAgICAgT2soKCkpCisgICAgICB9KQorICAgIH0KKyAgICBmbiByZWFkX2Zyb21fcGFyY2VsKCZtdXQgc2VsZiwgcGFyY2VsOiAmYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWwpIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4geworICAgICAgcGFyY2VsLnNpemVkX3JlYWQofHN1YnBhcmNlbHwgeworICAgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgICBzZWxmLmlmYWNlID0gU29tZShzdWJwYXJjZWwucmVhZCgpPyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgICAgc2VsZi5udWxsYWJsZV9pZmFjZSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgICB9CisgICAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICAgIHNlbGYuaWZhY2VfYXJyYXkgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgICAgfQorICAgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgICBzZWxmLm51bGxhYmxlX2lmYWNlX2FycmF5ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICAgIH0KKyAgICAgICAgT2soKCkpCisgICAgICB9KQorICAgIH0KKyAgfQorICBiaW5kZXI6OmltcGxfc2VyaWFsaXplX2Zvcl9wYXJjZWxhYmxlIShNeVBhcmNlbGFibGUpOworICBiaW5kZXI6OmltcGxfZGVzZXJpYWxpemVfZm9yX3BhcmNlbGFibGUhKE15UGFyY2VsYWJsZSk7CisgIGltcGwgYmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsYWJsZU1ldGFkYXRhIGZvciBNeVBhcmNlbGFibGUgeworICAgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHsgImFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5NeVBhcmNlbGFibGUiIH0KKyAgfQorfQorcHViIG1vZCBNeVVuaW9uIHsKKyAgI1tkZXJpdmUoRGVidWcpXQorICBwdWIgZW51bSBNeVVuaW9uIHsKKyAgICBJZmFjZShPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+KSwKKyAgICBOdWxsYWJsZV9pZmFjZShPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+KSwKKyAgICBJZmFjZV9hcnJheShWZWM8YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+KSwKKyAgICBOdWxsYWJsZV9pZmFjZV9hcnJheShPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+PiksCisgIH0KKyAgaW1wbCBEZWZhdWx0IGZvciBNeVVuaW9uIHsKKyAgICBmbiBkZWZhdWx0KCkgLT4gU2VsZiB7CisgICAgICBTZWxmOjpJZmFjZShEZWZhdWx0OjpkZWZhdWx0KCkpCisgICAgfQorICB9CisgIGltcGwgYmluZGVyOjpQYXJjZWxhYmxlIGZvciBNeVVuaW9uIHsKKyAgICBmbiB3cml0ZV90b19wYXJjZWwoJnNlbGYsIHBhcmNlbDogJm11dCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbCkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CisgICAgICBtYXRjaCBzZWxmIHsKKyAgICAgICAgU2VsZjo6SWZhY2UodikgPT4geworICAgICAgICAgIHBhcmNlbC53cml0ZSgmMGkzMik/OworICAgICAgICAgIGxldCBfX2ZpZWxkX3JlZiA9IHYuYXNfcmVmKCkub2tfb3IoYmluZGVyOjpTdGF0dXNDb2RlOjpVTkVYUEVDVEVEX05VTEwpPzsKKyAgICAgICAgICBwYXJjZWwud3JpdGUoX19maWVsZF9yZWYpCisgICAgICAgIH0KKyAgICAgICAgU2VsZjo6TnVsbGFibGVfaWZhY2UodikgPT4geworICAgICAgICAgIHBhcmNlbC53cml0ZSgmMWkzMik/OworICAgICAgICAgIHBhcmNlbC53cml0ZSh2KQorICAgICAgICB9CisgICAgICAgIFNlbGY6OklmYWNlX2FycmF5KHYpID0+IHsKKyAgICAgICAgICBwYXJjZWwud3JpdGUoJjJpMzIpPzsKKyAgICAgICAgICBwYXJjZWwud3JpdGUodikKKyAgICAgICAgfQorICAgICAgICBTZWxmOjpOdWxsYWJsZV9pZmFjZV9hcnJheSh2KSA9PiB7CisgICAgICAgICAgcGFyY2VsLndyaXRlKCYzaTMyKT87CisgICAgICAgICAgcGFyY2VsLndyaXRlKHYpCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZm4gcmVhZF9mcm9tX3BhcmNlbCgmbXV0IHNlbGYsIHBhcmNlbDogJmJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsKSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsKKyAgICAgIGxldCB0YWc6IGkzMiA9IHBhcmNlbC5yZWFkKCk/OworICAgICAgbWF0Y2ggdGFnIHsKKyAgICAgICAgMCA9PiB7CisgICAgICAgICAgbGV0IHZhbHVlOiBPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+ID0gU29tZShwYXJjZWwucmVhZCgpPyk7CisgICAgICAgICAgKnNlbGYgPSBTZWxmOjpJZmFjZSh2YWx1ZSk7CisgICAgICAgICAgT2soKCkpCisgICAgICAgIH0KKyAgICAgICAgMSA9PiB7CisgICAgICAgICAgbGV0IHZhbHVlOiBPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+ID0gcGFyY2VsLnJlYWQoKT87CisgICAgICAgICAgKnNlbGYgPSBTZWxmOjpOdWxsYWJsZV9pZmFjZSh2YWx1ZSk7CisgICAgICAgICAgT2soKCkpCisgICAgICAgIH0KKyAgICAgICAgMiA9PiB7CisgICAgICAgICAgbGV0IHZhbHVlOiBWZWM8YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+ID0gcGFyY2VsLnJlYWQoKT87CisgICAgICAgICAgKnNlbGYgPSBTZWxmOjpJZmFjZV9hcnJheSh2YWx1ZSk7CisgICAgICAgICAgT2soKCkpCisgICAgICAgIH0KKyAgICAgICAgMyA9PiB7CisgICAgICAgICAgbGV0IHZhbHVlOiBPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+PiA9IHBhcmNlbC5yZWFkKCk/OworICAgICAgICAgICpzZWxmID0gU2VsZjo6TnVsbGFibGVfaWZhY2VfYXJyYXkodmFsdWUpOworICAgICAgICAgIE9rKCgpKQorICAgICAgICB9CisgICAgICAgIF8gPT4geworICAgICAgICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OkJBRF9WQUxVRSkKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBiaW5kZXI6OmltcGxfc2VyaWFsaXplX2Zvcl9wYXJjZWxhYmxlIShNeVVuaW9uKTsKKyAgYmluZGVyOjppbXBsX2Rlc2VyaWFsaXplX2Zvcl9wYXJjZWxhYmxlIShNeVVuaW9uKTsKKyAgaW1wbCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWxhYmxlTWV0YWRhdGEgZm9yIE15VW5pb24geworICAgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHsgImFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5NeVVuaW9uIiB9CisgIH0KKyAgcHViIG1vZCBUYWcgeworICAgICMhW2FsbG93KG5vbl91cHBlcl9jYXNlX2dsb2JhbHMpXQorICAgIHVzZSBiaW5kZXI6OmRlY2xhcmVfYmluZGVyX2VudW07CisgICAgZGVjbGFyZV9iaW5kZXJfZW51bSEgeworICAgICAgVGFnIDogW2kzMjsgNF0geworICAgICAgICBpZmFjZSA9IDAsCisgICAgICAgIG51bGxhYmxlX2lmYWNlID0gMSwKKyAgICAgICAgaWZhY2VfYXJyYXkgPSAyLAorICAgICAgICBudWxsYWJsZV9pZmFjZV9hcnJheSA9IDMsCisgICAgICB9CisgICAgfQorICB9Cit9CitwdWIoY3JhdGUpIG1vZCBtYW5nbGVkIHsKKyBwdWIgdXNlIHN1cGVyOjpBcnJheU9mSW50ZXJmYWNlcyBhcyBfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzOworIHB1YiB1c2Ugc3VwZXI6OklFbXB0eUludGVyZmFjZTo6SUVtcHR5SW50ZXJmYWNlIGFzIF83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlOworIHB1YiB1c2Ugc3VwZXI6OklNeUludGVyZmFjZTo6SU15SW50ZXJmYWNlIGFzIF83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTJfSU15SW50ZXJmYWNlOworIHB1YiB1c2Ugc3VwZXI6Ok15UGFyY2VsYWJsZTo6TXlQYXJjZWxhYmxlIGFzIF83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTJfTXlQYXJjZWxhYmxlOworIHB1YiB1c2Ugc3VwZXI6Ok15VW5pb246Ok15VW5pb24gYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc183X015VW5pb247CisgcHViIHVzZSBzdXBlcjo6TXlVbmlvbjo6VGFnOjpUYWcgYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc183X015VW5pb25fM19UYWc7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9BcnJheU9mSW50ZXJmYWNlcy5ycy5kIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvQXJyYXlPZkludGVyZmFjZXMucnMuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2U3ZGM1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvQXJyYXlPZkludGVyZmFjZXMucnMuZApAQCAtMCwwICsxLDIgQEAKK291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvQXJyYXlPZkludGVyZmFjZXMucnMgOiBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9BcnJheU9mSW50ZXJmYWNlcy5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9CYWNrZW5kVHlwZS5ycyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0JhY2tlbmRUeXBlLnJzCmluZGV4IDVkOGQwNTkuLjdmNGJlNTYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0JhY2tlbmRUeXBlLnJzCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0JhY2tlbmRUeXBlLnJzCkBAIC0xLDkgKzEsMTUgQEAKKyMhW2ZvcmJpZCh1bnNhZmVfY29kZSldCisjIVtydXN0Zm10Ojpza2lwXQogIyFbYWxsb3cobm9uX3VwcGVyX2Nhc2VfZ2xvYmFscyldCiB1c2UgYmluZGVyOjpkZWNsYXJlX2JpbmRlcl9lbnVtOwotZGVjbGFyZV9iaW5kZXJfZW51bSEgeyBCYWNrZW5kVHlwZSA6IGk4IHsKLSAgQ1BQID0gMCwKLSAgSkFWQSA9IDEsCi0gIE5ESyA9IDIsCi0gIFJVU1QgPSAzLAotfSB9Ci1wdWIoY3JhdGUpIG1vZCBtYW5nbGVkIHsgcHViIHVzZSBzdXBlcjo6QmFja2VuZFR5cGUgYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMV9CYWNrZW5kVHlwZTsgfQorZGVjbGFyZV9iaW5kZXJfZW51bSEgeworICBCYWNrZW5kVHlwZSA6IFtpODsgNF0geworICAgIENQUCA9IDAsCisgICAgSkFWQSA9IDEsCisgICAgTkRLID0gMiwKKyAgICBSVVNUID0gMywKKyAgfQorfQorcHViKGNyYXRlKSBtb2QgbWFuZ2xlZCB7CisgcHViIHVzZSBzdXBlcjo6QmFja2VuZFR5cGUgYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMV9CYWNrZW5kVHlwZTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0J5dGVFbnVtLnJzIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvQnl0ZUVudW0ucnMKaW5kZXggNzk2MTUzMi4uNTdjNjFlZSAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvQnl0ZUVudW0ucnMKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvQnl0ZUVudW0ucnMKQEAgLTEsOCArMSwxNCBAQAorIyFbZm9yYmlkKHVuc2FmZV9jb2RlKV0KKyMhW3J1c3RmbXQ6OnNraXBdCiAjIVthbGxvdyhub25fdXBwZXJfY2FzZV9nbG9iYWxzKV0KIHVzZSBiaW5kZXI6OmRlY2xhcmVfYmluZGVyX2VudW07Ci1kZWNsYXJlX2JpbmRlcl9lbnVtISB7IEJ5dGVFbnVtIDogaTggewotICBGT08gPSAxLAotICBCQVIgPSAyLAotICBCQVogPSAzLAotfSB9Ci1wdWIoY3JhdGUpIG1vZCBtYW5nbGVkIHsgcHViIHVzZSBzdXBlcjo6Qnl0ZUVudW0gYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtOyB9CitkZWNsYXJlX2JpbmRlcl9lbnVtISB7CisgIEJ5dGVFbnVtIDogW2k4OyAzXSB7CisgICAgRk9PID0gMSwKKyAgICBCQVIgPSAyLAorICAgIEJBWiA9IDMsCisgIH0KK30KK3B1YihjcmF0ZSkgbW9kIG1hbmdsZWQgeworIHB1YiB1c2Ugc3VwZXI6OkJ5dGVFbnVtIGFzIF83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0NvbnN0YW50RXhwcmVzc2lvbkVudW0ucnMgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9Db25zdGFudEV4cHJlc3Npb25FbnVtLnJzCmluZGV4IGUxZGFlN2QuLjMyYTE5NDIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0NvbnN0YW50RXhwcmVzc2lvbkVudW0ucnMKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvQ29uc3RhbnRFeHByZXNzaW9uRW51bS5ycwpAQCAtMSwxNSArMSwyMSBAQAorIyFbZm9yYmlkKHVuc2FmZV9jb2RlKV0KKyMhW3J1c3RmbXQ6OnNraXBdCiAjIVthbGxvdyhub25fdXBwZXJfY2FzZV9nbG9iYWxzKV0KIHVzZSBiaW5kZXI6OmRlY2xhcmVfYmluZGVyX2VudW07Ci1kZWNsYXJlX2JpbmRlcl9lbnVtISB7IENvbnN0YW50RXhwcmVzc2lvbkVudW0gOiBpMzIgewotICBkZWNJbnQzMl8xID0gMSwKLSAgZGVjSW50MzJfMiA9IDEsCi0gIGRlY0ludDY0XzEgPSAxLAotICBkZWNJbnQ2NF8yID0gMSwKLSAgZGVjSW50NjRfMyA9IDEsCi0gIGRlY0ludDY0XzQgPSAxLAotICBoZXhJbnQzMl8xID0gMSwKLSAgaGV4SW50MzJfMiA9IDEsCi0gIGhleEludDMyXzMgPSAxLAotICBoZXhJbnQ2NF8xID0gMSwKLX0gfQotcHViKGNyYXRlKSBtb2QgbWFuZ2xlZCB7IHB1YiB1c2Ugc3VwZXI6OkNvbnN0YW50RXhwcmVzc2lvbkVudW0gYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18yMl9Db25zdGFudEV4cHJlc3Npb25FbnVtOyB9CitkZWNsYXJlX2JpbmRlcl9lbnVtISB7CisgIENvbnN0YW50RXhwcmVzc2lvbkVudW0gOiBbaTMyOyAxMF0geworICAgIGRlY0ludDMyXzEgPSAxLAorICAgIGRlY0ludDMyXzIgPSAxLAorICAgIGRlY0ludDY0XzEgPSAxLAorICAgIGRlY0ludDY0XzIgPSAxLAorICAgIGRlY0ludDY0XzMgPSAxLAorICAgIGRlY0ludDY0XzQgPSAxLAorICAgIGhleEludDMyXzEgPSAxLAorICAgIGhleEludDMyXzIgPSAxLAorICAgIGhleEludDMyXzMgPSAxLAorICAgIGhleEludDY0XzEgPSAxLAorICB9Cit9CitwdWIoY3JhdGUpIG1vZCBtYW5nbGVkIHsKKyBwdWIgdXNlIHN1cGVyOjpDb25zdGFudEV4cHJlc3Npb25FbnVtIGFzIF83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMjJfQ29uc3RhbnRFeHByZXNzaW9uRW51bTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0RlcHJlY2F0ZWRFbnVtLnJzIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvRGVwcmVjYXRlZEVudW0ucnMKaW5kZXggMGQ0NWQ3ZC4uNWQzYjA1NCAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvRGVwcmVjYXRlZEVudW0ucnMKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvRGVwcmVjYXRlZEVudW0ucnMKQEAgLTEsOCArMSwxNSBAQAorIyFbZm9yYmlkKHVuc2FmZV9jb2RlKV0KKyMhW3J1c3RmbXQ6OnNraXBdCiAjIVthbGxvdyhub25fdXBwZXJfY2FzZV9nbG9iYWxzKV0KIHVzZSBiaW5kZXI6OmRlY2xhcmVfYmluZGVyX2VudW07Ci1kZWNsYXJlX2JpbmRlcl9lbnVtISB7IERlcHJlY2F0ZWRFbnVtIDogaTMyIHsKLSAgQSA9IDAsCi0gIEIgPSAxLAotICBDID0gMiwKLX0gfQotcHViKGNyYXRlKSBtb2QgbWFuZ2xlZCB7IHB1YiB1c2Ugc3VwZXI6OkRlcHJlY2F0ZWRFbnVtIGFzIF83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfRGVwcmVjYXRlZEVudW07IH0KK2RlY2xhcmVfYmluZGVyX2VudW0hIHsKKyAgI1tkZXByZWNhdGVkID0gInRlc3QiXQorICBEZXByZWNhdGVkRW51bSA6IFtpMzI7IDNdIHsKKyAgICBBID0gMCwKKyAgICBCID0gMSwKKyAgICBDID0gMiwKKyAgfQorfQorcHViKGNyYXRlKSBtb2QgbWFuZ2xlZCB7CisgcHViIHVzZSBzdXBlcjo6RGVwcmVjYXRlZEVudW0gYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9EZXByZWNhdGVkRW51bTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0RlcHJlY2F0ZWRQYXJjZWxhYmxlLnJzIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvRGVwcmVjYXRlZFBhcmNlbGFibGUucnMKaW5kZXggMThiYTg3NS4uYTEzZGViNiAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvRGVwcmVjYXRlZFBhcmNlbGFibGUucnMKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvRGVwcmVjYXRlZFBhcmNlbGFibGUucnMKQEAgLTEsNTUgKzEsMzIgQEAKKyMhW2ZvcmJpZCh1bnNhZmVfY29kZSldCisjIVtydXN0Zm10Ojpza2lwXQogI1tkZXJpdmUoRGVidWcpXQogI1tkZXByZWNhdGVkID0gInRlc3QiXQogcHViIHN0cnVjdCBEZXByZWNhdGVkUGFyY2VsYWJsZSB7CiB9Ci1wdWIoY3JhdGUpIG1vZCBtYW5nbGVkIHsgcHViIHVzZSBzdXBlcjo6RGVwcmVjYXRlZFBhcmNlbGFibGUgYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18yMF9EZXByZWNhdGVkUGFyY2VsYWJsZTsgfQogaW1wbCBEZWZhdWx0IGZvciBEZXByZWNhdGVkUGFyY2VsYWJsZSB7CiAgIGZuIGRlZmF1bHQoKSAtPiBTZWxmIHsKICAgICBTZWxmIHsKICAgICB9CiAgIH0KIH0KLWltcGwgYmluZGVyOjpwYXJjZWw6OlNlcmlhbGl6ZSBmb3IgRGVwcmVjYXRlZFBhcmNlbGFibGUgewotICBmbiBzZXJpYWxpemUoJnNlbGYsIHBhcmNlbDogJm11dCBiaW5kZXI6OnBhcmNlbDo6UGFyY2VsKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4gewotICAgIDxTZWxmIGFzIGJpbmRlcjo6cGFyY2VsOjpTZXJpYWxpemVPcHRpb24+OjpzZXJpYWxpemVfb3B0aW9uKFNvbWUoc2VsZiksIHBhcmNlbCkKLSAgfQotfQotaW1wbCBiaW5kZXI6OnBhcmNlbDo6U2VyaWFsaXplQXJyYXkgZm9yIERlcHJlY2F0ZWRQYXJjZWxhYmxlIHt9Ci1pbXBsIGJpbmRlcjo6cGFyY2VsOjpTZXJpYWxpemVPcHRpb24gZm9yIERlcHJlY2F0ZWRQYXJjZWxhYmxlIHsKLSAgZm4gc2VyaWFsaXplX29wdGlvbih0aGlzOiBPcHRpb248JlNlbGY+LCBwYXJjZWw6ICZtdXQgYmluZGVyOjpwYXJjZWw6OlBhcmNlbCkgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKLSAgICBsZXQgdGhpcyA9IGlmIGxldCBTb21lKHRoaXMpID0gdGhpcyB7Ci0gICAgICBwYXJjZWwud3JpdGUoJjFpMzIpPzsKLSAgICAgIHRoaXMKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIHBhcmNlbC53cml0ZSgmMGkzMik7Ci0gICAgfTsKK2ltcGwgYmluZGVyOjpQYXJjZWxhYmxlIGZvciBEZXByZWNhdGVkUGFyY2VsYWJsZSB7CisgIGZuIHdyaXRlX3RvX3BhcmNlbCgmc2VsZiwgcGFyY2VsOiAmbXV0IGJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsKSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsKICAgICBwYXJjZWwuc2l6ZWRfd3JpdGUofHN1YnBhcmNlbHwgewogICAgICAgT2soKCkpCiAgICAgfSkKICAgfQotfQotaW1wbCBiaW5kZXI6OnBhcmNlbDo6RGVzZXJpYWxpemUgZm9yIERlcHJlY2F0ZWRQYXJjZWxhYmxlIHsKLSAgZm4gZGVzZXJpYWxpemUocGFyY2VsOiAmYmluZGVyOjpwYXJjZWw6OlBhcmNlbCkgLT4gYmluZGVyOjpSZXN1bHQ8U2VsZj4gewotICAgIDxTZWxmIGFzIGJpbmRlcjo6cGFyY2VsOjpEZXNlcmlhbGl6ZU9wdGlvbj46OmRlc2VyaWFsaXplX29wdGlvbihwYXJjZWwpCi0gICAgICAgLnRyYW5zcG9zZSgpCi0gICAgICAgLnVud3JhcF9vcihFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTkVYUEVDVEVEX05VTEwpKQorICBmbiByZWFkX2Zyb21fcGFyY2VsKCZtdXQgc2VsZiwgcGFyY2VsOiAmYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWwpIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4geworICAgIHBhcmNlbC5zaXplZF9yZWFkKHxzdWJwYXJjZWx8IHsKKyAgICAgIE9rKCgpKQorICAgIH0pCiAgIH0KIH0KLWltcGwgYmluZGVyOjpwYXJjZWw6OkRlc2VyaWFsaXplQXJyYXkgZm9yIERlcHJlY2F0ZWRQYXJjZWxhYmxlIHt9Ci1pbXBsIGJpbmRlcjo6cGFyY2VsOjpEZXNlcmlhbGl6ZU9wdGlvbiBmb3IgRGVwcmVjYXRlZFBhcmNlbGFibGUgewotICBmbiBkZXNlcmlhbGl6ZV9vcHRpb24ocGFyY2VsOiAmYmluZGVyOjpwYXJjZWw6OlBhcmNlbCkgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFNlbGY+PiB7Ci0gICAgbGV0IHN0YXR1czogaTMyID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgc3RhdHVzID09IDAgeyByZXR1cm4gT2soTm9uZSk7IH0KLSAgICBsZXQgc3RhcnRfcG9zID0gcGFyY2VsLmdldF9kYXRhX3Bvc2l0aW9uKCk7Ci0gICAgbGV0IHBhcmNlbGFibGVfc2l6ZTogaTMyID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgcGFyY2VsYWJsZV9zaXplIDwgMCB7IHJldHVybiBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpCQURfVkFMVUUpOyB9Ci0gICAgaWYgc3RhcnRfcG9zLmNoZWNrZWRfYWRkKHBhcmNlbGFibGVfc2l6ZSkuaXNfbm9uZSgpIHsKLSAgICAgIHJldHVybiBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpCQURfVkFMVUUpOwotICAgIH0KLSAgICBsZXQgbXV0IHJlc3VsdCA9IFNlbGY6OmRlZmF1bHQoKTsKLSAgICB1bnNhZmUgewotICAgICAgcGFyY2VsLnNldF9kYXRhX3Bvc2l0aW9uKHN0YXJ0X3BvcyArIHBhcmNlbGFibGVfc2l6ZSk/OwotICAgIH0KLSAgICBPayhTb21lKHJlc3VsdCkpCi0gIH0KK2JpbmRlcjo6aW1wbF9zZXJpYWxpemVfZm9yX3BhcmNlbGFibGUhKERlcHJlY2F0ZWRQYXJjZWxhYmxlKTsKK2JpbmRlcjo6aW1wbF9kZXNlcmlhbGl6ZV9mb3JfcGFyY2VsYWJsZSEoRGVwcmVjYXRlZFBhcmNlbGFibGUpOworaW1wbCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWxhYmxlTWV0YWRhdGEgZm9yIERlcHJlY2F0ZWRQYXJjZWxhYmxlIHsKKyAgZm4gZ2V0X2Rlc2NyaXB0b3IoKSAtPiAmJ3N0YXRpYyBzdHIgeyAiYW5kcm9pZC5haWRsLnRlc3RzLkRlcHJlY2F0ZWRQYXJjZWxhYmxlIiB9Cit9CitwdWIoY3JhdGUpIG1vZCBtYW5nbGVkIHsKKyBwdWIgdXNlIHN1cGVyOjpEZXByZWNhdGVkUGFyY2VsYWJsZSBhcyBfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzIwX0RlcHJlY2F0ZWRQYXJjZWxhYmxlOwogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvRml4ZWRTaXplLnJzIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvRml4ZWRTaXplLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlYTQ0MzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9GaXhlZFNpemUucnMKQEAgLTAsMCArMSwyNDEgQEAKKyMhW2ZvcmJpZCh1bnNhZmVfY29kZSldCisjIVtydXN0Zm10Ojpza2lwXQorI1tkZXJpdmUoRGVidWcpXQorcHViIHN0cnVjdCBGaXhlZFNpemUgeworfQoraW1wbCBEZWZhdWx0IGZvciBGaXhlZFNpemUgeworICBmbiBkZWZhdWx0KCkgLT4gU2VsZiB7CisgICAgU2VsZiB7CisgICAgfQorICB9Cit9CitpbXBsIGJpbmRlcjo6UGFyY2VsYWJsZSBmb3IgRml4ZWRTaXplIHsKKyAgZm4gd3JpdGVfdG9fcGFyY2VsKCZzZWxmLCBwYXJjZWw6ICZtdXQgYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWwpIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4geworICAgIHBhcmNlbC5zaXplZF93cml0ZSh8c3VicGFyY2VsfCB7CisgICAgICBPaygoKSkKKyAgICB9KQorICB9CisgIGZuIHJlYWRfZnJvbV9wYXJjZWwoJm11dCBzZWxmLCBwYXJjZWw6ICZiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbCkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CisgICAgcGFyY2VsLnNpemVkX3JlYWQofHN1YnBhcmNlbHwgeworICAgICAgT2soKCkpCisgICAgfSkKKyAgfQorfQorYmluZGVyOjppbXBsX3NlcmlhbGl6ZV9mb3JfcGFyY2VsYWJsZSEoRml4ZWRTaXplKTsKK2JpbmRlcjo6aW1wbF9kZXNlcmlhbGl6ZV9mb3JfcGFyY2VsYWJsZSEoRml4ZWRTaXplKTsKK2ltcGwgYmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsYWJsZU1ldGFkYXRhIGZvciBGaXhlZFNpemUgeworICBmbiBnZXRfZGVzY3JpcHRvcigpIC0+ICYnc3RhdGljIHN0ciB7ICJhbmRyb2lkLmFpZGwudGVzdHMuRml4ZWRTaXplIiB9Cit9CitwdWIgbW9kIEZpeGVkUGFyY2VsYWJsZSB7CisgICNbZGVyaXZlKERlYnVnKV0KKyAgcHViIHN0cnVjdCBGaXhlZFBhcmNlbGFibGUgeworICAgIHB1YiBib29sZWFuVmFsdWU6IGJvb2wsCisgICAgcHViIGJ5dGVWYWx1ZTogaTgsCisgICAgcHViIGNoYXJWYWx1ZTogdTE2LAorICAgIHB1YiBpbnRWYWx1ZTogaTMyLAorICAgIHB1YiBsb25nVmFsdWU6IGk2NCwKKyAgICBwdWIgZmxvYXRWYWx1ZTogZjMyLAorICAgIHB1YiBkb3VibGVWYWx1ZTogZjY0LAorICAgIHB1YiBlbnVtVmFsdWU6IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW0sCisgICAgcHViIHBhcmNlbGFibGVWYWx1ZTogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOV9GaXhlZFNpemVfMTBfRml4ZWRVbmlvbiwKKyAgfQorICBpbXBsIERlZmF1bHQgZm9yIEZpeGVkUGFyY2VsYWJsZSB7CisgICAgZm4gZGVmYXVsdCgpIC0+IFNlbGYgeworICAgICAgU2VsZiB7CisgICAgICAgIGJvb2xlYW5WYWx1ZTogZmFsc2UsCisgICAgICAgIGJ5dGVWYWx1ZTogMCwKKyAgICAgICAgY2hhclZhbHVlOiAnXDAnIGFzIHUxNiwKKyAgICAgICAgaW50VmFsdWU6IDAsCisgICAgICAgIGxvbmdWYWx1ZTogMCwKKyAgICAgICAgZmxvYXRWYWx1ZTogMC4wMDAwMDBmMzIsCisgICAgICAgIGRvdWJsZVZhbHVlOiAwLjAwMDAwMGY2NCwKKyAgICAgICAgZW51bVZhbHVlOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtOjpGT08sCisgICAgICAgIHBhcmNlbGFibGVWYWx1ZTogRGVmYXVsdDo6ZGVmYXVsdCgpLAorICAgICAgfQorICAgIH0KKyAgfQorICBpbXBsIGJpbmRlcjo6UGFyY2VsYWJsZSBmb3IgRml4ZWRQYXJjZWxhYmxlIHsKKyAgICBmbiB3cml0ZV90b19wYXJjZWwoJnNlbGYsIHBhcmNlbDogJm11dCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbCkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CisgICAgICBwYXJjZWwuc2l6ZWRfd3JpdGUofHN1YnBhcmNlbHwgeworICAgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuYm9vbGVhblZhbHVlKT87CisgICAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5ieXRlVmFsdWUpPzsKKyAgICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmNoYXJWYWx1ZSk/OworICAgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuaW50VmFsdWUpPzsKKyAgICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmxvbmdWYWx1ZSk/OworICAgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuZmxvYXRWYWx1ZSk/OworICAgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuZG91YmxlVmFsdWUpPzsKKyAgICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmVudW1WYWx1ZSk/OworICAgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYucGFyY2VsYWJsZVZhbHVlKT87CisgICAgICAgIE9rKCgpKQorICAgICAgfSkKKyAgICB9CisgICAgZm4gcmVhZF9mcm9tX3BhcmNlbCgmbXV0IHNlbGYsIHBhcmNlbDogJmJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsKSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsKKyAgICAgIHBhcmNlbC5zaXplZF9yZWFkKHxzdWJwYXJjZWx8IHsKKyAgICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgICAgc2VsZi5ib29sZWFuVmFsdWUgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgICAgfQorICAgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgICBzZWxmLmJ5dGVWYWx1ZSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgICB9CisgICAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICAgIHNlbGYuY2hhclZhbHVlID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICAgIH0KKyAgICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgICAgc2VsZi5pbnRWYWx1ZSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgICB9CisgICAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICAgIHNlbGYubG9uZ1ZhbHVlID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICAgIH0KKyAgICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgICAgc2VsZi5mbG9hdFZhbHVlID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICAgIH0KKyAgICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgICAgc2VsZi5kb3VibGVWYWx1ZSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgICB9CisgICAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICAgIHNlbGYuZW51bVZhbHVlID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICAgIH0KKyAgICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgICAgc2VsZi5wYXJjZWxhYmxlVmFsdWUgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgICAgfQorICAgICAgICBPaygoKSkKKyAgICAgIH0pCisgICAgfQorICB9CisgIGJpbmRlcjo6aW1wbF9zZXJpYWxpemVfZm9yX3BhcmNlbGFibGUhKEZpeGVkUGFyY2VsYWJsZSk7CisgIGJpbmRlcjo6aW1wbF9kZXNlcmlhbGl6ZV9mb3JfcGFyY2VsYWJsZSEoRml4ZWRQYXJjZWxhYmxlKTsKKyAgaW1wbCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWxhYmxlTWV0YWRhdGEgZm9yIEZpeGVkUGFyY2VsYWJsZSB7CisgICAgZm4gZ2V0X2Rlc2NyaXB0b3IoKSAtPiAmJ3N0YXRpYyBzdHIgeyAiYW5kcm9pZC5haWRsLnRlc3RzLkZpeGVkU2l6ZS5GaXhlZFBhcmNlbGFibGUiIH0KKyAgfQorfQorcHViIG1vZCBGaXhlZFVuaW9uIHsKKyAgI1tkZXJpdmUoRGVidWcpXQorICBwdWIgZW51bSBGaXhlZFVuaW9uIHsKKyAgICBCb29sZWFuVmFsdWUoYm9vbCksCisgICAgQnl0ZVZhbHVlKGk4KSwKKyAgICBDaGFyVmFsdWUodTE2KSwKKyAgICBJbnRWYWx1ZShpMzIpLAorICAgIExvbmdWYWx1ZShpNjQpLAorICAgIEZsb2F0VmFsdWUoZjMyKSwKKyAgICBEb3VibGVWYWx1ZShmNjQpLAorICAgIEVudW1WYWx1ZShjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtKSwKKyAgfQorICBpbXBsIERlZmF1bHQgZm9yIEZpeGVkVW5pb24geworICAgIGZuIGRlZmF1bHQoKSAtPiBTZWxmIHsKKyAgICAgIFNlbGY6OkJvb2xlYW5WYWx1ZShmYWxzZSkKKyAgICB9CisgIH0KKyAgaW1wbCBiaW5kZXI6OlBhcmNlbGFibGUgZm9yIEZpeGVkVW5pb24geworICAgIGZuIHdyaXRlX3RvX3BhcmNlbCgmc2VsZiwgcGFyY2VsOiAmbXV0IGJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsKSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsKKyAgICAgIG1hdGNoIHNlbGYgeworICAgICAgICBTZWxmOjpCb29sZWFuVmFsdWUodikgPT4geworICAgICAgICAgIHBhcmNlbC53cml0ZSgmMGkzMik/OworICAgICAgICAgIHBhcmNlbC53cml0ZSh2KQorICAgICAgICB9CisgICAgICAgIFNlbGY6OkJ5dGVWYWx1ZSh2KSA9PiB7CisgICAgICAgICAgcGFyY2VsLndyaXRlKCYxaTMyKT87CisgICAgICAgICAgcGFyY2VsLndyaXRlKHYpCisgICAgICAgIH0KKyAgICAgICAgU2VsZjo6Q2hhclZhbHVlKHYpID0+IHsKKyAgICAgICAgICBwYXJjZWwud3JpdGUoJjJpMzIpPzsKKyAgICAgICAgICBwYXJjZWwud3JpdGUodikKKyAgICAgICAgfQorICAgICAgICBTZWxmOjpJbnRWYWx1ZSh2KSA9PiB7CisgICAgICAgICAgcGFyY2VsLndyaXRlKCYzaTMyKT87CisgICAgICAgICAgcGFyY2VsLndyaXRlKHYpCisgICAgICAgIH0KKyAgICAgICAgU2VsZjo6TG9uZ1ZhbHVlKHYpID0+IHsKKyAgICAgICAgICBwYXJjZWwud3JpdGUoJjRpMzIpPzsKKyAgICAgICAgICBwYXJjZWwud3JpdGUodikKKyAgICAgICAgfQorICAgICAgICBTZWxmOjpGbG9hdFZhbHVlKHYpID0+IHsKKyAgICAgICAgICBwYXJjZWwud3JpdGUoJjVpMzIpPzsKKyAgICAgICAgICBwYXJjZWwud3JpdGUodikKKyAgICAgICAgfQorICAgICAgICBTZWxmOjpEb3VibGVWYWx1ZSh2KSA9PiB7CisgICAgICAgICAgcGFyY2VsLndyaXRlKCY2aTMyKT87CisgICAgICAgICAgcGFyY2VsLndyaXRlKHYpCisgICAgICAgIH0KKyAgICAgICAgU2VsZjo6RW51bVZhbHVlKHYpID0+IHsKKyAgICAgICAgICBwYXJjZWwud3JpdGUoJjdpMzIpPzsKKyAgICAgICAgICBwYXJjZWwud3JpdGUodikKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBmbiByZWFkX2Zyb21fcGFyY2VsKCZtdXQgc2VsZiwgcGFyY2VsOiAmYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWwpIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4geworICAgICAgbGV0IHRhZzogaTMyID0gcGFyY2VsLnJlYWQoKT87CisgICAgICBtYXRjaCB0YWcgeworICAgICAgICAwID0+IHsKKyAgICAgICAgICBsZXQgdmFsdWU6IGJvb2wgPSBwYXJjZWwucmVhZCgpPzsKKyAgICAgICAgICAqc2VsZiA9IFNlbGY6OkJvb2xlYW5WYWx1ZSh2YWx1ZSk7CisgICAgICAgICAgT2soKCkpCisgICAgICAgIH0KKyAgICAgICAgMSA9PiB7CisgICAgICAgICAgbGV0IHZhbHVlOiBpOCA9IHBhcmNlbC5yZWFkKCk/OworICAgICAgICAgICpzZWxmID0gU2VsZjo6Qnl0ZVZhbHVlKHZhbHVlKTsKKyAgICAgICAgICBPaygoKSkKKyAgICAgICAgfQorICAgICAgICAyID0+IHsKKyAgICAgICAgICBsZXQgdmFsdWU6IHUxNiA9IHBhcmNlbC5yZWFkKCk/OworICAgICAgICAgICpzZWxmID0gU2VsZjo6Q2hhclZhbHVlKHZhbHVlKTsKKyAgICAgICAgICBPaygoKSkKKyAgICAgICAgfQorICAgICAgICAzID0+IHsKKyAgICAgICAgICBsZXQgdmFsdWU6IGkzMiA9IHBhcmNlbC5yZWFkKCk/OworICAgICAgICAgICpzZWxmID0gU2VsZjo6SW50VmFsdWUodmFsdWUpOworICAgICAgICAgIE9rKCgpKQorICAgICAgICB9CisgICAgICAgIDQgPT4geworICAgICAgICAgIGxldCB2YWx1ZTogaTY0ID0gcGFyY2VsLnJlYWQoKT87CisgICAgICAgICAgKnNlbGYgPSBTZWxmOjpMb25nVmFsdWUodmFsdWUpOworICAgICAgICAgIE9rKCgpKQorICAgICAgICB9CisgICAgICAgIDUgPT4geworICAgICAgICAgIGxldCB2YWx1ZTogZjMyID0gcGFyY2VsLnJlYWQoKT87CisgICAgICAgICAgKnNlbGYgPSBTZWxmOjpGbG9hdFZhbHVlKHZhbHVlKTsKKyAgICAgICAgICBPaygoKSkKKyAgICAgICAgfQorICAgICAgICA2ID0+IHsKKyAgICAgICAgICBsZXQgdmFsdWU6IGY2NCA9IHBhcmNlbC5yZWFkKCk/OworICAgICAgICAgICpzZWxmID0gU2VsZjo6RG91YmxlVmFsdWUodmFsdWUpOworICAgICAgICAgIE9rKCgpKQorICAgICAgICB9CisgICAgICAgIDcgPT4geworICAgICAgICAgIGxldCB2YWx1ZTogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bSA9IHBhcmNlbC5yZWFkKCk/OworICAgICAgICAgICpzZWxmID0gU2VsZjo6RW51bVZhbHVlKHZhbHVlKTsKKyAgICAgICAgICBPaygoKSkKKyAgICAgICAgfQorICAgICAgICBfID0+IHsKKyAgICAgICAgICBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpCQURfVkFMVUUpCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgYmluZGVyOjppbXBsX3NlcmlhbGl6ZV9mb3JfcGFyY2VsYWJsZSEoRml4ZWRVbmlvbik7CisgIGJpbmRlcjo6aW1wbF9kZXNlcmlhbGl6ZV9mb3JfcGFyY2VsYWJsZSEoRml4ZWRVbmlvbik7CisgIGltcGwgYmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsYWJsZU1ldGFkYXRhIGZvciBGaXhlZFVuaW9uIHsKKyAgICBmbiBnZXRfZGVzY3JpcHRvcigpIC0+ICYnc3RhdGljIHN0ciB7ICJhbmRyb2lkLmFpZGwudGVzdHMuRml4ZWRTaXplLkZpeGVkVW5pb24iIH0KKyAgfQorICBwdWIgbW9kIFRhZyB7CisgICAgIyFbYWxsb3cobm9uX3VwcGVyX2Nhc2VfZ2xvYmFscyldCisgICAgdXNlIGJpbmRlcjo6ZGVjbGFyZV9iaW5kZXJfZW51bTsKKyAgICBkZWNsYXJlX2JpbmRlcl9lbnVtISB7CisgICAgICBUYWcgOiBbaTg7IDhdIHsKKyAgICAgICAgYm9vbGVhblZhbHVlID0gMCwKKyAgICAgICAgYnl0ZVZhbHVlID0gMSwKKyAgICAgICAgY2hhclZhbHVlID0gMiwKKyAgICAgICAgaW50VmFsdWUgPSAzLAorICAgICAgICBsb25nVmFsdWUgPSA0LAorICAgICAgICBmbG9hdFZhbHVlID0gNSwKKyAgICAgICAgZG91YmxlVmFsdWUgPSA2LAorICAgICAgICBlbnVtVmFsdWUgPSA3LAorICAgICAgfQorICAgIH0KKyAgfQorfQorcHViKGNyYXRlKSBtb2QgbWFuZ2xlZCB7CisgcHViIHVzZSBzdXBlcjo6Rml4ZWRTaXplIGFzIF83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOV9GaXhlZFNpemU7CisgcHViIHVzZSBzdXBlcjo6Rml4ZWRQYXJjZWxhYmxlOjpGaXhlZFBhcmNlbGFibGUgYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c185X0ZpeGVkU2l6ZV8xNV9GaXhlZFBhcmNlbGFibGU7CisgcHViIHVzZSBzdXBlcjo6Rml4ZWRVbmlvbjo6Rml4ZWRVbmlvbiBhcyBfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzlfRml4ZWRTaXplXzEwX0ZpeGVkVW5pb247CisgcHViIHVzZSBzdXBlcjo6Rml4ZWRVbmlvbjo6VGFnOjpUYWcgYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c185X0ZpeGVkU2l6ZV8xMF9GaXhlZFVuaW9uXzNfVGFnOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvRml4ZWRTaXplLnJzLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9GaXhlZFNpemUucnMuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjM1ZjVlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvRml4ZWRTaXplLnJzLmQKQEAgLTAsMCArMSwzIEBACitvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0ZpeGVkU2l6ZS5ycyA6IFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0ZpeGVkU2l6ZS5haWRsIFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0xvbmdFbnVtLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0dlbmVyaWNTdHJ1Y3R1cmVkUGFyY2VsYWJsZS5ycyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0dlbmVyaWNTdHJ1Y3R1cmVkUGFyY2VsYWJsZS5ycwppbmRleCAyNGZjZDk5Li4yNzI5ZjUxIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9HZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGUucnMKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvR2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxlLnJzCkBAIC0xLDkgKzEsMTAgQEAKKyMhW2ZvcmJpZCh1bnNhZmVfY29kZSldCisjIVtydXN0Zm10Ojpza2lwXQogI1tkZXJpdmUoRGVidWcpXQogcHViIHN0cnVjdCBHZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGUgewogICBwdWIgYTogaTMyLAogICBwdWIgYjogaTMyLAogfQotcHViKGNyYXRlKSBtb2QgbWFuZ2xlZCB7IHB1YiB1c2Ugc3VwZXI6OkdlbmVyaWNTdHJ1Y3R1cmVkUGFyY2VsYWJsZSBhcyBfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzI3X0dlbmVyaWNTdHJ1Y3R1cmVkUGFyY2VsYWJsZTsgfQogaW1wbCBEZWZhdWx0IGZvciBHZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGUgewogICBmbiBkZWZhdWx0KCkgLT4gU2VsZiB7CiAgICAgU2VsZiB7CkBAIC0xMiw1NyArMTMsMzEgQEAKICAgICB9CiAgIH0KIH0KLWltcGwgYmluZGVyOjpwYXJjZWw6OlNlcmlhbGl6ZSBmb3IgR2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxlIHsKLSAgZm4gc2VyaWFsaXplKCZzZWxmLCBwYXJjZWw6ICZtdXQgYmluZGVyOjpwYXJjZWw6OlBhcmNlbCkgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKLSAgICA8U2VsZiBhcyBiaW5kZXI6OnBhcmNlbDo6U2VyaWFsaXplT3B0aW9uPjo6c2VyaWFsaXplX29wdGlvbihTb21lKHNlbGYpLCBwYXJjZWwpCi0gIH0KLX0KLWltcGwgYmluZGVyOjpwYXJjZWw6OlNlcmlhbGl6ZUFycmF5IGZvciBHZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGUge30KLWltcGwgYmluZGVyOjpwYXJjZWw6OlNlcmlhbGl6ZU9wdGlvbiBmb3IgR2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxlIHsKLSAgZm4gc2VyaWFsaXplX29wdGlvbih0aGlzOiBPcHRpb248JlNlbGY+LCBwYXJjZWw6ICZtdXQgYmluZGVyOjpwYXJjZWw6OlBhcmNlbCkgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKLSAgICBsZXQgdGhpcyA9IGlmIGxldCBTb21lKHRoaXMpID0gdGhpcyB7Ci0gICAgICBwYXJjZWwud3JpdGUoJjFpMzIpPzsKLSAgICAgIHRoaXMKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIHBhcmNlbC53cml0ZSgmMGkzMik7Ci0gICAgfTsKK2ltcGwgYmluZGVyOjpQYXJjZWxhYmxlIGZvciBHZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGUgeworICBmbiB3cml0ZV90b19wYXJjZWwoJnNlbGYsIHBhcmNlbDogJm11dCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbCkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CiAgICAgcGFyY2VsLnNpemVkX3dyaXRlKHxzdWJwYXJjZWx8IHsKLSAgICAgIHN1YnBhcmNlbC53cml0ZSgmdGhpcy5hKT87Ci0gICAgICBzdWJwYXJjZWwud3JpdGUoJnRoaXMuYik/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmEpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5iKT87CisgICAgICBPaygoKSkKKyAgICB9KQorICB9CisgIGZuIHJlYWRfZnJvbV9wYXJjZWwoJm11dCBzZWxmLCBwYXJjZWw6ICZiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbCkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CisgICAgcGFyY2VsLnNpemVkX3JlYWQofHN1YnBhcmNlbHwgeworICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuYSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuYiA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQogICAgICAgT2soKCkpCiAgICAgfSkKICAgfQogfQotaW1wbCBiaW5kZXI6OnBhcmNlbDo6RGVzZXJpYWxpemUgZm9yIEdlbmVyaWNTdHJ1Y3R1cmVkUGFyY2VsYWJsZSB7Ci0gIGZuIGRlc2VyaWFsaXplKHBhcmNlbDogJmJpbmRlcjo6cGFyY2VsOjpQYXJjZWwpIC0+IGJpbmRlcjo6UmVzdWx0PFNlbGY+IHsKLSAgICA8U2VsZiBhcyBiaW5kZXI6OnBhcmNlbDo6RGVzZXJpYWxpemVPcHRpb24+OjpkZXNlcmlhbGl6ZV9vcHRpb24ocGFyY2VsKQotICAgICAgIC50cmFuc3Bvc2UoKQotICAgICAgIC51bndyYXBfb3IoRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5FWFBFQ1RFRF9OVUxMKSkKLSAgfQorYmluZGVyOjppbXBsX3NlcmlhbGl6ZV9mb3JfcGFyY2VsYWJsZSEoR2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxlKTsKK2JpbmRlcjo6aW1wbF9kZXNlcmlhbGl6ZV9mb3JfcGFyY2VsYWJsZSEoR2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxlKTsKK2ltcGwgYmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsYWJsZU1ldGFkYXRhIGZvciBHZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGUgeworICBmbiBnZXRfZGVzY3JpcHRvcigpIC0+ICYnc3RhdGljIHN0ciB7ICJhbmRyb2lkLmFpZGwudGVzdHMuR2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxlIiB9CiB9Ci1pbXBsIGJpbmRlcjo6cGFyY2VsOjpEZXNlcmlhbGl6ZUFycmF5IGZvciBHZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGUge30KLWltcGwgYmluZGVyOjpwYXJjZWw6OkRlc2VyaWFsaXplT3B0aW9uIGZvciBHZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGUgewotICBmbiBkZXNlcmlhbGl6ZV9vcHRpb24ocGFyY2VsOiAmYmluZGVyOjpwYXJjZWw6OlBhcmNlbCkgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFNlbGY+PiB7Ci0gICAgbGV0IHN0YXR1czogaTMyID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgc3RhdHVzID09IDAgeyByZXR1cm4gT2soTm9uZSk7IH0KLSAgICBsZXQgc3RhcnRfcG9zID0gcGFyY2VsLmdldF9kYXRhX3Bvc2l0aW9uKCk7Ci0gICAgbGV0IHBhcmNlbGFibGVfc2l6ZTogaTMyID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgcGFyY2VsYWJsZV9zaXplIDwgMCB7IHJldHVybiBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpCQURfVkFMVUUpOyB9Ci0gICAgaWYgc3RhcnRfcG9zLmNoZWNrZWRfYWRkKHBhcmNlbGFibGVfc2l6ZSkuaXNfbm9uZSgpIHsKLSAgICAgIHJldHVybiBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpCQURfVkFMVUUpOwotICAgIH0KLSAgICBsZXQgbXV0IHJlc3VsdCA9IFNlbGY6OmRlZmF1bHQoKTsKLSAgICBpZiAocGFyY2VsLmdldF9kYXRhX3Bvc2l0aW9uKCkgLSBzdGFydF9wb3MpID09IHBhcmNlbGFibGVfc2l6ZSB7Ci0gICAgICByZXR1cm4gT2soU29tZShyZXN1bHQpKTsKLSAgICB9Ci0gICAgcmVzdWx0LmEgPSBwYXJjZWwucmVhZCgpPzsKLSAgICBpZiAocGFyY2VsLmdldF9kYXRhX3Bvc2l0aW9uKCkgLSBzdGFydF9wb3MpID09IHBhcmNlbGFibGVfc2l6ZSB7Ci0gICAgICByZXR1cm4gT2soU29tZShyZXN1bHQpKTsKLSAgICB9Ci0gICAgcmVzdWx0LmIgPSBwYXJjZWwucmVhZCgpPzsKLSAgICB1bnNhZmUgewotICAgICAgcGFyY2VsLnNldF9kYXRhX3Bvc2l0aW9uKHN0YXJ0X3BvcyArIHBhcmNlbGFibGVfc2l6ZSk/OwotICAgIH0KLSAgICBPayhTb21lKHJlc3VsdCkpCi0gIH0KK3B1YihjcmF0ZSkgbW9kIG1hbmdsZWQgeworIHB1YiB1c2Ugc3VwZXI6OkdlbmVyaWNTdHJ1Y3R1cmVkUGFyY2VsYWJsZSBhcyBfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzI3X0dlbmVyaWNTdHJ1Y3R1cmVkUGFyY2VsYWJsZTsKIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lEZXByZWNhdGVkLnJzIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSURlcHJlY2F0ZWQucnMKaW5kZXggNTkyMDY1NC4uNTk5YTY1MSAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSURlcHJlY2F0ZWQucnMKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSURlcHJlY2F0ZWQucnMKQEAgLTEsMTIgKzEsMTUgQEAKKyMhW2ZvcmJpZCh1bnNhZmVfY29kZSldCisjIVtydXN0Zm10Ojpza2lwXQogIyFbYWxsb3cobm9uX3VwcGVyX2Nhc2VfZ2xvYmFscyldCiAjIVthbGxvdyhub25fc25ha2VfY2FzZSldCi0jW2FsbG93KHVudXNlZF9pbXBvcnRzKV0gdXNlIGJpbmRlcjo6SUJpbmRlckludGVybmFsOworI1thbGxvdyh1bnVzZWRfaW1wb3J0cyldIHVzZSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpJQmluZGVySW50ZXJuYWw7CiB1c2UgYmluZGVyOjpkZWNsYXJlX2JpbmRlcl9pbnRlcmZhY2U7CiBkZWNsYXJlX2JpbmRlcl9pbnRlcmZhY2UhIHsKICAgSURlcHJlY2F0ZWRbImFuZHJvaWQuYWlkbC50ZXN0cy5JRGVwcmVjYXRlZCJdIHsKICAgICBuYXRpdmU6IEJuRGVwcmVjYXRlZChvbl90cmFuc2FjdCksCiAgICAgcHJveHk6IEJwRGVwcmVjYXRlZCB7CiAgICAgfSwKKyAgICBhc3luYzogSURlcHJlY2F0ZWRBc3luYywKICAgfQogfQogI1tkZXByZWNhdGVkID0gInRlc3QiXQpAQCAtMTksNiArMjIsNDAgQEAKICAgICBzdGQ6Om1lbTo6cmVwbGFjZSgmbXV0ICpERUZBVUxUX0lNUEwubG9jaygpLnVud3JhcCgpLCBkKQogICB9CiB9CisjW2RlcHJlY2F0ZWQgPSAidGVzdCJdCitwdWIgdHJhaXQgSURlcHJlY2F0ZWRBc3luYzxQPjogYmluZGVyOjpJbnRlcmZhY2UgKyBTZW5kIHsKKyAgZm4gZ2V0X2Rlc2NyaXB0b3IoKSAtPiAmJ3N0YXRpYyBzdHIgd2hlcmUgU2VsZjogU2l6ZWQgeyAiYW5kcm9pZC5haWRsLnRlc3RzLklEZXByZWNhdGVkIiB9Cit9CisjW2RlcHJlY2F0ZWQgPSAidGVzdCJdCisjWzo6YXN5bmNfdHJhaXQ6OmFzeW5jX3RyYWl0XQorcHViIHRyYWl0IElEZXByZWNhdGVkQXN5bmNTZXJ2ZXI6IGJpbmRlcjo6SW50ZXJmYWNlICsgU2VuZCB7CisgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHdoZXJlIFNlbGY6IFNpemVkIHsgImFuZHJvaWQuYWlkbC50ZXN0cy5JRGVwcmVjYXRlZCIgfQorfQoraW1wbCBCbkRlcHJlY2F0ZWQgeworICAvLy8gQ3JlYXRlIGEgbmV3IGFzeW5jIGJpbmRlciBzZXJ2aWNlLgorICBwdWIgZm4gbmV3X2FzeW5jX2JpbmRlcjxULCBSPihpbm5lcjogVCwgcnQ6IFIsIGZlYXR1cmVzOiBiaW5kZXI6OkJpbmRlckZlYXR1cmVzKSAtPiBiaW5kZXI6OlN0cm9uZzxkeW4gSURlcHJlY2F0ZWQ+CisgIHdoZXJlCisgICAgVDogSURlcHJlY2F0ZWRBc3luY1NlcnZlciArIGJpbmRlcjo6SW50ZXJmYWNlICsgU2VuZCArIFN5bmMgKyAnc3RhdGljLAorICAgIFI6IGJpbmRlcjo6YmluZGVyX2ltcGw6OkJpbmRlckFzeW5jUnVudGltZSArIFNlbmQgKyBTeW5jICsgJ3N0YXRpYywKKyAgeworICAgIHN0cnVjdCBXcmFwcGVyPFQsIFI+IHsKKyAgICAgIF9pbm5lcjogVCwKKyAgICAgIF9ydDogUiwKKyAgICB9CisgICAgaW1wbDxULCBSPiBiaW5kZXI6OkludGVyZmFjZSBmb3IgV3JhcHBlcjxULCBSPiB3aGVyZSBUOiBiaW5kZXI6OkludGVyZmFjZSwgUjogU2VuZCArIFN5bmMgeworICAgICAgZm4gYXNfYmluZGVyKCZzZWxmKSAtPiBiaW5kZXI6OlNwSUJpbmRlciB7IHNlbGYuX2lubmVyLmFzX2JpbmRlcigpIH0KKyAgICAgIGZuIGR1bXAoJnNlbGYsIF9maWxlOiAmc3RkOjpmczo6RmlsZSwgX2FyZ3M6ICZbJnN0ZDo6ZmZpOjpDU3RyXSkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7IHNlbGYuX2lubmVyLmR1bXAoX2ZpbGUsIF9hcmdzKSB9CisgICAgfQorICAgIGltcGw8VCwgUj4gSURlcHJlY2F0ZWQgZm9yIFdyYXBwZXI8VCwgUj4KKyAgICB3aGVyZQorICAgICAgVDogSURlcHJlY2F0ZWRBc3luY1NlcnZlciArIFNlbmQgKyBTeW5jICsgJ3N0YXRpYywKKyAgICAgIFI6IGJpbmRlcjo6YmluZGVyX2ltcGw6OkJpbmRlckFzeW5jUnVudGltZSArIFNlbmQgKyBTeW5jICsgJ3N0YXRpYywKKyAgICB7CisgICAgfQorICAgIGxldCB3cmFwcGVkID0gV3JhcHBlciB7IF9pbm5lcjogaW5uZXIsIF9ydDogcnQgfTsKKyAgICBTZWxmOjpuZXdfYmluZGVyKHdyYXBwZWQsIGZlYXR1cmVzKQorICB9Cit9CiBwdWIgdHJhaXQgSURlcHJlY2F0ZWREZWZhdWx0OiBTZW5kICsgU3luYyB7CiB9CiBwdWIgbW9kIHRyYW5zYWN0aW9ucyB7CkBAIC0yOCwxMyArNjUsMTkgQEAKIGxhenlfc3RhdGljISB7CiAgIHN0YXRpYyByZWYgREVGQVVMVF9JTVBMOiBzdGQ6OnN5bmM6Ok11dGV4PElEZXByZWNhdGVkRGVmYXVsdFJlZj4gPSBzdGQ6OnN5bmM6Ok11dGV4OjpuZXcoTm9uZSk7CiB9Ci1wdWIoY3JhdGUpIG1vZCBtYW5nbGVkIHsgcHViIHVzZSBzdXBlcjo6SURlcHJlY2F0ZWQgYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMV9JRGVwcmVjYXRlZDsgfQoraW1wbCBCcERlcHJlY2F0ZWQgeworfQogaW1wbCBJRGVwcmVjYXRlZCBmb3IgQnBEZXByZWNhdGVkIHsKIH0KLWltcGwgSURlcHJlY2F0ZWQgZm9yIGJpbmRlcjo6QmluZGVyPEJuRGVwcmVjYXRlZD4geworaW1wbDxQOiBiaW5kZXI6OkJpbmRlckFzeW5jUG9vbD4gSURlcHJlY2F0ZWRBc3luYzxQPiBmb3IgQnBEZXByZWNhdGVkIHsKIH0KLWZuIG9uX3RyYW5zYWN0KF9haWRsX3NlcnZpY2U6ICZkeW4gSURlcHJlY2F0ZWQsIF9haWRsX2NvZGU6IGJpbmRlcjo6VHJhbnNhY3Rpb25Db2RlLCBfYWlkbF9kYXRhOiAmYmluZGVyOjpwYXJjZWw6OlBhcmNlbCwgX2FpZGxfcmVwbHk6ICZtdXQgYmluZGVyOjpwYXJjZWw6OlBhcmNlbCkgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKK2ltcGwgSURlcHJlY2F0ZWQgZm9yIGJpbmRlcjo6YmluZGVyX2ltcGw6OkJpbmRlcjxCbkRlcHJlY2F0ZWQ+IHsKK30KK2ZuIG9uX3RyYW5zYWN0KF9haWRsX3NlcnZpY2U6ICZkeW4gSURlcHJlY2F0ZWQsIF9haWRsX2NvZGU6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSwgX2FpZGxfZGF0YTogJmJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsPCdfPiwgX2FpZGxfcmVwbHk6ICZtdXQgYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWw8J18+KSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsKICAgbWF0Y2ggX2FpZGxfY29kZSB7CiAgICAgXyA9PiBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKQogICB9CiB9CitwdWIoY3JhdGUpIG1vZCBtYW5nbGVkIHsKKyBwdWIgdXNlIHN1cGVyOjpJRGVwcmVjYXRlZCBhcyBfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzExX0lEZXByZWNhdGVkOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSU5hbWVkQ2FsbGJhY2sucnMgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JTmFtZWRDYWxsYmFjay5ycwppbmRleCBmOGQxZmJhLi40OWFlNTg0IDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JTmFtZWRDYWxsYmFjay5ycworKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JTmFtZWRDYWxsYmFjay5ycwpAQCAtMSwxNyArMSwyMCBAQAorIyFbZm9yYmlkKHVuc2FmZV9jb2RlKV0KKyMhW3J1c3RmbXQ6OnNraXBdCiAjIVthbGxvdyhub25fdXBwZXJfY2FzZV9nbG9iYWxzKV0KICMhW2FsbG93KG5vbl9zbmFrZV9jYXNlKV0KLSNbYWxsb3codW51c2VkX2ltcG9ydHMpXSB1c2UgYmluZGVyOjpJQmluZGVySW50ZXJuYWw7CisjW2FsbG93KHVudXNlZF9pbXBvcnRzKV0gdXNlIGJpbmRlcjo6YmluZGVyX2ltcGw6OklCaW5kZXJJbnRlcm5hbDsKIHVzZSBiaW5kZXI6OmRlY2xhcmVfYmluZGVyX2ludGVyZmFjZTsKIGRlY2xhcmVfYmluZGVyX2ludGVyZmFjZSEgewogICBJTmFtZWRDYWxsYmFja1siYW5kcm9pZC5haWRsLnRlc3RzLklOYW1lZENhbGxiYWNrIl0gewogICAgIG5hdGl2ZTogQm5OYW1lZENhbGxiYWNrKG9uX3RyYW5zYWN0KSwKICAgICBwcm94eTogQnBOYW1lZENhbGxiYWNrIHsKICAgICB9LAorICAgIGFzeW5jOiBJTmFtZWRDYWxsYmFja0FzeW5jLAogICB9CiB9CiBwdWIgdHJhaXQgSU5hbWVkQ2FsbGJhY2s6IGJpbmRlcjo6SW50ZXJmYWNlICsgU2VuZCB7CiAgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHdoZXJlIFNlbGY6IFNpemVkIHsgImFuZHJvaWQuYWlkbC50ZXN0cy5JTmFtZWRDYWxsYmFjayIgfQotICBmbiBHZXROYW1lKCZzZWxmKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxTdHJpbmc+OworICBmbiBHZXROYW1lKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxTdHJpbmc+OwogICBmbiBnZXREZWZhdWx0SW1wbCgpIC0+IElOYW1lZENhbGxiYWNrRGVmYXVsdFJlZiB3aGVyZSBTZWxmOiBTaXplZCB7CiAgICAgREVGQVVMVF9JTVBMLmxvY2soKS51bndyYXAoKS5jbG9uZSgpCiAgIH0KQEAgLTE5LDI1ICsyMiw2MiBAQAogICAgIHN0ZDo6bWVtOjpyZXBsYWNlKCZtdXQgKkRFRkFVTFRfSU1QTC5sb2NrKCkudW53cmFwKCksIGQpCiAgIH0KIH0KK3B1YiB0cmFpdCBJTmFtZWRDYWxsYmFja0FzeW5jPFA+OiBiaW5kZXI6OkludGVyZmFjZSArIFNlbmQgeworICBmbiBnZXRfZGVzY3JpcHRvcigpIC0+ICYnc3RhdGljIHN0ciB3aGVyZSBTZWxmOiBTaXplZCB7ICJhbmRyb2lkLmFpZGwudGVzdHMuSU5hbWVkQ2FsbGJhY2siIH0KKyAgZm4gR2V0TmFtZTwnYT4oJidhIHNlbGYpIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxTdHJpbmc+PjsKK30KKyNbOjphc3luY190cmFpdDo6YXN5bmNfdHJhaXRdCitwdWIgdHJhaXQgSU5hbWVkQ2FsbGJhY2tBc3luY1NlcnZlcjogYmluZGVyOjpJbnRlcmZhY2UgKyBTZW5kIHsKKyAgZm4gZ2V0X2Rlc2NyaXB0b3IoKSAtPiAmJ3N0YXRpYyBzdHIgd2hlcmUgU2VsZjogU2l6ZWQgeyAiYW5kcm9pZC5haWRsLnRlc3RzLklOYW1lZENhbGxiYWNrIiB9CisgIGFzeW5jIGZuIEdldE5hbWUoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PFN0cmluZz47Cit9CitpbXBsIEJuTmFtZWRDYWxsYmFjayB7CisgIC8vLyBDcmVhdGUgYSBuZXcgYXN5bmMgYmluZGVyIHNlcnZpY2UuCisgIHB1YiBmbiBuZXdfYXN5bmNfYmluZGVyPFQsIFI+KGlubmVyOiBULCBydDogUiwgZmVhdHVyZXM6IGJpbmRlcjo6QmluZGVyRmVhdHVyZXMpIC0+IGJpbmRlcjo6U3Ryb25nPGR5biBJTmFtZWRDYWxsYmFjaz4KKyAgd2hlcmUKKyAgICBUOiBJTmFtZWRDYWxsYmFja0FzeW5jU2VydmVyICsgYmluZGVyOjpJbnRlcmZhY2UgKyBTZW5kICsgU3luYyArICdzdGF0aWMsCisgICAgUjogYmluZGVyOjpiaW5kZXJfaW1wbDo6QmluZGVyQXN5bmNSdW50aW1lICsgU2VuZCArIFN5bmMgKyAnc3RhdGljLAorICB7CisgICAgc3RydWN0IFdyYXBwZXI8VCwgUj4geworICAgICAgX2lubmVyOiBULAorICAgICAgX3J0OiBSLAorICAgIH0KKyAgICBpbXBsPFQsIFI+IGJpbmRlcjo6SW50ZXJmYWNlIGZvciBXcmFwcGVyPFQsIFI+IHdoZXJlIFQ6IGJpbmRlcjo6SW50ZXJmYWNlLCBSOiBTZW5kICsgU3luYyB7CisgICAgICBmbiBhc19iaW5kZXIoJnNlbGYpIC0+IGJpbmRlcjo6U3BJQmluZGVyIHsgc2VsZi5faW5uZXIuYXNfYmluZGVyKCkgfQorICAgICAgZm4gZHVtcCgmc2VsZiwgX2ZpbGU6ICZzdGQ6OmZzOjpGaWxlLCBfYXJnczogJlsmc3RkOjpmZmk6OkNTdHJdKSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsgc2VsZi5faW5uZXIuZHVtcChfZmlsZSwgX2FyZ3MpIH0KKyAgICB9CisgICAgaW1wbDxULCBSPiBJTmFtZWRDYWxsYmFjayBmb3IgV3JhcHBlcjxULCBSPgorICAgIHdoZXJlCisgICAgICBUOiBJTmFtZWRDYWxsYmFja0FzeW5jU2VydmVyICsgU2VuZCArIFN5bmMgKyAnc3RhdGljLAorICAgICAgUjogYmluZGVyOjpiaW5kZXJfaW1wbDo6QmluZGVyQXN5bmNSdW50aW1lICsgU2VuZCArIFN5bmMgKyAnc3RhdGljLAorICAgIHsKKyAgICAgIGZuIEdldE5hbWUoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PFN0cmluZz4geworICAgICAgICBzZWxmLl9ydC5ibG9ja19vbihzZWxmLl9pbm5lci5HZXROYW1lKCkpCisgICAgICB9CisgICAgfQorICAgIGxldCB3cmFwcGVkID0gV3JhcHBlciB7IF9pbm5lcjogaW5uZXIsIF9ydDogcnQgfTsKKyAgICBTZWxmOjpuZXdfYmluZGVyKHdyYXBwZWQsIGZlYXR1cmVzKQorICB9Cit9CiBwdWIgdHJhaXQgSU5hbWVkQ2FsbGJhY2tEZWZhdWx0OiBTZW5kICsgU3luYyB7Ci0gIGZuIEdldE5hbWUoJnNlbGYpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PFN0cmluZz4geworICBmbiBHZXROYW1lKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxTdHJpbmc+IHsKICAgICBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OLmludG8oKSkKICAgfQogfQogcHViIG1vZCB0cmFuc2FjdGlvbnMgewotICBwdWIgY29uc3QgR2V0TmFtZTogYmluZGVyOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAwOworICBwdWIgY29uc3QgR2V0TmFtZTogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpiaW5kZXJfaW1wbDo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDA7CiB9CiBwdWIgdHlwZSBJTmFtZWRDYWxsYmFja0RlZmF1bHRSZWYgPSBPcHRpb248c3RkOjpzeW5jOjpBcmM8ZHluIElOYW1lZENhbGxiYWNrRGVmYXVsdD4+OwogdXNlIGxhenlfc3RhdGljOjpsYXp5X3N0YXRpYzsKIGxhenlfc3RhdGljISB7CiAgIHN0YXRpYyByZWYgREVGQVVMVF9JTVBMOiBzdGQ6OnN5bmM6Ok11dGV4PElOYW1lZENhbGxiYWNrRGVmYXVsdFJlZj4gPSBzdGQ6OnN5bmM6Ok11dGV4OjpuZXcoTm9uZSk7CiB9Ci1wdWIoY3JhdGUpIG1vZCBtYW5nbGVkIHsgcHViIHVzZSBzdXBlcjo6SU5hbWVkQ2FsbGJhY2sgYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjazsgfQotaW1wbCBJTmFtZWRDYWxsYmFjayBmb3IgQnBOYW1lZENhbGxiYWNrIHsKLSAgZm4gR2V0TmFtZSgmc2VsZikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8U3RyaW5nPiB7Ci0gICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIudHJhbnNhY3QodHJhbnNhY3Rpb25zOjpHZXROYW1lLCBiaW5kZXI6OkZMQUdfUFJJVkFURV9MT0NBTCwgfF9haWRsX2RhdGF8IHsKLSAgICAgIE9rKCgpKQotICAgIH0pOworaW1wbCBCcE5hbWVkQ2FsbGJhY2sgeworICBmbiBidWlsZF9wYXJjZWxfR2V0TmFtZSgmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsPiB7CisgICAgbGV0IG11dCBhaWRsX2RhdGEgPSBzZWxmLmJpbmRlci5wcmVwYXJlX3RyYW5zYWN0KCk/OworICAgIE9rKGFpZGxfZGF0YSkKKyAgfQorICBmbiByZWFkX3Jlc3BvbnNlX0dldE5hbWUoJnNlbGYsIF9haWRsX3JlcGx5OiBzdGQ6OnJlc3VsdDo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbCwgYmluZGVyOjpTdGF0dXNDb2RlPikgLT4gYmluZGVyOjpSZXN1bHQ8U3RyaW5nPiB7CiAgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgewogICAgICAgaWYgbGV0IFNvbWUoX2FpZGxfZGVmYXVsdF9pbXBsKSA9IDxTZWxmIGFzIElOYW1lZENhbGxiYWNrPjo6Z2V0RGVmYXVsdEltcGwoKSB7CiAgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwuR2V0TmFtZSgpOwpAQCAtNTAsMTAgKzkwLDMyIEBACiAgICAgT2soX2FpZGxfcmV0dXJuKQogICB9CiB9Ci1pbXBsIElOYW1lZENhbGxiYWNrIGZvciBiaW5kZXI6OkJpbmRlcjxCbk5hbWVkQ2FsbGJhY2s+IHsKLSAgZm4gR2V0TmFtZSgmc2VsZikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8U3RyaW5nPiB7IHNlbGYuMC5HZXROYW1lKCkgfQoraW1wbCBJTmFtZWRDYWxsYmFjayBmb3IgQnBOYW1lZENhbGxiYWNrIHsKKyAgZm4gR2V0TmFtZSgmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8U3RyaW5nPiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBzZWxmLmJ1aWxkX3BhcmNlbF9HZXROYW1lKCk/OworICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OkdldE5hbWUsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCk7CisgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX0dldE5hbWUoX2FpZGxfcmVwbHkpCisgIH0KIH0KLWZuIG9uX3RyYW5zYWN0KF9haWRsX3NlcnZpY2U6ICZkeW4gSU5hbWVkQ2FsbGJhY2ssIF9haWRsX2NvZGU6IGJpbmRlcjo6VHJhbnNhY3Rpb25Db2RlLCBfYWlkbF9kYXRhOiAmYmluZGVyOjpwYXJjZWw6OlBhcmNlbCwgX2FpZGxfcmVwbHk6ICZtdXQgYmluZGVyOjpwYXJjZWw6OlBhcmNlbCkgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKK2ltcGw8UDogYmluZGVyOjpCaW5kZXJBc3luY1Bvb2w+IElOYW1lZENhbGxiYWNrQXN5bmM8UD4gZm9yIEJwTmFtZWRDYWxsYmFjayB7CisgIGZuIEdldE5hbWU8J2E+KCYnYSBzZWxmKSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8U3RyaW5nPj4geworICAgIGxldCBfYWlkbF9kYXRhID0gbWF0Y2ggc2VsZi5idWlsZF9wYXJjZWxfR2V0TmFtZSgpIHsKKyAgICAgIE9rKF9haWRsX2RhdGEpID0+IF9haWRsX2RhdGEsCisgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgfTsKKyAgICBsZXQgYmluZGVyID0gc2VsZi5iaW5kZXIuY2xvbmUoKTsKKyAgICBQOjpzcGF3bigKKyAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OkdldE5hbWUsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICBtb3ZlIHxfYWlkbF9yZXBseXwgYXN5bmMgbW92ZSB7CisgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9HZXROYW1lKF9haWRsX3JlcGx5KQorICAgICAgfQorICAgICkKKyAgfQorfQoraW1wbCBJTmFtZWRDYWxsYmFjayBmb3IgYmluZGVyOjpiaW5kZXJfaW1wbDo6QmluZGVyPEJuTmFtZWRDYWxsYmFjaz4geworICBmbiBHZXROYW1lKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxTdHJpbmc+IHsgc2VsZi4wLkdldE5hbWUoKSB9Cit9CitmbiBvbl90cmFuc2FjdChfYWlkbF9zZXJ2aWNlOiAmZHluIElOYW1lZENhbGxiYWNrLCBfYWlkbF9jb2RlOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUsIF9haWRsX2RhdGE6ICZiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbDwnXz4sIF9haWRsX3JlcGx5OiAmbXV0IGJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsPCdfPikgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CiAgIG1hdGNoIF9haWRsX2NvZGUgewogICAgIHRyYW5zYWN0aW9uczo6R2V0TmFtZSA9PiB7CiAgICAgICBsZXQgX2FpZGxfcmV0dXJuID0gX2FpZGxfc2VydmljZS5HZXROYW1lKCk7CkBAIC02OSwzICsxMzEsNiBAQAogICAgIF8gPT4gRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikKICAgfQogfQorcHViKGNyYXRlKSBtb2QgbWFuZ2xlZCB7CisgcHViIHVzZSBzdXBlcjo6SU5hbWVkQ2FsbGJhY2sgYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjazsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lOZXdOYW1lLnJzIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSU5ld05hbWUucnMKaW5kZXggNzBiNmJkMS4uZjgwMDNiNSAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSU5ld05hbWUucnMKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSU5ld05hbWUucnMKQEAgLTEsMTcgKzEsMjAgQEAKKyMhW2ZvcmJpZCh1bnNhZmVfY29kZSldCisjIVtydXN0Zm10Ojpza2lwXQogIyFbYWxsb3cobm9uX3VwcGVyX2Nhc2VfZ2xvYmFscyldCiAjIVthbGxvdyhub25fc25ha2VfY2FzZSldCi0jW2FsbG93KHVudXNlZF9pbXBvcnRzKV0gdXNlIGJpbmRlcjo6SUJpbmRlckludGVybmFsOworI1thbGxvdyh1bnVzZWRfaW1wb3J0cyldIHVzZSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpJQmluZGVySW50ZXJuYWw7CiB1c2UgYmluZGVyOjpkZWNsYXJlX2JpbmRlcl9pbnRlcmZhY2U7CiBkZWNsYXJlX2JpbmRlcl9pbnRlcmZhY2UhIHsKICAgSU5ld05hbWVbImFuZHJvaWQuYWlkbC50ZXN0cy5JT2xkTmFtZSJdIHsKICAgICBuYXRpdmU6IEJuTmV3TmFtZShvbl90cmFuc2FjdCksCiAgICAgcHJveHk6IEJwTmV3TmFtZSB7CiAgICAgfSwKKyAgICBhc3luYzogSU5ld05hbWVBc3luYywKICAgfQogfQogcHViIHRyYWl0IElOZXdOYW1lOiBiaW5kZXI6OkludGVyZmFjZSArIFNlbmQgewogICBmbiBnZXRfZGVzY3JpcHRvcigpIC0+ICYnc3RhdGljIHN0ciB3aGVyZSBTZWxmOiBTaXplZCB7ICJhbmRyb2lkLmFpZGwudGVzdHMuSU9sZE5hbWUiIH0KLSAgZm4gUmVhbE5hbWUoJnNlbGYpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PFN0cmluZz47CisgIGZuIFJlYWxOYW1lKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxTdHJpbmc+OwogICBmbiBnZXREZWZhdWx0SW1wbCgpIC0+IElOZXdOYW1lRGVmYXVsdFJlZiB3aGVyZSBTZWxmOiBTaXplZCB7CiAgICAgREVGQVVMVF9JTVBMLmxvY2soKS51bndyYXAoKS5jbG9uZSgpCiAgIH0KQEAgLTE5LDI1ICsyMiw2MiBAQAogICAgIHN0ZDo6bWVtOjpyZXBsYWNlKCZtdXQgKkRFRkFVTFRfSU1QTC5sb2NrKCkudW53cmFwKCksIGQpCiAgIH0KIH0KK3B1YiB0cmFpdCBJTmV3TmFtZUFzeW5jPFA+OiBiaW5kZXI6OkludGVyZmFjZSArIFNlbmQgeworICBmbiBnZXRfZGVzY3JpcHRvcigpIC0+ICYnc3RhdGljIHN0ciB3aGVyZSBTZWxmOiBTaXplZCB7ICJhbmRyb2lkLmFpZGwudGVzdHMuSU9sZE5hbWUiIH0KKyAgZm4gUmVhbE5hbWU8J2E+KCYnYSBzZWxmKSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8U3RyaW5nPj47Cit9CisjWzo6YXN5bmNfdHJhaXQ6OmFzeW5jX3RyYWl0XQorcHViIHRyYWl0IElOZXdOYW1lQXN5bmNTZXJ2ZXI6IGJpbmRlcjo6SW50ZXJmYWNlICsgU2VuZCB7CisgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHdoZXJlIFNlbGY6IFNpemVkIHsgImFuZHJvaWQuYWlkbC50ZXN0cy5JT2xkTmFtZSIgfQorICBhc3luYyBmbiBSZWFsTmFtZSgmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8U3RyaW5nPjsKK30KK2ltcGwgQm5OZXdOYW1lIHsKKyAgLy8vIENyZWF0ZSBhIG5ldyBhc3luYyBiaW5kZXIgc2VydmljZS4KKyAgcHViIGZuIG5ld19hc3luY19iaW5kZXI8VCwgUj4oaW5uZXI6IFQsIHJ0OiBSLCBmZWF0dXJlczogYmluZGVyOjpCaW5kZXJGZWF0dXJlcykgLT4gYmluZGVyOjpTdHJvbmc8ZHluIElOZXdOYW1lPgorICB3aGVyZQorICAgIFQ6IElOZXdOYW1lQXN5bmNTZXJ2ZXIgKyBiaW5kZXI6OkludGVyZmFjZSArIFNlbmQgKyBTeW5jICsgJ3N0YXRpYywKKyAgICBSOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpCaW5kZXJBc3luY1J1bnRpbWUgKyBTZW5kICsgU3luYyArICdzdGF0aWMsCisgIHsKKyAgICBzdHJ1Y3QgV3JhcHBlcjxULCBSPiB7CisgICAgICBfaW5uZXI6IFQsCisgICAgICBfcnQ6IFIsCisgICAgfQorICAgIGltcGw8VCwgUj4gYmluZGVyOjpJbnRlcmZhY2UgZm9yIFdyYXBwZXI8VCwgUj4gd2hlcmUgVDogYmluZGVyOjpJbnRlcmZhY2UsIFI6IFNlbmQgKyBTeW5jIHsKKyAgICAgIGZuIGFzX2JpbmRlcigmc2VsZikgLT4gYmluZGVyOjpTcElCaW5kZXIgeyBzZWxmLl9pbm5lci5hc19iaW5kZXIoKSB9CisgICAgICBmbiBkdW1wKCZzZWxmLCBfZmlsZTogJnN0ZDo6ZnM6OkZpbGUsIF9hcmdzOiAmWyZzdGQ6OmZmaTo6Q1N0cl0pIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4geyBzZWxmLl9pbm5lci5kdW1wKF9maWxlLCBfYXJncykgfQorICAgIH0KKyAgICBpbXBsPFQsIFI+IElOZXdOYW1lIGZvciBXcmFwcGVyPFQsIFI+CisgICAgd2hlcmUKKyAgICAgIFQ6IElOZXdOYW1lQXN5bmNTZXJ2ZXIgKyBTZW5kICsgU3luYyArICdzdGF0aWMsCisgICAgICBSOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpCaW5kZXJBc3luY1J1bnRpbWUgKyBTZW5kICsgU3luYyArICdzdGF0aWMsCisgICAgeworICAgICAgZm4gUmVhbE5hbWUoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PFN0cmluZz4geworICAgICAgICBzZWxmLl9ydC5ibG9ja19vbihzZWxmLl9pbm5lci5SZWFsTmFtZSgpKQorICAgICAgfQorICAgIH0KKyAgICBsZXQgd3JhcHBlZCA9IFdyYXBwZXIgeyBfaW5uZXI6IGlubmVyLCBfcnQ6IHJ0IH07CisgICAgU2VsZjo6bmV3X2JpbmRlcih3cmFwcGVkLCBmZWF0dXJlcykKKyAgfQorfQogcHViIHRyYWl0IElOZXdOYW1lRGVmYXVsdDogU2VuZCArIFN5bmMgewotICBmbiBSZWFsTmFtZSgmc2VsZikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8U3RyaW5nPiB7CisgIGZuIFJlYWxOYW1lKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxTdHJpbmc+IHsKICAgICBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OLmludG8oKSkKICAgfQogfQogcHViIG1vZCB0cmFuc2FjdGlvbnMgewotICBwdWIgY29uc3QgUmVhbE5hbWU6IGJpbmRlcjo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMDsKKyAgcHViIGNvbnN0IFJlYWxOYW1lOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMDsKIH0KIHB1YiB0eXBlIElOZXdOYW1lRGVmYXVsdFJlZiA9IE9wdGlvbjxzdGQ6OnN5bmM6OkFyYzxkeW4gSU5ld05hbWVEZWZhdWx0Pj47CiB1c2UgbGF6eV9zdGF0aWM6Omxhenlfc3RhdGljOwogbGF6eV9zdGF0aWMhIHsKICAgc3RhdGljIHJlZiBERUZBVUxUX0lNUEw6IHN0ZDo6c3luYzo6TXV0ZXg8SU5ld05hbWVEZWZhdWx0UmVmPiA9IHN0ZDo6c3luYzo6TXV0ZXg6Om5ldyhOb25lKTsKIH0KLXB1YihjcmF0ZSkgbW9kIG1hbmdsZWQgeyBwdWIgdXNlIHN1cGVyOjpJTmV3TmFtZSBhcyBfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfSU5ld05hbWU7IH0KLWltcGwgSU5ld05hbWUgZm9yIEJwTmV3TmFtZSB7Ci0gIGZuIFJlYWxOYW1lKCZzZWxmKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxTdHJpbmc+IHsKLSAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci50cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlYWxOYW1lLCBiaW5kZXI6OkZMQUdfUFJJVkFURV9MT0NBTCwgfF9haWRsX2RhdGF8IHsKLSAgICAgIE9rKCgpKQotICAgIH0pOworaW1wbCBCcE5ld05hbWUgeworICBmbiBidWlsZF9wYXJjZWxfUmVhbE5hbWUoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbD4geworICAgIGxldCBtdXQgYWlkbF9kYXRhID0gc2VsZi5iaW5kZXIucHJlcGFyZV90cmFuc2FjdCgpPzsKKyAgICBPayhhaWRsX2RhdGEpCisgIH0KKyAgZm4gcmVhZF9yZXNwb25zZV9SZWFsTmFtZSgmc2VsZiwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDxTdHJpbmc+IHsKICAgICBpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7CiAgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSU5ld05hbWU+OjpnZXREZWZhdWx0SW1wbCgpIHsKICAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5SZWFsTmFtZSgpOwpAQCAtNTAsMTAgKzkwLDMyIEBACiAgICAgT2soX2FpZGxfcmV0dXJuKQogICB9CiB9Ci1pbXBsIElOZXdOYW1lIGZvciBiaW5kZXI6OkJpbmRlcjxCbk5ld05hbWU+IHsKLSAgZm4gUmVhbE5hbWUoJnNlbGYpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PFN0cmluZz4geyBzZWxmLjAuUmVhbE5hbWUoKSB9CitpbXBsIElOZXdOYW1lIGZvciBCcE5ld05hbWUgeworICBmbiBSZWFsTmFtZSgmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8U3RyaW5nPiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBzZWxmLmJ1aWxkX3BhcmNlbF9SZWFsTmFtZSgpPzsKKyAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZWFsTmFtZSwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmVhbE5hbWUoX2FpZGxfcmVwbHkpCisgIH0KIH0KLWZuIG9uX3RyYW5zYWN0KF9haWRsX3NlcnZpY2U6ICZkeW4gSU5ld05hbWUsIF9haWRsX2NvZGU6IGJpbmRlcjo6VHJhbnNhY3Rpb25Db2RlLCBfYWlkbF9kYXRhOiAmYmluZGVyOjpwYXJjZWw6OlBhcmNlbCwgX2FpZGxfcmVwbHk6ICZtdXQgYmluZGVyOjpwYXJjZWw6OlBhcmNlbCkgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKK2ltcGw8UDogYmluZGVyOjpCaW5kZXJBc3luY1Bvb2w+IElOZXdOYW1lQXN5bmM8UD4gZm9yIEJwTmV3TmFtZSB7CisgIGZuIFJlYWxOYW1lPCdhPigmJ2Egc2VsZikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PFN0cmluZz4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX1JlYWxOYW1lKCkgeworICAgICAgT2soX2FpZGxfZGF0YSkgPT4gX2FpZGxfZGF0YSwKKyAgICAgIEVycihlcnIpID0+IHJldHVybiBCb3g6OnBpbihzdGQ6OmZ1dHVyZTo6cmVhZHkoRXJyKGVycikpKSwKKyAgICB9OworICAgIGxldCBiaW5kZXIgPSBzZWxmLmJpbmRlci5jbG9uZSgpOworICAgIFA6OnNwYXduKAorICAgICAgbW92ZSB8fCBiaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVhbE5hbWUsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICBtb3ZlIHxfYWlkbF9yZXBseXwgYXN5bmMgbW92ZSB7CisgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZWFsTmFtZShfYWlkbF9yZXBseSkKKyAgICAgIH0KKyAgICApCisgIH0KK30KK2ltcGwgSU5ld05hbWUgZm9yIGJpbmRlcjo6YmluZGVyX2ltcGw6OkJpbmRlcjxCbk5ld05hbWU+IHsKKyAgZm4gUmVhbE5hbWUoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PFN0cmluZz4geyBzZWxmLjAuUmVhbE5hbWUoKSB9Cit9CitmbiBvbl90cmFuc2FjdChfYWlkbF9zZXJ2aWNlOiAmZHluIElOZXdOYW1lLCBfYWlkbF9jb2RlOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUsIF9haWRsX2RhdGE6ICZiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbDwnXz4sIF9haWRsX3JlcGx5OiAmbXV0IGJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsPCdfPikgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CiAgIG1hdGNoIF9haWRsX2NvZGUgewogICAgIHRyYW5zYWN0aW9uczo6UmVhbE5hbWUgPT4gewogICAgICAgbGV0IF9haWRsX3JldHVybiA9IF9haWRsX3NlcnZpY2UuUmVhbE5hbWUoKTsKQEAgLTY5LDMgKzEzMSw2IEBACiAgICAgXyA9PiBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKQogICB9CiB9CitwdWIoY3JhdGUpIG1vZCBtYW5nbGVkIHsKKyBwdWIgdXNlIHN1cGVyOjpJTmV3TmFtZSBhcyBfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfSU5ld05hbWU7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JT2xkTmFtZS5ycyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lPbGROYW1lLnJzCmluZGV4IGE2MWQ2NjQuLmUxMGJmOTIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lPbGROYW1lLnJzCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lPbGROYW1lLnJzCkBAIC0xLDE3ICsxLDIwIEBACisjIVtmb3JiaWQodW5zYWZlX2NvZGUpXQorIyFbcnVzdGZtdDo6c2tpcF0KICMhW2FsbG93KG5vbl91cHBlcl9jYXNlX2dsb2JhbHMpXQogIyFbYWxsb3cobm9uX3NuYWtlX2Nhc2UpXQotI1thbGxvdyh1bnVzZWRfaW1wb3J0cyldIHVzZSBiaW5kZXI6OklCaW5kZXJJbnRlcm5hbDsKKyNbYWxsb3codW51c2VkX2ltcG9ydHMpXSB1c2UgYmluZGVyOjpiaW5kZXJfaW1wbDo6SUJpbmRlckludGVybmFsOwogdXNlIGJpbmRlcjo6ZGVjbGFyZV9iaW5kZXJfaW50ZXJmYWNlOwogZGVjbGFyZV9iaW5kZXJfaW50ZXJmYWNlISB7CiAgIElPbGROYW1lWyJhbmRyb2lkLmFpZGwudGVzdHMuSU9sZE5hbWUiXSB7CiAgICAgbmF0aXZlOiBCbk9sZE5hbWUob25fdHJhbnNhY3QpLAogICAgIHByb3h5OiBCcE9sZE5hbWUgewogICAgIH0sCisgICAgYXN5bmM6IElPbGROYW1lQXN5bmMsCiAgIH0KIH0KIHB1YiB0cmFpdCBJT2xkTmFtZTogYmluZGVyOjpJbnRlcmZhY2UgKyBTZW5kIHsKICAgZm4gZ2V0X2Rlc2NyaXB0b3IoKSAtPiAmJ3N0YXRpYyBzdHIgd2hlcmUgU2VsZjogU2l6ZWQgeyAiYW5kcm9pZC5haWRsLnRlc3RzLklPbGROYW1lIiB9Ci0gIGZuIFJlYWxOYW1lKCZzZWxmKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxTdHJpbmc+OworICBmbiBSZWFsTmFtZSgmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8U3RyaW5nPjsKICAgZm4gZ2V0RGVmYXVsdEltcGwoKSAtPiBJT2xkTmFtZURlZmF1bHRSZWYgd2hlcmUgU2VsZjogU2l6ZWQgewogICAgIERFRkFVTFRfSU1QTC5sb2NrKCkudW53cmFwKCkuY2xvbmUoKQogICB9CkBAIC0xOSwyNSArMjIsNjIgQEAKICAgICBzdGQ6Om1lbTo6cmVwbGFjZSgmbXV0ICpERUZBVUxUX0lNUEwubG9jaygpLnVud3JhcCgpLCBkKQogICB9CiB9CitwdWIgdHJhaXQgSU9sZE5hbWVBc3luYzxQPjogYmluZGVyOjpJbnRlcmZhY2UgKyBTZW5kIHsKKyAgZm4gZ2V0X2Rlc2NyaXB0b3IoKSAtPiAmJ3N0YXRpYyBzdHIgd2hlcmUgU2VsZjogU2l6ZWQgeyAiYW5kcm9pZC5haWRsLnRlc3RzLklPbGROYW1lIiB9CisgIGZuIFJlYWxOYW1lPCdhPigmJ2Egc2VsZikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PFN0cmluZz4+OworfQorI1s6OmFzeW5jX3RyYWl0Ojphc3luY190cmFpdF0KK3B1YiB0cmFpdCBJT2xkTmFtZUFzeW5jU2VydmVyOiBiaW5kZXI6OkludGVyZmFjZSArIFNlbmQgeworICBmbiBnZXRfZGVzY3JpcHRvcigpIC0+ICYnc3RhdGljIHN0ciB3aGVyZSBTZWxmOiBTaXplZCB7ICJhbmRyb2lkLmFpZGwudGVzdHMuSU9sZE5hbWUiIH0KKyAgYXN5bmMgZm4gUmVhbE5hbWUoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PFN0cmluZz47Cit9CitpbXBsIEJuT2xkTmFtZSB7CisgIC8vLyBDcmVhdGUgYSBuZXcgYXN5bmMgYmluZGVyIHNlcnZpY2UuCisgIHB1YiBmbiBuZXdfYXN5bmNfYmluZGVyPFQsIFI+KGlubmVyOiBULCBydDogUiwgZmVhdHVyZXM6IGJpbmRlcjo6QmluZGVyRmVhdHVyZXMpIC0+IGJpbmRlcjo6U3Ryb25nPGR5biBJT2xkTmFtZT4KKyAgd2hlcmUKKyAgICBUOiBJT2xkTmFtZUFzeW5jU2VydmVyICsgYmluZGVyOjpJbnRlcmZhY2UgKyBTZW5kICsgU3luYyArICdzdGF0aWMsCisgICAgUjogYmluZGVyOjpiaW5kZXJfaW1wbDo6QmluZGVyQXN5bmNSdW50aW1lICsgU2VuZCArIFN5bmMgKyAnc3RhdGljLAorICB7CisgICAgc3RydWN0IFdyYXBwZXI8VCwgUj4geworICAgICAgX2lubmVyOiBULAorICAgICAgX3J0OiBSLAorICAgIH0KKyAgICBpbXBsPFQsIFI+IGJpbmRlcjo6SW50ZXJmYWNlIGZvciBXcmFwcGVyPFQsIFI+IHdoZXJlIFQ6IGJpbmRlcjo6SW50ZXJmYWNlLCBSOiBTZW5kICsgU3luYyB7CisgICAgICBmbiBhc19iaW5kZXIoJnNlbGYpIC0+IGJpbmRlcjo6U3BJQmluZGVyIHsgc2VsZi5faW5uZXIuYXNfYmluZGVyKCkgfQorICAgICAgZm4gZHVtcCgmc2VsZiwgX2ZpbGU6ICZzdGQ6OmZzOjpGaWxlLCBfYXJnczogJlsmc3RkOjpmZmk6OkNTdHJdKSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsgc2VsZi5faW5uZXIuZHVtcChfZmlsZSwgX2FyZ3MpIH0KKyAgICB9CisgICAgaW1wbDxULCBSPiBJT2xkTmFtZSBmb3IgV3JhcHBlcjxULCBSPgorICAgIHdoZXJlCisgICAgICBUOiBJT2xkTmFtZUFzeW5jU2VydmVyICsgU2VuZCArIFN5bmMgKyAnc3RhdGljLAorICAgICAgUjogYmluZGVyOjpiaW5kZXJfaW1wbDo6QmluZGVyQXN5bmNSdW50aW1lICsgU2VuZCArIFN5bmMgKyAnc3RhdGljLAorICAgIHsKKyAgICAgIGZuIFJlYWxOYW1lKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxTdHJpbmc+IHsKKyAgICAgICAgc2VsZi5fcnQuYmxvY2tfb24oc2VsZi5faW5uZXIuUmVhbE5hbWUoKSkKKyAgICAgIH0KKyAgICB9CisgICAgbGV0IHdyYXBwZWQgPSBXcmFwcGVyIHsgX2lubmVyOiBpbm5lciwgX3J0OiBydCB9OworICAgIFNlbGY6Om5ld19iaW5kZXIod3JhcHBlZCwgZmVhdHVyZXMpCisgIH0KK30KIHB1YiB0cmFpdCBJT2xkTmFtZURlZmF1bHQ6IFNlbmQgKyBTeW5jIHsKLSAgZm4gUmVhbE5hbWUoJnNlbGYpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PFN0cmluZz4geworICBmbiBSZWFsTmFtZSgmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8U3RyaW5nPiB7CiAgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTi5pbnRvKCkpCiAgIH0KIH0KIHB1YiBtb2QgdHJhbnNhY3Rpb25zIHsKLSAgcHViIGNvbnN0IFJlYWxOYW1lOiBiaW5kZXI6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDA7CisgIHB1YiBjb25zdCBSZWFsTmFtZTogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpiaW5kZXJfaW1wbDo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDA7CiB9CiBwdWIgdHlwZSBJT2xkTmFtZURlZmF1bHRSZWYgPSBPcHRpb248c3RkOjpzeW5jOjpBcmM8ZHluIElPbGROYW1lRGVmYXVsdD4+OwogdXNlIGxhenlfc3RhdGljOjpsYXp5X3N0YXRpYzsKIGxhenlfc3RhdGljISB7CiAgIHN0YXRpYyByZWYgREVGQVVMVF9JTVBMOiBzdGQ6OnN5bmM6Ok11dGV4PElPbGROYW1lRGVmYXVsdFJlZj4gPSBzdGQ6OnN5bmM6Ok11dGV4OjpuZXcoTm9uZSk7CiB9Ci1wdWIoY3JhdGUpIG1vZCBtYW5nbGVkIHsgcHViIHVzZSBzdXBlcjo6SU9sZE5hbWUgYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0lPbGROYW1lOyB9Ci1pbXBsIElPbGROYW1lIGZvciBCcE9sZE5hbWUgewotICBmbiBSZWFsTmFtZSgmc2VsZikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8U3RyaW5nPiB7Ci0gICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIudHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZWFsTmFtZSwgYmluZGVyOjpGTEFHX1BSSVZBVEVfTE9DQUwsIHxfYWlkbF9kYXRhfCB7Ci0gICAgICBPaygoKSkKLSAgICB9KTsKK2ltcGwgQnBPbGROYW1lIHsKKyAgZm4gYnVpbGRfcGFyY2VsX1JlYWxOYW1lKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfUmVhbE5hbWUoJnNlbGYsIF9haWRsX3JlcGx5OiBzdGQ6OnJlc3VsdDo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbCwgYmluZGVyOjpTdGF0dXNDb2RlPikgLT4gYmluZGVyOjpSZXN1bHQ8U3RyaW5nPiB7CiAgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgewogICAgICAgaWYgbGV0IFNvbWUoX2FpZGxfZGVmYXVsdF9pbXBsKSA9IDxTZWxmIGFzIElPbGROYW1lPjo6Z2V0RGVmYXVsdEltcGwoKSB7CiAgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwuUmVhbE5hbWUoKTsKQEAgLTUwLDEwICs5MCwzMiBAQAogICAgIE9rKF9haWRsX3JldHVybikKICAgfQogfQotaW1wbCBJT2xkTmFtZSBmb3IgYmluZGVyOjpCaW5kZXI8Qm5PbGROYW1lPiB7Ci0gIGZuIFJlYWxOYW1lKCZzZWxmKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxTdHJpbmc+IHsgc2VsZi4wLlJlYWxOYW1lKCkgfQoraW1wbCBJT2xkTmFtZSBmb3IgQnBPbGROYW1lIHsKKyAgZm4gUmVhbE5hbWUoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PFN0cmluZz4geworICAgIGxldCBfYWlkbF9kYXRhID0gc2VsZi5idWlsZF9wYXJjZWxfUmVhbE5hbWUoKT87CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVhbE5hbWUsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCk7CisgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JlYWxOYW1lKF9haWRsX3JlcGx5KQorICB9CiB9Ci1mbiBvbl90cmFuc2FjdChfYWlkbF9zZXJ2aWNlOiAmZHluIElPbGROYW1lLCBfYWlkbF9jb2RlOiBiaW5kZXI6OlRyYW5zYWN0aW9uQ29kZSwgX2FpZGxfZGF0YTogJmJpbmRlcjo6cGFyY2VsOjpQYXJjZWwsIF9haWRsX3JlcGx5OiAmbXV0IGJpbmRlcjo6cGFyY2VsOjpQYXJjZWwpIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7CitpbXBsPFA6IGJpbmRlcjo6QmluZGVyQXN5bmNQb29sPiBJT2xkTmFtZUFzeW5jPFA+IGZvciBCcE9sZE5hbWUgeworICBmbiBSZWFsTmFtZTwnYT4oJidhIHNlbGYpIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxTdHJpbmc+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF9SZWFsTmFtZSgpIHsKKyAgICAgIE9rKF9haWRsX2RhdGEpID0+IF9haWRsX2RhdGEsCisgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgfTsKKyAgICBsZXQgYmluZGVyID0gc2VsZi5iaW5kZXIuY2xvbmUoKTsKKyAgICBQOjpzcGF3bigKKyAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlYWxOYW1lLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpLAorICAgICAgbW92ZSB8X2FpZGxfcmVwbHl8IGFzeW5jIG1vdmUgeworICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmVhbE5hbWUoX2FpZGxfcmVwbHkpCisgICAgICB9CisgICAgKQorICB9Cit9CitpbXBsIElPbGROYW1lIGZvciBiaW5kZXI6OmJpbmRlcl9pbXBsOjpCaW5kZXI8Qm5PbGROYW1lPiB7CisgIGZuIFJlYWxOYW1lKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxTdHJpbmc+IHsgc2VsZi4wLlJlYWxOYW1lKCkgfQorfQorZm4gb25fdHJhbnNhY3QoX2FpZGxfc2VydmljZTogJmR5biBJT2xkTmFtZSwgX2FpZGxfY29kZTogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlLCBfYWlkbF9kYXRhOiAmYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWw8J18+LCBfYWlkbF9yZXBseTogJm11dCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbDwnXz4pIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4gewogICBtYXRjaCBfYWlkbF9jb2RlIHsKICAgICB0cmFuc2FjdGlvbnM6OlJlYWxOYW1lID0+IHsKICAgICAgIGxldCBfYWlkbF9yZXR1cm4gPSBfYWlkbF9zZXJ2aWNlLlJlYWxOYW1lKCk7CkBAIC02OSwzICsxMzEsNiBAQAogICAgIF8gPT4gRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikKICAgfQogfQorcHViKGNyYXRlKSBtb2QgbWFuZ2xlZCB7CisgcHViIHVzZSBzdXBlcjo6SU9sZE5hbWUgYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0lPbGROYW1lOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSVRlc3RTZXJ2aWNlLnJzIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSVRlc3RTZXJ2aWNlLnJzCmluZGV4IDJlMzRkYmEuLjM2YzAzZDQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lUZXN0U2VydmljZS5ycworKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JVGVzdFNlcnZpY2UucnMKQEAgLTEsNjggKzEsODYgQEAKKyMhW2ZvcmJpZCh1bnNhZmVfY29kZSldCisjIVtydXN0Zm10Ojpza2lwXQogIyFbYWxsb3cobm9uX3VwcGVyX2Nhc2VfZ2xvYmFscyldCiAjIVthbGxvdyhub25fc25ha2VfY2FzZSldCi0jW2FsbG93KHVudXNlZF9pbXBvcnRzKV0gdXNlIGJpbmRlcjo6SUJpbmRlckludGVybmFsOworI1thbGxvdyh1bnVzZWRfaW1wb3J0cyldIHVzZSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpJQmluZGVySW50ZXJuYWw7CiB1c2UgYmluZGVyOjpkZWNsYXJlX2JpbmRlcl9pbnRlcmZhY2U7CiBkZWNsYXJlX2JpbmRlcl9pbnRlcmZhY2UhIHsKICAgSVRlc3RTZXJ2aWNlWyJhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlIl0gewogICAgIG5hdGl2ZTogQm5UZXN0U2VydmljZShvbl90cmFuc2FjdCksCiAgICAgcHJveHk6IEJwVGVzdFNlcnZpY2UgewogICAgIH0sCisgICAgYXN5bmM6IElUZXN0U2VydmljZUFzeW5jLAogICB9CiB9CiBwdWIgdHJhaXQgSVRlc3RTZXJ2aWNlOiBiaW5kZXI6OkludGVyZmFjZSArIFNlbmQgewogICBmbiBnZXRfZGVzY3JpcHRvcigpIC0+ICYnc3RhdGljIHN0ciB3aGVyZSBTZWxmOiBTaXplZCB7ICJhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlIiB9Ci0gIGZuIFVuaW1wbGVtZW50ZWRNZXRob2QoJnNlbGYsIF9hcmdfYXJnOiBpMzIpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PGkzMj47CisgIGZuIFVuaW1wbGVtZW50ZWRNZXRob2QoJnNlbGYsIF9hcmdfYXJnOiBpMzIpIC0+IGJpbmRlcjo6UmVzdWx0PGkzMj47CiAgICNbZGVwcmVjYXRlZCA9ICJ0byBtYWtlIHN1cmUgd2UgaGF2ZSBzb21ldGhpbmcgaW4gc3lzdGVtL3Rvb2xzL2FpZGwgd2hpY2ggZG9lcyBhIGNvbXBpbGUgY2hlY2sgb2YgZGVwcmVjYXRlZCBhbmQgbWFrZSBzdXJlIHRoaXMgaXMgcmVmbGVjdGVkIGluIGdvbGRlbnMiXQotICBmbiBEZXByZWNhdGVkKCZzZWxmKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDwoKT47Ci0gIGZuIFRlc3RPbmV3YXkoJnNlbGYpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PCgpPjsKLSAgZm4gUmVwZWF0Qm9vbGVhbigmc2VsZiwgX2FyZ190b2tlbjogYm9vbCkgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8Ym9vbD47Ci0gIGZuIFJlcGVhdEJ5dGUoJnNlbGYsIF9hcmdfdG9rZW46IGk4KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxpOD47Ci0gIGZuIFJlcGVhdENoYXIoJnNlbGYsIF9hcmdfdG9rZW46IHUxNikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8dTE2PjsKLSAgZm4gUmVwZWF0SW50KCZzZWxmLCBfYXJnX3Rva2VuOiBpMzIpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PGkzMj47Ci0gIGZuIFJlcGVhdExvbmcoJnNlbGYsIF9hcmdfdG9rZW46IGk2NCkgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8aTY0PjsKLSAgZm4gUmVwZWF0RmxvYXQoJnNlbGYsIF9hcmdfdG9rZW46IGYzMikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8ZjMyPjsKLSAgZm4gUmVwZWF0RG91YmxlKCZzZWxmLCBfYXJnX3Rva2VuOiBmNjQpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PGY2ND47Ci0gIGZuIFJlcGVhdFN0cmluZygmc2VsZiwgX2FyZ190b2tlbjogJnN0cikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8U3RyaW5nPjsKLSAgZm4gUmVwZWF0Qnl0ZUVudW0oJnNlbGYsIF9hcmdfdG9rZW46IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW0pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW0+OwotICBmbiBSZXBlYXRJbnRFbnVtKCZzZWxmLCBfYXJnX3Rva2VuOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW0pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bT47Ci0gIGZuIFJlcGVhdExvbmdFbnVtKCZzZWxmLCBfYXJnX3Rva2VuOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtPjsKLSAgZm4gUmV2ZXJzZUJvb2xlYW4oJnNlbGYsIF9hcmdfaW5wdXQ6ICZbYm9vbF0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPGJvb2w+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxWZWM8Ym9vbD4+OwotICBmbiBSZXZlcnNlQnl0ZSgmc2VsZiwgX2FyZ19pbnB1dDogJlt1OF0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPHU4PikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8VmVjPHU4Pj47Ci0gIGZuIFJldmVyc2VDaGFyKCZzZWxmLCBfYXJnX2lucHV0OiAmW3UxNl0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPHUxNj4pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PFZlYzx1MTY+PjsKLSAgZm4gUmV2ZXJzZUludCgmc2VsZiwgX2FyZ19pbnB1dDogJltpMzJdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxpMzI+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxWZWM8aTMyPj47Ci0gIGZuIFJldmVyc2VMb25nKCZzZWxmLCBfYXJnX2lucHV0OiAmW2k2NF0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPGk2ND4pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PFZlYzxpNjQ+PjsKLSAgZm4gUmV2ZXJzZUZsb2F0KCZzZWxmLCBfYXJnX2lucHV0OiAmW2YzMl0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPGYzMj4pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PFZlYzxmMzI+PjsKLSAgZm4gUmV2ZXJzZURvdWJsZSgmc2VsZiwgX2FyZ19pbnB1dDogJltmNjRdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxmNjQ+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxWZWM8ZjY0Pj47Ci0gIGZuIFJldmVyc2VTdHJpbmcoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbU3RyaW5nXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8U3RyaW5nPikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8VmVjPFN0cmluZz4+OwotICBmbiBSZXZlcnNlQnl0ZUVudW0oJnNlbGYsIF9hcmdfaW5wdXQ6ICZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bV0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW0+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bT4+OwotICBmbiBSZXZlcnNlSW50RW51bSgmc2VsZiwgX2FyZ19pbnB1dDogJltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW1dLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW0+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtPj47Ci0gIGZuIFJldmVyc2VMb25nRW51bSgmc2VsZiwgX2FyZ19pbnB1dDogJltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bT4pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtPj47Ci0gIGZuIEdldE90aGVyVGVzdFNlcnZpY2UoJnNlbGYsIF9hcmdfbmFtZTogJnN0cikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPj47Ci0gIGZuIFZlcmlmeU5hbWUoJnNlbGYsIF9hcmdfc2VydmljZTogJmJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz4sIF9hcmdfbmFtZTogJnN0cikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8Ym9vbD47Ci0gIGZuIFJldmVyc2VTdHJpbmdMaXN0KCZzZWxmLCBfYXJnX2lucHV0OiAmW1N0cmluZ10sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPFN0cmluZz4pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PFZlYzxTdHJpbmc+PjsKLSAgZm4gUmVwZWF0UGFyY2VsRmlsZURlc2NyaXB0b3IoJnNlbGYsIF9hcmdfcmVhZDogJmJpbmRlcjo6cGFyY2VsOjpQYXJjZWxGaWxlRGVzY3JpcHRvcikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8YmluZGVyOjpwYXJjZWw6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPjsKLSAgZm4gUmV2ZXJzZVBhcmNlbEZpbGVEZXNjcmlwdG9yQXJyYXkoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbYmluZGVyOjpwYXJjZWw6OlBhcmNlbEZpbGVEZXNjcmlwdG9yXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8T3B0aW9uPGJpbmRlcjo6cGFyY2VsOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj4+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxWZWM8YmluZGVyOjpwYXJjZWw6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPj47Ci0gIGZuIFRocm93U2VydmljZUV4Y2VwdGlvbigmc2VsZiwgX2FyZ19jb2RlOiBpMzIpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PCgpPjsKLSAgZm4gUmVwZWF0TnVsbGFibGVJbnRBcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbaTMyXT4pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PE9wdGlvbjxWZWM8aTMyPj4+OwotICBmbiBSZXBlYXROdWxsYWJsZUJ5dGVFbnVtQXJyYXkoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW1dPikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8T3B0aW9uPFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtPj4+OwotICBmbiBSZXBlYXROdWxsYWJsZUludEVudW1BcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtXT4pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PE9wdGlvbjxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtPj4+OwotICBmbiBSZXBlYXROdWxsYWJsZUxvbmdFbnVtQXJyYXkoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW1dPikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8T3B0aW9uPFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtPj4+OwotICBmbiBSZXBlYXROdWxsYWJsZVN0cmluZygmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZzdHI+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxPcHRpb248U3RyaW5nPj47Ci0gIGZuIFJlcGVhdE51bGxhYmxlU3RyaW5nTGlzdCgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbT3B0aW9uPFN0cmluZz5dPikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+PjsKLSAgZm4gUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlKCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JmNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzIwX1N0cnVjdHVyZWRQYXJjZWxhYmxlPikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8T3B0aW9uPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzIwX1N0cnVjdHVyZWRQYXJjZWxhYmxlPj47Ci0gIGZuIFRha2VzQW5JQmluZGVyKCZzZWxmLCBfYXJnX2lucHV0OiAmYmluZGVyOjpTcElCaW5kZXIpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PCgpPjsKLSAgZm4gVGFrZXNBTnVsbGFibGVJQmluZGVyKCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JmJpbmRlcjo6U3BJQmluZGVyPikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8KCk+OwotICBmbiBSZXBlYXRVdGY4Q3BwU3RyaW5nKCZzZWxmLCBfYXJnX3Rva2VuOiAmc3RyKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxTdHJpbmc+OwotICBmbiBSZXBlYXROdWxsYWJsZVV0ZjhDcHBTdHJpbmcoJnNlbGYsIF9hcmdfdG9rZW46IE9wdGlvbjwmc3RyPikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8T3B0aW9uPFN0cmluZz4+OwotICBmbiBSZXZlcnNlVXRmOENwcFN0cmluZygmc2VsZiwgX2FyZ19pbnB1dDogJltTdHJpbmddLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxTdHJpbmc+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxWZWM8U3RyaW5nPj47Ci0gIGZuIFJldmVyc2VOdWxsYWJsZVV0ZjhDcHBTdHJpbmcoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxTdHJpbmc+XT4sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgT3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxTdHJpbmc+Pj4+OwotICBmbiBSZXZlcnNlVXRmOENwcFN0cmluZ0xpc3QoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxTdHJpbmc+XT4sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgT3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxTdHJpbmc+Pj4+OwotICBmbiBHZXRDYWxsYmFjaygmc2VsZiwgX2FyZ19yZXR1cm5fbnVsbDogYm9vbCkgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz4+PjsKLSAgZm4gRmlsbE91dFN0cnVjdHVyZWRQYXJjZWxhYmxlKCZzZWxmLCBfYXJnX3BhcmNlbDogJm11dCBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18yMF9TdHJ1Y3R1cmVkUGFyY2VsYWJsZSkgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8KCk+OwotICBmbiBHZXRPbGROYW1lSW50ZXJmYWNlKCZzZWxmKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9JT2xkTmFtZT4+OwotICBmbiBHZXROZXdOYW1lSW50ZXJmYWNlKCZzZWxmKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9JTmV3TmFtZT4+OwotICBmbiBHZXRDcHBKYXZhVGVzdHMoJnNlbGYpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PE9wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj4+OwotICBmbiBnZXRCYWNrZW5kVHlwZSgmc2VsZikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTFfQmFja2VuZFR5cGU+OworICBmbiBEZXByZWNhdGVkKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT47CisgIGZuIFRlc3RPbmV3YXkoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PCgpPjsKKyAgZm4gUmVwZWF0Qm9vbGVhbigmc2VsZiwgX2FyZ190b2tlbjogYm9vbCkgLT4gYmluZGVyOjpSZXN1bHQ8Ym9vbD47CisgIGZuIFJlcGVhdEJ5dGUoJnNlbGYsIF9hcmdfdG9rZW46IGk4KSAtPiBiaW5kZXI6OlJlc3VsdDxpOD47CisgIGZuIFJlcGVhdENoYXIoJnNlbGYsIF9hcmdfdG9rZW46IHUxNikgLT4gYmluZGVyOjpSZXN1bHQ8dTE2PjsKKyAgZm4gUmVwZWF0SW50KCZzZWxmLCBfYXJnX3Rva2VuOiBpMzIpIC0+IGJpbmRlcjo6UmVzdWx0PGkzMj47CisgIGZuIFJlcGVhdExvbmcoJnNlbGYsIF9hcmdfdG9rZW46IGk2NCkgLT4gYmluZGVyOjpSZXN1bHQ8aTY0PjsKKyAgZm4gUmVwZWF0RmxvYXQoJnNlbGYsIF9hcmdfdG9rZW46IGYzMikgLT4gYmluZGVyOjpSZXN1bHQ8ZjMyPjsKKyAgZm4gUmVwZWF0RG91YmxlKCZzZWxmLCBfYXJnX3Rva2VuOiBmNjQpIC0+IGJpbmRlcjo6UmVzdWx0PGY2ND47CisgIGZuIFJlcGVhdFN0cmluZygmc2VsZiwgX2FyZ190b2tlbjogJnN0cikgLT4gYmluZGVyOjpSZXN1bHQ8U3RyaW5nPjsKKyAgZm4gUmVwZWF0Qnl0ZUVudW0oJnNlbGYsIF9hcmdfdG9rZW46IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW0pIC0+IGJpbmRlcjo6UmVzdWx0PGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW0+OworICBmbiBSZXBlYXRJbnRFbnVtKCZzZWxmLCBfYXJnX3Rva2VuOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW0pIC0+IGJpbmRlcjo6UmVzdWx0PGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bT47CisgIGZuIFJlcGVhdExvbmdFbnVtKCZzZWxmLCBfYXJnX3Rva2VuOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtKSAtPiBiaW5kZXI6OlJlc3VsdDxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtPjsKKyAgZm4gUmV2ZXJzZUJvb2xlYW4oJnNlbGYsIF9hcmdfaW5wdXQ6ICZbYm9vbF0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPGJvb2w+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8Ym9vbD4+OworICBmbiBSZXZlcnNlQnl0ZSgmc2VsZiwgX2FyZ19pbnB1dDogJlt1OF0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPHU4PikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPHU4Pj47CisgIGZuIFJldmVyc2VDaGFyKCZzZWxmLCBfYXJnX2lucHV0OiAmW3UxNl0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPHUxNj4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzx1MTY+PjsKKyAgZm4gUmV2ZXJzZUludCgmc2VsZiwgX2FyZ19pbnB1dDogJltpMzJdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxpMzI+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8aTMyPj47CisgIGZuIFJldmVyc2VMb25nKCZzZWxmLCBfYXJnX2lucHV0OiAmW2k2NF0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPGk2ND4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxpNjQ+PjsKKyAgZm4gUmV2ZXJzZUZsb2F0KCZzZWxmLCBfYXJnX2lucHV0OiAmW2YzMl0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPGYzMj4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxmMzI+PjsKKyAgZm4gUmV2ZXJzZURvdWJsZSgmc2VsZiwgX2FyZ19pbnB1dDogJltmNjRdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxmNjQ+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8ZjY0Pj47CisgIGZuIFJldmVyc2VTdHJpbmcoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbU3RyaW5nXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8U3RyaW5nPikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPFN0cmluZz4+OworICBmbiBSZXZlcnNlQnl0ZUVudW0oJnNlbGYsIF9hcmdfaW5wdXQ6ICZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bV0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW0+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bT4+OworICBmbiBSZXZlcnNlSW50RW51bSgmc2VsZiwgX2FyZ19pbnB1dDogJltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW1dLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW0+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtPj47CisgIGZuIFJldmVyc2VMb25nRW51bSgmc2VsZiwgX2FyZ19pbnB1dDogJltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bT4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtPj47CisgIGZuIEdldE90aGVyVGVzdFNlcnZpY2UoJnNlbGYsIF9hcmdfbmFtZTogJnN0cikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPj47CisgIGZuIFZlcmlmeU5hbWUoJnNlbGYsIF9hcmdfc2VydmljZTogJmJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz4sIF9hcmdfbmFtZTogJnN0cikgLT4gYmluZGVyOjpSZXN1bHQ8Ym9vbD47CisgIGZuIEdldEludGVyZmFjZUFycmF5KCZzZWxmLCBfYXJnX25hbWVzOiAmW1N0cmluZ10pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+Pj47CisgIGZuIFZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUFycmF5KCZzZWxmLCBfYXJnX3NlcnZpY2VzOiAmW2JpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz5dLCBfYXJnX25hbWVzOiAmW1N0cmluZ10pIC0+IGJpbmRlcjo6UmVzdWx0PGJvb2w+OworICBmbiBHZXROdWxsYWJsZUludGVyZmFjZUFycmF5KCZzZWxmLCBfYXJnX25hbWVzOiBPcHRpb248JltPcHRpb248U3RyaW5nPl0+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+Pj4+PjsKKyAgZm4gVmVyaWZ5TmFtZXNXaXRoTnVsbGFibGVJbnRlcmZhY2VBcnJheSgmc2VsZiwgX2FyZ19zZXJ2aWNlczogT3B0aW9uPCZbT3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz4+XT4sIF9hcmdfbmFtZXM6IE9wdGlvbjwmW09wdGlvbjxTdHJpbmc+XT4pIC0+IGJpbmRlcjo6UmVzdWx0PGJvb2w+OworICBmbiBHZXRJbnRlcmZhY2VMaXN0KCZzZWxmLCBfYXJnX25hbWVzOiBPcHRpb248JltPcHRpb248U3RyaW5nPl0+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+Pj4+PjsKKyAgZm4gVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlTGlzdCgmc2VsZiwgX2FyZ19zZXJ2aWNlczogT3B0aW9uPCZbT3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz4+XT4sIF9hcmdfbmFtZXM6IE9wdGlvbjwmW09wdGlvbjxTdHJpbmc+XT4pIC0+IGJpbmRlcjo6UmVzdWx0PGJvb2w+OworICBmbiBSZXZlcnNlU3RyaW5nTGlzdCgmc2VsZiwgX2FyZ19pbnB1dDogJltTdHJpbmddLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxTdHJpbmc+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8U3RyaW5nPj47CisgIGZuIFJlcGVhdFBhcmNlbEZpbGVEZXNjcmlwdG9yKCZzZWxmLCBfYXJnX3JlYWQ6ICZiaW5kZXI6OlBhcmNlbEZpbGVEZXNjcmlwdG9yKSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPjsKKyAgZm4gUmV2ZXJzZVBhcmNlbEZpbGVEZXNjcmlwdG9yQXJyYXkoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbYmluZGVyOjpQYXJjZWxGaWxlRGVzY3JpcHRvcl0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPE9wdGlvbjxiaW5kZXI6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPj4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxiaW5kZXI6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPj47CisgIGZuIFRocm93U2VydmljZUV4Y2VwdGlvbigmc2VsZiwgX2FyZ19jb2RlOiBpMzIpIC0+IGJpbmRlcjo6UmVzdWx0PCgpPjsKKyAgZm4gUmVwZWF0TnVsbGFibGVJbnRBcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbaTMyXT4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8aTMyPj4+OworICBmbiBSZXBlYXROdWxsYWJsZUJ5dGVFbnVtQXJyYXkoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW1dPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtPj4+OworICBmbiBSZXBlYXROdWxsYWJsZUludEVudW1BcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtXT4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtPj4+OworICBmbiBSZXBlYXROdWxsYWJsZUxvbmdFbnVtQXJyYXkoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW1dPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtPj4+OworICBmbiBSZXBlYXROdWxsYWJsZVN0cmluZygmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZzdHI+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248U3RyaW5nPj47CisgIGZuIFJlcGVhdE51bGxhYmxlU3RyaW5nTGlzdCgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbT3B0aW9uPFN0cmluZz5dPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+PjsKKyAgZm4gUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlKCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JmNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZV81X0VtcHR5PikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZV81X0VtcHR5Pj47CisgIGZuIFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUFycmF5KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltPcHRpb248Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTJfSVRlc3RTZXJ2aWNlXzVfRW1wdHk+XT4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZV81X0VtcHR5Pj4+PjsKKyAgZm4gUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlTGlzdCgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbT3B0aW9uPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZV81X0VtcHR5Pl0+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMl9JVGVzdFNlcnZpY2VfNV9FbXB0eT4+Pj47CisgIGZuIFRha2VzQW5JQmluZGVyKCZzZWxmLCBfYXJnX2lucHV0OiAmYmluZGVyOjpTcElCaW5kZXIpIC0+IGJpbmRlcjo6UmVzdWx0PCgpPjsKKyAgZm4gVGFrZXNBTnVsbGFibGVJQmluZGVyKCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JmJpbmRlcjo6U3BJQmluZGVyPikgLT4gYmluZGVyOjpSZXN1bHQ8KCk+OworICBmbiBUYWtlc0FuSUJpbmRlckxpc3QoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbYmluZGVyOjpTcElCaW5kZXJdKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT47CisgIGZuIFRha2VzQU51bGxhYmxlSUJpbmRlckxpc3QoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj5dPikgLT4gYmluZGVyOjpSZXN1bHQ8KCk+OworICBmbiBSZXBlYXRVdGY4Q3BwU3RyaW5nKCZzZWxmLCBfYXJnX3Rva2VuOiAmc3RyKSAtPiBiaW5kZXI6OlJlc3VsdDxTdHJpbmc+OworICBmbiBSZXBlYXROdWxsYWJsZVV0ZjhDcHBTdHJpbmcoJnNlbGYsIF9hcmdfdG9rZW46IE9wdGlvbjwmc3RyPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFN0cmluZz4+OworICBmbiBSZXZlcnNlVXRmOENwcFN0cmluZygmc2VsZiwgX2FyZ19pbnB1dDogJltTdHJpbmddLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxTdHJpbmc+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8U3RyaW5nPj47CisgIGZuIFJldmVyc2VOdWxsYWJsZVV0ZjhDcHBTdHJpbmcoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxTdHJpbmc+XT4sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgT3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxTdHJpbmc+Pj4+OworICBmbiBSZXZlcnNlVXRmOENwcFN0cmluZ0xpc3QoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxTdHJpbmc+XT4sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgT3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxTdHJpbmc+Pj4+OworICBmbiBHZXRDYWxsYmFjaygmc2VsZiwgX2FyZ19yZXR1cm5fbnVsbDogYm9vbCkgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz4+PjsKKyAgZm4gRmlsbE91dFN0cnVjdHVyZWRQYXJjZWxhYmxlKCZzZWxmLCBfYXJnX3BhcmNlbDogJm11dCBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18yMF9TdHJ1Y3R1cmVkUGFyY2VsYWJsZSkgLT4gYmluZGVyOjpSZXN1bHQ8KCk+OworICBmbiBSZXBlYXRFeHRlbmRhYmxlUGFyY2VsYWJsZSgmc2VsZiwgX2FyZ19lcDogJmNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzlfZXh0ZW5zaW9uXzIwX0V4dGVuZGFibGVQYXJjZWxhYmxlLCBfYXJnX2VwMjogJm11dCBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c185X2V4dGVuc2lvbl8yMF9FeHRlbmRhYmxlUGFyY2VsYWJsZSkgLT4gYmluZGVyOjpSZXN1bHQ8KCk+OworICBmbiBSZXZlcnNlTGlzdCgmc2VsZiwgX2FyZ19saXN0OiAmY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTNfUmVjdXJzaXZlTGlzdCkgLT4gYmluZGVyOjpSZXN1bHQ8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTNfUmVjdXJzaXZlTGlzdD47CisgIGZuIFJldmVyc2VJQmluZGVyQXJyYXkoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbYmluZGVyOjpTcElCaW5kZXJdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxPcHRpb248YmluZGVyOjpTcElCaW5kZXI+PikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPGJpbmRlcjo6U3BJQmluZGVyPj47CisgIGZuIFJldmVyc2VOdWxsYWJsZUlCaW5kZXJBcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbT3B0aW9uPGJpbmRlcjo6U3BJQmluZGVyPl0+LCBfYXJnX3JlcGVhdGVkOiAmbXV0IE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3BJQmluZGVyPj4+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj4+Pj47CisgIGZuIEdldE9sZE5hbWVJbnRlcmZhY2UoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0lPbGROYW1lPj47CisgIGZuIEdldE5ld05hbWVJbnRlcmZhY2UoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0lOZXdOYW1lPj47CisgIGZuIEdldFVuaW9uVGFncygmc2VsZiwgX2FyZ19pbnB1dDogJltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c181X1VuaW9uXSkgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzVfVW5pb25fM19UYWc+PjsKKyAgZm4gR2V0Q3BwSmF2YVRlc3RzKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248YmluZGVyOjpTcElCaW5kZXI+PjsKKyAgZm4gZ2V0QmFja2VuZFR5cGUoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzExX0JhY2tlbmRUeXBlPjsKICAgZm4gZ2V0RGVmYXVsdEltcGwoKSAtPiBJVGVzdFNlcnZpY2VEZWZhdWx0UmVmIHdoZXJlIFNlbGY6IFNpemVkIHsKICAgICBERUZBVUxUX0lNUEwubG9jaygpLnVud3JhcCgpLmNsb25lKCkKICAgfQpAQCAtNzAsMjEzICs4OCw2MzcgQEAKICAgICBzdGQ6Om1lbTo6cmVwbGFjZSgmbXV0ICpERUZBVUxUX0lNUEwubG9jaygpLnVud3JhcCgpLCBkKQogICB9CiB9CitwdWIgdHJhaXQgSVRlc3RTZXJ2aWNlQXN5bmM8UD46IGJpbmRlcjo6SW50ZXJmYWNlICsgU2VuZCB7CisgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHdoZXJlIFNlbGY6IFNpemVkIHsgImFuZHJvaWQuYWlkbC50ZXN0cy5JVGVzdFNlcnZpY2UiIH0KKyAgZm4gVW5pbXBsZW1lbnRlZE1ldGhvZDwnYT4oJidhIHNlbGYsIF9hcmdfYXJnOiBpMzIpIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxpMzI+PjsKKyAgI1tkZXByZWNhdGVkID0gInRvIG1ha2Ugc3VyZSB3ZSBoYXZlIHNvbWV0aGluZyBpbiBzeXN0ZW0vdG9vbHMvYWlkbCB3aGljaCBkb2VzIGEgY29tcGlsZSBjaGVjayBvZiBkZXByZWNhdGVkIGFuZCBtYWtlIHN1cmUgdGhpcyBpcyByZWZsZWN0ZWQgaW4gZ29sZGVucyJdCisgIGZuIERlcHJlY2F0ZWQ8J2E+KCYnYSBzZWxmKSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8KCk+PjsKKyAgZm4gVGVzdE9uZXdheSgmc2VsZikgLT4gc3RkOjpmdXR1cmU6OlJlYWR5PGJpbmRlcjo6UmVzdWx0PCgpPj47CisgIGZuIFJlcGVhdEJvb2xlYW48J2E+KCYnYSBzZWxmLCBfYXJnX3Rva2VuOiBib29sKSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8Ym9vbD4+OworICBmbiBSZXBlYXRCeXRlPCdhPigmJ2Egc2VsZiwgX2FyZ190b2tlbjogaTgpIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxpOD4+OworICBmbiBSZXBlYXRDaGFyPCdhPigmJ2Egc2VsZiwgX2FyZ190b2tlbjogdTE2KSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8dTE2Pj47CisgIGZuIFJlcGVhdEludDwnYT4oJidhIHNlbGYsIF9hcmdfdG9rZW46IGkzMikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PGkzMj4+OworICBmbiBSZXBlYXRMb25nPCdhPigmJ2Egc2VsZiwgX2FyZ190b2tlbjogaTY0KSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8aTY0Pj47CisgIGZuIFJlcGVhdEZsb2F0PCdhPigmJ2Egc2VsZiwgX2FyZ190b2tlbjogZjMyKSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8ZjMyPj47CisgIGZuIFJlcGVhdERvdWJsZTwnYT4oJidhIHNlbGYsIF9hcmdfdG9rZW46IGY2NCkgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PGY2ND4+OworICBmbiBSZXBlYXRTdHJpbmc8J2E+KCYnYSBzZWxmLCBfYXJnX3Rva2VuOiAmJ2Egc3RyKSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8U3RyaW5nPj47CisgIGZuIFJlcGVhdEJ5dGVFbnVtPCdhPigmJ2Egc2VsZiwgX2FyZ190b2tlbjogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bSkgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW0+PjsKKyAgZm4gUmVwZWF0SW50RW51bTwnYT4oJidhIHNlbGYsIF9hcmdfdG9rZW46IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bSkgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bT4+OworICBmbiBSZXBlYXRMb25nRW51bTwnYT4oJidhIHNlbGYsIF9hcmdfdG9rZW46IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW0pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtPj47CisgIGZuIFJldmVyc2VCb29sZWFuPCdhPigmJ2Egc2VsZiwgX2FyZ19pbnB1dDogJidhIFtib29sXSwgX2FyZ19yZXBlYXRlZDogJidhIG11dCBWZWM8Ym9vbD4pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxWZWM8Ym9vbD4+PjsKKyAgZm4gUmV2ZXJzZUJ5dGU8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiAmJ2EgW3U4XSwgX2FyZ19yZXBlYXRlZDogJidhIG11dCBWZWM8dTg+KSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8VmVjPHU4Pj4+OworICBmbiBSZXZlcnNlQ2hhcjwnYT4oJidhIHNlbGYsIF9hcmdfaW5wdXQ6ICYnYSBbdTE2XSwgX2FyZ19yZXBlYXRlZDogJidhIG11dCBWZWM8dTE2PikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PFZlYzx1MTY+Pj47CisgIGZuIFJldmVyc2VJbnQ8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiAmJ2EgW2kzMl0sIF9hcmdfcmVwZWF0ZWQ6ICYnYSBtdXQgVmVjPGkzMj4pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxWZWM8aTMyPj4+OworICBmbiBSZXZlcnNlTG9uZzwnYT4oJidhIHNlbGYsIF9hcmdfaW5wdXQ6ICYnYSBbaTY0XSwgX2FyZ19yZXBlYXRlZDogJidhIG11dCBWZWM8aTY0PikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PFZlYzxpNjQ+Pj47CisgIGZuIFJldmVyc2VGbG9hdDwnYT4oJidhIHNlbGYsIF9hcmdfaW5wdXQ6ICYnYSBbZjMyXSwgX2FyZ19yZXBlYXRlZDogJidhIG11dCBWZWM8ZjMyPikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PFZlYzxmMzI+Pj47CisgIGZuIFJldmVyc2VEb3VibGU8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiAmJ2EgW2Y2NF0sIF9hcmdfcmVwZWF0ZWQ6ICYnYSBtdXQgVmVjPGY2ND4pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxWZWM8ZjY0Pj4+OworICBmbiBSZXZlcnNlU3RyaW5nPCdhPigmJ2Egc2VsZiwgX2FyZ19pbnB1dDogJidhIFtTdHJpbmddLCBfYXJnX3JlcGVhdGVkOiAmJ2EgbXV0IFZlYzxTdHJpbmc+KSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8VmVjPFN0cmluZz4+PjsKKyAgZm4gUmV2ZXJzZUJ5dGVFbnVtPCdhPigmJ2Egc2VsZiwgX2FyZ19pbnB1dDogJidhIFtjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtXSwgX2FyZ19yZXBlYXRlZDogJidhIG11dCBWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bT4pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bT4+PjsKKyAgZm4gUmV2ZXJzZUludEVudW08J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiAmJ2EgW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bV0sIF9hcmdfcmVwZWF0ZWQ6ICYnYSBtdXQgVmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bT4pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtPj4+OworICBmbiBSZXZlcnNlTG9uZ0VudW08J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiAmJ2EgW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW1dLCBfYXJnX3JlcGVhdGVkOiAmJ2EgbXV0IFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtPikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtPj4+OworICBmbiBHZXRPdGhlclRlc3RTZXJ2aWNlPCdhPigmJ2Egc2VsZiwgX2FyZ19uYW1lOiAmJ2Egc3RyKSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPj4+OworICBmbiBWZXJpZnlOYW1lPCdhPigmJ2Egc2VsZiwgX2FyZ19zZXJ2aWNlOiAmJ2EgYmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPiwgX2FyZ19uYW1lOiAmJ2Egc3RyKSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8Ym9vbD4+OworICBmbiBHZXRJbnRlcmZhY2VBcnJheTwnYT4oJidhIHNlbGYsIF9hcmdfbmFtZXM6ICYnYSBbU3RyaW5nXSkgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PFZlYzxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+Pj4+OworICBmbiBWZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VBcnJheTwnYT4oJidhIHNlbGYsIF9hcmdfc2VydmljZXM6ICYnYSBbYmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPl0sIF9hcmdfbmFtZXM6ICYnYSBbU3RyaW5nXSkgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PGJvb2w+PjsKKyAgZm4gR2V0TnVsbGFibGVJbnRlcmZhY2VBcnJheTwnYT4oJidhIHNlbGYsIF9hcmdfbmFtZXM6IE9wdGlvbjwmJ2EgW09wdGlvbjxTdHJpbmc+XT4pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+Pj4+Pj47CisgIGZuIFZlcmlmeU5hbWVzV2l0aE51bGxhYmxlSW50ZXJmYWNlQXJyYXk8J2E+KCYnYSBzZWxmLCBfYXJnX3NlcnZpY2VzOiBPcHRpb248JidhIFtPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPj5dPiwgX2FyZ19uYW1lczogT3B0aW9uPCYnYSBbT3B0aW9uPFN0cmluZz5dPikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PGJvb2w+PjsKKyAgZm4gR2V0SW50ZXJmYWNlTGlzdDwnYT4oJidhIHNlbGYsIF9hcmdfbmFtZXM6IE9wdGlvbjwmJ2EgW09wdGlvbjxTdHJpbmc+XT4pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+Pj4+Pj47CisgIGZuIFZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUxpc3Q8J2E+KCYnYSBzZWxmLCBfYXJnX3NlcnZpY2VzOiBPcHRpb248JidhIFtPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPj5dPiwgX2FyZ19uYW1lczogT3B0aW9uPCYnYSBbT3B0aW9uPFN0cmluZz5dPikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PGJvb2w+PjsKKyAgZm4gUmV2ZXJzZVN0cmluZ0xpc3Q8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiAmJ2EgW1N0cmluZ10sIF9hcmdfcmVwZWF0ZWQ6ICYnYSBtdXQgVmVjPFN0cmluZz4pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxWZWM8U3RyaW5nPj4+OworICBmbiBSZXBlYXRQYXJjZWxGaWxlRGVzY3JpcHRvcjwnYT4oJidhIHNlbGYsIF9hcmdfcmVhZDogJidhIGJpbmRlcjo6UGFyY2VsRmlsZURlc2NyaXB0b3IpIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPj47CisgIGZuIFJldmVyc2VQYXJjZWxGaWxlRGVzY3JpcHRvckFycmF5PCdhPigmJ2Egc2VsZiwgX2FyZ19pbnB1dDogJidhIFtiaW5kZXI6OlBhcmNlbEZpbGVEZXNjcmlwdG9yXSwgX2FyZ19yZXBlYXRlZDogJidhIG11dCBWZWM8T3B0aW9uPGJpbmRlcjo6UGFyY2VsRmlsZURlc2NyaXB0b3I+PikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PFZlYzxiaW5kZXI6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPj4+OworICBmbiBUaHJvd1NlcnZpY2VFeGNlcHRpb248J2E+KCYnYSBzZWxmLCBfYXJnX2NvZGU6IGkzMikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PCgpPj47CisgIGZuIFJlcGVhdE51bGxhYmxlSW50QXJyYXk8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JidhIFtpMzJdPikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8aTMyPj4+PjsKKyAgZm4gUmVwZWF0TnVsbGFibGVCeXRlRW51bUFycmF5PCdhPigmJ2Egc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCYnYSBbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bV0+KSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtPj4+PjsKKyAgZm4gUmVwZWF0TnVsbGFibGVJbnRFbnVtQXJyYXk8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JidhIFtjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW1dPikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtPj4+PjsKKyAgZm4gUmVwZWF0TnVsbGFibGVMb25nRW51bUFycmF5PCdhPigmJ2Egc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCYnYSBbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bV0+KSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtPj4+PjsKKyAgZm4gUmVwZWF0TnVsbGFibGVTdHJpbmc8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JidhIHN0cj4pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxPcHRpb248U3RyaW5nPj4+OworICBmbiBSZXBlYXROdWxsYWJsZVN0cmluZ0xpc3Q8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JidhIFtPcHRpb248U3RyaW5nPl0+KSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+Pj47CisgIGZuIFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZTwnYT4oJidhIHNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmJ2EgY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTJfSVRlc3RTZXJ2aWNlXzVfRW1wdHk+KSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8T3B0aW9uPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZV81X0VtcHR5Pj4+OworICBmbiBSZXBlYXROdWxsYWJsZVBhcmNlbGFibGVBcnJheTwnYT4oJidhIHNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmJ2EgW09wdGlvbjxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMl9JVGVzdFNlcnZpY2VfNV9FbXB0eT5dPikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZV81X0VtcHR5Pj4+Pj47CisgIGZuIFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUxpc3Q8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JidhIFtPcHRpb248Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTJfSVRlc3RTZXJ2aWNlXzVfRW1wdHk+XT4pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMl9JVGVzdFNlcnZpY2VfNV9FbXB0eT4+Pj4+OworICBmbiBUYWtlc0FuSUJpbmRlcjwnYT4oJidhIHNlbGYsIF9hcmdfaW5wdXQ6ICYnYSBiaW5kZXI6OlNwSUJpbmRlcikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PCgpPj47CisgIGZuIFRha2VzQU51bGxhYmxlSUJpbmRlcjwnYT4oJidhIHNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmJ2EgYmluZGVyOjpTcElCaW5kZXI+KSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8KCk+PjsKKyAgZm4gVGFrZXNBbklCaW5kZXJMaXN0PCdhPigmJ2Egc2VsZiwgX2FyZ19pbnB1dDogJidhIFtiaW5kZXI6OlNwSUJpbmRlcl0pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDwoKT4+OworICBmbiBUYWtlc0FOdWxsYWJsZUlCaW5kZXJMaXN0PCdhPigmJ2Egc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCYnYSBbT3B0aW9uPGJpbmRlcjo6U3BJQmluZGVyPl0+KSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8KCk+PjsKKyAgZm4gUmVwZWF0VXRmOENwcFN0cmluZzwnYT4oJidhIHNlbGYsIF9hcmdfdG9rZW46ICYnYSBzdHIpIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxTdHJpbmc+PjsKKyAgZm4gUmVwZWF0TnVsbGFibGVVdGY4Q3BwU3RyaW5nPCdhPigmJ2Egc2VsZiwgX2FyZ190b2tlbjogT3B0aW9uPCYnYSBzdHI+KSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFN0cmluZz4+PjsKKyAgZm4gUmV2ZXJzZVV0ZjhDcHBTdHJpbmc8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiAmJ2EgW1N0cmluZ10sIF9hcmdfcmVwZWF0ZWQ6ICYnYSBtdXQgVmVjPFN0cmluZz4pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxWZWM8U3RyaW5nPj4+OworICBmbiBSZXZlcnNlTnVsbGFibGVVdGY4Q3BwU3RyaW5nPCdhPigmJ2Egc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCYnYSBbT3B0aW9uPFN0cmluZz5dPiwgX2FyZ19yZXBlYXRlZDogJidhIG11dCBPcHRpb248VmVjPE9wdGlvbjxTdHJpbmc+Pj4pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxTdHJpbmc+Pj4+PjsKKyAgZm4gUmV2ZXJzZVV0ZjhDcHBTdHJpbmdMaXN0PCdhPigmJ2Egc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCYnYSBbT3B0aW9uPFN0cmluZz5dPiwgX2FyZ19yZXBlYXRlZDogJidhIG11dCBPcHRpb248VmVjPE9wdGlvbjxTdHJpbmc+Pj4pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxTdHJpbmc+Pj4+PjsKKyAgZm4gR2V0Q2FsbGJhY2s8J2E+KCYnYSBzZWxmLCBfYXJnX3JldHVybl9udWxsOiBib29sKSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz4+Pj47CisgIGZuIEZpbGxPdXRTdHJ1Y3R1cmVkUGFyY2VsYWJsZTwnYT4oJidhIHNlbGYsIF9hcmdfcGFyY2VsOiAmJ2EgbXV0IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzIwX1N0cnVjdHVyZWRQYXJjZWxhYmxlKSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8KCk+PjsKKyAgZm4gUmVwZWF0RXh0ZW5kYWJsZVBhcmNlbGFibGU8J2E+KCYnYSBzZWxmLCBfYXJnX2VwOiAmJ2EgY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOV9leHRlbnNpb25fMjBfRXh0ZW5kYWJsZVBhcmNlbGFibGUsIF9hcmdfZXAyOiAmJ2EgbXV0IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzlfZXh0ZW5zaW9uXzIwX0V4dGVuZGFibGVQYXJjZWxhYmxlKSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8KCk+PjsKKyAgZm4gUmV2ZXJzZUxpc3Q8J2E+KCYnYSBzZWxmLCBfYXJnX2xpc3Q6ICYnYSBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xM19SZWN1cnNpdmVMaXN0KSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTNfUmVjdXJzaXZlTGlzdD4+OworICBmbiBSZXZlcnNlSUJpbmRlckFycmF5PCdhPigmJ2Egc2VsZiwgX2FyZ19pbnB1dDogJidhIFtiaW5kZXI6OlNwSUJpbmRlcl0sIF9hcmdfcmVwZWF0ZWQ6ICYnYSBtdXQgVmVjPE9wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj4+KSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8VmVjPGJpbmRlcjo6U3BJQmluZGVyPj4+OworICBmbiBSZXZlcnNlTnVsbGFibGVJQmluZGVyQXJyYXk8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JidhIFtPcHRpb248YmluZGVyOjpTcElCaW5kZXI+XT4sIF9hcmdfcmVwZWF0ZWQ6ICYnYSBtdXQgT3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTcElCaW5kZXI+Pj4pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj4+Pj4+OworICBmbiBHZXRPbGROYW1lSW50ZXJmYWNlPCdhPigmJ2Egc2VsZikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0lPbGROYW1lPj4+OworICBmbiBHZXROZXdOYW1lSW50ZXJmYWNlPCdhPigmJ2Egc2VsZikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0lOZXdOYW1lPj4+OworICBmbiBHZXRVbmlvblRhZ3M8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiAmJ2EgW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzVfVW5pb25dKSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8VmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzVfVW5pb25fM19UYWc+Pj47CisgIGZuIEdldENwcEphdmFUZXN0czwnYT4oJidhIHNlbGYpIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxPcHRpb248YmluZGVyOjpTcElCaW5kZXI+Pj47CisgIGZuIGdldEJhY2tlbmRUeXBlPCdhPigmJ2Egc2VsZikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzExX0JhY2tlbmRUeXBlPj47Cit9CisjWzo6YXN5bmNfdHJhaXQ6OmFzeW5jX3RyYWl0XQorcHViIHRyYWl0IElUZXN0U2VydmljZUFzeW5jU2VydmVyOiBiaW5kZXI6OkludGVyZmFjZSArIFNlbmQgeworICBmbiBnZXRfZGVzY3JpcHRvcigpIC0+ICYnc3RhdGljIHN0ciB3aGVyZSBTZWxmOiBTaXplZCB7ICJhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlIiB9CisgIGFzeW5jIGZuIFVuaW1wbGVtZW50ZWRNZXRob2QoJnNlbGYsIF9hcmdfYXJnOiBpMzIpIC0+IGJpbmRlcjo6UmVzdWx0PGkzMj47CisgICNbZGVwcmVjYXRlZCA9ICJ0byBtYWtlIHN1cmUgd2UgaGF2ZSBzb21ldGhpbmcgaW4gc3lzdGVtL3Rvb2xzL2FpZGwgd2hpY2ggZG9lcyBhIGNvbXBpbGUgY2hlY2sgb2YgZGVwcmVjYXRlZCBhbmQgbWFrZSBzdXJlIHRoaXMgaXMgcmVmbGVjdGVkIGluIGdvbGRlbnMiXQorICBhc3luYyBmbiBEZXByZWNhdGVkKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT47CisgIGFzeW5jIGZuIFRlc3RPbmV3YXkoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PCgpPjsKKyAgYXN5bmMgZm4gUmVwZWF0Qm9vbGVhbigmc2VsZiwgX2FyZ190b2tlbjogYm9vbCkgLT4gYmluZGVyOjpSZXN1bHQ8Ym9vbD47CisgIGFzeW5jIGZuIFJlcGVhdEJ5dGUoJnNlbGYsIF9hcmdfdG9rZW46IGk4KSAtPiBiaW5kZXI6OlJlc3VsdDxpOD47CisgIGFzeW5jIGZuIFJlcGVhdENoYXIoJnNlbGYsIF9hcmdfdG9rZW46IHUxNikgLT4gYmluZGVyOjpSZXN1bHQ8dTE2PjsKKyAgYXN5bmMgZm4gUmVwZWF0SW50KCZzZWxmLCBfYXJnX3Rva2VuOiBpMzIpIC0+IGJpbmRlcjo6UmVzdWx0PGkzMj47CisgIGFzeW5jIGZuIFJlcGVhdExvbmcoJnNlbGYsIF9hcmdfdG9rZW46IGk2NCkgLT4gYmluZGVyOjpSZXN1bHQ8aTY0PjsKKyAgYXN5bmMgZm4gUmVwZWF0RmxvYXQoJnNlbGYsIF9hcmdfdG9rZW46IGYzMikgLT4gYmluZGVyOjpSZXN1bHQ8ZjMyPjsKKyAgYXN5bmMgZm4gUmVwZWF0RG91YmxlKCZzZWxmLCBfYXJnX3Rva2VuOiBmNjQpIC0+IGJpbmRlcjo6UmVzdWx0PGY2ND47CisgIGFzeW5jIGZuIFJlcGVhdFN0cmluZygmc2VsZiwgX2FyZ190b2tlbjogJnN0cikgLT4gYmluZGVyOjpSZXN1bHQ8U3RyaW5nPjsKKyAgYXN5bmMgZm4gUmVwZWF0Qnl0ZUVudW0oJnNlbGYsIF9hcmdfdG9rZW46IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW0pIC0+IGJpbmRlcjo6UmVzdWx0PGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW0+OworICBhc3luYyBmbiBSZXBlYXRJbnRFbnVtKCZzZWxmLCBfYXJnX3Rva2VuOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW0pIC0+IGJpbmRlcjo6UmVzdWx0PGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bT47CisgIGFzeW5jIGZuIFJlcGVhdExvbmdFbnVtKCZzZWxmLCBfYXJnX3Rva2VuOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtKSAtPiBiaW5kZXI6OlJlc3VsdDxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtPjsKKyAgYXN5bmMgZm4gUmV2ZXJzZUJvb2xlYW4oJnNlbGYsIF9hcmdfaW5wdXQ6ICZbYm9vbF0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPGJvb2w+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8Ym9vbD4+OworICBhc3luYyBmbiBSZXZlcnNlQnl0ZSgmc2VsZiwgX2FyZ19pbnB1dDogJlt1OF0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPHU4PikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPHU4Pj47CisgIGFzeW5jIGZuIFJldmVyc2VDaGFyKCZzZWxmLCBfYXJnX2lucHV0OiAmW3UxNl0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPHUxNj4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzx1MTY+PjsKKyAgYXN5bmMgZm4gUmV2ZXJzZUludCgmc2VsZiwgX2FyZ19pbnB1dDogJltpMzJdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxpMzI+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8aTMyPj47CisgIGFzeW5jIGZuIFJldmVyc2VMb25nKCZzZWxmLCBfYXJnX2lucHV0OiAmW2k2NF0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPGk2ND4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxpNjQ+PjsKKyAgYXN5bmMgZm4gUmV2ZXJzZUZsb2F0KCZzZWxmLCBfYXJnX2lucHV0OiAmW2YzMl0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPGYzMj4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxmMzI+PjsKKyAgYXN5bmMgZm4gUmV2ZXJzZURvdWJsZSgmc2VsZiwgX2FyZ19pbnB1dDogJltmNjRdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxmNjQ+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8ZjY0Pj47CisgIGFzeW5jIGZuIFJldmVyc2VTdHJpbmcoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbU3RyaW5nXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8U3RyaW5nPikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPFN0cmluZz4+OworICBhc3luYyBmbiBSZXZlcnNlQnl0ZUVudW0oJnNlbGYsIF9hcmdfaW5wdXQ6ICZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bV0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW0+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bT4+OworICBhc3luYyBmbiBSZXZlcnNlSW50RW51bSgmc2VsZiwgX2FyZ19pbnB1dDogJltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW1dLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW0+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtPj47CisgIGFzeW5jIGZuIFJldmVyc2VMb25nRW51bSgmc2VsZiwgX2FyZ19pbnB1dDogJltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bT4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtPj47CisgIGFzeW5jIGZuIEdldE90aGVyVGVzdFNlcnZpY2UoJnNlbGYsIF9hcmdfbmFtZTogJnN0cikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPj47CisgIGFzeW5jIGZuIFZlcmlmeU5hbWUoJnNlbGYsIF9hcmdfc2VydmljZTogJmJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz4sIF9hcmdfbmFtZTogJnN0cikgLT4gYmluZGVyOjpSZXN1bHQ8Ym9vbD47CisgIGFzeW5jIGZuIEdldEludGVyZmFjZUFycmF5KCZzZWxmLCBfYXJnX25hbWVzOiAmW1N0cmluZ10pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+Pj47CisgIGFzeW5jIGZuIFZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUFycmF5KCZzZWxmLCBfYXJnX3NlcnZpY2VzOiAmW2JpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz5dLCBfYXJnX25hbWVzOiAmW1N0cmluZ10pIC0+IGJpbmRlcjo6UmVzdWx0PGJvb2w+OworICBhc3luYyBmbiBHZXROdWxsYWJsZUludGVyZmFjZUFycmF5KCZzZWxmLCBfYXJnX25hbWVzOiBPcHRpb248JltPcHRpb248U3RyaW5nPl0+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+Pj4+PjsKKyAgYXN5bmMgZm4gVmVyaWZ5TmFtZXNXaXRoTnVsbGFibGVJbnRlcmZhY2VBcnJheSgmc2VsZiwgX2FyZ19zZXJ2aWNlczogT3B0aW9uPCZbT3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz4+XT4sIF9hcmdfbmFtZXM6IE9wdGlvbjwmW09wdGlvbjxTdHJpbmc+XT4pIC0+IGJpbmRlcjo6UmVzdWx0PGJvb2w+OworICBhc3luYyBmbiBHZXRJbnRlcmZhY2VMaXN0KCZzZWxmLCBfYXJnX25hbWVzOiBPcHRpb248JltPcHRpb248U3RyaW5nPl0+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+Pj4+PjsKKyAgYXN5bmMgZm4gVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlTGlzdCgmc2VsZiwgX2FyZ19zZXJ2aWNlczogT3B0aW9uPCZbT3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz4+XT4sIF9hcmdfbmFtZXM6IE9wdGlvbjwmW09wdGlvbjxTdHJpbmc+XT4pIC0+IGJpbmRlcjo6UmVzdWx0PGJvb2w+OworICBhc3luYyBmbiBSZXZlcnNlU3RyaW5nTGlzdCgmc2VsZiwgX2FyZ19pbnB1dDogJltTdHJpbmddLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxTdHJpbmc+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8U3RyaW5nPj47CisgIGFzeW5jIGZuIFJlcGVhdFBhcmNlbEZpbGVEZXNjcmlwdG9yKCZzZWxmLCBfYXJnX3JlYWQ6ICZiaW5kZXI6OlBhcmNlbEZpbGVEZXNjcmlwdG9yKSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPjsKKyAgYXN5bmMgZm4gUmV2ZXJzZVBhcmNlbEZpbGVEZXNjcmlwdG9yQXJyYXkoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbYmluZGVyOjpQYXJjZWxGaWxlRGVzY3JpcHRvcl0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPE9wdGlvbjxiaW5kZXI6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPj4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxiaW5kZXI6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPj47CisgIGFzeW5jIGZuIFRocm93U2VydmljZUV4Y2VwdGlvbigmc2VsZiwgX2FyZ19jb2RlOiBpMzIpIC0+IGJpbmRlcjo6UmVzdWx0PCgpPjsKKyAgYXN5bmMgZm4gUmVwZWF0TnVsbGFibGVJbnRBcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbaTMyXT4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8aTMyPj4+OworICBhc3luYyBmbiBSZXBlYXROdWxsYWJsZUJ5dGVFbnVtQXJyYXkoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW1dPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtPj4+OworICBhc3luYyBmbiBSZXBlYXROdWxsYWJsZUludEVudW1BcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtXT4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtPj4+OworICBhc3luYyBmbiBSZXBlYXROdWxsYWJsZUxvbmdFbnVtQXJyYXkoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW1dPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtPj4+OworICBhc3luYyBmbiBSZXBlYXROdWxsYWJsZVN0cmluZygmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZzdHI+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248U3RyaW5nPj47CisgIGFzeW5jIGZuIFJlcGVhdE51bGxhYmxlU3RyaW5nTGlzdCgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbT3B0aW9uPFN0cmluZz5dPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+PjsKKyAgYXN5bmMgZm4gUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlKCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JmNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZV81X0VtcHR5PikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZV81X0VtcHR5Pj47CisgIGFzeW5jIGZuIFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUFycmF5KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltPcHRpb248Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTJfSVRlc3RTZXJ2aWNlXzVfRW1wdHk+XT4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZV81X0VtcHR5Pj4+PjsKKyAgYXN5bmMgZm4gUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlTGlzdCgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbT3B0aW9uPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZV81X0VtcHR5Pl0+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMl9JVGVzdFNlcnZpY2VfNV9FbXB0eT4+Pj47CisgIGFzeW5jIGZuIFRha2VzQW5JQmluZGVyKCZzZWxmLCBfYXJnX2lucHV0OiAmYmluZGVyOjpTcElCaW5kZXIpIC0+IGJpbmRlcjo6UmVzdWx0PCgpPjsKKyAgYXN5bmMgZm4gVGFrZXNBTnVsbGFibGVJQmluZGVyKCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JmJpbmRlcjo6U3BJQmluZGVyPikgLT4gYmluZGVyOjpSZXN1bHQ8KCk+OworICBhc3luYyBmbiBUYWtlc0FuSUJpbmRlckxpc3QoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbYmluZGVyOjpTcElCaW5kZXJdKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT47CisgIGFzeW5jIGZuIFRha2VzQU51bGxhYmxlSUJpbmRlckxpc3QoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj5dPikgLT4gYmluZGVyOjpSZXN1bHQ8KCk+OworICBhc3luYyBmbiBSZXBlYXRVdGY4Q3BwU3RyaW5nKCZzZWxmLCBfYXJnX3Rva2VuOiAmc3RyKSAtPiBiaW5kZXI6OlJlc3VsdDxTdHJpbmc+OworICBhc3luYyBmbiBSZXBlYXROdWxsYWJsZVV0ZjhDcHBTdHJpbmcoJnNlbGYsIF9hcmdfdG9rZW46IE9wdGlvbjwmc3RyPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFN0cmluZz4+OworICBhc3luYyBmbiBSZXZlcnNlVXRmOENwcFN0cmluZygmc2VsZiwgX2FyZ19pbnB1dDogJltTdHJpbmddLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxTdHJpbmc+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8U3RyaW5nPj47CisgIGFzeW5jIGZuIFJldmVyc2VOdWxsYWJsZVV0ZjhDcHBTdHJpbmcoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxTdHJpbmc+XT4sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgT3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxTdHJpbmc+Pj4+OworICBhc3luYyBmbiBSZXZlcnNlVXRmOENwcFN0cmluZ0xpc3QoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxTdHJpbmc+XT4sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgT3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxTdHJpbmc+Pj4+OworICBhc3luYyBmbiBHZXRDYWxsYmFjaygmc2VsZiwgX2FyZ19yZXR1cm5fbnVsbDogYm9vbCkgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz4+PjsKKyAgYXN5bmMgZm4gRmlsbE91dFN0cnVjdHVyZWRQYXJjZWxhYmxlKCZzZWxmLCBfYXJnX3BhcmNlbDogJm11dCBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18yMF9TdHJ1Y3R1cmVkUGFyY2VsYWJsZSkgLT4gYmluZGVyOjpSZXN1bHQ8KCk+OworICBhc3luYyBmbiBSZXBlYXRFeHRlbmRhYmxlUGFyY2VsYWJsZSgmc2VsZiwgX2FyZ19lcDogJmNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzlfZXh0ZW5zaW9uXzIwX0V4dGVuZGFibGVQYXJjZWxhYmxlLCBfYXJnX2VwMjogJm11dCBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c185X2V4dGVuc2lvbl8yMF9FeHRlbmRhYmxlUGFyY2VsYWJsZSkgLT4gYmluZGVyOjpSZXN1bHQ8KCk+OworICBhc3luYyBmbiBSZXZlcnNlTGlzdCgmc2VsZiwgX2FyZ19saXN0OiAmY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTNfUmVjdXJzaXZlTGlzdCkgLT4gYmluZGVyOjpSZXN1bHQ8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTNfUmVjdXJzaXZlTGlzdD47CisgIGFzeW5jIGZuIFJldmVyc2VJQmluZGVyQXJyYXkoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbYmluZGVyOjpTcElCaW5kZXJdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxPcHRpb248YmluZGVyOjpTcElCaW5kZXI+PikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPGJpbmRlcjo6U3BJQmluZGVyPj47CisgIGFzeW5jIGZuIFJldmVyc2VOdWxsYWJsZUlCaW5kZXJBcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbT3B0aW9uPGJpbmRlcjo6U3BJQmluZGVyPl0+LCBfYXJnX3JlcGVhdGVkOiAmbXV0IE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3BJQmluZGVyPj4+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj4+Pj47CisgIGFzeW5jIGZuIEdldE9sZE5hbWVJbnRlcmZhY2UoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0lPbGROYW1lPj47CisgIGFzeW5jIGZuIEdldE5ld05hbWVJbnRlcmZhY2UoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0lOZXdOYW1lPj47CisgIGFzeW5jIGZuIEdldFVuaW9uVGFncygmc2VsZiwgX2FyZ19pbnB1dDogJltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c181X1VuaW9uXSkgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzVfVW5pb25fM19UYWc+PjsKKyAgYXN5bmMgZm4gR2V0Q3BwSmF2YVRlc3RzKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248YmluZGVyOjpTcElCaW5kZXI+PjsKKyAgYXN5bmMgZm4gZ2V0QmFja2VuZFR5cGUoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzExX0JhY2tlbmRUeXBlPjsKK30KK2ltcGwgQm5UZXN0U2VydmljZSB7CisgIC8vLyBDcmVhdGUgYSBuZXcgYXN5bmMgYmluZGVyIHNlcnZpY2UuCisgIHB1YiBmbiBuZXdfYXN5bmNfYmluZGVyPFQsIFI+KGlubmVyOiBULCBydDogUiwgZmVhdHVyZXM6IGJpbmRlcjo6QmluZGVyRmVhdHVyZXMpIC0+IGJpbmRlcjo6U3Ryb25nPGR5biBJVGVzdFNlcnZpY2U+CisgIHdoZXJlCisgICAgVDogSVRlc3RTZXJ2aWNlQXN5bmNTZXJ2ZXIgKyBiaW5kZXI6OkludGVyZmFjZSArIFNlbmQgKyBTeW5jICsgJ3N0YXRpYywKKyAgICBSOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpCaW5kZXJBc3luY1J1bnRpbWUgKyBTZW5kICsgU3luYyArICdzdGF0aWMsCisgIHsKKyAgICBzdHJ1Y3QgV3JhcHBlcjxULCBSPiB7CisgICAgICBfaW5uZXI6IFQsCisgICAgICBfcnQ6IFIsCisgICAgfQorICAgIGltcGw8VCwgUj4gYmluZGVyOjpJbnRlcmZhY2UgZm9yIFdyYXBwZXI8VCwgUj4gd2hlcmUgVDogYmluZGVyOjpJbnRlcmZhY2UsIFI6IFNlbmQgKyBTeW5jIHsKKyAgICAgIGZuIGFzX2JpbmRlcigmc2VsZikgLT4gYmluZGVyOjpTcElCaW5kZXIgeyBzZWxmLl9pbm5lci5hc19iaW5kZXIoKSB9CisgICAgICBmbiBkdW1wKCZzZWxmLCBfZmlsZTogJnN0ZDo6ZnM6OkZpbGUsIF9hcmdzOiAmWyZzdGQ6OmZmaTo6Q1N0cl0pIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4geyBzZWxmLl9pbm5lci5kdW1wKF9maWxlLCBfYXJncykgfQorICAgIH0KKyAgICBpbXBsPFQsIFI+IElUZXN0U2VydmljZSBmb3IgV3JhcHBlcjxULCBSPgorICAgIHdoZXJlCisgICAgICBUOiBJVGVzdFNlcnZpY2VBc3luY1NlcnZlciArIFNlbmQgKyBTeW5jICsgJ3N0YXRpYywKKyAgICAgIFI6IGJpbmRlcjo6YmluZGVyX2ltcGw6OkJpbmRlckFzeW5jUnVudGltZSArIFNlbmQgKyBTeW5jICsgJ3N0YXRpYywKKyAgICB7CisgICAgICBmbiBVbmltcGxlbWVudGVkTWV0aG9kKCZzZWxmLCBfYXJnX2FyZzogaTMyKSAtPiBiaW5kZXI6OlJlc3VsdDxpMzI+IHsKKyAgICAgICAgc2VsZi5fcnQuYmxvY2tfb24oc2VsZi5faW5uZXIuVW5pbXBsZW1lbnRlZE1ldGhvZChfYXJnX2FyZykpCisgICAgICB9CisgICAgICBmbiBEZXByZWNhdGVkKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLl9ydC5ibG9ja19vbihzZWxmLl9pbm5lci5EZXByZWNhdGVkKCkpCisgICAgICB9CisgICAgICBmbiBUZXN0T25ld2F5KCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLl9ydC5ibG9ja19vbihzZWxmLl9pbm5lci5UZXN0T25ld2F5KCkpCisgICAgICB9CisgICAgICBmbiBSZXBlYXRCb29sZWFuKCZzZWxmLCBfYXJnX3Rva2VuOiBib29sKSAtPiBiaW5kZXI6OlJlc3VsdDxib29sPiB7CisgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLlJlcGVhdEJvb2xlYW4oX2FyZ190b2tlbikpCisgICAgICB9CisgICAgICBmbiBSZXBlYXRCeXRlKCZzZWxmLCBfYXJnX3Rva2VuOiBpOCkgLT4gYmluZGVyOjpSZXN1bHQ8aTg+IHsKKyAgICAgICAgc2VsZi5fcnQuYmxvY2tfb24oc2VsZi5faW5uZXIuUmVwZWF0Qnl0ZShfYXJnX3Rva2VuKSkKKyAgICAgIH0KKyAgICAgIGZuIFJlcGVhdENoYXIoJnNlbGYsIF9hcmdfdG9rZW46IHUxNikgLT4gYmluZGVyOjpSZXN1bHQ8dTE2PiB7CisgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLlJlcGVhdENoYXIoX2FyZ190b2tlbikpCisgICAgICB9CisgICAgICBmbiBSZXBlYXRJbnQoJnNlbGYsIF9hcmdfdG9rZW46IGkzMikgLT4gYmluZGVyOjpSZXN1bHQ8aTMyPiB7CisgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLlJlcGVhdEludChfYXJnX3Rva2VuKSkKKyAgICAgIH0KKyAgICAgIGZuIFJlcGVhdExvbmcoJnNlbGYsIF9hcmdfdG9rZW46IGk2NCkgLT4gYmluZGVyOjpSZXN1bHQ8aTY0PiB7CisgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLlJlcGVhdExvbmcoX2FyZ190b2tlbikpCisgICAgICB9CisgICAgICBmbiBSZXBlYXRGbG9hdCgmc2VsZiwgX2FyZ190b2tlbjogZjMyKSAtPiBiaW5kZXI6OlJlc3VsdDxmMzI+IHsKKyAgICAgICAgc2VsZi5fcnQuYmxvY2tfb24oc2VsZi5faW5uZXIuUmVwZWF0RmxvYXQoX2FyZ190b2tlbikpCisgICAgICB9CisgICAgICBmbiBSZXBlYXREb3VibGUoJnNlbGYsIF9hcmdfdG9rZW46IGY2NCkgLT4gYmluZGVyOjpSZXN1bHQ8ZjY0PiB7CisgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLlJlcGVhdERvdWJsZShfYXJnX3Rva2VuKSkKKyAgICAgIH0KKyAgICAgIGZuIFJlcGVhdFN0cmluZygmc2VsZiwgX2FyZ190b2tlbjogJnN0cikgLT4gYmluZGVyOjpSZXN1bHQ8U3RyaW5nPiB7CisgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLlJlcGVhdFN0cmluZyhfYXJnX3Rva2VuKSkKKyAgICAgIH0KKyAgICAgIGZuIFJlcGVhdEJ5dGVFbnVtKCZzZWxmLCBfYXJnX3Rva2VuOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtKSAtPiBiaW5kZXI6OlJlc3VsdDxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtPiB7CisgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLlJlcGVhdEJ5dGVFbnVtKF9hcmdfdG9rZW4pKQorICAgICAgfQorICAgICAgZm4gUmVwZWF0SW50RW51bSgmc2VsZiwgX2FyZ190b2tlbjogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtKSAtPiBiaW5kZXI6OlJlc3VsdDxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW0+IHsKKyAgICAgICAgc2VsZi5fcnQuYmxvY2tfb24oc2VsZi5faW5uZXIuUmVwZWF0SW50RW51bShfYXJnX3Rva2VuKSkKKyAgICAgIH0KKyAgICAgIGZuIFJlcGVhdExvbmdFbnVtKCZzZWxmLCBfYXJnX3Rva2VuOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtKSAtPiBiaW5kZXI6OlJlc3VsdDxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtPiB7CisgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLlJlcGVhdExvbmdFbnVtKF9hcmdfdG9rZW4pKQorICAgICAgfQorICAgICAgZm4gUmV2ZXJzZUJvb2xlYW4oJnNlbGYsIF9hcmdfaW5wdXQ6ICZbYm9vbF0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPGJvb2w+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8Ym9vbD4+IHsKKyAgICAgICAgc2VsZi5fcnQuYmxvY2tfb24oc2VsZi5faW5uZXIuUmV2ZXJzZUJvb2xlYW4oX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCkpCisgICAgICB9CisgICAgICBmbiBSZXZlcnNlQnl0ZSgmc2VsZiwgX2FyZ19pbnB1dDogJlt1OF0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPHU4PikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPHU4Pj4geworICAgICAgICBzZWxmLl9ydC5ibG9ja19vbihzZWxmLl9pbm5lci5SZXZlcnNlQnl0ZShfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSkKKyAgICAgIH0KKyAgICAgIGZuIFJldmVyc2VDaGFyKCZzZWxmLCBfYXJnX2lucHV0OiAmW3UxNl0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPHUxNj4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzx1MTY+PiB7CisgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLlJldmVyc2VDaGFyKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpKQorICAgICAgfQorICAgICAgZm4gUmV2ZXJzZUludCgmc2VsZiwgX2FyZ19pbnB1dDogJltpMzJdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxpMzI+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8aTMyPj4geworICAgICAgICBzZWxmLl9ydC5ibG9ja19vbihzZWxmLl9pbm5lci5SZXZlcnNlSW50KF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpKQorICAgICAgfQorICAgICAgZm4gUmV2ZXJzZUxvbmcoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbaTY0XSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8aTY0PikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPGk2ND4+IHsKKyAgICAgICAgc2VsZi5fcnQuYmxvY2tfb24oc2VsZi5faW5uZXIuUmV2ZXJzZUxvbmcoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCkpCisgICAgICB9CisgICAgICBmbiBSZXZlcnNlRmxvYXQoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbZjMyXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8ZjMyPikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPGYzMj4+IHsKKyAgICAgICAgc2VsZi5fcnQuYmxvY2tfb24oc2VsZi5faW5uZXIuUmV2ZXJzZUZsb2F0KF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpKQorICAgICAgfQorICAgICAgZm4gUmV2ZXJzZURvdWJsZSgmc2VsZiwgX2FyZ19pbnB1dDogJltmNjRdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxmNjQ+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8ZjY0Pj4geworICAgICAgICBzZWxmLl9ydC5ibG9ja19vbihzZWxmLl9pbm5lci5SZXZlcnNlRG91YmxlKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpKQorICAgICAgfQorICAgICAgZm4gUmV2ZXJzZVN0cmluZygmc2VsZiwgX2FyZ19pbnB1dDogJltTdHJpbmddLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxTdHJpbmc+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8U3RyaW5nPj4geworICAgICAgICBzZWxmLl9ydC5ibG9ja19vbihzZWxmLl9pbm5lci5SZXZlcnNlU3RyaW5nKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpKQorICAgICAgfQorICAgICAgZm4gUmV2ZXJzZUJ5dGVFbnVtKCZzZWxmLCBfYXJnX2lucHV0OiAmW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW1dLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtPikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW0+PiB7CisgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLlJldmVyc2VCeXRlRW51bShfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSkKKyAgICAgIH0KKyAgICAgIGZuIFJldmVyc2VJbnRFbnVtKCZzZWxmLCBfYXJnX2lucHV0OiAmW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bV0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bT4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW0+PiB7CisgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLlJldmVyc2VJbnRFbnVtKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpKQorICAgICAgfQorICAgICAgZm4gUmV2ZXJzZUxvbmdFbnVtKCZzZWxmLCBfYXJnX2lucHV0OiAmW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW1dLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtPikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW0+PiB7CisgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLlJldmVyc2VMb25nRW51bShfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSkKKyAgICAgIH0KKyAgICAgIGZuIEdldE90aGVyVGVzdFNlcnZpY2UoJnNlbGYsIF9hcmdfbmFtZTogJnN0cikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPj4geworICAgICAgICBzZWxmLl9ydC5ibG9ja19vbihzZWxmLl9pbm5lci5HZXRPdGhlclRlc3RTZXJ2aWNlKF9hcmdfbmFtZSkpCisgICAgICB9CisgICAgICBmbiBWZXJpZnlOYW1lKCZzZWxmLCBfYXJnX3NlcnZpY2U6ICZiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+LCBfYXJnX25hbWU6ICZzdHIpIC0+IGJpbmRlcjo6UmVzdWx0PGJvb2w+IHsKKyAgICAgICAgc2VsZi5fcnQuYmxvY2tfb24oc2VsZi5faW5uZXIuVmVyaWZ5TmFtZShfYXJnX3NlcnZpY2UsIF9hcmdfbmFtZSkpCisgICAgICB9CisgICAgICBmbiBHZXRJbnRlcmZhY2VBcnJheSgmc2VsZiwgX2FyZ19uYW1lczogJltTdHJpbmddKSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPj4+IHsKKyAgICAgICAgc2VsZi5fcnQuYmxvY2tfb24oc2VsZi5faW5uZXIuR2V0SW50ZXJmYWNlQXJyYXkoX2FyZ19uYW1lcykpCisgICAgICB9CisgICAgICBmbiBWZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VBcnJheSgmc2VsZiwgX2FyZ19zZXJ2aWNlczogJltiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+XSwgX2FyZ19uYW1lczogJltTdHJpbmddKSAtPiBiaW5kZXI6OlJlc3VsdDxib29sPiB7CisgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLlZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUFycmF5KF9hcmdfc2VydmljZXMsIF9hcmdfbmFtZXMpKQorICAgICAgfQorICAgICAgZm4gR2V0TnVsbGFibGVJbnRlcmZhY2VBcnJheSgmc2VsZiwgX2FyZ19uYW1lczogT3B0aW9uPCZbT3B0aW9uPFN0cmluZz5dPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPj4+Pj4geworICAgICAgICBzZWxmLl9ydC5ibG9ja19vbihzZWxmLl9pbm5lci5HZXROdWxsYWJsZUludGVyZmFjZUFycmF5KF9hcmdfbmFtZXMpKQorICAgICAgfQorICAgICAgZm4gVmVyaWZ5TmFtZXNXaXRoTnVsbGFibGVJbnRlcmZhY2VBcnJheSgmc2VsZiwgX2FyZ19zZXJ2aWNlczogT3B0aW9uPCZbT3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz4+XT4sIF9hcmdfbmFtZXM6IE9wdGlvbjwmW09wdGlvbjxTdHJpbmc+XT4pIC0+IGJpbmRlcjo6UmVzdWx0PGJvb2w+IHsKKyAgICAgICAgc2VsZi5fcnQuYmxvY2tfb24oc2VsZi5faW5uZXIuVmVyaWZ5TmFtZXNXaXRoTnVsbGFibGVJbnRlcmZhY2VBcnJheShfYXJnX3NlcnZpY2VzLCBfYXJnX25hbWVzKSkKKyAgICAgIH0KKyAgICAgIGZuIEdldEludGVyZmFjZUxpc3QoJnNlbGYsIF9hcmdfbmFtZXM6IE9wdGlvbjwmW09wdGlvbjxTdHJpbmc+XT4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz4+Pj4+IHsKKyAgICAgICAgc2VsZi5fcnQuYmxvY2tfb24oc2VsZi5faW5uZXIuR2V0SW50ZXJmYWNlTGlzdChfYXJnX25hbWVzKSkKKyAgICAgIH0KKyAgICAgIGZuIFZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUxpc3QoJnNlbGYsIF9hcmdfc2VydmljZXM6IE9wdGlvbjwmW09wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+Pl0+LCBfYXJnX25hbWVzOiBPcHRpb248JltPcHRpb248U3RyaW5nPl0+KSAtPiBiaW5kZXI6OlJlc3VsdDxib29sPiB7CisgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLlZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUxpc3QoX2FyZ19zZXJ2aWNlcywgX2FyZ19uYW1lcykpCisgICAgICB9CisgICAgICBmbiBSZXZlcnNlU3RyaW5nTGlzdCgmc2VsZiwgX2FyZ19pbnB1dDogJltTdHJpbmddLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxTdHJpbmc+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8U3RyaW5nPj4geworICAgICAgICBzZWxmLl9ydC5ibG9ja19vbihzZWxmLl9pbm5lci5SZXZlcnNlU3RyaW5nTGlzdChfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSkKKyAgICAgIH0KKyAgICAgIGZuIFJlcGVhdFBhcmNlbEZpbGVEZXNjcmlwdG9yKCZzZWxmLCBfYXJnX3JlYWQ6ICZiaW5kZXI6OlBhcmNlbEZpbGVEZXNjcmlwdG9yKSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPiB7CisgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLlJlcGVhdFBhcmNlbEZpbGVEZXNjcmlwdG9yKF9hcmdfcmVhZCkpCisgICAgICB9CisgICAgICBmbiBSZXZlcnNlUGFyY2VsRmlsZURlc2NyaXB0b3JBcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogJltiaW5kZXI6OlBhcmNlbEZpbGVEZXNjcmlwdG9yXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8T3B0aW9uPGJpbmRlcjo6UGFyY2VsRmlsZURlc2NyaXB0b3I+PikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPGJpbmRlcjo6UGFyY2VsRmlsZURlc2NyaXB0b3I+PiB7CisgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLlJldmVyc2VQYXJjZWxGaWxlRGVzY3JpcHRvckFycmF5KF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpKQorICAgICAgfQorICAgICAgZm4gVGhyb3dTZXJ2aWNlRXhjZXB0aW9uKCZzZWxmLCBfYXJnX2NvZGU6IGkzMikgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5fcnQuYmxvY2tfb24oc2VsZi5faW5uZXIuVGhyb3dTZXJ2aWNlRXhjZXB0aW9uKF9hcmdfY29kZSkpCisgICAgICB9CisgICAgICBmbiBSZXBlYXROdWxsYWJsZUludEFycmF5KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltpMzJdPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxpMzI+Pj4geworICAgICAgICBzZWxmLl9ydC5ibG9ja19vbihzZWxmLl9pbm5lci5SZXBlYXROdWxsYWJsZUludEFycmF5KF9hcmdfaW5wdXQpKQorICAgICAgfQorICAgICAgZm4gUmVwZWF0TnVsbGFibGVCeXRlRW51bUFycmF5KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtXT4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bT4+PiB7CisgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLlJlcGVhdE51bGxhYmxlQnl0ZUVudW1BcnJheShfYXJnX2lucHV0KSkKKyAgICAgIH0KKyAgICAgIGZuIFJlcGVhdE51bGxhYmxlSW50RW51bUFycmF5KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW1dPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW0+Pj4geworICAgICAgICBzZWxmLl9ydC5ibG9ja19vbihzZWxmLl9pbm5lci5SZXBlYXROdWxsYWJsZUludEVudW1BcnJheShfYXJnX2lucHV0KSkKKyAgICAgIH0KKyAgICAgIGZuIFJlcGVhdE51bGxhYmxlTG9uZ0VudW1BcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bV0+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW0+Pj4geworICAgICAgICBzZWxmLl9ydC5ibG9ja19vbihzZWxmLl9pbm5lci5SZXBlYXROdWxsYWJsZUxvbmdFbnVtQXJyYXkoX2FyZ19pbnB1dCkpCisgICAgICB9CisgICAgICBmbiBSZXBlYXROdWxsYWJsZVN0cmluZygmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZzdHI+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248U3RyaW5nPj4geworICAgICAgICBzZWxmLl9ydC5ibG9ja19vbihzZWxmLl9pbm5lci5SZXBlYXROdWxsYWJsZVN0cmluZyhfYXJnX2lucHV0KSkKKyAgICAgIH0KKyAgICAgIGZuIFJlcGVhdE51bGxhYmxlU3RyaW5nTGlzdCgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbT3B0aW9uPFN0cmluZz5dPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+PiB7CisgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLlJlcGVhdE51bGxhYmxlU3RyaW5nTGlzdChfYXJnX2lucHV0KSkKKyAgICAgIH0KKyAgICAgIGZuIFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMl9JVGVzdFNlcnZpY2VfNV9FbXB0eT4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMl9JVGVzdFNlcnZpY2VfNV9FbXB0eT4+IHsKKyAgICAgICAgc2VsZi5fcnQuYmxvY2tfb24oc2VsZi5faW5uZXIuUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlKF9hcmdfaW5wdXQpKQorICAgICAgfQorICAgICAgZm4gUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlQXJyYXkoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMl9JVGVzdFNlcnZpY2VfNV9FbXB0eT5dPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTJfSVRlc3RTZXJ2aWNlXzVfRW1wdHk+Pj4+IHsKKyAgICAgICAgc2VsZi5fcnQuYmxvY2tfb24oc2VsZi5faW5uZXIuUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlQXJyYXkoX2FyZ19pbnB1dCkpCisgICAgICB9CisgICAgICBmbiBSZXBlYXROdWxsYWJsZVBhcmNlbGFibGVMaXN0KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltPcHRpb248Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTJfSVRlc3RTZXJ2aWNlXzVfRW1wdHk+XT4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZV81X0VtcHR5Pj4+PiB7CisgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLlJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUxpc3QoX2FyZ19pbnB1dCkpCisgICAgICB9CisgICAgICBmbiBUYWtlc0FuSUJpbmRlcigmc2VsZiwgX2FyZ19pbnB1dDogJmJpbmRlcjo6U3BJQmluZGVyKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLl9ydC5ibG9ja19vbihzZWxmLl9pbm5lci5UYWtlc0FuSUJpbmRlcihfYXJnX2lucHV0KSkKKyAgICAgIH0KKyAgICAgIGZuIFRha2VzQU51bGxhYmxlSUJpbmRlcigmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZiaW5kZXI6OlNwSUJpbmRlcj4pIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLlRha2VzQU51bGxhYmxlSUJpbmRlcihfYXJnX2lucHV0KSkKKyAgICAgIH0KKyAgICAgIGZuIFRha2VzQW5JQmluZGVyTGlzdCgmc2VsZiwgX2FyZ19pbnB1dDogJltiaW5kZXI6OlNwSUJpbmRlcl0pIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLlRha2VzQW5JQmluZGVyTGlzdChfYXJnX2lucHV0KSkKKyAgICAgIH0KKyAgICAgIGZuIFRha2VzQU51bGxhYmxlSUJpbmRlckxpc3QoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj5dPikgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5fcnQuYmxvY2tfb24oc2VsZi5faW5uZXIuVGFrZXNBTnVsbGFibGVJQmluZGVyTGlzdChfYXJnX2lucHV0KSkKKyAgICAgIH0KKyAgICAgIGZuIFJlcGVhdFV0ZjhDcHBTdHJpbmcoJnNlbGYsIF9hcmdfdG9rZW46ICZzdHIpIC0+IGJpbmRlcjo6UmVzdWx0PFN0cmluZz4geworICAgICAgICBzZWxmLl9ydC5ibG9ja19vbihzZWxmLl9pbm5lci5SZXBlYXRVdGY4Q3BwU3RyaW5nKF9hcmdfdG9rZW4pKQorICAgICAgfQorICAgICAgZm4gUmVwZWF0TnVsbGFibGVVdGY4Q3BwU3RyaW5nKCZzZWxmLCBfYXJnX3Rva2VuOiBPcHRpb248JnN0cj4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxTdHJpbmc+PiB7CisgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLlJlcGVhdE51bGxhYmxlVXRmOENwcFN0cmluZyhfYXJnX3Rva2VuKSkKKyAgICAgIH0KKyAgICAgIGZuIFJldmVyc2VVdGY4Q3BwU3RyaW5nKCZzZWxmLCBfYXJnX2lucHV0OiAmW1N0cmluZ10sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPFN0cmluZz4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxTdHJpbmc+PiB7CisgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLlJldmVyc2VVdGY4Q3BwU3RyaW5nKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpKQorICAgICAgfQorICAgICAgZm4gUmV2ZXJzZU51bGxhYmxlVXRmOENwcFN0cmluZygmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbT3B0aW9uPFN0cmluZz5dPiwgX2FyZ19yZXBlYXRlZDogJm11dCBPcHRpb248VmVjPE9wdGlvbjxTdHJpbmc+Pj4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPFN0cmluZz4+Pj4geworICAgICAgICBzZWxmLl9ydC5ibG9ja19vbihzZWxmLl9pbm5lci5SZXZlcnNlTnVsbGFibGVVdGY4Q3BwU3RyaW5nKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpKQorICAgICAgfQorICAgICAgZm4gUmV2ZXJzZVV0ZjhDcHBTdHJpbmdMaXN0KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltPcHRpb248U3RyaW5nPl0+LCBfYXJnX3JlcGVhdGVkOiAmbXV0IE9wdGlvbjxWZWM8T3B0aW9uPFN0cmluZz4+PikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+PiB7CisgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLlJldmVyc2VVdGY4Q3BwU3RyaW5nTGlzdChfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSkKKyAgICAgIH0KKyAgICAgIGZuIEdldENhbGxiYWNrKCZzZWxmLCBfYXJnX3JldHVybl9udWxsOiBib29sKSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPj4+IHsKKyAgICAgICAgc2VsZi5fcnQuYmxvY2tfb24oc2VsZi5faW5uZXIuR2V0Q2FsbGJhY2soX2FyZ19yZXR1cm5fbnVsbCkpCisgICAgICB9CisgICAgICBmbiBGaWxsT3V0U3RydWN0dXJlZFBhcmNlbGFibGUoJnNlbGYsIF9hcmdfcGFyY2VsOiAmbXV0IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzIwX1N0cnVjdHVyZWRQYXJjZWxhYmxlKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLl9ydC5ibG9ja19vbihzZWxmLl9pbm5lci5GaWxsT3V0U3RydWN0dXJlZFBhcmNlbGFibGUoX2FyZ19wYXJjZWwpKQorICAgICAgfQorICAgICAgZm4gUmVwZWF0RXh0ZW5kYWJsZVBhcmNlbGFibGUoJnNlbGYsIF9hcmdfZXA6ICZjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c185X2V4dGVuc2lvbl8yMF9FeHRlbmRhYmxlUGFyY2VsYWJsZSwgX2FyZ19lcDI6ICZtdXQgY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOV9leHRlbnNpb25fMjBfRXh0ZW5kYWJsZVBhcmNlbGFibGUpIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLlJlcGVhdEV4dGVuZGFibGVQYXJjZWxhYmxlKF9hcmdfZXAsIF9hcmdfZXAyKSkKKyAgICAgIH0KKyAgICAgIGZuIFJldmVyc2VMaXN0KCZzZWxmLCBfYXJnX2xpc3Q6ICZjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xM19SZWN1cnNpdmVMaXN0KSAtPiBiaW5kZXI6OlJlc3VsdDxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xM19SZWN1cnNpdmVMaXN0PiB7CisgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLlJldmVyc2VMaXN0KF9hcmdfbGlzdCkpCisgICAgICB9CisgICAgICBmbiBSZXZlcnNlSUJpbmRlckFycmF5KCZzZWxmLCBfYXJnX2lucHV0OiAmW2JpbmRlcjo6U3BJQmluZGVyXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8T3B0aW9uPGJpbmRlcjo6U3BJQmluZGVyPj4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxiaW5kZXI6OlNwSUJpbmRlcj4+IHsKKyAgICAgICAgc2VsZi5fcnQuYmxvY2tfb24oc2VsZi5faW5uZXIuUmV2ZXJzZUlCaW5kZXJBcnJheShfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSkKKyAgICAgIH0KKyAgICAgIGZuIFJldmVyc2VOdWxsYWJsZUlCaW5kZXJBcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbT3B0aW9uPGJpbmRlcjo6U3BJQmluZGVyPl0+LCBfYXJnX3JlcGVhdGVkOiAmbXV0IE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3BJQmluZGVyPj4+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj4+Pj4geworICAgICAgICBzZWxmLl9ydC5ibG9ja19vbihzZWxmLl9pbm5lci5SZXZlcnNlTnVsbGFibGVJQmluZGVyQXJyYXkoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCkpCisgICAgICB9CisgICAgICBmbiBHZXRPbGROYW1lSW50ZXJmYWNlKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9JT2xkTmFtZT4+IHsKKyAgICAgICAgc2VsZi5fcnQuYmxvY2tfb24oc2VsZi5faW5uZXIuR2V0T2xkTmFtZUludGVyZmFjZSgpKQorICAgICAgfQorICAgICAgZm4gR2V0TmV3TmFtZUludGVyZmFjZSgmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfSU5ld05hbWU+PiB7CisgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLkdldE5ld05hbWVJbnRlcmZhY2UoKSkKKyAgICAgIH0KKyAgICAgIGZuIEdldFVuaW9uVGFncygmc2VsZiwgX2FyZ19pbnB1dDogJltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c181X1VuaW9uXSkgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzVfVW5pb25fM19UYWc+PiB7CisgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLkdldFVuaW9uVGFncyhfYXJnX2lucHV0KSkKKyAgICAgIH0KKyAgICAgIGZuIEdldENwcEphdmFUZXN0cygmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPGJpbmRlcjo6U3BJQmluZGVyPj4geworICAgICAgICBzZWxmLl9ydC5ibG9ja19vbihzZWxmLl9pbm5lci5HZXRDcHBKYXZhVGVzdHMoKSkKKyAgICAgIH0KKyAgICAgIGZuIGdldEJhY2tlbmRUeXBlKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMV9CYWNrZW5kVHlwZT4geworICAgICAgICBzZWxmLl9ydC5ibG9ja19vbihzZWxmLl9pbm5lci5nZXRCYWNrZW5kVHlwZSgpKQorICAgICAgfQorICAgIH0KKyAgICBsZXQgd3JhcHBlZCA9IFdyYXBwZXIgeyBfaW5uZXI6IGlubmVyLCBfcnQ6IHJ0IH07CisgICAgU2VsZjo6bmV3X2JpbmRlcih3cmFwcGVkLCBmZWF0dXJlcykKKyAgfQorfQogcHViIHRyYWl0IElUZXN0U2VydmljZURlZmF1bHQ6IFNlbmQgKyBTeW5jIHsKLSAgZm4gVW5pbXBsZW1lbnRlZE1ldGhvZCgmc2VsZiwgX2FyZ19hcmc6IGkzMikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8aTMyPiB7CisgIGZuIFVuaW1wbGVtZW50ZWRNZXRob2QoJnNlbGYsIF9hcmdfYXJnOiBpMzIpIC0+IGJpbmRlcjo6UmVzdWx0PGkzMj4gewogICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQogICB9Ci0gIGZuIERlcHJlY2F0ZWQoJnNlbGYpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PCgpPiB7CisgIGZuIERlcHJlY2F0ZWQoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7CiAgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTi5pbnRvKCkpCiAgIH0KLSAgZm4gVGVzdE9uZXdheSgmc2VsZikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8KCk+IHsKKyAgZm4gVGVzdE9uZXdheSgmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKICAgICBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OLmludG8oKSkKICAgfQotICBmbiBSZXBlYXRCb29sZWFuKCZzZWxmLCBfYXJnX3Rva2VuOiBib29sKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxib29sPiB7CisgIGZuIFJlcGVhdEJvb2xlYW4oJnNlbGYsIF9hcmdfdG9rZW46IGJvb2wpIC0+IGJpbmRlcjo6UmVzdWx0PGJvb2w+IHsKICAgICBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OLmludG8oKSkKICAgfQotICBmbiBSZXBlYXRCeXRlKCZzZWxmLCBfYXJnX3Rva2VuOiBpOCkgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8aTg+IHsKKyAgZm4gUmVwZWF0Qnl0ZSgmc2VsZiwgX2FyZ190b2tlbjogaTgpIC0+IGJpbmRlcjo6UmVzdWx0PGk4PiB7CiAgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTi5pbnRvKCkpCiAgIH0KLSAgZm4gUmVwZWF0Q2hhcigmc2VsZiwgX2FyZ190b2tlbjogdTE2KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDx1MTY+IHsKKyAgZm4gUmVwZWF0Q2hhcigmc2VsZiwgX2FyZ190b2tlbjogdTE2KSAtPiBiaW5kZXI6OlJlc3VsdDx1MTY+IHsKICAgICBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OLmludG8oKSkKICAgfQotICBmbiBSZXBlYXRJbnQoJnNlbGYsIF9hcmdfdG9rZW46IGkzMikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8aTMyPiB7CisgIGZuIFJlcGVhdEludCgmc2VsZiwgX2FyZ190b2tlbjogaTMyKSAtPiBiaW5kZXI6OlJlc3VsdDxpMzI+IHsKICAgICBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OLmludG8oKSkKICAgfQotICBmbiBSZXBlYXRMb25nKCZzZWxmLCBfYXJnX3Rva2VuOiBpNjQpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PGk2ND4geworICBmbiBSZXBlYXRMb25nKCZzZWxmLCBfYXJnX3Rva2VuOiBpNjQpIC0+IGJpbmRlcjo6UmVzdWx0PGk2ND4gewogICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQogICB9Ci0gIGZuIFJlcGVhdEZsb2F0KCZzZWxmLCBfYXJnX3Rva2VuOiBmMzIpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PGYzMj4geworICBmbiBSZXBlYXRGbG9hdCgmc2VsZiwgX2FyZ190b2tlbjogZjMyKSAtPiBiaW5kZXI6OlJlc3VsdDxmMzI+IHsKICAgICBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OLmludG8oKSkKICAgfQotICBmbiBSZXBlYXREb3VibGUoJnNlbGYsIF9hcmdfdG9rZW46IGY2NCkgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8ZjY0PiB7CisgIGZuIFJlcGVhdERvdWJsZSgmc2VsZiwgX2FyZ190b2tlbjogZjY0KSAtPiBiaW5kZXI6OlJlc3VsdDxmNjQ+IHsKICAgICBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OLmludG8oKSkKICAgfQotICBmbiBSZXBlYXRTdHJpbmcoJnNlbGYsIF9hcmdfdG9rZW46ICZzdHIpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PFN0cmluZz4geworICBmbiBSZXBlYXRTdHJpbmcoJnNlbGYsIF9hcmdfdG9rZW46ICZzdHIpIC0+IGJpbmRlcjo6UmVzdWx0PFN0cmluZz4gewogICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQogICB9Ci0gIGZuIFJlcGVhdEJ5dGVFbnVtKCZzZWxmLCBfYXJnX3Rva2VuOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtPiB7CisgIGZuIFJlcGVhdEJ5dGVFbnVtKCZzZWxmLCBfYXJnX3Rva2VuOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtKSAtPiBiaW5kZXI6OlJlc3VsdDxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtPiB7CiAgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTi5pbnRvKCkpCiAgIH0KLSAgZm4gUmVwZWF0SW50RW51bSgmc2VsZiwgX2FyZ190b2tlbjogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW0+IHsKKyAgZm4gUmVwZWF0SW50RW51bSgmc2VsZiwgX2FyZ190b2tlbjogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtKSAtPiBiaW5kZXI6OlJlc3VsdDxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW0+IHsKICAgICBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OLmludG8oKSkKICAgfQotICBmbiBSZXBlYXRMb25nRW51bSgmc2VsZiwgX2FyZ190b2tlbjogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bSkgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bT4geworICBmbiBSZXBlYXRMb25nRW51bSgmc2VsZiwgX2FyZ190b2tlbjogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bSkgLT4gYmluZGVyOjpSZXN1bHQ8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bT4gewogICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQogICB9Ci0gIGZuIFJldmVyc2VCb29sZWFuKCZzZWxmLCBfYXJnX2lucHV0OiAmW2Jvb2xdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxib29sPikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8VmVjPGJvb2w+PiB7CisgIGZuIFJldmVyc2VCb29sZWFuKCZzZWxmLCBfYXJnX2lucHV0OiAmW2Jvb2xdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxib29sPikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPGJvb2w+PiB7CiAgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTi5pbnRvKCkpCiAgIH0KLSAgZm4gUmV2ZXJzZUJ5dGUoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbdThdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzx1OD4pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PFZlYzx1OD4+IHsKKyAgZm4gUmV2ZXJzZUJ5dGUoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbdThdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzx1OD4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzx1OD4+IHsKICAgICBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OLmludG8oKSkKICAgfQotICBmbiBSZXZlcnNlQ2hhcigmc2VsZiwgX2FyZ19pbnB1dDogJlt1MTZdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzx1MTY+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxWZWM8dTE2Pj4geworICBmbiBSZXZlcnNlQ2hhcigmc2VsZiwgX2FyZ19pbnB1dDogJlt1MTZdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzx1MTY+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8dTE2Pj4gewogICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQogICB9Ci0gIGZuIFJldmVyc2VJbnQoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbaTMyXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8aTMyPikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8VmVjPGkzMj4+IHsKKyAgZm4gUmV2ZXJzZUludCgmc2VsZiwgX2FyZ19pbnB1dDogJltpMzJdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxpMzI+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8aTMyPj4gewogICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQogICB9Ci0gIGZuIFJldmVyc2VMb25nKCZzZWxmLCBfYXJnX2lucHV0OiAmW2k2NF0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPGk2ND4pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PFZlYzxpNjQ+PiB7CisgIGZuIFJldmVyc2VMb25nKCZzZWxmLCBfYXJnX2lucHV0OiAmW2k2NF0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPGk2ND4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxpNjQ+PiB7CiAgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTi5pbnRvKCkpCiAgIH0KLSAgZm4gUmV2ZXJzZUZsb2F0KCZzZWxmLCBfYXJnX2lucHV0OiAmW2YzMl0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPGYzMj4pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PFZlYzxmMzI+PiB7CisgIGZuIFJldmVyc2VGbG9hdCgmc2VsZiwgX2FyZ19pbnB1dDogJltmMzJdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxmMzI+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8ZjMyPj4gewogICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQogICB9Ci0gIGZuIFJldmVyc2VEb3VibGUoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbZjY0XSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8ZjY0PikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8VmVjPGY2ND4+IHsKKyAgZm4gUmV2ZXJzZURvdWJsZSgmc2VsZiwgX2FyZ19pbnB1dDogJltmNjRdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxmNjQ+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8ZjY0Pj4gewogICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQogICB9Ci0gIGZuIFJldmVyc2VTdHJpbmcoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbU3RyaW5nXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8U3RyaW5nPikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8VmVjPFN0cmluZz4+IHsKKyAgZm4gUmV2ZXJzZVN0cmluZygmc2VsZiwgX2FyZ19pbnB1dDogJltTdHJpbmddLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxTdHJpbmc+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8U3RyaW5nPj4gewogICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQogICB9Ci0gIGZuIFJldmVyc2VCeXRlRW51bSgmc2VsZiwgX2FyZ19pbnB1dDogJltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bT4pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtPj4geworICBmbiBSZXZlcnNlQnl0ZUVudW0oJnNlbGYsIF9hcmdfaW5wdXQ6ICZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bV0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW0+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bT4+IHsKICAgICBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OLmludG8oKSkKICAgfQotICBmbiBSZXZlcnNlSW50RW51bSgmc2VsZiwgX2FyZ19pbnB1dDogJltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW1dLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW0+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtPj4geworICBmbiBSZXZlcnNlSW50RW51bSgmc2VsZiwgX2FyZ19pbnB1dDogJltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW1dLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW0+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtPj4gewogICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQogICB9Ci0gIGZuIFJldmVyc2VMb25nRW51bSgmc2VsZiwgX2FyZ19pbnB1dDogJltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bT4pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtPj4geworICBmbiBSZXZlcnNlTG9uZ0VudW0oJnNlbGYsIF9hcmdfaW5wdXQ6ICZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bV0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW0+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bT4+IHsKICAgICBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OLmludG8oKSkKICAgfQotICBmbiBHZXRPdGhlclRlc3RTZXJ2aWNlKCZzZWxmLCBfYXJnX25hbWU6ICZzdHIpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz4+IHsKKyAgZm4gR2V0T3RoZXJUZXN0U2VydmljZSgmc2VsZiwgX2FyZ19uYW1lOiAmc3RyKSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+PiB7CiAgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTi5pbnRvKCkpCiAgIH0KLSAgZm4gVmVyaWZ5TmFtZSgmc2VsZiwgX2FyZ19zZXJ2aWNlOiAmYmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPiwgX2FyZ19uYW1lOiAmc3RyKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxib29sPiB7CisgIGZuIFZlcmlmeU5hbWUoJnNlbGYsIF9hcmdfc2VydmljZTogJmJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz4sIF9hcmdfbmFtZTogJnN0cikgLT4gYmluZGVyOjpSZXN1bHQ8Ym9vbD4gewogICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQogICB9Ci0gIGZuIFJldmVyc2VTdHJpbmdMaXN0KCZzZWxmLCBfYXJnX2lucHV0OiAmW1N0cmluZ10sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPFN0cmluZz4pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PFZlYzxTdHJpbmc+PiB7CisgIGZuIEdldEludGVyZmFjZUFycmF5KCZzZWxmLCBfYXJnX25hbWVzOiAmW1N0cmluZ10pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+Pj4gewogICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQogICB9Ci0gIGZuIFJlcGVhdFBhcmNlbEZpbGVEZXNjcmlwdG9yKCZzZWxmLCBfYXJnX3JlYWQ6ICZiaW5kZXI6OnBhcmNlbDo6UGFyY2VsRmlsZURlc2NyaXB0b3IpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PGJpbmRlcjo6cGFyY2VsOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj4geworICBmbiBWZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VBcnJheSgmc2VsZiwgX2FyZ19zZXJ2aWNlczogJltiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+XSwgX2FyZ19uYW1lczogJltTdHJpbmddKSAtPiBiaW5kZXI6OlJlc3VsdDxib29sPiB7CiAgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTi5pbnRvKCkpCiAgIH0KLSAgZm4gUmV2ZXJzZVBhcmNlbEZpbGVEZXNjcmlwdG9yQXJyYXkoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbYmluZGVyOjpwYXJjZWw6OlBhcmNlbEZpbGVEZXNjcmlwdG9yXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8T3B0aW9uPGJpbmRlcjo6cGFyY2VsOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj4+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxWZWM8YmluZGVyOjpwYXJjZWw6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPj4geworICBmbiBHZXROdWxsYWJsZUludGVyZmFjZUFycmF5KCZzZWxmLCBfYXJnX25hbWVzOiBPcHRpb248JltPcHRpb248U3RyaW5nPl0+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+Pj4+PiB7CiAgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTi5pbnRvKCkpCiAgIH0KLSAgZm4gVGhyb3dTZXJ2aWNlRXhjZXB0aW9uKCZzZWxmLCBfYXJnX2NvZGU6IGkzMikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8KCk+IHsKKyAgZm4gVmVyaWZ5TmFtZXNXaXRoTnVsbGFibGVJbnRlcmZhY2VBcnJheSgmc2VsZiwgX2FyZ19zZXJ2aWNlczogT3B0aW9uPCZbT3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz4+XT4sIF9hcmdfbmFtZXM6IE9wdGlvbjwmW09wdGlvbjxTdHJpbmc+XT4pIC0+IGJpbmRlcjo6UmVzdWx0PGJvb2w+IHsKICAgICBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OLmludG8oKSkKICAgfQotICBmbiBSZXBlYXROdWxsYWJsZUludEFycmF5KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltpMzJdPikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8T3B0aW9uPFZlYzxpMzI+Pj4geworICBmbiBHZXRJbnRlcmZhY2VMaXN0KCZzZWxmLCBfYXJnX25hbWVzOiBPcHRpb248JltPcHRpb248U3RyaW5nPl0+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+Pj4+PiB7CiAgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTi5pbnRvKCkpCiAgIH0KLSAgZm4gUmVwZWF0TnVsbGFibGVCeXRlRW51bUFycmF5KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtXT4pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PE9wdGlvbjxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bT4+PiB7CisgIGZuIFZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUxpc3QoJnNlbGYsIF9hcmdfc2VydmljZXM6IE9wdGlvbjwmW09wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+Pl0+LCBfYXJnX25hbWVzOiBPcHRpb248JltPcHRpb248U3RyaW5nPl0+KSAtPiBiaW5kZXI6OlJlc3VsdDxib29sPiB7CiAgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTi5pbnRvKCkpCiAgIH0KLSAgZm4gUmVwZWF0TnVsbGFibGVJbnRFbnVtQXJyYXkoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bV0+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxPcHRpb248VmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bT4+PiB7CisgIGZuIFJldmVyc2VTdHJpbmdMaXN0KCZzZWxmLCBfYXJnX2lucHV0OiAmW1N0cmluZ10sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPFN0cmluZz4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxTdHJpbmc+PiB7CiAgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTi5pbnRvKCkpCiAgIH0KLSAgZm4gUmVwZWF0TnVsbGFibGVMb25nRW51bUFycmF5KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtXT4pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PE9wdGlvbjxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bT4+PiB7CisgIGZuIFJlcGVhdFBhcmNlbEZpbGVEZXNjcmlwdG9yKCZzZWxmLCBfYXJnX3JlYWQ6ICZiaW5kZXI6OlBhcmNlbEZpbGVEZXNjcmlwdG9yKSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPiB7CiAgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTi5pbnRvKCkpCiAgIH0KLSAgZm4gUmVwZWF0TnVsbGFibGVTdHJpbmcoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmc3RyPikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8T3B0aW9uPFN0cmluZz4+IHsKKyAgZm4gUmV2ZXJzZVBhcmNlbEZpbGVEZXNjcmlwdG9yQXJyYXkoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbYmluZGVyOjpQYXJjZWxGaWxlRGVzY3JpcHRvcl0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPE9wdGlvbjxiaW5kZXI6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPj4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxiaW5kZXI6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPj4gewogICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQogICB9Ci0gIGZuIFJlcGVhdE51bGxhYmxlU3RyaW5nTGlzdCgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbT3B0aW9uPFN0cmluZz5dPikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+PiB7CisgIGZuIFRocm93U2VydmljZUV4Y2VwdGlvbigmc2VsZiwgX2FyZ19jb2RlOiBpMzIpIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7CiAgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTi5pbnRvKCkpCiAgIH0KLSAgZm4gUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlKCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JmNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzIwX1N0cnVjdHVyZWRQYXJjZWxhYmxlPikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8T3B0aW9uPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzIwX1N0cnVjdHVyZWRQYXJjZWxhYmxlPj4geworICBmbiBSZXBlYXROdWxsYWJsZUludEFycmF5KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltpMzJdPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxpMzI+Pj4gewogICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQogICB9Ci0gIGZuIFRha2VzQW5JQmluZGVyKCZzZWxmLCBfYXJnX2lucHV0OiAmYmluZGVyOjpTcElCaW5kZXIpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PCgpPiB7CisgIGZuIFJlcGVhdE51bGxhYmxlQnl0ZUVudW1BcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bV0+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW0+Pj4gewogICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQogICB9Ci0gIGZuIFRha2VzQU51bGxhYmxlSUJpbmRlcigmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZiaW5kZXI6OlNwSUJpbmRlcj4pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PCgpPiB7CisgIGZuIFJlcGVhdE51bGxhYmxlSW50RW51bUFycmF5KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW1dPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW0+Pj4gewogICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQogICB9Ci0gIGZuIFJlcGVhdFV0ZjhDcHBTdHJpbmcoJnNlbGYsIF9hcmdfdG9rZW46ICZzdHIpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PFN0cmluZz4geworICBmbiBSZXBlYXROdWxsYWJsZUxvbmdFbnVtQXJyYXkoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW1dPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtPj4+IHsKICAgICBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OLmludG8oKSkKICAgfQotICBmbiBSZXBlYXROdWxsYWJsZVV0ZjhDcHBTdHJpbmcoJnNlbGYsIF9hcmdfdG9rZW46IE9wdGlvbjwmc3RyPikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8T3B0aW9uPFN0cmluZz4+IHsKKyAgZm4gUmVwZWF0TnVsbGFibGVTdHJpbmcoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmc3RyPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFN0cmluZz4+IHsKICAgICBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OLmludG8oKSkKICAgfQotICBmbiBSZXZlcnNlVXRmOENwcFN0cmluZygmc2VsZiwgX2FyZ19pbnB1dDogJltTdHJpbmddLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxTdHJpbmc+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxWZWM8U3RyaW5nPj4geworICBmbiBSZXBlYXROdWxsYWJsZVN0cmluZ0xpc3QoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxTdHJpbmc+XT4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPFN0cmluZz4+Pj4gewogICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQogICB9Ci0gIGZuIFJldmVyc2VOdWxsYWJsZVV0ZjhDcHBTdHJpbmcoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxTdHJpbmc+XT4sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgT3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxTdHJpbmc+Pj4+IHsKKyAgZm4gUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlKCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JmNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZV81X0VtcHR5PikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZV81X0VtcHR5Pj4gewogICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQogICB9Ci0gIGZuIFJldmVyc2VVdGY4Q3BwU3RyaW5nTGlzdCgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbT3B0aW9uPFN0cmluZz5dPiwgX2FyZ19yZXBlYXRlZDogJm11dCBPcHRpb248VmVjPE9wdGlvbjxTdHJpbmc+Pj4pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPFN0cmluZz4+Pj4geworICBmbiBSZXBlYXROdWxsYWJsZVBhcmNlbGFibGVBcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbT3B0aW9uPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZV81X0VtcHR5Pl0+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMl9JVGVzdFNlcnZpY2VfNV9FbXB0eT4+Pj4gewogICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQogICB9Ci0gIGZuIEdldENhbGxiYWNrKCZzZWxmLCBfYXJnX3JldHVybl9udWxsOiBib29sKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPj4+IHsKKyAgZm4gUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlTGlzdCgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbT3B0aW9uPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZV81X0VtcHR5Pl0+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMl9JVGVzdFNlcnZpY2VfNV9FbXB0eT4+Pj4gewogICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQogICB9Ci0gIGZuIEZpbGxPdXRTdHJ1Y3R1cmVkUGFyY2VsYWJsZSgmc2VsZiwgX2FyZ19wYXJjZWw6ICZtdXQgY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMjBfU3RydWN0dXJlZFBhcmNlbGFibGUpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PCgpPiB7CisgIGZuIFRha2VzQW5JQmluZGVyKCZzZWxmLCBfYXJnX2lucHV0OiAmYmluZGVyOjpTcElCaW5kZXIpIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7CiAgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTi5pbnRvKCkpCiAgIH0KLSAgZm4gR2V0T2xkTmFtZUludGVyZmFjZSgmc2VsZikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfSU9sZE5hbWU+PiB7CisgIGZuIFRha2VzQU51bGxhYmxlSUJpbmRlcigmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZiaW5kZXI6OlNwSUJpbmRlcj4pIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7CiAgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTi5pbnRvKCkpCiAgIH0KLSAgZm4gR2V0TmV3TmFtZUludGVyZmFjZSgmc2VsZikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfSU5ld05hbWU+PiB7CisgIGZuIFRha2VzQW5JQmluZGVyTGlzdCgmc2VsZiwgX2FyZ19pbnB1dDogJltiaW5kZXI6OlNwSUJpbmRlcl0pIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7CiAgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTi5pbnRvKCkpCiAgIH0KLSAgZm4gR2V0Q3BwSmF2YVRlc3RzKCZzZWxmKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxPcHRpb248YmluZGVyOjpTcElCaW5kZXI+PiB7CisgIGZuIFRha2VzQU51bGxhYmxlSUJpbmRlckxpc3QoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj5dPikgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKICAgICBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OLmludG8oKSkKICAgfQotICBmbiBnZXRCYWNrZW5kVHlwZSgmc2VsZikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTFfQmFja2VuZFR5cGU+IHsKKyAgZm4gUmVwZWF0VXRmOENwcFN0cmluZygmc2VsZiwgX2FyZ190b2tlbjogJnN0cikgLT4gYmluZGVyOjpSZXN1bHQ8U3RyaW5nPiB7CisgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTi5pbnRvKCkpCisgIH0KKyAgZm4gUmVwZWF0TnVsbGFibGVVdGY4Q3BwU3RyaW5nKCZzZWxmLCBfYXJnX3Rva2VuOiBPcHRpb248JnN0cj4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxTdHJpbmc+PiB7CisgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTi5pbnRvKCkpCisgIH0KKyAgZm4gUmV2ZXJzZVV0ZjhDcHBTdHJpbmcoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbU3RyaW5nXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8U3RyaW5nPikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPFN0cmluZz4+IHsKKyAgICBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OLmludG8oKSkKKyAgfQorICBmbiBSZXZlcnNlTnVsbGFibGVVdGY4Q3BwU3RyaW5nKCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltPcHRpb248U3RyaW5nPl0+LCBfYXJnX3JlcGVhdGVkOiAmbXV0IE9wdGlvbjxWZWM8T3B0aW9uPFN0cmluZz4+PikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+PiB7CisgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTi5pbnRvKCkpCisgIH0KKyAgZm4gUmV2ZXJzZVV0ZjhDcHBTdHJpbmdMaXN0KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltPcHRpb248U3RyaW5nPl0+LCBfYXJnX3JlcGVhdGVkOiAmbXV0IE9wdGlvbjxWZWM8T3B0aW9uPFN0cmluZz4+PikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+PiB7CisgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTi5pbnRvKCkpCisgIH0KKyAgZm4gR2V0Q2FsbGJhY2soJnNlbGYsIF9hcmdfcmV0dXJuX251bGw6IGJvb2wpIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+Pj4geworICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQorICB9CisgIGZuIEZpbGxPdXRTdHJ1Y3R1cmVkUGFyY2VsYWJsZSgmc2VsZiwgX2FyZ19wYXJjZWw6ICZtdXQgY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMjBfU3RydWN0dXJlZFBhcmNlbGFibGUpIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7CisgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTi5pbnRvKCkpCisgIH0KKyAgZm4gUmVwZWF0RXh0ZW5kYWJsZVBhcmNlbGFibGUoJnNlbGYsIF9hcmdfZXA6ICZjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c185X2V4dGVuc2lvbl8yMF9FeHRlbmRhYmxlUGFyY2VsYWJsZSwgX2FyZ19lcDI6ICZtdXQgY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOV9leHRlbnNpb25fMjBfRXh0ZW5kYWJsZVBhcmNlbGFibGUpIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7CisgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTi5pbnRvKCkpCisgIH0KKyAgZm4gUmV2ZXJzZUxpc3QoJnNlbGYsIF9hcmdfbGlzdDogJmNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEzX1JlY3Vyc2l2ZUxpc3QpIC0+IGJpbmRlcjo6UmVzdWx0PGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEzX1JlY3Vyc2l2ZUxpc3Q+IHsKKyAgICBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OLmludG8oKSkKKyAgfQorICBmbiBSZXZlcnNlSUJpbmRlckFycmF5KCZzZWxmLCBfYXJnX2lucHV0OiAmW2JpbmRlcjo6U3BJQmluZGVyXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8T3B0aW9uPGJpbmRlcjo6U3BJQmluZGVyPj4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxiaW5kZXI6OlNwSUJpbmRlcj4+IHsKKyAgICBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OLmludG8oKSkKKyAgfQorICBmbiBSZXZlcnNlTnVsbGFibGVJQmluZGVyQXJyYXkoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj5dPiwgX2FyZ19yZXBlYXRlZDogJm11dCBPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj4+PikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTcElCaW5kZXI+Pj4+IHsKKyAgICBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OLmludG8oKSkKKyAgfQorICBmbiBHZXRPbGROYW1lSW50ZXJmYWNlKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9JT2xkTmFtZT4+IHsKKyAgICBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OLmludG8oKSkKKyAgfQorICBmbiBHZXROZXdOYW1lSW50ZXJmYWNlKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9JTmV3TmFtZT4+IHsKKyAgICBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OLmludG8oKSkKKyAgfQorICBmbiBHZXRVbmlvblRhZ3MoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNV9Vbmlvbl0pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c181X1VuaW9uXzNfVGFnPj4geworICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQorICB9CisgIGZuIEdldENwcEphdmFUZXN0cygmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPGJpbmRlcjo6U3BJQmluZGVyPj4geworICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQorICB9CisgIGZuIGdldEJhY2tlbmRUeXBlKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMV9CYWNrZW5kVHlwZT4gewogICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQogICB9CiB9CiBwdWIgbW9kIHRyYW5zYWN0aW9ucyB7Ci0gIHB1YiBjb25zdCBVbmltcGxlbWVudGVkTWV0aG9kOiBiaW5kZXI6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDA7Ci0gIHB1YiBjb25zdCBEZXByZWNhdGVkOiBiaW5kZXI6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDE7Ci0gIHB1YiBjb25zdCBUZXN0T25ld2F5OiBiaW5kZXI6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDI7Ci0gIHB1YiBjb25zdCBSZXBlYXRCb29sZWFuOiBiaW5kZXI6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDM7Ci0gIHB1YiBjb25zdCBSZXBlYXRCeXRlOiBiaW5kZXI6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQ7Ci0gIHB1YiBjb25zdCBSZXBlYXRDaGFyOiBiaW5kZXI6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDU7Ci0gIHB1YiBjb25zdCBSZXBlYXRJbnQ6IGJpbmRlcjo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNjsKLSAgcHViIGNvbnN0IFJlcGVhdExvbmc6IGJpbmRlcjo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNzsKLSAgcHViIGNvbnN0IFJlcGVhdEZsb2F0OiBiaW5kZXI6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDg7Ci0gIHB1YiBjb25zdCBSZXBlYXREb3VibGU6IGJpbmRlcjo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgOTsKLSAgcHViIGNvbnN0IFJlcGVhdFN0cmluZzogYmluZGVyOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAxMDsKLSAgcHViIGNvbnN0IFJlcGVhdEJ5dGVFbnVtOiBiaW5kZXI6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDExOwotICBwdWIgY29uc3QgUmVwZWF0SW50RW51bTogYmluZGVyOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAxMjsKLSAgcHViIGNvbnN0IFJlcGVhdExvbmdFbnVtOiBiaW5kZXI6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDEzOwotICBwdWIgY29uc3QgUmV2ZXJzZUJvb2xlYW46IGJpbmRlcjo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMTQ7Ci0gIHB1YiBjb25zdCBSZXZlcnNlQnl0ZTogYmluZGVyOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAxNTsKLSAgcHViIGNvbnN0IFJldmVyc2VDaGFyOiBiaW5kZXI6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDE2OwotICBwdWIgY29uc3QgUmV2ZXJzZUludDogYmluZGVyOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAxNzsKLSAgcHViIGNvbnN0IFJldmVyc2VMb25nOiBiaW5kZXI6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDE4OwotICBwdWIgY29uc3QgUmV2ZXJzZUZsb2F0OiBiaW5kZXI6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDE5OwotICBwdWIgY29uc3QgUmV2ZXJzZURvdWJsZTogYmluZGVyOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyMDsKLSAgcHViIGNvbnN0IFJldmVyc2VTdHJpbmc6IGJpbmRlcjo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMjE7Ci0gIHB1YiBjb25zdCBSZXZlcnNlQnl0ZUVudW06IGJpbmRlcjo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMjI7Ci0gIHB1YiBjb25zdCBSZXZlcnNlSW50RW51bTogYmluZGVyOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyMzsKLSAgcHViIGNvbnN0IFJldmVyc2VMb25nRW51bTogYmluZGVyOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyNDsKLSAgcHViIGNvbnN0IEdldE90aGVyVGVzdFNlcnZpY2U6IGJpbmRlcjo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMjU7Ci0gIHB1YiBjb25zdCBWZXJpZnlOYW1lOiBiaW5kZXI6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDI2OwotICBwdWIgY29uc3QgUmV2ZXJzZVN0cmluZ0xpc3Q6IGJpbmRlcjo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMjc7Ci0gIHB1YiBjb25zdCBSZXBlYXRQYXJjZWxGaWxlRGVzY3JpcHRvcjogYmluZGVyOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyODsKLSAgcHViIGNvbnN0IFJldmVyc2VQYXJjZWxGaWxlRGVzY3JpcHRvckFycmF5OiBiaW5kZXI6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDI5OwotICBwdWIgY29uc3QgVGhyb3dTZXJ2aWNlRXhjZXB0aW9uOiBiaW5kZXI6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDMwOwotICBwdWIgY29uc3QgUmVwZWF0TnVsbGFibGVJbnRBcnJheTogYmluZGVyOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzMTsKLSAgcHViIGNvbnN0IFJlcGVhdE51bGxhYmxlQnl0ZUVudW1BcnJheTogYmluZGVyOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzMjsKLSAgcHViIGNvbnN0IFJlcGVhdE51bGxhYmxlSW50RW51bUFycmF5OiBiaW5kZXI6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDMzOwotICBwdWIgY29uc3QgUmVwZWF0TnVsbGFibGVMb25nRW51bUFycmF5OiBiaW5kZXI6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDM0OwotICBwdWIgY29uc3QgUmVwZWF0TnVsbGFibGVTdHJpbmc6IGJpbmRlcjo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzU7Ci0gIHB1YiBjb25zdCBSZXBlYXROdWxsYWJsZVN0cmluZ0xpc3Q6IGJpbmRlcjo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzY7Ci0gIHB1YiBjb25zdCBSZXBlYXROdWxsYWJsZVBhcmNlbGFibGU6IGJpbmRlcjo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzc7Ci0gIHB1YiBjb25zdCBUYWtlc0FuSUJpbmRlcjogYmluZGVyOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzODsKLSAgcHViIGNvbnN0IFRha2VzQU51bGxhYmxlSUJpbmRlcjogYmluZGVyOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzOTsKLSAgcHViIGNvbnN0IFJlcGVhdFV0ZjhDcHBTdHJpbmc6IGJpbmRlcjo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDA7Ci0gIHB1YiBjb25zdCBSZXBlYXROdWxsYWJsZVV0ZjhDcHBTdHJpbmc6IGJpbmRlcjo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDE7Ci0gIHB1YiBjb25zdCBSZXZlcnNlVXRmOENwcFN0cmluZzogYmluZGVyOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0MjsKLSAgcHViIGNvbnN0IFJldmVyc2VOdWxsYWJsZVV0ZjhDcHBTdHJpbmc6IGJpbmRlcjo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDM7Ci0gIHB1YiBjb25zdCBSZXZlcnNlVXRmOENwcFN0cmluZ0xpc3Q6IGJpbmRlcjo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDQ7Ci0gIHB1YiBjb25zdCBHZXRDYWxsYmFjazogYmluZGVyOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0NTsKLSAgcHViIGNvbnN0IEZpbGxPdXRTdHJ1Y3R1cmVkUGFyY2VsYWJsZTogYmluZGVyOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0NjsKLSAgcHViIGNvbnN0IEdldE9sZE5hbWVJbnRlcmZhY2U6IGJpbmRlcjo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDc7Ci0gIHB1YiBjb25zdCBHZXROZXdOYW1lSW50ZXJmYWNlOiBiaW5kZXI6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQ4OwotICBwdWIgY29uc3QgR2V0Q3BwSmF2YVRlc3RzOiBiaW5kZXI6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQ5OwotICBwdWIgY29uc3QgZ2V0QmFja2VuZFR5cGU6IGJpbmRlcjo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNTA7CisgIHB1YiBjb25zdCBVbmltcGxlbWVudGVkTWV0aG9kOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMDsKKyAgcHViIGNvbnN0IERlcHJlY2F0ZWQ6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAxOworICBwdWIgY29uc3QgVGVzdE9uZXdheTogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpiaW5kZXJfaW1wbDo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDI7CisgIHB1YiBjb25zdCBSZXBlYXRCb29sZWFuOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzsKKyAgcHViIGNvbnN0IFJlcGVhdEJ5dGU6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0OworICBwdWIgY29uc3QgUmVwZWF0Q2hhcjogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpiaW5kZXJfaW1wbDo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDU7CisgIHB1YiBjb25zdCBSZXBlYXRJbnQ6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA2OworICBwdWIgY29uc3QgUmVwZWF0TG9uZzogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpiaW5kZXJfaW1wbDo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDc7CisgIHB1YiBjb25zdCBSZXBlYXRGbG9hdDogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpiaW5kZXJfaW1wbDo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDg7CisgIHB1YiBjb25zdCBSZXBlYXREb3VibGU6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA5OworICBwdWIgY29uc3QgUmVwZWF0U3RyaW5nOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMTA7CisgIHB1YiBjb25zdCBSZXBlYXRCeXRlRW51bTogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpiaW5kZXJfaW1wbDo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDExOworICBwdWIgY29uc3QgUmVwZWF0SW50RW51bTogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpiaW5kZXJfaW1wbDo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDEyOworICBwdWIgY29uc3QgUmVwZWF0TG9uZ0VudW06IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAxMzsKKyAgcHViIGNvbnN0IFJldmVyc2VCb29sZWFuOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMTQ7CisgIHB1YiBjb25zdCBSZXZlcnNlQnl0ZTogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpiaW5kZXJfaW1wbDo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDE1OworICBwdWIgY29uc3QgUmV2ZXJzZUNoYXI6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAxNjsKKyAgcHViIGNvbnN0IFJldmVyc2VJbnQ6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAxNzsKKyAgcHViIGNvbnN0IFJldmVyc2VMb25nOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMTg7CisgIHB1YiBjb25zdCBSZXZlcnNlRmxvYXQ6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAxOTsKKyAgcHViIGNvbnN0IFJldmVyc2VEb3VibGU6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyMDsKKyAgcHViIGNvbnN0IFJldmVyc2VTdHJpbmc6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyMTsKKyAgcHViIGNvbnN0IFJldmVyc2VCeXRlRW51bTogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpiaW5kZXJfaW1wbDo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDIyOworICBwdWIgY29uc3QgUmV2ZXJzZUludEVudW06IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyMzsKKyAgcHViIGNvbnN0IFJldmVyc2VMb25nRW51bTogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpiaW5kZXJfaW1wbDo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDI0OworICBwdWIgY29uc3QgR2V0T3RoZXJUZXN0U2VydmljZTogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpiaW5kZXJfaW1wbDo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDI1OworICBwdWIgY29uc3QgVmVyaWZ5TmFtZTogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpiaW5kZXJfaW1wbDo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDI2OworICBwdWIgY29uc3QgR2V0SW50ZXJmYWNlQXJyYXk6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyNzsKKyAgcHViIGNvbnN0IFZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUFycmF5OiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMjg7CisgIHB1YiBjb25zdCBHZXROdWxsYWJsZUludGVyZmFjZUFycmF5OiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMjk7CisgIHB1YiBjb25zdCBWZXJpZnlOYW1lc1dpdGhOdWxsYWJsZUludGVyZmFjZUFycmF5OiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzA7CisgIHB1YiBjb25zdCBHZXRJbnRlcmZhY2VMaXN0OiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzE7CisgIHB1YiBjb25zdCBWZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VMaXN0OiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzI7CisgIHB1YiBjb25zdCBSZXZlcnNlU3RyaW5nTGlzdDogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpiaW5kZXJfaW1wbDo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDMzOworICBwdWIgY29uc3QgUmVwZWF0UGFyY2VsRmlsZURlc2NyaXB0b3I6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzNDsKKyAgcHViIGNvbnN0IFJldmVyc2VQYXJjZWxGaWxlRGVzY3JpcHRvckFycmF5OiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzU7CisgIHB1YiBjb25zdCBUaHJvd1NlcnZpY2VFeGNlcHRpb246IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzNjsKKyAgcHViIGNvbnN0IFJlcGVhdE51bGxhYmxlSW50QXJyYXk6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzNzsKKyAgcHViIGNvbnN0IFJlcGVhdE51bGxhYmxlQnl0ZUVudW1BcnJheTogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpiaW5kZXJfaW1wbDo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDM4OworICBwdWIgY29uc3QgUmVwZWF0TnVsbGFibGVJbnRFbnVtQXJyYXk6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzOTsKKyAgcHViIGNvbnN0IFJlcGVhdE51bGxhYmxlTG9uZ0VudW1BcnJheTogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpiaW5kZXJfaW1wbDo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQwOworICBwdWIgY29uc3QgUmVwZWF0TnVsbGFibGVTdHJpbmc6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0MTsKKyAgcHViIGNvbnN0IFJlcGVhdE51bGxhYmxlU3RyaW5nTGlzdDogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpiaW5kZXJfaW1wbDo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQyOworICBwdWIgY29uc3QgUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDM7CisgIHB1YiBjb25zdCBSZXBlYXROdWxsYWJsZVBhcmNlbGFibGVBcnJheTogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpiaW5kZXJfaW1wbDo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQ0OworICBwdWIgY29uc3QgUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlTGlzdDogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpiaW5kZXJfaW1wbDo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQ1OworICBwdWIgY29uc3QgVGFrZXNBbklCaW5kZXI6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0NjsKKyAgcHViIGNvbnN0IFRha2VzQU51bGxhYmxlSUJpbmRlcjogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpiaW5kZXJfaW1wbDo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQ3OworICBwdWIgY29uc3QgVGFrZXNBbklCaW5kZXJMaXN0OiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDg7CisgIHB1YiBjb25zdCBUYWtlc0FOdWxsYWJsZUlCaW5kZXJMaXN0OiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDk7CisgIHB1YiBjb25zdCBSZXBlYXRVdGY4Q3BwU3RyaW5nOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNTA7CisgIHB1YiBjb25zdCBSZXBlYXROdWxsYWJsZVV0ZjhDcHBTdHJpbmc6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1MTsKKyAgcHViIGNvbnN0IFJldmVyc2VVdGY4Q3BwU3RyaW5nOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNTI7CisgIHB1YiBjb25zdCBSZXZlcnNlTnVsbGFibGVVdGY4Q3BwU3RyaW5nOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNTM7CisgIHB1YiBjb25zdCBSZXZlcnNlVXRmOENwcFN0cmluZ0xpc3Q6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1NDsKKyAgcHViIGNvbnN0IEdldENhbGxiYWNrOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNTU7CisgIHB1YiBjb25zdCBGaWxsT3V0U3RydWN0dXJlZFBhcmNlbGFibGU6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1NjsKKyAgcHViIGNvbnN0IFJlcGVhdEV4dGVuZGFibGVQYXJjZWxhYmxlOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNTc7CisgIHB1YiBjb25zdCBSZXZlcnNlTGlzdDogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpiaW5kZXJfaW1wbDo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDU4OworICBwdWIgY29uc3QgUmV2ZXJzZUlCaW5kZXJBcnJheTogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpiaW5kZXJfaW1wbDo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDU5OworICBwdWIgY29uc3QgUmV2ZXJzZU51bGxhYmxlSUJpbmRlckFycmF5OiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNjA7CisgIHB1YiBjb25zdCBHZXRPbGROYW1lSW50ZXJmYWNlOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNjE7CisgIHB1YiBjb25zdCBHZXROZXdOYW1lSW50ZXJmYWNlOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNjI7CisgIHB1YiBjb25zdCBHZXRVbmlvblRhZ3M6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA2MzsKKyAgcHViIGNvbnN0IEdldENwcEphdmFUZXN0czogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpiaW5kZXJfaW1wbDo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDY0OworICBwdWIgY29uc3QgZ2V0QmFja2VuZFR5cGU6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA2NTsKIH0KIHB1YiB0eXBlIElUZXN0U2VydmljZURlZmF1bHRSZWYgPSBPcHRpb248c3RkOjpzeW5jOjpBcmM8ZHluIElUZXN0U2VydmljZURlZmF1bHQ+PjsKIHVzZSBsYXp5X3N0YXRpYzo6bGF6eV9zdGF0aWM7CkBAIC0zNTcsMTQgKzc5OSwxNCBAQAogcHViIGNvbnN0IEE1NTogaTMyID0gMTsKIHB1YiBjb25zdCBBNTY6IGkzMiA9IDE7CiBwdWIgY29uc3QgQTU3OiBpMzIgPSAxOwotcHViKGNyYXRlKSBtb2QgbWFuZ2xlZCB7IHB1YiB1c2Ugc3VwZXI6OklUZXN0U2VydmljZSBhcyBfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZTsgfQotaW1wbCBJVGVzdFNlcnZpY2UgZm9yIEJwVGVzdFNlcnZpY2UgewotICBmbiBVbmltcGxlbWVudGVkTWV0aG9kKCZzZWxmLCBfYXJnX2FyZzogaTMyKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxpMzI+IHsKLSAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci50cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlVuaW1wbGVtZW50ZWRNZXRob2QsIGJpbmRlcjo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OkZMQUdfUFJJVkFURV9MT0NBTCwgfF9haWRsX2RhdGF8IHsKLSAgICAgIF9haWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKLSAgICAgIF9haWRsX2RhdGEud3JpdGUoJl9hcmdfYXJnKT87Ci0gICAgICBPaygoKSkKLSAgICB9KTsKK2ltcGwgQnBUZXN0U2VydmljZSB7CisgIGZuIGJ1aWxkX3BhcmNlbF9VbmltcGxlbWVudGVkTWV0aG9kKCZzZWxmLCBfYXJnX2FyZzogaTMyKSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7CisgICAgYWlkbF9kYXRhLndyaXRlKCZfYXJnX2FyZyk/OworICAgIE9rKGFpZGxfZGF0YSkKKyAgfQorICBmbiByZWFkX3Jlc3BvbnNlX1VuaW1wbGVtZW50ZWRNZXRob2QoJnNlbGYsIF9hcmdfYXJnOiBpMzIsIF9haWRsX3JlcGx5OiBzdGQ6OnJlc3VsdDo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbCwgYmluZGVyOjpTdGF0dXNDb2RlPikgLT4gYmluZGVyOjpSZXN1bHQ8aTMyPiB7CiAgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgewogICAgICAgaWYgbGV0IFNvbWUoX2FpZGxfZGVmYXVsdF9pbXBsKSA9IDxTZWxmIGFzIElUZXN0U2VydmljZT46OmdldERlZmF1bHRJbXBsKCkgewogICAgICAgICByZXR1cm4gX2FpZGxfZGVmYXVsdF9pbXBsLlVuaW1wbGVtZW50ZWRNZXRob2QoX2FyZ19hcmcpOwpAQCAtMzc2LDExICs4MTgsMTIgQEAKICAgICBsZXQgX2FpZGxfcmV0dXJuOiBpMzIgPSBfYWlkbF9yZXBseS5yZWFkKCk/OwogICAgIE9rKF9haWRsX3JldHVybikKICAgfQotICBmbiBEZXByZWNhdGVkKCZzZWxmKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDwoKT4gewotICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnRyYW5zYWN0KHRyYW5zYWN0aW9uczo6RGVwcmVjYXRlZCwgYmluZGVyOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6RkxBR19QUklWQVRFX0xPQ0FMLCB8X2FpZGxfZGF0YXwgewotICAgICAgX2FpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOwotICAgICAgT2soKCkpCi0gICAgfSk7CisgIGZuIGJ1aWxkX3BhcmNlbF9EZXByZWNhdGVkKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfRGVwcmVjYXRlZCgmc2VsZiwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4gewogICAgIGlmIGxldCBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKSA9IF9haWRsX3JlcGx5IHsKICAgICAgIGlmIGxldCBTb21lKF9haWRsX2RlZmF1bHRfaW1wbCkgPSA8U2VsZiBhcyBJVGVzdFNlcnZpY2U+OjpnZXREZWZhdWx0SW1wbCgpIHsKICAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5EZXByZWNhdGVkKCk7CkBAIC0zOTEsMTEgKzgzNCwxMiBAQAogICAgIGlmICFfYWlkbF9zdGF0dXMuaXNfb2soKSB7IHJldHVybiBFcnIoX2FpZGxfc3RhdHVzKTsgfQogICAgIE9rKCgpKQogICB9Ci0gIGZuIFRlc3RPbmV3YXkoJnNlbGYpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PCgpPiB7Ci0gICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIudHJhbnNhY3QodHJhbnNhY3Rpb25zOjpUZXN0T25ld2F5LCBiaW5kZXI6OkZMQUdfT05FV0FZIHwgYmluZGVyOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6RkxBR19QUklWQVRFX0xPQ0FMLCB8X2FpZGxfZGF0YXwgewotICAgICAgX2FpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOwotICAgICAgT2soKCkpCi0gICAgfSk7CisgIGZuIGJ1aWxkX3BhcmNlbF9UZXN0T25ld2F5KCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfVGVzdE9uZXdheSgmc2VsZiwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4gewogICAgIGlmIGxldCBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKSA9IF9haWRsX3JlcGx5IHsKICAgICAgIGlmIGxldCBTb21lKF9haWRsX2RlZmF1bHRfaW1wbCkgPSA8U2VsZiBhcyBJVGVzdFNlcnZpY2U+OjpnZXREZWZhdWx0SW1wbCgpIHsKICAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5UZXN0T25ld2F5KCk7CkBAIC00MDQsMTIgKzg0OCwxMyBAQAogICAgIGxldCBfYWlkbF9yZXBseSA9IF9haWRsX3JlcGx5PzsKICAgICBPaygoKSkKICAgfQotICBmbiBSZXBlYXRCb29sZWFuKCZzZWxmLCBfYXJnX3Rva2VuOiBib29sKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxib29sPiB7Ci0gICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIudHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXBlYXRCb29sZWFuLCBiaW5kZXI6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpGTEFHX1BSSVZBVEVfTE9DQUwsIHxfYWlkbF9kYXRhfCB7Ci0gICAgICBfYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7Ci0gICAgICBfYWlkbF9kYXRhLndyaXRlKCZfYXJnX3Rva2VuKT87Ci0gICAgICBPaygoKSkKLSAgICB9KTsKKyAgZm4gYnVpbGRfcGFyY2VsX1JlcGVhdEJvb2xlYW4oJnNlbGYsIF9hcmdfdG9rZW46IGJvb2wpIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbD4geworICAgIGxldCBtdXQgYWlkbF9kYXRhID0gc2VsZi5iaW5kZXIucHJlcGFyZV90cmFuc2FjdCgpPzsKKyAgICBhaWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKKyAgICBhaWRsX2RhdGEud3JpdGUoJl9hcmdfdG9rZW4pPzsKKyAgICBPayhhaWRsX2RhdGEpCisgIH0KKyAgZm4gcmVhZF9yZXNwb25zZV9SZXBlYXRCb29sZWFuKCZzZWxmLCBfYXJnX3Rva2VuOiBib29sLCBfYWlkbF9yZXBseTogc3RkOjpyZXN1bHQ6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWwsIGJpbmRlcjo6U3RhdHVzQ29kZT4pIC0+IGJpbmRlcjo6UmVzdWx0PGJvb2w+IHsKICAgICBpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7CiAgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSVRlc3RTZXJ2aWNlPjo6Z2V0RGVmYXVsdEltcGwoKSB7CiAgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwuUmVwZWF0Qm9vbGVhbihfYXJnX3Rva2VuKTsKQEAgLTQyMSwxMiArODY2LDEzIEBACiAgICAgbGV0IF9haWRsX3JldHVybjogYm9vbCA9IF9haWRsX3JlcGx5LnJlYWQoKT87CiAgICAgT2soX2FpZGxfcmV0dXJuKQogICB9Ci0gIGZuIFJlcGVhdEJ5dGUoJnNlbGYsIF9hcmdfdG9rZW46IGk4KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxpOD4gewotICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnRyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0Qnl0ZSwgYmluZGVyOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6RkxBR19QUklWQVRFX0xPQ0FMLCB8X2FpZGxfZGF0YXwgewotICAgICAgX2FpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOwotICAgICAgX2FpZGxfZGF0YS53cml0ZSgmX2FyZ190b2tlbik/OwotICAgICAgT2soKCkpCi0gICAgfSk7CisgIGZuIGJ1aWxkX3BhcmNlbF9SZXBlYXRCeXRlKCZzZWxmLCBfYXJnX3Rva2VuOiBpOCkgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsPiB7CisgICAgbGV0IG11dCBhaWRsX2RhdGEgPSBzZWxmLmJpbmRlci5wcmVwYXJlX3RyYW5zYWN0KCk/OworICAgIGFpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOworICAgIGFpZGxfZGF0YS53cml0ZSgmX2FyZ190b2tlbik/OworICAgIE9rKGFpZGxfZGF0YSkKKyAgfQorICBmbiByZWFkX3Jlc3BvbnNlX1JlcGVhdEJ5dGUoJnNlbGYsIF9hcmdfdG9rZW46IGk4LCBfYWlkbF9yZXBseTogc3RkOjpyZXN1bHQ6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWwsIGJpbmRlcjo6U3RhdHVzQ29kZT4pIC0+IGJpbmRlcjo6UmVzdWx0PGk4PiB7CiAgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgewogICAgICAgaWYgbGV0IFNvbWUoX2FpZGxfZGVmYXVsdF9pbXBsKSA9IDxTZWxmIGFzIElUZXN0U2VydmljZT46OmdldERlZmF1bHRJbXBsKCkgewogICAgICAgICByZXR1cm4gX2FpZGxfZGVmYXVsdF9pbXBsLlJlcGVhdEJ5dGUoX2FyZ190b2tlbik7CkBAIC00MzgsMTIgKzg4NCwxMyBAQAogICAgIGxldCBfYWlkbF9yZXR1cm46IGk4ID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKICAgICBPayhfYWlkbF9yZXR1cm4pCiAgIH0KLSAgZm4gUmVwZWF0Q2hhcigmc2VsZiwgX2FyZ190b2tlbjogdTE2KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDx1MTY+IHsKLSAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci50cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlcGVhdENoYXIsIGJpbmRlcjo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OkZMQUdfUFJJVkFURV9MT0NBTCwgfF9haWRsX2RhdGF8IHsKLSAgICAgIF9haWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKLSAgICAgIF9haWRsX2RhdGEud3JpdGUoJl9hcmdfdG9rZW4pPzsKLSAgICAgIE9rKCgpKQotICAgIH0pOworICBmbiBidWlsZF9wYXJjZWxfUmVwZWF0Q2hhcigmc2VsZiwgX2FyZ190b2tlbjogdTE2KSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7CisgICAgYWlkbF9kYXRhLndyaXRlKCZfYXJnX3Rva2VuKT87CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfUmVwZWF0Q2hhcigmc2VsZiwgX2FyZ190b2tlbjogdTE2LCBfYWlkbF9yZXBseTogc3RkOjpyZXN1bHQ6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWwsIGJpbmRlcjo6U3RhdHVzQ29kZT4pIC0+IGJpbmRlcjo6UmVzdWx0PHUxNj4gewogICAgIGlmIGxldCBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKSA9IF9haWRsX3JlcGx5IHsKICAgICAgIGlmIGxldCBTb21lKF9haWRsX2RlZmF1bHRfaW1wbCkgPSA8U2VsZiBhcyBJVGVzdFNlcnZpY2U+OjpnZXREZWZhdWx0SW1wbCgpIHsKICAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5SZXBlYXRDaGFyKF9hcmdfdG9rZW4pOwpAQCAtNDU1LDEyICs5MDIsMTMgQEAKICAgICBsZXQgX2FpZGxfcmV0dXJuOiB1MTYgPSBfYWlkbF9yZXBseS5yZWFkKCk/OwogICAgIE9rKF9haWRsX3JldHVybikKICAgfQotICBmbiBSZXBlYXRJbnQoJnNlbGYsIF9hcmdfdG9rZW46IGkzMikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8aTMyPiB7Ci0gICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIudHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXBlYXRJbnQsIGJpbmRlcjo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OkZMQUdfUFJJVkFURV9MT0NBTCwgfF9haWRsX2RhdGF8IHsKLSAgICAgIF9haWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKLSAgICAgIF9haWRsX2RhdGEud3JpdGUoJl9hcmdfdG9rZW4pPzsKLSAgICAgIE9rKCgpKQotICAgIH0pOworICBmbiBidWlsZF9wYXJjZWxfUmVwZWF0SW50KCZzZWxmLCBfYXJnX3Rva2VuOiBpMzIpIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbD4geworICAgIGxldCBtdXQgYWlkbF9kYXRhID0gc2VsZi5iaW5kZXIucHJlcGFyZV90cmFuc2FjdCgpPzsKKyAgICBhaWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKKyAgICBhaWRsX2RhdGEud3JpdGUoJl9hcmdfdG9rZW4pPzsKKyAgICBPayhhaWRsX2RhdGEpCisgIH0KKyAgZm4gcmVhZF9yZXNwb25zZV9SZXBlYXRJbnQoJnNlbGYsIF9hcmdfdG9rZW46IGkzMiwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDxpMzI+IHsKICAgICBpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7CiAgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSVRlc3RTZXJ2aWNlPjo6Z2V0RGVmYXVsdEltcGwoKSB7CiAgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwuUmVwZWF0SW50KF9hcmdfdG9rZW4pOwpAQCAtNDcyLDEyICs5MjAsMTMgQEAKICAgICBsZXQgX2FpZGxfcmV0dXJuOiBpMzIgPSBfYWlkbF9yZXBseS5yZWFkKCk/OwogICAgIE9rKF9haWRsX3JldHVybikKICAgfQotICBmbiBSZXBlYXRMb25nKCZzZWxmLCBfYXJnX3Rva2VuOiBpNjQpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PGk2ND4gewotICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnRyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0TG9uZywgYmluZGVyOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6RkxBR19QUklWQVRFX0xPQ0FMLCB8X2FpZGxfZGF0YXwgewotICAgICAgX2FpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOwotICAgICAgX2FpZGxfZGF0YS53cml0ZSgmX2FyZ190b2tlbik/OwotICAgICAgT2soKCkpCi0gICAgfSk7CisgIGZuIGJ1aWxkX3BhcmNlbF9SZXBlYXRMb25nKCZzZWxmLCBfYXJnX3Rva2VuOiBpNjQpIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbD4geworICAgIGxldCBtdXQgYWlkbF9kYXRhID0gc2VsZi5iaW5kZXIucHJlcGFyZV90cmFuc2FjdCgpPzsKKyAgICBhaWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKKyAgICBhaWRsX2RhdGEud3JpdGUoJl9hcmdfdG9rZW4pPzsKKyAgICBPayhhaWRsX2RhdGEpCisgIH0KKyAgZm4gcmVhZF9yZXNwb25zZV9SZXBlYXRMb25nKCZzZWxmLCBfYXJnX3Rva2VuOiBpNjQsIF9haWRsX3JlcGx5OiBzdGQ6OnJlc3VsdDo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbCwgYmluZGVyOjpTdGF0dXNDb2RlPikgLT4gYmluZGVyOjpSZXN1bHQ8aTY0PiB7CiAgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgewogICAgICAgaWYgbGV0IFNvbWUoX2FpZGxfZGVmYXVsdF9pbXBsKSA9IDxTZWxmIGFzIElUZXN0U2VydmljZT46OmdldERlZmF1bHRJbXBsKCkgewogICAgICAgICByZXR1cm4gX2FpZGxfZGVmYXVsdF9pbXBsLlJlcGVhdExvbmcoX2FyZ190b2tlbik7CkBAIC00ODksMTIgKzkzOCwxMyBAQAogICAgIGxldCBfYWlkbF9yZXR1cm46IGk2NCA9IF9haWRsX3JlcGx5LnJlYWQoKT87CiAgICAgT2soX2FpZGxfcmV0dXJuKQogICB9Ci0gIGZuIFJlcGVhdEZsb2F0KCZzZWxmLCBfYXJnX3Rva2VuOiBmMzIpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PGYzMj4gewotICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnRyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0RmxvYXQsIGJpbmRlcjo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OkZMQUdfUFJJVkFURV9MT0NBTCwgfF9haWRsX2RhdGF8IHsKLSAgICAgIF9haWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKLSAgICAgIF9haWRsX2RhdGEud3JpdGUoJl9hcmdfdG9rZW4pPzsKLSAgICAgIE9rKCgpKQotICAgIH0pOworICBmbiBidWlsZF9wYXJjZWxfUmVwZWF0RmxvYXQoJnNlbGYsIF9hcmdfdG9rZW46IGYzMikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsPiB7CisgICAgbGV0IG11dCBhaWRsX2RhdGEgPSBzZWxmLmJpbmRlci5wcmVwYXJlX3RyYW5zYWN0KCk/OworICAgIGFpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOworICAgIGFpZGxfZGF0YS53cml0ZSgmX2FyZ190b2tlbik/OworICAgIE9rKGFpZGxfZGF0YSkKKyAgfQorICBmbiByZWFkX3Jlc3BvbnNlX1JlcGVhdEZsb2F0KCZzZWxmLCBfYXJnX3Rva2VuOiBmMzIsIF9haWRsX3JlcGx5OiBzdGQ6OnJlc3VsdDo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbCwgYmluZGVyOjpTdGF0dXNDb2RlPikgLT4gYmluZGVyOjpSZXN1bHQ8ZjMyPiB7CiAgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgewogICAgICAgaWYgbGV0IFNvbWUoX2FpZGxfZGVmYXVsdF9pbXBsKSA9IDxTZWxmIGFzIElUZXN0U2VydmljZT46OmdldERlZmF1bHRJbXBsKCkgewogICAgICAgICByZXR1cm4gX2FpZGxfZGVmYXVsdF9pbXBsLlJlcGVhdEZsb2F0KF9hcmdfdG9rZW4pOwpAQCAtNTA2LDEyICs5NTYsMTMgQEAKICAgICBsZXQgX2FpZGxfcmV0dXJuOiBmMzIgPSBfYWlkbF9yZXBseS5yZWFkKCk/OwogICAgIE9rKF9haWRsX3JldHVybikKICAgfQotICBmbiBSZXBlYXREb3VibGUoJnNlbGYsIF9hcmdfdG9rZW46IGY2NCkgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8ZjY0PiB7Ci0gICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIudHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXBlYXREb3VibGUsIGJpbmRlcjo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OkZMQUdfUFJJVkFURV9MT0NBTCwgfF9haWRsX2RhdGF8IHsKLSAgICAgIF9haWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKLSAgICAgIF9haWRsX2RhdGEud3JpdGUoJl9hcmdfdG9rZW4pPzsKLSAgICAgIE9rKCgpKQotICAgIH0pOworICBmbiBidWlsZF9wYXJjZWxfUmVwZWF0RG91YmxlKCZzZWxmLCBfYXJnX3Rva2VuOiBmNjQpIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbD4geworICAgIGxldCBtdXQgYWlkbF9kYXRhID0gc2VsZi5iaW5kZXIucHJlcGFyZV90cmFuc2FjdCgpPzsKKyAgICBhaWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKKyAgICBhaWRsX2RhdGEud3JpdGUoJl9hcmdfdG9rZW4pPzsKKyAgICBPayhhaWRsX2RhdGEpCisgIH0KKyAgZm4gcmVhZF9yZXNwb25zZV9SZXBlYXREb3VibGUoJnNlbGYsIF9hcmdfdG9rZW46IGY2NCwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDxmNjQ+IHsKICAgICBpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7CiAgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSVRlc3RTZXJ2aWNlPjo6Z2V0RGVmYXVsdEltcGwoKSB7CiAgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwuUmVwZWF0RG91YmxlKF9hcmdfdG9rZW4pOwpAQCAtNTIzLDEyICs5NzQsMTMgQEAKICAgICBsZXQgX2FpZGxfcmV0dXJuOiBmNjQgPSBfYWlkbF9yZXBseS5yZWFkKCk/OwogICAgIE9rKF9haWRsX3JldHVybikKICAgfQotICBmbiBSZXBlYXRTdHJpbmcoJnNlbGYsIF9hcmdfdG9rZW46ICZzdHIpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PFN0cmluZz4gewotICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnRyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0U3RyaW5nLCBiaW5kZXI6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpGTEFHX1BSSVZBVEVfTE9DQUwsIHxfYWlkbF9kYXRhfCB7Ci0gICAgICBfYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7Ci0gICAgICBfYWlkbF9kYXRhLndyaXRlKF9hcmdfdG9rZW4pPzsKLSAgICAgIE9rKCgpKQotICAgIH0pOworICBmbiBidWlsZF9wYXJjZWxfUmVwZWF0U3RyaW5nKCZzZWxmLCBfYXJnX3Rva2VuOiAmc3RyKSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7CisgICAgYWlkbF9kYXRhLndyaXRlKF9hcmdfdG9rZW4pPzsKKyAgICBPayhhaWRsX2RhdGEpCisgIH0KKyAgZm4gcmVhZF9yZXNwb25zZV9SZXBlYXRTdHJpbmcoJnNlbGYsIF9hcmdfdG9rZW46ICZzdHIsIF9haWRsX3JlcGx5OiBzdGQ6OnJlc3VsdDo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbCwgYmluZGVyOjpTdGF0dXNDb2RlPikgLT4gYmluZGVyOjpSZXN1bHQ8U3RyaW5nPiB7CiAgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgewogICAgICAgaWYgbGV0IFNvbWUoX2FpZGxfZGVmYXVsdF9pbXBsKSA9IDxTZWxmIGFzIElUZXN0U2VydmljZT46OmdldERlZmF1bHRJbXBsKCkgewogICAgICAgICByZXR1cm4gX2FpZGxfZGVmYXVsdF9pbXBsLlJlcGVhdFN0cmluZyhfYXJnX3Rva2VuKTsKQEAgLTU0MCwxMiArOTkyLDEzIEBACiAgICAgbGV0IF9haWRsX3JldHVybjogU3RyaW5nID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKICAgICBPayhfYWlkbF9yZXR1cm4pCiAgIH0KLSAgZm4gUmVwZWF0Qnl0ZUVudW0oJnNlbGYsIF9hcmdfdG9rZW46IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW0pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW0+IHsKLSAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci50cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlcGVhdEJ5dGVFbnVtLCBiaW5kZXI6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpGTEFHX1BSSVZBVEVfTE9DQUwsIHxfYWlkbF9kYXRhfCB7Ci0gICAgICBfYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7Ci0gICAgICBfYWlkbF9kYXRhLndyaXRlKCZfYXJnX3Rva2VuKT87Ci0gICAgICBPaygoKSkKLSAgICB9KTsKKyAgZm4gYnVpbGRfcGFyY2VsX1JlcGVhdEJ5dGVFbnVtKCZzZWxmLCBfYXJnX3Rva2VuOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtKSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7CisgICAgYWlkbF9kYXRhLndyaXRlKCZfYXJnX3Rva2VuKT87CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfUmVwZWF0Qnl0ZUVudW0oJnNlbGYsIF9hcmdfdG9rZW46IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW0sIF9haWRsX3JlcGx5OiBzdGQ6OnJlc3VsdDo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbCwgYmluZGVyOjpTdGF0dXNDb2RlPikgLT4gYmluZGVyOjpSZXN1bHQ8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bT4gewogICAgIGlmIGxldCBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKSA9IF9haWRsX3JlcGx5IHsKICAgICAgIGlmIGxldCBTb21lKF9haWRsX2RlZmF1bHRfaW1wbCkgPSA8U2VsZiBhcyBJVGVzdFNlcnZpY2U+OjpnZXREZWZhdWx0SW1wbCgpIHsKICAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5SZXBlYXRCeXRlRW51bShfYXJnX3Rva2VuKTsKQEAgLTU1NywxMiArMTAxMCwxMyBAQAogICAgIGxldCBfYWlkbF9yZXR1cm46IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW0gPSBfYWlkbF9yZXBseS5yZWFkKCk/OwogICAgIE9rKF9haWRsX3JldHVybikKICAgfQotICBmbiBSZXBlYXRJbnRFbnVtKCZzZWxmLCBfYXJnX3Rva2VuOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW0pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bT4gewotICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnRyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0SW50RW51bSwgYmluZGVyOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6RkxBR19QUklWQVRFX0xPQ0FMLCB8X2FpZGxfZGF0YXwgewotICAgICAgX2FpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOwotICAgICAgX2FpZGxfZGF0YS53cml0ZSgmX2FyZ190b2tlbik/OwotICAgICAgT2soKCkpCi0gICAgfSk7CisgIGZuIGJ1aWxkX3BhcmNlbF9SZXBlYXRJbnRFbnVtKCZzZWxmLCBfYXJnX3Rva2VuOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW0pIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbD4geworICAgIGxldCBtdXQgYWlkbF9kYXRhID0gc2VsZi5iaW5kZXIucHJlcGFyZV90cmFuc2FjdCgpPzsKKyAgICBhaWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKKyAgICBhaWRsX2RhdGEud3JpdGUoJl9hcmdfdG9rZW4pPzsKKyAgICBPayhhaWRsX2RhdGEpCisgIH0KKyAgZm4gcmVhZF9yZXNwb25zZV9SZXBlYXRJbnRFbnVtKCZzZWxmLCBfYXJnX3Rva2VuOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW0sIF9haWRsX3JlcGx5OiBzdGQ6OnJlc3VsdDo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbCwgYmluZGVyOjpTdGF0dXNDb2RlPikgLT4gYmluZGVyOjpSZXN1bHQ8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtPiB7CiAgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgewogICAgICAgaWYgbGV0IFNvbWUoX2FpZGxfZGVmYXVsdF9pbXBsKSA9IDxTZWxmIGFzIElUZXN0U2VydmljZT46OmdldERlZmF1bHRJbXBsKCkgewogICAgICAgICByZXR1cm4gX2FpZGxfZGVmYXVsdF9pbXBsLlJlcGVhdEludEVudW0oX2FyZ190b2tlbik7CkBAIC01NzQsMTIgKzEwMjgsMTMgQEAKICAgICBsZXQgX2FpZGxfcmV0dXJuOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW0gPSBfYWlkbF9yZXBseS5yZWFkKCk/OwogICAgIE9rKF9haWRsX3JldHVybikKICAgfQotICBmbiBSZXBlYXRMb25nRW51bSgmc2VsZiwgX2FyZ190b2tlbjogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bSkgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bT4gewotICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnRyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0TG9uZ0VudW0sIGJpbmRlcjo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OkZMQUdfUFJJVkFURV9MT0NBTCwgfF9haWRsX2RhdGF8IHsKLSAgICAgIF9haWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKLSAgICAgIF9haWRsX2RhdGEud3JpdGUoJl9hcmdfdG9rZW4pPzsKLSAgICAgIE9rKCgpKQotICAgIH0pOworICBmbiBidWlsZF9wYXJjZWxfUmVwZWF0TG9uZ0VudW0oJnNlbGYsIF9hcmdfdG9rZW46IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW0pIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbD4geworICAgIGxldCBtdXQgYWlkbF9kYXRhID0gc2VsZi5iaW5kZXIucHJlcGFyZV90cmFuc2FjdCgpPzsKKyAgICBhaWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKKyAgICBhaWRsX2RhdGEud3JpdGUoJl9hcmdfdG9rZW4pPzsKKyAgICBPayhhaWRsX2RhdGEpCisgIH0KKyAgZm4gcmVhZF9yZXNwb25zZV9SZXBlYXRMb25nRW51bSgmc2VsZiwgX2FyZ190b2tlbjogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bSwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtPiB7CiAgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgewogICAgICAgaWYgbGV0IFNvbWUoX2FpZGxfZGVmYXVsdF9pbXBsKSA9IDxTZWxmIGFzIElUZXN0U2VydmljZT46OmdldERlZmF1bHRJbXBsKCkgewogICAgICAgICByZXR1cm4gX2FpZGxfZGVmYXVsdF9pbXBsLlJlcGVhdExvbmdFbnVtKF9hcmdfdG9rZW4pOwpAQCAtNTkxLDEzICsxMDQ2LDE0IEBACiAgICAgbGV0IF9haWRsX3JldHVybjogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bSA9IF9haWRsX3JlcGx5LnJlYWQoKT87CiAgICAgT2soX2FpZGxfcmV0dXJuKQogICB9Ci0gIGZuIFJldmVyc2VCb29sZWFuKCZzZWxmLCBfYXJnX2lucHV0OiAmW2Jvb2xdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxib29sPikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8VmVjPGJvb2w+PiB7Ci0gICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIudHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXZlcnNlQm9vbGVhbiwgYmluZGVyOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6RkxBR19QUklWQVRFX0xPQ0FMLCB8X2FpZGxfZGF0YXwgewotICAgICAgX2FpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOwotICAgICAgX2FpZGxfZGF0YS53cml0ZShfYXJnX2lucHV0KT87Ci0gICAgICBfYWlkbF9kYXRhLndyaXRlX3NsaWNlX3NpemUoU29tZShfYXJnX3JlcGVhdGVkKSk/OwotICAgICAgT2soKCkpCi0gICAgfSk7CisgIGZuIGJ1aWxkX3BhcmNlbF9SZXZlcnNlQm9vbGVhbigmc2VsZiwgX2FyZ19pbnB1dDogJltib29sXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8Ym9vbD4pIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbD4geworICAgIGxldCBtdXQgYWlkbF9kYXRhID0gc2VsZi5iaW5kZXIucHJlcGFyZV90cmFuc2FjdCgpPzsKKyAgICBhaWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKKyAgICBhaWRsX2RhdGEud3JpdGUoX2FyZ19pbnB1dCk/OworICAgIGFpZGxfZGF0YS53cml0ZV9zbGljZV9zaXplKFNvbWUoX2FyZ19yZXBlYXRlZCkpPzsKKyAgICBPayhhaWRsX2RhdGEpCisgIH0KKyAgZm4gcmVhZF9yZXNwb25zZV9SZXZlcnNlQm9vbGVhbigmc2VsZiwgX2FyZ19pbnB1dDogJltib29sXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8Ym9vbD4sIF9haWRsX3JlcGx5OiBzdGQ6OnJlc3VsdDo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbCwgYmluZGVyOjpTdGF0dXNDb2RlPikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPGJvb2w+PiB7CiAgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgewogICAgICAgaWYgbGV0IFNvbWUoX2FpZGxfZGVmYXVsdF9pbXBsKSA9IDxTZWxmIGFzIElUZXN0U2VydmljZT46OmdldERlZmF1bHRJbXBsKCkgewogICAgICAgICByZXR1cm4gX2FpZGxfZGVmYXVsdF9pbXBsLlJldmVyc2VCb29sZWFuKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpOwpAQCAtNjA3LDE2ICsxMDYzLDE3IEBACiAgICAgbGV0IF9haWRsX3N0YXR1czogYmluZGVyOjpTdGF0dXMgPSBfYWlkbF9yZXBseS5yZWFkKCk/OwogICAgIGlmICFfYWlkbF9zdGF0dXMuaXNfb2soKSB7IHJldHVybiBFcnIoX2FpZGxfc3RhdHVzKTsgfQogICAgIGxldCBfYWlkbF9yZXR1cm46IFZlYzxib29sPiA9IF9haWRsX3JlcGx5LnJlYWQoKT87Ci0gICAgKl9hcmdfcmVwZWF0ZWQgPSBfYWlkbF9yZXBseS5yZWFkKCk/OworICAgIF9haWRsX3JlcGx5LnJlYWRfb250byhfYXJnX3JlcGVhdGVkKT87CiAgICAgT2soX2FpZGxfcmV0dXJuKQogICB9Ci0gIGZuIFJldmVyc2VCeXRlKCZzZWxmLCBfYXJnX2lucHV0OiAmW3U4XSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8dTg+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxWZWM8dTg+PiB7Ci0gICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIudHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXZlcnNlQnl0ZSwgYmluZGVyOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6RkxBR19QUklWQVRFX0xPQ0FMLCB8X2FpZGxfZGF0YXwgewotICAgICAgX2FpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOwotICAgICAgX2FpZGxfZGF0YS53cml0ZShfYXJnX2lucHV0KT87Ci0gICAgICBfYWlkbF9kYXRhLndyaXRlX3NsaWNlX3NpemUoU29tZShfYXJnX3JlcGVhdGVkKSk/OwotICAgICAgT2soKCkpCi0gICAgfSk7CisgIGZuIGJ1aWxkX3BhcmNlbF9SZXZlcnNlQnl0ZSgmc2VsZiwgX2FyZ19pbnB1dDogJlt1OF0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPHU4PikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsPiB7CisgICAgbGV0IG11dCBhaWRsX2RhdGEgPSBzZWxmLmJpbmRlci5wcmVwYXJlX3RyYW5zYWN0KCk/OworICAgIGFpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOworICAgIGFpZGxfZGF0YS53cml0ZShfYXJnX2lucHV0KT87CisgICAgYWlkbF9kYXRhLndyaXRlX3NsaWNlX3NpemUoU29tZShfYXJnX3JlcGVhdGVkKSk/OworICAgIE9rKGFpZGxfZGF0YSkKKyAgfQorICBmbiByZWFkX3Jlc3BvbnNlX1JldmVyc2VCeXRlKCZzZWxmLCBfYXJnX2lucHV0OiAmW3U4XSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8dTg+LCBfYWlkbF9yZXBseTogc3RkOjpyZXN1bHQ6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWwsIGJpbmRlcjo6U3RhdHVzQ29kZT4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzx1OD4+IHsKICAgICBpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7CiAgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSVRlc3RTZXJ2aWNlPjo6Z2V0RGVmYXVsdEltcGwoKSB7CiAgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwuUmV2ZXJzZUJ5dGUoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCk7CkBAIC02MjYsMTYgKzEwODMsMTcgQEAKICAgICBsZXQgX2FpZGxfc3RhdHVzOiBiaW5kZXI6OlN0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWQoKT87CiAgICAgaWYgIV9haWRsX3N0YXR1cy5pc19vaygpIHsgcmV0dXJuIEVycihfYWlkbF9zdGF0dXMpOyB9CiAgICAgbGV0IF9haWRsX3JldHVybjogVmVjPHU4PiA9IF9haWRsX3JlcGx5LnJlYWQoKT87Ci0gICAgKl9hcmdfcmVwZWF0ZWQgPSBfYWlkbF9yZXBseS5yZWFkKCk/OworICAgIF9haWRsX3JlcGx5LnJlYWRfb250byhfYXJnX3JlcGVhdGVkKT87CiAgICAgT2soX2FpZGxfcmV0dXJuKQogICB9Ci0gIGZuIFJldmVyc2VDaGFyKCZzZWxmLCBfYXJnX2lucHV0OiAmW3UxNl0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPHUxNj4pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PFZlYzx1MTY+PiB7Ci0gICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIudHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXZlcnNlQ2hhciwgYmluZGVyOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6RkxBR19QUklWQVRFX0xPQ0FMLCB8X2FpZGxfZGF0YXwgewotICAgICAgX2FpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOwotICAgICAgX2FpZGxfZGF0YS53cml0ZShfYXJnX2lucHV0KT87Ci0gICAgICBfYWlkbF9kYXRhLndyaXRlX3NsaWNlX3NpemUoU29tZShfYXJnX3JlcGVhdGVkKSk/OwotICAgICAgT2soKCkpCi0gICAgfSk7CisgIGZuIGJ1aWxkX3BhcmNlbF9SZXZlcnNlQ2hhcigmc2VsZiwgX2FyZ19pbnB1dDogJlt1MTZdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzx1MTY+KSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7CisgICAgYWlkbF9kYXRhLndyaXRlKF9hcmdfaW5wdXQpPzsKKyAgICBhaWRsX2RhdGEud3JpdGVfc2xpY2Vfc2l6ZShTb21lKF9hcmdfcmVwZWF0ZWQpKT87CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfUmV2ZXJzZUNoYXIoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbdTE2XSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8dTE2PiwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8dTE2Pj4gewogICAgIGlmIGxldCBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKSA9IF9haWRsX3JlcGx5IHsKICAgICAgIGlmIGxldCBTb21lKF9haWRsX2RlZmF1bHRfaW1wbCkgPSA8U2VsZiBhcyBJVGVzdFNlcnZpY2U+OjpnZXREZWZhdWx0SW1wbCgpIHsKICAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5SZXZlcnNlQ2hhcihfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKTsKQEAgLTY0NSwxNiArMTEwMywxNyBAQAogICAgIGxldCBfYWlkbF9zdGF0dXM6IGJpbmRlcjo6U3RhdHVzID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKICAgICBpZiAhX2FpZGxfc3RhdHVzLmlzX29rKCkgeyByZXR1cm4gRXJyKF9haWRsX3N0YXR1cyk7IH0KICAgICBsZXQgX2FpZGxfcmV0dXJuOiBWZWM8dTE2PiA9IF9haWRsX3JlcGx5LnJlYWQoKT87Ci0gICAgKl9hcmdfcmVwZWF0ZWQgPSBfYWlkbF9yZXBseS5yZWFkKCk/OworICAgIF9haWRsX3JlcGx5LnJlYWRfb250byhfYXJnX3JlcGVhdGVkKT87CiAgICAgT2soX2FpZGxfcmV0dXJuKQogICB9Ci0gIGZuIFJldmVyc2VJbnQoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbaTMyXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8aTMyPikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8VmVjPGkzMj4+IHsKLSAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci50cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJldmVyc2VJbnQsIGJpbmRlcjo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OkZMQUdfUFJJVkFURV9MT0NBTCwgfF9haWRsX2RhdGF8IHsKLSAgICAgIF9haWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKLSAgICAgIF9haWRsX2RhdGEud3JpdGUoX2FyZ19pbnB1dCk/OwotICAgICAgX2FpZGxfZGF0YS53cml0ZV9zbGljZV9zaXplKFNvbWUoX2FyZ19yZXBlYXRlZCkpPzsKLSAgICAgIE9rKCgpKQotICAgIH0pOworICBmbiBidWlsZF9wYXJjZWxfUmV2ZXJzZUludCgmc2VsZiwgX2FyZ19pbnB1dDogJltpMzJdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxpMzI+KSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7CisgICAgYWlkbF9kYXRhLndyaXRlKF9hcmdfaW5wdXQpPzsKKyAgICBhaWRsX2RhdGEud3JpdGVfc2xpY2Vfc2l6ZShTb21lKF9hcmdfcmVwZWF0ZWQpKT87CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfUmV2ZXJzZUludCgmc2VsZiwgX2FyZ19pbnB1dDogJltpMzJdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxpMzI+LCBfYWlkbF9yZXBseTogc3RkOjpyZXN1bHQ6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWwsIGJpbmRlcjo6U3RhdHVzQ29kZT4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxpMzI+PiB7CiAgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgewogICAgICAgaWYgbGV0IFNvbWUoX2FpZGxfZGVmYXVsdF9pbXBsKSA9IDxTZWxmIGFzIElUZXN0U2VydmljZT46OmdldERlZmF1bHRJbXBsKCkgewogICAgICAgICByZXR1cm4gX2FpZGxfZGVmYXVsdF9pbXBsLlJldmVyc2VJbnQoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCk7CkBAIC02NjQsMTYgKzExMjMsMTcgQEAKICAgICBsZXQgX2FpZGxfc3RhdHVzOiBiaW5kZXI6OlN0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWQoKT87CiAgICAgaWYgIV9haWRsX3N0YXR1cy5pc19vaygpIHsgcmV0dXJuIEVycihfYWlkbF9zdGF0dXMpOyB9CiAgICAgbGV0IF9haWRsX3JldHVybjogVmVjPGkzMj4gPSBfYWlkbF9yZXBseS5yZWFkKCk/OwotICAgICpfYXJnX3JlcGVhdGVkID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKKyAgICBfYWlkbF9yZXBseS5yZWFkX29udG8oX2FyZ19yZXBlYXRlZCk/OwogICAgIE9rKF9haWRsX3JldHVybikKICAgfQotICBmbiBSZXZlcnNlTG9uZygmc2VsZiwgX2FyZ19pbnB1dDogJltpNjRdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxpNjQ+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxWZWM8aTY0Pj4gewotICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnRyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmV2ZXJzZUxvbmcsIGJpbmRlcjo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OkZMQUdfUFJJVkFURV9MT0NBTCwgfF9haWRsX2RhdGF8IHsKLSAgICAgIF9haWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKLSAgICAgIF9haWRsX2RhdGEud3JpdGUoX2FyZ19pbnB1dCk/OwotICAgICAgX2FpZGxfZGF0YS53cml0ZV9zbGljZV9zaXplKFNvbWUoX2FyZ19yZXBlYXRlZCkpPzsKLSAgICAgIE9rKCgpKQotICAgIH0pOworICBmbiBidWlsZF9wYXJjZWxfUmV2ZXJzZUxvbmcoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbaTY0XSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8aTY0PikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsPiB7CisgICAgbGV0IG11dCBhaWRsX2RhdGEgPSBzZWxmLmJpbmRlci5wcmVwYXJlX3RyYW5zYWN0KCk/OworICAgIGFpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOworICAgIGFpZGxfZGF0YS53cml0ZShfYXJnX2lucHV0KT87CisgICAgYWlkbF9kYXRhLndyaXRlX3NsaWNlX3NpemUoU29tZShfYXJnX3JlcGVhdGVkKSk/OworICAgIE9rKGFpZGxfZGF0YSkKKyAgfQorICBmbiByZWFkX3Jlc3BvbnNlX1JldmVyc2VMb25nKCZzZWxmLCBfYXJnX2lucHV0OiAmW2k2NF0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPGk2ND4sIF9haWRsX3JlcGx5OiBzdGQ6OnJlc3VsdDo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbCwgYmluZGVyOjpTdGF0dXNDb2RlPikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPGk2ND4+IHsKICAgICBpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7CiAgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSVRlc3RTZXJ2aWNlPjo6Z2V0RGVmYXVsdEltcGwoKSB7CiAgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwuUmV2ZXJzZUxvbmcoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCk7CkBAIC02ODMsMTYgKzExNDMsMTcgQEAKICAgICBsZXQgX2FpZGxfc3RhdHVzOiBiaW5kZXI6OlN0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWQoKT87CiAgICAgaWYgIV9haWRsX3N0YXR1cy5pc19vaygpIHsgcmV0dXJuIEVycihfYWlkbF9zdGF0dXMpOyB9CiAgICAgbGV0IF9haWRsX3JldHVybjogVmVjPGk2ND4gPSBfYWlkbF9yZXBseS5yZWFkKCk/OwotICAgICpfYXJnX3JlcGVhdGVkID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKKyAgICBfYWlkbF9yZXBseS5yZWFkX29udG8oX2FyZ19yZXBlYXRlZCk/OwogICAgIE9rKF9haWRsX3JldHVybikKICAgfQotICBmbiBSZXZlcnNlRmxvYXQoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbZjMyXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8ZjMyPikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8VmVjPGYzMj4+IHsKLSAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci50cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJldmVyc2VGbG9hdCwgYmluZGVyOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6RkxBR19QUklWQVRFX0xPQ0FMLCB8X2FpZGxfZGF0YXwgewotICAgICAgX2FpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOwotICAgICAgX2FpZGxfZGF0YS53cml0ZShfYXJnX2lucHV0KT87Ci0gICAgICBfYWlkbF9kYXRhLndyaXRlX3NsaWNlX3NpemUoU29tZShfYXJnX3JlcGVhdGVkKSk/OwotICAgICAgT2soKCkpCi0gICAgfSk7CisgIGZuIGJ1aWxkX3BhcmNlbF9SZXZlcnNlRmxvYXQoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbZjMyXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8ZjMyPikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsPiB7CisgICAgbGV0IG11dCBhaWRsX2RhdGEgPSBzZWxmLmJpbmRlci5wcmVwYXJlX3RyYW5zYWN0KCk/OworICAgIGFpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOworICAgIGFpZGxfZGF0YS53cml0ZShfYXJnX2lucHV0KT87CisgICAgYWlkbF9kYXRhLndyaXRlX3NsaWNlX3NpemUoU29tZShfYXJnX3JlcGVhdGVkKSk/OworICAgIE9rKGFpZGxfZGF0YSkKKyAgfQorICBmbiByZWFkX3Jlc3BvbnNlX1JldmVyc2VGbG9hdCgmc2VsZiwgX2FyZ19pbnB1dDogJltmMzJdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxmMzI+LCBfYWlkbF9yZXBseTogc3RkOjpyZXN1bHQ6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWwsIGJpbmRlcjo6U3RhdHVzQ29kZT4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxmMzI+PiB7CiAgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgewogICAgICAgaWYgbGV0IFNvbWUoX2FpZGxfZGVmYXVsdF9pbXBsKSA9IDxTZWxmIGFzIElUZXN0U2VydmljZT46OmdldERlZmF1bHRJbXBsKCkgewogICAgICAgICByZXR1cm4gX2FpZGxfZGVmYXVsdF9pbXBsLlJldmVyc2VGbG9hdChfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKTsKQEAgLTcwMiwxNiArMTE2MywxNyBAQAogICAgIGxldCBfYWlkbF9zdGF0dXM6IGJpbmRlcjo6U3RhdHVzID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKICAgICBpZiAhX2FpZGxfc3RhdHVzLmlzX29rKCkgeyByZXR1cm4gRXJyKF9haWRsX3N0YXR1cyk7IH0KICAgICBsZXQgX2FpZGxfcmV0dXJuOiBWZWM8ZjMyPiA9IF9haWRsX3JlcGx5LnJlYWQoKT87Ci0gICAgKl9hcmdfcmVwZWF0ZWQgPSBfYWlkbF9yZXBseS5yZWFkKCk/OworICAgIF9haWRsX3JlcGx5LnJlYWRfb250byhfYXJnX3JlcGVhdGVkKT87CiAgICAgT2soX2FpZGxfcmV0dXJuKQogICB9Ci0gIGZuIFJldmVyc2VEb3VibGUoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbZjY0XSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8ZjY0PikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8VmVjPGY2ND4+IHsKLSAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci50cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJldmVyc2VEb3VibGUsIGJpbmRlcjo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OkZMQUdfUFJJVkFURV9MT0NBTCwgfF9haWRsX2RhdGF8IHsKLSAgICAgIF9haWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKLSAgICAgIF9haWRsX2RhdGEud3JpdGUoX2FyZ19pbnB1dCk/OwotICAgICAgX2FpZGxfZGF0YS53cml0ZV9zbGljZV9zaXplKFNvbWUoX2FyZ19yZXBlYXRlZCkpPzsKLSAgICAgIE9rKCgpKQotICAgIH0pOworICBmbiBidWlsZF9wYXJjZWxfUmV2ZXJzZURvdWJsZSgmc2VsZiwgX2FyZ19pbnB1dDogJltmNjRdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxmNjQ+KSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7CisgICAgYWlkbF9kYXRhLndyaXRlKF9hcmdfaW5wdXQpPzsKKyAgICBhaWRsX2RhdGEud3JpdGVfc2xpY2Vfc2l6ZShTb21lKF9hcmdfcmVwZWF0ZWQpKT87CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfUmV2ZXJzZURvdWJsZSgmc2VsZiwgX2FyZ19pbnB1dDogJltmNjRdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxmNjQ+LCBfYWlkbF9yZXBseTogc3RkOjpyZXN1bHQ6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWwsIGJpbmRlcjo6U3RhdHVzQ29kZT4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxmNjQ+PiB7CiAgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgewogICAgICAgaWYgbGV0IFNvbWUoX2FpZGxfZGVmYXVsdF9pbXBsKSA9IDxTZWxmIGFzIElUZXN0U2VydmljZT46OmdldERlZmF1bHRJbXBsKCkgewogICAgICAgICByZXR1cm4gX2FpZGxfZGVmYXVsdF9pbXBsLlJldmVyc2VEb3VibGUoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCk7CkBAIC03MjEsMTYgKzExODMsMTcgQEAKICAgICBsZXQgX2FpZGxfc3RhdHVzOiBiaW5kZXI6OlN0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWQoKT87CiAgICAgaWYgIV9haWRsX3N0YXR1cy5pc19vaygpIHsgcmV0dXJuIEVycihfYWlkbF9zdGF0dXMpOyB9CiAgICAgbGV0IF9haWRsX3JldHVybjogVmVjPGY2ND4gPSBfYWlkbF9yZXBseS5yZWFkKCk/OwotICAgICpfYXJnX3JlcGVhdGVkID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKKyAgICBfYWlkbF9yZXBseS5yZWFkX29udG8oX2FyZ19yZXBlYXRlZCk/OwogICAgIE9rKF9haWRsX3JldHVybikKICAgfQotICBmbiBSZXZlcnNlU3RyaW5nKCZzZWxmLCBfYXJnX2lucHV0OiAmW1N0cmluZ10sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPFN0cmluZz4pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PFZlYzxTdHJpbmc+PiB7Ci0gICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIudHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXZlcnNlU3RyaW5nLCBiaW5kZXI6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpGTEFHX1BSSVZBVEVfTE9DQUwsIHxfYWlkbF9kYXRhfCB7Ci0gICAgICBfYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7Ci0gICAgICBfYWlkbF9kYXRhLndyaXRlKF9hcmdfaW5wdXQpPzsKLSAgICAgIF9haWRsX2RhdGEud3JpdGVfc2xpY2Vfc2l6ZShTb21lKF9hcmdfcmVwZWF0ZWQpKT87Ci0gICAgICBPaygoKSkKLSAgICB9KTsKKyAgZm4gYnVpbGRfcGFyY2VsX1JldmVyc2VTdHJpbmcoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbU3RyaW5nXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8U3RyaW5nPikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsPiB7CisgICAgbGV0IG11dCBhaWRsX2RhdGEgPSBzZWxmLmJpbmRlci5wcmVwYXJlX3RyYW5zYWN0KCk/OworICAgIGFpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOworICAgIGFpZGxfZGF0YS53cml0ZShfYXJnX2lucHV0KT87CisgICAgYWlkbF9kYXRhLndyaXRlX3NsaWNlX3NpemUoU29tZShfYXJnX3JlcGVhdGVkKSk/OworICAgIE9rKGFpZGxfZGF0YSkKKyAgfQorICBmbiByZWFkX3Jlc3BvbnNlX1JldmVyc2VTdHJpbmcoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbU3RyaW5nXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8U3RyaW5nPiwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8U3RyaW5nPj4gewogICAgIGlmIGxldCBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKSA9IF9haWRsX3JlcGx5IHsKICAgICAgIGlmIGxldCBTb21lKF9haWRsX2RlZmF1bHRfaW1wbCkgPSA8U2VsZiBhcyBJVGVzdFNlcnZpY2U+OjpnZXREZWZhdWx0SW1wbCgpIHsKICAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5SZXZlcnNlU3RyaW5nKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpOwpAQCAtNzQwLDE2ICsxMjAzLDE3IEBACiAgICAgbGV0IF9haWRsX3N0YXR1czogYmluZGVyOjpTdGF0dXMgPSBfYWlkbF9yZXBseS5yZWFkKCk/OwogICAgIGlmICFfYWlkbF9zdGF0dXMuaXNfb2soKSB7IHJldHVybiBFcnIoX2FpZGxfc3RhdHVzKTsgfQogICAgIGxldCBfYWlkbF9yZXR1cm46IFZlYzxTdHJpbmc+ID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKLSAgICAqX2FyZ19yZXBlYXRlZCA9IF9haWRsX3JlcGx5LnJlYWQoKT87CisgICAgX2FpZGxfcmVwbHkucmVhZF9vbnRvKF9hcmdfcmVwZWF0ZWQpPzsKICAgICBPayhfYWlkbF9yZXR1cm4pCiAgIH0KLSAgZm4gUmV2ZXJzZUJ5dGVFbnVtKCZzZWxmLCBfYXJnX2lucHV0OiAmW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW1dLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtPikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8VmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW0+PiB7Ci0gICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIudHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXZlcnNlQnl0ZUVudW0sIGJpbmRlcjo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OkZMQUdfUFJJVkFURV9MT0NBTCwgfF9haWRsX2RhdGF8IHsKLSAgICAgIF9haWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKLSAgICAgIF9haWRsX2RhdGEud3JpdGUoX2FyZ19pbnB1dCk/OwotICAgICAgX2FpZGxfZGF0YS53cml0ZV9zbGljZV9zaXplKFNvbWUoX2FyZ19yZXBlYXRlZCkpPzsKLSAgICAgIE9rKCgpKQotICAgIH0pOworICBmbiBidWlsZF9wYXJjZWxfUmV2ZXJzZUJ5dGVFbnVtKCZzZWxmLCBfYXJnX2lucHV0OiAmW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW1dLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtPikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsPiB7CisgICAgbGV0IG11dCBhaWRsX2RhdGEgPSBzZWxmLmJpbmRlci5wcmVwYXJlX3RyYW5zYWN0KCk/OworICAgIGFpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOworICAgIGFpZGxfZGF0YS53cml0ZShfYXJnX2lucHV0KT87CisgICAgYWlkbF9kYXRhLndyaXRlX3NsaWNlX3NpemUoU29tZShfYXJnX3JlcGVhdGVkKSk/OworICAgIE9rKGFpZGxfZGF0YSkKKyAgfQorICBmbiByZWFkX3Jlc3BvbnNlX1JldmVyc2VCeXRlRW51bSgmc2VsZiwgX2FyZ19pbnB1dDogJltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bT4sIF9haWRsX3JlcGx5OiBzdGQ6OnJlc3VsdDo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbCwgYmluZGVyOjpTdGF0dXNDb2RlPikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW0+PiB7CiAgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgewogICAgICAgaWYgbGV0IFNvbWUoX2FpZGxfZGVmYXVsdF9pbXBsKSA9IDxTZWxmIGFzIElUZXN0U2VydmljZT46OmdldERlZmF1bHRJbXBsKCkgewogICAgICAgICByZXR1cm4gX2FpZGxfZGVmYXVsdF9pbXBsLlJldmVyc2VCeXRlRW51bShfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKTsKQEAgLTc1OSwxNiArMTIyMywxNyBAQAogICAgIGxldCBfYWlkbF9zdGF0dXM6IGJpbmRlcjo6U3RhdHVzID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKICAgICBpZiAhX2FpZGxfc3RhdHVzLmlzX29rKCkgeyByZXR1cm4gRXJyKF9haWRsX3N0YXR1cyk7IH0KICAgICBsZXQgX2FpZGxfcmV0dXJuOiBWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bT4gPSBfYWlkbF9yZXBseS5yZWFkKCk/OwotICAgICpfYXJnX3JlcGVhdGVkID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKKyAgICBfYWlkbF9yZXBseS5yZWFkX29udG8oX2FyZ19yZXBlYXRlZCk/OwogICAgIE9rKF9haWRsX3JldHVybikKICAgfQotICBmbiBSZXZlcnNlSW50RW51bSgmc2VsZiwgX2FyZ19pbnB1dDogJltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW1dLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW0+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtPj4gewotICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnRyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmV2ZXJzZUludEVudW0sIGJpbmRlcjo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OkZMQUdfUFJJVkFURV9MT0NBTCwgfF9haWRsX2RhdGF8IHsKLSAgICAgIF9haWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKLSAgICAgIF9haWRsX2RhdGEud3JpdGUoX2FyZ19pbnB1dCk/OwotICAgICAgX2FpZGxfZGF0YS53cml0ZV9zbGljZV9zaXplKFNvbWUoX2FyZ19yZXBlYXRlZCkpPzsKLSAgICAgIE9rKCgpKQotICAgIH0pOworICBmbiBidWlsZF9wYXJjZWxfUmV2ZXJzZUludEVudW0oJnNlbGYsIF9hcmdfaW5wdXQ6ICZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtPikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsPiB7CisgICAgbGV0IG11dCBhaWRsX2RhdGEgPSBzZWxmLmJpbmRlci5wcmVwYXJlX3RyYW5zYWN0KCk/OworICAgIGFpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOworICAgIGFpZGxfZGF0YS53cml0ZShfYXJnX2lucHV0KT87CisgICAgYWlkbF9kYXRhLndyaXRlX3NsaWNlX3NpemUoU29tZShfYXJnX3JlcGVhdGVkKSk/OworICAgIE9rKGFpZGxfZGF0YSkKKyAgfQorICBmbiByZWFkX3Jlc3BvbnNlX1JldmVyc2VJbnRFbnVtKCZzZWxmLCBfYXJnX2lucHV0OiAmW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bV0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bT4sIF9haWRsX3JlcGx5OiBzdGQ6OnJlc3VsdDo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbCwgYmluZGVyOjpTdGF0dXNDb2RlPikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bT4+IHsKICAgICBpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7CiAgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSVRlc3RTZXJ2aWNlPjo6Z2V0RGVmYXVsdEltcGwoKSB7CiAgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwuUmV2ZXJzZUludEVudW0oX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCk7CkBAIC03NzgsMTYgKzEyNDMsMTcgQEAKICAgICBsZXQgX2FpZGxfc3RhdHVzOiBiaW5kZXI6OlN0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWQoKT87CiAgICAgaWYgIV9haWRsX3N0YXR1cy5pc19vaygpIHsgcmV0dXJuIEVycihfYWlkbF9zdGF0dXMpOyB9CiAgICAgbGV0IF9haWRsX3JldHVybjogVmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bT4gPSBfYWlkbF9yZXBseS5yZWFkKCk/OwotICAgICpfYXJnX3JlcGVhdGVkID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKKyAgICBfYWlkbF9yZXBseS5yZWFkX29udG8oX2FyZ19yZXBlYXRlZCk/OwogICAgIE9rKF9haWRsX3JldHVybikKICAgfQotICBmbiBSZXZlcnNlTG9uZ0VudW0oJnNlbGYsIF9hcmdfaW5wdXQ6ICZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bV0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW0+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bT4+IHsKLSAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci50cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJldmVyc2VMb25nRW51bSwgYmluZGVyOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6RkxBR19QUklWQVRFX0xPQ0FMLCB8X2FpZGxfZGF0YXwgewotICAgICAgX2FpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOwotICAgICAgX2FpZGxfZGF0YS53cml0ZShfYXJnX2lucHV0KT87Ci0gICAgICBfYWlkbF9kYXRhLndyaXRlX3NsaWNlX3NpemUoU29tZShfYXJnX3JlcGVhdGVkKSk/OwotICAgICAgT2soKCkpCi0gICAgfSk7CisgIGZuIGJ1aWxkX3BhcmNlbF9SZXZlcnNlTG9uZ0VudW0oJnNlbGYsIF9hcmdfaW5wdXQ6ICZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bV0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW0+KSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7CisgICAgYWlkbF9kYXRhLndyaXRlKF9hcmdfaW5wdXQpPzsKKyAgICBhaWRsX2RhdGEud3JpdGVfc2xpY2Vfc2l6ZShTb21lKF9hcmdfcmVwZWF0ZWQpKT87CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfUmV2ZXJzZUxvbmdFbnVtKCZzZWxmLCBfYXJnX2lucHV0OiAmW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW1dLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtPiwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bT4+IHsKICAgICBpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7CiAgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSVRlc3RTZXJ2aWNlPjo6Z2V0RGVmYXVsdEltcGwoKSB7CiAgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwuUmV2ZXJzZUxvbmdFbnVtKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpOwpAQCAtNzk3LDE1ICsxMjYzLDE2IEBACiAgICAgbGV0IF9haWRsX3N0YXR1czogYmluZGVyOjpTdGF0dXMgPSBfYWlkbF9yZXBseS5yZWFkKCk/OwogICAgIGlmICFfYWlkbF9zdGF0dXMuaXNfb2soKSB7IHJldHVybiBFcnIoX2FpZGxfc3RhdHVzKTsgfQogICAgIGxldCBfYWlkbF9yZXR1cm46IFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtPiA9IF9haWRsX3JlcGx5LnJlYWQoKT87Ci0gICAgKl9hcmdfcmVwZWF0ZWQgPSBfYWlkbF9yZXBseS5yZWFkKCk/OworICAgIF9haWRsX3JlcGx5LnJlYWRfb250byhfYXJnX3JlcGVhdGVkKT87CiAgICAgT2soX2FpZGxfcmV0dXJuKQogICB9Ci0gIGZuIEdldE90aGVyVGVzdFNlcnZpY2UoJnNlbGYsIF9hcmdfbmFtZTogJnN0cikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPj4gewotICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnRyYW5zYWN0KHRyYW5zYWN0aW9uczo6R2V0T3RoZXJUZXN0U2VydmljZSwgYmluZGVyOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6RkxBR19QUklWQVRFX0xPQ0FMLCB8X2FpZGxfZGF0YXwgewotICAgICAgX2FpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOwotICAgICAgX2FpZGxfZGF0YS53cml0ZShfYXJnX25hbWUpPzsKLSAgICAgIE9rKCgpKQotICAgIH0pOworICBmbiBidWlsZF9wYXJjZWxfR2V0T3RoZXJUZXN0U2VydmljZSgmc2VsZiwgX2FyZ19uYW1lOiAmc3RyKSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7CisgICAgYWlkbF9kYXRhLndyaXRlKF9hcmdfbmFtZSk/OworICAgIE9rKGFpZGxfZGF0YSkKKyAgfQorICBmbiByZWFkX3Jlc3BvbnNlX0dldE90aGVyVGVzdFNlcnZpY2UoJnNlbGYsIF9hcmdfbmFtZTogJnN0ciwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+PiB7CiAgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgewogICAgICAgaWYgbGV0IFNvbWUoX2FpZGxfZGVmYXVsdF9pbXBsKSA9IDxTZWxmIGFzIElUZXN0U2VydmljZT46OmdldERlZmF1bHRJbXBsKCkgewogICAgICAgICByZXR1cm4gX2FpZGxfZGVmYXVsdF9pbXBsLkdldE90aGVyVGVzdFNlcnZpY2UoX2FyZ19uYW1lKTsKQEAgLTgxNywxMyArMTI4NCwxNCBAQAogICAgIGxldCBfYWlkbF9yZXR1cm46IGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz4gPSBfYWlkbF9yZXBseS5yZWFkKCk/OwogICAgIE9rKF9haWRsX3JldHVybikKICAgfQotICBmbiBWZXJpZnlOYW1lKCZzZWxmLCBfYXJnX3NlcnZpY2U6ICZiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+LCBfYXJnX25hbWU6ICZzdHIpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PGJvb2w+IHsKLSAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci50cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlZlcmlmeU5hbWUsIGJpbmRlcjo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OkZMQUdfUFJJVkFURV9MT0NBTCwgfF9haWRsX2RhdGF8IHsKLSAgICAgIF9haWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKLSAgICAgIF9haWRsX2RhdGEud3JpdGUoX2FyZ19zZXJ2aWNlKT87Ci0gICAgICBfYWlkbF9kYXRhLndyaXRlKF9hcmdfbmFtZSk/OwotICAgICAgT2soKCkpCi0gICAgfSk7CisgIGZuIGJ1aWxkX3BhcmNlbF9WZXJpZnlOYW1lKCZzZWxmLCBfYXJnX3NlcnZpY2U6ICZiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+LCBfYXJnX25hbWU6ICZzdHIpIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbD4geworICAgIGxldCBtdXQgYWlkbF9kYXRhID0gc2VsZi5iaW5kZXIucHJlcGFyZV90cmFuc2FjdCgpPzsKKyAgICBhaWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKKyAgICBhaWRsX2RhdGEud3JpdGUoX2FyZ19zZXJ2aWNlKT87CisgICAgYWlkbF9kYXRhLndyaXRlKF9hcmdfbmFtZSk/OworICAgIE9rKGFpZGxfZGF0YSkKKyAgfQorICBmbiByZWFkX3Jlc3BvbnNlX1ZlcmlmeU5hbWUoJnNlbGYsIF9hcmdfc2VydmljZTogJmJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz4sIF9hcmdfbmFtZTogJnN0ciwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDxib29sPiB7CiAgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgewogICAgICAgaWYgbGV0IFNvbWUoX2FpZGxfZGVmYXVsdF9pbXBsKSA9IDxTZWxmIGFzIElUZXN0U2VydmljZT46OmdldERlZmF1bHRJbXBsKCkgewogICAgICAgICByZXR1cm4gX2FpZGxfZGVmYXVsdF9pbXBsLlZlcmlmeU5hbWUoX2FyZ19zZXJ2aWNlLCBfYXJnX25hbWUpOwpAQCAtODM1LDEyICsxMzAzLDEyNCBAQAogICAgIGxldCBfYWlkbF9yZXR1cm46IGJvb2wgPSBfYWlkbF9yZXBseS5yZWFkKCk/OwogICAgIE9rKF9haWRsX3JldHVybikKICAgfQotICBmbiBSZXZlcnNlU3RyaW5nTGlzdCgmc2VsZiwgX2FyZ19pbnB1dDogJltTdHJpbmddLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxTdHJpbmc+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxWZWM8U3RyaW5nPj4gewotICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnRyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmV2ZXJzZVN0cmluZ0xpc3QsIGJpbmRlcjo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OkZMQUdfUFJJVkFURV9MT0NBTCwgfF9haWRsX2RhdGF8IHsKLSAgICAgIF9haWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKLSAgICAgIF9haWRsX2RhdGEud3JpdGUoX2FyZ19pbnB1dCk/OwotICAgICAgT2soKCkpCi0gICAgfSk7CisgIGZuIGJ1aWxkX3BhcmNlbF9HZXRJbnRlcmZhY2VBcnJheSgmc2VsZiwgX2FyZ19uYW1lczogJltTdHJpbmddKSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7CisgICAgYWlkbF9kYXRhLndyaXRlKF9hcmdfbmFtZXMpPzsKKyAgICBPayhhaWRsX2RhdGEpCisgIH0KKyAgZm4gcmVhZF9yZXNwb25zZV9HZXRJbnRlcmZhY2VBcnJheSgmc2VsZiwgX2FyZ19uYW1lczogJltTdHJpbmddLCBfYWlkbF9yZXBseTogc3RkOjpyZXN1bHQ6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWwsIGJpbmRlcjo6U3RhdHVzQ29kZT4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+Pj4geworICAgIGlmIGxldCBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKSA9IF9haWRsX3JlcGx5IHsKKyAgICAgIGlmIGxldCBTb21lKF9haWRsX2RlZmF1bHRfaW1wbCkgPSA8U2VsZiBhcyBJVGVzdFNlcnZpY2U+OjpnZXREZWZhdWx0SW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5HZXRJbnRlcmZhY2VBcnJheShfYXJnX25hbWVzKTsKKyAgICAgIH0KKyAgICB9CisgICAgbGV0IF9haWRsX3JlcGx5ID0gX2FpZGxfcmVwbHk/OworICAgIGxldCBfYWlkbF9zdGF0dXM6IGJpbmRlcjo6U3RhdHVzID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKKyAgICBpZiAhX2FpZGxfc3RhdHVzLmlzX29rKCkgeyByZXR1cm4gRXJyKF9haWRsX3N0YXR1cyk7IH0KKyAgICBsZXQgX2FpZGxfcmV0dXJuOiBWZWM8YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPj4gPSBfYWlkbF9yZXBseS5yZWFkKCk/OworICAgIE9rKF9haWRsX3JldHVybikKKyAgfQorICBmbiBidWlsZF9wYXJjZWxfVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlQXJyYXkoJnNlbGYsIF9hcmdfc2VydmljZXM6ICZbYmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPl0sIF9hcmdfbmFtZXM6ICZbU3RyaW5nXSkgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsPiB7CisgICAgbGV0IG11dCBhaWRsX2RhdGEgPSBzZWxmLmJpbmRlci5wcmVwYXJlX3RyYW5zYWN0KCk/OworICAgIGFpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOworICAgIGFpZGxfZGF0YS53cml0ZShfYXJnX3NlcnZpY2VzKT87CisgICAgYWlkbF9kYXRhLndyaXRlKF9hcmdfbmFtZXMpPzsKKyAgICBPayhhaWRsX2RhdGEpCisgIH0KKyAgZm4gcmVhZF9yZXNwb25zZV9WZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VBcnJheSgmc2VsZiwgX2FyZ19zZXJ2aWNlczogJltiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+XSwgX2FyZ19uYW1lczogJltTdHJpbmddLCBfYWlkbF9yZXBseTogc3RkOjpyZXN1bHQ6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWwsIGJpbmRlcjo6U3RhdHVzQ29kZT4pIC0+IGJpbmRlcjo6UmVzdWx0PGJvb2w+IHsKKyAgICBpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7CisgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSVRlc3RTZXJ2aWNlPjo6Z2V0RGVmYXVsdEltcGwoKSB7CisgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwuVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlQXJyYXkoX2FyZ19zZXJ2aWNlcywgX2FyZ19uYW1lcyk7CisgICAgICB9CisgICAgfQorICAgIGxldCBfYWlkbF9yZXBseSA9IF9haWRsX3JlcGx5PzsKKyAgICBsZXQgX2FpZGxfc3RhdHVzOiBiaW5kZXI6OlN0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWQoKT87CisgICAgaWYgIV9haWRsX3N0YXR1cy5pc19vaygpIHsgcmV0dXJuIEVycihfYWlkbF9zdGF0dXMpOyB9CisgICAgbGV0IF9haWRsX3JldHVybjogYm9vbCA9IF9haWRsX3JlcGx5LnJlYWQoKT87CisgICAgT2soX2FpZGxfcmV0dXJuKQorICB9CisgIGZuIGJ1aWxkX3BhcmNlbF9HZXROdWxsYWJsZUludGVyZmFjZUFycmF5KCZzZWxmLCBfYXJnX25hbWVzOiBPcHRpb248JltPcHRpb248U3RyaW5nPl0+KSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7CisgICAgYWlkbF9kYXRhLndyaXRlKCZfYXJnX25hbWVzKT87CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfR2V0TnVsbGFibGVJbnRlcmZhY2VBcnJheSgmc2VsZiwgX2FyZ19uYW1lczogT3B0aW9uPCZbT3B0aW9uPFN0cmluZz5dPiwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+Pj4+PiB7CisgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgeworICAgICAgaWYgbGV0IFNvbWUoX2FpZGxfZGVmYXVsdF9pbXBsKSA9IDxTZWxmIGFzIElUZXN0U2VydmljZT46OmdldERlZmF1bHRJbXBsKCkgeworICAgICAgICByZXR1cm4gX2FpZGxfZGVmYXVsdF9pbXBsLkdldE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoX2FyZ19uYW1lcyk7CisgICAgICB9CisgICAgfQorICAgIGxldCBfYWlkbF9yZXBseSA9IF9haWRsX3JlcGx5PzsKKyAgICBsZXQgX2FpZGxfc3RhdHVzOiBiaW5kZXI6OlN0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWQoKT87CisgICAgaWYgIV9haWRsX3N0YXR1cy5pc19vaygpIHsgcmV0dXJuIEVycihfYWlkbF9zdGF0dXMpOyB9CisgICAgbGV0IF9haWRsX3JldHVybjogT3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPj4+PiA9IF9haWRsX3JlcGx5LnJlYWQoKT87CisgICAgT2soX2FpZGxfcmV0dXJuKQorICB9CisgIGZuIGJ1aWxkX3BhcmNlbF9WZXJpZnlOYW1lc1dpdGhOdWxsYWJsZUludGVyZmFjZUFycmF5KCZzZWxmLCBfYXJnX3NlcnZpY2VzOiBPcHRpb248JltPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPj5dPiwgX2FyZ19uYW1lczogT3B0aW9uPCZbT3B0aW9uPFN0cmluZz5dPikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsPiB7CisgICAgbGV0IG11dCBhaWRsX2RhdGEgPSBzZWxmLmJpbmRlci5wcmVwYXJlX3RyYW5zYWN0KCk/OworICAgIGFpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOworICAgIGFpZGxfZGF0YS53cml0ZSgmX2FyZ19zZXJ2aWNlcyk/OworICAgIGFpZGxfZGF0YS53cml0ZSgmX2FyZ19uYW1lcyk/OworICAgIE9rKGFpZGxfZGF0YSkKKyAgfQorICBmbiByZWFkX3Jlc3BvbnNlX1ZlcmlmeU5hbWVzV2l0aE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoJnNlbGYsIF9hcmdfc2VydmljZXM6IE9wdGlvbjwmW09wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+Pl0+LCBfYXJnX25hbWVzOiBPcHRpb248JltPcHRpb248U3RyaW5nPl0+LCBfYWlkbF9yZXBseTogc3RkOjpyZXN1bHQ6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWwsIGJpbmRlcjo6U3RhdHVzQ29kZT4pIC0+IGJpbmRlcjo6UmVzdWx0PGJvb2w+IHsKKyAgICBpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7CisgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSVRlc3RTZXJ2aWNlPjo6Z2V0RGVmYXVsdEltcGwoKSB7CisgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwuVmVyaWZ5TmFtZXNXaXRoTnVsbGFibGVJbnRlcmZhY2VBcnJheShfYXJnX3NlcnZpY2VzLCBfYXJnX25hbWVzKTsKKyAgICAgIH0KKyAgICB9CisgICAgbGV0IF9haWRsX3JlcGx5ID0gX2FpZGxfcmVwbHk/OworICAgIGxldCBfYWlkbF9zdGF0dXM6IGJpbmRlcjo6U3RhdHVzID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKKyAgICBpZiAhX2FpZGxfc3RhdHVzLmlzX29rKCkgeyByZXR1cm4gRXJyKF9haWRsX3N0YXR1cyk7IH0KKyAgICBsZXQgX2FpZGxfcmV0dXJuOiBib29sID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKKyAgICBPayhfYWlkbF9yZXR1cm4pCisgIH0KKyAgZm4gYnVpbGRfcGFyY2VsX0dldEludGVyZmFjZUxpc3QoJnNlbGYsIF9hcmdfbmFtZXM6IE9wdGlvbjwmW09wdGlvbjxTdHJpbmc+XT4pIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbD4geworICAgIGxldCBtdXQgYWlkbF9kYXRhID0gc2VsZi5iaW5kZXIucHJlcGFyZV90cmFuc2FjdCgpPzsKKyAgICBhaWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKKyAgICBhaWRsX2RhdGEud3JpdGUoJl9hcmdfbmFtZXMpPzsKKyAgICBPayhhaWRsX2RhdGEpCisgIH0KKyAgZm4gcmVhZF9yZXNwb25zZV9HZXRJbnRlcmZhY2VMaXN0KCZzZWxmLCBfYXJnX25hbWVzOiBPcHRpb248JltPcHRpb248U3RyaW5nPl0+LCBfYWlkbF9yZXBseTogc3RkOjpyZXN1bHQ6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWwsIGJpbmRlcjo6U3RhdHVzQ29kZT4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz4+Pj4+IHsKKyAgICBpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7CisgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSVRlc3RTZXJ2aWNlPjo6Z2V0RGVmYXVsdEltcGwoKSB7CisgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwuR2V0SW50ZXJmYWNlTGlzdChfYXJnX25hbWVzKTsKKyAgICAgIH0KKyAgICB9CisgICAgbGV0IF9haWRsX3JlcGx5ID0gX2FpZGxfcmVwbHk/OworICAgIGxldCBfYWlkbF9zdGF0dXM6IGJpbmRlcjo6U3RhdHVzID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKKyAgICBpZiAhX2FpZGxfc3RhdHVzLmlzX29rKCkgeyByZXR1cm4gRXJyKF9haWRsX3N0YXR1cyk7IH0KKyAgICBsZXQgX2FpZGxfcmV0dXJuOiBPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+Pj4+ID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKKyAgICBPayhfYWlkbF9yZXR1cm4pCisgIH0KKyAgZm4gYnVpbGRfcGFyY2VsX1ZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUxpc3QoJnNlbGYsIF9hcmdfc2VydmljZXM6IE9wdGlvbjwmW09wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+Pl0+LCBfYXJnX25hbWVzOiBPcHRpb248JltPcHRpb248U3RyaW5nPl0+KSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7CisgICAgYWlkbF9kYXRhLndyaXRlKCZfYXJnX3NlcnZpY2VzKT87CisgICAgYWlkbF9kYXRhLndyaXRlKCZfYXJnX25hbWVzKT87CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlTGlzdCgmc2VsZiwgX2FyZ19zZXJ2aWNlczogT3B0aW9uPCZbT3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz4+XT4sIF9hcmdfbmFtZXM6IE9wdGlvbjwmW09wdGlvbjxTdHJpbmc+XT4sIF9haWRsX3JlcGx5OiBzdGQ6OnJlc3VsdDo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbCwgYmluZGVyOjpTdGF0dXNDb2RlPikgLT4gYmluZGVyOjpSZXN1bHQ8Ym9vbD4geworICAgIGlmIGxldCBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKSA9IF9haWRsX3JlcGx5IHsKKyAgICAgIGlmIGxldCBTb21lKF9haWRsX2RlZmF1bHRfaW1wbCkgPSA8U2VsZiBhcyBJVGVzdFNlcnZpY2U+OjpnZXREZWZhdWx0SW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5WZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VMaXN0KF9hcmdfc2VydmljZXMsIF9hcmdfbmFtZXMpOworICAgICAgfQorICAgIH0KKyAgICBsZXQgX2FpZGxfcmVwbHkgPSBfYWlkbF9yZXBseT87CisgICAgbGV0IF9haWRsX3N0YXR1czogYmluZGVyOjpTdGF0dXMgPSBfYWlkbF9yZXBseS5yZWFkKCk/OworICAgIGlmICFfYWlkbF9zdGF0dXMuaXNfb2soKSB7IHJldHVybiBFcnIoX2FpZGxfc3RhdHVzKTsgfQorICAgIGxldCBfYWlkbF9yZXR1cm46IGJvb2wgPSBfYWlkbF9yZXBseS5yZWFkKCk/OworICAgIE9rKF9haWRsX3JldHVybikKKyAgfQorICBmbiBidWlsZF9wYXJjZWxfUmV2ZXJzZVN0cmluZ0xpc3QoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbU3RyaW5nXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8U3RyaW5nPikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsPiB7CisgICAgbGV0IG11dCBhaWRsX2RhdGEgPSBzZWxmLmJpbmRlci5wcmVwYXJlX3RyYW5zYWN0KCk/OworICAgIGFpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOworICAgIGFpZGxfZGF0YS53cml0ZShfYXJnX2lucHV0KT87CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfUmV2ZXJzZVN0cmluZ0xpc3QoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbU3RyaW5nXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8U3RyaW5nPiwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8U3RyaW5nPj4gewogICAgIGlmIGxldCBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKSA9IF9haWRsX3JlcGx5IHsKICAgICAgIGlmIGxldCBTb21lKF9haWRsX2RlZmF1bHRfaW1wbCkgPSA8U2VsZiBhcyBJVGVzdFNlcnZpY2U+OjpnZXREZWZhdWx0SW1wbCgpIHsKICAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5SZXZlcnNlU3RyaW5nTGlzdChfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKTsKQEAgLTg1MCwxNSArMTQzMCwxNiBAQAogICAgIGxldCBfYWlkbF9zdGF0dXM6IGJpbmRlcjo6U3RhdHVzID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKICAgICBpZiAhX2FpZGxfc3RhdHVzLmlzX29rKCkgeyByZXR1cm4gRXJyKF9haWRsX3N0YXR1cyk7IH0KICAgICBsZXQgX2FpZGxfcmV0dXJuOiBWZWM8U3RyaW5nPiA9IF9haWRsX3JlcGx5LnJlYWQoKT87Ci0gICAgKl9hcmdfcmVwZWF0ZWQgPSBfYWlkbF9yZXBseS5yZWFkKCk/OworICAgIF9haWRsX3JlcGx5LnJlYWRfb250byhfYXJnX3JlcGVhdGVkKT87CiAgICAgT2soX2FpZGxfcmV0dXJuKQogICB9Ci0gIGZuIFJlcGVhdFBhcmNlbEZpbGVEZXNjcmlwdG9yKCZzZWxmLCBfYXJnX3JlYWQ6ICZiaW5kZXI6OnBhcmNlbDo6UGFyY2VsRmlsZURlc2NyaXB0b3IpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PGJpbmRlcjo6cGFyY2VsOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj4gewotICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnRyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0UGFyY2VsRmlsZURlc2NyaXB0b3IsIGJpbmRlcjo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OkZMQUdfUFJJVkFURV9MT0NBTCwgfF9haWRsX2RhdGF8IHsKLSAgICAgIF9haWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKLSAgICAgIF9haWRsX2RhdGEud3JpdGUoX2FyZ19yZWFkKT87Ci0gICAgICBPaygoKSkKLSAgICB9KTsKKyAgZm4gYnVpbGRfcGFyY2VsX1JlcGVhdFBhcmNlbEZpbGVEZXNjcmlwdG9yKCZzZWxmLCBfYXJnX3JlYWQ6ICZiaW5kZXI6OlBhcmNlbEZpbGVEZXNjcmlwdG9yKSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7CisgICAgYWlkbF9kYXRhLndyaXRlKF9hcmdfcmVhZCk/OworICAgIE9rKGFpZGxfZGF0YSkKKyAgfQorICBmbiByZWFkX3Jlc3BvbnNlX1JlcGVhdFBhcmNlbEZpbGVEZXNjcmlwdG9yKCZzZWxmLCBfYXJnX3JlYWQ6ICZiaW5kZXI6OlBhcmNlbEZpbGVEZXNjcmlwdG9yLCBfYWlkbF9yZXBseTogc3RkOjpyZXN1bHQ6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWwsIGJpbmRlcjo6U3RhdHVzQ29kZT4pIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6UGFyY2VsRmlsZURlc2NyaXB0b3I+IHsKICAgICBpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7CiAgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSVRlc3RTZXJ2aWNlPjo6Z2V0RGVmYXVsdEltcGwoKSB7CiAgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwuUmVwZWF0UGFyY2VsRmlsZURlc2NyaXB0b3IoX2FyZ19yZWFkKTsKQEAgLTg2NywxNiArMTQ0OCwxNyBAQAogICAgIGxldCBfYWlkbF9yZXBseSA9IF9haWRsX3JlcGx5PzsKICAgICBsZXQgX2FpZGxfc3RhdHVzOiBiaW5kZXI6OlN0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWQoKT87CiAgICAgaWYgIV9haWRsX3N0YXR1cy5pc19vaygpIHsgcmV0dXJuIEVycihfYWlkbF9zdGF0dXMpOyB9Ci0gICAgbGV0IF9haWRsX3JldHVybjogYmluZGVyOjpwYXJjZWw6OlBhcmNlbEZpbGVEZXNjcmlwdG9yID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKKyAgICBsZXQgX2FpZGxfcmV0dXJuOiBiaW5kZXI6OlBhcmNlbEZpbGVEZXNjcmlwdG9yID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKICAgICBPayhfYWlkbF9yZXR1cm4pCiAgIH0KLSAgZm4gUmV2ZXJzZVBhcmNlbEZpbGVEZXNjcmlwdG9yQXJyYXkoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbYmluZGVyOjpwYXJjZWw6OlBhcmNlbEZpbGVEZXNjcmlwdG9yXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8T3B0aW9uPGJpbmRlcjo6cGFyY2VsOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj4+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxWZWM8YmluZGVyOjpwYXJjZWw6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPj4gewotICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnRyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmV2ZXJzZVBhcmNlbEZpbGVEZXNjcmlwdG9yQXJyYXksIGJpbmRlcjo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OkZMQUdfUFJJVkFURV9MT0NBTCwgfF9haWRsX2RhdGF8IHsKLSAgICAgIF9haWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKLSAgICAgIF9haWRsX2RhdGEud3JpdGUoX2FyZ19pbnB1dCk/OwotICAgICAgX2FpZGxfZGF0YS53cml0ZV9zbGljZV9zaXplKFNvbWUoX2FyZ19yZXBlYXRlZCkpPzsKLSAgICAgIE9rKCgpKQotICAgIH0pOworICBmbiBidWlsZF9wYXJjZWxfUmV2ZXJzZVBhcmNlbEZpbGVEZXNjcmlwdG9yQXJyYXkoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbYmluZGVyOjpQYXJjZWxGaWxlRGVzY3JpcHRvcl0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPE9wdGlvbjxiaW5kZXI6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPj4pIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbD4geworICAgIGxldCBtdXQgYWlkbF9kYXRhID0gc2VsZi5iaW5kZXIucHJlcGFyZV90cmFuc2FjdCgpPzsKKyAgICBhaWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKKyAgICBhaWRsX2RhdGEud3JpdGUoX2FyZ19pbnB1dCk/OworICAgIGFpZGxfZGF0YS53cml0ZV9zbGljZV9zaXplKFNvbWUoX2FyZ19yZXBlYXRlZCkpPzsKKyAgICBPayhhaWRsX2RhdGEpCisgIH0KKyAgZm4gcmVhZF9yZXNwb25zZV9SZXZlcnNlUGFyY2VsRmlsZURlc2NyaXB0b3JBcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogJltiaW5kZXI6OlBhcmNlbEZpbGVEZXNjcmlwdG9yXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8T3B0aW9uPGJpbmRlcjo6UGFyY2VsRmlsZURlc2NyaXB0b3I+PiwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8YmluZGVyOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj4+IHsKICAgICBpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7CiAgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSVRlc3RTZXJ2aWNlPjo6Z2V0RGVmYXVsdEltcGwoKSB7CiAgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwuUmV2ZXJzZVBhcmNlbEZpbGVEZXNjcmlwdG9yQXJyYXkoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCk7CkBAIC04ODUsMTYgKzE0NjcsMTcgQEAKICAgICBsZXQgX2FpZGxfcmVwbHkgPSBfYWlkbF9yZXBseT87CiAgICAgbGV0IF9haWRsX3N0YXR1czogYmluZGVyOjpTdGF0dXMgPSBfYWlkbF9yZXBseS5yZWFkKCk/OwogICAgIGlmICFfYWlkbF9zdGF0dXMuaXNfb2soKSB7IHJldHVybiBFcnIoX2FpZGxfc3RhdHVzKTsgfQotICAgIGxldCBfYWlkbF9yZXR1cm46IFZlYzxiaW5kZXI6OnBhcmNlbDo6UGFyY2VsRmlsZURlc2NyaXB0b3I+ID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKLSAgICAqX2FyZ19yZXBlYXRlZCA9IF9haWRsX3JlcGx5LnJlYWQoKT87CisgICAgbGV0IF9haWRsX3JldHVybjogVmVjPGJpbmRlcjo6UGFyY2VsRmlsZURlc2NyaXB0b3I+ID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKKyAgICBfYWlkbF9yZXBseS5yZWFkX29udG8oX2FyZ19yZXBlYXRlZCk/OwogICAgIE9rKF9haWRsX3JldHVybikKICAgfQotICBmbiBUaHJvd1NlcnZpY2VFeGNlcHRpb24oJnNlbGYsIF9hcmdfY29kZTogaTMyKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDwoKT4gewotICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnRyYW5zYWN0KHRyYW5zYWN0aW9uczo6VGhyb3dTZXJ2aWNlRXhjZXB0aW9uLCBiaW5kZXI6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpGTEFHX1BSSVZBVEVfTE9DQUwsIHxfYWlkbF9kYXRhfCB7Ci0gICAgICBfYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7Ci0gICAgICBfYWlkbF9kYXRhLndyaXRlKCZfYXJnX2NvZGUpPzsKLSAgICAgIE9rKCgpKQotICAgIH0pOworICBmbiBidWlsZF9wYXJjZWxfVGhyb3dTZXJ2aWNlRXhjZXB0aW9uKCZzZWxmLCBfYXJnX2NvZGU6IGkzMikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsPiB7CisgICAgbGV0IG11dCBhaWRsX2RhdGEgPSBzZWxmLmJpbmRlci5wcmVwYXJlX3RyYW5zYWN0KCk/OworICAgIGFpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOworICAgIGFpZGxfZGF0YS53cml0ZSgmX2FyZ19jb2RlKT87CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfVGhyb3dTZXJ2aWNlRXhjZXB0aW9uKCZzZWxmLCBfYXJnX2NvZGU6IGkzMiwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4gewogICAgIGlmIGxldCBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKSA9IF9haWRsX3JlcGx5IHsKICAgICAgIGlmIGxldCBTb21lKF9haWRsX2RlZmF1bHRfaW1wbCkgPSA8U2VsZiBhcyBJVGVzdFNlcnZpY2U+OjpnZXREZWZhdWx0SW1wbCgpIHsKICAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5UaHJvd1NlcnZpY2VFeGNlcHRpb24oX2FyZ19jb2RlKTsKQEAgLTkwNSwxMiArMTQ4OCwxMyBAQAogICAgIGlmICFfYWlkbF9zdGF0dXMuaXNfb2soKSB7IHJldHVybiBFcnIoX2FpZGxfc3RhdHVzKTsgfQogICAgIE9rKCgpKQogICB9Ci0gIGZuIFJlcGVhdE51bGxhYmxlSW50QXJyYXkoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW2kzMl0+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxPcHRpb248VmVjPGkzMj4+PiB7Ci0gICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIudHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXBlYXROdWxsYWJsZUludEFycmF5LCBiaW5kZXI6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpGTEFHX1BSSVZBVEVfTE9DQUwsIHxfYWlkbF9kYXRhfCB7Ci0gICAgICBfYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7Ci0gICAgICBfYWlkbF9kYXRhLndyaXRlKCZfYXJnX2lucHV0KT87Ci0gICAgICBPaygoKSkKLSAgICB9KTsKKyAgZm4gYnVpbGRfcGFyY2VsX1JlcGVhdE51bGxhYmxlSW50QXJyYXkoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW2kzMl0+KSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7CisgICAgYWlkbF9kYXRhLndyaXRlKCZfYXJnX2lucHV0KT87CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfUmVwZWF0TnVsbGFibGVJbnRBcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbaTMyXT4sIF9haWRsX3JlcGx5OiBzdGQ6OnJlc3VsdDo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbCwgYmluZGVyOjpTdGF0dXNDb2RlPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxpMzI+Pj4gewogICAgIGlmIGxldCBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKSA9IF9haWRsX3JlcGx5IHsKICAgICAgIGlmIGxldCBTb21lKF9haWRsX2RlZmF1bHRfaW1wbCkgPSA8U2VsZiBhcyBJVGVzdFNlcnZpY2U+OjpnZXREZWZhdWx0SW1wbCgpIHsKICAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5SZXBlYXROdWxsYWJsZUludEFycmF5KF9hcmdfaW5wdXQpOwpAQCAtOTIyLDEyICsxNTA2LDEzIEBACiAgICAgbGV0IF9haWRsX3JldHVybjogT3B0aW9uPFZlYzxpMzI+PiA9IF9haWRsX3JlcGx5LnJlYWQoKT87CiAgICAgT2soX2FpZGxfcmV0dXJuKQogICB9Ci0gIGZuIFJlcGVhdE51bGxhYmxlQnl0ZUVudW1BcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bV0+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxPcHRpb248VmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW0+Pj4gewotICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnRyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0TnVsbGFibGVCeXRlRW51bUFycmF5LCBiaW5kZXI6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpGTEFHX1BSSVZBVEVfTE9DQUwsIHxfYWlkbF9kYXRhfCB7Ci0gICAgICBfYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7Ci0gICAgICBfYWlkbF9kYXRhLndyaXRlKCZfYXJnX2lucHV0KT87Ci0gICAgICBPaygoKSkKLSAgICB9KTsKKyAgZm4gYnVpbGRfcGFyY2VsX1JlcGVhdE51bGxhYmxlQnl0ZUVudW1BcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bV0+KSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7CisgICAgYWlkbF9kYXRhLndyaXRlKCZfYXJnX2lucHV0KT87CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfUmVwZWF0TnVsbGFibGVCeXRlRW51bUFycmF5KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtXT4sIF9haWRsX3JlcGx5OiBzdGQ6OnJlc3VsdDo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbCwgYmluZGVyOjpTdGF0dXNDb2RlPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtPj4+IHsKICAgICBpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7CiAgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSVRlc3RTZXJ2aWNlPjo6Z2V0RGVmYXVsdEltcGwoKSB7CiAgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwuUmVwZWF0TnVsbGFibGVCeXRlRW51bUFycmF5KF9hcmdfaW5wdXQpOwpAQCAtOTM5LDEyICsxNTI0LDEzIEBACiAgICAgbGV0IF9haWRsX3JldHVybjogT3B0aW9uPFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtPj4gPSBfYWlkbF9yZXBseS5yZWFkKCk/OwogICAgIE9rKF9haWRsX3JldHVybikKICAgfQotICBmbiBSZXBlYXROdWxsYWJsZUludEVudW1BcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtXT4pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PE9wdGlvbjxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtPj4+IHsKLSAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci50cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlcGVhdE51bGxhYmxlSW50RW51bUFycmF5LCBiaW5kZXI6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpGTEFHX1BSSVZBVEVfTE9DQUwsIHxfYWlkbF9kYXRhfCB7Ci0gICAgICBfYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7Ci0gICAgICBfYWlkbF9kYXRhLndyaXRlKCZfYXJnX2lucHV0KT87Ci0gICAgICBPaygoKSkKLSAgICB9KTsKKyAgZm4gYnVpbGRfcGFyY2VsX1JlcGVhdE51bGxhYmxlSW50RW51bUFycmF5KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW1dPikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsPiB7CisgICAgbGV0IG11dCBhaWRsX2RhdGEgPSBzZWxmLmJpbmRlci5wcmVwYXJlX3RyYW5zYWN0KCk/OworICAgIGFpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOworICAgIGFpZGxfZGF0YS53cml0ZSgmX2FyZ19pbnB1dCk/OworICAgIE9rKGFpZGxfZGF0YSkKKyAgfQorICBmbiByZWFkX3Jlc3BvbnNlX1JlcGVhdE51bGxhYmxlSW50RW51bUFycmF5KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW1dPiwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bT4+PiB7CiAgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgewogICAgICAgaWYgbGV0IFNvbWUoX2FpZGxfZGVmYXVsdF9pbXBsKSA9IDxTZWxmIGFzIElUZXN0U2VydmljZT46OmdldERlZmF1bHRJbXBsKCkgewogICAgICAgICByZXR1cm4gX2FpZGxfZGVmYXVsdF9pbXBsLlJlcGVhdE51bGxhYmxlSW50RW51bUFycmF5KF9hcmdfaW5wdXQpOwpAQCAtOTU2LDEyICsxNTQyLDEzIEBACiAgICAgbGV0IF9haWRsX3JldHVybjogT3B0aW9uPFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW0+PiA9IF9haWRsX3JlcGx5LnJlYWQoKT87CiAgICAgT2soX2FpZGxfcmV0dXJuKQogICB9Ci0gIGZuIFJlcGVhdE51bGxhYmxlTG9uZ0VudW1BcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bV0+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxPcHRpb248VmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW0+Pj4gewotICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnRyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0TnVsbGFibGVMb25nRW51bUFycmF5LCBiaW5kZXI6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpGTEFHX1BSSVZBVEVfTE9DQUwsIHxfYWlkbF9kYXRhfCB7Ci0gICAgICBfYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7Ci0gICAgICBfYWlkbF9kYXRhLndyaXRlKCZfYXJnX2lucHV0KT87Ci0gICAgICBPaygoKSkKLSAgICB9KTsKKyAgZm4gYnVpbGRfcGFyY2VsX1JlcGVhdE51bGxhYmxlTG9uZ0VudW1BcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bV0+KSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7CisgICAgYWlkbF9kYXRhLndyaXRlKCZfYXJnX2lucHV0KT87CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfUmVwZWF0TnVsbGFibGVMb25nRW51bUFycmF5KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtXT4sIF9haWRsX3JlcGx5OiBzdGQ6OnJlc3VsdDo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbCwgYmluZGVyOjpTdGF0dXNDb2RlPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtPj4+IHsKICAgICBpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7CiAgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSVRlc3RTZXJ2aWNlPjo6Z2V0RGVmYXVsdEltcGwoKSB7CiAgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwuUmVwZWF0TnVsbGFibGVMb25nRW51bUFycmF5KF9hcmdfaW5wdXQpOwpAQCAtOTczLDEyICsxNTYwLDEzIEBACiAgICAgbGV0IF9haWRsX3JldHVybjogT3B0aW9uPFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtPj4gPSBfYWlkbF9yZXBseS5yZWFkKCk/OwogICAgIE9rKF9haWRsX3JldHVybikKICAgfQotICBmbiBSZXBlYXROdWxsYWJsZVN0cmluZygmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZzdHI+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxPcHRpb248U3RyaW5nPj4gewotICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnRyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0TnVsbGFibGVTdHJpbmcsIGJpbmRlcjo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OkZMQUdfUFJJVkFURV9MT0NBTCwgfF9haWRsX2RhdGF8IHsKLSAgICAgIF9haWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKLSAgICAgIF9haWRsX2RhdGEud3JpdGUoJl9hcmdfaW5wdXQpPzsKLSAgICAgIE9rKCgpKQotICAgIH0pOworICBmbiBidWlsZF9wYXJjZWxfUmVwZWF0TnVsbGFibGVTdHJpbmcoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmc3RyPikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsPiB7CisgICAgbGV0IG11dCBhaWRsX2RhdGEgPSBzZWxmLmJpbmRlci5wcmVwYXJlX3RyYW5zYWN0KCk/OworICAgIGFpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOworICAgIGFpZGxfZGF0YS53cml0ZSgmX2FyZ19pbnB1dCk/OworICAgIE9rKGFpZGxfZGF0YSkKKyAgfQorICBmbiByZWFkX3Jlc3BvbnNlX1JlcGVhdE51bGxhYmxlU3RyaW5nKCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JnN0cj4sIF9haWRsX3JlcGx5OiBzdGQ6OnJlc3VsdDo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbCwgYmluZGVyOjpTdGF0dXNDb2RlPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFN0cmluZz4+IHsKICAgICBpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7CiAgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSVRlc3RTZXJ2aWNlPjo6Z2V0RGVmYXVsdEltcGwoKSB7CiAgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwuUmVwZWF0TnVsbGFibGVTdHJpbmcoX2FyZ19pbnB1dCk7CkBAIC05OTAsMTIgKzE1NzgsMTMgQEAKICAgICBsZXQgX2FpZGxfcmV0dXJuOiBPcHRpb248U3RyaW5nPiA9IF9haWRsX3JlcGx5LnJlYWQoKT87CiAgICAgT2soX2FpZGxfcmV0dXJuKQogICB9Ci0gIGZuIFJlcGVhdE51bGxhYmxlU3RyaW5nTGlzdCgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbT3B0aW9uPFN0cmluZz5dPikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+PiB7Ci0gICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIudHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXBlYXROdWxsYWJsZVN0cmluZ0xpc3QsIGJpbmRlcjo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OkZMQUdfUFJJVkFURV9MT0NBTCwgfF9haWRsX2RhdGF8IHsKLSAgICAgIF9haWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKLSAgICAgIF9haWRsX2RhdGEud3JpdGUoJl9hcmdfaW5wdXQpPzsKLSAgICAgIE9rKCgpKQotICAgIH0pOworICBmbiBidWlsZF9wYXJjZWxfUmVwZWF0TnVsbGFibGVTdHJpbmdMaXN0KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltPcHRpb248U3RyaW5nPl0+KSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7CisgICAgYWlkbF9kYXRhLndyaXRlKCZfYXJnX2lucHV0KT87CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfUmVwZWF0TnVsbGFibGVTdHJpbmdMaXN0KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltPcHRpb248U3RyaW5nPl0+LCBfYWlkbF9yZXBseTogc3RkOjpyZXN1bHQ6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWwsIGJpbmRlcjo6U3RhdHVzQ29kZT4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPFN0cmluZz4+Pj4gewogICAgIGlmIGxldCBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKSA9IF9haWRsX3JlcGx5IHsKICAgICAgIGlmIGxldCBTb21lKF9haWRsX2RlZmF1bHRfaW1wbCkgPSA8U2VsZiBhcyBJVGVzdFNlcnZpY2U+OjpnZXREZWZhdWx0SW1wbCgpIHsKICAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5SZXBlYXROdWxsYWJsZVN0cmluZ0xpc3QoX2FyZ19pbnB1dCk7CkBAIC0xMDA3LDEyICsxNTk2LDEzIEBACiAgICAgbGV0IF9haWRsX3JldHVybjogT3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+ID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKICAgICBPayhfYWlkbF9yZXR1cm4pCiAgIH0KLSAgZm4gUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlKCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JmNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzIwX1N0cnVjdHVyZWRQYXJjZWxhYmxlPikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8T3B0aW9uPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzIwX1N0cnVjdHVyZWRQYXJjZWxhYmxlPj4gewotICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnRyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlLCBiaW5kZXI6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpGTEFHX1BSSVZBVEVfTE9DQUwsIHxfYWlkbF9kYXRhfCB7Ci0gICAgICBfYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7Ci0gICAgICBfYWlkbF9kYXRhLndyaXRlKCZfYXJnX2lucHV0KT87Ci0gICAgICBPaygoKSkKLSAgICB9KTsKKyAgZm4gYnVpbGRfcGFyY2VsX1JlcGVhdE51bGxhYmxlUGFyY2VsYWJsZSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMl9JVGVzdFNlcnZpY2VfNV9FbXB0eT4pIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbD4geworICAgIGxldCBtdXQgYWlkbF9kYXRhID0gc2VsZi5iaW5kZXIucHJlcGFyZV90cmFuc2FjdCgpPzsKKyAgICBhaWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKKyAgICBhaWRsX2RhdGEud3JpdGUoJl9hcmdfaW5wdXQpPzsKKyAgICBPayhhaWRsX2RhdGEpCisgIH0KKyAgZm4gcmVhZF9yZXNwb25zZV9SZXBlYXROdWxsYWJsZVBhcmNlbGFibGUoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTJfSVRlc3RTZXJ2aWNlXzVfRW1wdHk+LCBfYWlkbF9yZXBseTogc3RkOjpyZXN1bHQ6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWwsIGJpbmRlcjo6U3RhdHVzQ29kZT4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMl9JVGVzdFNlcnZpY2VfNV9FbXB0eT4+IHsKICAgICBpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7CiAgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSVRlc3RTZXJ2aWNlPjo6Z2V0RGVmYXVsdEltcGwoKSB7CiAgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwuUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlKF9hcmdfaW5wdXQpOwpAQCAtMTAyMSwxNSArMTYxMSw1MiBAQAogICAgIGxldCBfYWlkbF9yZXBseSA9IF9haWRsX3JlcGx5PzsKICAgICBsZXQgX2FpZGxfc3RhdHVzOiBiaW5kZXI6OlN0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWQoKT87CiAgICAgaWYgIV9haWRsX3N0YXR1cy5pc19vaygpIHsgcmV0dXJuIEVycihfYWlkbF9zdGF0dXMpOyB9Ci0gICAgbGV0IF9haWRsX3JldHVybjogT3B0aW9uPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzIwX1N0cnVjdHVyZWRQYXJjZWxhYmxlPiA9IF9haWRsX3JlcGx5LnJlYWQoKT87CisgICAgbGV0IF9haWRsX3JldHVybjogT3B0aW9uPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZV81X0VtcHR5PiA9IF9haWRsX3JlcGx5LnJlYWQoKT87CiAgICAgT2soX2FpZGxfcmV0dXJuKQogICB9Ci0gIGZuIFRha2VzQW5JQmluZGVyKCZzZWxmLCBfYXJnX2lucHV0OiAmYmluZGVyOjpTcElCaW5kZXIpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PCgpPiB7Ci0gICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIudHJhbnNhY3QodHJhbnNhY3Rpb25zOjpUYWtlc0FuSUJpbmRlciwgYmluZGVyOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6RkxBR19QUklWQVRFX0xPQ0FMLCB8X2FpZGxfZGF0YXwgewotICAgICAgX2FpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOwotICAgICAgX2FpZGxfZGF0YS53cml0ZShfYXJnX2lucHV0KT87Ci0gICAgICBPaygoKSkKLSAgICB9KTsKKyAgZm4gYnVpbGRfcGFyY2VsX1JlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUFycmF5KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltPcHRpb248Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTJfSVRlc3RTZXJ2aWNlXzVfRW1wdHk+XT4pIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbD4geworICAgIGxldCBtdXQgYWlkbF9kYXRhID0gc2VsZi5iaW5kZXIucHJlcGFyZV90cmFuc2FjdCgpPzsKKyAgICBhaWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKKyAgICBhaWRsX2RhdGEud3JpdGUoJl9hcmdfaW5wdXQpPzsKKyAgICBPayhhaWRsX2RhdGEpCisgIH0KKyAgZm4gcmVhZF9yZXNwb25zZV9SZXBlYXROdWxsYWJsZVBhcmNlbGFibGVBcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbT3B0aW9uPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZV81X0VtcHR5Pl0+LCBfYWlkbF9yZXBseTogc3RkOjpyZXN1bHQ6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWwsIGJpbmRlcjo6U3RhdHVzQ29kZT4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZV81X0VtcHR5Pj4+PiB7CisgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgeworICAgICAgaWYgbGV0IFNvbWUoX2FpZGxfZGVmYXVsdF9pbXBsKSA9IDxTZWxmIGFzIElUZXN0U2VydmljZT46OmdldERlZmF1bHRJbXBsKCkgeworICAgICAgICByZXR1cm4gX2FpZGxfZGVmYXVsdF9pbXBsLlJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUFycmF5KF9hcmdfaW5wdXQpOworICAgICAgfQorICAgIH0KKyAgICBsZXQgX2FpZGxfcmVwbHkgPSBfYWlkbF9yZXBseT87CisgICAgbGV0IF9haWRsX3N0YXR1czogYmluZGVyOjpTdGF0dXMgPSBfYWlkbF9yZXBseS5yZWFkKCk/OworICAgIGlmICFfYWlkbF9zdGF0dXMuaXNfb2soKSB7IHJldHVybiBFcnIoX2FpZGxfc3RhdHVzKTsgfQorICAgIGxldCBfYWlkbF9yZXR1cm46IE9wdGlvbjxWZWM8T3B0aW9uPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZV81X0VtcHR5Pj4+ID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKKyAgICBPayhfYWlkbF9yZXR1cm4pCisgIH0KKyAgZm4gYnVpbGRfcGFyY2VsX1JlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUxpc3QoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMl9JVGVzdFNlcnZpY2VfNV9FbXB0eT5dPikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsPiB7CisgICAgbGV0IG11dCBhaWRsX2RhdGEgPSBzZWxmLmJpbmRlci5wcmVwYXJlX3RyYW5zYWN0KCk/OworICAgIGFpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOworICAgIGFpZGxfZGF0YS53cml0ZSgmX2FyZ19pbnB1dCk/OworICAgIE9rKGFpZGxfZGF0YSkKKyAgfQorICBmbiByZWFkX3Jlc3BvbnNlX1JlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUxpc3QoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMl9JVGVzdFNlcnZpY2VfNV9FbXB0eT5dPiwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMl9JVGVzdFNlcnZpY2VfNV9FbXB0eT4+Pj4geworICAgIGlmIGxldCBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKSA9IF9haWRsX3JlcGx5IHsKKyAgICAgIGlmIGxldCBTb21lKF9haWRsX2RlZmF1bHRfaW1wbCkgPSA8U2VsZiBhcyBJVGVzdFNlcnZpY2U+OjpnZXREZWZhdWx0SW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5SZXBlYXROdWxsYWJsZVBhcmNlbGFibGVMaXN0KF9hcmdfaW5wdXQpOworICAgICAgfQorICAgIH0KKyAgICBsZXQgX2FpZGxfcmVwbHkgPSBfYWlkbF9yZXBseT87CisgICAgbGV0IF9haWRsX3N0YXR1czogYmluZGVyOjpTdGF0dXMgPSBfYWlkbF9yZXBseS5yZWFkKCk/OworICAgIGlmICFfYWlkbF9zdGF0dXMuaXNfb2soKSB7IHJldHVybiBFcnIoX2FpZGxfc3RhdHVzKTsgfQorICAgIGxldCBfYWlkbF9yZXR1cm46IE9wdGlvbjxWZWM8T3B0aW9uPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZV81X0VtcHR5Pj4+ID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKKyAgICBPayhfYWlkbF9yZXR1cm4pCisgIH0KKyAgZm4gYnVpbGRfcGFyY2VsX1Rha2VzQW5JQmluZGVyKCZzZWxmLCBfYXJnX2lucHV0OiAmYmluZGVyOjpTcElCaW5kZXIpIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbD4geworICAgIGxldCBtdXQgYWlkbF9kYXRhID0gc2VsZi5iaW5kZXIucHJlcGFyZV90cmFuc2FjdCgpPzsKKyAgICBhaWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKKyAgICBhaWRsX2RhdGEud3JpdGUoX2FyZ19pbnB1dCk/OworICAgIE9rKGFpZGxfZGF0YSkKKyAgfQorICBmbiByZWFkX3Jlc3BvbnNlX1Rha2VzQW5JQmluZGVyKCZzZWxmLCBfYXJnX2lucHV0OiAmYmluZGVyOjpTcElCaW5kZXIsIF9haWRsX3JlcGx5OiBzdGQ6OnJlc3VsdDo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbCwgYmluZGVyOjpTdGF0dXNDb2RlPikgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKICAgICBpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7CiAgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSVRlc3RTZXJ2aWNlPjo6Z2V0RGVmYXVsdEltcGwoKSB7CiAgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwuVGFrZXNBbklCaW5kZXIoX2FyZ19pbnB1dCk7CkBAIC0xMDQwLDEyICsxNjY3LDEzIEBACiAgICAgaWYgIV9haWRsX3N0YXR1cy5pc19vaygpIHsgcmV0dXJuIEVycihfYWlkbF9zdGF0dXMpOyB9CiAgICAgT2soKCkpCiAgIH0KLSAgZm4gVGFrZXNBTnVsbGFibGVJQmluZGVyKCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JmJpbmRlcjo6U3BJQmluZGVyPikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8KCk+IHsKLSAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci50cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlRha2VzQU51bGxhYmxlSUJpbmRlciwgYmluZGVyOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6RkxBR19QUklWQVRFX0xPQ0FMLCB8X2FpZGxfZGF0YXwgewotICAgICAgX2FpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOwotICAgICAgX2FpZGxfZGF0YS53cml0ZSgmX2FyZ19pbnB1dCk/OwotICAgICAgT2soKCkpCi0gICAgfSk7CisgIGZuIGJ1aWxkX3BhcmNlbF9UYWtlc0FOdWxsYWJsZUlCaW5kZXIoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmYmluZGVyOjpTcElCaW5kZXI+KSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7CisgICAgYWlkbF9kYXRhLndyaXRlKCZfYXJnX2lucHV0KT87CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfVGFrZXNBTnVsbGFibGVJQmluZGVyKCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JmJpbmRlcjo6U3BJQmluZGVyPiwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4gewogICAgIGlmIGxldCBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKSA9IF9haWRsX3JlcGx5IHsKICAgICAgIGlmIGxldCBTb21lKF9haWRsX2RlZmF1bHRfaW1wbCkgPSA8U2VsZiBhcyBJVGVzdFNlcnZpY2U+OjpnZXREZWZhdWx0SW1wbCgpIHsKICAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5UYWtlc0FOdWxsYWJsZUlCaW5kZXIoX2FyZ19pbnB1dCk7CkBAIC0xMDU2LDEyICsxNjg0LDQ3IEBACiAgICAgaWYgIV9haWRsX3N0YXR1cy5pc19vaygpIHsgcmV0dXJuIEVycihfYWlkbF9zdGF0dXMpOyB9CiAgICAgT2soKCkpCiAgIH0KLSAgZm4gUmVwZWF0VXRmOENwcFN0cmluZygmc2VsZiwgX2FyZ190b2tlbjogJnN0cikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8U3RyaW5nPiB7Ci0gICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIudHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXBlYXRVdGY4Q3BwU3RyaW5nLCBiaW5kZXI6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpGTEFHX1BSSVZBVEVfTE9DQUwsIHxfYWlkbF9kYXRhfCB7Ci0gICAgICBfYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7Ci0gICAgICBfYWlkbF9kYXRhLndyaXRlKF9hcmdfdG9rZW4pPzsKLSAgICAgIE9rKCgpKQotICAgIH0pOworICBmbiBidWlsZF9wYXJjZWxfVGFrZXNBbklCaW5kZXJMaXN0KCZzZWxmLCBfYXJnX2lucHV0OiAmW2JpbmRlcjo6U3BJQmluZGVyXSkgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsPiB7CisgICAgbGV0IG11dCBhaWRsX2RhdGEgPSBzZWxmLmJpbmRlci5wcmVwYXJlX3RyYW5zYWN0KCk/OworICAgIGFpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOworICAgIGFpZGxfZGF0YS53cml0ZShfYXJnX2lucHV0KT87CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfVGFrZXNBbklCaW5kZXJMaXN0KCZzZWxmLCBfYXJnX2lucHV0OiAmW2JpbmRlcjo6U3BJQmluZGVyXSwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4geworICAgIGlmIGxldCBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKSA9IF9haWRsX3JlcGx5IHsKKyAgICAgIGlmIGxldCBTb21lKF9haWRsX2RlZmF1bHRfaW1wbCkgPSA8U2VsZiBhcyBJVGVzdFNlcnZpY2U+OjpnZXREZWZhdWx0SW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5UYWtlc0FuSUJpbmRlckxpc3QoX2FyZ19pbnB1dCk7CisgICAgICB9CisgICAgfQorICAgIGxldCBfYWlkbF9yZXBseSA9IF9haWRsX3JlcGx5PzsKKyAgICBsZXQgX2FpZGxfc3RhdHVzOiBiaW5kZXI6OlN0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWQoKT87CisgICAgaWYgIV9haWRsX3N0YXR1cy5pc19vaygpIHsgcmV0dXJuIEVycihfYWlkbF9zdGF0dXMpOyB9CisgICAgT2soKCkpCisgIH0KKyAgZm4gYnVpbGRfcGFyY2VsX1Rha2VzQU51bGxhYmxlSUJpbmRlckxpc3QoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj5dPikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsPiB7CisgICAgbGV0IG11dCBhaWRsX2RhdGEgPSBzZWxmLmJpbmRlci5wcmVwYXJlX3RyYW5zYWN0KCk/OworICAgIGFpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOworICAgIGFpZGxfZGF0YS53cml0ZSgmX2FyZ19pbnB1dCk/OworICAgIE9rKGFpZGxfZGF0YSkKKyAgfQorICBmbiByZWFkX3Jlc3BvbnNlX1Rha2VzQU51bGxhYmxlSUJpbmRlckxpc3QoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj5dPiwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4geworICAgIGlmIGxldCBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKSA9IF9haWRsX3JlcGx5IHsKKyAgICAgIGlmIGxldCBTb21lKF9haWRsX2RlZmF1bHRfaW1wbCkgPSA8U2VsZiBhcyBJVGVzdFNlcnZpY2U+OjpnZXREZWZhdWx0SW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5UYWtlc0FOdWxsYWJsZUlCaW5kZXJMaXN0KF9hcmdfaW5wdXQpOworICAgICAgfQorICAgIH0KKyAgICBsZXQgX2FpZGxfcmVwbHkgPSBfYWlkbF9yZXBseT87CisgICAgbGV0IF9haWRsX3N0YXR1czogYmluZGVyOjpTdGF0dXMgPSBfYWlkbF9yZXBseS5yZWFkKCk/OworICAgIGlmICFfYWlkbF9zdGF0dXMuaXNfb2soKSB7IHJldHVybiBFcnIoX2FpZGxfc3RhdHVzKTsgfQorICAgIE9rKCgpKQorICB9CisgIGZuIGJ1aWxkX3BhcmNlbF9SZXBlYXRVdGY4Q3BwU3RyaW5nKCZzZWxmLCBfYXJnX3Rva2VuOiAmc3RyKSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7CisgICAgYWlkbF9kYXRhLndyaXRlKF9hcmdfdG9rZW4pPzsKKyAgICBPayhhaWRsX2RhdGEpCisgIH0KKyAgZm4gcmVhZF9yZXNwb25zZV9SZXBlYXRVdGY4Q3BwU3RyaW5nKCZzZWxmLCBfYXJnX3Rva2VuOiAmc3RyLCBfYWlkbF9yZXBseTogc3RkOjpyZXN1bHQ6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWwsIGJpbmRlcjo6U3RhdHVzQ29kZT4pIC0+IGJpbmRlcjo6UmVzdWx0PFN0cmluZz4gewogICAgIGlmIGxldCBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKSA9IF9haWRsX3JlcGx5IHsKICAgICAgIGlmIGxldCBTb21lKF9haWRsX2RlZmF1bHRfaW1wbCkgPSA8U2VsZiBhcyBJVGVzdFNlcnZpY2U+OjpnZXREZWZhdWx0SW1wbCgpIHsKICAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5SZXBlYXRVdGY4Q3BwU3RyaW5nKF9hcmdfdG9rZW4pOwpAQCAtMTA3MywxMiArMTczNiwxMyBAQAogICAgIGxldCBfYWlkbF9yZXR1cm46IFN0cmluZyA9IF9haWRsX3JlcGx5LnJlYWQoKT87CiAgICAgT2soX2FpZGxfcmV0dXJuKQogICB9Ci0gIGZuIFJlcGVhdE51bGxhYmxlVXRmOENwcFN0cmluZygmc2VsZiwgX2FyZ190b2tlbjogT3B0aW9uPCZzdHI+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxPcHRpb248U3RyaW5nPj4gewotICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnRyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0TnVsbGFibGVVdGY4Q3BwU3RyaW5nLCBiaW5kZXI6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpGTEFHX1BSSVZBVEVfTE9DQUwsIHxfYWlkbF9kYXRhfCB7Ci0gICAgICBfYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7Ci0gICAgICBfYWlkbF9kYXRhLndyaXRlKCZfYXJnX3Rva2VuKT87Ci0gICAgICBPaygoKSkKLSAgICB9KTsKKyAgZm4gYnVpbGRfcGFyY2VsX1JlcGVhdE51bGxhYmxlVXRmOENwcFN0cmluZygmc2VsZiwgX2FyZ190b2tlbjogT3B0aW9uPCZzdHI+KSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7CisgICAgYWlkbF9kYXRhLndyaXRlKCZfYXJnX3Rva2VuKT87CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfUmVwZWF0TnVsbGFibGVVdGY4Q3BwU3RyaW5nKCZzZWxmLCBfYXJnX3Rva2VuOiBPcHRpb248JnN0cj4sIF9haWRsX3JlcGx5OiBzdGQ6OnJlc3VsdDo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbCwgYmluZGVyOjpTdGF0dXNDb2RlPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFN0cmluZz4+IHsKICAgICBpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7CiAgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSVRlc3RTZXJ2aWNlPjo6Z2V0RGVmYXVsdEltcGwoKSB7CiAgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwuUmVwZWF0TnVsbGFibGVVdGY4Q3BwU3RyaW5nKF9hcmdfdG9rZW4pOwpAQCAtMTA5MCwxMyArMTc1NCwxNCBAQAogICAgIGxldCBfYWlkbF9yZXR1cm46IE9wdGlvbjxTdHJpbmc+ID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKICAgICBPayhfYWlkbF9yZXR1cm4pCiAgIH0KLSAgZm4gUmV2ZXJzZVV0ZjhDcHBTdHJpbmcoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbU3RyaW5nXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8U3RyaW5nPikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8VmVjPFN0cmluZz4+IHsKLSAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci50cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJldmVyc2VVdGY4Q3BwU3RyaW5nLCBiaW5kZXI6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpGTEFHX1BSSVZBVEVfTE9DQUwsIHxfYWlkbF9kYXRhfCB7Ci0gICAgICBfYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7Ci0gICAgICBfYWlkbF9kYXRhLndyaXRlKF9hcmdfaW5wdXQpPzsKLSAgICAgIF9haWRsX2RhdGEud3JpdGVfc2xpY2Vfc2l6ZShTb21lKF9hcmdfcmVwZWF0ZWQpKT87Ci0gICAgICBPaygoKSkKLSAgICB9KTsKKyAgZm4gYnVpbGRfcGFyY2VsX1JldmVyc2VVdGY4Q3BwU3RyaW5nKCZzZWxmLCBfYXJnX2lucHV0OiAmW1N0cmluZ10sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPFN0cmluZz4pIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbD4geworICAgIGxldCBtdXQgYWlkbF9kYXRhID0gc2VsZi5iaW5kZXIucHJlcGFyZV90cmFuc2FjdCgpPzsKKyAgICBhaWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKKyAgICBhaWRsX2RhdGEud3JpdGUoX2FyZ19pbnB1dCk/OworICAgIGFpZGxfZGF0YS53cml0ZV9zbGljZV9zaXplKFNvbWUoX2FyZ19yZXBlYXRlZCkpPzsKKyAgICBPayhhaWRsX2RhdGEpCisgIH0KKyAgZm4gcmVhZF9yZXNwb25zZV9SZXZlcnNlVXRmOENwcFN0cmluZygmc2VsZiwgX2FyZ19pbnB1dDogJltTdHJpbmddLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxTdHJpbmc+LCBfYWlkbF9yZXBseTogc3RkOjpyZXN1bHQ6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWwsIGJpbmRlcjo6U3RhdHVzQ29kZT4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxTdHJpbmc+PiB7CiAgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgewogICAgICAgaWYgbGV0IFNvbWUoX2FpZGxfZGVmYXVsdF9pbXBsKSA9IDxTZWxmIGFzIElUZXN0U2VydmljZT46OmdldERlZmF1bHRJbXBsKCkgewogICAgICAgICByZXR1cm4gX2FpZGxfZGVmYXVsdF9pbXBsLlJldmVyc2VVdGY4Q3BwU3RyaW5nKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpOwpAQCAtMTEwNiwxNiArMTc3MSwxNyBAQAogICAgIGxldCBfYWlkbF9zdGF0dXM6IGJpbmRlcjo6U3RhdHVzID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKICAgICBpZiAhX2FpZGxfc3RhdHVzLmlzX29rKCkgeyByZXR1cm4gRXJyKF9haWRsX3N0YXR1cyk7IH0KICAgICBsZXQgX2FpZGxfcmV0dXJuOiBWZWM8U3RyaW5nPiA9IF9haWRsX3JlcGx5LnJlYWQoKT87Ci0gICAgKl9hcmdfcmVwZWF0ZWQgPSBfYWlkbF9yZXBseS5yZWFkKCk/OworICAgIF9haWRsX3JlcGx5LnJlYWRfb250byhfYXJnX3JlcGVhdGVkKT87CiAgICAgT2soX2FpZGxfcmV0dXJuKQogICB9Ci0gIGZuIFJldmVyc2VOdWxsYWJsZVV0ZjhDcHBTdHJpbmcoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxTdHJpbmc+XT4sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgT3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxTdHJpbmc+Pj4+IHsKLSAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci50cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJldmVyc2VOdWxsYWJsZVV0ZjhDcHBTdHJpbmcsIGJpbmRlcjo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OkZMQUdfUFJJVkFURV9MT0NBTCwgfF9haWRsX2RhdGF8IHsKLSAgICAgIF9haWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKLSAgICAgIF9haWRsX2RhdGEud3JpdGUoJl9hcmdfaW5wdXQpPzsKLSAgICAgIF9haWRsX2RhdGEud3JpdGVfc2xpY2Vfc2l6ZShfYXJnX3JlcGVhdGVkLmFzX2RlcmVmKCkpPzsKLSAgICAgIE9rKCgpKQotICAgIH0pOworICBmbiBidWlsZF9wYXJjZWxfUmV2ZXJzZU51bGxhYmxlVXRmOENwcFN0cmluZygmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbT3B0aW9uPFN0cmluZz5dPiwgX2FyZ19yZXBlYXRlZDogJm11dCBPcHRpb248VmVjPE9wdGlvbjxTdHJpbmc+Pj4pIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbD4geworICAgIGxldCBtdXQgYWlkbF9kYXRhID0gc2VsZi5iaW5kZXIucHJlcGFyZV90cmFuc2FjdCgpPzsKKyAgICBhaWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKKyAgICBhaWRsX2RhdGEud3JpdGUoJl9hcmdfaW5wdXQpPzsKKyAgICBhaWRsX2RhdGEud3JpdGVfc2xpY2Vfc2l6ZShfYXJnX3JlcGVhdGVkLmFzX2RlcmVmKCkpPzsKKyAgICBPayhhaWRsX2RhdGEpCisgIH0KKyAgZm4gcmVhZF9yZXNwb25zZV9SZXZlcnNlTnVsbGFibGVVdGY4Q3BwU3RyaW5nKCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltPcHRpb248U3RyaW5nPl0+LCBfYXJnX3JlcGVhdGVkOiAmbXV0IE9wdGlvbjxWZWM8T3B0aW9uPFN0cmluZz4+PiwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxTdHJpbmc+Pj4+IHsKICAgICBpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7CiAgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSVRlc3RTZXJ2aWNlPjo6Z2V0RGVmYXVsdEltcGwoKSB7CiAgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwuUmV2ZXJzZU51bGxhYmxlVXRmOENwcFN0cmluZyhfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKTsKQEAgLTExMjUsMTUgKzE3OTEsMTYgQEAKICAgICBsZXQgX2FpZGxfc3RhdHVzOiBiaW5kZXI6OlN0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWQoKT87CiAgICAgaWYgIV9haWRsX3N0YXR1cy5pc19vaygpIHsgcmV0dXJuIEVycihfYWlkbF9zdGF0dXMpOyB9CiAgICAgbGV0IF9haWRsX3JldHVybjogT3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+ID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKLSAgICAqX2FyZ19yZXBlYXRlZCA9IF9haWRsX3JlcGx5LnJlYWQoKT87CisgICAgX2FpZGxfcmVwbHkucmVhZF9vbnRvKF9hcmdfcmVwZWF0ZWQpPzsKICAgICBPayhfYWlkbF9yZXR1cm4pCiAgIH0KLSAgZm4gUmV2ZXJzZVV0ZjhDcHBTdHJpbmdMaXN0KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltPcHRpb248U3RyaW5nPl0+LCBfYXJnX3JlcGVhdGVkOiAmbXV0IE9wdGlvbjxWZWM8T3B0aW9uPFN0cmluZz4+PikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+PiB7Ci0gICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIudHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXZlcnNlVXRmOENwcFN0cmluZ0xpc3QsIGJpbmRlcjo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OkZMQUdfUFJJVkFURV9MT0NBTCwgfF9haWRsX2RhdGF8IHsKLSAgICAgIF9haWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKLSAgICAgIF9haWRsX2RhdGEud3JpdGUoJl9hcmdfaW5wdXQpPzsKLSAgICAgIE9rKCgpKQotICAgIH0pOworICBmbiBidWlsZF9wYXJjZWxfUmV2ZXJzZVV0ZjhDcHBTdHJpbmdMaXN0KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltPcHRpb248U3RyaW5nPl0+LCBfYXJnX3JlcGVhdGVkOiAmbXV0IE9wdGlvbjxWZWM8T3B0aW9uPFN0cmluZz4+PikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsPiB7CisgICAgbGV0IG11dCBhaWRsX2RhdGEgPSBzZWxmLmJpbmRlci5wcmVwYXJlX3RyYW5zYWN0KCk/OworICAgIGFpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOworICAgIGFpZGxfZGF0YS53cml0ZSgmX2FyZ19pbnB1dCk/OworICAgIE9rKGFpZGxfZGF0YSkKKyAgfQorICBmbiByZWFkX3Jlc3BvbnNlX1JldmVyc2VVdGY4Q3BwU3RyaW5nTGlzdCgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbT3B0aW9uPFN0cmluZz5dPiwgX2FyZ19yZXBlYXRlZDogJm11dCBPcHRpb248VmVjPE9wdGlvbjxTdHJpbmc+Pj4sIF9haWRsX3JlcGx5OiBzdGQ6OnJlc3VsdDo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbCwgYmluZGVyOjpTdGF0dXNDb2RlPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+PiB7CiAgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgewogICAgICAgaWYgbGV0IFNvbWUoX2FpZGxfZGVmYXVsdF9pbXBsKSA9IDxTZWxmIGFzIElUZXN0U2VydmljZT46OmdldERlZmF1bHRJbXBsKCkgewogICAgICAgICByZXR1cm4gX2FpZGxfZGVmYXVsdF9pbXBsLlJldmVyc2VVdGY4Q3BwU3RyaW5nTGlzdChfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKTsKQEAgLTExNDMsMTUgKzE4MTAsMTYgQEAKICAgICBsZXQgX2FpZGxfc3RhdHVzOiBiaW5kZXI6OlN0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWQoKT87CiAgICAgaWYgIV9haWRsX3N0YXR1cy5pc19vaygpIHsgcmV0dXJuIEVycihfYWlkbF9zdGF0dXMpOyB9CiAgICAgbGV0IF9haWRsX3JldHVybjogT3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+ID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKLSAgICAqX2FyZ19yZXBlYXRlZCA9IF9haWRsX3JlcGx5LnJlYWQoKT87CisgICAgX2FpZGxfcmVwbHkucmVhZF9vbnRvKF9hcmdfcmVwZWF0ZWQpPzsKICAgICBPayhfYWlkbF9yZXR1cm4pCiAgIH0KLSAgZm4gR2V0Q2FsbGJhY2soJnNlbGYsIF9hcmdfcmV0dXJuX251bGw6IGJvb2wpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+Pj4gewotICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnRyYW5zYWN0KHRyYW5zYWN0aW9uczo6R2V0Q2FsbGJhY2ssIGJpbmRlcjo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OkZMQUdfUFJJVkFURV9MT0NBTCwgfF9haWRsX2RhdGF8IHsKLSAgICAgIF9haWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKLSAgICAgIF9haWRsX2RhdGEud3JpdGUoJl9hcmdfcmV0dXJuX251bGwpPzsKLSAgICAgIE9rKCgpKQotICAgIH0pOworICBmbiBidWlsZF9wYXJjZWxfR2V0Q2FsbGJhY2soJnNlbGYsIF9hcmdfcmV0dXJuX251bGw6IGJvb2wpIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbD4geworICAgIGxldCBtdXQgYWlkbF9kYXRhID0gc2VsZi5iaW5kZXIucHJlcGFyZV90cmFuc2FjdCgpPzsKKyAgICBhaWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKKyAgICBhaWRsX2RhdGEud3JpdGUoJl9hcmdfcmV0dXJuX251bGwpPzsKKyAgICBPayhhaWRsX2RhdGEpCisgIH0KKyAgZm4gcmVhZF9yZXNwb25zZV9HZXRDYWxsYmFjaygmc2VsZiwgX2FyZ19yZXR1cm5fbnVsbDogYm9vbCwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPj4+IHsKICAgICBpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7CiAgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSVRlc3RTZXJ2aWNlPjo6Z2V0RGVmYXVsdEltcGwoKSB7CiAgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwuR2V0Q2FsbGJhY2soX2FyZ19yZXR1cm5fbnVsbCk7CkBAIC0xMTYzLDEyICsxODMxLDEzIEBACiAgICAgbGV0IF9haWRsX3JldHVybjogT3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz4+ID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKICAgICBPayhfYWlkbF9yZXR1cm4pCiAgIH0KLSAgZm4gRmlsbE91dFN0cnVjdHVyZWRQYXJjZWxhYmxlKCZzZWxmLCBfYXJnX3BhcmNlbDogJm11dCBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18yMF9TdHJ1Y3R1cmVkUGFyY2VsYWJsZSkgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8KCk+IHsKLSAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci50cmFuc2FjdCh0cmFuc2FjdGlvbnM6OkZpbGxPdXRTdHJ1Y3R1cmVkUGFyY2VsYWJsZSwgYmluZGVyOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6RkxBR19QUklWQVRFX0xPQ0FMLCB8X2FpZGxfZGF0YXwgewotICAgICAgX2FpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOwotICAgICAgX2FpZGxfZGF0YS53cml0ZShfYXJnX3BhcmNlbCk/OwotICAgICAgT2soKCkpCi0gICAgfSk7CisgIGZuIGJ1aWxkX3BhcmNlbF9GaWxsT3V0U3RydWN0dXJlZFBhcmNlbGFibGUoJnNlbGYsIF9hcmdfcGFyY2VsOiAmbXV0IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzIwX1N0cnVjdHVyZWRQYXJjZWxhYmxlKSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7CisgICAgYWlkbF9kYXRhLndyaXRlKF9hcmdfcGFyY2VsKT87CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfRmlsbE91dFN0cnVjdHVyZWRQYXJjZWxhYmxlKCZzZWxmLCBfYXJnX3BhcmNlbDogJm11dCBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18yMF9TdHJ1Y3R1cmVkUGFyY2VsYWJsZSwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4gewogICAgIGlmIGxldCBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKSA9IF9haWRsX3JlcGx5IHsKICAgICAgIGlmIGxldCBTb21lKF9haWRsX2RlZmF1bHRfaW1wbCkgPSA8U2VsZiBhcyBJVGVzdFNlcnZpY2U+OjpnZXREZWZhdWx0SW1wbCgpIHsKICAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5GaWxsT3V0U3RydWN0dXJlZFBhcmNlbGFibGUoX2FyZ19wYXJjZWwpOwpAQCAtMTE3NywxNCArMTg0Niw5MSBAQAogICAgIGxldCBfYWlkbF9yZXBseSA9IF9haWRsX3JlcGx5PzsKICAgICBsZXQgX2FpZGxfc3RhdHVzOiBiaW5kZXI6OlN0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWQoKT87CiAgICAgaWYgIV9haWRsX3N0YXR1cy5pc19vaygpIHsgcmV0dXJuIEVycihfYWlkbF9zdGF0dXMpOyB9Ci0gICAgKl9hcmdfcGFyY2VsID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKKyAgICBfYWlkbF9yZXBseS5yZWFkX29udG8oX2FyZ19wYXJjZWwpPzsKICAgICBPaygoKSkKICAgfQotICBmbiBHZXRPbGROYW1lSW50ZXJmYWNlKCZzZWxmKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9JT2xkTmFtZT4+IHsKLSAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci50cmFuc2FjdCh0cmFuc2FjdGlvbnM6OkdldE9sZE5hbWVJbnRlcmZhY2UsIGJpbmRlcjo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OkZMQUdfUFJJVkFURV9MT0NBTCwgfF9haWRsX2RhdGF8IHsKLSAgICAgIF9haWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKLSAgICAgIE9rKCgpKQotICAgIH0pOworICBmbiBidWlsZF9wYXJjZWxfUmVwZWF0RXh0ZW5kYWJsZVBhcmNlbGFibGUoJnNlbGYsIF9hcmdfZXA6ICZjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c185X2V4dGVuc2lvbl8yMF9FeHRlbmRhYmxlUGFyY2VsYWJsZSwgX2FyZ19lcDI6ICZtdXQgY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOV9leHRlbnNpb25fMjBfRXh0ZW5kYWJsZVBhcmNlbGFibGUpIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbD4geworICAgIGxldCBtdXQgYWlkbF9kYXRhID0gc2VsZi5iaW5kZXIucHJlcGFyZV90cmFuc2FjdCgpPzsKKyAgICBhaWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKKyAgICBhaWRsX2RhdGEud3JpdGUoX2FyZ19lcCk/OworICAgIE9rKGFpZGxfZGF0YSkKKyAgfQorICBmbiByZWFkX3Jlc3BvbnNlX1JlcGVhdEV4dGVuZGFibGVQYXJjZWxhYmxlKCZzZWxmLCBfYXJnX2VwOiAmY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOV9leHRlbnNpb25fMjBfRXh0ZW5kYWJsZVBhcmNlbGFibGUsIF9hcmdfZXAyOiAmbXV0IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzlfZXh0ZW5zaW9uXzIwX0V4dGVuZGFibGVQYXJjZWxhYmxlLCBfYWlkbF9yZXBseTogc3RkOjpyZXN1bHQ6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWwsIGJpbmRlcjo6U3RhdHVzQ29kZT4pIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7CisgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgeworICAgICAgaWYgbGV0IFNvbWUoX2FpZGxfZGVmYXVsdF9pbXBsKSA9IDxTZWxmIGFzIElUZXN0U2VydmljZT46OmdldERlZmF1bHRJbXBsKCkgeworICAgICAgICByZXR1cm4gX2FpZGxfZGVmYXVsdF9pbXBsLlJlcGVhdEV4dGVuZGFibGVQYXJjZWxhYmxlKF9hcmdfZXAsIF9hcmdfZXAyKTsKKyAgICAgIH0KKyAgICB9CisgICAgbGV0IF9haWRsX3JlcGx5ID0gX2FpZGxfcmVwbHk/OworICAgIGxldCBfYWlkbF9zdGF0dXM6IGJpbmRlcjo6U3RhdHVzID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKKyAgICBpZiAhX2FpZGxfc3RhdHVzLmlzX29rKCkgeyByZXR1cm4gRXJyKF9haWRsX3N0YXR1cyk7IH0KKyAgICBfYWlkbF9yZXBseS5yZWFkX29udG8oX2FyZ19lcDIpPzsKKyAgICBPaygoKSkKKyAgfQorICBmbiBidWlsZF9wYXJjZWxfUmV2ZXJzZUxpc3QoJnNlbGYsIF9hcmdfbGlzdDogJmNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEzX1JlY3Vyc2l2ZUxpc3QpIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbD4geworICAgIGxldCBtdXQgYWlkbF9kYXRhID0gc2VsZi5iaW5kZXIucHJlcGFyZV90cmFuc2FjdCgpPzsKKyAgICBhaWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKKyAgICBhaWRsX2RhdGEud3JpdGUoX2FyZ19saXN0KT87CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfUmV2ZXJzZUxpc3QoJnNlbGYsIF9hcmdfbGlzdDogJmNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEzX1JlY3Vyc2l2ZUxpc3QsIF9haWRsX3JlcGx5OiBzdGQ6OnJlc3VsdDo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbCwgYmluZGVyOjpTdGF0dXNDb2RlPikgLT4gYmluZGVyOjpSZXN1bHQ8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTNfUmVjdXJzaXZlTGlzdD4geworICAgIGlmIGxldCBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKSA9IF9haWRsX3JlcGx5IHsKKyAgICAgIGlmIGxldCBTb21lKF9haWRsX2RlZmF1bHRfaW1wbCkgPSA8U2VsZiBhcyBJVGVzdFNlcnZpY2U+OjpnZXREZWZhdWx0SW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5SZXZlcnNlTGlzdChfYXJnX2xpc3QpOworICAgICAgfQorICAgIH0KKyAgICBsZXQgX2FpZGxfcmVwbHkgPSBfYWlkbF9yZXBseT87CisgICAgbGV0IF9haWRsX3N0YXR1czogYmluZGVyOjpTdGF0dXMgPSBfYWlkbF9yZXBseS5yZWFkKCk/OworICAgIGlmICFfYWlkbF9zdGF0dXMuaXNfb2soKSB7IHJldHVybiBFcnIoX2FpZGxfc3RhdHVzKTsgfQorICAgIGxldCBfYWlkbF9yZXR1cm46IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEzX1JlY3Vyc2l2ZUxpc3QgPSBfYWlkbF9yZXBseS5yZWFkKCk/OworICAgIE9rKF9haWRsX3JldHVybikKKyAgfQorICBmbiBidWlsZF9wYXJjZWxfUmV2ZXJzZUlCaW5kZXJBcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogJltiaW5kZXI6OlNwSUJpbmRlcl0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPE9wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj4+KSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7CisgICAgYWlkbF9kYXRhLndyaXRlKF9hcmdfaW5wdXQpPzsKKyAgICBhaWRsX2RhdGEud3JpdGVfc2xpY2Vfc2l6ZShTb21lKF9hcmdfcmVwZWF0ZWQpKT87CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfUmV2ZXJzZUlCaW5kZXJBcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogJltiaW5kZXI6OlNwSUJpbmRlcl0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPE9wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj4+LCBfYWlkbF9yZXBseTogc3RkOjpyZXN1bHQ6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWwsIGJpbmRlcjo6U3RhdHVzQ29kZT4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxiaW5kZXI6OlNwSUJpbmRlcj4+IHsKKyAgICBpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7CisgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSVRlc3RTZXJ2aWNlPjo6Z2V0RGVmYXVsdEltcGwoKSB7CisgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwuUmV2ZXJzZUlCaW5kZXJBcnJheShfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKTsKKyAgICAgIH0KKyAgICB9CisgICAgbGV0IF9haWRsX3JlcGx5ID0gX2FpZGxfcmVwbHk/OworICAgIGxldCBfYWlkbF9zdGF0dXM6IGJpbmRlcjo6U3RhdHVzID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKKyAgICBpZiAhX2FpZGxfc3RhdHVzLmlzX29rKCkgeyByZXR1cm4gRXJyKF9haWRsX3N0YXR1cyk7IH0KKyAgICBsZXQgX2FpZGxfcmV0dXJuOiBWZWM8YmluZGVyOjpTcElCaW5kZXI+ID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKKyAgICBfYWlkbF9yZXBseS5yZWFkX29udG8oX2FyZ19yZXBlYXRlZCk/OworICAgIE9rKF9haWRsX3JldHVybikKKyAgfQorICBmbiBidWlsZF9wYXJjZWxfUmV2ZXJzZU51bGxhYmxlSUJpbmRlckFycmF5KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltPcHRpb248YmluZGVyOjpTcElCaW5kZXI+XT4sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgT3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTcElCaW5kZXI+Pj4pIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbD4geworICAgIGxldCBtdXQgYWlkbF9kYXRhID0gc2VsZi5iaW5kZXIucHJlcGFyZV90cmFuc2FjdCgpPzsKKyAgICBhaWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKKyAgICBhaWRsX2RhdGEud3JpdGUoJl9hcmdfaW5wdXQpPzsKKyAgICBhaWRsX2RhdGEud3JpdGVfc2xpY2Vfc2l6ZShfYXJnX3JlcGVhdGVkLmFzX2RlcmVmKCkpPzsKKyAgICBPayhhaWRsX2RhdGEpCisgIH0KKyAgZm4gcmVhZF9yZXNwb25zZV9SZXZlcnNlTnVsbGFibGVJQmluZGVyQXJyYXkoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj5dPiwgX2FyZ19yZXBlYXRlZDogJm11dCBPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj4+PiwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj4+Pj4geworICAgIGlmIGxldCBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKSA9IF9haWRsX3JlcGx5IHsKKyAgICAgIGlmIGxldCBTb21lKF9haWRsX2RlZmF1bHRfaW1wbCkgPSA8U2VsZiBhcyBJVGVzdFNlcnZpY2U+OjpnZXREZWZhdWx0SW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5SZXZlcnNlTnVsbGFibGVJQmluZGVyQXJyYXkoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCk7CisgICAgICB9CisgICAgfQorICAgIGxldCBfYWlkbF9yZXBseSA9IF9haWRsX3JlcGx5PzsKKyAgICBsZXQgX2FpZGxfc3RhdHVzOiBiaW5kZXI6OlN0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWQoKT87CisgICAgaWYgIV9haWRsX3N0YXR1cy5pc19vaygpIHsgcmV0dXJuIEVycihfYWlkbF9zdGF0dXMpOyB9CisgICAgbGV0IF9haWRsX3JldHVybjogT3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTcElCaW5kZXI+Pj4gPSBfYWlkbF9yZXBseS5yZWFkKCk/OworICAgIF9haWRsX3JlcGx5LnJlYWRfb250byhfYXJnX3JlcGVhdGVkKT87CisgICAgT2soX2FpZGxfcmV0dXJuKQorICB9CisgIGZuIGJ1aWxkX3BhcmNlbF9HZXRPbGROYW1lSW50ZXJmYWNlKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfR2V0T2xkTmFtZUludGVyZmFjZSgmc2VsZiwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9JT2xkTmFtZT4+IHsKICAgICBpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7CiAgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSVRlc3RTZXJ2aWNlPjo6Z2V0RGVmYXVsdEltcGwoKSB7CiAgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwuR2V0T2xkTmFtZUludGVyZmFjZSgpOwpAQCAtMTE5NiwxMSArMTk0MiwxMiBAQAogICAgIGxldCBfYWlkbF9yZXR1cm46IGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0lPbGROYW1lPiA9IF9haWRsX3JlcGx5LnJlYWQoKT87CiAgICAgT2soX2FpZGxfcmV0dXJuKQogICB9Ci0gIGZuIEdldE5ld05hbWVJbnRlcmZhY2UoJnNlbGYpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0lOZXdOYW1lPj4gewotICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnRyYW5zYWN0KHRyYW5zYWN0aW9uczo6R2V0TmV3TmFtZUludGVyZmFjZSwgYmluZGVyOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6RkxBR19QUklWQVRFX0xPQ0FMLCB8X2FpZGxfZGF0YXwgewotICAgICAgX2FpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOwotICAgICAgT2soKCkpCi0gICAgfSk7CisgIGZuIGJ1aWxkX3BhcmNlbF9HZXROZXdOYW1lSW50ZXJmYWNlKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfR2V0TmV3TmFtZUludGVyZmFjZSgmc2VsZiwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9JTmV3TmFtZT4+IHsKICAgICBpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7CiAgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSVRlc3RTZXJ2aWNlPjo6Z2V0RGVmYXVsdEltcGwoKSB7CiAgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwuR2V0TmV3TmFtZUludGVyZmFjZSgpOwpAQCAtMTIxMiwxMSArMTk1OSwzMCBAQAogICAgIGxldCBfYWlkbF9yZXR1cm46IGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0lOZXdOYW1lPiA9IF9haWRsX3JlcGx5LnJlYWQoKT87CiAgICAgT2soX2FpZGxfcmV0dXJuKQogICB9Ci0gIGZuIEdldENwcEphdmFUZXN0cygmc2VsZikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8T3B0aW9uPGJpbmRlcjo6U3BJQmluZGVyPj4gewotICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnRyYW5zYWN0KHRyYW5zYWN0aW9uczo6R2V0Q3BwSmF2YVRlc3RzLCBiaW5kZXI6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpGTEFHX1BSSVZBVEVfTE9DQUwsIHxfYWlkbF9kYXRhfCB7Ci0gICAgICBfYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7Ci0gICAgICBPaygoKSkKLSAgICB9KTsKKyAgZm4gYnVpbGRfcGFyY2VsX0dldFVuaW9uVGFncygmc2VsZiwgX2FyZ19pbnB1dDogJltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c181X1VuaW9uXSkgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsPiB7CisgICAgbGV0IG11dCBhaWRsX2RhdGEgPSBzZWxmLmJpbmRlci5wcmVwYXJlX3RyYW5zYWN0KCk/OworICAgIGFpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOworICAgIGFpZGxfZGF0YS53cml0ZShfYXJnX2lucHV0KT87CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfR2V0VW5pb25UYWdzKCZzZWxmLCBfYXJnX2lucHV0OiAmW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzVfVW5pb25dLCBfYWlkbF9yZXBseTogc3RkOjpyZXN1bHQ6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWwsIGJpbmRlcjo6U3RhdHVzQ29kZT4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c181X1VuaW9uXzNfVGFnPj4geworICAgIGlmIGxldCBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKSA9IF9haWRsX3JlcGx5IHsKKyAgICAgIGlmIGxldCBTb21lKF9haWRsX2RlZmF1bHRfaW1wbCkgPSA8U2VsZiBhcyBJVGVzdFNlcnZpY2U+OjpnZXREZWZhdWx0SW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5HZXRVbmlvblRhZ3MoX2FyZ19pbnB1dCk7CisgICAgICB9CisgICAgfQorICAgIGxldCBfYWlkbF9yZXBseSA9IF9haWRsX3JlcGx5PzsKKyAgICBsZXQgX2FpZGxfc3RhdHVzOiBiaW5kZXI6OlN0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWQoKT87CisgICAgaWYgIV9haWRsX3N0YXR1cy5pc19vaygpIHsgcmV0dXJuIEVycihfYWlkbF9zdGF0dXMpOyB9CisgICAgbGV0IF9haWRsX3JldHVybjogVmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzVfVW5pb25fM19UYWc+ID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKKyAgICBPayhfYWlkbF9yZXR1cm4pCisgIH0KKyAgZm4gYnVpbGRfcGFyY2VsX0dldENwcEphdmFUZXN0cygmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsPiB7CisgICAgbGV0IG11dCBhaWRsX2RhdGEgPSBzZWxmLmJpbmRlci5wcmVwYXJlX3RyYW5zYWN0KCk/OworICAgIGFpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOworICAgIE9rKGFpZGxfZGF0YSkKKyAgfQorICBmbiByZWFkX3Jlc3BvbnNlX0dldENwcEphdmFUZXN0cygmc2VsZiwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248YmluZGVyOjpTcElCaW5kZXI+PiB7CiAgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgewogICAgICAgaWYgbGV0IFNvbWUoX2FpZGxfZGVmYXVsdF9pbXBsKSA9IDxTZWxmIGFzIElUZXN0U2VydmljZT46OmdldERlZmF1bHRJbXBsKCkgewogICAgICAgICByZXR1cm4gX2FpZGxfZGVmYXVsdF9pbXBsLkdldENwcEphdmFUZXN0cygpOwpAQCAtMTIyOCwxMSArMTk5NCwxMiBAQAogICAgIGxldCBfYWlkbF9yZXR1cm46IE9wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj4gPSBfYWlkbF9yZXBseS5yZWFkKCk/OwogICAgIE9rKF9haWRsX3JldHVybikKICAgfQotICBmbiBnZXRCYWNrZW5kVHlwZSgmc2VsZikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTFfQmFja2VuZFR5cGU+IHsKLSAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci50cmFuc2FjdCh0cmFuc2FjdGlvbnM6OmdldEJhY2tlbmRUeXBlLCBiaW5kZXI6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpGTEFHX1BSSVZBVEVfTE9DQUwsIHxfYWlkbF9kYXRhfCB7Ci0gICAgICBfYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7Ci0gICAgICBPaygoKSkKLSAgICB9KTsKKyAgZm4gYnVpbGRfcGFyY2VsX2dldEJhY2tlbmRUeXBlKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfZ2V0QmFja2VuZFR5cGUoJnNlbGYsIF9haWRsX3JlcGx5OiBzdGQ6OnJlc3VsdDo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbCwgYmluZGVyOjpTdGF0dXNDb2RlPikgLT4gYmluZGVyOjpSZXN1bHQ8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTFfQmFja2VuZFR5cGU+IHsKICAgICBpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7CiAgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSVRlc3RTZXJ2aWNlPjo6Z2V0RGVmYXVsdEltcGwoKSB7CiAgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwuZ2V0QmFja2VuZFR5cGUoKTsKQEAgLTEyNDUsNjAgKzIwMTIsMTI2MiBAQAogICAgIE9rKF9haWRsX3JldHVybikKICAgfQogfQotaW1wbCBJVGVzdFNlcnZpY2UgZm9yIGJpbmRlcjo6QmluZGVyPEJuVGVzdFNlcnZpY2U+IHsKLSAgZm4gVW5pbXBsZW1lbnRlZE1ldGhvZCgmc2VsZiwgX2FyZ19hcmc6IGkzMikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8aTMyPiB7IHNlbGYuMC5VbmltcGxlbWVudGVkTWV0aG9kKF9hcmdfYXJnKSB9Ci0gIGZuIERlcHJlY2F0ZWQoJnNlbGYpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PCgpPiB7IHNlbGYuMC5EZXByZWNhdGVkKCkgfQotICBmbiBUZXN0T25ld2F5KCZzZWxmKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDwoKT4geyBzZWxmLjAuVGVzdE9uZXdheSgpIH0KLSAgZm4gUmVwZWF0Qm9vbGVhbigmc2VsZiwgX2FyZ190b2tlbjogYm9vbCkgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8Ym9vbD4geyBzZWxmLjAuUmVwZWF0Qm9vbGVhbihfYXJnX3Rva2VuKSB9Ci0gIGZuIFJlcGVhdEJ5dGUoJnNlbGYsIF9hcmdfdG9rZW46IGk4KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxpOD4geyBzZWxmLjAuUmVwZWF0Qnl0ZShfYXJnX3Rva2VuKSB9Ci0gIGZuIFJlcGVhdENoYXIoJnNlbGYsIF9hcmdfdG9rZW46IHUxNikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8dTE2PiB7IHNlbGYuMC5SZXBlYXRDaGFyKF9hcmdfdG9rZW4pIH0KLSAgZm4gUmVwZWF0SW50KCZzZWxmLCBfYXJnX3Rva2VuOiBpMzIpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PGkzMj4geyBzZWxmLjAuUmVwZWF0SW50KF9hcmdfdG9rZW4pIH0KLSAgZm4gUmVwZWF0TG9uZygmc2VsZiwgX2FyZ190b2tlbjogaTY0KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxpNjQ+IHsgc2VsZi4wLlJlcGVhdExvbmcoX2FyZ190b2tlbikgfQotICBmbiBSZXBlYXRGbG9hdCgmc2VsZiwgX2FyZ190b2tlbjogZjMyKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxmMzI+IHsgc2VsZi4wLlJlcGVhdEZsb2F0KF9hcmdfdG9rZW4pIH0KLSAgZm4gUmVwZWF0RG91YmxlKCZzZWxmLCBfYXJnX3Rva2VuOiBmNjQpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PGY2ND4geyBzZWxmLjAuUmVwZWF0RG91YmxlKF9hcmdfdG9rZW4pIH0KLSAgZm4gUmVwZWF0U3RyaW5nKCZzZWxmLCBfYXJnX3Rva2VuOiAmc3RyKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxTdHJpbmc+IHsgc2VsZi4wLlJlcGVhdFN0cmluZyhfYXJnX3Rva2VuKSB9Ci0gIGZuIFJlcGVhdEJ5dGVFbnVtKCZzZWxmLCBfYXJnX3Rva2VuOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtPiB7IHNlbGYuMC5SZXBlYXRCeXRlRW51bShfYXJnX3Rva2VuKSB9Ci0gIGZuIFJlcGVhdEludEVudW0oJnNlbGYsIF9hcmdfdG9rZW46IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bSkgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtPiB7IHNlbGYuMC5SZXBlYXRJbnRFbnVtKF9hcmdfdG9rZW4pIH0KLSAgZm4gUmVwZWF0TG9uZ0VudW0oJnNlbGYsIF9hcmdfdG9rZW46IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW0pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW0+IHsgc2VsZi4wLlJlcGVhdExvbmdFbnVtKF9hcmdfdG9rZW4pIH0KLSAgZm4gUmV2ZXJzZUJvb2xlYW4oJnNlbGYsIF9hcmdfaW5wdXQ6ICZbYm9vbF0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPGJvb2w+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxWZWM8Ym9vbD4+IHsgc2VsZi4wLlJldmVyc2VCb29sZWFuKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpIH0KLSAgZm4gUmV2ZXJzZUJ5dGUoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbdThdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzx1OD4pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PFZlYzx1OD4+IHsgc2VsZi4wLlJldmVyc2VCeXRlKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpIH0KLSAgZm4gUmV2ZXJzZUNoYXIoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbdTE2XSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8dTE2PikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8VmVjPHUxNj4+IHsgc2VsZi4wLlJldmVyc2VDaGFyKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpIH0KLSAgZm4gUmV2ZXJzZUludCgmc2VsZiwgX2FyZ19pbnB1dDogJltpMzJdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxpMzI+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxWZWM8aTMyPj4geyBzZWxmLjAuUmV2ZXJzZUludChfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSB9Ci0gIGZuIFJldmVyc2VMb25nKCZzZWxmLCBfYXJnX2lucHV0OiAmW2k2NF0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPGk2ND4pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PFZlYzxpNjQ+PiB7IHNlbGYuMC5SZXZlcnNlTG9uZyhfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSB9Ci0gIGZuIFJldmVyc2VGbG9hdCgmc2VsZiwgX2FyZ19pbnB1dDogJltmMzJdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxmMzI+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxWZWM8ZjMyPj4geyBzZWxmLjAuUmV2ZXJzZUZsb2F0KF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpIH0KLSAgZm4gUmV2ZXJzZURvdWJsZSgmc2VsZiwgX2FyZ19pbnB1dDogJltmNjRdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxmNjQ+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxWZWM8ZjY0Pj4geyBzZWxmLjAuUmV2ZXJzZURvdWJsZShfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSB9Ci0gIGZuIFJldmVyc2VTdHJpbmcoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbU3RyaW5nXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8U3RyaW5nPikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8VmVjPFN0cmluZz4+IHsgc2VsZi4wLlJldmVyc2VTdHJpbmcoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCkgfQotICBmbiBSZXZlcnNlQnl0ZUVudW0oJnNlbGYsIF9hcmdfaW5wdXQ6ICZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bV0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW0+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bT4+IHsgc2VsZi4wLlJldmVyc2VCeXRlRW51bShfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSB9Ci0gIGZuIFJldmVyc2VJbnRFbnVtKCZzZWxmLCBfYXJnX2lucHV0OiAmW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bV0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bT4pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW0+PiB7IHNlbGYuMC5SZXZlcnNlSW50RW51bShfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSB9Ci0gIGZuIFJldmVyc2VMb25nRW51bSgmc2VsZiwgX2FyZ19pbnB1dDogJltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bT4pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtPj4geyBzZWxmLjAuUmV2ZXJzZUxvbmdFbnVtKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpIH0KLSAgZm4gR2V0T3RoZXJUZXN0U2VydmljZSgmc2VsZiwgX2FyZ19uYW1lOiAmc3RyKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+PiB7IHNlbGYuMC5HZXRPdGhlclRlc3RTZXJ2aWNlKF9hcmdfbmFtZSkgfQotICBmbiBWZXJpZnlOYW1lKCZzZWxmLCBfYXJnX3NlcnZpY2U6ICZiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+LCBfYXJnX25hbWU6ICZzdHIpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PGJvb2w+IHsgc2VsZi4wLlZlcmlmeU5hbWUoX2FyZ19zZXJ2aWNlLCBfYXJnX25hbWUpIH0KLSAgZm4gUmV2ZXJzZVN0cmluZ0xpc3QoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbU3RyaW5nXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8U3RyaW5nPikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8VmVjPFN0cmluZz4+IHsgc2VsZi4wLlJldmVyc2VTdHJpbmdMaXN0KF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpIH0KLSAgZm4gUmVwZWF0UGFyY2VsRmlsZURlc2NyaXB0b3IoJnNlbGYsIF9hcmdfcmVhZDogJmJpbmRlcjo6cGFyY2VsOjpQYXJjZWxGaWxlRGVzY3JpcHRvcikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8YmluZGVyOjpwYXJjZWw6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPiB7IHNlbGYuMC5SZXBlYXRQYXJjZWxGaWxlRGVzY3JpcHRvcihfYXJnX3JlYWQpIH0KLSAgZm4gUmV2ZXJzZVBhcmNlbEZpbGVEZXNjcmlwdG9yQXJyYXkoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbYmluZGVyOjpwYXJjZWw6OlBhcmNlbEZpbGVEZXNjcmlwdG9yXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8T3B0aW9uPGJpbmRlcjo6cGFyY2VsOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj4+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxWZWM8YmluZGVyOjpwYXJjZWw6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPj4geyBzZWxmLjAuUmV2ZXJzZVBhcmNlbEZpbGVEZXNjcmlwdG9yQXJyYXkoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCkgfQotICBmbiBUaHJvd1NlcnZpY2VFeGNlcHRpb24oJnNlbGYsIF9hcmdfY29kZTogaTMyKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDwoKT4geyBzZWxmLjAuVGhyb3dTZXJ2aWNlRXhjZXB0aW9uKF9hcmdfY29kZSkgfQotICBmbiBSZXBlYXROdWxsYWJsZUludEFycmF5KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltpMzJdPikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8T3B0aW9uPFZlYzxpMzI+Pj4geyBzZWxmLjAuUmVwZWF0TnVsbGFibGVJbnRBcnJheShfYXJnX2lucHV0KSB9Ci0gIGZuIFJlcGVhdE51bGxhYmxlQnl0ZUVudW1BcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bV0+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxPcHRpb248VmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW0+Pj4geyBzZWxmLjAuUmVwZWF0TnVsbGFibGVCeXRlRW51bUFycmF5KF9hcmdfaW5wdXQpIH0KLSAgZm4gUmVwZWF0TnVsbGFibGVJbnRFbnVtQXJyYXkoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bV0+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxPcHRpb248VmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bT4+PiB7IHNlbGYuMC5SZXBlYXROdWxsYWJsZUludEVudW1BcnJheShfYXJnX2lucHV0KSB9Ci0gIGZuIFJlcGVhdE51bGxhYmxlTG9uZ0VudW1BcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bV0+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxPcHRpb248VmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW0+Pj4geyBzZWxmLjAuUmVwZWF0TnVsbGFibGVMb25nRW51bUFycmF5KF9hcmdfaW5wdXQpIH0KLSAgZm4gUmVwZWF0TnVsbGFibGVTdHJpbmcoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmc3RyPikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8T3B0aW9uPFN0cmluZz4+IHsgc2VsZi4wLlJlcGVhdE51bGxhYmxlU3RyaW5nKF9hcmdfaW5wdXQpIH0KLSAgZm4gUmVwZWF0TnVsbGFibGVTdHJpbmdMaXN0KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltPcHRpb248U3RyaW5nPl0+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxTdHJpbmc+Pj4+IHsgc2VsZi4wLlJlcGVhdE51bGxhYmxlU3RyaW5nTGlzdChfYXJnX2lucHV0KSB9Ci0gIGZuIFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18yMF9TdHJ1Y3R1cmVkUGFyY2VsYWJsZT4pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PE9wdGlvbjxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18yMF9TdHJ1Y3R1cmVkUGFyY2VsYWJsZT4+IHsgc2VsZi4wLlJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZShfYXJnX2lucHV0KSB9Ci0gIGZuIFRha2VzQW5JQmluZGVyKCZzZWxmLCBfYXJnX2lucHV0OiAmYmluZGVyOjpTcElCaW5kZXIpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PCgpPiB7IHNlbGYuMC5UYWtlc0FuSUJpbmRlcihfYXJnX2lucHV0KSB9Ci0gIGZuIFRha2VzQU51bGxhYmxlSUJpbmRlcigmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZiaW5kZXI6OlNwSUJpbmRlcj4pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PCgpPiB7IHNlbGYuMC5UYWtlc0FOdWxsYWJsZUlCaW5kZXIoX2FyZ19pbnB1dCkgfQotICBmbiBSZXBlYXRVdGY4Q3BwU3RyaW5nKCZzZWxmLCBfYXJnX3Rva2VuOiAmc3RyKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxTdHJpbmc+IHsgc2VsZi4wLlJlcGVhdFV0ZjhDcHBTdHJpbmcoX2FyZ190b2tlbikgfQotICBmbiBSZXBlYXROdWxsYWJsZVV0ZjhDcHBTdHJpbmcoJnNlbGYsIF9hcmdfdG9rZW46IE9wdGlvbjwmc3RyPikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8T3B0aW9uPFN0cmluZz4+IHsgc2VsZi4wLlJlcGVhdE51bGxhYmxlVXRmOENwcFN0cmluZyhfYXJnX3Rva2VuKSB9Ci0gIGZuIFJldmVyc2VVdGY4Q3BwU3RyaW5nKCZzZWxmLCBfYXJnX2lucHV0OiAmW1N0cmluZ10sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPFN0cmluZz4pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PFZlYzxTdHJpbmc+PiB7IHNlbGYuMC5SZXZlcnNlVXRmOENwcFN0cmluZyhfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSB9Ci0gIGZuIFJldmVyc2VOdWxsYWJsZVV0ZjhDcHBTdHJpbmcoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxTdHJpbmc+XT4sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgT3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxTdHJpbmc+Pj4+IHsgc2VsZi4wLlJldmVyc2VOdWxsYWJsZVV0ZjhDcHBTdHJpbmcoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCkgfQotICBmbiBSZXZlcnNlVXRmOENwcFN0cmluZ0xpc3QoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxTdHJpbmc+XT4sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgT3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxTdHJpbmc+Pj4+IHsgc2VsZi4wLlJldmVyc2VVdGY4Q3BwU3RyaW5nTGlzdChfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSB9Ci0gIGZuIEdldENhbGxiYWNrKCZzZWxmLCBfYXJnX3JldHVybl9udWxsOiBib29sKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPj4+IHsgc2VsZi4wLkdldENhbGxiYWNrKF9hcmdfcmV0dXJuX251bGwpIH0KLSAgZm4gRmlsbE91dFN0cnVjdHVyZWRQYXJjZWxhYmxlKCZzZWxmLCBfYXJnX3BhcmNlbDogJm11dCBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18yMF9TdHJ1Y3R1cmVkUGFyY2VsYWJsZSkgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8KCk+IHsgc2VsZi4wLkZpbGxPdXRTdHJ1Y3R1cmVkUGFyY2VsYWJsZShfYXJnX3BhcmNlbCkgfQotICBmbiBHZXRPbGROYW1lSW50ZXJmYWNlKCZzZWxmKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9JT2xkTmFtZT4+IHsgc2VsZi4wLkdldE9sZE5hbWVJbnRlcmZhY2UoKSB9Ci0gIGZuIEdldE5ld05hbWVJbnRlcmZhY2UoJnNlbGYpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0lOZXdOYW1lPj4geyBzZWxmLjAuR2V0TmV3TmFtZUludGVyZmFjZSgpIH0KLSAgZm4gR2V0Q3BwSmF2YVRlc3RzKCZzZWxmKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxPcHRpb248YmluZGVyOjpTcElCaW5kZXI+PiB7IHNlbGYuMC5HZXRDcHBKYXZhVGVzdHMoKSB9Ci0gIGZuIGdldEJhY2tlbmRUeXBlKCZzZWxmKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMV9CYWNrZW5kVHlwZT4geyBzZWxmLjAuZ2V0QmFja2VuZFR5cGUoKSB9CitpbXBsIElUZXN0U2VydmljZSBmb3IgQnBUZXN0U2VydmljZSB7CisgIGZuIFVuaW1wbGVtZW50ZWRNZXRob2QoJnNlbGYsIF9hcmdfYXJnOiBpMzIpIC0+IGJpbmRlcjo6UmVzdWx0PGkzMj4geworICAgIGxldCBfYWlkbF9kYXRhID0gc2VsZi5idWlsZF9wYXJjZWxfVW5pbXBsZW1lbnRlZE1ldGhvZChfYXJnX2FyZyk/OworICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlVuaW1wbGVtZW50ZWRNZXRob2QsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICBzZWxmLnJlYWRfcmVzcG9uc2VfVW5pbXBsZW1lbnRlZE1ldGhvZChfYXJnX2FyZywgX2FpZGxfcmVwbHkpCisgIH0KKyAgZm4gRGVwcmVjYXRlZCgmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX0RlcHJlY2F0ZWQoKT87CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6RGVwcmVjYXRlZCwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpOworICAgIHNlbGYucmVhZF9yZXNwb25zZV9EZXByZWNhdGVkKF9haWRsX3JlcGx5KQorICB9CisgIGZuIFRlc3RPbmV3YXkoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBzZWxmLmJ1aWxkX3BhcmNlbF9UZXN0T25ld2F5KCk/OworICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlRlc3RPbmV3YXksIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfT05FV0FZIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpOworICAgIHNlbGYucmVhZF9yZXNwb25zZV9UZXN0T25ld2F5KF9haWRsX3JlcGx5KQorICB9CisgIGZuIFJlcGVhdEJvb2xlYW4oJnNlbGYsIF9hcmdfdG9rZW46IGJvb2wpIC0+IGJpbmRlcjo6UmVzdWx0PGJvb2w+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1JlcGVhdEJvb2xlYW4oX2FyZ190b2tlbik/OworICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlcGVhdEJvb2xlYW4sIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmVwZWF0Qm9vbGVhbihfYXJnX3Rva2VuLCBfYWlkbF9yZXBseSkKKyAgfQorICBmbiBSZXBlYXRCeXRlKCZzZWxmLCBfYXJnX3Rva2VuOiBpOCkgLT4gYmluZGVyOjpSZXN1bHQ8aTg+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1JlcGVhdEJ5dGUoX2FyZ190b2tlbik/OworICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlcGVhdEJ5dGUsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmVwZWF0Qnl0ZShfYXJnX3Rva2VuLCBfYWlkbF9yZXBseSkKKyAgfQorICBmbiBSZXBlYXRDaGFyKCZzZWxmLCBfYXJnX3Rva2VuOiB1MTYpIC0+IGJpbmRlcjo6UmVzdWx0PHUxNj4geworICAgIGxldCBfYWlkbF9kYXRhID0gc2VsZi5idWlsZF9wYXJjZWxfUmVwZWF0Q2hhcihfYXJnX3Rva2VuKT87CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0Q2hhciwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpOworICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXBlYXRDaGFyKF9hcmdfdG9rZW4sIF9haWRsX3JlcGx5KQorICB9CisgIGZuIFJlcGVhdEludCgmc2VsZiwgX2FyZ190b2tlbjogaTMyKSAtPiBiaW5kZXI6OlJlc3VsdDxpMzI+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1JlcGVhdEludChfYXJnX3Rva2VuKT87CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0SW50LCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCk7CisgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JlcGVhdEludChfYXJnX3Rva2VuLCBfYWlkbF9yZXBseSkKKyAgfQorICBmbiBSZXBlYXRMb25nKCZzZWxmLCBfYXJnX3Rva2VuOiBpNjQpIC0+IGJpbmRlcjo6UmVzdWx0PGk2ND4geworICAgIGxldCBfYWlkbF9kYXRhID0gc2VsZi5idWlsZF9wYXJjZWxfUmVwZWF0TG9uZyhfYXJnX3Rva2VuKT87CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0TG9uZywgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpOworICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXBlYXRMb25nKF9hcmdfdG9rZW4sIF9haWRsX3JlcGx5KQorICB9CisgIGZuIFJlcGVhdEZsb2F0KCZzZWxmLCBfYXJnX3Rva2VuOiBmMzIpIC0+IGJpbmRlcjo6UmVzdWx0PGYzMj4geworICAgIGxldCBfYWlkbF9kYXRhID0gc2VsZi5idWlsZF9wYXJjZWxfUmVwZWF0RmxvYXQoX2FyZ190b2tlbik/OworICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlcGVhdEZsb2F0LCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCk7CisgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JlcGVhdEZsb2F0KF9hcmdfdG9rZW4sIF9haWRsX3JlcGx5KQorICB9CisgIGZuIFJlcGVhdERvdWJsZSgmc2VsZiwgX2FyZ190b2tlbjogZjY0KSAtPiBiaW5kZXI6OlJlc3VsdDxmNjQ+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1JlcGVhdERvdWJsZShfYXJnX3Rva2VuKT87CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0RG91YmxlLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCk7CisgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JlcGVhdERvdWJsZShfYXJnX3Rva2VuLCBfYWlkbF9yZXBseSkKKyAgfQorICBmbiBSZXBlYXRTdHJpbmcoJnNlbGYsIF9hcmdfdG9rZW46ICZzdHIpIC0+IGJpbmRlcjo6UmVzdWx0PFN0cmluZz4geworICAgIGxldCBfYWlkbF9kYXRhID0gc2VsZi5idWlsZF9wYXJjZWxfUmVwZWF0U3RyaW5nKF9hcmdfdG9rZW4pPzsKKyAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXBlYXRTdHJpbmcsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmVwZWF0U3RyaW5nKF9hcmdfdG9rZW4sIF9haWRsX3JlcGx5KQorICB9CisgIGZuIFJlcGVhdEJ5dGVFbnVtKCZzZWxmLCBfYXJnX3Rva2VuOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtKSAtPiBiaW5kZXI6OlJlc3VsdDxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtPiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBzZWxmLmJ1aWxkX3BhcmNlbF9SZXBlYXRCeXRlRW51bShfYXJnX3Rva2VuKT87CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0Qnl0ZUVudW0sIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmVwZWF0Qnl0ZUVudW0oX2FyZ190b2tlbiwgX2FpZGxfcmVwbHkpCisgIH0KKyAgZm4gUmVwZWF0SW50RW51bSgmc2VsZiwgX2FyZ190b2tlbjogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtKSAtPiBiaW5kZXI6OlJlc3VsdDxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW0+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1JlcGVhdEludEVudW0oX2FyZ190b2tlbik/OworICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlcGVhdEludEVudW0sIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmVwZWF0SW50RW51bShfYXJnX3Rva2VuLCBfYWlkbF9yZXBseSkKKyAgfQorICBmbiBSZXBlYXRMb25nRW51bSgmc2VsZiwgX2FyZ190b2tlbjogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bSkgLT4gYmluZGVyOjpSZXN1bHQ8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bT4geworICAgIGxldCBfYWlkbF9kYXRhID0gc2VsZi5idWlsZF9wYXJjZWxfUmVwZWF0TG9uZ0VudW0oX2FyZ190b2tlbik/OworICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlcGVhdExvbmdFbnVtLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCk7CisgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JlcGVhdExvbmdFbnVtKF9hcmdfdG9rZW4sIF9haWRsX3JlcGx5KQorICB9CisgIGZuIFJldmVyc2VCb29sZWFuKCZzZWxmLCBfYXJnX2lucHV0OiAmW2Jvb2xdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxib29sPikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPGJvb2w+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBzZWxmLmJ1aWxkX3BhcmNlbF9SZXZlcnNlQm9vbGVhbihfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKT87CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmV2ZXJzZUJvb2xlYW4sIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmV2ZXJzZUJvb2xlYW4oX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCwgX2FpZGxfcmVwbHkpCisgIH0KKyAgZm4gUmV2ZXJzZUJ5dGUoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbdThdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzx1OD4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzx1OD4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1JldmVyc2VCeXRlKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpPzsKKyAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXZlcnNlQnl0ZSwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpOworICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXZlcnNlQnl0ZShfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkLCBfYWlkbF9yZXBseSkKKyAgfQorICBmbiBSZXZlcnNlQ2hhcigmc2VsZiwgX2FyZ19pbnB1dDogJlt1MTZdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzx1MTY+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8dTE2Pj4geworICAgIGxldCBfYWlkbF9kYXRhID0gc2VsZi5idWlsZF9wYXJjZWxfUmV2ZXJzZUNoYXIoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCk/OworICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJldmVyc2VDaGFyLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCk7CisgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JldmVyc2VDaGFyKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQsIF9haWRsX3JlcGx5KQorICB9CisgIGZuIFJldmVyc2VJbnQoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbaTMyXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8aTMyPikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPGkzMj4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1JldmVyc2VJbnQoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCk/OworICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJldmVyc2VJbnQsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmV2ZXJzZUludChfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkLCBfYWlkbF9yZXBseSkKKyAgfQorICBmbiBSZXZlcnNlTG9uZygmc2VsZiwgX2FyZ19pbnB1dDogJltpNjRdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxpNjQ+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8aTY0Pj4geworICAgIGxldCBfYWlkbF9kYXRhID0gc2VsZi5idWlsZF9wYXJjZWxfUmV2ZXJzZUxvbmcoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCk/OworICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJldmVyc2VMb25nLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCk7CisgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JldmVyc2VMb25nKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQsIF9haWRsX3JlcGx5KQorICB9CisgIGZuIFJldmVyc2VGbG9hdCgmc2VsZiwgX2FyZ19pbnB1dDogJltmMzJdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxmMzI+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8ZjMyPj4geworICAgIGxldCBfYWlkbF9kYXRhID0gc2VsZi5idWlsZF9wYXJjZWxfUmV2ZXJzZUZsb2F0KF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpPzsKKyAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXZlcnNlRmxvYXQsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmV2ZXJzZUZsb2F0KF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQsIF9haWRsX3JlcGx5KQorICB9CisgIGZuIFJldmVyc2VEb3VibGUoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbZjY0XSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8ZjY0PikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPGY2ND4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1JldmVyc2VEb3VibGUoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCk/OworICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJldmVyc2VEb3VibGUsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmV2ZXJzZURvdWJsZShfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkLCBfYWlkbF9yZXBseSkKKyAgfQorICBmbiBSZXZlcnNlU3RyaW5nKCZzZWxmLCBfYXJnX2lucHV0OiAmW1N0cmluZ10sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPFN0cmluZz4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxTdHJpbmc+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBzZWxmLmJ1aWxkX3BhcmNlbF9SZXZlcnNlU3RyaW5nKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpPzsKKyAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXZlcnNlU3RyaW5nLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCk7CisgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JldmVyc2VTdHJpbmcoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCwgX2FpZGxfcmVwbHkpCisgIH0KKyAgZm4gUmV2ZXJzZUJ5dGVFbnVtKCZzZWxmLCBfYXJnX2lucHV0OiAmW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW1dLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtPikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW0+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBzZWxmLmJ1aWxkX3BhcmNlbF9SZXZlcnNlQnl0ZUVudW0oX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCk/OworICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJldmVyc2VCeXRlRW51bSwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpOworICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXZlcnNlQnl0ZUVudW0oX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCwgX2FpZGxfcmVwbHkpCisgIH0KKyAgZm4gUmV2ZXJzZUludEVudW0oJnNlbGYsIF9hcmdfaW5wdXQ6ICZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtPikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bT4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1JldmVyc2VJbnRFbnVtKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpPzsKKyAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXZlcnNlSW50RW51bSwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpOworICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXZlcnNlSW50RW51bShfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkLCBfYWlkbF9yZXBseSkKKyAgfQorICBmbiBSZXZlcnNlTG9uZ0VudW0oJnNlbGYsIF9hcmdfaW5wdXQ6ICZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bV0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW0+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bT4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1JldmVyc2VMb25nRW51bShfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKT87CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmV2ZXJzZUxvbmdFbnVtLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCk7CisgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JldmVyc2VMb25nRW51bShfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkLCBfYWlkbF9yZXBseSkKKyAgfQorICBmbiBHZXRPdGhlclRlc3RTZXJ2aWNlKCZzZWxmLCBfYXJnX25hbWU6ICZzdHIpIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX0dldE90aGVyVGVzdFNlcnZpY2UoX2FyZ19uYW1lKT87CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6R2V0T3RoZXJUZXN0U2VydmljZSwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpOworICAgIHNlbGYucmVhZF9yZXNwb25zZV9HZXRPdGhlclRlc3RTZXJ2aWNlKF9hcmdfbmFtZSwgX2FpZGxfcmVwbHkpCisgIH0KKyAgZm4gVmVyaWZ5TmFtZSgmc2VsZiwgX2FyZ19zZXJ2aWNlOiAmYmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPiwgX2FyZ19uYW1lOiAmc3RyKSAtPiBiaW5kZXI6OlJlc3VsdDxib29sPiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBzZWxmLmJ1aWxkX3BhcmNlbF9WZXJpZnlOYW1lKF9hcmdfc2VydmljZSwgX2FyZ19uYW1lKT87CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6VmVyaWZ5TmFtZSwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpOworICAgIHNlbGYucmVhZF9yZXNwb25zZV9WZXJpZnlOYW1lKF9hcmdfc2VydmljZSwgX2FyZ19uYW1lLCBfYWlkbF9yZXBseSkKKyAgfQorICBmbiBHZXRJbnRlcmZhY2VBcnJheSgmc2VsZiwgX2FyZ19uYW1lczogJltTdHJpbmddKSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPj4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX0dldEludGVyZmFjZUFycmF5KF9hcmdfbmFtZXMpPzsKKyAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpHZXRJbnRlcmZhY2VBcnJheSwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpOworICAgIHNlbGYucmVhZF9yZXNwb25zZV9HZXRJbnRlcmZhY2VBcnJheShfYXJnX25hbWVzLCBfYWlkbF9yZXBseSkKKyAgfQorICBmbiBWZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VBcnJheSgmc2VsZiwgX2FyZ19zZXJ2aWNlczogJltiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+XSwgX2FyZ19uYW1lczogJltTdHJpbmddKSAtPiBiaW5kZXI6OlJlc3VsdDxib29sPiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBzZWxmLmJ1aWxkX3BhcmNlbF9WZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VBcnJheShfYXJnX3NlcnZpY2VzLCBfYXJnX25hbWVzKT87CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6VmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlQXJyYXksIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICBzZWxmLnJlYWRfcmVzcG9uc2VfVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlQXJyYXkoX2FyZ19zZXJ2aWNlcywgX2FyZ19uYW1lcywgX2FpZGxfcmVwbHkpCisgIH0KKyAgZm4gR2V0TnVsbGFibGVJbnRlcmZhY2VBcnJheSgmc2VsZiwgX2FyZ19uYW1lczogT3B0aW9uPCZbT3B0aW9uPFN0cmluZz5dPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPj4+Pj4geworICAgIGxldCBfYWlkbF9kYXRhID0gc2VsZi5idWlsZF9wYXJjZWxfR2V0TnVsbGFibGVJbnRlcmZhY2VBcnJheShfYXJnX25hbWVzKT87CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6R2V0TnVsbGFibGVJbnRlcmZhY2VBcnJheSwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpOworICAgIHNlbGYucmVhZF9yZXNwb25zZV9HZXROdWxsYWJsZUludGVyZmFjZUFycmF5KF9hcmdfbmFtZXMsIF9haWRsX3JlcGx5KQorICB9CisgIGZuIFZlcmlmeU5hbWVzV2l0aE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoJnNlbGYsIF9hcmdfc2VydmljZXM6IE9wdGlvbjwmW09wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+Pl0+LCBfYXJnX25hbWVzOiBPcHRpb248JltPcHRpb248U3RyaW5nPl0+KSAtPiBiaW5kZXI6OlJlc3VsdDxib29sPiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBzZWxmLmJ1aWxkX3BhcmNlbF9WZXJpZnlOYW1lc1dpdGhOdWxsYWJsZUludGVyZmFjZUFycmF5KF9hcmdfc2VydmljZXMsIF9hcmdfbmFtZXMpPzsKKyAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpWZXJpZnlOYW1lc1dpdGhOdWxsYWJsZUludGVyZmFjZUFycmF5LCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCk7CisgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1ZlcmlmeU5hbWVzV2l0aE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoX2FyZ19zZXJ2aWNlcywgX2FyZ19uYW1lcywgX2FpZGxfcmVwbHkpCisgIH0KKyAgZm4gR2V0SW50ZXJmYWNlTGlzdCgmc2VsZiwgX2FyZ19uYW1lczogT3B0aW9uPCZbT3B0aW9uPFN0cmluZz5dPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPj4+Pj4geworICAgIGxldCBfYWlkbF9kYXRhID0gc2VsZi5idWlsZF9wYXJjZWxfR2V0SW50ZXJmYWNlTGlzdChfYXJnX25hbWVzKT87CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6R2V0SW50ZXJmYWNlTGlzdCwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpOworICAgIHNlbGYucmVhZF9yZXNwb25zZV9HZXRJbnRlcmZhY2VMaXN0KF9hcmdfbmFtZXMsIF9haWRsX3JlcGx5KQorICB9CisgIGZuIFZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUxpc3QoJnNlbGYsIF9hcmdfc2VydmljZXM6IE9wdGlvbjwmW09wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+Pl0+LCBfYXJnX25hbWVzOiBPcHRpb248JltPcHRpb248U3RyaW5nPl0+KSAtPiBiaW5kZXI6OlJlc3VsdDxib29sPiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBzZWxmLmJ1aWxkX3BhcmNlbF9WZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VMaXN0KF9hcmdfc2VydmljZXMsIF9hcmdfbmFtZXMpPzsKKyAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpWZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VMaXN0LCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCk7CisgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1ZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUxpc3QoX2FyZ19zZXJ2aWNlcywgX2FyZ19uYW1lcywgX2FpZGxfcmVwbHkpCisgIH0KKyAgZm4gUmV2ZXJzZVN0cmluZ0xpc3QoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbU3RyaW5nXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8U3RyaW5nPikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPFN0cmluZz4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1JldmVyc2VTdHJpbmdMaXN0KF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpPzsKKyAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXZlcnNlU3RyaW5nTGlzdCwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpOworICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXZlcnNlU3RyaW5nTGlzdChfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkLCBfYWlkbF9yZXBseSkKKyAgfQorICBmbiBSZXBlYXRQYXJjZWxGaWxlRGVzY3JpcHRvcigmc2VsZiwgX2FyZ19yZWFkOiAmYmluZGVyOjpQYXJjZWxGaWxlRGVzY3JpcHRvcikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj4geworICAgIGxldCBfYWlkbF9kYXRhID0gc2VsZi5idWlsZF9wYXJjZWxfUmVwZWF0UGFyY2VsRmlsZURlc2NyaXB0b3IoX2FyZ19yZWFkKT87CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0UGFyY2VsRmlsZURlc2NyaXB0b3IsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmVwZWF0UGFyY2VsRmlsZURlc2NyaXB0b3IoX2FyZ19yZWFkLCBfYWlkbF9yZXBseSkKKyAgfQorICBmbiBSZXZlcnNlUGFyY2VsRmlsZURlc2NyaXB0b3JBcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogJltiaW5kZXI6OlBhcmNlbEZpbGVEZXNjcmlwdG9yXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8T3B0aW9uPGJpbmRlcjo6UGFyY2VsRmlsZURlc2NyaXB0b3I+PikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPGJpbmRlcjo6UGFyY2VsRmlsZURlc2NyaXB0b3I+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBzZWxmLmJ1aWxkX3BhcmNlbF9SZXZlcnNlUGFyY2VsRmlsZURlc2NyaXB0b3JBcnJheShfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKT87CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmV2ZXJzZVBhcmNlbEZpbGVEZXNjcmlwdG9yQXJyYXksIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmV2ZXJzZVBhcmNlbEZpbGVEZXNjcmlwdG9yQXJyYXkoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCwgX2FpZGxfcmVwbHkpCisgIH0KKyAgZm4gVGhyb3dTZXJ2aWNlRXhjZXB0aW9uKCZzZWxmLCBfYXJnX2NvZGU6IGkzMikgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1Rocm93U2VydmljZUV4Y2VwdGlvbihfYXJnX2NvZGUpPzsKKyAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpUaHJvd1NlcnZpY2VFeGNlcHRpb24sIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICBzZWxmLnJlYWRfcmVzcG9uc2VfVGhyb3dTZXJ2aWNlRXhjZXB0aW9uKF9hcmdfY29kZSwgX2FpZGxfcmVwbHkpCisgIH0KKyAgZm4gUmVwZWF0TnVsbGFibGVJbnRBcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbaTMyXT4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8aTMyPj4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1JlcGVhdE51bGxhYmxlSW50QXJyYXkoX2FyZ19pbnB1dCk/OworICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlcGVhdE51bGxhYmxlSW50QXJyYXksIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmVwZWF0TnVsbGFibGVJbnRBcnJheShfYXJnX2lucHV0LCBfYWlkbF9yZXBseSkKKyAgfQorICBmbiBSZXBlYXROdWxsYWJsZUJ5dGVFbnVtQXJyYXkoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW1dPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtPj4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1JlcGVhdE51bGxhYmxlQnl0ZUVudW1BcnJheShfYXJnX2lucHV0KT87CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0TnVsbGFibGVCeXRlRW51bUFycmF5LCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCk7CisgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JlcGVhdE51bGxhYmxlQnl0ZUVudW1BcnJheShfYXJnX2lucHV0LCBfYWlkbF9yZXBseSkKKyAgfQorICBmbiBSZXBlYXROdWxsYWJsZUludEVudW1BcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtXT4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtPj4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1JlcGVhdE51bGxhYmxlSW50RW51bUFycmF5KF9hcmdfaW5wdXQpPzsKKyAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXBlYXROdWxsYWJsZUludEVudW1BcnJheSwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpOworICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXBlYXROdWxsYWJsZUludEVudW1BcnJheShfYXJnX2lucHV0LCBfYWlkbF9yZXBseSkKKyAgfQorICBmbiBSZXBlYXROdWxsYWJsZUxvbmdFbnVtQXJyYXkoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW1dPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtPj4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1JlcGVhdE51bGxhYmxlTG9uZ0VudW1BcnJheShfYXJnX2lucHV0KT87CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0TnVsbGFibGVMb25nRW51bUFycmF5LCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCk7CisgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JlcGVhdE51bGxhYmxlTG9uZ0VudW1BcnJheShfYXJnX2lucHV0LCBfYWlkbF9yZXBseSkKKyAgfQorICBmbiBSZXBlYXROdWxsYWJsZVN0cmluZygmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZzdHI+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248U3RyaW5nPj4geworICAgIGxldCBfYWlkbF9kYXRhID0gc2VsZi5idWlsZF9wYXJjZWxfUmVwZWF0TnVsbGFibGVTdHJpbmcoX2FyZ19pbnB1dCk/OworICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlcGVhdE51bGxhYmxlU3RyaW5nLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCk7CisgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JlcGVhdE51bGxhYmxlU3RyaW5nKF9hcmdfaW5wdXQsIF9haWRsX3JlcGx5KQorICB9CisgIGZuIFJlcGVhdE51bGxhYmxlU3RyaW5nTGlzdCgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbT3B0aW9uPFN0cmluZz5dPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBzZWxmLmJ1aWxkX3BhcmNlbF9SZXBlYXROdWxsYWJsZVN0cmluZ0xpc3QoX2FyZ19pbnB1dCk/OworICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlcGVhdE51bGxhYmxlU3RyaW5nTGlzdCwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpOworICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXBlYXROdWxsYWJsZVN0cmluZ0xpc3QoX2FyZ19pbnB1dCwgX2FpZGxfcmVwbHkpCisgIH0KKyAgZm4gUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlKCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JmNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZV81X0VtcHR5PikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZV81X0VtcHR5Pj4geworICAgIGxldCBfYWlkbF9kYXRhID0gc2VsZi5idWlsZF9wYXJjZWxfUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlKF9hcmdfaW5wdXQpPzsKKyAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXBlYXROdWxsYWJsZVBhcmNlbGFibGUsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlKF9hcmdfaW5wdXQsIF9haWRsX3JlcGx5KQorICB9CisgIGZuIFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUFycmF5KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltPcHRpb248Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTJfSVRlc3RTZXJ2aWNlXzVfRW1wdHk+XT4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZV81X0VtcHR5Pj4+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBzZWxmLmJ1aWxkX3BhcmNlbF9SZXBlYXROdWxsYWJsZVBhcmNlbGFibGVBcnJheShfYXJnX2lucHV0KT87CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlQXJyYXksIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlQXJyYXkoX2FyZ19pbnB1dCwgX2FpZGxfcmVwbHkpCisgIH0KKyAgZm4gUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlTGlzdCgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbT3B0aW9uPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZV81X0VtcHR5Pl0+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMl9JVGVzdFNlcnZpY2VfNV9FbXB0eT4+Pj4geworICAgIGxldCBfYWlkbF9kYXRhID0gc2VsZi5idWlsZF9wYXJjZWxfUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlTGlzdChfYXJnX2lucHV0KT87CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlTGlzdCwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpOworICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXBlYXROdWxsYWJsZVBhcmNlbGFibGVMaXN0KF9hcmdfaW5wdXQsIF9haWRsX3JlcGx5KQorICB9CisgIGZuIFRha2VzQW5JQmluZGVyKCZzZWxmLCBfYXJnX2lucHV0OiAmYmluZGVyOjpTcElCaW5kZXIpIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBzZWxmLmJ1aWxkX3BhcmNlbF9UYWtlc0FuSUJpbmRlcihfYXJnX2lucHV0KT87CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6VGFrZXNBbklCaW5kZXIsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICBzZWxmLnJlYWRfcmVzcG9uc2VfVGFrZXNBbklCaW5kZXIoX2FyZ19pbnB1dCwgX2FpZGxfcmVwbHkpCisgIH0KKyAgZm4gVGFrZXNBTnVsbGFibGVJQmluZGVyKCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JmJpbmRlcjo6U3BJQmluZGVyPikgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1Rha2VzQU51bGxhYmxlSUJpbmRlcihfYXJnX2lucHV0KT87CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6VGFrZXNBTnVsbGFibGVJQmluZGVyLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCk7CisgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1Rha2VzQU51bGxhYmxlSUJpbmRlcihfYXJnX2lucHV0LCBfYWlkbF9yZXBseSkKKyAgfQorICBmbiBUYWtlc0FuSUJpbmRlckxpc3QoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbYmluZGVyOjpTcElCaW5kZXJdKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4geworICAgIGxldCBfYWlkbF9kYXRhID0gc2VsZi5idWlsZF9wYXJjZWxfVGFrZXNBbklCaW5kZXJMaXN0KF9hcmdfaW5wdXQpPzsKKyAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpUYWtlc0FuSUJpbmRlckxpc3QsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICBzZWxmLnJlYWRfcmVzcG9uc2VfVGFrZXNBbklCaW5kZXJMaXN0KF9hcmdfaW5wdXQsIF9haWRsX3JlcGx5KQorICB9CisgIGZuIFRha2VzQU51bGxhYmxlSUJpbmRlckxpc3QoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj5dPikgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1Rha2VzQU51bGxhYmxlSUJpbmRlckxpc3QoX2FyZ19pbnB1dCk/OworICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlRha2VzQU51bGxhYmxlSUJpbmRlckxpc3QsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICBzZWxmLnJlYWRfcmVzcG9uc2VfVGFrZXNBTnVsbGFibGVJQmluZGVyTGlzdChfYXJnX2lucHV0LCBfYWlkbF9yZXBseSkKKyAgfQorICBmbiBSZXBlYXRVdGY4Q3BwU3RyaW5nKCZzZWxmLCBfYXJnX3Rva2VuOiAmc3RyKSAtPiBiaW5kZXI6OlJlc3VsdDxTdHJpbmc+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1JlcGVhdFV0ZjhDcHBTdHJpbmcoX2FyZ190b2tlbik/OworICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlcGVhdFV0ZjhDcHBTdHJpbmcsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmVwZWF0VXRmOENwcFN0cmluZyhfYXJnX3Rva2VuLCBfYWlkbF9yZXBseSkKKyAgfQorICBmbiBSZXBlYXROdWxsYWJsZVV0ZjhDcHBTdHJpbmcoJnNlbGYsIF9hcmdfdG9rZW46IE9wdGlvbjwmc3RyPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFN0cmluZz4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1JlcGVhdE51bGxhYmxlVXRmOENwcFN0cmluZyhfYXJnX3Rva2VuKT87CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0TnVsbGFibGVVdGY4Q3BwU3RyaW5nLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCk7CisgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JlcGVhdE51bGxhYmxlVXRmOENwcFN0cmluZyhfYXJnX3Rva2VuLCBfYWlkbF9yZXBseSkKKyAgfQorICBmbiBSZXZlcnNlVXRmOENwcFN0cmluZygmc2VsZiwgX2FyZ19pbnB1dDogJltTdHJpbmddLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxTdHJpbmc+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8U3RyaW5nPj4geworICAgIGxldCBfYWlkbF9kYXRhID0gc2VsZi5idWlsZF9wYXJjZWxfUmV2ZXJzZVV0ZjhDcHBTdHJpbmcoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCk/OworICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJldmVyc2VVdGY4Q3BwU3RyaW5nLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCk7CisgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JldmVyc2VVdGY4Q3BwU3RyaW5nKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQsIF9haWRsX3JlcGx5KQorICB9CisgIGZuIFJldmVyc2VOdWxsYWJsZVV0ZjhDcHBTdHJpbmcoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxTdHJpbmc+XT4sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgT3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxTdHJpbmc+Pj4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1JldmVyc2VOdWxsYWJsZVV0ZjhDcHBTdHJpbmcoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCk/OworICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJldmVyc2VOdWxsYWJsZVV0ZjhDcHBTdHJpbmcsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmV2ZXJzZU51bGxhYmxlVXRmOENwcFN0cmluZyhfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkLCBfYWlkbF9yZXBseSkKKyAgfQorICBmbiBSZXZlcnNlVXRmOENwcFN0cmluZ0xpc3QoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxTdHJpbmc+XT4sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgT3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxTdHJpbmc+Pj4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1JldmVyc2VVdGY4Q3BwU3RyaW5nTGlzdChfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKT87CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmV2ZXJzZVV0ZjhDcHBTdHJpbmdMaXN0LCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCk7CisgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JldmVyc2VVdGY4Q3BwU3RyaW5nTGlzdChfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkLCBfYWlkbF9yZXBseSkKKyAgfQorICBmbiBHZXRDYWxsYmFjaygmc2VsZiwgX2FyZ19yZXR1cm5fbnVsbDogYm9vbCkgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz4+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBzZWxmLmJ1aWxkX3BhcmNlbF9HZXRDYWxsYmFjayhfYXJnX3JldHVybl9udWxsKT87CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6R2V0Q2FsbGJhY2ssIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICBzZWxmLnJlYWRfcmVzcG9uc2VfR2V0Q2FsbGJhY2soX2FyZ19yZXR1cm5fbnVsbCwgX2FpZGxfcmVwbHkpCisgIH0KKyAgZm4gRmlsbE91dFN0cnVjdHVyZWRQYXJjZWxhYmxlKCZzZWxmLCBfYXJnX3BhcmNlbDogJm11dCBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18yMF9TdHJ1Y3R1cmVkUGFyY2VsYWJsZSkgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX0ZpbGxPdXRTdHJ1Y3R1cmVkUGFyY2VsYWJsZShfYXJnX3BhcmNlbCk/OworICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OkZpbGxPdXRTdHJ1Y3R1cmVkUGFyY2VsYWJsZSwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpOworICAgIHNlbGYucmVhZF9yZXNwb25zZV9GaWxsT3V0U3RydWN0dXJlZFBhcmNlbGFibGUoX2FyZ19wYXJjZWwsIF9haWRsX3JlcGx5KQorICB9CisgIGZuIFJlcGVhdEV4dGVuZGFibGVQYXJjZWxhYmxlKCZzZWxmLCBfYXJnX2VwOiAmY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOV9leHRlbnNpb25fMjBfRXh0ZW5kYWJsZVBhcmNlbGFibGUsIF9hcmdfZXAyOiAmbXV0IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzlfZXh0ZW5zaW9uXzIwX0V4dGVuZGFibGVQYXJjZWxhYmxlKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4geworICAgIGxldCBfYWlkbF9kYXRhID0gc2VsZi5idWlsZF9wYXJjZWxfUmVwZWF0RXh0ZW5kYWJsZVBhcmNlbGFibGUoX2FyZ19lcCwgX2FyZ19lcDIpPzsKKyAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXBlYXRFeHRlbmRhYmxlUGFyY2VsYWJsZSwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpOworICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXBlYXRFeHRlbmRhYmxlUGFyY2VsYWJsZShfYXJnX2VwLCBfYXJnX2VwMiwgX2FpZGxfcmVwbHkpCisgIH0KKyAgZm4gUmV2ZXJzZUxpc3QoJnNlbGYsIF9hcmdfbGlzdDogJmNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEzX1JlY3Vyc2l2ZUxpc3QpIC0+IGJpbmRlcjo6UmVzdWx0PGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEzX1JlY3Vyc2l2ZUxpc3Q+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1JldmVyc2VMaXN0KF9hcmdfbGlzdCk/OworICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJldmVyc2VMaXN0LCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCk7CisgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JldmVyc2VMaXN0KF9hcmdfbGlzdCwgX2FpZGxfcmVwbHkpCisgIH0KKyAgZm4gUmV2ZXJzZUlCaW5kZXJBcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogJltiaW5kZXI6OlNwSUJpbmRlcl0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPE9wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj4+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8YmluZGVyOjpTcElCaW5kZXI+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBzZWxmLmJ1aWxkX3BhcmNlbF9SZXZlcnNlSUJpbmRlckFycmF5KF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpPzsKKyAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXZlcnNlSUJpbmRlckFycmF5LCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCk7CisgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JldmVyc2VJQmluZGVyQXJyYXkoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCwgX2FpZGxfcmVwbHkpCisgIH0KKyAgZm4gUmV2ZXJzZU51bGxhYmxlSUJpbmRlckFycmF5KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltPcHRpb248YmluZGVyOjpTcElCaW5kZXI+XT4sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgT3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTcElCaW5kZXI+Pj4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3BJQmluZGVyPj4+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBzZWxmLmJ1aWxkX3BhcmNlbF9SZXZlcnNlTnVsbGFibGVJQmluZGVyQXJyYXkoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCk/OworICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJldmVyc2VOdWxsYWJsZUlCaW5kZXJBcnJheSwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpOworICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXZlcnNlTnVsbGFibGVJQmluZGVyQXJyYXkoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCwgX2FpZGxfcmVwbHkpCisgIH0KKyAgZm4gR2V0T2xkTmFtZUludGVyZmFjZSgmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfSU9sZE5hbWU+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBzZWxmLmJ1aWxkX3BhcmNlbF9HZXRPbGROYW1lSW50ZXJmYWNlKCk/OworICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OkdldE9sZE5hbWVJbnRlcmZhY2UsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICBzZWxmLnJlYWRfcmVzcG9uc2VfR2V0T2xkTmFtZUludGVyZmFjZShfYWlkbF9yZXBseSkKKyAgfQorICBmbiBHZXROZXdOYW1lSW50ZXJmYWNlKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9JTmV3TmFtZT4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX0dldE5ld05hbWVJbnRlcmZhY2UoKT87CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6R2V0TmV3TmFtZUludGVyZmFjZSwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpOworICAgIHNlbGYucmVhZF9yZXNwb25zZV9HZXROZXdOYW1lSW50ZXJmYWNlKF9haWRsX3JlcGx5KQorICB9CisgIGZuIEdldFVuaW9uVGFncygmc2VsZiwgX2FyZ19pbnB1dDogJltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c181X1VuaW9uXSkgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzVfVW5pb25fM19UYWc+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBzZWxmLmJ1aWxkX3BhcmNlbF9HZXRVbmlvblRhZ3MoX2FyZ19pbnB1dCk/OworICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OkdldFVuaW9uVGFncywgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpOworICAgIHNlbGYucmVhZF9yZXNwb25zZV9HZXRVbmlvblRhZ3MoX2FyZ19pbnB1dCwgX2FpZGxfcmVwbHkpCisgIH0KKyAgZm4gR2V0Q3BwSmF2YVRlc3RzKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248YmluZGVyOjpTcElCaW5kZXI+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBzZWxmLmJ1aWxkX3BhcmNlbF9HZXRDcHBKYXZhVGVzdHMoKT87CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6R2V0Q3BwSmF2YVRlc3RzLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCk7CisgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX0dldENwcEphdmFUZXN0cyhfYWlkbF9yZXBseSkKKyAgfQorICBmbiBnZXRCYWNrZW5kVHlwZSgmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTFfQmFja2VuZFR5cGU+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX2dldEJhY2tlbmRUeXBlKCk/OworICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OmdldEJhY2tlbmRUeXBlLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCk7CisgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX2dldEJhY2tlbmRUeXBlKF9haWRsX3JlcGx5KQorICB9CiB9Ci1mbiBvbl90cmFuc2FjdChfYWlkbF9zZXJ2aWNlOiAmZHluIElUZXN0U2VydmljZSwgX2FpZGxfY29kZTogYmluZGVyOjpUcmFuc2FjdGlvbkNvZGUsIF9haWRsX2RhdGE6ICZiaW5kZXI6OnBhcmNlbDo6UGFyY2VsLCBfYWlkbF9yZXBseTogJm11dCBiaW5kZXI6OnBhcmNlbDo6UGFyY2VsKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4geworaW1wbDxQOiBiaW5kZXI6OkJpbmRlckFzeW5jUG9vbD4gSVRlc3RTZXJ2aWNlQXN5bmM8UD4gZm9yIEJwVGVzdFNlcnZpY2UgeworICBmbiBVbmltcGxlbWVudGVkTWV0aG9kPCdhPigmJ2Egc2VsZiwgX2FyZ19hcmc6IGkzMikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PGkzMj4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX1VuaW1wbGVtZW50ZWRNZXRob2QoX2FyZ19hcmcpIHsKKyAgICAgIE9rKF9haWRsX2RhdGEpID0+IF9haWRsX2RhdGEsCisgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgfTsKKyAgICBsZXQgYmluZGVyID0gc2VsZi5iaW5kZXIuY2xvbmUoKTsKKyAgICBQOjpzcGF3bigKKyAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlVuaW1wbGVtZW50ZWRNZXRob2QsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKSwKKyAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1VuaW1wbGVtZW50ZWRNZXRob2QoX2FyZ19hcmcsIF9haWRsX3JlcGx5KQorICAgICAgfQorICAgICkKKyAgfQorICBmbiBEZXByZWNhdGVkPCdhPigmJ2Egc2VsZikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PCgpPj4geworICAgIGxldCBfYWlkbF9kYXRhID0gbWF0Y2ggc2VsZi5idWlsZF9wYXJjZWxfRGVwcmVjYXRlZCgpIHsKKyAgICAgIE9rKF9haWRsX2RhdGEpID0+IF9haWRsX2RhdGEsCisgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgfTsKKyAgICBsZXQgYmluZGVyID0gc2VsZi5iaW5kZXIuY2xvbmUoKTsKKyAgICBQOjpzcGF3bigKKyAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OkRlcHJlY2F0ZWQsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKSwKKyAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX0RlcHJlY2F0ZWQoX2FpZGxfcmVwbHkpCisgICAgICB9CisgICAgKQorICB9CisgIGZuIFRlc3RPbmV3YXkoJnNlbGYpIC0+IHN0ZDo6ZnV0dXJlOjpSZWFkeTxiaW5kZXI6OlJlc3VsdDwoKT4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX1Rlc3RPbmV3YXkoKSB7CisgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgRXJyKGVycikgPT4gcmV0dXJuIHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSksCisgICAgfTsKKyAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpUZXN0T25ld2F5LCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX09ORVdBWSB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICBzdGQ6OmZ1dHVyZTo6cmVhZHkoc2VsZi5yZWFkX3Jlc3BvbnNlX1Rlc3RPbmV3YXkoX2FpZGxfcmVwbHkpKQorICB9CisgIGZuIFJlcGVhdEJvb2xlYW48J2E+KCYnYSBzZWxmLCBfYXJnX3Rva2VuOiBib29sKSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8Ym9vbD4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX1JlcGVhdEJvb2xlYW4oX2FyZ190b2tlbikgeworICAgICAgT2soX2FpZGxfZGF0YSkgPT4gX2FpZGxfZGF0YSwKKyAgICAgIEVycihlcnIpID0+IHJldHVybiBCb3g6OnBpbihzdGQ6OmZ1dHVyZTo6cmVhZHkoRXJyKGVycikpKSwKKyAgICB9OworICAgIGxldCBiaW5kZXIgPSBzZWxmLmJpbmRlci5jbG9uZSgpOworICAgIFA6OnNwYXduKAorICAgICAgbW92ZSB8fCBiaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0Qm9vbGVhbiwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpLAorICAgICAgbW92ZSB8X2FpZGxfcmVwbHl8IGFzeW5jIG1vdmUgeworICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmVwZWF0Qm9vbGVhbihfYXJnX3Rva2VuLCBfYWlkbF9yZXBseSkKKyAgICAgIH0KKyAgICApCisgIH0KKyAgZm4gUmVwZWF0Qnl0ZTwnYT4oJidhIHNlbGYsIF9hcmdfdG9rZW46IGk4KSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8aTg+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF9SZXBlYXRCeXRlKF9hcmdfdG9rZW4pIHsKKyAgICAgIE9rKF9haWRsX2RhdGEpID0+IF9haWRsX2RhdGEsCisgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgfTsKKyAgICBsZXQgYmluZGVyID0gc2VsZi5iaW5kZXIuY2xvbmUoKTsKKyAgICBQOjpzcGF3bigKKyAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlcGVhdEJ5dGUsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKSwKKyAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JlcGVhdEJ5dGUoX2FyZ190b2tlbiwgX2FpZGxfcmVwbHkpCisgICAgICB9CisgICAgKQorICB9CisgIGZuIFJlcGVhdENoYXI8J2E+KCYnYSBzZWxmLCBfYXJnX3Rva2VuOiB1MTYpIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDx1MTY+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF9SZXBlYXRDaGFyKF9hcmdfdG9rZW4pIHsKKyAgICAgIE9rKF9haWRsX2RhdGEpID0+IF9haWRsX2RhdGEsCisgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgfTsKKyAgICBsZXQgYmluZGVyID0gc2VsZi5iaW5kZXIuY2xvbmUoKTsKKyAgICBQOjpzcGF3bigKKyAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlcGVhdENoYXIsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKSwKKyAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JlcGVhdENoYXIoX2FyZ190b2tlbiwgX2FpZGxfcmVwbHkpCisgICAgICB9CisgICAgKQorICB9CisgIGZuIFJlcGVhdEludDwnYT4oJidhIHNlbGYsIF9hcmdfdG9rZW46IGkzMikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PGkzMj4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX1JlcGVhdEludChfYXJnX3Rva2VuKSB7CisgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgIH07CisgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgUDo6c3Bhd24oCisgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXBlYXRJbnQsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKSwKKyAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JlcGVhdEludChfYXJnX3Rva2VuLCBfYWlkbF9yZXBseSkKKyAgICAgIH0KKyAgICApCisgIH0KKyAgZm4gUmVwZWF0TG9uZzwnYT4oJidhIHNlbGYsIF9hcmdfdG9rZW46IGk2NCkgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PGk2ND4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX1JlcGVhdExvbmcoX2FyZ190b2tlbikgeworICAgICAgT2soX2FpZGxfZGF0YSkgPT4gX2FpZGxfZGF0YSwKKyAgICAgIEVycihlcnIpID0+IHJldHVybiBCb3g6OnBpbihzdGQ6OmZ1dHVyZTo6cmVhZHkoRXJyKGVycikpKSwKKyAgICB9OworICAgIGxldCBiaW5kZXIgPSBzZWxmLmJpbmRlci5jbG9uZSgpOworICAgIFA6OnNwYXduKAorICAgICAgbW92ZSB8fCBiaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0TG9uZywgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpLAorICAgICAgbW92ZSB8X2FpZGxfcmVwbHl8IGFzeW5jIG1vdmUgeworICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmVwZWF0TG9uZyhfYXJnX3Rva2VuLCBfYWlkbF9yZXBseSkKKyAgICAgIH0KKyAgICApCisgIH0KKyAgZm4gUmVwZWF0RmxvYXQ8J2E+KCYnYSBzZWxmLCBfYXJnX3Rva2VuOiBmMzIpIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxmMzI+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF9SZXBlYXRGbG9hdChfYXJnX3Rva2VuKSB7CisgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgIH07CisgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgUDo6c3Bhd24oCisgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXBlYXRGbG9hdCwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpLAorICAgICAgbW92ZSB8X2FpZGxfcmVwbHl8IGFzeW5jIG1vdmUgeworICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmVwZWF0RmxvYXQoX2FyZ190b2tlbiwgX2FpZGxfcmVwbHkpCisgICAgICB9CisgICAgKQorICB9CisgIGZuIFJlcGVhdERvdWJsZTwnYT4oJidhIHNlbGYsIF9hcmdfdG9rZW46IGY2NCkgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PGY2ND4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX1JlcGVhdERvdWJsZShfYXJnX3Rva2VuKSB7CisgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgIH07CisgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgUDo6c3Bhd24oCisgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXBlYXREb3VibGUsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKSwKKyAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JlcGVhdERvdWJsZShfYXJnX3Rva2VuLCBfYWlkbF9yZXBseSkKKyAgICAgIH0KKyAgICApCisgIH0KKyAgZm4gUmVwZWF0U3RyaW5nPCdhPigmJ2Egc2VsZiwgX2FyZ190b2tlbjogJidhIHN0cikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PFN0cmluZz4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX1JlcGVhdFN0cmluZyhfYXJnX3Rva2VuKSB7CisgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgIH07CisgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgUDo6c3Bhd24oCisgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXBlYXRTdHJpbmcsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKSwKKyAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JlcGVhdFN0cmluZyhfYXJnX3Rva2VuLCBfYWlkbF9yZXBseSkKKyAgICAgIH0KKyAgICApCisgIH0KKyAgZm4gUmVwZWF0Qnl0ZUVudW08J2E+KCYnYSBzZWxmLCBfYXJnX3Rva2VuOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtKSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bT4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX1JlcGVhdEJ5dGVFbnVtKF9hcmdfdG9rZW4pIHsKKyAgICAgIE9rKF9haWRsX2RhdGEpID0+IF9haWRsX2RhdGEsCisgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgfTsKKyAgICBsZXQgYmluZGVyID0gc2VsZi5iaW5kZXIuY2xvbmUoKTsKKyAgICBQOjpzcGF3bigKKyAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlcGVhdEJ5dGVFbnVtLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICBtb3ZlIHxfYWlkbF9yZXBseXwgYXN5bmMgbW92ZSB7CisgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXBlYXRCeXRlRW51bShfYXJnX3Rva2VuLCBfYWlkbF9yZXBseSkKKyAgICAgIH0KKyAgICApCisgIH0KKyAgZm4gUmVwZWF0SW50RW51bTwnYT4oJidhIHNlbGYsIF9hcmdfdG9rZW46IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bSkgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bT4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX1JlcGVhdEludEVudW0oX2FyZ190b2tlbikgeworICAgICAgT2soX2FpZGxfZGF0YSkgPT4gX2FpZGxfZGF0YSwKKyAgICAgIEVycihlcnIpID0+IHJldHVybiBCb3g6OnBpbihzdGQ6OmZ1dHVyZTo6cmVhZHkoRXJyKGVycikpKSwKKyAgICB9OworICAgIGxldCBiaW5kZXIgPSBzZWxmLmJpbmRlci5jbG9uZSgpOworICAgIFA6OnNwYXduKAorICAgICAgbW92ZSB8fCBiaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0SW50RW51bSwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpLAorICAgICAgbW92ZSB8X2FpZGxfcmVwbHl8IGFzeW5jIG1vdmUgeworICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmVwZWF0SW50RW51bShfYXJnX3Rva2VuLCBfYWlkbF9yZXBseSkKKyAgICAgIH0KKyAgICApCisgIH0KKyAgZm4gUmVwZWF0TG9uZ0VudW08J2E+KCYnYSBzZWxmLCBfYXJnX3Rva2VuOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtKSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bT4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX1JlcGVhdExvbmdFbnVtKF9hcmdfdG9rZW4pIHsKKyAgICAgIE9rKF9haWRsX2RhdGEpID0+IF9haWRsX2RhdGEsCisgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgfTsKKyAgICBsZXQgYmluZGVyID0gc2VsZi5iaW5kZXIuY2xvbmUoKTsKKyAgICBQOjpzcGF3bigKKyAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlcGVhdExvbmdFbnVtLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICBtb3ZlIHxfYWlkbF9yZXBseXwgYXN5bmMgbW92ZSB7CisgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXBlYXRMb25nRW51bShfYXJnX3Rva2VuLCBfYWlkbF9yZXBseSkKKyAgICAgIH0KKyAgICApCisgIH0KKyAgZm4gUmV2ZXJzZUJvb2xlYW48J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiAmJ2EgW2Jvb2xdLCBfYXJnX3JlcGVhdGVkOiAmJ2EgbXV0IFZlYzxib29sPikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PFZlYzxib29sPj4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX1JldmVyc2VCb29sZWFuKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpIHsKKyAgICAgIE9rKF9haWRsX2RhdGEpID0+IF9haWRsX2RhdGEsCisgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgfTsKKyAgICBsZXQgYmluZGVyID0gc2VsZi5iaW5kZXIuY2xvbmUoKTsKKyAgICBQOjpzcGF3bigKKyAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJldmVyc2VCb29sZWFuLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICBtb3ZlIHxfYWlkbF9yZXBseXwgYXN5bmMgbW92ZSB7CisgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXZlcnNlQm9vbGVhbihfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkLCBfYWlkbF9yZXBseSkKKyAgICAgIH0KKyAgICApCisgIH0KKyAgZm4gUmV2ZXJzZUJ5dGU8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiAmJ2EgW3U4XSwgX2FyZ19yZXBlYXRlZDogJidhIG11dCBWZWM8dTg+KSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8VmVjPHU4Pj4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX1JldmVyc2VCeXRlKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpIHsKKyAgICAgIE9rKF9haWRsX2RhdGEpID0+IF9haWRsX2RhdGEsCisgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgfTsKKyAgICBsZXQgYmluZGVyID0gc2VsZi5iaW5kZXIuY2xvbmUoKTsKKyAgICBQOjpzcGF3bigKKyAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJldmVyc2VCeXRlLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICBtb3ZlIHxfYWlkbF9yZXBseXwgYXN5bmMgbW92ZSB7CisgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXZlcnNlQnl0ZShfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkLCBfYWlkbF9yZXBseSkKKyAgICAgIH0KKyAgICApCisgIH0KKyAgZm4gUmV2ZXJzZUNoYXI8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiAmJ2EgW3UxNl0sIF9hcmdfcmVwZWF0ZWQ6ICYnYSBtdXQgVmVjPHUxNj4pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxWZWM8dTE2Pj4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX1JldmVyc2VDaGFyKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpIHsKKyAgICAgIE9rKF9haWRsX2RhdGEpID0+IF9haWRsX2RhdGEsCisgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgfTsKKyAgICBsZXQgYmluZGVyID0gc2VsZi5iaW5kZXIuY2xvbmUoKTsKKyAgICBQOjpzcGF3bigKKyAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJldmVyc2VDaGFyLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICBtb3ZlIHxfYWlkbF9yZXBseXwgYXN5bmMgbW92ZSB7CisgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXZlcnNlQ2hhcihfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkLCBfYWlkbF9yZXBseSkKKyAgICAgIH0KKyAgICApCisgIH0KKyAgZm4gUmV2ZXJzZUludDwnYT4oJidhIHNlbGYsIF9hcmdfaW5wdXQ6ICYnYSBbaTMyXSwgX2FyZ19yZXBlYXRlZDogJidhIG11dCBWZWM8aTMyPikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PFZlYzxpMzI+Pj4geworICAgIGxldCBfYWlkbF9kYXRhID0gbWF0Y2ggc2VsZi5idWlsZF9wYXJjZWxfUmV2ZXJzZUludChfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSB7CisgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgIH07CisgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgUDo6c3Bhd24oCisgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXZlcnNlSW50LCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICBtb3ZlIHxfYWlkbF9yZXBseXwgYXN5bmMgbW92ZSB7CisgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXZlcnNlSW50KF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQsIF9haWRsX3JlcGx5KQorICAgICAgfQorICAgICkKKyAgfQorICBmbiBSZXZlcnNlTG9uZzwnYT4oJidhIHNlbGYsIF9hcmdfaW5wdXQ6ICYnYSBbaTY0XSwgX2FyZ19yZXBlYXRlZDogJidhIG11dCBWZWM8aTY0PikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PFZlYzxpNjQ+Pj4geworICAgIGxldCBfYWlkbF9kYXRhID0gbWF0Y2ggc2VsZi5idWlsZF9wYXJjZWxfUmV2ZXJzZUxvbmcoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCkgeworICAgICAgT2soX2FpZGxfZGF0YSkgPT4gX2FpZGxfZGF0YSwKKyAgICAgIEVycihlcnIpID0+IHJldHVybiBCb3g6OnBpbihzdGQ6OmZ1dHVyZTo6cmVhZHkoRXJyKGVycikpKSwKKyAgICB9OworICAgIGxldCBiaW5kZXIgPSBzZWxmLmJpbmRlci5jbG9uZSgpOworICAgIFA6OnNwYXduKAorICAgICAgbW92ZSB8fCBiaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmV2ZXJzZUxvbmcsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKSwKKyAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JldmVyc2VMb25nKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQsIF9haWRsX3JlcGx5KQorICAgICAgfQorICAgICkKKyAgfQorICBmbiBSZXZlcnNlRmxvYXQ8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiAmJ2EgW2YzMl0sIF9hcmdfcmVwZWF0ZWQ6ICYnYSBtdXQgVmVjPGYzMj4pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxWZWM8ZjMyPj4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX1JldmVyc2VGbG9hdChfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSB7CisgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgIH07CisgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgUDo6c3Bhd24oCisgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXZlcnNlRmxvYXQsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKSwKKyAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JldmVyc2VGbG9hdChfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkLCBfYWlkbF9yZXBseSkKKyAgICAgIH0KKyAgICApCisgIH0KKyAgZm4gUmV2ZXJzZURvdWJsZTwnYT4oJidhIHNlbGYsIF9hcmdfaW5wdXQ6ICYnYSBbZjY0XSwgX2FyZ19yZXBlYXRlZDogJidhIG11dCBWZWM8ZjY0PikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PFZlYzxmNjQ+Pj4geworICAgIGxldCBfYWlkbF9kYXRhID0gbWF0Y2ggc2VsZi5idWlsZF9wYXJjZWxfUmV2ZXJzZURvdWJsZShfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSB7CisgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgIH07CisgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgUDo6c3Bhd24oCisgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXZlcnNlRG91YmxlLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICBtb3ZlIHxfYWlkbF9yZXBseXwgYXN5bmMgbW92ZSB7CisgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXZlcnNlRG91YmxlKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQsIF9haWRsX3JlcGx5KQorICAgICAgfQorICAgICkKKyAgfQorICBmbiBSZXZlcnNlU3RyaW5nPCdhPigmJ2Egc2VsZiwgX2FyZ19pbnB1dDogJidhIFtTdHJpbmddLCBfYXJnX3JlcGVhdGVkOiAmJ2EgbXV0IFZlYzxTdHJpbmc+KSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8VmVjPFN0cmluZz4+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF9SZXZlcnNlU3RyaW5nKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpIHsKKyAgICAgIE9rKF9haWRsX2RhdGEpID0+IF9haWRsX2RhdGEsCisgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgfTsKKyAgICBsZXQgYmluZGVyID0gc2VsZi5iaW5kZXIuY2xvbmUoKTsKKyAgICBQOjpzcGF3bigKKyAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJldmVyc2VTdHJpbmcsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKSwKKyAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JldmVyc2VTdHJpbmcoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCwgX2FpZGxfcmVwbHkpCisgICAgICB9CisgICAgKQorICB9CisgIGZuIFJldmVyc2VCeXRlRW51bTwnYT4oJidhIHNlbGYsIF9hcmdfaW5wdXQ6ICYnYSBbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bV0sIF9hcmdfcmVwZWF0ZWQ6ICYnYSBtdXQgVmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW0+KSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8VmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW0+Pj4geworICAgIGxldCBfYWlkbF9kYXRhID0gbWF0Y2ggc2VsZi5idWlsZF9wYXJjZWxfUmV2ZXJzZUJ5dGVFbnVtKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpIHsKKyAgICAgIE9rKF9haWRsX2RhdGEpID0+IF9haWRsX2RhdGEsCisgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgfTsKKyAgICBsZXQgYmluZGVyID0gc2VsZi5iaW5kZXIuY2xvbmUoKTsKKyAgICBQOjpzcGF3bigKKyAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJldmVyc2VCeXRlRW51bSwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpLAorICAgICAgbW92ZSB8X2FpZGxfcmVwbHl8IGFzeW5jIG1vdmUgeworICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmV2ZXJzZUJ5dGVFbnVtKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQsIF9haWRsX3JlcGx5KQorICAgICAgfQorICAgICkKKyAgfQorICBmbiBSZXZlcnNlSW50RW51bTwnYT4oJidhIHNlbGYsIF9hcmdfaW5wdXQ6ICYnYSBbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtXSwgX2FyZ19yZXBlYXRlZDogJidhIG11dCBWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtPikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW0+Pj4geworICAgIGxldCBfYWlkbF9kYXRhID0gbWF0Y2ggc2VsZi5idWlsZF9wYXJjZWxfUmV2ZXJzZUludEVudW0oX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCkgeworICAgICAgT2soX2FpZGxfZGF0YSkgPT4gX2FpZGxfZGF0YSwKKyAgICAgIEVycihlcnIpID0+IHJldHVybiBCb3g6OnBpbihzdGQ6OmZ1dHVyZTo6cmVhZHkoRXJyKGVycikpKSwKKyAgICB9OworICAgIGxldCBiaW5kZXIgPSBzZWxmLmJpbmRlci5jbG9uZSgpOworICAgIFA6OnNwYXduKAorICAgICAgbW92ZSB8fCBiaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmV2ZXJzZUludEVudW0sIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKSwKKyAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JldmVyc2VJbnRFbnVtKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQsIF9haWRsX3JlcGx5KQorICAgICAgfQorICAgICkKKyAgfQorICBmbiBSZXZlcnNlTG9uZ0VudW08J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiAmJ2EgW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW1dLCBfYXJnX3JlcGVhdGVkOiAmJ2EgbXV0IFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtPikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtPj4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX1JldmVyc2VMb25nRW51bShfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSB7CisgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgIH07CisgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgUDo6c3Bhd24oCisgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXZlcnNlTG9uZ0VudW0sIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKSwKKyAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JldmVyc2VMb25nRW51bShfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkLCBfYWlkbF9yZXBseSkKKyAgICAgIH0KKyAgICApCisgIH0KKyAgZm4gR2V0T3RoZXJUZXN0U2VydmljZTwnYT4oJidhIHNlbGYsIF9hcmdfbmFtZTogJidhIHN0cikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz4+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF9HZXRPdGhlclRlc3RTZXJ2aWNlKF9hcmdfbmFtZSkgeworICAgICAgT2soX2FpZGxfZGF0YSkgPT4gX2FpZGxfZGF0YSwKKyAgICAgIEVycihlcnIpID0+IHJldHVybiBCb3g6OnBpbihzdGQ6OmZ1dHVyZTo6cmVhZHkoRXJyKGVycikpKSwKKyAgICB9OworICAgIGxldCBiaW5kZXIgPSBzZWxmLmJpbmRlci5jbG9uZSgpOworICAgIFA6OnNwYXduKAorICAgICAgbW92ZSB8fCBiaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6R2V0T3RoZXJUZXN0U2VydmljZSwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpLAorICAgICAgbW92ZSB8X2FpZGxfcmVwbHl8IGFzeW5jIG1vdmUgeworICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfR2V0T3RoZXJUZXN0U2VydmljZShfYXJnX25hbWUsIF9haWRsX3JlcGx5KQorICAgICAgfQorICAgICkKKyAgfQorICBmbiBWZXJpZnlOYW1lPCdhPigmJ2Egc2VsZiwgX2FyZ19zZXJ2aWNlOiAmJ2EgYmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPiwgX2FyZ19uYW1lOiAmJ2Egc3RyKSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8Ym9vbD4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX1ZlcmlmeU5hbWUoX2FyZ19zZXJ2aWNlLCBfYXJnX25hbWUpIHsKKyAgICAgIE9rKF9haWRsX2RhdGEpID0+IF9haWRsX2RhdGEsCisgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgfTsKKyAgICBsZXQgYmluZGVyID0gc2VsZi5iaW5kZXIuY2xvbmUoKTsKKyAgICBQOjpzcGF3bigKKyAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlZlcmlmeU5hbWUsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKSwKKyAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1ZlcmlmeU5hbWUoX2FyZ19zZXJ2aWNlLCBfYXJnX25hbWUsIF9haWRsX3JlcGx5KQorICAgICAgfQorICAgICkKKyAgfQorICBmbiBHZXRJbnRlcmZhY2VBcnJheTwnYT4oJidhIHNlbGYsIF9hcmdfbmFtZXM6ICYnYSBbU3RyaW5nXSkgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PFZlYzxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+Pj4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX0dldEludGVyZmFjZUFycmF5KF9hcmdfbmFtZXMpIHsKKyAgICAgIE9rKF9haWRsX2RhdGEpID0+IF9haWRsX2RhdGEsCisgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgfTsKKyAgICBsZXQgYmluZGVyID0gc2VsZi5iaW5kZXIuY2xvbmUoKTsKKyAgICBQOjpzcGF3bigKKyAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OkdldEludGVyZmFjZUFycmF5LCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICBtb3ZlIHxfYWlkbF9yZXBseXwgYXN5bmMgbW92ZSB7CisgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9HZXRJbnRlcmZhY2VBcnJheShfYXJnX25hbWVzLCBfYWlkbF9yZXBseSkKKyAgICAgIH0KKyAgICApCisgIH0KKyAgZm4gVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlQXJyYXk8J2E+KCYnYSBzZWxmLCBfYXJnX3NlcnZpY2VzOiAmJ2EgW2JpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz5dLCBfYXJnX25hbWVzOiAmJ2EgW1N0cmluZ10pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxib29sPj4geworICAgIGxldCBfYWlkbF9kYXRhID0gbWF0Y2ggc2VsZi5idWlsZF9wYXJjZWxfVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlQXJyYXkoX2FyZ19zZXJ2aWNlcywgX2FyZ19uYW1lcykgeworICAgICAgT2soX2FpZGxfZGF0YSkgPT4gX2FpZGxfZGF0YSwKKyAgICAgIEVycihlcnIpID0+IHJldHVybiBCb3g6OnBpbihzdGQ6OmZ1dHVyZTo6cmVhZHkoRXJyKGVycikpKSwKKyAgICB9OworICAgIGxldCBiaW5kZXIgPSBzZWxmLmJpbmRlci5jbG9uZSgpOworICAgIFA6OnNwYXduKAorICAgICAgbW92ZSB8fCBiaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6VmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlQXJyYXksIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKSwKKyAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1ZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUFycmF5KF9hcmdfc2VydmljZXMsIF9hcmdfbmFtZXMsIF9haWRsX3JlcGx5KQorICAgICAgfQorICAgICkKKyAgfQorICBmbiBHZXROdWxsYWJsZUludGVyZmFjZUFycmF5PCdhPigmJ2Egc2VsZiwgX2FyZ19uYW1lczogT3B0aW9uPCYnYSBbT3B0aW9uPFN0cmluZz5dPikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz4+Pj4+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF9HZXROdWxsYWJsZUludGVyZmFjZUFycmF5KF9hcmdfbmFtZXMpIHsKKyAgICAgIE9rKF9haWRsX2RhdGEpID0+IF9haWRsX2RhdGEsCisgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgfTsKKyAgICBsZXQgYmluZGVyID0gc2VsZi5iaW5kZXIuY2xvbmUoKTsKKyAgICBQOjpzcGF3bigKKyAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OkdldE51bGxhYmxlSW50ZXJmYWNlQXJyYXksIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKSwKKyAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX0dldE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoX2FyZ19uYW1lcywgX2FpZGxfcmVwbHkpCisgICAgICB9CisgICAgKQorICB9CisgIGZuIFZlcmlmeU5hbWVzV2l0aE51bGxhYmxlSW50ZXJmYWNlQXJyYXk8J2E+KCYnYSBzZWxmLCBfYXJnX3NlcnZpY2VzOiBPcHRpb248JidhIFtPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPj5dPiwgX2FyZ19uYW1lczogT3B0aW9uPCYnYSBbT3B0aW9uPFN0cmluZz5dPikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PGJvb2w+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF9WZXJpZnlOYW1lc1dpdGhOdWxsYWJsZUludGVyZmFjZUFycmF5KF9hcmdfc2VydmljZXMsIF9hcmdfbmFtZXMpIHsKKyAgICAgIE9rKF9haWRsX2RhdGEpID0+IF9haWRsX2RhdGEsCisgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgfTsKKyAgICBsZXQgYmluZGVyID0gc2VsZi5iaW5kZXIuY2xvbmUoKTsKKyAgICBQOjpzcGF3bigKKyAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlZlcmlmeU5hbWVzV2l0aE51bGxhYmxlSW50ZXJmYWNlQXJyYXksIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKSwKKyAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1ZlcmlmeU5hbWVzV2l0aE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoX2FyZ19zZXJ2aWNlcywgX2FyZ19uYW1lcywgX2FpZGxfcmVwbHkpCisgICAgICB9CisgICAgKQorICB9CisgIGZuIEdldEludGVyZmFjZUxpc3Q8J2E+KCYnYSBzZWxmLCBfYXJnX25hbWVzOiBPcHRpb248JidhIFtPcHRpb248U3RyaW5nPl0+KSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPj4+Pj4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX0dldEludGVyZmFjZUxpc3QoX2FyZ19uYW1lcykgeworICAgICAgT2soX2FpZGxfZGF0YSkgPT4gX2FpZGxfZGF0YSwKKyAgICAgIEVycihlcnIpID0+IHJldHVybiBCb3g6OnBpbihzdGQ6OmZ1dHVyZTo6cmVhZHkoRXJyKGVycikpKSwKKyAgICB9OworICAgIGxldCBiaW5kZXIgPSBzZWxmLmJpbmRlci5jbG9uZSgpOworICAgIFA6OnNwYXduKAorICAgICAgbW92ZSB8fCBiaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6R2V0SW50ZXJmYWNlTGlzdCwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpLAorICAgICAgbW92ZSB8X2FpZGxfcmVwbHl8IGFzeW5jIG1vdmUgeworICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfR2V0SW50ZXJmYWNlTGlzdChfYXJnX25hbWVzLCBfYWlkbF9yZXBseSkKKyAgICAgIH0KKyAgICApCisgIH0KKyAgZm4gVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlTGlzdDwnYT4oJidhIHNlbGYsIF9hcmdfc2VydmljZXM6IE9wdGlvbjwmJ2EgW09wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+Pl0+LCBfYXJnX25hbWVzOiBPcHRpb248JidhIFtPcHRpb248U3RyaW5nPl0+KSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8Ym9vbD4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX1ZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUxpc3QoX2FyZ19zZXJ2aWNlcywgX2FyZ19uYW1lcykgeworICAgICAgT2soX2FpZGxfZGF0YSkgPT4gX2FpZGxfZGF0YSwKKyAgICAgIEVycihlcnIpID0+IHJldHVybiBCb3g6OnBpbihzdGQ6OmZ1dHVyZTo6cmVhZHkoRXJyKGVycikpKSwKKyAgICB9OworICAgIGxldCBiaW5kZXIgPSBzZWxmLmJpbmRlci5jbG9uZSgpOworICAgIFA6OnNwYXduKAorICAgICAgbW92ZSB8fCBiaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6VmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlTGlzdCwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpLAorICAgICAgbW92ZSB8X2FpZGxfcmVwbHl8IGFzeW5jIG1vdmUgeworICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlTGlzdChfYXJnX3NlcnZpY2VzLCBfYXJnX25hbWVzLCBfYWlkbF9yZXBseSkKKyAgICAgIH0KKyAgICApCisgIH0KKyAgZm4gUmV2ZXJzZVN0cmluZ0xpc3Q8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiAmJ2EgW1N0cmluZ10sIF9hcmdfcmVwZWF0ZWQ6ICYnYSBtdXQgVmVjPFN0cmluZz4pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxWZWM8U3RyaW5nPj4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX1JldmVyc2VTdHJpbmdMaXN0KF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpIHsKKyAgICAgIE9rKF9haWRsX2RhdGEpID0+IF9haWRsX2RhdGEsCisgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgfTsKKyAgICBsZXQgYmluZGVyID0gc2VsZi5iaW5kZXIuY2xvbmUoKTsKKyAgICBQOjpzcGF3bigKKyAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJldmVyc2VTdHJpbmdMaXN0LCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICBtb3ZlIHxfYWlkbF9yZXBseXwgYXN5bmMgbW92ZSB7CisgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXZlcnNlU3RyaW5nTGlzdChfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkLCBfYWlkbF9yZXBseSkKKyAgICAgIH0KKyAgICApCisgIH0KKyAgZm4gUmVwZWF0UGFyY2VsRmlsZURlc2NyaXB0b3I8J2E+KCYnYSBzZWxmLCBfYXJnX3JlYWQ6ICYnYSBiaW5kZXI6OlBhcmNlbEZpbGVEZXNjcmlwdG9yKSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX1JlcGVhdFBhcmNlbEZpbGVEZXNjcmlwdG9yKF9hcmdfcmVhZCkgeworICAgICAgT2soX2FpZGxfZGF0YSkgPT4gX2FpZGxfZGF0YSwKKyAgICAgIEVycihlcnIpID0+IHJldHVybiBCb3g6OnBpbihzdGQ6OmZ1dHVyZTo6cmVhZHkoRXJyKGVycikpKSwKKyAgICB9OworICAgIGxldCBiaW5kZXIgPSBzZWxmLmJpbmRlci5jbG9uZSgpOworICAgIFA6OnNwYXduKAorICAgICAgbW92ZSB8fCBiaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0UGFyY2VsRmlsZURlc2NyaXB0b3IsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKSwKKyAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JlcGVhdFBhcmNlbEZpbGVEZXNjcmlwdG9yKF9hcmdfcmVhZCwgX2FpZGxfcmVwbHkpCisgICAgICB9CisgICAgKQorICB9CisgIGZuIFJldmVyc2VQYXJjZWxGaWxlRGVzY3JpcHRvckFycmF5PCdhPigmJ2Egc2VsZiwgX2FyZ19pbnB1dDogJidhIFtiaW5kZXI6OlBhcmNlbEZpbGVEZXNjcmlwdG9yXSwgX2FyZ19yZXBlYXRlZDogJidhIG11dCBWZWM8T3B0aW9uPGJpbmRlcjo6UGFyY2VsRmlsZURlc2NyaXB0b3I+PikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PFZlYzxiaW5kZXI6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPj4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX1JldmVyc2VQYXJjZWxGaWxlRGVzY3JpcHRvckFycmF5KF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpIHsKKyAgICAgIE9rKF9haWRsX2RhdGEpID0+IF9haWRsX2RhdGEsCisgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgfTsKKyAgICBsZXQgYmluZGVyID0gc2VsZi5iaW5kZXIuY2xvbmUoKTsKKyAgICBQOjpzcGF3bigKKyAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJldmVyc2VQYXJjZWxGaWxlRGVzY3JpcHRvckFycmF5LCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICBtb3ZlIHxfYWlkbF9yZXBseXwgYXN5bmMgbW92ZSB7CisgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXZlcnNlUGFyY2VsRmlsZURlc2NyaXB0b3JBcnJheShfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkLCBfYWlkbF9yZXBseSkKKyAgICAgIH0KKyAgICApCisgIH0KKyAgZm4gVGhyb3dTZXJ2aWNlRXhjZXB0aW9uPCdhPigmJ2Egc2VsZiwgX2FyZ19jb2RlOiBpMzIpIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDwoKT4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX1Rocm93U2VydmljZUV4Y2VwdGlvbihfYXJnX2NvZGUpIHsKKyAgICAgIE9rKF9haWRsX2RhdGEpID0+IF9haWRsX2RhdGEsCisgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgfTsKKyAgICBsZXQgYmluZGVyID0gc2VsZi5iaW5kZXIuY2xvbmUoKTsKKyAgICBQOjpzcGF3bigKKyAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlRocm93U2VydmljZUV4Y2VwdGlvbiwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpLAorICAgICAgbW92ZSB8X2FpZGxfcmVwbHl8IGFzeW5jIG1vdmUgeworICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfVGhyb3dTZXJ2aWNlRXhjZXB0aW9uKF9hcmdfY29kZSwgX2FpZGxfcmVwbHkpCisgICAgICB9CisgICAgKQorICB9CisgIGZuIFJlcGVhdE51bGxhYmxlSW50QXJyYXk8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JidhIFtpMzJdPikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8aTMyPj4+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF9SZXBlYXROdWxsYWJsZUludEFycmF5KF9hcmdfaW5wdXQpIHsKKyAgICAgIE9rKF9haWRsX2RhdGEpID0+IF9haWRsX2RhdGEsCisgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgfTsKKyAgICBsZXQgYmluZGVyID0gc2VsZi5iaW5kZXIuY2xvbmUoKTsKKyAgICBQOjpzcGF3bigKKyAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlcGVhdE51bGxhYmxlSW50QXJyYXksIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKSwKKyAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JlcGVhdE51bGxhYmxlSW50QXJyYXkoX2FyZ19pbnB1dCwgX2FpZGxfcmVwbHkpCisgICAgICB9CisgICAgKQorICB9CisgIGZuIFJlcGVhdE51bGxhYmxlQnl0ZUVudW1BcnJheTwnYT4oJidhIHNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmJ2EgW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW1dPikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bT4+Pj4geworICAgIGxldCBfYWlkbF9kYXRhID0gbWF0Y2ggc2VsZi5idWlsZF9wYXJjZWxfUmVwZWF0TnVsbGFibGVCeXRlRW51bUFycmF5KF9hcmdfaW5wdXQpIHsKKyAgICAgIE9rKF9haWRsX2RhdGEpID0+IF9haWRsX2RhdGEsCisgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgfTsKKyAgICBsZXQgYmluZGVyID0gc2VsZi5iaW5kZXIuY2xvbmUoKTsKKyAgICBQOjpzcGF3bigKKyAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlcGVhdE51bGxhYmxlQnl0ZUVudW1BcnJheSwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpLAorICAgICAgbW92ZSB8X2FpZGxfcmVwbHl8IGFzeW5jIG1vdmUgeworICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmVwZWF0TnVsbGFibGVCeXRlRW51bUFycmF5KF9hcmdfaW5wdXQsIF9haWRsX3JlcGx5KQorICAgICAgfQorICAgICkKKyAgfQorICBmbiBSZXBlYXROdWxsYWJsZUludEVudW1BcnJheTwnYT4oJidhIHNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmJ2EgW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bV0+KSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW0+Pj4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX1JlcGVhdE51bGxhYmxlSW50RW51bUFycmF5KF9hcmdfaW5wdXQpIHsKKyAgICAgIE9rKF9haWRsX2RhdGEpID0+IF9haWRsX2RhdGEsCisgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgfTsKKyAgICBsZXQgYmluZGVyID0gc2VsZi5iaW5kZXIuY2xvbmUoKTsKKyAgICBQOjpzcGF3bigKKyAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlcGVhdE51bGxhYmxlSW50RW51bUFycmF5LCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICBtb3ZlIHxfYWlkbF9yZXBseXwgYXN5bmMgbW92ZSB7CisgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXBlYXROdWxsYWJsZUludEVudW1BcnJheShfYXJnX2lucHV0LCBfYWlkbF9yZXBseSkKKyAgICAgIH0KKyAgICApCisgIH0KKyAgZm4gUmVwZWF0TnVsbGFibGVMb25nRW51bUFycmF5PCdhPigmJ2Egc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCYnYSBbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bV0+KSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtPj4+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF9SZXBlYXROdWxsYWJsZUxvbmdFbnVtQXJyYXkoX2FyZ19pbnB1dCkgeworICAgICAgT2soX2FpZGxfZGF0YSkgPT4gX2FpZGxfZGF0YSwKKyAgICAgIEVycihlcnIpID0+IHJldHVybiBCb3g6OnBpbihzdGQ6OmZ1dHVyZTo6cmVhZHkoRXJyKGVycikpKSwKKyAgICB9OworICAgIGxldCBiaW5kZXIgPSBzZWxmLmJpbmRlci5jbG9uZSgpOworICAgIFA6OnNwYXduKAorICAgICAgbW92ZSB8fCBiaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0TnVsbGFibGVMb25nRW51bUFycmF5LCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICBtb3ZlIHxfYWlkbF9yZXBseXwgYXN5bmMgbW92ZSB7CisgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXBlYXROdWxsYWJsZUxvbmdFbnVtQXJyYXkoX2FyZ19pbnB1dCwgX2FpZGxfcmVwbHkpCisgICAgICB9CisgICAgKQorICB9CisgIGZuIFJlcGVhdE51bGxhYmxlU3RyaW5nPCdhPigmJ2Egc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCYnYSBzdHI+KSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFN0cmluZz4+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF9SZXBlYXROdWxsYWJsZVN0cmluZyhfYXJnX2lucHV0KSB7CisgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgIH07CisgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgUDo6c3Bhd24oCisgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXBlYXROdWxsYWJsZVN0cmluZywgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpLAorICAgICAgbW92ZSB8X2FpZGxfcmVwbHl8IGFzeW5jIG1vdmUgeworICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmVwZWF0TnVsbGFibGVTdHJpbmcoX2FyZ19pbnB1dCwgX2FpZGxfcmVwbHkpCisgICAgICB9CisgICAgKQorICB9CisgIGZuIFJlcGVhdE51bGxhYmxlU3RyaW5nTGlzdDwnYT4oJidhIHNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmJ2EgW09wdGlvbjxTdHJpbmc+XT4pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxTdHJpbmc+Pj4+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF9SZXBlYXROdWxsYWJsZVN0cmluZ0xpc3QoX2FyZ19pbnB1dCkgeworICAgICAgT2soX2FpZGxfZGF0YSkgPT4gX2FpZGxfZGF0YSwKKyAgICAgIEVycihlcnIpID0+IHJldHVybiBCb3g6OnBpbihzdGQ6OmZ1dHVyZTo6cmVhZHkoRXJyKGVycikpKSwKKyAgICB9OworICAgIGxldCBiaW5kZXIgPSBzZWxmLmJpbmRlci5jbG9uZSgpOworICAgIFA6OnNwYXduKAorICAgICAgbW92ZSB8fCBiaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0TnVsbGFibGVTdHJpbmdMaXN0LCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICBtb3ZlIHxfYWlkbF9yZXBseXwgYXN5bmMgbW92ZSB7CisgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXBlYXROdWxsYWJsZVN0cmluZ0xpc3QoX2FyZ19pbnB1dCwgX2FpZGxfcmVwbHkpCisgICAgICB9CisgICAgKQorICB9CisgIGZuIFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZTwnYT4oJidhIHNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmJ2EgY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTJfSVRlc3RTZXJ2aWNlXzVfRW1wdHk+KSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8T3B0aW9uPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZV81X0VtcHR5Pj4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX1JlcGVhdE51bGxhYmxlUGFyY2VsYWJsZShfYXJnX2lucHV0KSB7CisgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgIH07CisgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgUDo6c3Bhd24oCisgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXBlYXROdWxsYWJsZVBhcmNlbGFibGUsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKSwKKyAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JlcGVhdE51bGxhYmxlUGFyY2VsYWJsZShfYXJnX2lucHV0LCBfYWlkbF9yZXBseSkKKyAgICAgIH0KKyAgICApCisgIH0KKyAgZm4gUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlQXJyYXk8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JidhIFtPcHRpb248Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTJfSVRlc3RTZXJ2aWNlXzVfRW1wdHk+XT4pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMl9JVGVzdFNlcnZpY2VfNV9FbXB0eT4+Pj4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX1JlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUFycmF5KF9hcmdfaW5wdXQpIHsKKyAgICAgIE9rKF9haWRsX2RhdGEpID0+IF9haWRsX2RhdGEsCisgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgfTsKKyAgICBsZXQgYmluZGVyID0gc2VsZi5iaW5kZXIuY2xvbmUoKTsKKyAgICBQOjpzcGF3bigKKyAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUFycmF5LCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICBtb3ZlIHxfYWlkbF9yZXBseXwgYXN5bmMgbW92ZSB7CisgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXBlYXROdWxsYWJsZVBhcmNlbGFibGVBcnJheShfYXJnX2lucHV0LCBfYWlkbF9yZXBseSkKKyAgICAgIH0KKyAgICApCisgIH0KKyAgZm4gUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlTGlzdDwnYT4oJidhIHNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmJ2EgW09wdGlvbjxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMl9JVGVzdFNlcnZpY2VfNV9FbXB0eT5dPikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZV81X0VtcHR5Pj4+Pj4geworICAgIGxldCBfYWlkbF9kYXRhID0gbWF0Y2ggc2VsZi5idWlsZF9wYXJjZWxfUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlTGlzdChfYXJnX2lucHV0KSB7CisgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgIH07CisgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgUDo6c3Bhd24oCisgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXBlYXROdWxsYWJsZVBhcmNlbGFibGVMaXN0LCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICBtb3ZlIHxfYWlkbF9yZXBseXwgYXN5bmMgbW92ZSB7CisgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXBlYXROdWxsYWJsZVBhcmNlbGFibGVMaXN0KF9hcmdfaW5wdXQsIF9haWRsX3JlcGx5KQorICAgICAgfQorICAgICkKKyAgfQorICBmbiBUYWtlc0FuSUJpbmRlcjwnYT4oJidhIHNlbGYsIF9hcmdfaW5wdXQ6ICYnYSBiaW5kZXI6OlNwSUJpbmRlcikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PCgpPj4geworICAgIGxldCBfYWlkbF9kYXRhID0gbWF0Y2ggc2VsZi5idWlsZF9wYXJjZWxfVGFrZXNBbklCaW5kZXIoX2FyZ19pbnB1dCkgeworICAgICAgT2soX2FpZGxfZGF0YSkgPT4gX2FpZGxfZGF0YSwKKyAgICAgIEVycihlcnIpID0+IHJldHVybiBCb3g6OnBpbihzdGQ6OmZ1dHVyZTo6cmVhZHkoRXJyKGVycikpKSwKKyAgICB9OworICAgIGxldCBiaW5kZXIgPSBzZWxmLmJpbmRlci5jbG9uZSgpOworICAgIFA6OnNwYXduKAorICAgICAgbW92ZSB8fCBiaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6VGFrZXNBbklCaW5kZXIsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKSwKKyAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1Rha2VzQW5JQmluZGVyKF9hcmdfaW5wdXQsIF9haWRsX3JlcGx5KQorICAgICAgfQorICAgICkKKyAgfQorICBmbiBUYWtlc0FOdWxsYWJsZUlCaW5kZXI8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JidhIGJpbmRlcjo6U3BJQmluZGVyPikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PCgpPj4geworICAgIGxldCBfYWlkbF9kYXRhID0gbWF0Y2ggc2VsZi5idWlsZF9wYXJjZWxfVGFrZXNBTnVsbGFibGVJQmluZGVyKF9hcmdfaW5wdXQpIHsKKyAgICAgIE9rKF9haWRsX2RhdGEpID0+IF9haWRsX2RhdGEsCisgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgfTsKKyAgICBsZXQgYmluZGVyID0gc2VsZi5iaW5kZXIuY2xvbmUoKTsKKyAgICBQOjpzcGF3bigKKyAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlRha2VzQU51bGxhYmxlSUJpbmRlciwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpLAorICAgICAgbW92ZSB8X2FpZGxfcmVwbHl8IGFzeW5jIG1vdmUgeworICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfVGFrZXNBTnVsbGFibGVJQmluZGVyKF9hcmdfaW5wdXQsIF9haWRsX3JlcGx5KQorICAgICAgfQorICAgICkKKyAgfQorICBmbiBUYWtlc0FuSUJpbmRlckxpc3Q8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiAmJ2EgW2JpbmRlcjo6U3BJQmluZGVyXSkgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PCgpPj4geworICAgIGxldCBfYWlkbF9kYXRhID0gbWF0Y2ggc2VsZi5idWlsZF9wYXJjZWxfVGFrZXNBbklCaW5kZXJMaXN0KF9hcmdfaW5wdXQpIHsKKyAgICAgIE9rKF9haWRsX2RhdGEpID0+IF9haWRsX2RhdGEsCisgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgfTsKKyAgICBsZXQgYmluZGVyID0gc2VsZi5iaW5kZXIuY2xvbmUoKTsKKyAgICBQOjpzcGF3bigKKyAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlRha2VzQW5JQmluZGVyTGlzdCwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpLAorICAgICAgbW92ZSB8X2FpZGxfcmVwbHl8IGFzeW5jIG1vdmUgeworICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfVGFrZXNBbklCaW5kZXJMaXN0KF9hcmdfaW5wdXQsIF9haWRsX3JlcGx5KQorICAgICAgfQorICAgICkKKyAgfQorICBmbiBUYWtlc0FOdWxsYWJsZUlCaW5kZXJMaXN0PCdhPigmJ2Egc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCYnYSBbT3B0aW9uPGJpbmRlcjo6U3BJQmluZGVyPl0+KSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8KCk+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF9UYWtlc0FOdWxsYWJsZUlCaW5kZXJMaXN0KF9hcmdfaW5wdXQpIHsKKyAgICAgIE9rKF9haWRsX2RhdGEpID0+IF9haWRsX2RhdGEsCisgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgfTsKKyAgICBsZXQgYmluZGVyID0gc2VsZi5iaW5kZXIuY2xvbmUoKTsKKyAgICBQOjpzcGF3bigKKyAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlRha2VzQU51bGxhYmxlSUJpbmRlckxpc3QsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKSwKKyAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1Rha2VzQU51bGxhYmxlSUJpbmRlckxpc3QoX2FyZ19pbnB1dCwgX2FpZGxfcmVwbHkpCisgICAgICB9CisgICAgKQorICB9CisgIGZuIFJlcGVhdFV0ZjhDcHBTdHJpbmc8J2E+KCYnYSBzZWxmLCBfYXJnX3Rva2VuOiAmJ2Egc3RyKSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8U3RyaW5nPj4geworICAgIGxldCBfYWlkbF9kYXRhID0gbWF0Y2ggc2VsZi5idWlsZF9wYXJjZWxfUmVwZWF0VXRmOENwcFN0cmluZyhfYXJnX3Rva2VuKSB7CisgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgIH07CisgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgUDo6c3Bhd24oCisgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXBlYXRVdGY4Q3BwU3RyaW5nLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICBtb3ZlIHxfYWlkbF9yZXBseXwgYXN5bmMgbW92ZSB7CisgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXBlYXRVdGY4Q3BwU3RyaW5nKF9hcmdfdG9rZW4sIF9haWRsX3JlcGx5KQorICAgICAgfQorICAgICkKKyAgfQorICBmbiBSZXBlYXROdWxsYWJsZVV0ZjhDcHBTdHJpbmc8J2E+KCYnYSBzZWxmLCBfYXJnX3Rva2VuOiBPcHRpb248JidhIHN0cj4pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxPcHRpb248U3RyaW5nPj4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX1JlcGVhdE51bGxhYmxlVXRmOENwcFN0cmluZyhfYXJnX3Rva2VuKSB7CisgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgIH07CisgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgUDo6c3Bhd24oCisgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXBlYXROdWxsYWJsZVV0ZjhDcHBTdHJpbmcsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKSwKKyAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JlcGVhdE51bGxhYmxlVXRmOENwcFN0cmluZyhfYXJnX3Rva2VuLCBfYWlkbF9yZXBseSkKKyAgICAgIH0KKyAgICApCisgIH0KKyAgZm4gUmV2ZXJzZVV0ZjhDcHBTdHJpbmc8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiAmJ2EgW1N0cmluZ10sIF9hcmdfcmVwZWF0ZWQ6ICYnYSBtdXQgVmVjPFN0cmluZz4pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxWZWM8U3RyaW5nPj4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX1JldmVyc2VVdGY4Q3BwU3RyaW5nKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpIHsKKyAgICAgIE9rKF9haWRsX2RhdGEpID0+IF9haWRsX2RhdGEsCisgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgfTsKKyAgICBsZXQgYmluZGVyID0gc2VsZi5iaW5kZXIuY2xvbmUoKTsKKyAgICBQOjpzcGF3bigKKyAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJldmVyc2VVdGY4Q3BwU3RyaW5nLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICBtb3ZlIHxfYWlkbF9yZXBseXwgYXN5bmMgbW92ZSB7CisgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXZlcnNlVXRmOENwcFN0cmluZyhfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkLCBfYWlkbF9yZXBseSkKKyAgICAgIH0KKyAgICApCisgIH0KKyAgZm4gUmV2ZXJzZU51bGxhYmxlVXRmOENwcFN0cmluZzwnYT4oJidhIHNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmJ2EgW09wdGlvbjxTdHJpbmc+XT4sIF9hcmdfcmVwZWF0ZWQ6ICYnYSBtdXQgT3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+KSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+Pj4geworICAgIGxldCBfYWlkbF9kYXRhID0gbWF0Y2ggc2VsZi5idWlsZF9wYXJjZWxfUmV2ZXJzZU51bGxhYmxlVXRmOENwcFN0cmluZyhfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSB7CisgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgIH07CisgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgUDo6c3Bhd24oCisgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXZlcnNlTnVsbGFibGVVdGY4Q3BwU3RyaW5nLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICBtb3ZlIHxfYWlkbF9yZXBseXwgYXN5bmMgbW92ZSB7CisgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXZlcnNlTnVsbGFibGVVdGY4Q3BwU3RyaW5nKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQsIF9haWRsX3JlcGx5KQorICAgICAgfQorICAgICkKKyAgfQorICBmbiBSZXZlcnNlVXRmOENwcFN0cmluZ0xpc3Q8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JidhIFtPcHRpb248U3RyaW5nPl0+LCBfYXJnX3JlcGVhdGVkOiAmJ2EgbXV0IE9wdGlvbjxWZWM8T3B0aW9uPFN0cmluZz4+PikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPFN0cmluZz4+Pj4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX1JldmVyc2VVdGY4Q3BwU3RyaW5nTGlzdChfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSB7CisgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgIH07CisgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgUDo6c3Bhd24oCisgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXZlcnNlVXRmOENwcFN0cmluZ0xpc3QsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKSwKKyAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JldmVyc2VVdGY4Q3BwU3RyaW5nTGlzdChfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkLCBfYWlkbF9yZXBseSkKKyAgICAgIH0KKyAgICApCisgIH0KKyAgZm4gR2V0Q2FsbGJhY2s8J2E+KCYnYSBzZWxmLCBfYXJnX3JldHVybl9udWxsOiBib29sKSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz4+Pj4geworICAgIGxldCBfYWlkbF9kYXRhID0gbWF0Y2ggc2VsZi5idWlsZF9wYXJjZWxfR2V0Q2FsbGJhY2soX2FyZ19yZXR1cm5fbnVsbCkgeworICAgICAgT2soX2FpZGxfZGF0YSkgPT4gX2FpZGxfZGF0YSwKKyAgICAgIEVycihlcnIpID0+IHJldHVybiBCb3g6OnBpbihzdGQ6OmZ1dHVyZTo6cmVhZHkoRXJyKGVycikpKSwKKyAgICB9OworICAgIGxldCBiaW5kZXIgPSBzZWxmLmJpbmRlci5jbG9uZSgpOworICAgIFA6OnNwYXduKAorICAgICAgbW92ZSB8fCBiaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6R2V0Q2FsbGJhY2ssIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKSwKKyAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX0dldENhbGxiYWNrKF9hcmdfcmV0dXJuX251bGwsIF9haWRsX3JlcGx5KQorICAgICAgfQorICAgICkKKyAgfQorICBmbiBGaWxsT3V0U3RydWN0dXJlZFBhcmNlbGFibGU8J2E+KCYnYSBzZWxmLCBfYXJnX3BhcmNlbDogJidhIG11dCBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18yMF9TdHJ1Y3R1cmVkUGFyY2VsYWJsZSkgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PCgpPj4geworICAgIGxldCBfYWlkbF9kYXRhID0gbWF0Y2ggc2VsZi5idWlsZF9wYXJjZWxfRmlsbE91dFN0cnVjdHVyZWRQYXJjZWxhYmxlKF9hcmdfcGFyY2VsKSB7CisgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgIH07CisgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgUDo6c3Bhd24oCisgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpGaWxsT3V0U3RydWN0dXJlZFBhcmNlbGFibGUsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKSwKKyAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX0ZpbGxPdXRTdHJ1Y3R1cmVkUGFyY2VsYWJsZShfYXJnX3BhcmNlbCwgX2FpZGxfcmVwbHkpCisgICAgICB9CisgICAgKQorICB9CisgIGZuIFJlcGVhdEV4dGVuZGFibGVQYXJjZWxhYmxlPCdhPigmJ2Egc2VsZiwgX2FyZ19lcDogJidhIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzlfZXh0ZW5zaW9uXzIwX0V4dGVuZGFibGVQYXJjZWxhYmxlLCBfYXJnX2VwMjogJidhIG11dCBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c185X2V4dGVuc2lvbl8yMF9FeHRlbmRhYmxlUGFyY2VsYWJsZSkgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PCgpPj4geworICAgIGxldCBfYWlkbF9kYXRhID0gbWF0Y2ggc2VsZi5idWlsZF9wYXJjZWxfUmVwZWF0RXh0ZW5kYWJsZVBhcmNlbGFibGUoX2FyZ19lcCwgX2FyZ19lcDIpIHsKKyAgICAgIE9rKF9haWRsX2RhdGEpID0+IF9haWRsX2RhdGEsCisgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgfTsKKyAgICBsZXQgYmluZGVyID0gc2VsZi5iaW5kZXIuY2xvbmUoKTsKKyAgICBQOjpzcGF3bigKKyAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlcGVhdEV4dGVuZGFibGVQYXJjZWxhYmxlLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICBtb3ZlIHxfYWlkbF9yZXBseXwgYXN5bmMgbW92ZSB7CisgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXBlYXRFeHRlbmRhYmxlUGFyY2VsYWJsZShfYXJnX2VwLCBfYXJnX2VwMiwgX2FpZGxfcmVwbHkpCisgICAgICB9CisgICAgKQorICB9CisgIGZuIFJldmVyc2VMaXN0PCdhPigmJ2Egc2VsZiwgX2FyZ19saXN0OiAmJ2EgY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTNfUmVjdXJzaXZlTGlzdCkgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEzX1JlY3Vyc2l2ZUxpc3Q+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF9SZXZlcnNlTGlzdChfYXJnX2xpc3QpIHsKKyAgICAgIE9rKF9haWRsX2RhdGEpID0+IF9haWRsX2RhdGEsCisgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgfTsKKyAgICBsZXQgYmluZGVyID0gc2VsZi5iaW5kZXIuY2xvbmUoKTsKKyAgICBQOjpzcGF3bigKKyAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJldmVyc2VMaXN0LCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICBtb3ZlIHxfYWlkbF9yZXBseXwgYXN5bmMgbW92ZSB7CisgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXZlcnNlTGlzdChfYXJnX2xpc3QsIF9haWRsX3JlcGx5KQorICAgICAgfQorICAgICkKKyAgfQorICBmbiBSZXZlcnNlSUJpbmRlckFycmF5PCdhPigmJ2Egc2VsZiwgX2FyZ19pbnB1dDogJidhIFtiaW5kZXI6OlNwSUJpbmRlcl0sIF9hcmdfcmVwZWF0ZWQ6ICYnYSBtdXQgVmVjPE9wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj4+KSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8VmVjPGJpbmRlcjo6U3BJQmluZGVyPj4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX1JldmVyc2VJQmluZGVyQXJyYXkoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCkgeworICAgICAgT2soX2FpZGxfZGF0YSkgPT4gX2FpZGxfZGF0YSwKKyAgICAgIEVycihlcnIpID0+IHJldHVybiBCb3g6OnBpbihzdGQ6OmZ1dHVyZTo6cmVhZHkoRXJyKGVycikpKSwKKyAgICB9OworICAgIGxldCBiaW5kZXIgPSBzZWxmLmJpbmRlci5jbG9uZSgpOworICAgIFA6OnNwYXduKAorICAgICAgbW92ZSB8fCBiaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmV2ZXJzZUlCaW5kZXJBcnJheSwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpLAorICAgICAgbW92ZSB8X2FpZGxfcmVwbHl8IGFzeW5jIG1vdmUgeworICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmV2ZXJzZUlCaW5kZXJBcnJheShfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkLCBfYWlkbF9yZXBseSkKKyAgICAgIH0KKyAgICApCisgIH0KKyAgZm4gUmV2ZXJzZU51bGxhYmxlSUJpbmRlckFycmF5PCdhPigmJ2Egc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCYnYSBbT3B0aW9uPGJpbmRlcjo6U3BJQmluZGVyPl0+LCBfYXJnX3JlcGVhdGVkOiAmJ2EgbXV0IE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3BJQmluZGVyPj4+KSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTcElCaW5kZXI+Pj4+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF9SZXZlcnNlTnVsbGFibGVJQmluZGVyQXJyYXkoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCkgeworICAgICAgT2soX2FpZGxfZGF0YSkgPT4gX2FpZGxfZGF0YSwKKyAgICAgIEVycihlcnIpID0+IHJldHVybiBCb3g6OnBpbihzdGQ6OmZ1dHVyZTo6cmVhZHkoRXJyKGVycikpKSwKKyAgICB9OworICAgIGxldCBiaW5kZXIgPSBzZWxmLmJpbmRlci5jbG9uZSgpOworICAgIFA6OnNwYXduKAorICAgICAgbW92ZSB8fCBiaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmV2ZXJzZU51bGxhYmxlSUJpbmRlckFycmF5LCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICBtb3ZlIHxfYWlkbF9yZXBseXwgYXN5bmMgbW92ZSB7CisgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXZlcnNlTnVsbGFibGVJQmluZGVyQXJyYXkoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCwgX2FpZGxfcmVwbHkpCisgICAgICB9CisgICAgKQorICB9CisgIGZuIEdldE9sZE5hbWVJbnRlcmZhY2U8J2E+KCYnYSBzZWxmKSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfSU9sZE5hbWU+Pj4geworICAgIGxldCBfYWlkbF9kYXRhID0gbWF0Y2ggc2VsZi5idWlsZF9wYXJjZWxfR2V0T2xkTmFtZUludGVyZmFjZSgpIHsKKyAgICAgIE9rKF9haWRsX2RhdGEpID0+IF9haWRsX2RhdGEsCisgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgfTsKKyAgICBsZXQgYmluZGVyID0gc2VsZi5iaW5kZXIuY2xvbmUoKTsKKyAgICBQOjpzcGF3bigKKyAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OkdldE9sZE5hbWVJbnRlcmZhY2UsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKSwKKyAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX0dldE9sZE5hbWVJbnRlcmZhY2UoX2FpZGxfcmVwbHkpCisgICAgICB9CisgICAgKQorICB9CisgIGZuIEdldE5ld05hbWVJbnRlcmZhY2U8J2E+KCYnYSBzZWxmKSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfSU5ld05hbWU+Pj4geworICAgIGxldCBfYWlkbF9kYXRhID0gbWF0Y2ggc2VsZi5idWlsZF9wYXJjZWxfR2V0TmV3TmFtZUludGVyZmFjZSgpIHsKKyAgICAgIE9rKF9haWRsX2RhdGEpID0+IF9haWRsX2RhdGEsCisgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgfTsKKyAgICBsZXQgYmluZGVyID0gc2VsZi5iaW5kZXIuY2xvbmUoKTsKKyAgICBQOjpzcGF3bigKKyAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OkdldE5ld05hbWVJbnRlcmZhY2UsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKSwKKyAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX0dldE5ld05hbWVJbnRlcmZhY2UoX2FpZGxfcmVwbHkpCisgICAgICB9CisgICAgKQorICB9CisgIGZuIEdldFVuaW9uVGFnczwnYT4oJidhIHNlbGYsIF9hcmdfaW5wdXQ6ICYnYSBbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNV9Vbmlvbl0pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNV9Vbmlvbl8zX1RhZz4+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF9HZXRVbmlvblRhZ3MoX2FyZ19pbnB1dCkgeworICAgICAgT2soX2FpZGxfZGF0YSkgPT4gX2FpZGxfZGF0YSwKKyAgICAgIEVycihlcnIpID0+IHJldHVybiBCb3g6OnBpbihzdGQ6OmZ1dHVyZTo6cmVhZHkoRXJyKGVycikpKSwKKyAgICB9OworICAgIGxldCBiaW5kZXIgPSBzZWxmLmJpbmRlci5jbG9uZSgpOworICAgIFA6OnNwYXduKAorICAgICAgbW92ZSB8fCBiaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6R2V0VW5pb25UYWdzLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICBtb3ZlIHxfYWlkbF9yZXBseXwgYXN5bmMgbW92ZSB7CisgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9HZXRVbmlvblRhZ3MoX2FyZ19pbnB1dCwgX2FpZGxfcmVwbHkpCisgICAgICB9CisgICAgKQorICB9CisgIGZuIEdldENwcEphdmFUZXN0czwnYT4oJidhIHNlbGYpIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxPcHRpb248YmluZGVyOjpTcElCaW5kZXI+Pj4geworICAgIGxldCBfYWlkbF9kYXRhID0gbWF0Y2ggc2VsZi5idWlsZF9wYXJjZWxfR2V0Q3BwSmF2YVRlc3RzKCkgeworICAgICAgT2soX2FpZGxfZGF0YSkgPT4gX2FpZGxfZGF0YSwKKyAgICAgIEVycihlcnIpID0+IHJldHVybiBCb3g6OnBpbihzdGQ6OmZ1dHVyZTo6cmVhZHkoRXJyKGVycikpKSwKKyAgICB9OworICAgIGxldCBiaW5kZXIgPSBzZWxmLmJpbmRlci5jbG9uZSgpOworICAgIFA6OnNwYXduKAorICAgICAgbW92ZSB8fCBiaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6R2V0Q3BwSmF2YVRlc3RzLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICBtb3ZlIHxfYWlkbF9yZXBseXwgYXN5bmMgbW92ZSB7CisgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9HZXRDcHBKYXZhVGVzdHMoX2FpZGxfcmVwbHkpCisgICAgICB9CisgICAgKQorICB9CisgIGZuIGdldEJhY2tlbmRUeXBlPCdhPigmJ2Egc2VsZikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzExX0JhY2tlbmRUeXBlPj4geworICAgIGxldCBfYWlkbF9kYXRhID0gbWF0Y2ggc2VsZi5idWlsZF9wYXJjZWxfZ2V0QmFja2VuZFR5cGUoKSB7CisgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgIH07CisgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgUDo6c3Bhd24oCisgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpnZXRCYWNrZW5kVHlwZSwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpLAorICAgICAgbW92ZSB8X2FpZGxfcmVwbHl8IGFzeW5jIG1vdmUgeworICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfZ2V0QmFja2VuZFR5cGUoX2FpZGxfcmVwbHkpCisgICAgICB9CisgICAgKQorICB9Cit9CitpbXBsIElUZXN0U2VydmljZSBmb3IgYmluZGVyOjpiaW5kZXJfaW1wbDo6QmluZGVyPEJuVGVzdFNlcnZpY2U+IHsKKyAgZm4gVW5pbXBsZW1lbnRlZE1ldGhvZCgmc2VsZiwgX2FyZ19hcmc6IGkzMikgLT4gYmluZGVyOjpSZXN1bHQ8aTMyPiB7IHNlbGYuMC5VbmltcGxlbWVudGVkTWV0aG9kKF9hcmdfYXJnKSB9CisgIGZuIERlcHJlY2F0ZWQoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7IHNlbGYuMC5EZXByZWNhdGVkKCkgfQorICBmbiBUZXN0T25ld2F5KCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4geyBzZWxmLjAuVGVzdE9uZXdheSgpIH0KKyAgZm4gUmVwZWF0Qm9vbGVhbigmc2VsZiwgX2FyZ190b2tlbjogYm9vbCkgLT4gYmluZGVyOjpSZXN1bHQ8Ym9vbD4geyBzZWxmLjAuUmVwZWF0Qm9vbGVhbihfYXJnX3Rva2VuKSB9CisgIGZuIFJlcGVhdEJ5dGUoJnNlbGYsIF9hcmdfdG9rZW46IGk4KSAtPiBiaW5kZXI6OlJlc3VsdDxpOD4geyBzZWxmLjAuUmVwZWF0Qnl0ZShfYXJnX3Rva2VuKSB9CisgIGZuIFJlcGVhdENoYXIoJnNlbGYsIF9hcmdfdG9rZW46IHUxNikgLT4gYmluZGVyOjpSZXN1bHQ8dTE2PiB7IHNlbGYuMC5SZXBlYXRDaGFyKF9hcmdfdG9rZW4pIH0KKyAgZm4gUmVwZWF0SW50KCZzZWxmLCBfYXJnX3Rva2VuOiBpMzIpIC0+IGJpbmRlcjo6UmVzdWx0PGkzMj4geyBzZWxmLjAuUmVwZWF0SW50KF9hcmdfdG9rZW4pIH0KKyAgZm4gUmVwZWF0TG9uZygmc2VsZiwgX2FyZ190b2tlbjogaTY0KSAtPiBiaW5kZXI6OlJlc3VsdDxpNjQ+IHsgc2VsZi4wLlJlcGVhdExvbmcoX2FyZ190b2tlbikgfQorICBmbiBSZXBlYXRGbG9hdCgmc2VsZiwgX2FyZ190b2tlbjogZjMyKSAtPiBiaW5kZXI6OlJlc3VsdDxmMzI+IHsgc2VsZi4wLlJlcGVhdEZsb2F0KF9hcmdfdG9rZW4pIH0KKyAgZm4gUmVwZWF0RG91YmxlKCZzZWxmLCBfYXJnX3Rva2VuOiBmNjQpIC0+IGJpbmRlcjo6UmVzdWx0PGY2ND4geyBzZWxmLjAuUmVwZWF0RG91YmxlKF9hcmdfdG9rZW4pIH0KKyAgZm4gUmVwZWF0U3RyaW5nKCZzZWxmLCBfYXJnX3Rva2VuOiAmc3RyKSAtPiBiaW5kZXI6OlJlc3VsdDxTdHJpbmc+IHsgc2VsZi4wLlJlcGVhdFN0cmluZyhfYXJnX3Rva2VuKSB9CisgIGZuIFJlcGVhdEJ5dGVFbnVtKCZzZWxmLCBfYXJnX3Rva2VuOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtKSAtPiBiaW5kZXI6OlJlc3VsdDxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtPiB7IHNlbGYuMC5SZXBlYXRCeXRlRW51bShfYXJnX3Rva2VuKSB9CisgIGZuIFJlcGVhdEludEVudW0oJnNlbGYsIF9hcmdfdG9rZW46IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bSkgLT4gYmluZGVyOjpSZXN1bHQ8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtPiB7IHNlbGYuMC5SZXBlYXRJbnRFbnVtKF9hcmdfdG9rZW4pIH0KKyAgZm4gUmVwZWF0TG9uZ0VudW0oJnNlbGYsIF9hcmdfdG9rZW46IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW0pIC0+IGJpbmRlcjo6UmVzdWx0PGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW0+IHsgc2VsZi4wLlJlcGVhdExvbmdFbnVtKF9hcmdfdG9rZW4pIH0KKyAgZm4gUmV2ZXJzZUJvb2xlYW4oJnNlbGYsIF9hcmdfaW5wdXQ6ICZbYm9vbF0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPGJvb2w+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8Ym9vbD4+IHsgc2VsZi4wLlJldmVyc2VCb29sZWFuKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpIH0KKyAgZm4gUmV2ZXJzZUJ5dGUoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbdThdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzx1OD4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzx1OD4+IHsgc2VsZi4wLlJldmVyc2VCeXRlKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpIH0KKyAgZm4gUmV2ZXJzZUNoYXIoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbdTE2XSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8dTE2PikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPHUxNj4+IHsgc2VsZi4wLlJldmVyc2VDaGFyKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpIH0KKyAgZm4gUmV2ZXJzZUludCgmc2VsZiwgX2FyZ19pbnB1dDogJltpMzJdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxpMzI+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8aTMyPj4geyBzZWxmLjAuUmV2ZXJzZUludChfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSB9CisgIGZuIFJldmVyc2VMb25nKCZzZWxmLCBfYXJnX2lucHV0OiAmW2k2NF0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPGk2ND4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxpNjQ+PiB7IHNlbGYuMC5SZXZlcnNlTG9uZyhfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSB9CisgIGZuIFJldmVyc2VGbG9hdCgmc2VsZiwgX2FyZ19pbnB1dDogJltmMzJdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxmMzI+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8ZjMyPj4geyBzZWxmLjAuUmV2ZXJzZUZsb2F0KF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpIH0KKyAgZm4gUmV2ZXJzZURvdWJsZSgmc2VsZiwgX2FyZ19pbnB1dDogJltmNjRdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxmNjQ+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8ZjY0Pj4geyBzZWxmLjAuUmV2ZXJzZURvdWJsZShfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSB9CisgIGZuIFJldmVyc2VTdHJpbmcoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbU3RyaW5nXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8U3RyaW5nPikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPFN0cmluZz4+IHsgc2VsZi4wLlJldmVyc2VTdHJpbmcoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCkgfQorICBmbiBSZXZlcnNlQnl0ZUVudW0oJnNlbGYsIF9hcmdfaW5wdXQ6ICZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bV0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW0+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bT4+IHsgc2VsZi4wLlJldmVyc2VCeXRlRW51bShfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSB9CisgIGZuIFJldmVyc2VJbnRFbnVtKCZzZWxmLCBfYXJnX2lucHV0OiAmW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bV0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bT4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW0+PiB7IHNlbGYuMC5SZXZlcnNlSW50RW51bShfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSB9CisgIGZuIFJldmVyc2VMb25nRW51bSgmc2VsZiwgX2FyZ19pbnB1dDogJltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bT4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtPj4geyBzZWxmLjAuUmV2ZXJzZUxvbmdFbnVtKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpIH0KKyAgZm4gR2V0T3RoZXJUZXN0U2VydmljZSgmc2VsZiwgX2FyZ19uYW1lOiAmc3RyKSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+PiB7IHNlbGYuMC5HZXRPdGhlclRlc3RTZXJ2aWNlKF9hcmdfbmFtZSkgfQorICBmbiBWZXJpZnlOYW1lKCZzZWxmLCBfYXJnX3NlcnZpY2U6ICZiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+LCBfYXJnX25hbWU6ICZzdHIpIC0+IGJpbmRlcjo6UmVzdWx0PGJvb2w+IHsgc2VsZi4wLlZlcmlmeU5hbWUoX2FyZ19zZXJ2aWNlLCBfYXJnX25hbWUpIH0KKyAgZm4gR2V0SW50ZXJmYWNlQXJyYXkoJnNlbGYsIF9hcmdfbmFtZXM6ICZbU3RyaW5nXSkgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz4+PiB7IHNlbGYuMC5HZXRJbnRlcmZhY2VBcnJheShfYXJnX25hbWVzKSB9CisgIGZuIFZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUFycmF5KCZzZWxmLCBfYXJnX3NlcnZpY2VzOiAmW2JpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz5dLCBfYXJnX25hbWVzOiAmW1N0cmluZ10pIC0+IGJpbmRlcjo6UmVzdWx0PGJvb2w+IHsgc2VsZi4wLlZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUFycmF5KF9hcmdfc2VydmljZXMsIF9hcmdfbmFtZXMpIH0KKyAgZm4gR2V0TnVsbGFibGVJbnRlcmZhY2VBcnJheSgmc2VsZiwgX2FyZ19uYW1lczogT3B0aW9uPCZbT3B0aW9uPFN0cmluZz5dPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPj4+Pj4geyBzZWxmLjAuR2V0TnVsbGFibGVJbnRlcmZhY2VBcnJheShfYXJnX25hbWVzKSB9CisgIGZuIFZlcmlmeU5hbWVzV2l0aE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoJnNlbGYsIF9hcmdfc2VydmljZXM6IE9wdGlvbjwmW09wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+Pl0+LCBfYXJnX25hbWVzOiBPcHRpb248JltPcHRpb248U3RyaW5nPl0+KSAtPiBiaW5kZXI6OlJlc3VsdDxib29sPiB7IHNlbGYuMC5WZXJpZnlOYW1lc1dpdGhOdWxsYWJsZUludGVyZmFjZUFycmF5KF9hcmdfc2VydmljZXMsIF9hcmdfbmFtZXMpIH0KKyAgZm4gR2V0SW50ZXJmYWNlTGlzdCgmc2VsZiwgX2FyZ19uYW1lczogT3B0aW9uPCZbT3B0aW9uPFN0cmluZz5dPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPj4+Pj4geyBzZWxmLjAuR2V0SW50ZXJmYWNlTGlzdChfYXJnX25hbWVzKSB9CisgIGZuIFZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUxpc3QoJnNlbGYsIF9hcmdfc2VydmljZXM6IE9wdGlvbjwmW09wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+Pl0+LCBfYXJnX25hbWVzOiBPcHRpb248JltPcHRpb248U3RyaW5nPl0+KSAtPiBiaW5kZXI6OlJlc3VsdDxib29sPiB7IHNlbGYuMC5WZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VMaXN0KF9hcmdfc2VydmljZXMsIF9hcmdfbmFtZXMpIH0KKyAgZm4gUmV2ZXJzZVN0cmluZ0xpc3QoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbU3RyaW5nXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8U3RyaW5nPikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPFN0cmluZz4+IHsgc2VsZi4wLlJldmVyc2VTdHJpbmdMaXN0KF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpIH0KKyAgZm4gUmVwZWF0UGFyY2VsRmlsZURlc2NyaXB0b3IoJnNlbGYsIF9hcmdfcmVhZDogJmJpbmRlcjo6UGFyY2VsRmlsZURlc2NyaXB0b3IpIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6UGFyY2VsRmlsZURlc2NyaXB0b3I+IHsgc2VsZi4wLlJlcGVhdFBhcmNlbEZpbGVEZXNjcmlwdG9yKF9hcmdfcmVhZCkgfQorICBmbiBSZXZlcnNlUGFyY2VsRmlsZURlc2NyaXB0b3JBcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogJltiaW5kZXI6OlBhcmNlbEZpbGVEZXNjcmlwdG9yXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8T3B0aW9uPGJpbmRlcjo6UGFyY2VsRmlsZURlc2NyaXB0b3I+PikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPGJpbmRlcjo6UGFyY2VsRmlsZURlc2NyaXB0b3I+PiB7IHNlbGYuMC5SZXZlcnNlUGFyY2VsRmlsZURlc2NyaXB0b3JBcnJheShfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSB9CisgIGZuIFRocm93U2VydmljZUV4Y2VwdGlvbigmc2VsZiwgX2FyZ19jb2RlOiBpMzIpIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7IHNlbGYuMC5UaHJvd1NlcnZpY2VFeGNlcHRpb24oX2FyZ19jb2RlKSB9CisgIGZuIFJlcGVhdE51bGxhYmxlSW50QXJyYXkoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW2kzMl0+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPGkzMj4+PiB7IHNlbGYuMC5SZXBlYXROdWxsYWJsZUludEFycmF5KF9hcmdfaW5wdXQpIH0KKyAgZm4gUmVwZWF0TnVsbGFibGVCeXRlRW51bUFycmF5KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtXT4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bT4+PiB7IHNlbGYuMC5SZXBlYXROdWxsYWJsZUJ5dGVFbnVtQXJyYXkoX2FyZ19pbnB1dCkgfQorICBmbiBSZXBlYXROdWxsYWJsZUludEVudW1BcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtXT4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtPj4+IHsgc2VsZi4wLlJlcGVhdE51bGxhYmxlSW50RW51bUFycmF5KF9hcmdfaW5wdXQpIH0KKyAgZm4gUmVwZWF0TnVsbGFibGVMb25nRW51bUFycmF5KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtXT4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bT4+PiB7IHNlbGYuMC5SZXBlYXROdWxsYWJsZUxvbmdFbnVtQXJyYXkoX2FyZ19pbnB1dCkgfQorICBmbiBSZXBlYXROdWxsYWJsZVN0cmluZygmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZzdHI+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248U3RyaW5nPj4geyBzZWxmLjAuUmVwZWF0TnVsbGFibGVTdHJpbmcoX2FyZ19pbnB1dCkgfQorICBmbiBSZXBlYXROdWxsYWJsZVN0cmluZ0xpc3QoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxTdHJpbmc+XT4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPFN0cmluZz4+Pj4geyBzZWxmLjAuUmVwZWF0TnVsbGFibGVTdHJpbmdMaXN0KF9hcmdfaW5wdXQpIH0KKyAgZm4gUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlKCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JmNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZV81X0VtcHR5PikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZV81X0VtcHR5Pj4geyBzZWxmLjAuUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlKF9hcmdfaW5wdXQpIH0KKyAgZm4gUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlQXJyYXkoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMl9JVGVzdFNlcnZpY2VfNV9FbXB0eT5dPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTJfSVRlc3RTZXJ2aWNlXzVfRW1wdHk+Pj4+IHsgc2VsZi4wLlJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUFycmF5KF9hcmdfaW5wdXQpIH0KKyAgZm4gUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlTGlzdCgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbT3B0aW9uPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZV81X0VtcHR5Pl0+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMl9JVGVzdFNlcnZpY2VfNV9FbXB0eT4+Pj4geyBzZWxmLjAuUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlTGlzdChfYXJnX2lucHV0KSB9CisgIGZuIFRha2VzQW5JQmluZGVyKCZzZWxmLCBfYXJnX2lucHV0OiAmYmluZGVyOjpTcElCaW5kZXIpIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7IHNlbGYuMC5UYWtlc0FuSUJpbmRlcihfYXJnX2lucHV0KSB9CisgIGZuIFRha2VzQU51bGxhYmxlSUJpbmRlcigmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZiaW5kZXI6OlNwSUJpbmRlcj4pIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7IHNlbGYuMC5UYWtlc0FOdWxsYWJsZUlCaW5kZXIoX2FyZ19pbnB1dCkgfQorICBmbiBUYWtlc0FuSUJpbmRlckxpc3QoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbYmluZGVyOjpTcElCaW5kZXJdKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4geyBzZWxmLjAuVGFrZXNBbklCaW5kZXJMaXN0KF9hcmdfaW5wdXQpIH0KKyAgZm4gVGFrZXNBTnVsbGFibGVJQmluZGVyTGlzdCgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbT3B0aW9uPGJpbmRlcjo6U3BJQmluZGVyPl0+KSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4geyBzZWxmLjAuVGFrZXNBTnVsbGFibGVJQmluZGVyTGlzdChfYXJnX2lucHV0KSB9CisgIGZuIFJlcGVhdFV0ZjhDcHBTdHJpbmcoJnNlbGYsIF9hcmdfdG9rZW46ICZzdHIpIC0+IGJpbmRlcjo6UmVzdWx0PFN0cmluZz4geyBzZWxmLjAuUmVwZWF0VXRmOENwcFN0cmluZyhfYXJnX3Rva2VuKSB9CisgIGZuIFJlcGVhdE51bGxhYmxlVXRmOENwcFN0cmluZygmc2VsZiwgX2FyZ190b2tlbjogT3B0aW9uPCZzdHI+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248U3RyaW5nPj4geyBzZWxmLjAuUmVwZWF0TnVsbGFibGVVdGY4Q3BwU3RyaW5nKF9hcmdfdG9rZW4pIH0KKyAgZm4gUmV2ZXJzZVV0ZjhDcHBTdHJpbmcoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbU3RyaW5nXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8U3RyaW5nPikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPFN0cmluZz4+IHsgc2VsZi4wLlJldmVyc2VVdGY4Q3BwU3RyaW5nKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpIH0KKyAgZm4gUmV2ZXJzZU51bGxhYmxlVXRmOENwcFN0cmluZygmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbT3B0aW9uPFN0cmluZz5dPiwgX2FyZ19yZXBlYXRlZDogJm11dCBPcHRpb248VmVjPE9wdGlvbjxTdHJpbmc+Pj4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPFN0cmluZz4+Pj4geyBzZWxmLjAuUmV2ZXJzZU51bGxhYmxlVXRmOENwcFN0cmluZyhfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSB9CisgIGZuIFJldmVyc2VVdGY4Q3BwU3RyaW5nTGlzdCgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbT3B0aW9uPFN0cmluZz5dPiwgX2FyZ19yZXBlYXRlZDogJm11dCBPcHRpb248VmVjPE9wdGlvbjxTdHJpbmc+Pj4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPFN0cmluZz4+Pj4geyBzZWxmLjAuUmV2ZXJzZVV0ZjhDcHBTdHJpbmdMaXN0KF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpIH0KKyAgZm4gR2V0Q2FsbGJhY2soJnNlbGYsIF9hcmdfcmV0dXJuX251bGw6IGJvb2wpIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+Pj4geyBzZWxmLjAuR2V0Q2FsbGJhY2soX2FyZ19yZXR1cm5fbnVsbCkgfQorICBmbiBGaWxsT3V0U3RydWN0dXJlZFBhcmNlbGFibGUoJnNlbGYsIF9hcmdfcGFyY2VsOiAmbXV0IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzIwX1N0cnVjdHVyZWRQYXJjZWxhYmxlKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4geyBzZWxmLjAuRmlsbE91dFN0cnVjdHVyZWRQYXJjZWxhYmxlKF9hcmdfcGFyY2VsKSB9CisgIGZuIFJlcGVhdEV4dGVuZGFibGVQYXJjZWxhYmxlKCZzZWxmLCBfYXJnX2VwOiAmY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOV9leHRlbnNpb25fMjBfRXh0ZW5kYWJsZVBhcmNlbGFibGUsIF9hcmdfZXAyOiAmbXV0IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzlfZXh0ZW5zaW9uXzIwX0V4dGVuZGFibGVQYXJjZWxhYmxlKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4geyBzZWxmLjAuUmVwZWF0RXh0ZW5kYWJsZVBhcmNlbGFibGUoX2FyZ19lcCwgX2FyZ19lcDIpIH0KKyAgZm4gUmV2ZXJzZUxpc3QoJnNlbGYsIF9hcmdfbGlzdDogJmNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEzX1JlY3Vyc2l2ZUxpc3QpIC0+IGJpbmRlcjo6UmVzdWx0PGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEzX1JlY3Vyc2l2ZUxpc3Q+IHsgc2VsZi4wLlJldmVyc2VMaXN0KF9hcmdfbGlzdCkgfQorICBmbiBSZXZlcnNlSUJpbmRlckFycmF5KCZzZWxmLCBfYXJnX2lucHV0OiAmW2JpbmRlcjo6U3BJQmluZGVyXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8T3B0aW9uPGJpbmRlcjo6U3BJQmluZGVyPj4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxiaW5kZXI6OlNwSUJpbmRlcj4+IHsgc2VsZi4wLlJldmVyc2VJQmluZGVyQXJyYXkoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCkgfQorICBmbiBSZXZlcnNlTnVsbGFibGVJQmluZGVyQXJyYXkoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj5dPiwgX2FyZ19yZXBlYXRlZDogJm11dCBPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj4+PikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTcElCaW5kZXI+Pj4+IHsgc2VsZi4wLlJldmVyc2VOdWxsYWJsZUlCaW5kZXJBcnJheShfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSB9CisgIGZuIEdldE9sZE5hbWVJbnRlcmZhY2UoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0lPbGROYW1lPj4geyBzZWxmLjAuR2V0T2xkTmFtZUludGVyZmFjZSgpIH0KKyAgZm4gR2V0TmV3TmFtZUludGVyZmFjZSgmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfSU5ld05hbWU+PiB7IHNlbGYuMC5HZXROZXdOYW1lSW50ZXJmYWNlKCkgfQorICBmbiBHZXRVbmlvblRhZ3MoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNV9Vbmlvbl0pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c181X1VuaW9uXzNfVGFnPj4geyBzZWxmLjAuR2V0VW5pb25UYWdzKF9hcmdfaW5wdXQpIH0KKyAgZm4gR2V0Q3BwSmF2YVRlc3RzKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248YmluZGVyOjpTcElCaW5kZXI+PiB7IHNlbGYuMC5HZXRDcHBKYXZhVGVzdHMoKSB9CisgIGZuIGdldEJhY2tlbmRUeXBlKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMV9CYWNrZW5kVHlwZT4geyBzZWxmLjAuZ2V0QmFja2VuZFR5cGUoKSB9Cit9CitmbiBvbl90cmFuc2FjdChfYWlkbF9zZXJ2aWNlOiAmZHluIElUZXN0U2VydmljZSwgX2FpZGxfY29kZTogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlLCBfYWlkbF9kYXRhOiAmYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWw8J18+LCBfYWlkbF9yZXBseTogJm11dCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbDwnXz4pIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4gewogICBtYXRjaCBfYWlkbF9jb2RlIHsKICAgICB0cmFuc2FjdGlvbnM6OlVuaW1wbGVtZW50ZWRNZXRob2QgPT4gewogICAgICAgbGV0IF9hcmdfYXJnOiBpMzIgPSBfYWlkbF9kYXRhLnJlYWQoKT87CkBAIC0xNjQ4LDYgKzM2MTcsODEgQEAKICAgICAgIH0KICAgICAgIE9rKCgpKQogICAgIH0KKyAgICB0cmFuc2FjdGlvbnM6OkdldEludGVyZmFjZUFycmF5ID0+IHsKKyAgICAgIGxldCBfYXJnX25hbWVzOiBWZWM8U3RyaW5nPiA9IF9haWRsX2RhdGEucmVhZCgpPzsKKyAgICAgIGxldCBfYWlkbF9yZXR1cm4gPSBfYWlkbF9zZXJ2aWNlLkdldEludGVyZmFjZUFycmF5KCZfYXJnX25hbWVzKTsKKyAgICAgIG1hdGNoICZfYWlkbF9yZXR1cm4geworICAgICAgICBPayhfYWlkbF9yZXR1cm4pID0+IHsKKyAgICAgICAgICBfYWlkbF9yZXBseS53cml0ZSgmYmluZGVyOjpTdGF0dXM6OmZyb20oYmluZGVyOjpTdGF0dXNDb2RlOjpPSykpPzsKKyAgICAgICAgICBfYWlkbF9yZXBseS53cml0ZShfYWlkbF9yZXR1cm4pPzsKKyAgICAgICAgfQorICAgICAgICBFcnIoX2FpZGxfc3RhdHVzKSA9PiBfYWlkbF9yZXBseS53cml0ZShfYWlkbF9zdGF0dXMpPworICAgICAgfQorICAgICAgT2soKCkpCisgICAgfQorICAgIHRyYW5zYWN0aW9uczo6VmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlQXJyYXkgPT4geworICAgICAgbGV0IF9hcmdfc2VydmljZXM6IFZlYzxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+PiA9IF9haWRsX2RhdGEucmVhZCgpPzsKKyAgICAgIGxldCBfYXJnX25hbWVzOiBWZWM8U3RyaW5nPiA9IF9haWRsX2RhdGEucmVhZCgpPzsKKyAgICAgIGxldCBfYWlkbF9yZXR1cm4gPSBfYWlkbF9zZXJ2aWNlLlZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUFycmF5KCZfYXJnX3NlcnZpY2VzLCAmX2FyZ19uYW1lcyk7CisgICAgICBtYXRjaCAmX2FpZGxfcmV0dXJuIHsKKyAgICAgICAgT2soX2FpZGxfcmV0dXJuKSA9PiB7CisgICAgICAgICAgX2FpZGxfcmVwbHkud3JpdGUoJmJpbmRlcjo6U3RhdHVzOjpmcm9tKGJpbmRlcjo6U3RhdHVzQ29kZTo6T0spKT87CisgICAgICAgICAgX2FpZGxfcmVwbHkud3JpdGUoX2FpZGxfcmV0dXJuKT87CisgICAgICAgIH0KKyAgICAgICAgRXJyKF9haWRsX3N0YXR1cykgPT4gX2FpZGxfcmVwbHkud3JpdGUoX2FpZGxfc3RhdHVzKT8KKyAgICAgIH0KKyAgICAgIE9rKCgpKQorICAgIH0KKyAgICB0cmFuc2FjdGlvbnM6OkdldE51bGxhYmxlSW50ZXJmYWNlQXJyYXkgPT4geworICAgICAgbGV0IF9hcmdfbmFtZXM6IE9wdGlvbjxWZWM8T3B0aW9uPFN0cmluZz4+PiA9IF9haWRsX2RhdGEucmVhZCgpPzsKKyAgICAgIGxldCBfYWlkbF9yZXR1cm4gPSBfYWlkbF9zZXJ2aWNlLkdldE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoX2FyZ19uYW1lcy5hc19kZXJlZigpKTsKKyAgICAgIG1hdGNoICZfYWlkbF9yZXR1cm4geworICAgICAgICBPayhfYWlkbF9yZXR1cm4pID0+IHsKKyAgICAgICAgICBfYWlkbF9yZXBseS53cml0ZSgmYmluZGVyOjpTdGF0dXM6OmZyb20oYmluZGVyOjpTdGF0dXNDb2RlOjpPSykpPzsKKyAgICAgICAgICBfYWlkbF9yZXBseS53cml0ZShfYWlkbF9yZXR1cm4pPzsKKyAgICAgICAgfQorICAgICAgICBFcnIoX2FpZGxfc3RhdHVzKSA9PiBfYWlkbF9yZXBseS53cml0ZShfYWlkbF9zdGF0dXMpPworICAgICAgfQorICAgICAgT2soKCkpCisgICAgfQorICAgIHRyYW5zYWN0aW9uczo6VmVyaWZ5TmFtZXNXaXRoTnVsbGFibGVJbnRlcmZhY2VBcnJheSA9PiB7CisgICAgICBsZXQgX2FyZ19zZXJ2aWNlczogT3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPj4+PiA9IF9haWRsX2RhdGEucmVhZCgpPzsKKyAgICAgIGxldCBfYXJnX25hbWVzOiBPcHRpb248VmVjPE9wdGlvbjxTdHJpbmc+Pj4gPSBfYWlkbF9kYXRhLnJlYWQoKT87CisgICAgICBsZXQgX2FpZGxfcmV0dXJuID0gX2FpZGxfc2VydmljZS5WZXJpZnlOYW1lc1dpdGhOdWxsYWJsZUludGVyZmFjZUFycmF5KF9hcmdfc2VydmljZXMuYXNfZGVyZWYoKSwgX2FyZ19uYW1lcy5hc19kZXJlZigpKTsKKyAgICAgIG1hdGNoICZfYWlkbF9yZXR1cm4geworICAgICAgICBPayhfYWlkbF9yZXR1cm4pID0+IHsKKyAgICAgICAgICBfYWlkbF9yZXBseS53cml0ZSgmYmluZGVyOjpTdGF0dXM6OmZyb20oYmluZGVyOjpTdGF0dXNDb2RlOjpPSykpPzsKKyAgICAgICAgICBfYWlkbF9yZXBseS53cml0ZShfYWlkbF9yZXR1cm4pPzsKKyAgICAgICAgfQorICAgICAgICBFcnIoX2FpZGxfc3RhdHVzKSA9PiBfYWlkbF9yZXBseS53cml0ZShfYWlkbF9zdGF0dXMpPworICAgICAgfQorICAgICAgT2soKCkpCisgICAgfQorICAgIHRyYW5zYWN0aW9uczo6R2V0SW50ZXJmYWNlTGlzdCA9PiB7CisgICAgICBsZXQgX2FyZ19uYW1lczogT3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+ID0gX2FpZGxfZGF0YS5yZWFkKCk/OworICAgICAgbGV0IF9haWRsX3JldHVybiA9IF9haWRsX3NlcnZpY2UuR2V0SW50ZXJmYWNlTGlzdChfYXJnX25hbWVzLmFzX2RlcmVmKCkpOworICAgICAgbWF0Y2ggJl9haWRsX3JldHVybiB7CisgICAgICAgIE9rKF9haWRsX3JldHVybikgPT4geworICAgICAgICAgIF9haWRsX3JlcGx5LndyaXRlKCZiaW5kZXI6OlN0YXR1czo6ZnJvbShiaW5kZXI6OlN0YXR1c0NvZGU6Ok9LKSk/OworICAgICAgICAgIF9haWRsX3JlcGx5LndyaXRlKF9haWRsX3JldHVybik/OworICAgICAgICB9CisgICAgICAgIEVycihfYWlkbF9zdGF0dXMpID0+IF9haWRsX3JlcGx5LndyaXRlKF9haWRsX3N0YXR1cyk/CisgICAgICB9CisgICAgICBPaygoKSkKKyAgICB9CisgICAgdHJhbnNhY3Rpb25zOjpWZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VMaXN0ID0+IHsKKyAgICAgIGxldCBfYXJnX3NlcnZpY2VzOiBPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+Pj4+ID0gX2FpZGxfZGF0YS5yZWFkKCk/OworICAgICAgbGV0IF9hcmdfbmFtZXM6IE9wdGlvbjxWZWM8T3B0aW9uPFN0cmluZz4+PiA9IF9haWRsX2RhdGEucmVhZCgpPzsKKyAgICAgIGxldCBfYWlkbF9yZXR1cm4gPSBfYWlkbF9zZXJ2aWNlLlZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUxpc3QoX2FyZ19zZXJ2aWNlcy5hc19kZXJlZigpLCBfYXJnX25hbWVzLmFzX2RlcmVmKCkpOworICAgICAgbWF0Y2ggJl9haWRsX3JldHVybiB7CisgICAgICAgIE9rKF9haWRsX3JldHVybikgPT4geworICAgICAgICAgIF9haWRsX3JlcGx5LndyaXRlKCZiaW5kZXI6OlN0YXR1czo6ZnJvbShiaW5kZXI6OlN0YXR1c0NvZGU6Ok9LKSk/OworICAgICAgICAgIF9haWRsX3JlcGx5LndyaXRlKF9haWRsX3JldHVybik/OworICAgICAgICB9CisgICAgICAgIEVycihfYWlkbF9zdGF0dXMpID0+IF9haWRsX3JlcGx5LndyaXRlKF9haWRsX3N0YXR1cyk/CisgICAgICB9CisgICAgICBPaygoKSkKKyAgICB9CiAgICAgdHJhbnNhY3Rpb25zOjpSZXZlcnNlU3RyaW5nTGlzdCA9PiB7CiAgICAgICBsZXQgX2FyZ19pbnB1dDogVmVjPFN0cmluZz4gPSBfYWlkbF9kYXRhLnJlYWQoKT87CiAgICAgICBsZXQgbXV0IF9hcmdfcmVwZWF0ZWQ6IFZlYzxTdHJpbmc+ID0gRGVmYXVsdDo6ZGVmYXVsdCgpOwpAQCAtMTY2Myw3ICszNzA3LDcgQEAKICAgICAgIE9rKCgpKQogICAgIH0KICAgICB0cmFuc2FjdGlvbnM6OlJlcGVhdFBhcmNlbEZpbGVEZXNjcmlwdG9yID0+IHsKLSAgICAgIGxldCBfYXJnX3JlYWQ6IGJpbmRlcjo6cGFyY2VsOjpQYXJjZWxGaWxlRGVzY3JpcHRvciA9IF9haWRsX2RhdGEucmVhZCgpPzsKKyAgICAgIGxldCBfYXJnX3JlYWQ6IGJpbmRlcjo6UGFyY2VsRmlsZURlc2NyaXB0b3IgPSBfYWlkbF9kYXRhLnJlYWQoKT87CiAgICAgICBsZXQgX2FpZGxfcmV0dXJuID0gX2FpZGxfc2VydmljZS5SZXBlYXRQYXJjZWxGaWxlRGVzY3JpcHRvcigmX2FyZ19yZWFkKTsKICAgICAgIG1hdGNoICZfYWlkbF9yZXR1cm4gewogICAgICAgICBPayhfYWlkbF9yZXR1cm4pID0+IHsKQEAgLTE2NzUsOCArMzcxOSw4IEBACiAgICAgICBPaygoKSkKICAgICB9CiAgICAgdHJhbnNhY3Rpb25zOjpSZXZlcnNlUGFyY2VsRmlsZURlc2NyaXB0b3JBcnJheSA9PiB7Ci0gICAgICBsZXQgX2FyZ19pbnB1dDogVmVjPGJpbmRlcjo6cGFyY2VsOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj4gPSBfYWlkbF9kYXRhLnJlYWQoKT87Ci0gICAgICBsZXQgbXV0IF9hcmdfcmVwZWF0ZWQ6IFZlYzxPcHRpb248YmluZGVyOjpwYXJjZWw6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPj4gPSBEZWZhdWx0OjpkZWZhdWx0KCk7CisgICAgICBsZXQgX2FyZ19pbnB1dDogVmVjPGJpbmRlcjo6UGFyY2VsRmlsZURlc2NyaXB0b3I+ID0gX2FpZGxfZGF0YS5yZWFkKCk/OworICAgICAgbGV0IG11dCBfYXJnX3JlcGVhdGVkOiBWZWM8T3B0aW9uPGJpbmRlcjo6UGFyY2VsRmlsZURlc2NyaXB0b3I+PiA9IERlZmF1bHQ6OmRlZmF1bHQoKTsKICAgICAgIF9haWRsX2RhdGEucmVzaXplX291dF92ZWMoJm11dCBfYXJnX3JlcGVhdGVkKT87CiAgICAgICBsZXQgX2FpZGxfcmV0dXJuID0gX2FpZGxfc2VydmljZS5SZXZlcnNlUGFyY2VsRmlsZURlc2NyaXB0b3JBcnJheSgmX2FyZ19pbnB1dCwgJm11dCBfYXJnX3JlcGVhdGVkKTsKICAgICAgIG1hdGNoICZfYWlkbF9yZXR1cm4gewpAQCAtMTc3NCw3ICszODE4LDcgQEAKICAgICAgIE9rKCgpKQogICAgIH0KICAgICB0cmFuc2FjdGlvbnM6OlJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZSA9PiB7Ci0gICAgICBsZXQgX2FyZ19pbnB1dDogT3B0aW9uPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzIwX1N0cnVjdHVyZWRQYXJjZWxhYmxlPiA9IF9haWRsX2RhdGEucmVhZCgpPzsKKyAgICAgIGxldCBfYXJnX2lucHV0OiBPcHRpb248Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTJfSVRlc3RTZXJ2aWNlXzVfRW1wdHk+ID0gX2FpZGxfZGF0YS5yZWFkKCk/OwogICAgICAgbGV0IF9haWRsX3JldHVybiA9IF9haWRsX3NlcnZpY2UuUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlKF9hcmdfaW5wdXQuYXNfcmVmKCkpOwogICAgICAgbWF0Y2ggJl9haWRsX3JldHVybiB7CiAgICAgICAgIE9rKF9haWRsX3JldHVybikgPT4gewpAQCAtMTc4NSw2ICszODI5LDMwIEBACiAgICAgICB9CiAgICAgICBPaygoKSkKICAgICB9CisgICAgdHJhbnNhY3Rpb25zOjpSZXBlYXROdWxsYWJsZVBhcmNlbGFibGVBcnJheSA9PiB7CisgICAgICBsZXQgX2FyZ19pbnB1dDogT3B0aW9uPFZlYzxPcHRpb248Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTJfSVRlc3RTZXJ2aWNlXzVfRW1wdHk+Pj4gPSBfYWlkbF9kYXRhLnJlYWQoKT87CisgICAgICBsZXQgX2FpZGxfcmV0dXJuID0gX2FpZGxfc2VydmljZS5SZXBlYXROdWxsYWJsZVBhcmNlbGFibGVBcnJheShfYXJnX2lucHV0LmFzX2RlcmVmKCkpOworICAgICAgbWF0Y2ggJl9haWRsX3JldHVybiB7CisgICAgICAgIE9rKF9haWRsX3JldHVybikgPT4geworICAgICAgICAgIF9haWRsX3JlcGx5LndyaXRlKCZiaW5kZXI6OlN0YXR1czo6ZnJvbShiaW5kZXI6OlN0YXR1c0NvZGU6Ok9LKSk/OworICAgICAgICAgIF9haWRsX3JlcGx5LndyaXRlKF9haWRsX3JldHVybik/OworICAgICAgICB9CisgICAgICAgIEVycihfYWlkbF9zdGF0dXMpID0+IF9haWRsX3JlcGx5LndyaXRlKF9haWRsX3N0YXR1cyk/CisgICAgICB9CisgICAgICBPaygoKSkKKyAgICB9CisgICAgdHJhbnNhY3Rpb25zOjpSZXBlYXROdWxsYWJsZVBhcmNlbGFibGVMaXN0ID0+IHsKKyAgICAgIGxldCBfYXJnX2lucHV0OiBPcHRpb248VmVjPE9wdGlvbjxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMl9JVGVzdFNlcnZpY2VfNV9FbXB0eT4+PiA9IF9haWRsX2RhdGEucmVhZCgpPzsKKyAgICAgIGxldCBfYWlkbF9yZXR1cm4gPSBfYWlkbF9zZXJ2aWNlLlJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUxpc3QoX2FyZ19pbnB1dC5hc19kZXJlZigpKTsKKyAgICAgIG1hdGNoICZfYWlkbF9yZXR1cm4geworICAgICAgICBPayhfYWlkbF9yZXR1cm4pID0+IHsKKyAgICAgICAgICBfYWlkbF9yZXBseS53cml0ZSgmYmluZGVyOjpTdGF0dXM6OmZyb20oYmluZGVyOjpTdGF0dXNDb2RlOjpPSykpPzsKKyAgICAgICAgICBfYWlkbF9yZXBseS53cml0ZShfYWlkbF9yZXR1cm4pPzsKKyAgICAgICAgfQorICAgICAgICBFcnIoX2FpZGxfc3RhdHVzKSA9PiBfYWlkbF9yZXBseS53cml0ZShfYWlkbF9zdGF0dXMpPworICAgICAgfQorICAgICAgT2soKCkpCisgICAgfQogICAgIHRyYW5zYWN0aW9uczo6VGFrZXNBbklCaW5kZXIgPT4gewogICAgICAgbGV0IF9hcmdfaW5wdXQ6IGJpbmRlcjo6U3BJQmluZGVyID0gX2FpZGxfZGF0YS5yZWFkKCk/OwogICAgICAgbGV0IF9haWRsX3JldHVybiA9IF9haWRsX3NlcnZpY2UuVGFrZXNBbklCaW5kZXIoJl9hcmdfaW5wdXQpOwpAQCAtMTgwNyw2ICszODc1LDI4IEBACiAgICAgICB9CiAgICAgICBPaygoKSkKICAgICB9CisgICAgdHJhbnNhY3Rpb25zOjpUYWtlc0FuSUJpbmRlckxpc3QgPT4geworICAgICAgbGV0IF9hcmdfaW5wdXQ6IFZlYzxiaW5kZXI6OlNwSUJpbmRlcj4gPSBfYWlkbF9kYXRhLnJlYWQoKT87CisgICAgICBsZXQgX2FpZGxfcmV0dXJuID0gX2FpZGxfc2VydmljZS5UYWtlc0FuSUJpbmRlckxpc3QoJl9hcmdfaW5wdXQpOworICAgICAgbWF0Y2ggJl9haWRsX3JldHVybiB7CisgICAgICAgIE9rKF9haWRsX3JldHVybikgPT4geworICAgICAgICAgIF9haWRsX3JlcGx5LndyaXRlKCZiaW5kZXI6OlN0YXR1czo6ZnJvbShiaW5kZXI6OlN0YXR1c0NvZGU6Ok9LKSk/OworICAgICAgICB9CisgICAgICAgIEVycihfYWlkbF9zdGF0dXMpID0+IF9haWRsX3JlcGx5LndyaXRlKF9haWRsX3N0YXR1cyk/CisgICAgICB9CisgICAgICBPaygoKSkKKyAgICB9CisgICAgdHJhbnNhY3Rpb25zOjpUYWtlc0FOdWxsYWJsZUlCaW5kZXJMaXN0ID0+IHsKKyAgICAgIGxldCBfYXJnX2lucHV0OiBPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj4+PiA9IF9haWRsX2RhdGEucmVhZCgpPzsKKyAgICAgIGxldCBfYWlkbF9yZXR1cm4gPSBfYWlkbF9zZXJ2aWNlLlRha2VzQU51bGxhYmxlSUJpbmRlckxpc3QoX2FyZ19pbnB1dC5hc19kZXJlZigpKTsKKyAgICAgIG1hdGNoICZfYWlkbF9yZXR1cm4geworICAgICAgICBPayhfYWlkbF9yZXR1cm4pID0+IHsKKyAgICAgICAgICBfYWlkbF9yZXBseS53cml0ZSgmYmluZGVyOjpTdGF0dXM6OmZyb20oYmluZGVyOjpTdGF0dXNDb2RlOjpPSykpPzsKKyAgICAgICAgfQorICAgICAgICBFcnIoX2FpZGxfc3RhdHVzKSA9PiBfYWlkbF9yZXBseS53cml0ZShfYWlkbF9zdGF0dXMpPworICAgICAgfQorICAgICAgT2soKCkpCisgICAgfQogICAgIHRyYW5zYWN0aW9uczo6UmVwZWF0VXRmOENwcFN0cmluZyA9PiB7CiAgICAgICBsZXQgX2FyZ190b2tlbjogU3RyaW5nID0gX2FpZGxfZGF0YS5yZWFkKCk/OwogICAgICAgbGV0IF9haWRsX3JldHVybiA9IF9haWRsX3NlcnZpY2UuUmVwZWF0VXRmOENwcFN0cmluZygmX2FyZ190b2tlbik7CkBAIC0xODk5LDYgKzM5ODksNjEgQEAKICAgICAgIH0KICAgICAgIE9rKCgpKQogICAgIH0KKyAgICB0cmFuc2FjdGlvbnM6OlJlcGVhdEV4dGVuZGFibGVQYXJjZWxhYmxlID0+IHsKKyAgICAgIGxldCBfYXJnX2VwOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c185X2V4dGVuc2lvbl8yMF9FeHRlbmRhYmxlUGFyY2VsYWJsZSA9IF9haWRsX2RhdGEucmVhZCgpPzsKKyAgICAgIGxldCBtdXQgX2FyZ19lcDI6IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzlfZXh0ZW5zaW9uXzIwX0V4dGVuZGFibGVQYXJjZWxhYmxlID0gRGVmYXVsdDo6ZGVmYXVsdCgpOworICAgICAgbGV0IF9haWRsX3JldHVybiA9IF9haWRsX3NlcnZpY2UuUmVwZWF0RXh0ZW5kYWJsZVBhcmNlbGFibGUoJl9hcmdfZXAsICZtdXQgX2FyZ19lcDIpOworICAgICAgbWF0Y2ggJl9haWRsX3JldHVybiB7CisgICAgICAgIE9rKF9haWRsX3JldHVybikgPT4geworICAgICAgICAgIF9haWRsX3JlcGx5LndyaXRlKCZiaW5kZXI6OlN0YXR1czo6ZnJvbShiaW5kZXI6OlN0YXR1c0NvZGU6Ok9LKSk/OworICAgICAgICAgIF9haWRsX3JlcGx5LndyaXRlKCZfYXJnX2VwMik/OworICAgICAgICB9CisgICAgICAgIEVycihfYWlkbF9zdGF0dXMpID0+IF9haWRsX3JlcGx5LndyaXRlKF9haWRsX3N0YXR1cyk/CisgICAgICB9CisgICAgICBPaygoKSkKKyAgICB9CisgICAgdHJhbnNhY3Rpb25zOjpSZXZlcnNlTGlzdCA9PiB7CisgICAgICBsZXQgX2FyZ19saXN0OiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xM19SZWN1cnNpdmVMaXN0ID0gX2FpZGxfZGF0YS5yZWFkKCk/OworICAgICAgbGV0IF9haWRsX3JldHVybiA9IF9haWRsX3NlcnZpY2UuUmV2ZXJzZUxpc3QoJl9hcmdfbGlzdCk7CisgICAgICBtYXRjaCAmX2FpZGxfcmV0dXJuIHsKKyAgICAgICAgT2soX2FpZGxfcmV0dXJuKSA9PiB7CisgICAgICAgICAgX2FpZGxfcmVwbHkud3JpdGUoJmJpbmRlcjo6U3RhdHVzOjpmcm9tKGJpbmRlcjo6U3RhdHVzQ29kZTo6T0spKT87CisgICAgICAgICAgX2FpZGxfcmVwbHkud3JpdGUoX2FpZGxfcmV0dXJuKT87CisgICAgICAgIH0KKyAgICAgICAgRXJyKF9haWRsX3N0YXR1cykgPT4gX2FpZGxfcmVwbHkud3JpdGUoX2FpZGxfc3RhdHVzKT8KKyAgICAgIH0KKyAgICAgIE9rKCgpKQorICAgIH0KKyAgICB0cmFuc2FjdGlvbnM6OlJldmVyc2VJQmluZGVyQXJyYXkgPT4geworICAgICAgbGV0IF9hcmdfaW5wdXQ6IFZlYzxiaW5kZXI6OlNwSUJpbmRlcj4gPSBfYWlkbF9kYXRhLnJlYWQoKT87CisgICAgICBsZXQgbXV0IF9hcmdfcmVwZWF0ZWQ6IFZlYzxPcHRpb248YmluZGVyOjpTcElCaW5kZXI+PiA9IERlZmF1bHQ6OmRlZmF1bHQoKTsKKyAgICAgIF9haWRsX2RhdGEucmVzaXplX291dF92ZWMoJm11dCBfYXJnX3JlcGVhdGVkKT87CisgICAgICBsZXQgX2FpZGxfcmV0dXJuID0gX2FpZGxfc2VydmljZS5SZXZlcnNlSUJpbmRlckFycmF5KCZfYXJnX2lucHV0LCAmbXV0IF9hcmdfcmVwZWF0ZWQpOworICAgICAgbWF0Y2ggJl9haWRsX3JldHVybiB7CisgICAgICAgIE9rKF9haWRsX3JldHVybikgPT4geworICAgICAgICAgIF9haWRsX3JlcGx5LndyaXRlKCZiaW5kZXI6OlN0YXR1czo6ZnJvbShiaW5kZXI6OlN0YXR1c0NvZGU6Ok9LKSk/OworICAgICAgICAgIF9haWRsX3JlcGx5LndyaXRlKF9haWRsX3JldHVybik/OworICAgICAgICAgIF9haWRsX3JlcGx5LndyaXRlKCZfYXJnX3JlcGVhdGVkKT87CisgICAgICAgIH0KKyAgICAgICAgRXJyKF9haWRsX3N0YXR1cykgPT4gX2FpZGxfcmVwbHkud3JpdGUoX2FpZGxfc3RhdHVzKT8KKyAgICAgIH0KKyAgICAgIE9rKCgpKQorICAgIH0KKyAgICB0cmFuc2FjdGlvbnM6OlJldmVyc2VOdWxsYWJsZUlCaW5kZXJBcnJheSA9PiB7CisgICAgICBsZXQgX2FyZ19pbnB1dDogT3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTcElCaW5kZXI+Pj4gPSBfYWlkbF9kYXRhLnJlYWQoKT87CisgICAgICBsZXQgbXV0IF9hcmdfcmVwZWF0ZWQ6IE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3BJQmluZGVyPj4+ID0gRGVmYXVsdDo6ZGVmYXVsdCgpOworICAgICAgX2FpZGxfZGF0YS5yZXNpemVfbnVsbGFibGVfb3V0X3ZlYygmbXV0IF9hcmdfcmVwZWF0ZWQpPzsKKyAgICAgIGxldCBfYWlkbF9yZXR1cm4gPSBfYWlkbF9zZXJ2aWNlLlJldmVyc2VOdWxsYWJsZUlCaW5kZXJBcnJheShfYXJnX2lucHV0LmFzX2RlcmVmKCksICZtdXQgX2FyZ19yZXBlYXRlZCk7CisgICAgICBtYXRjaCAmX2FpZGxfcmV0dXJuIHsKKyAgICAgICAgT2soX2FpZGxfcmV0dXJuKSA9PiB7CisgICAgICAgICAgX2FpZGxfcmVwbHkud3JpdGUoJmJpbmRlcjo6U3RhdHVzOjpmcm9tKGJpbmRlcjo6U3RhdHVzQ29kZTo6T0spKT87CisgICAgICAgICAgX2FpZGxfcmVwbHkud3JpdGUoX2FpZGxfcmV0dXJuKT87CisgICAgICAgICAgX2FpZGxfcmVwbHkud3JpdGUoJl9hcmdfcmVwZWF0ZWQpPzsKKyAgICAgICAgfQorICAgICAgICBFcnIoX2FpZGxfc3RhdHVzKSA9PiBfYWlkbF9yZXBseS53cml0ZShfYWlkbF9zdGF0dXMpPworICAgICAgfQorICAgICAgT2soKCkpCisgICAgfQogICAgIHRyYW5zYWN0aW9uczo6R2V0T2xkTmFtZUludGVyZmFjZSA9PiB7CiAgICAgICBsZXQgX2FpZGxfcmV0dXJuID0gX2FpZGxfc2VydmljZS5HZXRPbGROYW1lSW50ZXJmYWNlKCk7CiAgICAgICBtYXRjaCAmX2FpZGxfcmV0dXJuIHsKQEAgLTE5MjEsNiArNDA2NiwxOCBAQAogICAgICAgfQogICAgICAgT2soKCkpCiAgICAgfQorICAgIHRyYW5zYWN0aW9uczo6R2V0VW5pb25UYWdzID0+IHsKKyAgICAgIGxldCBfYXJnX2lucHV0OiBWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNV9Vbmlvbj4gPSBfYWlkbF9kYXRhLnJlYWQoKT87CisgICAgICBsZXQgX2FpZGxfcmV0dXJuID0gX2FpZGxfc2VydmljZS5HZXRVbmlvblRhZ3MoJl9hcmdfaW5wdXQpOworICAgICAgbWF0Y2ggJl9haWRsX3JldHVybiB7CisgICAgICAgIE9rKF9haWRsX3JldHVybikgPT4geworICAgICAgICAgIF9haWRsX3JlcGx5LndyaXRlKCZiaW5kZXI6OlN0YXR1czo6ZnJvbShiaW5kZXI6OlN0YXR1c0NvZGU6Ok9LKSk/OworICAgICAgICAgIF9haWRsX3JlcGx5LndyaXRlKF9haWRsX3JldHVybik/OworICAgICAgICB9CisgICAgICAgIEVycihfYWlkbF9zdGF0dXMpID0+IF9haWRsX3JlcGx5LndyaXRlKF9haWRsX3N0YXR1cyk/CisgICAgICB9CisgICAgICBPaygoKSkKKyAgICB9CiAgICAgdHJhbnNhY3Rpb25zOjpHZXRDcHBKYXZhVGVzdHMgPT4gewogICAgICAgbGV0IF9haWRsX3JldHVybiA9IF9haWRsX3NlcnZpY2UuR2V0Q3BwSmF2YVRlc3RzKCk7CiAgICAgICBtYXRjaCAmX2FpZGxfcmV0dXJuIHsKQEAgLTE5NDYsMyArNDEwMywxNzQgQEAKICAgICBfID0+IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pCiAgIH0KIH0KK3B1YiBtb2QgRW1wdHkgeworICAjW2Rlcml2ZShEZWJ1ZywgQ2xvbmUsIFBhcnRpYWxFcSldCisgIHB1YiBzdHJ1Y3QgRW1wdHkgeworICB9CisgIGltcGwgRGVmYXVsdCBmb3IgRW1wdHkgeworICAgIGZuIGRlZmF1bHQoKSAtPiBTZWxmIHsKKyAgICAgIFNlbGYgeworICAgICAgfQorICAgIH0KKyAgfQorICBpbXBsIGJpbmRlcjo6UGFyY2VsYWJsZSBmb3IgRW1wdHkgeworICAgIGZuIHdyaXRlX3RvX3BhcmNlbCgmc2VsZiwgcGFyY2VsOiAmbXV0IGJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsKSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsKKyAgICAgIHBhcmNlbC5zaXplZF93cml0ZSh8c3VicGFyY2VsfCB7CisgICAgICAgIE9rKCgpKQorICAgICAgfSkKKyAgICB9CisgICAgZm4gcmVhZF9mcm9tX3BhcmNlbCgmbXV0IHNlbGYsIHBhcmNlbDogJmJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsKSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsKKyAgICAgIHBhcmNlbC5zaXplZF9yZWFkKHxzdWJwYXJjZWx8IHsKKyAgICAgICAgT2soKCkpCisgICAgICB9KQorICAgIH0KKyAgfQorICBiaW5kZXI6OmltcGxfc2VyaWFsaXplX2Zvcl9wYXJjZWxhYmxlIShFbXB0eSk7CisgIGJpbmRlcjo6aW1wbF9kZXNlcmlhbGl6ZV9mb3JfcGFyY2VsYWJsZSEoRW1wdHkpOworICBpbXBsIGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbGFibGVNZXRhZGF0YSBmb3IgRW1wdHkgeworICAgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHsgImFuZHJvaWQuYWlkbC50ZXN0cy5JVGVzdFNlcnZpY2UuRW1wdHkiIH0KKyAgfQorfQorcHViIG1vZCBDb21waWxlckNoZWNrcyB7CisgICNbZGVyaXZlKERlYnVnKV0KKyAgcHViIHN0cnVjdCBDb21waWxlckNoZWNrcyB7CisgICAgcHViIGJpbmRlcjogT3B0aW9uPGJpbmRlcjo6U3BJQmluZGVyPiwKKyAgICBwdWIgbnVsbGFibGVfYmluZGVyOiBPcHRpb248YmluZGVyOjpTcElCaW5kZXI+LAorICAgIHB1YiBiaW5kZXJfYXJyYXk6IFZlYzxiaW5kZXI6OlNwSUJpbmRlcj4sCisgICAgcHViIG51bGxhYmxlX2JpbmRlcl9hcnJheTogT3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTcElCaW5kZXI+Pj4sCisgICAgcHViIGJpbmRlcl9saXN0OiBWZWM8YmluZGVyOjpTcElCaW5kZXI+LAorICAgIHB1YiBudWxsYWJsZV9iaW5kZXJfbGlzdDogT3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTcElCaW5kZXI+Pj4sCisgICAgcHViIHBmZDogT3B0aW9uPGJpbmRlcjo6UGFyY2VsRmlsZURlc2NyaXB0b3I+LAorICAgIHB1YiBudWxsYWJsZV9wZmQ6IE9wdGlvbjxiaW5kZXI6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPiwKKyAgICBwdWIgcGZkX2FycmF5OiBWZWM8YmluZGVyOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj4sCisgICAgcHViIG51bGxhYmxlX3BmZF9hcnJheTogT3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj4+PiwKKyAgICBwdWIgcGZkX2xpc3Q6IFZlYzxiaW5kZXI6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPiwKKyAgICBwdWIgbnVsbGFibGVfcGZkX2xpc3Q6IE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6UGFyY2VsRmlsZURlc2NyaXB0b3I+Pj4sCisgICAgcHViIHBhcmNlbDogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTJfSVRlc3RTZXJ2aWNlXzVfRW1wdHksCisgICAgcHViIG51bGxhYmxlX3BhcmNlbDogT3B0aW9uPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZV81X0VtcHR5PiwKKyAgICBwdWIgcGFyY2VsX2FycmF5OiBWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTJfSVRlc3RTZXJ2aWNlXzVfRW1wdHk+LAorICAgIHB1YiBudWxsYWJsZV9wYXJjZWxfYXJyYXk6IE9wdGlvbjxWZWM8T3B0aW9uPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZV81X0VtcHR5Pj4+LAorICAgIHB1YiBwYXJjZWxfbGlzdDogVmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZV81X0VtcHR5PiwKKyAgICBwdWIgbnVsbGFibGVfcGFyY2VsX2xpc3Q6IE9wdGlvbjxWZWM8T3B0aW9uPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZV81X0VtcHR5Pj4+LAorICB9CisgIGltcGwgRGVmYXVsdCBmb3IgQ29tcGlsZXJDaGVja3MgeworICAgIGZuIGRlZmF1bHQoKSAtPiBTZWxmIHsKKyAgICAgIFNlbGYgeworICAgICAgICBiaW5kZXI6IERlZmF1bHQ6OmRlZmF1bHQoKSwKKyAgICAgICAgbnVsbGFibGVfYmluZGVyOiBEZWZhdWx0OjpkZWZhdWx0KCksCisgICAgICAgIGJpbmRlcl9hcnJheTogRGVmYXVsdDo6ZGVmYXVsdCgpLAorICAgICAgICBudWxsYWJsZV9iaW5kZXJfYXJyYXk6IERlZmF1bHQ6OmRlZmF1bHQoKSwKKyAgICAgICAgYmluZGVyX2xpc3Q6IERlZmF1bHQ6OmRlZmF1bHQoKSwKKyAgICAgICAgbnVsbGFibGVfYmluZGVyX2xpc3Q6IERlZmF1bHQ6OmRlZmF1bHQoKSwKKyAgICAgICAgcGZkOiBEZWZhdWx0OjpkZWZhdWx0KCksCisgICAgICAgIG51bGxhYmxlX3BmZDogRGVmYXVsdDo6ZGVmYXVsdCgpLAorICAgICAgICBwZmRfYXJyYXk6IERlZmF1bHQ6OmRlZmF1bHQoKSwKKyAgICAgICAgbnVsbGFibGVfcGZkX2FycmF5OiBEZWZhdWx0OjpkZWZhdWx0KCksCisgICAgICAgIHBmZF9saXN0OiBEZWZhdWx0OjpkZWZhdWx0KCksCisgICAgICAgIG51bGxhYmxlX3BmZF9saXN0OiBEZWZhdWx0OjpkZWZhdWx0KCksCisgICAgICAgIHBhcmNlbDogRGVmYXVsdDo6ZGVmYXVsdCgpLAorICAgICAgICBudWxsYWJsZV9wYXJjZWw6IERlZmF1bHQ6OmRlZmF1bHQoKSwKKyAgICAgICAgcGFyY2VsX2FycmF5OiBEZWZhdWx0OjpkZWZhdWx0KCksCisgICAgICAgIG51bGxhYmxlX3BhcmNlbF9hcnJheTogRGVmYXVsdDo6ZGVmYXVsdCgpLAorICAgICAgICBwYXJjZWxfbGlzdDogRGVmYXVsdDo6ZGVmYXVsdCgpLAorICAgICAgICBudWxsYWJsZV9wYXJjZWxfbGlzdDogRGVmYXVsdDo6ZGVmYXVsdCgpLAorICAgICAgfQorICAgIH0KKyAgfQorICBpbXBsIGJpbmRlcjo6UGFyY2VsYWJsZSBmb3IgQ29tcGlsZXJDaGVja3MgeworICAgIGZuIHdyaXRlX3RvX3BhcmNlbCgmc2VsZiwgcGFyY2VsOiAmbXV0IGJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsKSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsKKyAgICAgIHBhcmNlbC5zaXplZF93cml0ZSh8c3VicGFyY2VsfCB7CisgICAgICAgIGxldCBfX2ZpZWxkX3JlZiA9IHNlbGYuYmluZGVyLmFzX3JlZigpLm9rX29yKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5FWFBFQ1RFRF9OVUxMKT87CisgICAgICAgIHN1YnBhcmNlbC53cml0ZShfX2ZpZWxkX3JlZik/OworICAgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYubnVsbGFibGVfYmluZGVyKT87CisgICAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5iaW5kZXJfYXJyYXkpPzsKKyAgICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLm51bGxhYmxlX2JpbmRlcl9hcnJheSk/OworICAgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuYmluZGVyX2xpc3QpPzsKKyAgICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLm51bGxhYmxlX2JpbmRlcl9saXN0KT87CisgICAgICAgIGxldCBfX2ZpZWxkX3JlZiA9IHNlbGYucGZkLmFzX3JlZigpLm9rX29yKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5FWFBFQ1RFRF9OVUxMKT87CisgICAgICAgIHN1YnBhcmNlbC53cml0ZShfX2ZpZWxkX3JlZik/OworICAgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYubnVsbGFibGVfcGZkKT87CisgICAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5wZmRfYXJyYXkpPzsKKyAgICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLm51bGxhYmxlX3BmZF9hcnJheSk/OworICAgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYucGZkX2xpc3QpPzsKKyAgICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLm51bGxhYmxlX3BmZF9saXN0KT87CisgICAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5wYXJjZWwpPzsKKyAgICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLm51bGxhYmxlX3BhcmNlbCk/OworICAgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYucGFyY2VsX2FycmF5KT87CisgICAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5udWxsYWJsZV9wYXJjZWxfYXJyYXkpPzsKKyAgICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLnBhcmNlbF9saXN0KT87CisgICAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5udWxsYWJsZV9wYXJjZWxfbGlzdCk/OworICAgICAgICBPaygoKSkKKyAgICAgIH0pCisgICAgfQorICAgIGZuIHJlYWRfZnJvbV9wYXJjZWwoJm11dCBzZWxmLCBwYXJjZWw6ICZiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbCkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CisgICAgICBwYXJjZWwuc2l6ZWRfcmVhZCh8c3VicGFyY2VsfCB7CisgICAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICAgIHNlbGYuYmluZGVyID0gU29tZShzdWJwYXJjZWwucmVhZCgpPyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgICAgc2VsZi5udWxsYWJsZV9iaW5kZXIgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgICAgfQorICAgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgICBzZWxmLmJpbmRlcl9hcnJheSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgICB9CisgICAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICAgIHNlbGYubnVsbGFibGVfYmluZGVyX2FycmF5ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICAgIH0KKyAgICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgICAgc2VsZi5iaW5kZXJfbGlzdCA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgICB9CisgICAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICAgIHNlbGYubnVsbGFibGVfYmluZGVyX2xpc3QgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgICAgfQorICAgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgICBzZWxmLnBmZCA9IFNvbWUoc3VicGFyY2VsLnJlYWQoKT8pOworICAgICAgICB9CisgICAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICAgIHNlbGYubnVsbGFibGVfcGZkID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICAgIH0KKyAgICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgICAgc2VsZi5wZmRfYXJyYXkgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgICAgfQorICAgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgICBzZWxmLm51bGxhYmxlX3BmZF9hcnJheSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgICB9CisgICAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICAgIHNlbGYucGZkX2xpc3QgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgICAgfQorICAgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgICBzZWxmLm51bGxhYmxlX3BmZF9saXN0ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICAgIH0KKyAgICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgICAgc2VsZi5wYXJjZWwgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgICAgfQorICAgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgICBzZWxmLm51bGxhYmxlX3BhcmNlbCA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgICB9CisgICAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICAgIHNlbGYucGFyY2VsX2FycmF5ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICAgIH0KKyAgICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgICAgc2VsZi5udWxsYWJsZV9wYXJjZWxfYXJyYXkgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgICAgfQorICAgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgICBzZWxmLnBhcmNlbF9saXN0ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICAgIH0KKyAgICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgICAgc2VsZi5udWxsYWJsZV9wYXJjZWxfbGlzdCA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgICB9CisgICAgICAgIE9rKCgpKQorICAgICAgfSkKKyAgICB9CisgIH0KKyAgYmluZGVyOjppbXBsX3NlcmlhbGl6ZV9mb3JfcGFyY2VsYWJsZSEoQ29tcGlsZXJDaGVja3MpOworICBiaW5kZXI6OmltcGxfZGVzZXJpYWxpemVfZm9yX3BhcmNlbGFibGUhKENvbXBpbGVyQ2hlY2tzKTsKKyAgaW1wbCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWxhYmxlTWV0YWRhdGEgZm9yIENvbXBpbGVyQ2hlY2tzIHsKKyAgICBmbiBnZXRfZGVzY3JpcHRvcigpIC0+ICYnc3RhdGljIHN0ciB7ICJhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlLkNvbXBpbGVyQ2hlY2tzIiB9CisgIH0KK30KK3B1YihjcmF0ZSkgbW9kIG1hbmdsZWQgeworIHB1YiB1c2Ugc3VwZXI6OklUZXN0U2VydmljZSBhcyBfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZTsKKyBwdWIgdXNlIHN1cGVyOjpFbXB0eTo6RW1wdHkgYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMl9JVGVzdFNlcnZpY2VfNV9FbXB0eTsKKyBwdWIgdXNlIHN1cGVyOjpDb21waWxlckNoZWNrczo6Q29tcGlsZXJDaGVja3MgYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMl9JVGVzdFNlcnZpY2VfMTRfQ29tcGlsZXJDaGVja3M7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JVGVzdFNlcnZpY2UucnMuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lUZXN0U2VydmljZS5ycy5kCmluZGV4IDU3M2UzOTkuLjk3ODZkYzEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lUZXN0U2VydmljZS5ycy5kCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lUZXN0U2VydmljZS5ycy5kCkBAIC03LDQgKzcsOCBAQAogICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvSU9sZE5hbWUuYWlkbCBcCiAgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9JbnRFbnVtLmFpZGwgXAogICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvTG9uZ0VudW0uYWlkbCBcCi0gIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5haWRsCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9SZWN1cnNpdmVMaXN0LmFpZGwgXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvU3RydWN0dXJlZFBhcmNlbGFibGUuYWlkbCBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9Vbmlvbi5haWRsIFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9FeHRlbmRhYmxlUGFyY2VsYWJsZS5haWRsIFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0NvbnN0YW50RXhwcmVzc2lvbkVudW0uYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSW50RW51bS5ycyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0ludEVudW0ucnMKaW5kZXggZmY5YzZhOS4uNzBlNzFkZCAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSW50RW51bS5ycworKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JbnRFbnVtLnJzCkBAIC0xLDggKzEsMTYgQEAKKyMhW2ZvcmJpZCh1bnNhZmVfY29kZSldCisjIVtydXN0Zm10Ojpza2lwXQogIyFbYWxsb3cobm9uX3VwcGVyX2Nhc2VfZ2xvYmFscyldCiB1c2UgYmluZGVyOjpkZWNsYXJlX2JpbmRlcl9lbnVtOwotZGVjbGFyZV9iaW5kZXJfZW51bSEgeyBJbnRFbnVtIDogaTMyIHsKLSAgRk9PID0gMTAwMCwKLSAgQkFSID0gMjAwMCwKLSAgQkFaID0gMjAwMSwKLX0gfQotcHViKGNyYXRlKSBtb2QgbWFuZ2xlZCB7IHB1YiB1c2Ugc3VwZXI6OkludEVudW0gYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW07IH0KK2RlY2xhcmVfYmluZGVyX2VudW0hIHsKKyAgSW50RW51bSA6IFtpMzI7IDRdIHsKKyAgICBGT08gPSAxMDAwLAorICAgIEJBUiA9IDIwMDAsCisgICAgQkFaID0gMjAwMSwKKyAgICAjW2RlcHJlY2F0ZWQgPSAiZG8gbm90IHVzZSB0aGlzIl0KKyAgICBRVVggPSAyMDAyLAorICB9Cit9CitwdWIoY3JhdGUpIG1vZCBtYW5nbGVkIHsKKyBwdWIgdXNlIHN1cGVyOjpJbnRFbnVtIGFzIF83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvTGlzdE9mSW50ZXJmYWNlcy5ycyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0xpc3RPZkludGVyZmFjZXMucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY1ZDVjNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0xpc3RPZkludGVyZmFjZXMucnMKQEAgLTAsMCArMSw0MDMgQEAKKyMhW2ZvcmJpZCh1bnNhZmVfY29kZSldCisjIVtydXN0Zm10Ojpza2lwXQorI1tkZXJpdmUoRGVidWcpXQorcHViIHN0cnVjdCBMaXN0T2ZJbnRlcmZhY2VzIHsKK30KK2ltcGwgRGVmYXVsdCBmb3IgTGlzdE9mSW50ZXJmYWNlcyB7CisgIGZuIGRlZmF1bHQoKSAtPiBTZWxmIHsKKyAgICBTZWxmIHsKKyAgICB9CisgIH0KK30KK2ltcGwgYmluZGVyOjpQYXJjZWxhYmxlIGZvciBMaXN0T2ZJbnRlcmZhY2VzIHsKKyAgZm4gd3JpdGVfdG9fcGFyY2VsKCZzZWxmLCBwYXJjZWw6ICZtdXQgYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWwpIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4geworICAgIHBhcmNlbC5zaXplZF93cml0ZSh8c3VicGFyY2VsfCB7CisgICAgICBPaygoKSkKKyAgICB9KQorICB9CisgIGZuIHJlYWRfZnJvbV9wYXJjZWwoJm11dCBzZWxmLCBwYXJjZWw6ICZiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbCkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CisgICAgcGFyY2VsLnNpemVkX3JlYWQofHN1YnBhcmNlbHwgeworICAgICAgT2soKCkpCisgICAgfSkKKyAgfQorfQorYmluZGVyOjppbXBsX3NlcmlhbGl6ZV9mb3JfcGFyY2VsYWJsZSEoTGlzdE9mSW50ZXJmYWNlcyk7CitiaW5kZXI6OmltcGxfZGVzZXJpYWxpemVfZm9yX3BhcmNlbGFibGUhKExpc3RPZkludGVyZmFjZXMpOworaW1wbCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWxhYmxlTWV0YWRhdGEgZm9yIExpc3RPZkludGVyZmFjZXMgeworICBmbiBnZXRfZGVzY3JpcHRvcigpIC0+ICYnc3RhdGljIHN0ciB7ICJhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcyIgfQorfQorcHViIG1vZCBJRW1wdHlJbnRlcmZhY2UgeworICAjIVthbGxvdyhub25fdXBwZXJfY2FzZV9nbG9iYWxzKV0KKyAgIyFbYWxsb3cobm9uX3NuYWtlX2Nhc2UpXQorICAjW2FsbG93KHVudXNlZF9pbXBvcnRzKV0gdXNlIGJpbmRlcjo6YmluZGVyX2ltcGw6OklCaW5kZXJJbnRlcm5hbDsKKyAgdXNlIGJpbmRlcjo6ZGVjbGFyZV9iaW5kZXJfaW50ZXJmYWNlOworICBkZWNsYXJlX2JpbmRlcl9pbnRlcmZhY2UhIHsKKyAgICBJRW1wdHlJbnRlcmZhY2VbImFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZSJdIHsKKyAgICAgIG5hdGl2ZTogQm5FbXB0eUludGVyZmFjZShvbl90cmFuc2FjdCksCisgICAgICBwcm94eTogQnBFbXB0eUludGVyZmFjZSB7CisgICAgICB9LAorICAgICAgYXN5bmM6IElFbXB0eUludGVyZmFjZUFzeW5jLAorICAgIH0KKyAgfQorICBwdWIgdHJhaXQgSUVtcHR5SW50ZXJmYWNlOiBiaW5kZXI6OkludGVyZmFjZSArIFNlbmQgeworICAgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHdoZXJlIFNlbGY6IFNpemVkIHsgImFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZSIgfQorICAgIGZuIGdldERlZmF1bHRJbXBsKCkgLT4gSUVtcHR5SW50ZXJmYWNlRGVmYXVsdFJlZiB3aGVyZSBTZWxmOiBTaXplZCB7CisgICAgICBERUZBVUxUX0lNUEwubG9jaygpLnVud3JhcCgpLmNsb25lKCkKKyAgICB9CisgICAgZm4gc2V0RGVmYXVsdEltcGwoZDogSUVtcHR5SW50ZXJmYWNlRGVmYXVsdFJlZikgLT4gSUVtcHR5SW50ZXJmYWNlRGVmYXVsdFJlZiB3aGVyZSBTZWxmOiBTaXplZCB7CisgICAgICBzdGQ6Om1lbTo6cmVwbGFjZSgmbXV0ICpERUZBVUxUX0lNUEwubG9jaygpLnVud3JhcCgpLCBkKQorICAgIH0KKyAgfQorICBwdWIgdHJhaXQgSUVtcHR5SW50ZXJmYWNlQXN5bmM8UD46IGJpbmRlcjo6SW50ZXJmYWNlICsgU2VuZCB7CisgICAgZm4gZ2V0X2Rlc2NyaXB0b3IoKSAtPiAmJ3N0YXRpYyBzdHIgd2hlcmUgU2VsZjogU2l6ZWQgeyAiYW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlIiB9CisgIH0KKyAgI1s6OmFzeW5jX3RyYWl0Ojphc3luY190cmFpdF0KKyAgcHViIHRyYWl0IElFbXB0eUludGVyZmFjZUFzeW5jU2VydmVyOiBiaW5kZXI6OkludGVyZmFjZSArIFNlbmQgeworICAgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHdoZXJlIFNlbGY6IFNpemVkIHsgImFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZSIgfQorICB9CisgIGltcGwgQm5FbXB0eUludGVyZmFjZSB7CisgICAgLy8vIENyZWF0ZSBhIG5ldyBhc3luYyBiaW5kZXIgc2VydmljZS4KKyAgICBwdWIgZm4gbmV3X2FzeW5jX2JpbmRlcjxULCBSPihpbm5lcjogVCwgcnQ6IFIsIGZlYXR1cmVzOiBiaW5kZXI6OkJpbmRlckZlYXR1cmVzKSAtPiBiaW5kZXI6OlN0cm9uZzxkeW4gSUVtcHR5SW50ZXJmYWNlPgorICAgIHdoZXJlCisgICAgICBUOiBJRW1wdHlJbnRlcmZhY2VBc3luY1NlcnZlciArIGJpbmRlcjo6SW50ZXJmYWNlICsgU2VuZCArIFN5bmMgKyAnc3RhdGljLAorICAgICAgUjogYmluZGVyOjpiaW5kZXJfaW1wbDo6QmluZGVyQXN5bmNSdW50aW1lICsgU2VuZCArIFN5bmMgKyAnc3RhdGljLAorICAgIHsKKyAgICAgIHN0cnVjdCBXcmFwcGVyPFQsIFI+IHsKKyAgICAgICAgX2lubmVyOiBULAorICAgICAgICBfcnQ6IFIsCisgICAgICB9CisgICAgICBpbXBsPFQsIFI+IGJpbmRlcjo6SW50ZXJmYWNlIGZvciBXcmFwcGVyPFQsIFI+IHdoZXJlIFQ6IGJpbmRlcjo6SW50ZXJmYWNlLCBSOiBTZW5kICsgU3luYyB7CisgICAgICAgIGZuIGFzX2JpbmRlcigmc2VsZikgLT4gYmluZGVyOjpTcElCaW5kZXIgeyBzZWxmLl9pbm5lci5hc19iaW5kZXIoKSB9CisgICAgICAgIGZuIGR1bXAoJnNlbGYsIF9maWxlOiAmc3RkOjpmczo6RmlsZSwgX2FyZ3M6ICZbJnN0ZDo6ZmZpOjpDU3RyXSkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7IHNlbGYuX2lubmVyLmR1bXAoX2ZpbGUsIF9hcmdzKSB9CisgICAgICB9CisgICAgICBpbXBsPFQsIFI+IElFbXB0eUludGVyZmFjZSBmb3IgV3JhcHBlcjxULCBSPgorICAgICAgd2hlcmUKKyAgICAgICAgVDogSUVtcHR5SW50ZXJmYWNlQXN5bmNTZXJ2ZXIgKyBTZW5kICsgU3luYyArICdzdGF0aWMsCisgICAgICAgIFI6IGJpbmRlcjo6YmluZGVyX2ltcGw6OkJpbmRlckFzeW5jUnVudGltZSArIFNlbmQgKyBTeW5jICsgJ3N0YXRpYywKKyAgICAgIHsKKyAgICAgIH0KKyAgICAgIGxldCB3cmFwcGVkID0gV3JhcHBlciB7IF9pbm5lcjogaW5uZXIsIF9ydDogcnQgfTsKKyAgICAgIFNlbGY6Om5ld19iaW5kZXIod3JhcHBlZCwgZmVhdHVyZXMpCisgICAgfQorICB9CisgIHB1YiB0cmFpdCBJRW1wdHlJbnRlcmZhY2VEZWZhdWx0OiBTZW5kICsgU3luYyB7CisgIH0KKyAgcHViIG1vZCB0cmFuc2FjdGlvbnMgeworICB9CisgIHB1YiB0eXBlIElFbXB0eUludGVyZmFjZURlZmF1bHRSZWYgPSBPcHRpb248c3RkOjpzeW5jOjpBcmM8ZHluIElFbXB0eUludGVyZmFjZURlZmF1bHQ+PjsKKyAgdXNlIGxhenlfc3RhdGljOjpsYXp5X3N0YXRpYzsKKyAgbGF6eV9zdGF0aWMhIHsKKyAgICBzdGF0aWMgcmVmIERFRkFVTFRfSU1QTDogc3RkOjpzeW5jOjpNdXRleDxJRW1wdHlJbnRlcmZhY2VEZWZhdWx0UmVmPiA9IHN0ZDo6c3luYzo6TXV0ZXg6Om5ldyhOb25lKTsKKyAgfQorICBpbXBsIEJwRW1wdHlJbnRlcmZhY2UgeworICB9CisgIGltcGwgSUVtcHR5SW50ZXJmYWNlIGZvciBCcEVtcHR5SW50ZXJmYWNlIHsKKyAgfQorICBpbXBsPFA6IGJpbmRlcjo6QmluZGVyQXN5bmNQb29sPiBJRW1wdHlJbnRlcmZhY2VBc3luYzxQPiBmb3IgQnBFbXB0eUludGVyZmFjZSB7CisgIH0KKyAgaW1wbCBJRW1wdHlJbnRlcmZhY2UgZm9yIGJpbmRlcjo6YmluZGVyX2ltcGw6OkJpbmRlcjxCbkVtcHR5SW50ZXJmYWNlPiB7CisgIH0KKyAgZm4gb25fdHJhbnNhY3QoX2FpZGxfc2VydmljZTogJmR5biBJRW1wdHlJbnRlcmZhY2UsIF9haWRsX2NvZGU6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSwgX2FpZGxfZGF0YTogJmJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsPCdfPiwgX2FpZGxfcmVwbHk6ICZtdXQgYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWw8J18+KSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsKKyAgICBtYXRjaCBfYWlkbF9jb2RlIHsKKyAgICAgIF8gPT4gRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikKKyAgICB9CisgIH0KK30KK3B1YiBtb2QgSU15SW50ZXJmYWNlIHsKKyAgIyFbYWxsb3cobm9uX3VwcGVyX2Nhc2VfZ2xvYmFscyldCisgICMhW2FsbG93KG5vbl9zbmFrZV9jYXNlKV0KKyAgI1thbGxvdyh1bnVzZWRfaW1wb3J0cyldIHVzZSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpJQmluZGVySW50ZXJuYWw7CisgIHVzZSBiaW5kZXI6OmRlY2xhcmVfYmluZGVyX2ludGVyZmFjZTsKKyAgZGVjbGFyZV9iaW5kZXJfaW50ZXJmYWNlISB7CisgICAgSU15SW50ZXJmYWNlWyJhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JTXlJbnRlcmZhY2UiXSB7CisgICAgICBuYXRpdmU6IEJuTXlJbnRlcmZhY2Uob25fdHJhbnNhY3QpLAorICAgICAgcHJveHk6IEJwTXlJbnRlcmZhY2UgeworICAgICAgfSwKKyAgICAgIGFzeW5jOiBJTXlJbnRlcmZhY2VBc3luYywKKyAgICB9CisgIH0KKyAgcHViIHRyYWl0IElNeUludGVyZmFjZTogYmluZGVyOjpJbnRlcmZhY2UgKyBTZW5kIHsKKyAgICBmbiBnZXRfZGVzY3JpcHRvcigpIC0+ICYnc3RhdGljIHN0ciB3aGVyZSBTZWxmOiBTaXplZCB7ICJhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JTXlJbnRlcmZhY2UiIH0KKyAgICBmbiBtZXRob2RXaXRoSW50ZXJmYWNlcygmc2VsZiwgX2FyZ19pZmFjZTogJmJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4sIF9hcmdfbnVsbGFibGVfaWZhY2U6IE9wdGlvbjwmYmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4sIF9hcmdfaWZhY2VfbGlzdF9pbjogJltiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+XSwgX2FyZ19pZmFjZV9saXN0X291dDogJm11dCBWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+PiwgX2FyZ19pZmFjZV9saXN0X2lub3V0OiAmbXV0IFZlYzxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+PiwgX2FyZ19udWxsYWJsZV9pZmFjZV9saXN0X2luOiBPcHRpb248JltPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj5dPiwgX2FyZ19udWxsYWJsZV9pZmFjZV9saXN0X291dDogJm11dCBPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4+LCBfYXJnX251bGxhYmxlX2lmYWNlX2xpc3RfaW5vdXQ6ICZtdXQgT3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+PikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+Pj47CisgICAgZm4gZ2V0RGVmYXVsdEltcGwoKSAtPiBJTXlJbnRlcmZhY2VEZWZhdWx0UmVmIHdoZXJlIFNlbGY6IFNpemVkIHsKKyAgICAgIERFRkFVTFRfSU1QTC5sb2NrKCkudW53cmFwKCkuY2xvbmUoKQorICAgIH0KKyAgICBmbiBzZXREZWZhdWx0SW1wbChkOiBJTXlJbnRlcmZhY2VEZWZhdWx0UmVmKSAtPiBJTXlJbnRlcmZhY2VEZWZhdWx0UmVmIHdoZXJlIFNlbGY6IFNpemVkIHsKKyAgICAgIHN0ZDo6bWVtOjpyZXBsYWNlKCZtdXQgKkRFRkFVTFRfSU1QTC5sb2NrKCkudW53cmFwKCksIGQpCisgICAgfQorICB9CisgIHB1YiB0cmFpdCBJTXlJbnRlcmZhY2VBc3luYzxQPjogYmluZGVyOjpJbnRlcmZhY2UgKyBTZW5kIHsKKyAgICBmbiBnZXRfZGVzY3JpcHRvcigpIC0+ICYnc3RhdGljIHN0ciB3aGVyZSBTZWxmOiBTaXplZCB7ICJhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JTXlJbnRlcmZhY2UiIH0KKyAgICBmbiBtZXRob2RXaXRoSW50ZXJmYWNlczwnYT4oJidhIHNlbGYsIF9hcmdfaWZhY2U6ICYnYSBiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+LCBfYXJnX251bGxhYmxlX2lmYWNlOiBPcHRpb248JidhIGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+LCBfYXJnX2lmYWNlX2xpc3RfaW46ICYnYSBbYmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPl0sIF9hcmdfaWZhY2VfbGlzdF9vdXQ6ICYnYSBtdXQgVmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4sIF9hcmdfaWZhY2VfbGlzdF9pbm91dDogJidhIG11dCBWZWM8YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4sIF9hcmdfbnVsbGFibGVfaWZhY2VfbGlzdF9pbjogT3B0aW9uPCYnYSBbT3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+XT4sIF9hcmdfbnVsbGFibGVfaWZhY2VfbGlzdF9vdXQ6ICYnYSBtdXQgT3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+PiwgX2FyZ19udWxsYWJsZV9pZmFjZV9saXN0X2lub3V0OiAmJ2EgbXV0IE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+Pj4pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4+Pj47CisgIH0KKyAgI1s6OmFzeW5jX3RyYWl0Ojphc3luY190cmFpdF0KKyAgcHViIHRyYWl0IElNeUludGVyZmFjZUFzeW5jU2VydmVyOiBiaW5kZXI6OkludGVyZmFjZSArIFNlbmQgeworICAgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHdoZXJlIFNlbGY6IFNpemVkIHsgImFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklNeUludGVyZmFjZSIgfQorICAgIGFzeW5jIGZuIG1ldGhvZFdpdGhJbnRlcmZhY2VzKCZzZWxmLCBfYXJnX2lmYWNlOiAmYmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPiwgX2FyZ19udWxsYWJsZV9pZmFjZTogT3B0aW9uPCZiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+PiwgX2FyZ19pZmFjZV9saXN0X2luOiAmW2JpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT5dLCBfYXJnX2lmYWNlX2xpc3Rfb3V0OiAmbXV0IFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+LCBfYXJnX2lmYWNlX2xpc3RfaW5vdXQ6ICZtdXQgVmVjPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+LCBfYXJnX251bGxhYmxlX2lmYWNlX2xpc3RfaW46IE9wdGlvbjwmW09wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pl0+LCBfYXJnX251bGxhYmxlX2lmYWNlX2xpc3Rfb3V0OiAmbXV0IE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+Pj4sIF9hcmdfbnVsbGFibGVfaWZhY2VfbGlzdF9pbm91dDogJm11dCBPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4+PjsKKyAgfQorICBpbXBsIEJuTXlJbnRlcmZhY2UgeworICAgIC8vLyBDcmVhdGUgYSBuZXcgYXN5bmMgYmluZGVyIHNlcnZpY2UuCisgICAgcHViIGZuIG5ld19hc3luY19iaW5kZXI8VCwgUj4oaW5uZXI6IFQsIHJ0OiBSLCBmZWF0dXJlczogYmluZGVyOjpCaW5kZXJGZWF0dXJlcykgLT4gYmluZGVyOjpTdHJvbmc8ZHluIElNeUludGVyZmFjZT4KKyAgICB3aGVyZQorICAgICAgVDogSU15SW50ZXJmYWNlQXN5bmNTZXJ2ZXIgKyBiaW5kZXI6OkludGVyZmFjZSArIFNlbmQgKyBTeW5jICsgJ3N0YXRpYywKKyAgICAgIFI6IGJpbmRlcjo6YmluZGVyX2ltcGw6OkJpbmRlckFzeW5jUnVudGltZSArIFNlbmQgKyBTeW5jICsgJ3N0YXRpYywKKyAgICB7CisgICAgICBzdHJ1Y3QgV3JhcHBlcjxULCBSPiB7CisgICAgICAgIF9pbm5lcjogVCwKKyAgICAgICAgX3J0OiBSLAorICAgICAgfQorICAgICAgaW1wbDxULCBSPiBiaW5kZXI6OkludGVyZmFjZSBmb3IgV3JhcHBlcjxULCBSPiB3aGVyZSBUOiBiaW5kZXI6OkludGVyZmFjZSwgUjogU2VuZCArIFN5bmMgeworICAgICAgICBmbiBhc19iaW5kZXIoJnNlbGYpIC0+IGJpbmRlcjo6U3BJQmluZGVyIHsgc2VsZi5faW5uZXIuYXNfYmluZGVyKCkgfQorICAgICAgICBmbiBkdW1wKCZzZWxmLCBfZmlsZTogJnN0ZDo6ZnM6OkZpbGUsIF9hcmdzOiAmWyZzdGQ6OmZmaTo6Q1N0cl0pIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4geyBzZWxmLl9pbm5lci5kdW1wKF9maWxlLCBfYXJncykgfQorICAgICAgfQorICAgICAgaW1wbDxULCBSPiBJTXlJbnRlcmZhY2UgZm9yIFdyYXBwZXI8VCwgUj4KKyAgICAgIHdoZXJlCisgICAgICAgIFQ6IElNeUludGVyZmFjZUFzeW5jU2VydmVyICsgU2VuZCArIFN5bmMgKyAnc3RhdGljLAorICAgICAgICBSOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpCaW5kZXJBc3luY1J1bnRpbWUgKyBTZW5kICsgU3luYyArICdzdGF0aWMsCisgICAgICB7CisgICAgICAgIGZuIG1ldGhvZFdpdGhJbnRlcmZhY2VzKCZzZWxmLCBfYXJnX2lmYWNlOiAmYmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPiwgX2FyZ19udWxsYWJsZV9pZmFjZTogT3B0aW9uPCZiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+PiwgX2FyZ19pZmFjZV9saXN0X2luOiAmW2JpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT5dLCBfYXJnX2lmYWNlX2xpc3Rfb3V0OiAmbXV0IFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+LCBfYXJnX2lmYWNlX2xpc3RfaW5vdXQ6ICZtdXQgVmVjPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+LCBfYXJnX251bGxhYmxlX2lmYWNlX2xpc3RfaW46IE9wdGlvbjwmW09wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pl0+LCBfYXJnX251bGxhYmxlX2lmYWNlX2xpc3Rfb3V0OiAmbXV0IE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+Pj4sIF9hcmdfbnVsbGFibGVfaWZhY2VfbGlzdF9pbm91dDogJm11dCBPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4+PiB7CisgICAgICAgICAgc2VsZi5fcnQuYmxvY2tfb24oc2VsZi5faW5uZXIubWV0aG9kV2l0aEludGVyZmFjZXMoX2FyZ19pZmFjZSwgX2FyZ19udWxsYWJsZV9pZmFjZSwgX2FyZ19pZmFjZV9saXN0X2luLCBfYXJnX2lmYWNlX2xpc3Rfb3V0LCBfYXJnX2lmYWNlX2xpc3RfaW5vdXQsIF9hcmdfbnVsbGFibGVfaWZhY2VfbGlzdF9pbiwgX2FyZ19udWxsYWJsZV9pZmFjZV9saXN0X291dCwgX2FyZ19udWxsYWJsZV9pZmFjZV9saXN0X2lub3V0KSkKKyAgICAgICAgfQorICAgICAgfQorICAgICAgbGV0IHdyYXBwZWQgPSBXcmFwcGVyIHsgX2lubmVyOiBpbm5lciwgX3J0OiBydCB9OworICAgICAgU2VsZjo6bmV3X2JpbmRlcih3cmFwcGVkLCBmZWF0dXJlcykKKyAgICB9CisgIH0KKyAgcHViIHRyYWl0IElNeUludGVyZmFjZURlZmF1bHQ6IFNlbmQgKyBTeW5jIHsKKyAgICBmbiBtZXRob2RXaXRoSW50ZXJmYWNlcygmc2VsZiwgX2FyZ19pZmFjZTogJmJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4sIF9hcmdfbnVsbGFibGVfaWZhY2U6IE9wdGlvbjwmYmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4sIF9hcmdfaWZhY2VfbGlzdF9pbjogJltiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+XSwgX2FyZ19pZmFjZV9saXN0X291dDogJm11dCBWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+PiwgX2FyZ19pZmFjZV9saXN0X2lub3V0OiAmbXV0IFZlYzxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+PiwgX2FyZ19udWxsYWJsZV9pZmFjZV9saXN0X2luOiBPcHRpb248JltPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj5dPiwgX2FyZ19udWxsYWJsZV9pZmFjZV9saXN0X291dDogJm11dCBPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4+LCBfYXJnX251bGxhYmxlX2lmYWNlX2xpc3RfaW5vdXQ6ICZtdXQgT3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+PikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+Pj4geworICAgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTi5pbnRvKCkpCisgICAgfQorICB9CisgIHB1YiBtb2QgdHJhbnNhY3Rpb25zIHsKKyAgICBwdWIgY29uc3QgbWV0aG9kV2l0aEludGVyZmFjZXM6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAwOworICB9CisgIHB1YiB0eXBlIElNeUludGVyZmFjZURlZmF1bHRSZWYgPSBPcHRpb248c3RkOjpzeW5jOjpBcmM8ZHluIElNeUludGVyZmFjZURlZmF1bHQ+PjsKKyAgdXNlIGxhenlfc3RhdGljOjpsYXp5X3N0YXRpYzsKKyAgbGF6eV9zdGF0aWMhIHsKKyAgICBzdGF0aWMgcmVmIERFRkFVTFRfSU1QTDogc3RkOjpzeW5jOjpNdXRleDxJTXlJbnRlcmZhY2VEZWZhdWx0UmVmPiA9IHN0ZDo6c3luYzo6TXV0ZXg6Om5ldyhOb25lKTsKKyAgfQorICBpbXBsIEJwTXlJbnRlcmZhY2UgeworICAgIGZuIGJ1aWxkX3BhcmNlbF9tZXRob2RXaXRoSW50ZXJmYWNlcygmc2VsZiwgX2FyZ19pZmFjZTogJmJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4sIF9hcmdfbnVsbGFibGVfaWZhY2U6IE9wdGlvbjwmYmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4sIF9hcmdfaWZhY2VfbGlzdF9pbjogJltiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+XSwgX2FyZ19pZmFjZV9saXN0X291dDogJm11dCBWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+PiwgX2FyZ19pZmFjZV9saXN0X2lub3V0OiAmbXV0IFZlYzxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+PiwgX2FyZ19udWxsYWJsZV9pZmFjZV9saXN0X2luOiBPcHRpb248JltPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj5dPiwgX2FyZ19udWxsYWJsZV9pZmFjZV9saXN0X291dDogJm11dCBPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4+LCBfYXJnX251bGxhYmxlX2lmYWNlX2xpc3RfaW5vdXQ6ICZtdXQgT3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+PikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsPiB7CisgICAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgICBhaWRsX2RhdGEud3JpdGUoX2FyZ19pZmFjZSk/OworICAgICAgYWlkbF9kYXRhLndyaXRlKCZfYXJnX251bGxhYmxlX2lmYWNlKT87CisgICAgICBhaWRsX2RhdGEud3JpdGUoX2FyZ19pZmFjZV9saXN0X2luKT87CisgICAgICBhaWRsX2RhdGEud3JpdGUoX2FyZ19pZmFjZV9saXN0X2lub3V0KT87CisgICAgICBhaWRsX2RhdGEud3JpdGUoJl9hcmdfbnVsbGFibGVfaWZhY2VfbGlzdF9pbik/OworICAgICAgYWlkbF9kYXRhLndyaXRlKF9hcmdfbnVsbGFibGVfaWZhY2VfbGlzdF9pbm91dCk/OworICAgICAgT2soYWlkbF9kYXRhKQorICAgIH0KKyAgICBmbiByZWFkX3Jlc3BvbnNlX21ldGhvZFdpdGhJbnRlcmZhY2VzKCZzZWxmLCBfYXJnX2lmYWNlOiAmYmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPiwgX2FyZ19udWxsYWJsZV9pZmFjZTogT3B0aW9uPCZiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+PiwgX2FyZ19pZmFjZV9saXN0X2luOiAmW2JpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT5dLCBfYXJnX2lmYWNlX2xpc3Rfb3V0OiAmbXV0IFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+LCBfYXJnX2lmYWNlX2xpc3RfaW5vdXQ6ICZtdXQgVmVjPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+LCBfYXJnX251bGxhYmxlX2lmYWNlX2xpc3RfaW46IE9wdGlvbjwmW09wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pl0+LCBfYXJnX251bGxhYmxlX2lmYWNlX2xpc3Rfb3V0OiAmbXV0IE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+Pj4sIF9hcmdfbnVsbGFibGVfaWZhY2VfbGlzdF9pbm91dDogJm11dCBPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4+LCBfYWlkbF9yZXBseTogc3RkOjpyZXN1bHQ6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWwsIGJpbmRlcjo6U3RhdHVzQ29kZT4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+Pj4+IHsKKyAgICAgIGlmIGxldCBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKSA9IF9haWRsX3JlcGx5IHsKKyAgICAgICAgaWYgbGV0IFNvbWUoX2FpZGxfZGVmYXVsdF9pbXBsKSA9IDxTZWxmIGFzIElNeUludGVyZmFjZT46OmdldERlZmF1bHRJbXBsKCkgeworICAgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwubWV0aG9kV2l0aEludGVyZmFjZXMoX2FyZ19pZmFjZSwgX2FyZ19udWxsYWJsZV9pZmFjZSwgX2FyZ19pZmFjZV9saXN0X2luLCBfYXJnX2lmYWNlX2xpc3Rfb3V0LCBfYXJnX2lmYWNlX2xpc3RfaW5vdXQsIF9hcmdfbnVsbGFibGVfaWZhY2VfbGlzdF9pbiwgX2FyZ19udWxsYWJsZV9pZmFjZV9saXN0X291dCwgX2FyZ19udWxsYWJsZV9pZmFjZV9saXN0X2lub3V0KTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgbGV0IF9haWRsX3JlcGx5ID0gX2FpZGxfcmVwbHk/OworICAgICAgbGV0IF9haWRsX3N0YXR1czogYmluZGVyOjpTdGF0dXMgPSBfYWlkbF9yZXBseS5yZWFkKCk/OworICAgICAgaWYgIV9haWRsX3N0YXR1cy5pc19vaygpIHsgcmV0dXJuIEVycihfYWlkbF9zdGF0dXMpOyB9CisgICAgICBsZXQgX2FpZGxfcmV0dXJuOiBPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4+ID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKKyAgICAgIF9haWRsX3JlcGx5LnJlYWRfb250byhfYXJnX2lmYWNlX2xpc3Rfb3V0KT87CisgICAgICBfYWlkbF9yZXBseS5yZWFkX29udG8oX2FyZ19pZmFjZV9saXN0X2lub3V0KT87CisgICAgICBfYWlkbF9yZXBseS5yZWFkX29udG8oX2FyZ19udWxsYWJsZV9pZmFjZV9saXN0X291dCk/OworICAgICAgX2FpZGxfcmVwbHkucmVhZF9vbnRvKF9hcmdfbnVsbGFibGVfaWZhY2VfbGlzdF9pbm91dCk/OworICAgICAgT2soX2FpZGxfcmV0dXJuKQorICAgIH0KKyAgfQorICBpbXBsIElNeUludGVyZmFjZSBmb3IgQnBNeUludGVyZmFjZSB7CisgICAgZm4gbWV0aG9kV2l0aEludGVyZmFjZXMoJnNlbGYsIF9hcmdfaWZhY2U6ICZiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+LCBfYXJnX251bGxhYmxlX2lmYWNlOiBPcHRpb248JmJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+LCBfYXJnX2lmYWNlX2xpc3RfaW46ICZbYmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPl0sIF9hcmdfaWZhY2VfbGlzdF9vdXQ6ICZtdXQgVmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4sIF9hcmdfaWZhY2VfbGlzdF9pbm91dDogJm11dCBWZWM8YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4sIF9hcmdfbnVsbGFibGVfaWZhY2VfbGlzdF9pbjogT3B0aW9uPCZbT3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+XT4sIF9hcmdfbnVsbGFibGVfaWZhY2VfbGlzdF9vdXQ6ICZtdXQgT3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+PiwgX2FyZ19udWxsYWJsZV9pZmFjZV9saXN0X2lub3V0OiAmbXV0IE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+Pj4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+Pj4+IHsKKyAgICAgIGxldCBfYWlkbF9kYXRhID0gc2VsZi5idWlsZF9wYXJjZWxfbWV0aG9kV2l0aEludGVyZmFjZXMoX2FyZ19pZmFjZSwgX2FyZ19udWxsYWJsZV9pZmFjZSwgX2FyZ19pZmFjZV9saXN0X2luLCBfYXJnX2lmYWNlX2xpc3Rfb3V0LCBfYXJnX2lmYWNlX2xpc3RfaW5vdXQsIF9hcmdfbnVsbGFibGVfaWZhY2VfbGlzdF9pbiwgX2FyZ19udWxsYWJsZV9pZmFjZV9saXN0X291dCwgX2FyZ19udWxsYWJsZV9pZmFjZV9saXN0X2lub3V0KT87CisgICAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjptZXRob2RXaXRoSW50ZXJmYWNlcywgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9tZXRob2RXaXRoSW50ZXJmYWNlcyhfYXJnX2lmYWNlLCBfYXJnX251bGxhYmxlX2lmYWNlLCBfYXJnX2lmYWNlX2xpc3RfaW4sIF9hcmdfaWZhY2VfbGlzdF9vdXQsIF9hcmdfaWZhY2VfbGlzdF9pbm91dCwgX2FyZ19udWxsYWJsZV9pZmFjZV9saXN0X2luLCBfYXJnX251bGxhYmxlX2lmYWNlX2xpc3Rfb3V0LCBfYXJnX251bGxhYmxlX2lmYWNlX2xpc3RfaW5vdXQsIF9haWRsX3JlcGx5KQorICAgIH0KKyAgfQorICBpbXBsPFA6IGJpbmRlcjo6QmluZGVyQXN5bmNQb29sPiBJTXlJbnRlcmZhY2VBc3luYzxQPiBmb3IgQnBNeUludGVyZmFjZSB7CisgICAgZm4gbWV0aG9kV2l0aEludGVyZmFjZXM8J2E+KCYnYSBzZWxmLCBfYXJnX2lmYWNlOiAmJ2EgYmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPiwgX2FyZ19udWxsYWJsZV9pZmFjZTogT3B0aW9uPCYnYSBiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+PiwgX2FyZ19pZmFjZV9saXN0X2luOiAmJ2EgW2JpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT5dLCBfYXJnX2lmYWNlX2xpc3Rfb3V0OiAmJ2EgbXV0IFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+LCBfYXJnX2lmYWNlX2xpc3RfaW5vdXQ6ICYnYSBtdXQgVmVjPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+LCBfYXJnX251bGxhYmxlX2lmYWNlX2xpc3RfaW46IE9wdGlvbjwmJ2EgW09wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pl0+LCBfYXJnX251bGxhYmxlX2lmYWNlX2xpc3Rfb3V0OiAmJ2EgbXV0IE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+Pj4sIF9hcmdfbnVsbGFibGVfaWZhY2VfbGlzdF9pbm91dDogJidhIG11dCBPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4+KSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+Pj4+IHsKKyAgICAgIGxldCBfYWlkbF9kYXRhID0gbWF0Y2ggc2VsZi5idWlsZF9wYXJjZWxfbWV0aG9kV2l0aEludGVyZmFjZXMoX2FyZ19pZmFjZSwgX2FyZ19udWxsYWJsZV9pZmFjZSwgX2FyZ19pZmFjZV9saXN0X2luLCBfYXJnX2lmYWNlX2xpc3Rfb3V0LCBfYXJnX2lmYWNlX2xpc3RfaW5vdXQsIF9hcmdfbnVsbGFibGVfaWZhY2VfbGlzdF9pbiwgX2FyZ19udWxsYWJsZV9pZmFjZV9saXN0X291dCwgX2FyZ19udWxsYWJsZV9pZmFjZV9saXN0X2lub3V0KSB7CisgICAgICAgIE9rKF9haWRsX2RhdGEpID0+IF9haWRsX2RhdGEsCisgICAgICAgIEVycihlcnIpID0+IHJldHVybiBCb3g6OnBpbihzdGQ6OmZ1dHVyZTo6cmVhZHkoRXJyKGVycikpKSwKKyAgICAgIH07CisgICAgICBsZXQgYmluZGVyID0gc2VsZi5iaW5kZXIuY2xvbmUoKTsKKyAgICAgIFA6OnNwYXduKAorICAgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjptZXRob2RXaXRoSW50ZXJmYWNlcywgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKSwKKyAgICAgICAgbW92ZSB8X2FpZGxfcmVwbHl8IGFzeW5jIG1vdmUgeworICAgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9tZXRob2RXaXRoSW50ZXJmYWNlcyhfYXJnX2lmYWNlLCBfYXJnX251bGxhYmxlX2lmYWNlLCBfYXJnX2lmYWNlX2xpc3RfaW4sIF9hcmdfaWZhY2VfbGlzdF9vdXQsIF9hcmdfaWZhY2VfbGlzdF9pbm91dCwgX2FyZ19udWxsYWJsZV9pZmFjZV9saXN0X2luLCBfYXJnX251bGxhYmxlX2lmYWNlX2xpc3Rfb3V0LCBfYXJnX251bGxhYmxlX2lmYWNlX2xpc3RfaW5vdXQsIF9haWRsX3JlcGx5KQorICAgICAgICB9CisgICAgICApCisgICAgfQorICB9CisgIGltcGwgSU15SW50ZXJmYWNlIGZvciBiaW5kZXI6OmJpbmRlcl9pbXBsOjpCaW5kZXI8Qm5NeUludGVyZmFjZT4geworICAgIGZuIG1ldGhvZFdpdGhJbnRlcmZhY2VzKCZzZWxmLCBfYXJnX2lmYWNlOiAmYmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPiwgX2FyZ19udWxsYWJsZV9pZmFjZTogT3B0aW9uPCZiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+PiwgX2FyZ19pZmFjZV9saXN0X2luOiAmW2JpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT5dLCBfYXJnX2lmYWNlX2xpc3Rfb3V0OiAmbXV0IFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+LCBfYXJnX2lmYWNlX2xpc3RfaW5vdXQ6ICZtdXQgVmVjPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+LCBfYXJnX251bGxhYmxlX2lmYWNlX2xpc3RfaW46IE9wdGlvbjwmW09wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pl0+LCBfYXJnX251bGxhYmxlX2lmYWNlX2xpc3Rfb3V0OiAmbXV0IE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+Pj4sIF9hcmdfbnVsbGFibGVfaWZhY2VfbGlzdF9pbm91dDogJm11dCBPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4+PiB7IHNlbGYuMC5tZXRob2RXaXRoSW50ZXJmYWNlcyhfYXJnX2lmYWNlLCBfYXJnX251bGxhYmxlX2lmYWNlLCBfYXJnX2lmYWNlX2xpc3RfaW4sIF9hcmdfaWZhY2VfbGlzdF9vdXQsIF9hcmdfaWZhY2VfbGlzdF9pbm91dCwgX2FyZ19udWxsYWJsZV9pZmFjZV9saXN0X2luLCBfYXJnX251bGxhYmxlX2lmYWNlX2xpc3Rfb3V0LCBfYXJnX251bGxhYmxlX2lmYWNlX2xpc3RfaW5vdXQpIH0KKyAgfQorICBmbiBvbl90cmFuc2FjdChfYWlkbF9zZXJ2aWNlOiAmZHluIElNeUludGVyZmFjZSwgX2FpZGxfY29kZTogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlLCBfYWlkbF9kYXRhOiAmYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWw8J18+LCBfYWlkbF9yZXBseTogJm11dCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbDwnXz4pIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4geworICAgIG1hdGNoIF9haWRsX2NvZGUgeworICAgICAgdHJhbnNhY3Rpb25zOjptZXRob2RXaXRoSW50ZXJmYWNlcyA9PiB7CisgICAgICAgIGxldCBfYXJnX2lmYWNlOiBiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+ID0gX2FpZGxfZGF0YS5yZWFkKCk/OworICAgICAgICBsZXQgX2FyZ19udWxsYWJsZV9pZmFjZTogT3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+ID0gX2FpZGxfZGF0YS5yZWFkKCk/OworICAgICAgICBsZXQgX2FyZ19pZmFjZV9saXN0X2luOiBWZWM8YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4gPSBfYWlkbF9kYXRhLnJlYWQoKT87CisgICAgICAgIGxldCBtdXQgX2FyZ19pZmFjZV9saXN0X291dDogVmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4gPSBEZWZhdWx0OjpkZWZhdWx0KCk7CisgICAgICAgIGxldCBtdXQgX2FyZ19pZmFjZV9saXN0X2lub3V0OiBWZWM8YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4gPSBfYWlkbF9kYXRhLnJlYWQoKT87CisgICAgICAgIGxldCBfYXJnX251bGxhYmxlX2lmYWNlX2xpc3RfaW46IE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+Pj4gPSBfYWlkbF9kYXRhLnJlYWQoKT87CisgICAgICAgIGxldCBtdXQgX2FyZ19udWxsYWJsZV9pZmFjZV9saXN0X291dDogT3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+PiA9IERlZmF1bHQ6OmRlZmF1bHQoKTsKKyAgICAgICAgbGV0IG11dCBfYXJnX251bGxhYmxlX2lmYWNlX2xpc3RfaW5vdXQ6IE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+Pj4gPSBfYWlkbF9kYXRhLnJlYWQoKT87CisgICAgICAgIGxldCBfYWlkbF9yZXR1cm4gPSBfYWlkbF9zZXJ2aWNlLm1ldGhvZFdpdGhJbnRlcmZhY2VzKCZfYXJnX2lmYWNlLCBfYXJnX251bGxhYmxlX2lmYWNlLmFzX3JlZigpLCAmX2FyZ19pZmFjZV9saXN0X2luLCAmbXV0IF9hcmdfaWZhY2VfbGlzdF9vdXQsICZtdXQgX2FyZ19pZmFjZV9saXN0X2lub3V0LCBfYXJnX251bGxhYmxlX2lmYWNlX2xpc3RfaW4uYXNfZGVyZWYoKSwgJm11dCBfYXJnX251bGxhYmxlX2lmYWNlX2xpc3Rfb3V0LCAmbXV0IF9hcmdfbnVsbGFibGVfaWZhY2VfbGlzdF9pbm91dCk7CisgICAgICAgIG1hdGNoICZfYWlkbF9yZXR1cm4geworICAgICAgICAgIE9rKF9haWRsX3JldHVybikgPT4geworICAgICAgICAgICAgX2FpZGxfcmVwbHkud3JpdGUoJmJpbmRlcjo6U3RhdHVzOjpmcm9tKGJpbmRlcjo6U3RhdHVzQ29kZTo6T0spKT87CisgICAgICAgICAgICBfYWlkbF9yZXBseS53cml0ZShfYWlkbF9yZXR1cm4pPzsKKyAgICAgICAgICAgIF9haWRsX3JlcGx5LndyaXRlKCZfYXJnX2lmYWNlX2xpc3Rfb3V0KT87CisgICAgICAgICAgICBfYWlkbF9yZXBseS53cml0ZSgmX2FyZ19pZmFjZV9saXN0X2lub3V0KT87CisgICAgICAgICAgICBfYWlkbF9yZXBseS53cml0ZSgmX2FyZ19udWxsYWJsZV9pZmFjZV9saXN0X291dCk/OworICAgICAgICAgICAgX2FpZGxfcmVwbHkud3JpdGUoJl9hcmdfbnVsbGFibGVfaWZhY2VfbGlzdF9pbm91dCk/OworICAgICAgICAgIH0KKyAgICAgICAgICBFcnIoX2FpZGxfc3RhdHVzKSA9PiBfYWlkbF9yZXBseS53cml0ZShfYWlkbF9zdGF0dXMpPworICAgICAgICB9CisgICAgICAgIE9rKCgpKQorICAgICAgfQorICAgICAgXyA9PiBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKQorICAgIH0KKyAgfQorfQorcHViIG1vZCBNeVBhcmNlbGFibGUgeworICAjW2Rlcml2ZShEZWJ1ZyldCisgIHB1YiBzdHJ1Y3QgTXlQYXJjZWxhYmxlIHsKKyAgICBwdWIgaWZhY2U6IE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+PiwKKyAgICBwdWIgbnVsbGFibGVfaWZhY2U6IE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+PiwKKyAgICBwdWIgaWZhY2VfbGlzdDogVmVjPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+LAorICAgIHB1YiBudWxsYWJsZV9pZmFjZV9saXN0OiBPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4+LAorICB9CisgIGltcGwgRGVmYXVsdCBmb3IgTXlQYXJjZWxhYmxlIHsKKyAgICBmbiBkZWZhdWx0KCkgLT4gU2VsZiB7CisgICAgICBTZWxmIHsKKyAgICAgICAgaWZhY2U6IERlZmF1bHQ6OmRlZmF1bHQoKSwKKyAgICAgICAgbnVsbGFibGVfaWZhY2U6IERlZmF1bHQ6OmRlZmF1bHQoKSwKKyAgICAgICAgaWZhY2VfbGlzdDogRGVmYXVsdDo6ZGVmYXVsdCgpLAorICAgICAgICBudWxsYWJsZV9pZmFjZV9saXN0OiBEZWZhdWx0OjpkZWZhdWx0KCksCisgICAgICB9CisgICAgfQorICB9CisgIGltcGwgYmluZGVyOjpQYXJjZWxhYmxlIGZvciBNeVBhcmNlbGFibGUgeworICAgIGZuIHdyaXRlX3RvX3BhcmNlbCgmc2VsZiwgcGFyY2VsOiAmbXV0IGJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsKSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsKKyAgICAgIHBhcmNlbC5zaXplZF93cml0ZSh8c3VicGFyY2VsfCB7CisgICAgICAgIGxldCBfX2ZpZWxkX3JlZiA9IHNlbGYuaWZhY2UuYXNfcmVmKCkub2tfb3IoYmluZGVyOjpTdGF0dXNDb2RlOjpVTkVYUEVDVEVEX05VTEwpPzsKKyAgICAgICAgc3VicGFyY2VsLndyaXRlKF9fZmllbGRfcmVmKT87CisgICAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5udWxsYWJsZV9pZmFjZSk/OworICAgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuaWZhY2VfbGlzdCk/OworICAgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYubnVsbGFibGVfaWZhY2VfbGlzdCk/OworICAgICAgICBPaygoKSkKKyAgICAgIH0pCisgICAgfQorICAgIGZuIHJlYWRfZnJvbV9wYXJjZWwoJm11dCBzZWxmLCBwYXJjZWw6ICZiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbCkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CisgICAgICBwYXJjZWwuc2l6ZWRfcmVhZCh8c3VicGFyY2VsfCB7CisgICAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICAgIHNlbGYuaWZhY2UgPSBTb21lKHN1YnBhcmNlbC5yZWFkKCk/KTsKKyAgICAgICAgfQorICAgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgICBzZWxmLm51bGxhYmxlX2lmYWNlID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICAgIH0KKyAgICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgICAgc2VsZi5pZmFjZV9saXN0ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICAgIH0KKyAgICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgICAgc2VsZi5udWxsYWJsZV9pZmFjZV9saXN0ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICAgIH0KKyAgICAgICAgT2soKCkpCisgICAgICB9KQorICAgIH0KKyAgfQorICBiaW5kZXI6OmltcGxfc2VyaWFsaXplX2Zvcl9wYXJjZWxhYmxlIShNeVBhcmNlbGFibGUpOworICBiaW5kZXI6OmltcGxfZGVzZXJpYWxpemVfZm9yX3BhcmNlbGFibGUhKE15UGFyY2VsYWJsZSk7CisgIGltcGwgYmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsYWJsZU1ldGFkYXRhIGZvciBNeVBhcmNlbGFibGUgeworICAgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHsgImFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLk15UGFyY2VsYWJsZSIgfQorICB9Cit9CitwdWIgbW9kIE15VW5pb24geworICAjW2Rlcml2ZShEZWJ1ZyldCisgIHB1YiBlbnVtIE15VW5pb24geworICAgIElmYWNlKE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+PiksCisgICAgTnVsbGFibGVfaWZhY2UoT3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+KSwKKyAgICBJZmFjZV9saXN0KFZlYzxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+PiksCisgICAgTnVsbGFibGVfaWZhY2VfbGlzdChPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4+KSwKKyAgfQorICBpbXBsIERlZmF1bHQgZm9yIE15VW5pb24geworICAgIGZuIGRlZmF1bHQoKSAtPiBTZWxmIHsKKyAgICAgIFNlbGY6OklmYWNlKERlZmF1bHQ6OmRlZmF1bHQoKSkKKyAgICB9CisgIH0KKyAgaW1wbCBiaW5kZXI6OlBhcmNlbGFibGUgZm9yIE15VW5pb24geworICAgIGZuIHdyaXRlX3RvX3BhcmNlbCgmc2VsZiwgcGFyY2VsOiAmbXV0IGJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsKSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsKKyAgICAgIG1hdGNoIHNlbGYgeworICAgICAgICBTZWxmOjpJZmFjZSh2KSA9PiB7CisgICAgICAgICAgcGFyY2VsLndyaXRlKCYwaTMyKT87CisgICAgICAgICAgbGV0IF9fZmllbGRfcmVmID0gdi5hc19yZWYoKS5va19vcihiaW5kZXI6OlN0YXR1c0NvZGU6OlVORVhQRUNURURfTlVMTCk/OworICAgICAgICAgIHBhcmNlbC53cml0ZShfX2ZpZWxkX3JlZikKKyAgICAgICAgfQorICAgICAgICBTZWxmOjpOdWxsYWJsZV9pZmFjZSh2KSA9PiB7CisgICAgICAgICAgcGFyY2VsLndyaXRlKCYxaTMyKT87CisgICAgICAgICAgcGFyY2VsLndyaXRlKHYpCisgICAgICAgIH0KKyAgICAgICAgU2VsZjo6SWZhY2VfbGlzdCh2KSA9PiB7CisgICAgICAgICAgcGFyY2VsLndyaXRlKCYyaTMyKT87CisgICAgICAgICAgcGFyY2VsLndyaXRlKHYpCisgICAgICAgIH0KKyAgICAgICAgU2VsZjo6TnVsbGFibGVfaWZhY2VfbGlzdCh2KSA9PiB7CisgICAgICAgICAgcGFyY2VsLndyaXRlKCYzaTMyKT87CisgICAgICAgICAgcGFyY2VsLndyaXRlKHYpCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZm4gcmVhZF9mcm9tX3BhcmNlbCgmbXV0IHNlbGYsIHBhcmNlbDogJmJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsKSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsKKyAgICAgIGxldCB0YWc6IGkzMiA9IHBhcmNlbC5yZWFkKCk/OworICAgICAgbWF0Y2ggdGFnIHsKKyAgICAgICAgMCA9PiB7CisgICAgICAgICAgbGV0IHZhbHVlOiBPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4gPSBTb21lKHBhcmNlbC5yZWFkKCk/KTsKKyAgICAgICAgICAqc2VsZiA9IFNlbGY6OklmYWNlKHZhbHVlKTsKKyAgICAgICAgICBPaygoKSkKKyAgICAgICAgfQorICAgICAgICAxID0+IHsKKyAgICAgICAgICBsZXQgdmFsdWU6IE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+PiA9IHBhcmNlbC5yZWFkKCk/OworICAgICAgICAgICpzZWxmID0gU2VsZjo6TnVsbGFibGVfaWZhY2UodmFsdWUpOworICAgICAgICAgIE9rKCgpKQorICAgICAgICB9CisgICAgICAgIDIgPT4geworICAgICAgICAgIGxldCB2YWx1ZTogVmVjPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+ID0gcGFyY2VsLnJlYWQoKT87CisgICAgICAgICAgKnNlbGYgPSBTZWxmOjpJZmFjZV9saXN0KHZhbHVlKTsKKyAgICAgICAgICBPaygoKSkKKyAgICAgICAgfQorICAgICAgICAzID0+IHsKKyAgICAgICAgICBsZXQgdmFsdWU6IE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+Pj4gPSBwYXJjZWwucmVhZCgpPzsKKyAgICAgICAgICAqc2VsZiA9IFNlbGY6Ok51bGxhYmxlX2lmYWNlX2xpc3QodmFsdWUpOworICAgICAgICAgIE9rKCgpKQorICAgICAgICB9CisgICAgICAgIF8gPT4geworICAgICAgICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OkJBRF9WQUxVRSkKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBiaW5kZXI6OmltcGxfc2VyaWFsaXplX2Zvcl9wYXJjZWxhYmxlIShNeVVuaW9uKTsKKyAgYmluZGVyOjppbXBsX2Rlc2VyaWFsaXplX2Zvcl9wYXJjZWxhYmxlIShNeVVuaW9uKTsKKyAgaW1wbCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWxhYmxlTWV0YWRhdGEgZm9yIE15VW5pb24geworICAgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHsgImFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLk15VW5pb24iIH0KKyAgfQorICBwdWIgbW9kIFRhZyB7CisgICAgIyFbYWxsb3cobm9uX3VwcGVyX2Nhc2VfZ2xvYmFscyldCisgICAgdXNlIGJpbmRlcjo6ZGVjbGFyZV9iaW5kZXJfZW51bTsKKyAgICBkZWNsYXJlX2JpbmRlcl9lbnVtISB7CisgICAgICBUYWcgOiBbaTMyOyA0XSB7CisgICAgICAgIGlmYWNlID0gMCwKKyAgICAgICAgbnVsbGFibGVfaWZhY2UgPSAxLAorICAgICAgICBpZmFjZV9saXN0ID0gMiwKKyAgICAgICAgbnVsbGFibGVfaWZhY2VfbGlzdCA9IDMsCisgICAgICB9CisgICAgfQorICB9Cit9CitwdWIoY3JhdGUpIG1vZCBtYW5nbGVkIHsKKyBwdWIgdXNlIHN1cGVyOjpMaXN0T2ZJbnRlcmZhY2VzIGFzIF83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlczsKKyBwdWIgdXNlIHN1cGVyOjpJRW1wdHlJbnRlcmZhY2U6OklFbXB0eUludGVyZmFjZSBhcyBfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlOworIHB1YiB1c2Ugc3VwZXI6OklNeUludGVyZmFjZTo6SU15SW50ZXJmYWNlIGFzIF83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xMl9JTXlJbnRlcmZhY2U7CisgcHViIHVzZSBzdXBlcjo6TXlQYXJjZWxhYmxlOjpNeVBhcmNlbGFibGUgYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzEyX015UGFyY2VsYWJsZTsKKyBwdWIgdXNlIHN1cGVyOjpNeVVuaW9uOjpNeVVuaW9uIGFzIF83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc183X015VW5pb247CisgcHViIHVzZSBzdXBlcjo6TXlVbmlvbjo6VGFnOjpUYWcgYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzdfTXlVbmlvbl8zX1RhZzsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0xpc3RPZkludGVyZmFjZXMucnMuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0xpc3RPZkludGVyZmFjZXMucnMuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTY1YzlhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvTGlzdE9mSW50ZXJmYWNlcy5ycy5kCkBAIC0wLDAgKzEsMiBAQAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9MaXN0T2ZJbnRlcmZhY2VzLnJzIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvTGlzdE9mSW50ZXJmYWNlcy5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9Mb25nRW51bS5ycyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0xvbmdFbnVtLnJzCmluZGV4IDU0OGI3MTEuLmFlOTM4MjEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0xvbmdFbnVtLnJzCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0xvbmdFbnVtLnJzCkBAIC0xLDggKzEsMTQgQEAKKyMhW2ZvcmJpZCh1bnNhZmVfY29kZSldCisjIVtydXN0Zm10Ojpza2lwXQogIyFbYWxsb3cobm9uX3VwcGVyX2Nhc2VfZ2xvYmFscyldCiB1c2UgYmluZGVyOjpkZWNsYXJlX2JpbmRlcl9lbnVtOwotZGVjbGFyZV9iaW5kZXJfZW51bSEgeyBMb25nRW51bSA6IGk2NCB7Ci0gIEZPTyA9IDEwMDAwMDAwMDAwMCwKLSAgQkFSID0gMjAwMDAwMDAwMDAwLAotICBCQVogPSAyMDAwMDAwMDAwMDEsCi19IH0KLXB1YihjcmF0ZSkgbW9kIG1hbmdsZWQgeyBwdWIgdXNlIHN1cGVyOjpMb25nRW51bSBhcyBfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW07IH0KK2RlY2xhcmVfYmluZGVyX2VudW0hIHsKKyAgTG9uZ0VudW0gOiBbaTY0OyAzXSB7CisgICAgRk9PID0gMTAwMDAwMDAwMDAwLAorICAgIEJBUiA9IDIwMDAwMDAwMDAwMCwKKyAgICBCQVogPSAyMDAwMDAwMDAwMDEsCisgIH0KK30KK3B1YihjcmF0ZSkgbW9kIG1hbmdsZWQgeworIHB1YiB1c2Ugc3VwZXI6OkxvbmdFbnVtIGFzIF83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL090aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nLnJzIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmcucnMKaW5kZXggZDU3Nzc1Zi4uMGZhY2I0YiAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmcucnMKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmcucnMKQEAgLTEsOCArMSw5IEBACisjIVtmb3JiaWQodW5zYWZlX2NvZGUpXQorIyFbcnVzdGZtdDo6c2tpcF0KICNbZGVyaXZlKERlYnVnKV0KIHB1YiBzdHJ1Y3QgT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmcgewogICBwdWIgZmllbGQ6IFN0cmluZywKIH0KLXB1YihjcmF0ZSkgbW9kIG1hbmdsZWQgeyBwdWIgdXNlIHN1cGVyOjpPdGhlclBhcmNlbGFibGVGb3JUb1N0cmluZyBhcyBfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzI2X090aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nOyB9CiBpbXBsIERlZmF1bHQgZm9yIE90aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nIHsKICAgZm4gZGVmYXVsdCgpIC0+IFNlbGYgewogICAgIFNlbGYgewpAQCAtMTAsNTIgKzExLDI3IEBACiAgICAgfQogICB9CiB9Ci1pbXBsIGJpbmRlcjo6cGFyY2VsOjpTZXJpYWxpemUgZm9yIE90aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nIHsKLSAgZm4gc2VyaWFsaXplKCZzZWxmLCBwYXJjZWw6ICZtdXQgYmluZGVyOjpwYXJjZWw6OlBhcmNlbCkgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKLSAgICA8U2VsZiBhcyBiaW5kZXI6OnBhcmNlbDo6U2VyaWFsaXplT3B0aW9uPjo6c2VyaWFsaXplX29wdGlvbihTb21lKHNlbGYpLCBwYXJjZWwpCi0gIH0KLX0KLWltcGwgYmluZGVyOjpwYXJjZWw6OlNlcmlhbGl6ZUFycmF5IGZvciBPdGhlclBhcmNlbGFibGVGb3JUb1N0cmluZyB7fQotaW1wbCBiaW5kZXI6OnBhcmNlbDo6U2VyaWFsaXplT3B0aW9uIGZvciBPdGhlclBhcmNlbGFibGVGb3JUb1N0cmluZyB7Ci0gIGZuIHNlcmlhbGl6ZV9vcHRpb24odGhpczogT3B0aW9uPCZTZWxmPiwgcGFyY2VsOiAmbXV0IGJpbmRlcjo6cGFyY2VsOjpQYXJjZWwpIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7Ci0gICAgbGV0IHRoaXMgPSBpZiBsZXQgU29tZSh0aGlzKSA9IHRoaXMgewotICAgICAgcGFyY2VsLndyaXRlKCYxaTMyKT87Ci0gICAgICB0aGlzCi0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBwYXJjZWwud3JpdGUoJjBpMzIpOwotICAgIH07CitpbXBsIGJpbmRlcjo6UGFyY2VsYWJsZSBmb3IgT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmcgeworICBmbiB3cml0ZV90b19wYXJjZWwoJnNlbGYsIHBhcmNlbDogJm11dCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbCkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CiAgICAgcGFyY2VsLnNpemVkX3dyaXRlKHxzdWJwYXJjZWx8IHsKLSAgICAgIHN1YnBhcmNlbC53cml0ZSgmdGhpcy5maWVsZCk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmZpZWxkKT87CisgICAgICBPaygoKSkKKyAgICB9KQorICB9CisgIGZuIHJlYWRfZnJvbV9wYXJjZWwoJm11dCBzZWxmLCBwYXJjZWw6ICZiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbCkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CisgICAgcGFyY2VsLnNpemVkX3JlYWQofHN1YnBhcmNlbHwgeworICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuZmllbGQgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KICAgICAgIE9rKCgpKQogICAgIH0pCiAgIH0KIH0KLWltcGwgYmluZGVyOjpwYXJjZWw6OkRlc2VyaWFsaXplIGZvciBPdGhlclBhcmNlbGFibGVGb3JUb1N0cmluZyB7Ci0gIGZuIGRlc2VyaWFsaXplKHBhcmNlbDogJmJpbmRlcjo6cGFyY2VsOjpQYXJjZWwpIC0+IGJpbmRlcjo6UmVzdWx0PFNlbGY+IHsKLSAgICA8U2VsZiBhcyBiaW5kZXI6OnBhcmNlbDo6RGVzZXJpYWxpemVPcHRpb24+OjpkZXNlcmlhbGl6ZV9vcHRpb24ocGFyY2VsKQotICAgICAgIC50cmFuc3Bvc2UoKQotICAgICAgIC51bndyYXBfb3IoRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5FWFBFQ1RFRF9OVUxMKSkKLSAgfQorYmluZGVyOjppbXBsX3NlcmlhbGl6ZV9mb3JfcGFyY2VsYWJsZSEoT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmcpOworYmluZGVyOjppbXBsX2Rlc2VyaWFsaXplX2Zvcl9wYXJjZWxhYmxlIShPdGhlclBhcmNlbGFibGVGb3JUb1N0cmluZyk7CitpbXBsIGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbGFibGVNZXRhZGF0YSBmb3IgT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmcgeworICBmbiBnZXRfZGVzY3JpcHRvcigpIC0+ICYnc3RhdGljIHN0ciB7ICJhbmRyb2lkLmFpZGwudGVzdHMuT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmciIH0KIH0KLWltcGwgYmluZGVyOjpwYXJjZWw6OkRlc2VyaWFsaXplQXJyYXkgZm9yIE90aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nIHt9Ci1pbXBsIGJpbmRlcjo6cGFyY2VsOjpEZXNlcmlhbGl6ZU9wdGlvbiBmb3IgT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmcgewotICBmbiBkZXNlcmlhbGl6ZV9vcHRpb24ocGFyY2VsOiAmYmluZGVyOjpwYXJjZWw6OlBhcmNlbCkgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFNlbGY+PiB7Ci0gICAgbGV0IHN0YXR1czogaTMyID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgc3RhdHVzID09IDAgeyByZXR1cm4gT2soTm9uZSk7IH0KLSAgICBsZXQgc3RhcnRfcG9zID0gcGFyY2VsLmdldF9kYXRhX3Bvc2l0aW9uKCk7Ci0gICAgbGV0IHBhcmNlbGFibGVfc2l6ZTogaTMyID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgcGFyY2VsYWJsZV9zaXplIDwgMCB7IHJldHVybiBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpCQURfVkFMVUUpOyB9Ci0gICAgaWYgc3RhcnRfcG9zLmNoZWNrZWRfYWRkKHBhcmNlbGFibGVfc2l6ZSkuaXNfbm9uZSgpIHsKLSAgICAgIHJldHVybiBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpCQURfVkFMVUUpOwotICAgIH0KLSAgICBsZXQgbXV0IHJlc3VsdCA9IFNlbGY6OmRlZmF1bHQoKTsKLSAgICBpZiAocGFyY2VsLmdldF9kYXRhX3Bvc2l0aW9uKCkgLSBzdGFydF9wb3MpID09IHBhcmNlbGFibGVfc2l6ZSB7Ci0gICAgICByZXR1cm4gT2soU29tZShyZXN1bHQpKTsKLSAgICB9Ci0gICAgcmVzdWx0LmZpZWxkID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgdW5zYWZlIHsKLSAgICAgIHBhcmNlbC5zZXRfZGF0YV9wb3NpdGlvbihzdGFydF9wb3MgKyBwYXJjZWxhYmxlX3NpemUpPzsKLSAgICB9Ci0gICAgT2soU29tZShyZXN1bHQpKQotICB9CitwdWIoY3JhdGUpIG1vZCBtYW5nbGVkIHsKKyBwdWIgdXNlIHN1cGVyOjpPdGhlclBhcmNlbGFibGVGb3JUb1N0cmluZyBhcyBfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzI2X090aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nOwogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvUGFyY2VsYWJsZUZvclRvU3RyaW5nLnJzIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvUGFyY2VsYWJsZUZvclRvU3RyaW5nLnJzCmluZGV4IDU4YjdkMjguLjc1M2JhMzYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1BhcmNlbGFibGVGb3JUb1N0cmluZy5ycworKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9QYXJjZWxhYmxlRm9yVG9TdHJpbmcucnMKQEAgLTEsMyArMSw1IEBACisjIVtmb3JiaWQodW5zYWZlX2NvZGUpXQorIyFbcnVzdGZtdDo6c2tpcF0KICNbZGVyaXZlKERlYnVnKV0KIHB1YiBzdHJ1Y3QgUGFyY2VsYWJsZUZvclRvU3RyaW5nIHsKICAgcHViIGludFZhbHVlOiBpMzIsCkBAIC0yNCw3ICsyNiw2IEBACiAgIHB1YiBwYXJjZWxhYmxlR2VuZXJpYzogaTMyLAogICBwdWIgdW5pb25WYWx1ZTogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNV9VbmlvbiwKIH0KLXB1YihjcmF0ZSkgbW9kIG1hbmdsZWQgeyBwdWIgdXNlIHN1cGVyOjpQYXJjZWxhYmxlRm9yVG9TdHJpbmcgYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18yMV9QYXJjZWxhYmxlRm9yVG9TdHJpbmc7IH0KIGltcGwgRGVmYXVsdCBmb3IgUGFyY2VsYWJsZUZvclRvU3RyaW5nIHsKICAgZm4gZGVmYXVsdCgpIC0+IFNlbGYgewogICAgIFNlbGYgewpAQCAtNTQsMTYyICs1NSwxMTUgQEAKICAgICB9CiAgIH0KIH0KLWltcGwgYmluZGVyOjpwYXJjZWw6OlNlcmlhbGl6ZSBmb3IgUGFyY2VsYWJsZUZvclRvU3RyaW5nIHsKLSAgZm4gc2VyaWFsaXplKCZzZWxmLCBwYXJjZWw6ICZtdXQgYmluZGVyOjpwYXJjZWw6OlBhcmNlbCkgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKLSAgICA8U2VsZiBhcyBiaW5kZXI6OnBhcmNlbDo6U2VyaWFsaXplT3B0aW9uPjo6c2VyaWFsaXplX29wdGlvbihTb21lKHNlbGYpLCBwYXJjZWwpCi0gIH0KLX0KLWltcGwgYmluZGVyOjpwYXJjZWw6OlNlcmlhbGl6ZUFycmF5IGZvciBQYXJjZWxhYmxlRm9yVG9TdHJpbmcge30KLWltcGwgYmluZGVyOjpwYXJjZWw6OlNlcmlhbGl6ZU9wdGlvbiBmb3IgUGFyY2VsYWJsZUZvclRvU3RyaW5nIHsKLSAgZm4gc2VyaWFsaXplX29wdGlvbih0aGlzOiBPcHRpb248JlNlbGY+LCBwYXJjZWw6ICZtdXQgYmluZGVyOjpwYXJjZWw6OlBhcmNlbCkgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKLSAgICBsZXQgdGhpcyA9IGlmIGxldCBTb21lKHRoaXMpID0gdGhpcyB7Ci0gICAgICBwYXJjZWwud3JpdGUoJjFpMzIpPzsKLSAgICAgIHRoaXMKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIHBhcmNlbC53cml0ZSgmMGkzMik7Ci0gICAgfTsKK2ltcGwgYmluZGVyOjpQYXJjZWxhYmxlIGZvciBQYXJjZWxhYmxlRm9yVG9TdHJpbmcgeworICBmbiB3cml0ZV90b19wYXJjZWwoJnNlbGYsIHBhcmNlbDogJm11dCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbCkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CiAgICAgcGFyY2VsLnNpemVkX3dyaXRlKHxzdWJwYXJjZWx8IHsKLSAgICAgIHN1YnBhcmNlbC53cml0ZSgmdGhpcy5pbnRWYWx1ZSk/OwotICAgICAgc3VicGFyY2VsLndyaXRlKCZ0aGlzLmludEFycmF5KT87Ci0gICAgICBzdWJwYXJjZWwud3JpdGUoJnRoaXMubG9uZ1ZhbHVlKT87Ci0gICAgICBzdWJwYXJjZWwud3JpdGUoJnRoaXMubG9uZ0FycmF5KT87Ci0gICAgICBzdWJwYXJjZWwud3JpdGUoJnRoaXMuZG91YmxlVmFsdWUpPzsKLSAgICAgIHN1YnBhcmNlbC53cml0ZSgmdGhpcy5kb3VibGVBcnJheSk/OwotICAgICAgc3VicGFyY2VsLndyaXRlKCZ0aGlzLmZsb2F0VmFsdWUpPzsKLSAgICAgIHN1YnBhcmNlbC53cml0ZSgmdGhpcy5mbG9hdEFycmF5KT87Ci0gICAgICBzdWJwYXJjZWwud3JpdGUoJnRoaXMuYnl0ZVZhbHVlKT87Ci0gICAgICBzdWJwYXJjZWwud3JpdGUoJnRoaXMuYnl0ZUFycmF5KT87Ci0gICAgICBzdWJwYXJjZWwud3JpdGUoJnRoaXMuYm9vbGVhblZhbHVlKT87Ci0gICAgICBzdWJwYXJjZWwud3JpdGUoJnRoaXMuYm9vbGVhbkFycmF5KT87Ci0gICAgICBzdWJwYXJjZWwud3JpdGUoJnRoaXMuc3RyaW5nVmFsdWUpPzsKLSAgICAgIHN1YnBhcmNlbC53cml0ZSgmdGhpcy5zdHJpbmdBcnJheSk/OwotICAgICAgc3VicGFyY2VsLndyaXRlKCZ0aGlzLnN0cmluZ0xpc3QpPzsKLSAgICAgIHN1YnBhcmNlbC53cml0ZSgmdGhpcy5wYXJjZWxhYmxlVmFsdWUpPzsKLSAgICAgIHN1YnBhcmNlbC53cml0ZSgmdGhpcy5wYXJjZWxhYmxlQXJyYXkpPzsKLSAgICAgIHN1YnBhcmNlbC53cml0ZSgmdGhpcy5lbnVtVmFsdWUpPzsKLSAgICAgIHN1YnBhcmNlbC53cml0ZSgmdGhpcy5lbnVtQXJyYXkpPzsKLSAgICAgIHN1YnBhcmNlbC53cml0ZSgmdGhpcy5udWxsQXJyYXkpPzsKLSAgICAgIHN1YnBhcmNlbC53cml0ZSgmdGhpcy5udWxsTGlzdCk/OwotICAgICAgc3VicGFyY2VsLndyaXRlKCZ0aGlzLnBhcmNlbGFibGVHZW5lcmljKT87Ci0gICAgICBzdWJwYXJjZWwud3JpdGUoJnRoaXMudW5pb25WYWx1ZSk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmludFZhbHVlKT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuaW50QXJyYXkpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5sb25nVmFsdWUpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5sb25nQXJyYXkpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5kb3VibGVWYWx1ZSk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmRvdWJsZUFycmF5KT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuZmxvYXRWYWx1ZSk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmZsb2F0QXJyYXkpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5ieXRlVmFsdWUpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5ieXRlQXJyYXkpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5ib29sZWFuVmFsdWUpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5ib29sZWFuQXJyYXkpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5zdHJpbmdWYWx1ZSk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLnN0cmluZ0FycmF5KT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuc3RyaW5nTGlzdCk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLnBhcmNlbGFibGVWYWx1ZSk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLnBhcmNlbGFibGVBcnJheSk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmVudW1WYWx1ZSk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmVudW1BcnJheSk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLm51bGxBcnJheSk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLm51bGxMaXN0KT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYucGFyY2VsYWJsZUdlbmVyaWMpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi51bmlvblZhbHVlKT87CisgICAgICBPaygoKSkKKyAgICB9KQorICB9CisgIGZuIHJlYWRfZnJvbV9wYXJjZWwoJm11dCBzZWxmLCBwYXJjZWw6ICZiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbCkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CisgICAgcGFyY2VsLnNpemVkX3JlYWQofHN1YnBhcmNlbHwgeworICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuaW50VmFsdWUgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmludEFycmF5ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5sb25nVmFsdWUgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmxvbmdBcnJheSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuZG91YmxlVmFsdWUgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmRvdWJsZUFycmF5ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5mbG9hdFZhbHVlID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5mbG9hdEFycmF5ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5ieXRlVmFsdWUgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmJ5dGVBcnJheSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuYm9vbGVhblZhbHVlID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5ib29sZWFuQXJyYXkgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLnN0cmluZ1ZhbHVlID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5zdHJpbmdBcnJheSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuc3RyaW5nTGlzdCA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYucGFyY2VsYWJsZVZhbHVlID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5wYXJjZWxhYmxlQXJyYXkgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmVudW1WYWx1ZSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuZW51bUFycmF5ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5udWxsQXJyYXkgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLm51bGxMaXN0ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5wYXJjZWxhYmxlR2VuZXJpYyA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYudW5pb25WYWx1ZSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQogICAgICAgT2soKCkpCiAgICAgfSkKICAgfQogfQotaW1wbCBiaW5kZXI6OnBhcmNlbDo6RGVzZXJpYWxpemUgZm9yIFBhcmNlbGFibGVGb3JUb1N0cmluZyB7Ci0gIGZuIGRlc2VyaWFsaXplKHBhcmNlbDogJmJpbmRlcjo6cGFyY2VsOjpQYXJjZWwpIC0+IGJpbmRlcjo6UmVzdWx0PFNlbGY+IHsKLSAgICA8U2VsZiBhcyBiaW5kZXI6OnBhcmNlbDo6RGVzZXJpYWxpemVPcHRpb24+OjpkZXNlcmlhbGl6ZV9vcHRpb24ocGFyY2VsKQotICAgICAgIC50cmFuc3Bvc2UoKQotICAgICAgIC51bndyYXBfb3IoRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5FWFBFQ1RFRF9OVUxMKSkKLSAgfQorYmluZGVyOjppbXBsX3NlcmlhbGl6ZV9mb3JfcGFyY2VsYWJsZSEoUGFyY2VsYWJsZUZvclRvU3RyaW5nKTsKK2JpbmRlcjo6aW1wbF9kZXNlcmlhbGl6ZV9mb3JfcGFyY2VsYWJsZSEoUGFyY2VsYWJsZUZvclRvU3RyaW5nKTsKK2ltcGwgYmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsYWJsZU1ldGFkYXRhIGZvciBQYXJjZWxhYmxlRm9yVG9TdHJpbmcgeworICBmbiBnZXRfZGVzY3JpcHRvcigpIC0+ICYnc3RhdGljIHN0ciB7ICJhbmRyb2lkLmFpZGwudGVzdHMuUGFyY2VsYWJsZUZvclRvU3RyaW5nIiB9CiB9Ci1pbXBsIGJpbmRlcjo6cGFyY2VsOjpEZXNlcmlhbGl6ZUFycmF5IGZvciBQYXJjZWxhYmxlRm9yVG9TdHJpbmcge30KLWltcGwgYmluZGVyOjpwYXJjZWw6OkRlc2VyaWFsaXplT3B0aW9uIGZvciBQYXJjZWxhYmxlRm9yVG9TdHJpbmcgewotICBmbiBkZXNlcmlhbGl6ZV9vcHRpb24ocGFyY2VsOiAmYmluZGVyOjpwYXJjZWw6OlBhcmNlbCkgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFNlbGY+PiB7Ci0gICAgbGV0IHN0YXR1czogaTMyID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgc3RhdHVzID09IDAgeyByZXR1cm4gT2soTm9uZSk7IH0KLSAgICBsZXQgc3RhcnRfcG9zID0gcGFyY2VsLmdldF9kYXRhX3Bvc2l0aW9uKCk7Ci0gICAgbGV0IHBhcmNlbGFibGVfc2l6ZTogaTMyID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgcGFyY2VsYWJsZV9zaXplIDwgMCB7IHJldHVybiBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpCQURfVkFMVUUpOyB9Ci0gICAgaWYgc3RhcnRfcG9zLmNoZWNrZWRfYWRkKHBhcmNlbGFibGVfc2l6ZSkuaXNfbm9uZSgpIHsKLSAgICAgIHJldHVybiBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpCQURfVkFMVUUpOwotICAgIH0KLSAgICBsZXQgbXV0IHJlc3VsdCA9IFNlbGY6OmRlZmF1bHQoKTsKLSAgICBpZiAocGFyY2VsLmdldF9kYXRhX3Bvc2l0aW9uKCkgLSBzdGFydF9wb3MpID09IHBhcmNlbGFibGVfc2l6ZSB7Ci0gICAgICByZXR1cm4gT2soU29tZShyZXN1bHQpKTsKLSAgICB9Ci0gICAgcmVzdWx0LmludFZhbHVlID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5pbnRBcnJheSA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIChwYXJjZWwuZ2V0X2RhdGFfcG9zaXRpb24oKSAtIHN0YXJ0X3BvcykgPT0gcGFyY2VsYWJsZV9zaXplIHsKLSAgICAgIHJldHVybiBPayhTb21lKHJlc3VsdCkpOwotICAgIH0KLSAgICByZXN1bHQubG9uZ1ZhbHVlID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5sb25nQXJyYXkgPSBwYXJjZWwucmVhZCgpPzsKLSAgICBpZiAocGFyY2VsLmdldF9kYXRhX3Bvc2l0aW9uKCkgLSBzdGFydF9wb3MpID09IHBhcmNlbGFibGVfc2l6ZSB7Ci0gICAgICByZXR1cm4gT2soU29tZShyZXN1bHQpKTsKLSAgICB9Ci0gICAgcmVzdWx0LmRvdWJsZVZhbHVlID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5kb3VibGVBcnJheSA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIChwYXJjZWwuZ2V0X2RhdGFfcG9zaXRpb24oKSAtIHN0YXJ0X3BvcykgPT0gcGFyY2VsYWJsZV9zaXplIHsKLSAgICAgIHJldHVybiBPayhTb21lKHJlc3VsdCkpOwotICAgIH0KLSAgICByZXN1bHQuZmxvYXRWYWx1ZSA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIChwYXJjZWwuZ2V0X2RhdGFfcG9zaXRpb24oKSAtIHN0YXJ0X3BvcykgPT0gcGFyY2VsYWJsZV9zaXplIHsKLSAgICAgIHJldHVybiBPayhTb21lKHJlc3VsdCkpOwotICAgIH0KLSAgICByZXN1bHQuZmxvYXRBcnJheSA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIChwYXJjZWwuZ2V0X2RhdGFfcG9zaXRpb24oKSAtIHN0YXJ0X3BvcykgPT0gcGFyY2VsYWJsZV9zaXplIHsKLSAgICAgIHJldHVybiBPayhTb21lKHJlc3VsdCkpOwotICAgIH0KLSAgICByZXN1bHQuYnl0ZVZhbHVlID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5ieXRlQXJyYXkgPSBwYXJjZWwucmVhZCgpPzsKLSAgICBpZiAocGFyY2VsLmdldF9kYXRhX3Bvc2l0aW9uKCkgLSBzdGFydF9wb3MpID09IHBhcmNlbGFibGVfc2l6ZSB7Ci0gICAgICByZXR1cm4gT2soU29tZShyZXN1bHQpKTsKLSAgICB9Ci0gICAgcmVzdWx0LmJvb2xlYW5WYWx1ZSA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIChwYXJjZWwuZ2V0X2RhdGFfcG9zaXRpb24oKSAtIHN0YXJ0X3BvcykgPT0gcGFyY2VsYWJsZV9zaXplIHsKLSAgICAgIHJldHVybiBPayhTb21lKHJlc3VsdCkpOwotICAgIH0KLSAgICByZXN1bHQuYm9vbGVhbkFycmF5ID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5zdHJpbmdWYWx1ZSA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIChwYXJjZWwuZ2V0X2RhdGFfcG9zaXRpb24oKSAtIHN0YXJ0X3BvcykgPT0gcGFyY2VsYWJsZV9zaXplIHsKLSAgICAgIHJldHVybiBPayhTb21lKHJlc3VsdCkpOwotICAgIH0KLSAgICByZXN1bHQuc3RyaW5nQXJyYXkgPSBwYXJjZWwucmVhZCgpPzsKLSAgICBpZiAocGFyY2VsLmdldF9kYXRhX3Bvc2l0aW9uKCkgLSBzdGFydF9wb3MpID09IHBhcmNlbGFibGVfc2l6ZSB7Ci0gICAgICByZXR1cm4gT2soU29tZShyZXN1bHQpKTsKLSAgICB9Ci0gICAgcmVzdWx0LnN0cmluZ0xpc3QgPSBwYXJjZWwucmVhZCgpPzsKLSAgICBpZiAocGFyY2VsLmdldF9kYXRhX3Bvc2l0aW9uKCkgLSBzdGFydF9wb3MpID09IHBhcmNlbGFibGVfc2l6ZSB7Ci0gICAgICByZXR1cm4gT2soU29tZShyZXN1bHQpKTsKLSAgICB9Ci0gICAgcmVzdWx0LnBhcmNlbGFibGVWYWx1ZSA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIChwYXJjZWwuZ2V0X2RhdGFfcG9zaXRpb24oKSAtIHN0YXJ0X3BvcykgPT0gcGFyY2VsYWJsZV9zaXplIHsKLSAgICAgIHJldHVybiBPayhTb21lKHJlc3VsdCkpOwotICAgIH0KLSAgICByZXN1bHQucGFyY2VsYWJsZUFycmF5ID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5lbnVtVmFsdWUgPSBwYXJjZWwucmVhZCgpPzsKLSAgICBpZiAocGFyY2VsLmdldF9kYXRhX3Bvc2l0aW9uKCkgLSBzdGFydF9wb3MpID09IHBhcmNlbGFibGVfc2l6ZSB7Ci0gICAgICByZXR1cm4gT2soU29tZShyZXN1bHQpKTsKLSAgICB9Ci0gICAgcmVzdWx0LmVudW1BcnJheSA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIChwYXJjZWwuZ2V0X2RhdGFfcG9zaXRpb24oKSAtIHN0YXJ0X3BvcykgPT0gcGFyY2VsYWJsZV9zaXplIHsKLSAgICAgIHJldHVybiBPayhTb21lKHJlc3VsdCkpOwotICAgIH0KLSAgICByZXN1bHQubnVsbEFycmF5ID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5udWxsTGlzdCA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIChwYXJjZWwuZ2V0X2RhdGFfcG9zaXRpb24oKSAtIHN0YXJ0X3BvcykgPT0gcGFyY2VsYWJsZV9zaXplIHsKLSAgICAgIHJldHVybiBPayhTb21lKHJlc3VsdCkpOwotICAgIH0KLSAgICByZXN1bHQucGFyY2VsYWJsZUdlbmVyaWMgPSBwYXJjZWwucmVhZCgpPzsKLSAgICBpZiAocGFyY2VsLmdldF9kYXRhX3Bvc2l0aW9uKCkgLSBzdGFydF9wb3MpID09IHBhcmNlbGFibGVfc2l6ZSB7Ci0gICAgICByZXR1cm4gT2soU29tZShyZXN1bHQpKTsKLSAgICB9Ci0gICAgcmVzdWx0LnVuaW9uVmFsdWUgPSBwYXJjZWwucmVhZCgpPzsKLSAgICB1bnNhZmUgewotICAgICAgcGFyY2VsLnNldF9kYXRhX3Bvc2l0aW9uKHN0YXJ0X3BvcyArIHBhcmNlbGFibGVfc2l6ZSk/OwotICAgIH0KLSAgICBPayhTb21lKHJlc3VsdCkpCi0gIH0KK3B1YihjcmF0ZSkgbW9kIG1hbmdsZWQgeworIHB1YiB1c2Ugc3VwZXI6OlBhcmNlbGFibGVGb3JUb1N0cmluZyBhcyBfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzIxX1BhcmNlbGFibGVGb3JUb1N0cmluZzsKIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1BhcmNlbGFibGVGb3JUb1N0cmluZy5ycy5kIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvUGFyY2VsYWJsZUZvclRvU3RyaW5nLnJzLmQKaW5kZXggZGU0NjE3OS4uNTQ3MWJkMCAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvUGFyY2VsYWJsZUZvclRvU3RyaW5nLnJzLmQKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvUGFyY2VsYWJsZUZvclRvU3RyaW5nLnJzLmQKQEAgLTQsNCArNCw3IEBACiAgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9JbnRFbnVtLmFpZGwgXAogICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmcuYWlkbCBcCiAgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5haWRsIFwKLSAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL1VuaW9uLmFpZGwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL1VuaW9uLmFpZGwgXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvQnl0ZUVudW0uYWlkbCBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9Mb25nRW51bS5haWRsIFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0NvbnN0YW50RXhwcmVzc2lvbkVudW0uYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvUmVjdXJzaXZlTGlzdC5ycyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1JlY3Vyc2l2ZUxpc3QucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAzZjQ4ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1JlY3Vyc2l2ZUxpc3QucnMKQEAgLTAsMCArMSw0MyBAQAorIyFbZm9yYmlkKHVuc2FmZV9jb2RlKV0KKyMhW3J1c3RmbXQ6OnNraXBdCisjW2Rlcml2ZShEZWJ1ZyldCitwdWIgc3RydWN0IFJlY3Vyc2l2ZUxpc3QgeworICBwdWIgdmFsdWU6IGkzMiwKKyAgcHViIG5leHQ6IE9wdGlvbjxCb3g8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTNfUmVjdXJzaXZlTGlzdD4+LAorfQoraW1wbCBEZWZhdWx0IGZvciBSZWN1cnNpdmVMaXN0IHsKKyAgZm4gZGVmYXVsdCgpIC0+IFNlbGYgeworICAgIFNlbGYgeworICAgICAgdmFsdWU6IDAsCisgICAgICBuZXh0OiBEZWZhdWx0OjpkZWZhdWx0KCksCisgICAgfQorICB9Cit9CitpbXBsIGJpbmRlcjo6UGFyY2VsYWJsZSBmb3IgUmVjdXJzaXZlTGlzdCB7CisgIGZuIHdyaXRlX3RvX3BhcmNlbCgmc2VsZiwgcGFyY2VsOiAmbXV0IGJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsKSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsKKyAgICBwYXJjZWwuc2l6ZWRfd3JpdGUofHN1YnBhcmNlbHwgeworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLnZhbHVlKT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYubmV4dCk/OworICAgICAgT2soKCkpCisgICAgfSkKKyAgfQorICBmbiByZWFkX2Zyb21fcGFyY2VsKCZtdXQgc2VsZiwgcGFyY2VsOiAmYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWwpIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4geworICAgIHBhcmNlbC5zaXplZF9yZWFkKHxzdWJwYXJjZWx8IHsKKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLnZhbHVlID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5uZXh0ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBPaygoKSkKKyAgICB9KQorICB9Cit9CitiaW5kZXI6OmltcGxfc2VyaWFsaXplX2Zvcl9wYXJjZWxhYmxlIShSZWN1cnNpdmVMaXN0KTsKK2JpbmRlcjo6aW1wbF9kZXNlcmlhbGl6ZV9mb3JfcGFyY2VsYWJsZSEoUmVjdXJzaXZlTGlzdCk7CitpbXBsIGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbGFibGVNZXRhZGF0YSBmb3IgUmVjdXJzaXZlTGlzdCB7CisgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHsgImFuZHJvaWQuYWlkbC50ZXN0cy5SZWN1cnNpdmVMaXN0IiB9Cit9CitwdWIoY3JhdGUpIG1vZCBtYW5nbGVkIHsKKyBwdWIgdXNlIHN1cGVyOjpSZWN1cnNpdmVMaXN0IGFzIF83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTNfUmVjdXJzaXZlTGlzdDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1JlY3Vyc2l2ZUxpc3QucnMuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1JlY3Vyc2l2ZUxpc3QucnMuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGRkNmNmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvUmVjdXJzaXZlTGlzdC5ycy5kCkBAIC0wLDAgKzEsMiBAQAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9SZWN1cnNpdmVMaXN0LnJzIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvUmVjdXJzaXZlTGlzdC5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5ycyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1N0cnVjdHVyZWRQYXJjZWxhYmxlLnJzCmluZGV4IDcyYmM5OTguLmRmNjY2YjMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1N0cnVjdHVyZWRQYXJjZWxhYmxlLnJzCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1N0cnVjdHVyZWRQYXJjZWxhYmxlLnJzCkBAIC0xLDMgKzEsNSBAQAorIyFbZm9yYmlkKHVuc2FmZV9jb2RlKV0KKyMhW3J1c3RmbXQ6OnNraXBdCiAjW2Rlcml2ZShEZWJ1ZywgQ2xvbmUsIFBhcnRpYWxFcSldCiBwdWIgc3RydWN0IFN0cnVjdHVyZWRQYXJjZWxhYmxlIHsKICAgcHViIHNob3VsZENvbnRhaW5UaHJlZUZzOiBWZWM8aTMyPiwKQEAgLTMzLDYgKzM1LDggQEAKICAgcHViIGludDY0X21heDogaTY0LAogICBwdWIgaGV4SW50MzJfbmVnXzE6IGkzMiwKICAgcHViIGliaW5kZXI6IE9wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj4sCisgIHB1YiBlbXB0eTogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMjBfU3RydWN0dXJlZFBhcmNlbGFibGVfNV9FbXB0eSwKKyAgcHViIGludDhfMTogVmVjPHU4PiwKICAgcHViIGludDMyXzE6IFZlYzxpMzI+LAogICBwdWIgaW50NjRfMTogVmVjPGk2ND4sCiAgIHB1YiBoZXhJbnQzMl9wb3NfMTogaTMyLApAQCAtNTcsNyArNjEsNiBAQAogcHViIGNvbnN0IEJJVDA6IGkzMiA9IDE7CiBwdWIgY29uc3QgQklUMTogaTMyID0gMjsKIHB1YiBjb25zdCBCSVQyOiBpMzIgPSA0OwotcHViKGNyYXRlKSBtb2QgbWFuZ2xlZCB7IHB1YiB1c2Ugc3VwZXI6OlN0cnVjdHVyZWRQYXJjZWxhYmxlIGFzIF83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMjBfU3RydWN0dXJlZFBhcmNlbGFibGU7IH0KIGltcGwgRGVmYXVsdCBmb3IgU3RydWN0dXJlZFBhcmNlbGFibGUgewogICBmbiBkZWZhdWx0KCkgLT4gU2VsZiB7CiAgICAgU2VsZiB7CkBAIC03OCw4ICs4MSw4IEBACiAgICAgICBjaGFyRGVmYXVsdHNUb0M6ICdDJyBhcyB1MTYsCiAgICAgICBmbG9hdERlZmF1bHRzVG9QaTogMy4xNDAwMDBmMzIsCiAgICAgICBkb3VibGVXaXRoRGVmYXVsdDogLTMxNDAwMDAwMDAwMDAwMDAwMC4wMDAwMDBmNjQsCi0gICAgICBhcnJheURlZmF1bHRzVG8xMjM6IHZlYyF7MSwgMiwgM30sCi0gICAgICBhcnJheURlZmF1bHRzVG9FbXB0eTogdmVjIXt9LAorICAgICAgYXJyYXlEZWZhdWx0c1RvMTIzOiB2ZWMhWzEsIDIsIDNdLAorICAgICAgYXJyYXlEZWZhdWx0c1RvRW1wdHk6IHZlYyFbXSwKICAgICAgIGJvb2xEZWZhdWx0OiBmYWxzZSwKICAgICAgIGJ5dGVEZWZhdWx0OiAwLAogICAgICAgaW50RGVmYXVsdDogMCwKQEAgLTg3LDE1ICs5MCwxNyBAQAogICAgICAgZmxvYXREZWZhdWx0OiAwLjAwMDAwMGYzMiwKICAgICAgIGRvdWJsZURlZmF1bHQ6IDAuMDAwMDAwZjY0LAogICAgICAgY2hlY2tEb3VibGVGcm9tRmxvYXQ6IDMuMTQwMDAwZjY0LAotICAgICAgY2hlY2tTdHJpbmdBcnJheTE6IHZlYyF7ImEiLmludG8oKSwgImIiLmludG8oKX0sCi0gICAgICBjaGVja1N0cmluZ0FycmF5MjogdmVjIXsiYSIuaW50bygpLCAiYiIuaW50bygpfSwKKyAgICAgIGNoZWNrU3RyaW5nQXJyYXkxOiB2ZWMhWyJhIi5pbnRvKCksICJiIi5pbnRvKCldLAorICAgICAgY2hlY2tTdHJpbmdBcnJheTI6IHZlYyFbImEiLmludG8oKSwgImIiLmludG8oKV0sCiAgICAgICBpbnQzMl9taW46IC0yMTQ3NDgzNjQ4LAogICAgICAgaW50MzJfbWF4OiAyMTQ3NDgzNjQ3LAogICAgICAgaW50NjRfbWF4OiA5MjIzMzcyMDM2ODU0Nzc1ODA3LAogICAgICAgaGV4SW50MzJfbmVnXzE6IC0xLAogICAgICAgaWJpbmRlcjogRGVmYXVsdDo6ZGVmYXVsdCgpLAotICAgICAgaW50MzJfMTogdmVjIXsxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxfSwKLSAgICAgIGludDY0XzE6IHZlYyF7MSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMX0sCisgICAgICBlbXB0eTogRGVmYXVsdDo6ZGVmYXVsdCgpLAorICAgICAgaW50OF8xOiB2ZWMhWzEsIDEsIDEsIDEsIDFdLAorICAgICAgaW50MzJfMTogdmVjIVsxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxXSwKKyAgICAgIGludDY0XzE6IHZlYyFbMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMV0sCiAgICAgICBoZXhJbnQzMl9wb3NfMTogMSwKICAgICAgIGhleEludDY0X3Bvc18xOiAxLAogICAgICAgY29uc3RfZXhwcnNfMTogRGVmYXVsdDo6ZGVmYXVsdCgpLApAQCAtMTE3LDMxMiArMTIyLDI3MiBAQAogICAgIH0KICAgfQogfQotaW1wbCBiaW5kZXI6OnBhcmNlbDo6U2VyaWFsaXplIGZvciBTdHJ1Y3R1cmVkUGFyY2VsYWJsZSB7Ci0gIGZuIHNlcmlhbGl6ZSgmc2VsZiwgcGFyY2VsOiAmbXV0IGJpbmRlcjo6cGFyY2VsOjpQYXJjZWwpIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7Ci0gICAgPFNlbGYgYXMgYmluZGVyOjpwYXJjZWw6OlNlcmlhbGl6ZU9wdGlvbj46OnNlcmlhbGl6ZV9vcHRpb24oU29tZShzZWxmKSwgcGFyY2VsKQotICB9Ci19Ci1pbXBsIGJpbmRlcjo6cGFyY2VsOjpTZXJpYWxpemVBcnJheSBmb3IgU3RydWN0dXJlZFBhcmNlbGFibGUge30KLWltcGwgYmluZGVyOjpwYXJjZWw6OlNlcmlhbGl6ZU9wdGlvbiBmb3IgU3RydWN0dXJlZFBhcmNlbGFibGUgewotICBmbiBzZXJpYWxpemVfb3B0aW9uKHRoaXM6IE9wdGlvbjwmU2VsZj4sIHBhcmNlbDogJm11dCBiaW5kZXI6OnBhcmNlbDo6UGFyY2VsKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4gewotICAgIGxldCB0aGlzID0gaWYgbGV0IFNvbWUodGhpcykgPSB0aGlzIHsKLSAgICAgIHBhcmNlbC53cml0ZSgmMWkzMik/OwotICAgICAgdGhpcwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gcGFyY2VsLndyaXRlKCYwaTMyKTsKLSAgICB9OworaW1wbCBiaW5kZXI6OlBhcmNlbGFibGUgZm9yIFN0cnVjdHVyZWRQYXJjZWxhYmxlIHsKKyAgZm4gd3JpdGVfdG9fcGFyY2VsKCZzZWxmLCBwYXJjZWw6ICZtdXQgYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWwpIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4gewogICAgIHBhcmNlbC5zaXplZF93cml0ZSh8c3VicGFyY2VsfCB7Ci0gICAgICBzdWJwYXJjZWwud3JpdGUoJnRoaXMuc2hvdWxkQ29udGFpblRocmVlRnMpPzsKLSAgICAgIHN1YnBhcmNlbC53cml0ZSgmdGhpcy5mKT87Ci0gICAgICBzdWJwYXJjZWwud3JpdGUoJnRoaXMuc2hvdWxkQmVKZXJyeSk/OwotICAgICAgc3VicGFyY2VsLndyaXRlKCZ0aGlzLnNob3VsZEJlQnl0ZUJhcik/OwotICAgICAgc3VicGFyY2VsLndyaXRlKCZ0aGlzLnNob3VsZEJlSW50QmFyKT87Ci0gICAgICBzdWJwYXJjZWwud3JpdGUoJnRoaXMuc2hvdWxkQmVMb25nQmFyKT87Ci0gICAgICBzdWJwYXJjZWwud3JpdGUoJnRoaXMuc2hvdWxkQ29udGFpblR3b0J5dGVGb29zKT87Ci0gICAgICBzdWJwYXJjZWwud3JpdGUoJnRoaXMuc2hvdWxkQ29udGFpblR3b0ludEZvb3MpPzsKLSAgICAgIHN1YnBhcmNlbC53cml0ZSgmdGhpcy5zaG91bGRDb250YWluVHdvTG9uZ0Zvb3MpPzsKLSAgICAgIHN1YnBhcmNlbC53cml0ZSgmdGhpcy5zdHJpbmdEZWZhdWx0c1RvRm9vKT87Ci0gICAgICBzdWJwYXJjZWwud3JpdGUoJnRoaXMuYnl0ZURlZmF1bHRzVG9Gb3VyKT87Ci0gICAgICBzdWJwYXJjZWwud3JpdGUoJnRoaXMuaW50RGVmYXVsdHNUb0ZpdmUpPzsKLSAgICAgIHN1YnBhcmNlbC53cml0ZSgmdGhpcy5sb25nRGVmYXVsdHNUb05lZ2F0aXZlU2V2ZW4pPzsKLSAgICAgIHN1YnBhcmNlbC53cml0ZSgmdGhpcy5ib29sZWFuRGVmYXVsdHNUb1RydWUpPzsKLSAgICAgIHN1YnBhcmNlbC53cml0ZSgmdGhpcy5jaGFyRGVmYXVsdHNUb0MpPzsKLSAgICAgIHN1YnBhcmNlbC53cml0ZSgmdGhpcy5mbG9hdERlZmF1bHRzVG9QaSk/OwotICAgICAgc3VicGFyY2VsLndyaXRlKCZ0aGlzLmRvdWJsZVdpdGhEZWZhdWx0KT87Ci0gICAgICBzdWJwYXJjZWwud3JpdGUoJnRoaXMuYXJyYXlEZWZhdWx0c1RvMTIzKT87Ci0gICAgICBzdWJwYXJjZWwud3JpdGUoJnRoaXMuYXJyYXlEZWZhdWx0c1RvRW1wdHkpPzsKLSAgICAgIHN1YnBhcmNlbC53cml0ZSgmdGhpcy5ib29sRGVmYXVsdCk/OwotICAgICAgc3VicGFyY2VsLndyaXRlKCZ0aGlzLmJ5dGVEZWZhdWx0KT87Ci0gICAgICBzdWJwYXJjZWwud3JpdGUoJnRoaXMuaW50RGVmYXVsdCk/OwotICAgICAgc3VicGFyY2VsLndyaXRlKCZ0aGlzLmxvbmdEZWZhdWx0KT87Ci0gICAgICBzdWJwYXJjZWwud3JpdGUoJnRoaXMuZmxvYXREZWZhdWx0KT87Ci0gICAgICBzdWJwYXJjZWwud3JpdGUoJnRoaXMuZG91YmxlRGVmYXVsdCk/OwotICAgICAgc3VicGFyY2VsLndyaXRlKCZ0aGlzLmNoZWNrRG91YmxlRnJvbUZsb2F0KT87Ci0gICAgICBzdWJwYXJjZWwud3JpdGUoJnRoaXMuY2hlY2tTdHJpbmdBcnJheTEpPzsKLSAgICAgIHN1YnBhcmNlbC53cml0ZSgmdGhpcy5jaGVja1N0cmluZ0FycmF5Mik/OwotICAgICAgc3VicGFyY2VsLndyaXRlKCZ0aGlzLmludDMyX21pbik/OwotICAgICAgc3VicGFyY2VsLndyaXRlKCZ0aGlzLmludDMyX21heCk/OwotICAgICAgc3VicGFyY2VsLndyaXRlKCZ0aGlzLmludDY0X21heCk/OwotICAgICAgc3VicGFyY2VsLndyaXRlKCZ0aGlzLmhleEludDMyX25lZ18xKT87Ci0gICAgICBzdWJwYXJjZWwud3JpdGUoJnRoaXMuaWJpbmRlcik/OwotICAgICAgc3VicGFyY2VsLndyaXRlKCZ0aGlzLmludDMyXzEpPzsKLSAgICAgIHN1YnBhcmNlbC53cml0ZSgmdGhpcy5pbnQ2NF8xKT87Ci0gICAgICBzdWJwYXJjZWwud3JpdGUoJnRoaXMuaGV4SW50MzJfcG9zXzEpPzsKLSAgICAgIHN1YnBhcmNlbC53cml0ZSgmdGhpcy5oZXhJbnQ2NF9wb3NfMSk/OwotICAgICAgc3VicGFyY2VsLndyaXRlKCZ0aGlzLmNvbnN0X2V4cHJzXzEpPzsKLSAgICAgIHN1YnBhcmNlbC53cml0ZSgmdGhpcy5jb25zdF9leHByc18yKT87Ci0gICAgICBzdWJwYXJjZWwud3JpdGUoJnRoaXMuY29uc3RfZXhwcnNfMyk/OwotICAgICAgc3VicGFyY2VsLndyaXRlKCZ0aGlzLmNvbnN0X2V4cHJzXzQpPzsKLSAgICAgIHN1YnBhcmNlbC53cml0ZSgmdGhpcy5jb25zdF9leHByc181KT87Ci0gICAgICBzdWJwYXJjZWwud3JpdGUoJnRoaXMuY29uc3RfZXhwcnNfNik/OwotICAgICAgc3VicGFyY2VsLndyaXRlKCZ0aGlzLmNvbnN0X2V4cHJzXzcpPzsKLSAgICAgIHN1YnBhcmNlbC53cml0ZSgmdGhpcy5jb25zdF9leHByc184KT87Ci0gICAgICBzdWJwYXJjZWwud3JpdGUoJnRoaXMuY29uc3RfZXhwcnNfOSk/OwotICAgICAgc3VicGFyY2VsLndyaXRlKCZ0aGlzLmNvbnN0X2V4cHJzXzEwKT87Ci0gICAgICBzdWJwYXJjZWwud3JpdGUoJnRoaXMuYWRkU3RyaW5nMSk/OwotICAgICAgc3VicGFyY2VsLndyaXRlKCZ0aGlzLmFkZFN0cmluZzIpPzsKLSAgICAgIHN1YnBhcmNlbC53cml0ZSgmdGhpcy5zaG91bGRTZXRCaXQwQW5kQml0Mik/OwotICAgICAgc3VicGFyY2VsLndyaXRlKCZ0aGlzLnUpPzsKLSAgICAgIHN1YnBhcmNlbC53cml0ZSgmdGhpcy5zaG91bGRCZUNvbnN0UzEpPzsKLSAgICAgIHN1YnBhcmNlbC53cml0ZSgmdGhpcy5kZWZhdWx0V2l0aEZvbyk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLnNob3VsZENvbnRhaW5UaHJlZUZzKT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuZik/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLnNob3VsZEJlSmVycnkpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5zaG91bGRCZUJ5dGVCYXIpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5zaG91bGRCZUludEJhcik/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLnNob3VsZEJlTG9uZ0Jhcik/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLnNob3VsZENvbnRhaW5Ud29CeXRlRm9vcyk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLnNob3VsZENvbnRhaW5Ud29JbnRGb29zKT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuc2hvdWxkQ29udGFpblR3b0xvbmdGb29zKT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuc3RyaW5nRGVmYXVsdHNUb0Zvbyk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmJ5dGVEZWZhdWx0c1RvRm91cik/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmludERlZmF1bHRzVG9GaXZlKT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYubG9uZ0RlZmF1bHRzVG9OZWdhdGl2ZVNldmVuKT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuYm9vbGVhbkRlZmF1bHRzVG9UcnVlKT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuY2hhckRlZmF1bHRzVG9DKT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuZmxvYXREZWZhdWx0c1RvUGkpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5kb3VibGVXaXRoRGVmYXVsdCk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmFycmF5RGVmYXVsdHNUbzEyMyk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmFycmF5RGVmYXVsdHNUb0VtcHR5KT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuYm9vbERlZmF1bHQpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5ieXRlRGVmYXVsdCk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmludERlZmF1bHQpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5sb25nRGVmYXVsdCk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmZsb2F0RGVmYXVsdCk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmRvdWJsZURlZmF1bHQpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5jaGVja0RvdWJsZUZyb21GbG9hdCk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmNoZWNrU3RyaW5nQXJyYXkxKT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuY2hlY2tTdHJpbmdBcnJheTIpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5pbnQzMl9taW4pPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5pbnQzMl9tYXgpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5pbnQ2NF9tYXgpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5oZXhJbnQzMl9uZWdfMSk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmliaW5kZXIpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5lbXB0eSk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmludDhfMSk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmludDMyXzEpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5pbnQ2NF8xKT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuaGV4SW50MzJfcG9zXzEpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5oZXhJbnQ2NF9wb3NfMSk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmNvbnN0X2V4cHJzXzEpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5jb25zdF9leHByc18yKT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuY29uc3RfZXhwcnNfMyk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmNvbnN0X2V4cHJzXzQpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5jb25zdF9leHByc181KT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuY29uc3RfZXhwcnNfNik/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmNvbnN0X2V4cHJzXzcpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5jb25zdF9leHByc184KT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuY29uc3RfZXhwcnNfOSk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmNvbnN0X2V4cHJzXzEwKT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuYWRkU3RyaW5nMSk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmFkZFN0cmluZzIpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5zaG91bGRTZXRCaXQwQW5kQml0Mik/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLnUpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5zaG91bGRCZUNvbnN0UzEpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5kZWZhdWx0V2l0aEZvbyk/OworICAgICAgT2soKCkpCisgICAgfSkKKyAgfQorICBmbiByZWFkX2Zyb21fcGFyY2VsKCZtdXQgc2VsZiwgcGFyY2VsOiAmYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWwpIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4geworICAgIHBhcmNlbC5zaXplZF9yZWFkKHxzdWJwYXJjZWx8IHsKKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLnNob3VsZENvbnRhaW5UaHJlZUZzID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5mID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5zaG91bGRCZUplcnJ5ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5zaG91bGRCZUJ5dGVCYXIgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLnNob3VsZEJlSW50QmFyID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5zaG91bGRCZUxvbmdCYXIgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLnNob3VsZENvbnRhaW5Ud29CeXRlRm9vcyA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuc2hvdWxkQ29udGFpblR3b0ludEZvb3MgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLnNob3VsZENvbnRhaW5Ud29Mb25nRm9vcyA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuc3RyaW5nRGVmYXVsdHNUb0ZvbyA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuYnl0ZURlZmF1bHRzVG9Gb3VyID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5pbnREZWZhdWx0c1RvRml2ZSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYubG9uZ0RlZmF1bHRzVG9OZWdhdGl2ZVNldmVuID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5ib29sZWFuRGVmYXVsdHNUb1RydWUgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmNoYXJEZWZhdWx0c1RvQyA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuZmxvYXREZWZhdWx0c1RvUGkgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmRvdWJsZVdpdGhEZWZhdWx0ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5hcnJheURlZmF1bHRzVG8xMjMgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmFycmF5RGVmYXVsdHNUb0VtcHR5ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5ib29sRGVmYXVsdCA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuYnl0ZURlZmF1bHQgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmludERlZmF1bHQgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmxvbmdEZWZhdWx0ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5mbG9hdERlZmF1bHQgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmRvdWJsZURlZmF1bHQgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmNoZWNrRG91YmxlRnJvbUZsb2F0ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5jaGVja1N0cmluZ0FycmF5MSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuY2hlY2tTdHJpbmdBcnJheTIgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmludDMyX21pbiA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuaW50MzJfbWF4ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5pbnQ2NF9tYXggPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmhleEludDMyX25lZ18xID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5pYmluZGVyID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5lbXB0eSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuaW50OF8xID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5pbnQzMl8xID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5pbnQ2NF8xID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5oZXhJbnQzMl9wb3NfMSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuaGV4SW50NjRfcG9zXzEgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmNvbnN0X2V4cHJzXzEgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmNvbnN0X2V4cHJzXzIgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmNvbnN0X2V4cHJzXzMgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmNvbnN0X2V4cHJzXzQgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmNvbnN0X2V4cHJzXzUgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmNvbnN0X2V4cHJzXzYgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmNvbnN0X2V4cHJzXzcgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmNvbnN0X2V4cHJzXzggPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmNvbnN0X2V4cHJzXzkgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmNvbnN0X2V4cHJzXzEwID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5hZGRTdHJpbmcxID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5hZGRTdHJpbmcyID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5zaG91bGRTZXRCaXQwQW5kQml0MiA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYudSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuc2hvdWxkQmVDb25zdFMxID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5kZWZhdWx0V2l0aEZvbyA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQogICAgICAgT2soKCkpCiAgICAgfSkKICAgfQogfQotaW1wbCBiaW5kZXI6OnBhcmNlbDo6RGVzZXJpYWxpemUgZm9yIFN0cnVjdHVyZWRQYXJjZWxhYmxlIHsKLSAgZm4gZGVzZXJpYWxpemUocGFyY2VsOiAmYmluZGVyOjpwYXJjZWw6OlBhcmNlbCkgLT4gYmluZGVyOjpSZXN1bHQ8U2VsZj4gewotICAgIDxTZWxmIGFzIGJpbmRlcjo6cGFyY2VsOjpEZXNlcmlhbGl6ZU9wdGlvbj46OmRlc2VyaWFsaXplX29wdGlvbihwYXJjZWwpCi0gICAgICAgLnRyYW5zcG9zZSgpCi0gICAgICAgLnVud3JhcF9vcihFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTkVYUEVDVEVEX05VTEwpKQorYmluZGVyOjppbXBsX3NlcmlhbGl6ZV9mb3JfcGFyY2VsYWJsZSEoU3RydWN0dXJlZFBhcmNlbGFibGUpOworYmluZGVyOjppbXBsX2Rlc2VyaWFsaXplX2Zvcl9wYXJjZWxhYmxlIShTdHJ1Y3R1cmVkUGFyY2VsYWJsZSk7CitpbXBsIGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbGFibGVNZXRhZGF0YSBmb3IgU3RydWN0dXJlZFBhcmNlbGFibGUgeworICBmbiBnZXRfZGVzY3JpcHRvcigpIC0+ICYnc3RhdGljIHN0ciB7ICJhbmRyb2lkLmFpZGwudGVzdHMuU3RydWN0dXJlZFBhcmNlbGFibGUiIH0KK30KK3B1YiBtb2QgRW1wdHkgeworICAjW2Rlcml2ZShEZWJ1ZywgQ2xvbmUsIFBhcnRpYWxFcSldCisgIHB1YiBzdHJ1Y3QgRW1wdHkgeworICB9CisgIGltcGwgRGVmYXVsdCBmb3IgRW1wdHkgeworICAgIGZuIGRlZmF1bHQoKSAtPiBTZWxmIHsKKyAgICAgIFNlbGYgeworICAgICAgfQorICAgIH0KKyAgfQorICBpbXBsIGJpbmRlcjo6UGFyY2VsYWJsZSBmb3IgRW1wdHkgeworICAgIGZuIHdyaXRlX3RvX3BhcmNlbCgmc2VsZiwgcGFyY2VsOiAmbXV0IGJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsKSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsKKyAgICAgIHBhcmNlbC5zaXplZF93cml0ZSh8c3VicGFyY2VsfCB7CisgICAgICAgIE9rKCgpKQorICAgICAgfSkKKyAgICB9CisgICAgZm4gcmVhZF9mcm9tX3BhcmNlbCgmbXV0IHNlbGYsIHBhcmNlbDogJmJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsKSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsKKyAgICAgIHBhcmNlbC5zaXplZF9yZWFkKHxzdWJwYXJjZWx8IHsKKyAgICAgICAgT2soKCkpCisgICAgICB9KQorICAgIH0KKyAgfQorICBiaW5kZXI6OmltcGxfc2VyaWFsaXplX2Zvcl9wYXJjZWxhYmxlIShFbXB0eSk7CisgIGJpbmRlcjo6aW1wbF9kZXNlcmlhbGl6ZV9mb3JfcGFyY2VsYWJsZSEoRW1wdHkpOworICBpbXBsIGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbGFibGVNZXRhZGF0YSBmb3IgRW1wdHkgeworICAgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHsgImFuZHJvaWQuYWlkbC50ZXN0cy5TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5FbXB0eSIgfQogICB9CiB9Ci1pbXBsIGJpbmRlcjo6cGFyY2VsOjpEZXNlcmlhbGl6ZUFycmF5IGZvciBTdHJ1Y3R1cmVkUGFyY2VsYWJsZSB7fQotaW1wbCBiaW5kZXI6OnBhcmNlbDo6RGVzZXJpYWxpemVPcHRpb24gZm9yIFN0cnVjdHVyZWRQYXJjZWxhYmxlIHsKLSAgZm4gZGVzZXJpYWxpemVfb3B0aW9uKHBhcmNlbDogJmJpbmRlcjo6cGFyY2VsOjpQYXJjZWwpIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxTZWxmPj4gewotICAgIGxldCBzdGF0dXM6IGkzMiA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIHN0YXR1cyA9PSAwIHsgcmV0dXJuIE9rKE5vbmUpOyB9Ci0gICAgbGV0IHN0YXJ0X3BvcyA9IHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpOwotICAgIGxldCBwYXJjZWxhYmxlX3NpemU6IGkzMiA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIHBhcmNlbGFibGVfc2l6ZSA8IDAgeyByZXR1cm4gRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6QkFEX1ZBTFVFKTsgfQotICAgIGlmIHN0YXJ0X3Bvcy5jaGVja2VkX2FkZChwYXJjZWxhYmxlX3NpemUpLmlzX25vbmUoKSB7Ci0gICAgICByZXR1cm4gRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6QkFEX1ZBTFVFKTsKLSAgICB9Ci0gICAgbGV0IG11dCByZXN1bHQgPSBTZWxmOjpkZWZhdWx0KCk7Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5zaG91bGRDb250YWluVGhyZWVGcyA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIChwYXJjZWwuZ2V0X2RhdGFfcG9zaXRpb24oKSAtIHN0YXJ0X3BvcykgPT0gcGFyY2VsYWJsZV9zaXplIHsKLSAgICAgIHJldHVybiBPayhTb21lKHJlc3VsdCkpOwotICAgIH0KLSAgICByZXN1bHQuZiA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIChwYXJjZWwuZ2V0X2RhdGFfcG9zaXRpb24oKSAtIHN0YXJ0X3BvcykgPT0gcGFyY2VsYWJsZV9zaXplIHsKLSAgICAgIHJldHVybiBPayhTb21lKHJlc3VsdCkpOwotICAgIH0KLSAgICByZXN1bHQuc2hvdWxkQmVKZXJyeSA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIChwYXJjZWwuZ2V0X2RhdGFfcG9zaXRpb24oKSAtIHN0YXJ0X3BvcykgPT0gcGFyY2VsYWJsZV9zaXplIHsKLSAgICAgIHJldHVybiBPayhTb21lKHJlc3VsdCkpOwotICAgIH0KLSAgICByZXN1bHQuc2hvdWxkQmVCeXRlQmFyID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5zaG91bGRCZUludEJhciA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIChwYXJjZWwuZ2V0X2RhdGFfcG9zaXRpb24oKSAtIHN0YXJ0X3BvcykgPT0gcGFyY2VsYWJsZV9zaXplIHsKLSAgICAgIHJldHVybiBPayhTb21lKHJlc3VsdCkpOwotICAgIH0KLSAgICByZXN1bHQuc2hvdWxkQmVMb25nQmFyID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5zaG91bGRDb250YWluVHdvQnl0ZUZvb3MgPSBwYXJjZWwucmVhZCgpPzsKLSAgICBpZiAocGFyY2VsLmdldF9kYXRhX3Bvc2l0aW9uKCkgLSBzdGFydF9wb3MpID09IHBhcmNlbGFibGVfc2l6ZSB7Ci0gICAgICByZXR1cm4gT2soU29tZShyZXN1bHQpKTsKLSAgICB9Ci0gICAgcmVzdWx0LnNob3VsZENvbnRhaW5Ud29JbnRGb29zID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5zaG91bGRDb250YWluVHdvTG9uZ0Zvb3MgPSBwYXJjZWwucmVhZCgpPzsKLSAgICBpZiAocGFyY2VsLmdldF9kYXRhX3Bvc2l0aW9uKCkgLSBzdGFydF9wb3MpID09IHBhcmNlbGFibGVfc2l6ZSB7Ci0gICAgICByZXR1cm4gT2soU29tZShyZXN1bHQpKTsKLSAgICB9Ci0gICAgcmVzdWx0LnN0cmluZ0RlZmF1bHRzVG9Gb28gPSBwYXJjZWwucmVhZCgpPzsKLSAgICBpZiAocGFyY2VsLmdldF9kYXRhX3Bvc2l0aW9uKCkgLSBzdGFydF9wb3MpID09IHBhcmNlbGFibGVfc2l6ZSB7Ci0gICAgICByZXR1cm4gT2soU29tZShyZXN1bHQpKTsKLSAgICB9Ci0gICAgcmVzdWx0LmJ5dGVEZWZhdWx0c1RvRm91ciA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIChwYXJjZWwuZ2V0X2RhdGFfcG9zaXRpb24oKSAtIHN0YXJ0X3BvcykgPT0gcGFyY2VsYWJsZV9zaXplIHsKLSAgICAgIHJldHVybiBPayhTb21lKHJlc3VsdCkpOwotICAgIH0KLSAgICByZXN1bHQuaW50RGVmYXVsdHNUb0ZpdmUgPSBwYXJjZWwucmVhZCgpPzsKLSAgICBpZiAocGFyY2VsLmdldF9kYXRhX3Bvc2l0aW9uKCkgLSBzdGFydF9wb3MpID09IHBhcmNlbGFibGVfc2l6ZSB7Ci0gICAgICByZXR1cm4gT2soU29tZShyZXN1bHQpKTsKLSAgICB9Ci0gICAgcmVzdWx0LmxvbmdEZWZhdWx0c1RvTmVnYXRpdmVTZXZlbiA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIChwYXJjZWwuZ2V0X2RhdGFfcG9zaXRpb24oKSAtIHN0YXJ0X3BvcykgPT0gcGFyY2VsYWJsZV9zaXplIHsKLSAgICAgIHJldHVybiBPayhTb21lKHJlc3VsdCkpOwotICAgIH0KLSAgICByZXN1bHQuYm9vbGVhbkRlZmF1bHRzVG9UcnVlID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5jaGFyRGVmYXVsdHNUb0MgPSBwYXJjZWwucmVhZCgpPzsKLSAgICBpZiAocGFyY2VsLmdldF9kYXRhX3Bvc2l0aW9uKCkgLSBzdGFydF9wb3MpID09IHBhcmNlbGFibGVfc2l6ZSB7Ci0gICAgICByZXR1cm4gT2soU29tZShyZXN1bHQpKTsKLSAgICB9Ci0gICAgcmVzdWx0LmZsb2F0RGVmYXVsdHNUb1BpID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5kb3VibGVXaXRoRGVmYXVsdCA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIChwYXJjZWwuZ2V0X2RhdGFfcG9zaXRpb24oKSAtIHN0YXJ0X3BvcykgPT0gcGFyY2VsYWJsZV9zaXplIHsKLSAgICAgIHJldHVybiBPayhTb21lKHJlc3VsdCkpOwotICAgIH0KLSAgICByZXN1bHQuYXJyYXlEZWZhdWx0c1RvMTIzID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5hcnJheURlZmF1bHRzVG9FbXB0eSA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIChwYXJjZWwuZ2V0X2RhdGFfcG9zaXRpb24oKSAtIHN0YXJ0X3BvcykgPT0gcGFyY2VsYWJsZV9zaXplIHsKLSAgICAgIHJldHVybiBPayhTb21lKHJlc3VsdCkpOwotICAgIH0KLSAgICByZXN1bHQuYm9vbERlZmF1bHQgPSBwYXJjZWwucmVhZCgpPzsKLSAgICBpZiAocGFyY2VsLmdldF9kYXRhX3Bvc2l0aW9uKCkgLSBzdGFydF9wb3MpID09IHBhcmNlbGFibGVfc2l6ZSB7Ci0gICAgICByZXR1cm4gT2soU29tZShyZXN1bHQpKTsKLSAgICB9Ci0gICAgcmVzdWx0LmJ5dGVEZWZhdWx0ID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5pbnREZWZhdWx0ID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5sb25nRGVmYXVsdCA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIChwYXJjZWwuZ2V0X2RhdGFfcG9zaXRpb24oKSAtIHN0YXJ0X3BvcykgPT0gcGFyY2VsYWJsZV9zaXplIHsKLSAgICAgIHJldHVybiBPayhTb21lKHJlc3VsdCkpOwotICAgIH0KLSAgICByZXN1bHQuZmxvYXREZWZhdWx0ID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5kb3VibGVEZWZhdWx0ID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5jaGVja0RvdWJsZUZyb21GbG9hdCA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIChwYXJjZWwuZ2V0X2RhdGFfcG9zaXRpb24oKSAtIHN0YXJ0X3BvcykgPT0gcGFyY2VsYWJsZV9zaXplIHsKLSAgICAgIHJldHVybiBPayhTb21lKHJlc3VsdCkpOwotICAgIH0KLSAgICByZXN1bHQuY2hlY2tTdHJpbmdBcnJheTEgPSBwYXJjZWwucmVhZCgpPzsKLSAgICBpZiAocGFyY2VsLmdldF9kYXRhX3Bvc2l0aW9uKCkgLSBzdGFydF9wb3MpID09IHBhcmNlbGFibGVfc2l6ZSB7Ci0gICAgICByZXR1cm4gT2soU29tZShyZXN1bHQpKTsKLSAgICB9Ci0gICAgcmVzdWx0LmNoZWNrU3RyaW5nQXJyYXkyID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5pbnQzMl9taW4gPSBwYXJjZWwucmVhZCgpPzsKLSAgICBpZiAocGFyY2VsLmdldF9kYXRhX3Bvc2l0aW9uKCkgLSBzdGFydF9wb3MpID09IHBhcmNlbGFibGVfc2l6ZSB7Ci0gICAgICByZXR1cm4gT2soU29tZShyZXN1bHQpKTsKLSAgICB9Ci0gICAgcmVzdWx0LmludDMyX21heCA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIChwYXJjZWwuZ2V0X2RhdGFfcG9zaXRpb24oKSAtIHN0YXJ0X3BvcykgPT0gcGFyY2VsYWJsZV9zaXplIHsKLSAgICAgIHJldHVybiBPayhTb21lKHJlc3VsdCkpOwotICAgIH0KLSAgICByZXN1bHQuaW50NjRfbWF4ID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5oZXhJbnQzMl9uZWdfMSA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIChwYXJjZWwuZ2V0X2RhdGFfcG9zaXRpb24oKSAtIHN0YXJ0X3BvcykgPT0gcGFyY2VsYWJsZV9zaXplIHsKLSAgICAgIHJldHVybiBPayhTb21lKHJlc3VsdCkpOwotICAgIH0KLSAgICByZXN1bHQuaWJpbmRlciA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIChwYXJjZWwuZ2V0X2RhdGFfcG9zaXRpb24oKSAtIHN0YXJ0X3BvcykgPT0gcGFyY2VsYWJsZV9zaXplIHsKLSAgICAgIHJldHVybiBPayhTb21lKHJlc3VsdCkpOwotICAgIH0KLSAgICByZXN1bHQuaW50MzJfMSA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIChwYXJjZWwuZ2V0X2RhdGFfcG9zaXRpb24oKSAtIHN0YXJ0X3BvcykgPT0gcGFyY2VsYWJsZV9zaXplIHsKLSAgICAgIHJldHVybiBPayhTb21lKHJlc3VsdCkpOwotICAgIH0KLSAgICByZXN1bHQuaW50NjRfMSA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIChwYXJjZWwuZ2V0X2RhdGFfcG9zaXRpb24oKSAtIHN0YXJ0X3BvcykgPT0gcGFyY2VsYWJsZV9zaXplIHsKLSAgICAgIHJldHVybiBPayhTb21lKHJlc3VsdCkpOwotICAgIH0KLSAgICByZXN1bHQuaGV4SW50MzJfcG9zXzEgPSBwYXJjZWwucmVhZCgpPzsKLSAgICBpZiAocGFyY2VsLmdldF9kYXRhX3Bvc2l0aW9uKCkgLSBzdGFydF9wb3MpID09IHBhcmNlbGFibGVfc2l6ZSB7Ci0gICAgICByZXR1cm4gT2soU29tZShyZXN1bHQpKTsKLSAgICB9Ci0gICAgcmVzdWx0LmhleEludDY0X3Bvc18xID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5jb25zdF9leHByc18xID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5jb25zdF9leHByc18yID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5jb25zdF9leHByc18zID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5jb25zdF9leHByc180ID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5jb25zdF9leHByc181ID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5jb25zdF9leHByc182ID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5jb25zdF9leHByc183ID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5jb25zdF9leHByc184ID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5jb25zdF9leHByc185ID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5jb25zdF9leHByc18xMCA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIChwYXJjZWwuZ2V0X2RhdGFfcG9zaXRpb24oKSAtIHN0YXJ0X3BvcykgPT0gcGFyY2VsYWJsZV9zaXplIHsKLSAgICAgIHJldHVybiBPayhTb21lKHJlc3VsdCkpOwotICAgIH0KLSAgICByZXN1bHQuYWRkU3RyaW5nMSA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIChwYXJjZWwuZ2V0X2RhdGFfcG9zaXRpb24oKSAtIHN0YXJ0X3BvcykgPT0gcGFyY2VsYWJsZV9zaXplIHsKLSAgICAgIHJldHVybiBPayhTb21lKHJlc3VsdCkpOwotICAgIH0KLSAgICByZXN1bHQuYWRkU3RyaW5nMiA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIChwYXJjZWwuZ2V0X2RhdGFfcG9zaXRpb24oKSAtIHN0YXJ0X3BvcykgPT0gcGFyY2VsYWJsZV9zaXplIHsKLSAgICAgIHJldHVybiBPayhTb21lKHJlc3VsdCkpOwotICAgIH0KLSAgICByZXN1bHQuc2hvdWxkU2V0Qml0MEFuZEJpdDIgPSBwYXJjZWwucmVhZCgpPzsKLSAgICBpZiAocGFyY2VsLmdldF9kYXRhX3Bvc2l0aW9uKCkgLSBzdGFydF9wb3MpID09IHBhcmNlbGFibGVfc2l6ZSB7Ci0gICAgICByZXR1cm4gT2soU29tZShyZXN1bHQpKTsKLSAgICB9Ci0gICAgcmVzdWx0LnUgPSBwYXJjZWwucmVhZCgpPzsKLSAgICBpZiAocGFyY2VsLmdldF9kYXRhX3Bvc2l0aW9uKCkgLSBzdGFydF9wb3MpID09IHBhcmNlbGFibGVfc2l6ZSB7Ci0gICAgICByZXR1cm4gT2soU29tZShyZXN1bHQpKTsKLSAgICB9Ci0gICAgcmVzdWx0LnNob3VsZEJlQ29uc3RTMSA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIChwYXJjZWwuZ2V0X2RhdGFfcG9zaXRpb24oKSAtIHN0YXJ0X3BvcykgPT0gcGFyY2VsYWJsZV9zaXplIHsKLSAgICAgIHJldHVybiBPayhTb21lKHJlc3VsdCkpOwotICAgIH0KLSAgICByZXN1bHQuZGVmYXVsdFdpdGhGb28gPSBwYXJjZWwucmVhZCgpPzsKLSAgICB1bnNhZmUgewotICAgICAgcGFyY2VsLnNldF9kYXRhX3Bvc2l0aW9uKHN0YXJ0X3BvcyArIHBhcmNlbGFibGVfc2l6ZSk/OwotICAgIH0KLSAgICBPayhTb21lKHJlc3VsdCkpCi0gIH0KK3B1YihjcmF0ZSkgbW9kIG1hbmdsZWQgeworIHB1YiB1c2Ugc3VwZXI6OlN0cnVjdHVyZWRQYXJjZWxhYmxlIGFzIF83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMjBfU3RydWN0dXJlZFBhcmNlbGFibGU7CisgcHViIHVzZSBzdXBlcjo6RW1wdHk6OkVtcHR5IGFzIF83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMjBfU3RydWN0dXJlZFBhcmNlbGFibGVfNV9FbXB0eTsKIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1VuaW9uLnJzIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb24ucnMKaW5kZXggZmJiOGEzNS4uYTJmOTI5NSAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb24ucnMKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb24ucnMKQEAgLTEsMyArMSw1IEBACisjIVtmb3JiaWQodW5zYWZlX2NvZGUpXQorIyFbcnVzdGZtdDo6c2tpcF0KICNbZGVyaXZlKERlYnVnLCBDbG9uZSwgUGFydGlhbEVxKV0KIHB1YiBlbnVtIFVuaW9uIHsKICAgTnMoVmVjPGkzMj4pLApAQCAtOSwyNyArMTEsMTQgQEAKICAgQmUoY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bSksCiB9CiBwdWIgY29uc3QgUzE6ICZzdHIgPSAiYSBzdHJpbmcgY29uc3RhbnQgaW4gdW5pb24iOwotcHViKGNyYXRlKSBtb2QgbWFuZ2xlZCB7IHB1YiB1c2Ugc3VwZXI6OlVuaW9uIGFzIF83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNV9VbmlvbjsgfQogaW1wbCBEZWZhdWx0IGZvciBVbmlvbiB7CiAgIGZuIGRlZmF1bHQoKSAtPiBTZWxmIHsKLSAgICBTZWxmOjpOcyh2ZWMhe30pCisgICAgU2VsZjo6TnModmVjIVtdKQogICB9CiB9Ci1pbXBsIGJpbmRlcjo6cGFyY2VsOjpTZXJpYWxpemUgZm9yIFVuaW9uIHsKLSAgZm4gc2VyaWFsaXplKCZzZWxmLCBwYXJjZWw6ICZtdXQgYmluZGVyOjpwYXJjZWw6OlBhcmNlbCkgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKLSAgICA8U2VsZiBhcyBiaW5kZXI6OnBhcmNlbDo6U2VyaWFsaXplT3B0aW9uPjo6c2VyaWFsaXplX29wdGlvbihTb21lKHNlbGYpLCBwYXJjZWwpCi0gIH0KLX0KLWltcGwgYmluZGVyOjpwYXJjZWw6OlNlcmlhbGl6ZUFycmF5IGZvciBVbmlvbiB7fQotaW1wbCBiaW5kZXI6OnBhcmNlbDo6U2VyaWFsaXplT3B0aW9uIGZvciBVbmlvbiB7Ci0gIGZuIHNlcmlhbGl6ZV9vcHRpb24odGhpczogT3B0aW9uPCZTZWxmPiwgcGFyY2VsOiAmbXV0IGJpbmRlcjo6cGFyY2VsOjpQYXJjZWwpIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7Ci0gICAgbGV0IHRoaXMgPSBpZiBsZXQgU29tZSh0aGlzKSA9IHRoaXMgewotICAgICAgcGFyY2VsLndyaXRlKCYxaTMyKT87Ci0gICAgICB0aGlzCi0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBwYXJjZWwud3JpdGUoJjBpMzIpOwotICAgIH07Ci0gICAgbWF0Y2ggdGhpcyB7CitpbXBsIGJpbmRlcjo6UGFyY2VsYWJsZSBmb3IgVW5pb24geworICBmbiB3cml0ZV90b19wYXJjZWwoJnNlbGYsIHBhcmNlbDogJm11dCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbCkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CisgICAgbWF0Y2ggc2VsZiB7CiAgICAgICBTZWxmOjpOcyh2KSA9PiB7CiAgICAgICAgIHBhcmNlbC53cml0ZSgmMGkzMik/OwogICAgICAgICBwYXJjZWwud3JpdGUodikKQEAgLTYwLDQ4ICs0OSw0MyBAQAogICAgICAgfQogICAgIH0KICAgfQotfQotaW1wbCBiaW5kZXI6OnBhcmNlbDo6RGVzZXJpYWxpemUgZm9yIFVuaW9uIHsKLSAgZm4gZGVzZXJpYWxpemUocGFyY2VsOiAmYmluZGVyOjpwYXJjZWw6OlBhcmNlbCkgLT4gYmluZGVyOjpSZXN1bHQ8U2VsZj4gewotICAgIDxTZWxmIGFzIGJpbmRlcjo6cGFyY2VsOjpEZXNlcmlhbGl6ZU9wdGlvbj46OmRlc2VyaWFsaXplX29wdGlvbihwYXJjZWwpCi0gICAgICAgLnRyYW5zcG9zZSgpCi0gICAgICAgLnVud3JhcF9vcihFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTkVYUEVDVEVEX05VTEwpKQotICB9Ci19Ci1pbXBsIGJpbmRlcjo6cGFyY2VsOjpEZXNlcmlhbGl6ZUFycmF5IGZvciBVbmlvbiB7fQotaW1wbCBiaW5kZXI6OnBhcmNlbDo6RGVzZXJpYWxpemVPcHRpb24gZm9yIFVuaW9uIHsKLSAgZm4gZGVzZXJpYWxpemVfb3B0aW9uKHBhcmNlbDogJmJpbmRlcjo6cGFyY2VsOjpQYXJjZWwpIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxTZWxmPj4gewotICAgIGxldCBzdGF0dXM6IGkzMiA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIHN0YXR1cyA9PSAwIHsgcmV0dXJuIE9rKE5vbmUpOyB9CisgIGZuIHJlYWRfZnJvbV9wYXJjZWwoJm11dCBzZWxmLCBwYXJjZWw6ICZiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbCkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CiAgICAgbGV0IHRhZzogaTMyID0gcGFyY2VsLnJlYWQoKT87CiAgICAgbWF0Y2ggdGFnIHsKICAgICAgIDAgPT4gewogICAgICAgICBsZXQgdmFsdWU6IFZlYzxpMzI+ID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgICAgIE9rKFNvbWUoU2VsZjo6TnModmFsdWUpKSkKKyAgICAgICAgKnNlbGYgPSBTZWxmOjpOcyh2YWx1ZSk7CisgICAgICAgIE9rKCgpKQogICAgICAgfQogICAgICAgMSA9PiB7CiAgICAgICAgIGxldCB2YWx1ZTogaTMyID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgICAgIE9rKFNvbWUoU2VsZjo6Tih2YWx1ZSkpKQorICAgICAgICAqc2VsZiA9IFNlbGY6Ok4odmFsdWUpOworICAgICAgICBPaygoKSkKICAgICAgIH0KICAgICAgIDIgPT4gewogICAgICAgICBsZXQgdmFsdWU6IGkzMiA9IHBhcmNlbC5yZWFkKCk/OwotICAgICAgICBPayhTb21lKFNlbGY6Ok0odmFsdWUpKSkKKyAgICAgICAgKnNlbGYgPSBTZWxmOjpNKHZhbHVlKTsKKyAgICAgICAgT2soKCkpCiAgICAgICB9CiAgICAgICAzID0+IHsKICAgICAgICAgbGV0IHZhbHVlOiBTdHJpbmcgPSBwYXJjZWwucmVhZCgpPzsKLSAgICAgICAgT2soU29tZShTZWxmOjpTKHZhbHVlKSkpCisgICAgICAgICpzZWxmID0gU2VsZjo6Uyh2YWx1ZSk7CisgICAgICAgIE9rKCgpKQogICAgICAgfQogICAgICAgNCA9PiB7CiAgICAgICAgIGxldCB2YWx1ZTogT3B0aW9uPGJpbmRlcjo6U3BJQmluZGVyPiA9IHBhcmNlbC5yZWFkKCk/OwotICAgICAgICBPayhTb21lKFNlbGY6OkliaW5kZXIodmFsdWUpKSkKKyAgICAgICAgKnNlbGYgPSBTZWxmOjpJYmluZGVyKHZhbHVlKTsKKyAgICAgICAgT2soKCkpCiAgICAgICB9CiAgICAgICA1ID0+IHsKICAgICAgICAgbGV0IHZhbHVlOiBWZWM8U3RyaW5nPiA9IHBhcmNlbC5yZWFkKCk/OwotICAgICAgICBPayhTb21lKFNlbGY6OlNzKHZhbHVlKSkpCisgICAgICAgICpzZWxmID0gU2VsZjo6U3ModmFsdWUpOworICAgICAgICBPaygoKSkKICAgICAgIH0KICAgICAgIDYgPT4gewogICAgICAgICBsZXQgdmFsdWU6IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW0gPSBwYXJjZWwucmVhZCgpPzsKLSAgICAgICAgT2soU29tZShTZWxmOjpCZSh2YWx1ZSkpKQorICAgICAgICAqc2VsZiA9IFNlbGY6OkJlKHZhbHVlKTsKKyAgICAgICAgT2soKCkpCiAgICAgICB9CiAgICAgICBfID0+IHsKICAgICAgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6QkFEX1ZBTFVFKQpAQCAtMTA5LDMgKzkzLDI3IEBACiAgICAgfQogICB9CiB9CitiaW5kZXI6OmltcGxfc2VyaWFsaXplX2Zvcl9wYXJjZWxhYmxlIShVbmlvbik7CitiaW5kZXI6OmltcGxfZGVzZXJpYWxpemVfZm9yX3BhcmNlbGFibGUhKFVuaW9uKTsKK2ltcGwgYmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsYWJsZU1ldGFkYXRhIGZvciBVbmlvbiB7CisgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHsgImFuZHJvaWQuYWlkbC50ZXN0cy5VbmlvbiIgfQorfQorcHViIG1vZCBUYWcgeworICAjIVthbGxvdyhub25fdXBwZXJfY2FzZV9nbG9iYWxzKV0KKyAgdXNlIGJpbmRlcjo6ZGVjbGFyZV9iaW5kZXJfZW51bTsKKyAgZGVjbGFyZV9iaW5kZXJfZW51bSEgeworICAgIFRhZyA6IFtpMzI7IDddIHsKKyAgICAgIG5zID0gMCwKKyAgICAgIG4gPSAxLAorICAgICAgbSA9IDIsCisgICAgICBzID0gMywKKyAgICAgIGliaW5kZXIgPSA0LAorICAgICAgc3MgPSA1LAorICAgICAgYmUgPSA2LAorICAgIH0KKyAgfQorfQorcHViKGNyYXRlKSBtb2QgbWFuZ2xlZCB7CisgcHViIHVzZSBzdXBlcjo6VW5pb24gYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c181X1VuaW9uOworIHB1YiB1c2Ugc3VwZXI6OlRhZzo6VGFnIGFzIF83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNV9Vbmlvbl8zX1RhZzsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1VuaW9uV2l0aEZkLnJzIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb25XaXRoRmQucnMKaW5kZXggNTAxZTAwYy4uNDlmOWYxNiAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb25XaXRoRmQucnMKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb25XaXRoRmQucnMKQEAgLTEsMjkgKzEsMTggQEAKKyMhW2ZvcmJpZCh1bnNhZmVfY29kZSldCisjIVtydXN0Zm10Ojpza2lwXQogI1tkZXJpdmUoRGVidWcpXQogcHViIGVudW0gVW5pb25XaXRoRmQgewogICBOdW0oaTMyKSwKLSAgUGZkKE9wdGlvbjxiaW5kZXI6OnBhcmNlbDo6UGFyY2VsRmlsZURlc2NyaXB0b3I+KSwKKyAgUGZkKE9wdGlvbjxiaW5kZXI6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPiksCiB9Ci1wdWIoY3JhdGUpIG1vZCBtYW5nbGVkIHsgcHViIHVzZSBzdXBlcjo6VW5pb25XaXRoRmQgYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMV9VbmlvbldpdGhGZDsgfQogaW1wbCBEZWZhdWx0IGZvciBVbmlvbldpdGhGZCB7CiAgIGZuIGRlZmF1bHQoKSAtPiBTZWxmIHsKICAgICBTZWxmOjpOdW0oMCkKICAgfQogfQotaW1wbCBiaW5kZXI6OnBhcmNlbDo6U2VyaWFsaXplIGZvciBVbmlvbldpdGhGZCB7Ci0gIGZuIHNlcmlhbGl6ZSgmc2VsZiwgcGFyY2VsOiAmbXV0IGJpbmRlcjo6cGFyY2VsOjpQYXJjZWwpIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7Ci0gICAgPFNlbGYgYXMgYmluZGVyOjpwYXJjZWw6OlNlcmlhbGl6ZU9wdGlvbj46OnNlcmlhbGl6ZV9vcHRpb24oU29tZShzZWxmKSwgcGFyY2VsKQotICB9Ci19Ci1pbXBsIGJpbmRlcjo6cGFyY2VsOjpTZXJpYWxpemVBcnJheSBmb3IgVW5pb25XaXRoRmQge30KLWltcGwgYmluZGVyOjpwYXJjZWw6OlNlcmlhbGl6ZU9wdGlvbiBmb3IgVW5pb25XaXRoRmQgewotICBmbiBzZXJpYWxpemVfb3B0aW9uKHRoaXM6IE9wdGlvbjwmU2VsZj4sIHBhcmNlbDogJm11dCBiaW5kZXI6OnBhcmNlbDo6UGFyY2VsKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4gewotICAgIGxldCB0aGlzID0gaWYgbGV0IFNvbWUodGhpcykgPSB0aGlzIHsKLSAgICAgIHBhcmNlbC53cml0ZSgmMWkzMik/OwotICAgICAgdGhpcwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gcGFyY2VsLndyaXRlKCYwaTMyKTsKLSAgICB9OwotICAgIG1hdGNoIHRoaXMgeworaW1wbCBiaW5kZXI6OlBhcmNlbGFibGUgZm9yIFVuaW9uV2l0aEZkIHsKKyAgZm4gd3JpdGVfdG9fcGFyY2VsKCZzZWxmLCBwYXJjZWw6ICZtdXQgYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWwpIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4geworICAgIG1hdGNoIHNlbGYgewogICAgICAgU2VsZjo6TnVtKHYpID0+IHsKICAgICAgICAgcGFyY2VsLndyaXRlKCYwaTMyKT87CiAgICAgICAgIHBhcmNlbC53cml0ZSh2KQpAQCAtMzUsMjggKzI0LDE4IEBACiAgICAgICB9CiAgICAgfQogICB9Ci19Ci1pbXBsIGJpbmRlcjo6cGFyY2VsOjpEZXNlcmlhbGl6ZSBmb3IgVW5pb25XaXRoRmQgewotICBmbiBkZXNlcmlhbGl6ZShwYXJjZWw6ICZiaW5kZXI6OnBhcmNlbDo6UGFyY2VsKSAtPiBiaW5kZXI6OlJlc3VsdDxTZWxmPiB7Ci0gICAgPFNlbGYgYXMgYmluZGVyOjpwYXJjZWw6OkRlc2VyaWFsaXplT3B0aW9uPjo6ZGVzZXJpYWxpemVfb3B0aW9uKHBhcmNlbCkKLSAgICAgICAudHJhbnNwb3NlKCkKLSAgICAgICAudW53cmFwX29yKEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVORVhQRUNURURfTlVMTCkpCi0gIH0KLX0KLWltcGwgYmluZGVyOjpwYXJjZWw6OkRlc2VyaWFsaXplQXJyYXkgZm9yIFVuaW9uV2l0aEZkIHt9Ci1pbXBsIGJpbmRlcjo6cGFyY2VsOjpEZXNlcmlhbGl6ZU9wdGlvbiBmb3IgVW5pb25XaXRoRmQgewotICBmbiBkZXNlcmlhbGl6ZV9vcHRpb24ocGFyY2VsOiAmYmluZGVyOjpwYXJjZWw6OlBhcmNlbCkgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFNlbGY+PiB7Ci0gICAgbGV0IHN0YXR1czogaTMyID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgc3RhdHVzID09IDAgeyByZXR1cm4gT2soTm9uZSk7IH0KKyAgZm4gcmVhZF9mcm9tX3BhcmNlbCgmbXV0IHNlbGYsIHBhcmNlbDogJmJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsKSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsKICAgICBsZXQgdGFnOiBpMzIgPSBwYXJjZWwucmVhZCgpPzsKICAgICBtYXRjaCB0YWcgewogICAgICAgMCA9PiB7CiAgICAgICAgIGxldCB2YWx1ZTogaTMyID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgICAgIE9rKFNvbWUoU2VsZjo6TnVtKHZhbHVlKSkpCisgICAgICAgICpzZWxmID0gU2VsZjo6TnVtKHZhbHVlKTsKKyAgICAgICAgT2soKCkpCiAgICAgICB9CiAgICAgICAxID0+IHsKLSAgICAgICAgbGV0IHZhbHVlOiBPcHRpb248YmluZGVyOjpwYXJjZWw6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPiA9IFNvbWUocGFyY2VsLnJlYWQoKT8pOwotICAgICAgICBPayhTb21lKFNlbGY6OlBmZCh2YWx1ZSkpKQorICAgICAgICBsZXQgdmFsdWU6IE9wdGlvbjxiaW5kZXI6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPiA9IFNvbWUocGFyY2VsLnJlYWQoKT8pOworICAgICAgICAqc2VsZiA9IFNlbGY6OlBmZCh2YWx1ZSk7CisgICAgICAgIE9rKCgpKQogICAgICAgfQogICAgICAgXyA9PiB7CiAgICAgICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OkJBRF9WQUxVRSkKQEAgLTY0LDMgKzQzLDIyIEBACiAgICAgfQogICB9CiB9CitiaW5kZXI6OmltcGxfc2VyaWFsaXplX2Zvcl9wYXJjZWxhYmxlIShVbmlvbldpdGhGZCk7CitiaW5kZXI6OmltcGxfZGVzZXJpYWxpemVfZm9yX3BhcmNlbGFibGUhKFVuaW9uV2l0aEZkKTsKK2ltcGwgYmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsYWJsZU1ldGFkYXRhIGZvciBVbmlvbldpdGhGZCB7CisgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHsgImFuZHJvaWQuYWlkbC50ZXN0cy5VbmlvbldpdGhGZCIgfQorfQorcHViIG1vZCBUYWcgeworICAjIVthbGxvdyhub25fdXBwZXJfY2FzZV9nbG9iYWxzKV0KKyAgdXNlIGJpbmRlcjo6ZGVjbGFyZV9iaW5kZXJfZW51bTsKKyAgZGVjbGFyZV9iaW5kZXJfZW51bSEgeworICAgIFRhZyA6IFtpMzI7IDJdIHsKKyAgICAgIG51bSA9IDAsCisgICAgICBwZmQgPSAxLAorICAgIH0KKyAgfQorfQorcHViKGNyYXRlKSBtb2QgbWFuZ2xlZCB7CisgcHViIHVzZSBzdXBlcjo6VW5pb25XaXRoRmQgYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMV9VbmlvbldpdGhGZDsKKyBwdWIgdXNlIHN1cGVyOjpUYWc6OlRhZyBhcyBfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzExX1VuaW9uV2l0aEZkXzNfVGFnOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0V4dGVuZGFibGVQYXJjZWxhYmxlLnJzIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0V4dGVuZGFibGVQYXJjZWxhYmxlLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MWVhMzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vRXh0ZW5kYWJsZVBhcmNlbGFibGUucnMKQEAgLTAsMCArMSw2MSBAQAorIyFbZm9yYmlkKHVuc2FmZV9jb2RlKV0KKyMhW3J1c3RmbXQ6OnNraXBdCisjW2Rlcml2ZShEZWJ1ZyldCitwdWIgc3RydWN0IEV4dGVuZGFibGVQYXJjZWxhYmxlIHsKKyAgcHViIGE6IGkzMiwKKyAgcHViIGI6IFN0cmluZywKKyAgcHViIGV4dDogYmluZGVyOjpQYXJjZWxhYmxlSG9sZGVyLAorICBwdWIgYzogaTY0LAorICBwdWIgZXh0MjogYmluZGVyOjpQYXJjZWxhYmxlSG9sZGVyLAorfQoraW1wbCBEZWZhdWx0IGZvciBFeHRlbmRhYmxlUGFyY2VsYWJsZSB7CisgIGZuIGRlZmF1bHQoKSAtPiBTZWxmIHsKKyAgICBTZWxmIHsKKyAgICAgIGE6IDAsCisgICAgICBiOiBEZWZhdWx0OjpkZWZhdWx0KCksCisgICAgICBleHQ6IGJpbmRlcjo6UGFyY2VsYWJsZUhvbGRlcjo6bmV3KGJpbmRlcjo6YmluZGVyX2ltcGw6OlN0YWJpbGl0eTo6TG9jYWwpLAorICAgICAgYzogMCwKKyAgICAgIGV4dDI6IGJpbmRlcjo6UGFyY2VsYWJsZUhvbGRlcjo6bmV3KGJpbmRlcjo6YmluZGVyX2ltcGw6OlN0YWJpbGl0eTo6TG9jYWwpLAorICAgIH0KKyAgfQorfQoraW1wbCBiaW5kZXI6OlBhcmNlbGFibGUgZm9yIEV4dGVuZGFibGVQYXJjZWxhYmxlIHsKKyAgZm4gd3JpdGVfdG9fcGFyY2VsKCZzZWxmLCBwYXJjZWw6ICZtdXQgYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWwpIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4geworICAgIHBhcmNlbC5zaXplZF93cml0ZSh8c3VicGFyY2VsfCB7CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuYSk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmIpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5leHQpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5jKT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuZXh0Mik/OworICAgICAgT2soKCkpCisgICAgfSkKKyAgfQorICBmbiByZWFkX2Zyb21fcGFyY2VsKCZtdXQgc2VsZiwgcGFyY2VsOiAmYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWwpIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4geworICAgIHBhcmNlbC5zaXplZF9yZWFkKHxzdWJwYXJjZWx8IHsKKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmEgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmIgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmV4dCA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuYyA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuZXh0MiA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgT2soKCkpCisgICAgfSkKKyAgfQorfQorYmluZGVyOjppbXBsX3NlcmlhbGl6ZV9mb3JfcGFyY2VsYWJsZSEoRXh0ZW5kYWJsZVBhcmNlbGFibGUpOworYmluZGVyOjppbXBsX2Rlc2VyaWFsaXplX2Zvcl9wYXJjZWxhYmxlIShFeHRlbmRhYmxlUGFyY2VsYWJsZSk7CitpbXBsIGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbGFibGVNZXRhZGF0YSBmb3IgRXh0ZW5kYWJsZVBhcmNlbGFibGUgeworICBmbiBnZXRfZGVzY3JpcHRvcigpIC0+ICYnc3RhdGljIHN0ciB7ICJhbmRyb2lkLmFpZGwudGVzdHMuZXh0ZW5zaW9uLkV4dGVuZGFibGVQYXJjZWxhYmxlIiB9Cit9CitwdWIoY3JhdGUpIG1vZCBtYW5nbGVkIHsKKyBwdWIgdXNlIHN1cGVyOjpFeHRlbmRhYmxlUGFyY2VsYWJsZSBhcyBfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzlfZXh0ZW5zaW9uXzIwX0V4dGVuZGFibGVQYXJjZWxhYmxlOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0V4dGVuZGFibGVQYXJjZWxhYmxlLnJzLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vRXh0ZW5kYWJsZVBhcmNlbGFibGUucnMuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Yzg5MWExCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0V4dGVuZGFibGVQYXJjZWxhYmxlLnJzLmQKQEAgLTAsMCArMSwyIEBACitvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9FeHRlbmRhYmxlUGFyY2VsYWJsZS5ycyA6IFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9FeHRlbmRhYmxlUGFyY2VsYWJsZS5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQucnMgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM5Yzk1ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dC5ycwpAQCAtMCwwICsxLDQzIEBACisjIVtmb3JiaWQodW5zYWZlX2NvZGUpXQorIyFbcnVzdGZtdDo6c2tpcF0KKyNbZGVyaXZlKERlYnVnKV0KK3B1YiBzdHJ1Y3QgTXlFeHQgeworICBwdWIgYTogaTMyLAorICBwdWIgYjogU3RyaW5nLAorfQoraW1wbCBEZWZhdWx0IGZvciBNeUV4dCB7CisgIGZuIGRlZmF1bHQoKSAtPiBTZWxmIHsKKyAgICBTZWxmIHsKKyAgICAgIGE6IDAsCisgICAgICBiOiBEZWZhdWx0OjpkZWZhdWx0KCksCisgICAgfQorICB9Cit9CitpbXBsIGJpbmRlcjo6UGFyY2VsYWJsZSBmb3IgTXlFeHQgeworICBmbiB3cml0ZV90b19wYXJjZWwoJnNlbGYsIHBhcmNlbDogJm11dCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbCkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CisgICAgcGFyY2VsLnNpemVkX3dyaXRlKHxzdWJwYXJjZWx8IHsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5hKT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuYik/OworICAgICAgT2soKCkpCisgICAgfSkKKyAgfQorICBmbiByZWFkX2Zyb21fcGFyY2VsKCZtdXQgc2VsZiwgcGFyY2VsOiAmYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWwpIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4geworICAgIHBhcmNlbC5zaXplZF9yZWFkKHxzdWJwYXJjZWx8IHsKKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmEgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmIgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIE9rKCgpKQorICAgIH0pCisgIH0KK30KK2JpbmRlcjo6aW1wbF9zZXJpYWxpemVfZm9yX3BhcmNlbGFibGUhKE15RXh0KTsKK2JpbmRlcjo6aW1wbF9kZXNlcmlhbGl6ZV9mb3JfcGFyY2VsYWJsZSEoTXlFeHQpOworaW1wbCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWxhYmxlTWV0YWRhdGEgZm9yIE15RXh0IHsKKyAgZm4gZ2V0X2Rlc2NyaXB0b3IoKSAtPiAmJ3N0YXRpYyBzdHIgeyAiYW5kcm9pZC5haWRsLnRlc3RzLmV4dGVuc2lvbi5NeUV4dCIgfQorfQorcHViKGNyYXRlKSBtb2QgbWFuZ2xlZCB7CisgcHViIHVzZSBzdXBlcjo6TXlFeHQgYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c185X2V4dGVuc2lvbl81X015RXh0OworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0LnJzLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQucnMuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjgzMTc1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0LnJzLmQKQEAgLTAsMCArMSwyIEBACitvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dC5ycyA6IFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dC5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQyLnJzIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0Mi5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzAxN2I5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0Mi5ycwpAQCAtMCwwICsxLDQ5IEBACisjIVtmb3JiaWQodW5zYWZlX2NvZGUpXQorIyFbcnVzdGZtdDo6c2tpcF0KKyNbZGVyaXZlKERlYnVnKV0KK3B1YiBzdHJ1Y3QgTXlFeHQyIHsKKyAgcHViIGE6IGkzMiwKKyAgcHViIGI6IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzlfZXh0ZW5zaW9uXzVfTXlFeHQsCisgIHB1YiBjOiBTdHJpbmcsCit9CitpbXBsIERlZmF1bHQgZm9yIE15RXh0MiB7CisgIGZuIGRlZmF1bHQoKSAtPiBTZWxmIHsKKyAgICBTZWxmIHsKKyAgICAgIGE6IDAsCisgICAgICBiOiBEZWZhdWx0OjpkZWZhdWx0KCksCisgICAgICBjOiBEZWZhdWx0OjpkZWZhdWx0KCksCisgICAgfQorICB9Cit9CitpbXBsIGJpbmRlcjo6UGFyY2VsYWJsZSBmb3IgTXlFeHQyIHsKKyAgZm4gd3JpdGVfdG9fcGFyY2VsKCZzZWxmLCBwYXJjZWw6ICZtdXQgYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWwpIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4geworICAgIHBhcmNlbC5zaXplZF93cml0ZSh8c3VicGFyY2VsfCB7CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuYSk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmIpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5jKT87CisgICAgICBPaygoKSkKKyAgICB9KQorICB9CisgIGZuIHJlYWRfZnJvbV9wYXJjZWwoJm11dCBzZWxmLCBwYXJjZWw6ICZiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbCkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CisgICAgcGFyY2VsLnNpemVkX3JlYWQofHN1YnBhcmNlbHwgeworICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuYSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuYiA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuYyA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgT2soKCkpCisgICAgfSkKKyAgfQorfQorYmluZGVyOjppbXBsX3NlcmlhbGl6ZV9mb3JfcGFyY2VsYWJsZSEoTXlFeHQyKTsKK2JpbmRlcjo6aW1wbF9kZXNlcmlhbGl6ZV9mb3JfcGFyY2VsYWJsZSEoTXlFeHQyKTsKK2ltcGwgYmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsYWJsZU1ldGFkYXRhIGZvciBNeUV4dDIgeworICBmbiBnZXRfZGVzY3JpcHRvcigpIC0+ICYnc3RhdGljIHN0ciB7ICJhbmRyb2lkLmFpZGwudGVzdHMuZXh0ZW5zaW9uLk15RXh0MiIgfQorfQorcHViKGNyYXRlKSBtb2QgbWFuZ2xlZCB7CisgcHViIHVzZSBzdXBlcjo6TXlFeHQyIGFzIF83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOV9leHRlbnNpb25fNl9NeUV4dDI7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQyLnJzLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQyLnJzLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U1OGY2MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dDIucnMuZApAQCAtMCwwICsxLDMgQEAKK291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0Mi5ycyA6IFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dDIuYWlkbCBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQuYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0TGlrZS5ycyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dExpa2UucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY5OGFhMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dExpa2UucnMKQEAgLTAsMCArMSw0MyBAQAorIyFbZm9yYmlkKHVuc2FmZV9jb2RlKV0KKyMhW3J1c3RmbXQ6OnNraXBdCisjW2Rlcml2ZShEZWJ1ZyldCitwdWIgc3RydWN0IE15RXh0TGlrZSB7CisgIHB1YiBhOiBpMzIsCisgIHB1YiBiOiBTdHJpbmcsCit9CitpbXBsIERlZmF1bHQgZm9yIE15RXh0TGlrZSB7CisgIGZuIGRlZmF1bHQoKSAtPiBTZWxmIHsKKyAgICBTZWxmIHsKKyAgICAgIGE6IDAsCisgICAgICBiOiBEZWZhdWx0OjpkZWZhdWx0KCksCisgICAgfQorICB9Cit9CitpbXBsIGJpbmRlcjo6UGFyY2VsYWJsZSBmb3IgTXlFeHRMaWtlIHsKKyAgZm4gd3JpdGVfdG9fcGFyY2VsKCZzZWxmLCBwYXJjZWw6ICZtdXQgYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWwpIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4geworICAgIHBhcmNlbC5zaXplZF93cml0ZSh8c3VicGFyY2VsfCB7CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuYSk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmIpPzsKKyAgICAgIE9rKCgpKQorICAgIH0pCisgIH0KKyAgZm4gcmVhZF9mcm9tX3BhcmNlbCgmbXV0IHNlbGYsIHBhcmNlbDogJmJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsKSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsKKyAgICBwYXJjZWwuc2l6ZWRfcmVhZCh8c3VicGFyY2VsfCB7CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5hID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5iID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBPaygoKSkKKyAgICB9KQorICB9Cit9CitiaW5kZXI6OmltcGxfc2VyaWFsaXplX2Zvcl9wYXJjZWxhYmxlIShNeUV4dExpa2UpOworYmluZGVyOjppbXBsX2Rlc2VyaWFsaXplX2Zvcl9wYXJjZWxhYmxlIShNeUV4dExpa2UpOworaW1wbCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWxhYmxlTWV0YWRhdGEgZm9yIE15RXh0TGlrZSB7CisgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHsgImFuZHJvaWQuYWlkbC50ZXN0cy5leHRlbnNpb24uTXlFeHRMaWtlIiB9Cit9CitwdWIoY3JhdGUpIG1vZCBtYW5nbGVkIHsKKyBwdWIgdXNlIHN1cGVyOjpNeUV4dExpa2UgYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c185X2V4dGVuc2lvbl85X015RXh0TGlrZTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dExpa2UucnMuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dExpa2UucnMuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTkwNGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0TGlrZS5ycy5kCkBAIC0wLDAgKzEsMiBAQAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHRMaWtlLnJzIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0TGlrZS5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvRGVlcGx5TmVzdGVkLnJzIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0RlZXBseU5lc3RlZC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDdhYzE4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0RlZXBseU5lc3RlZC5ycwpAQCAtMCwwICsxLDE2MyBAQAorIyFbZm9yYmlkKHVuc2FmZV9jb2RlKV0KKyMhW3J1c3RmbXQ6OnNraXBdCisjW2Rlcml2ZShEZWJ1ZyldCitwdWIgc3RydWN0IERlZXBseU5lc3RlZCB7Cit9CitpbXBsIERlZmF1bHQgZm9yIERlZXBseU5lc3RlZCB7CisgIGZuIGRlZmF1bHQoKSAtPiBTZWxmIHsKKyAgICBTZWxmIHsKKyAgICB9CisgIH0KK30KK2ltcGwgYmluZGVyOjpQYXJjZWxhYmxlIGZvciBEZWVwbHlOZXN0ZWQgeworICBmbiB3cml0ZV90b19wYXJjZWwoJnNlbGYsIHBhcmNlbDogJm11dCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbCkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CisgICAgcGFyY2VsLnNpemVkX3dyaXRlKHxzdWJwYXJjZWx8IHsKKyAgICAgIE9rKCgpKQorICAgIH0pCisgIH0KKyAgZm4gcmVhZF9mcm9tX3BhcmNlbCgmbXV0IHNlbGYsIHBhcmNlbDogJmJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsKSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsKKyAgICBwYXJjZWwuc2l6ZWRfcmVhZCh8c3VicGFyY2VsfCB7CisgICAgICBPaygoKSkKKyAgICB9KQorICB9Cit9CitiaW5kZXI6OmltcGxfc2VyaWFsaXplX2Zvcl9wYXJjZWxhYmxlIShEZWVwbHlOZXN0ZWQpOworYmluZGVyOjppbXBsX2Rlc2VyaWFsaXplX2Zvcl9wYXJjZWxhYmxlIShEZWVwbHlOZXN0ZWQpOworaW1wbCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWxhYmxlTWV0YWRhdGEgZm9yIERlZXBseU5lc3RlZCB7CisgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHsgImFuZHJvaWQuYWlkbC50ZXN0cy5uZXN0ZWQuRGVlcGx5TmVzdGVkIiB9Cit9CitwdWIgbW9kIEEgeworICAjW2Rlcml2ZShEZWJ1ZyldCisgIHB1YiBzdHJ1Y3QgQSB7CisgICAgcHViIGU6IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzZfbmVzdGVkXzEyX0RlZXBseU5lc3RlZF8xX0JfMV9DXzFfRF8xX0UsCisgIH0KKyAgaW1wbCBEZWZhdWx0IGZvciBBIHsKKyAgICBmbiBkZWZhdWx0KCkgLT4gU2VsZiB7CisgICAgICBTZWxmIHsKKyAgICAgICAgZTogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMTJfRGVlcGx5TmVzdGVkXzFfQl8xX0NfMV9EXzFfRTo6T0ssCisgICAgICB9CisgICAgfQorICB9CisgIGltcGwgYmluZGVyOjpQYXJjZWxhYmxlIGZvciBBIHsKKyAgICBmbiB3cml0ZV90b19wYXJjZWwoJnNlbGYsIHBhcmNlbDogJm11dCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbCkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CisgICAgICBwYXJjZWwuc2l6ZWRfd3JpdGUofHN1YnBhcmNlbHwgeworICAgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuZSk/OworICAgICAgICBPaygoKSkKKyAgICAgIH0pCisgICAgfQorICAgIGZuIHJlYWRfZnJvbV9wYXJjZWwoJm11dCBzZWxmLCBwYXJjZWw6ICZiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbCkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CisgICAgICBwYXJjZWwuc2l6ZWRfcmVhZCh8c3VicGFyY2VsfCB7CisgICAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICAgIHNlbGYuZSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgICB9CisgICAgICAgIE9rKCgpKQorICAgICAgfSkKKyAgICB9CisgIH0KKyAgYmluZGVyOjppbXBsX3NlcmlhbGl6ZV9mb3JfcGFyY2VsYWJsZSEoQSk7CisgIGJpbmRlcjo6aW1wbF9kZXNlcmlhbGl6ZV9mb3JfcGFyY2VsYWJsZSEoQSk7CisgIGltcGwgYmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsYWJsZU1ldGFkYXRhIGZvciBBIHsKKyAgICBmbiBnZXRfZGVzY3JpcHRvcigpIC0+ICYnc3RhdGljIHN0ciB7ICJhbmRyb2lkLmFpZGwudGVzdHMubmVzdGVkLkRlZXBseU5lc3RlZC5BIiB9CisgIH0KK30KK3B1YiBtb2QgQiB7CisgICNbZGVyaXZlKERlYnVnKV0KKyAgcHViIHN0cnVjdCBCIHsKKyAgfQorICBpbXBsIERlZmF1bHQgZm9yIEIgeworICAgIGZuIGRlZmF1bHQoKSAtPiBTZWxmIHsKKyAgICAgIFNlbGYgeworICAgICAgfQorICAgIH0KKyAgfQorICBpbXBsIGJpbmRlcjo6UGFyY2VsYWJsZSBmb3IgQiB7CisgICAgZm4gd3JpdGVfdG9fcGFyY2VsKCZzZWxmLCBwYXJjZWw6ICZtdXQgYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWwpIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4geworICAgICAgcGFyY2VsLnNpemVkX3dyaXRlKHxzdWJwYXJjZWx8IHsKKyAgICAgICAgT2soKCkpCisgICAgICB9KQorICAgIH0KKyAgICBmbiByZWFkX2Zyb21fcGFyY2VsKCZtdXQgc2VsZiwgcGFyY2VsOiAmYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWwpIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4geworICAgICAgcGFyY2VsLnNpemVkX3JlYWQofHN1YnBhcmNlbHwgeworICAgICAgICBPaygoKSkKKyAgICAgIH0pCisgICAgfQorICB9CisgIGJpbmRlcjo6aW1wbF9zZXJpYWxpemVfZm9yX3BhcmNlbGFibGUhKEIpOworICBiaW5kZXI6OmltcGxfZGVzZXJpYWxpemVfZm9yX3BhcmNlbGFibGUhKEIpOworICBpbXBsIGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbGFibGVNZXRhZGF0YSBmb3IgQiB7CisgICAgZm4gZ2V0X2Rlc2NyaXB0b3IoKSAtPiAmJ3N0YXRpYyBzdHIgeyAiYW5kcm9pZC5haWRsLnRlc3RzLm5lc3RlZC5EZWVwbHlOZXN0ZWQuQiIgfQorICB9CisgIHB1YiBtb2QgQyB7CisgICAgI1tkZXJpdmUoRGVidWcpXQorICAgIHB1YiBzdHJ1Y3QgQyB7CisgICAgfQorICAgIGltcGwgRGVmYXVsdCBmb3IgQyB7CisgICAgICBmbiBkZWZhdWx0KCkgLT4gU2VsZiB7CisgICAgICAgIFNlbGYgeworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGltcGwgYmluZGVyOjpQYXJjZWxhYmxlIGZvciBDIHsKKyAgICAgIGZuIHdyaXRlX3RvX3BhcmNlbCgmc2VsZiwgcGFyY2VsOiAmbXV0IGJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsKSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsKKyAgICAgICAgcGFyY2VsLnNpemVkX3dyaXRlKHxzdWJwYXJjZWx8IHsKKyAgICAgICAgICBPaygoKSkKKyAgICAgICAgfSkKKyAgICAgIH0KKyAgICAgIGZuIHJlYWRfZnJvbV9wYXJjZWwoJm11dCBzZWxmLCBwYXJjZWw6ICZiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbCkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CisgICAgICAgIHBhcmNlbC5zaXplZF9yZWFkKHxzdWJwYXJjZWx8IHsKKyAgICAgICAgICBPaygoKSkKKyAgICAgICAgfSkKKyAgICAgIH0KKyAgICB9CisgICAgYmluZGVyOjppbXBsX3NlcmlhbGl6ZV9mb3JfcGFyY2VsYWJsZSEoQyk7CisgICAgYmluZGVyOjppbXBsX2Rlc2VyaWFsaXplX2Zvcl9wYXJjZWxhYmxlIShDKTsKKyAgICBpbXBsIGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbGFibGVNZXRhZGF0YSBmb3IgQyB7CisgICAgICBmbiBnZXRfZGVzY3JpcHRvcigpIC0+ICYnc3RhdGljIHN0ciB7ICJhbmRyb2lkLmFpZGwudGVzdHMubmVzdGVkLkRlZXBseU5lc3RlZC5CLkMiIH0KKyAgICB9CisgICAgcHViIG1vZCBEIHsKKyAgICAgICNbZGVyaXZlKERlYnVnKV0KKyAgICAgIHB1YiBzdHJ1Y3QgRCB7CisgICAgICB9CisgICAgICBpbXBsIERlZmF1bHQgZm9yIEQgeworICAgICAgICBmbiBkZWZhdWx0KCkgLT4gU2VsZiB7CisgICAgICAgICAgU2VsZiB7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBpbXBsIGJpbmRlcjo6UGFyY2VsYWJsZSBmb3IgRCB7CisgICAgICAgIGZuIHdyaXRlX3RvX3BhcmNlbCgmc2VsZiwgcGFyY2VsOiAmbXV0IGJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsKSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsKKyAgICAgICAgICBwYXJjZWwuc2l6ZWRfd3JpdGUofHN1YnBhcmNlbHwgeworICAgICAgICAgICAgT2soKCkpCisgICAgICAgICAgfSkKKyAgICAgICAgfQorICAgICAgICBmbiByZWFkX2Zyb21fcGFyY2VsKCZtdXQgc2VsZiwgcGFyY2VsOiAmYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWwpIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4geworICAgICAgICAgIHBhcmNlbC5zaXplZF9yZWFkKHxzdWJwYXJjZWx8IHsKKyAgICAgICAgICAgIE9rKCgpKQorICAgICAgICAgIH0pCisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJpbmRlcjo6aW1wbF9zZXJpYWxpemVfZm9yX3BhcmNlbGFibGUhKEQpOworICAgICAgYmluZGVyOjppbXBsX2Rlc2VyaWFsaXplX2Zvcl9wYXJjZWxhYmxlIShEKTsKKyAgICAgIGltcGwgYmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsYWJsZU1ldGFkYXRhIGZvciBEIHsKKyAgICAgICAgZm4gZ2V0X2Rlc2NyaXB0b3IoKSAtPiAmJ3N0YXRpYyBzdHIgeyAiYW5kcm9pZC5haWRsLnRlc3RzLm5lc3RlZC5EZWVwbHlOZXN0ZWQuQi5DLkQiIH0KKyAgICAgIH0KKyAgICAgIHB1YiBtb2QgRSB7CisgICAgICAgICMhW2FsbG93KG5vbl91cHBlcl9jYXNlX2dsb2JhbHMpXQorICAgICAgICB1c2UgYmluZGVyOjpkZWNsYXJlX2JpbmRlcl9lbnVtOworICAgICAgICBkZWNsYXJlX2JpbmRlcl9lbnVtISB7CisgICAgICAgICAgRSA6IFtpODsgMV0geworICAgICAgICAgICAgT0sgPSAwLAorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorcHViKGNyYXRlKSBtb2QgbWFuZ2xlZCB7CisgcHViIHVzZSBzdXBlcjo6RGVlcGx5TmVzdGVkIGFzIF83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMTJfRGVlcGx5TmVzdGVkOworIHB1YiB1c2Ugc3VwZXI6OkE6OkEgYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c182X25lc3RlZF8xMl9EZWVwbHlOZXN0ZWRfMV9BOworIHB1YiB1c2Ugc3VwZXI6OkI6OkIgYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c182X25lc3RlZF8xMl9EZWVwbHlOZXN0ZWRfMV9COworIHB1YiB1c2Ugc3VwZXI6OkI6OkM6OkMgYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c182X25lc3RlZF8xMl9EZWVwbHlOZXN0ZWRfMV9CXzFfQzsKKyBwdWIgdXNlIHN1cGVyOjpCOjpDOjpEOjpEIGFzIF83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMTJfRGVlcGx5TmVzdGVkXzFfQl8xX0NfMV9EOworIHB1YiB1c2Ugc3VwZXI6OkI6OkM6OkQ6OkU6OkUgYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c182X25lc3RlZF8xMl9EZWVwbHlOZXN0ZWRfMV9CXzFfQ18xX0RfMV9FOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0RlZXBseU5lc3RlZC5ycy5kIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0RlZXBseU5lc3RlZC5ycy5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZWU2YTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvRGVlcGx5TmVzdGVkLnJzLmQKQEAgLTAsMCArMSwyIEBACitvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9EZWVwbHlOZXN0ZWQucnMgOiBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvRGVlcGx5TmVzdGVkLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9JTmVzdGVkU2VydmljZS5ycyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9JTmVzdGVkU2VydmljZS5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWI3NmIzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0lOZXN0ZWRTZXJ2aWNlLnJzCkBAIC0wLDAgKzEsMzY1IEBACisjIVtmb3JiaWQodW5zYWZlX2NvZGUpXQorIyFbcnVzdGZtdDo6c2tpcF0KKyMhW2FsbG93KG5vbl91cHBlcl9jYXNlX2dsb2JhbHMpXQorIyFbYWxsb3cobm9uX3NuYWtlX2Nhc2UpXQorI1thbGxvdyh1bnVzZWRfaW1wb3J0cyldIHVzZSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpJQmluZGVySW50ZXJuYWw7Cit1c2UgYmluZGVyOjpkZWNsYXJlX2JpbmRlcl9pbnRlcmZhY2U7CitkZWNsYXJlX2JpbmRlcl9pbnRlcmZhY2UhIHsKKyAgSU5lc3RlZFNlcnZpY2VbImFuZHJvaWQuYWlkbC50ZXN0cy5uZXN0ZWQuSU5lc3RlZFNlcnZpY2UiXSB7CisgICAgbmF0aXZlOiBCbk5lc3RlZFNlcnZpY2Uob25fdHJhbnNhY3QpLAorICAgIHByb3h5OiBCcE5lc3RlZFNlcnZpY2UgeworICAgIH0sCisgICAgYXN5bmM6IElOZXN0ZWRTZXJ2aWNlQXN5bmMsCisgIH0KK30KK3B1YiB0cmFpdCBJTmVzdGVkU2VydmljZTogYmluZGVyOjpJbnRlcmZhY2UgKyBTZW5kIHsKKyAgZm4gZ2V0X2Rlc2NyaXB0b3IoKSAtPiAmJ3N0YXRpYyBzdHIgd2hlcmUgU2VsZjogU2l6ZWQgeyAiYW5kcm9pZC5haWRsLnRlc3RzLm5lc3RlZC5JTmVzdGVkU2VydmljZSIgfQorICBmbiBmbGlwU3RhdHVzKCZzZWxmLCBfYXJnX3A6ICZjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c182X25lc3RlZF8yMF9QYXJjZWxhYmxlV2l0aE5lc3RlZCkgLT4gYmluZGVyOjpSZXN1bHQ8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMTRfSU5lc3RlZFNlcnZpY2VfNl9SZXN1bHQ+OworICBmbiBmbGlwU3RhdHVzV2l0aENhbGxiYWNrKCZzZWxmLCBfYXJnX3N0YXR1czogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMjBfUGFyY2VsYWJsZVdpdGhOZXN0ZWRfNl9TdGF0dXMsIF9hcmdfY2I6ICZiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMTRfSU5lc3RlZFNlcnZpY2VfOV9JQ2FsbGJhY2s+KSAtPiBiaW5kZXI6OlJlc3VsdDwoKT47CisgIGZuIGdldERlZmF1bHRJbXBsKCkgLT4gSU5lc3RlZFNlcnZpY2VEZWZhdWx0UmVmIHdoZXJlIFNlbGY6IFNpemVkIHsKKyAgICBERUZBVUxUX0lNUEwubG9jaygpLnVud3JhcCgpLmNsb25lKCkKKyAgfQorICBmbiBzZXREZWZhdWx0SW1wbChkOiBJTmVzdGVkU2VydmljZURlZmF1bHRSZWYpIC0+IElOZXN0ZWRTZXJ2aWNlRGVmYXVsdFJlZiB3aGVyZSBTZWxmOiBTaXplZCB7CisgICAgc3RkOjptZW06OnJlcGxhY2UoJm11dCAqREVGQVVMVF9JTVBMLmxvY2soKS51bndyYXAoKSwgZCkKKyAgfQorfQorcHViIHRyYWl0IElOZXN0ZWRTZXJ2aWNlQXN5bmM8UD46IGJpbmRlcjo6SW50ZXJmYWNlICsgU2VuZCB7CisgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHdoZXJlIFNlbGY6IFNpemVkIHsgImFuZHJvaWQuYWlkbC50ZXN0cy5uZXN0ZWQuSU5lc3RlZFNlcnZpY2UiIH0KKyAgZm4gZmxpcFN0YXR1czwnYT4oJidhIHNlbGYsIF9hcmdfcDogJidhIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzZfbmVzdGVkXzIwX1BhcmNlbGFibGVXaXRoTmVzdGVkKSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMTRfSU5lc3RlZFNlcnZpY2VfNl9SZXN1bHQ+PjsKKyAgZm4gZmxpcFN0YXR1c1dpdGhDYWxsYmFjazwnYT4oJidhIHNlbGYsIF9hcmdfc3RhdHVzOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c182X25lc3RlZF8yMF9QYXJjZWxhYmxlV2l0aE5lc3RlZF82X1N0YXR1cywgX2FyZ19jYjogJidhIGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c182X25lc3RlZF8xNF9JTmVzdGVkU2VydmljZV85X0lDYWxsYmFjaz4pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDwoKT4+OworfQorI1s6OmFzeW5jX3RyYWl0Ojphc3luY190cmFpdF0KK3B1YiB0cmFpdCBJTmVzdGVkU2VydmljZUFzeW5jU2VydmVyOiBiaW5kZXI6OkludGVyZmFjZSArIFNlbmQgeworICBmbiBnZXRfZGVzY3JpcHRvcigpIC0+ICYnc3RhdGljIHN0ciB3aGVyZSBTZWxmOiBTaXplZCB7ICJhbmRyb2lkLmFpZGwudGVzdHMubmVzdGVkLklOZXN0ZWRTZXJ2aWNlIiB9CisgIGFzeW5jIGZuIGZsaXBTdGF0dXMoJnNlbGYsIF9hcmdfcDogJmNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzZfbmVzdGVkXzIwX1BhcmNlbGFibGVXaXRoTmVzdGVkKSAtPiBiaW5kZXI6OlJlc3VsdDxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c182X25lc3RlZF8xNF9JTmVzdGVkU2VydmljZV82X1Jlc3VsdD47CisgIGFzeW5jIGZuIGZsaXBTdGF0dXNXaXRoQ2FsbGJhY2soJnNlbGYsIF9hcmdfc3RhdHVzOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c182X25lc3RlZF8yMF9QYXJjZWxhYmxlV2l0aE5lc3RlZF82X1N0YXR1cywgX2FyZ19jYjogJmJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c182X25lc3RlZF8xNF9JTmVzdGVkU2VydmljZV85X0lDYWxsYmFjaz4pIC0+IGJpbmRlcjo6UmVzdWx0PCgpPjsKK30KK2ltcGwgQm5OZXN0ZWRTZXJ2aWNlIHsKKyAgLy8vIENyZWF0ZSBhIG5ldyBhc3luYyBiaW5kZXIgc2VydmljZS4KKyAgcHViIGZuIG5ld19hc3luY19iaW5kZXI8VCwgUj4oaW5uZXI6IFQsIHJ0OiBSLCBmZWF0dXJlczogYmluZGVyOjpCaW5kZXJGZWF0dXJlcykgLT4gYmluZGVyOjpTdHJvbmc8ZHluIElOZXN0ZWRTZXJ2aWNlPgorICB3aGVyZQorICAgIFQ6IElOZXN0ZWRTZXJ2aWNlQXN5bmNTZXJ2ZXIgKyBiaW5kZXI6OkludGVyZmFjZSArIFNlbmQgKyBTeW5jICsgJ3N0YXRpYywKKyAgICBSOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpCaW5kZXJBc3luY1J1bnRpbWUgKyBTZW5kICsgU3luYyArICdzdGF0aWMsCisgIHsKKyAgICBzdHJ1Y3QgV3JhcHBlcjxULCBSPiB7CisgICAgICBfaW5uZXI6IFQsCisgICAgICBfcnQ6IFIsCisgICAgfQorICAgIGltcGw8VCwgUj4gYmluZGVyOjpJbnRlcmZhY2UgZm9yIFdyYXBwZXI8VCwgUj4gd2hlcmUgVDogYmluZGVyOjpJbnRlcmZhY2UsIFI6IFNlbmQgKyBTeW5jIHsKKyAgICAgIGZuIGFzX2JpbmRlcigmc2VsZikgLT4gYmluZGVyOjpTcElCaW5kZXIgeyBzZWxmLl9pbm5lci5hc19iaW5kZXIoKSB9CisgICAgICBmbiBkdW1wKCZzZWxmLCBfZmlsZTogJnN0ZDo6ZnM6OkZpbGUsIF9hcmdzOiAmWyZzdGQ6OmZmaTo6Q1N0cl0pIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4geyBzZWxmLl9pbm5lci5kdW1wKF9maWxlLCBfYXJncykgfQorICAgIH0KKyAgICBpbXBsPFQsIFI+IElOZXN0ZWRTZXJ2aWNlIGZvciBXcmFwcGVyPFQsIFI+CisgICAgd2hlcmUKKyAgICAgIFQ6IElOZXN0ZWRTZXJ2aWNlQXN5bmNTZXJ2ZXIgKyBTZW5kICsgU3luYyArICdzdGF0aWMsCisgICAgICBSOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpCaW5kZXJBc3luY1J1bnRpbWUgKyBTZW5kICsgU3luYyArICdzdGF0aWMsCisgICAgeworICAgICAgZm4gZmxpcFN0YXR1cygmc2VsZiwgX2FyZ19wOiAmY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMjBfUGFyY2VsYWJsZVdpdGhOZXN0ZWQpIC0+IGJpbmRlcjo6UmVzdWx0PGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzZfbmVzdGVkXzE0X0lOZXN0ZWRTZXJ2aWNlXzZfUmVzdWx0PiB7CisgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLmZsaXBTdGF0dXMoX2FyZ19wKSkKKyAgICAgIH0KKyAgICAgIGZuIGZsaXBTdGF0dXNXaXRoQ2FsbGJhY2soJnNlbGYsIF9hcmdfc3RhdHVzOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c182X25lc3RlZF8yMF9QYXJjZWxhYmxlV2l0aE5lc3RlZF82X1N0YXR1cywgX2FyZ19jYjogJmJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c182X25lc3RlZF8xNF9JTmVzdGVkU2VydmljZV85X0lDYWxsYmFjaz4pIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLmZsaXBTdGF0dXNXaXRoQ2FsbGJhY2soX2FyZ19zdGF0dXMsIF9hcmdfY2IpKQorICAgICAgfQorICAgIH0KKyAgICBsZXQgd3JhcHBlZCA9IFdyYXBwZXIgeyBfaW5uZXI6IGlubmVyLCBfcnQ6IHJ0IH07CisgICAgU2VsZjo6bmV3X2JpbmRlcih3cmFwcGVkLCBmZWF0dXJlcykKKyAgfQorfQorcHViIHRyYWl0IElOZXN0ZWRTZXJ2aWNlRGVmYXVsdDogU2VuZCArIFN5bmMgeworICBmbiBmbGlwU3RhdHVzKCZzZWxmLCBfYXJnX3A6ICZjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c182X25lc3RlZF8yMF9QYXJjZWxhYmxlV2l0aE5lc3RlZCkgLT4gYmluZGVyOjpSZXN1bHQ8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMTRfSU5lc3RlZFNlcnZpY2VfNl9SZXN1bHQ+IHsKKyAgICBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OLmludG8oKSkKKyAgfQorICBmbiBmbGlwU3RhdHVzV2l0aENhbGxiYWNrKCZzZWxmLCBfYXJnX3N0YXR1czogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMjBfUGFyY2VsYWJsZVdpdGhOZXN0ZWRfNl9TdGF0dXMsIF9hcmdfY2I6ICZiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMTRfSU5lc3RlZFNlcnZpY2VfOV9JQ2FsbGJhY2s+KSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4geworICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQorICB9Cit9CitwdWIgbW9kIHRyYW5zYWN0aW9ucyB7CisgIHB1YiBjb25zdCBmbGlwU3RhdHVzOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMDsKKyAgcHViIGNvbnN0IGZsaXBTdGF0dXNXaXRoQ2FsbGJhY2s6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAxOworfQorcHViIHR5cGUgSU5lc3RlZFNlcnZpY2VEZWZhdWx0UmVmID0gT3B0aW9uPHN0ZDo6c3luYzo6QXJjPGR5biBJTmVzdGVkU2VydmljZURlZmF1bHQ+PjsKK3VzZSBsYXp5X3N0YXRpYzo6bGF6eV9zdGF0aWM7CitsYXp5X3N0YXRpYyEgeworICBzdGF0aWMgcmVmIERFRkFVTFRfSU1QTDogc3RkOjpzeW5jOjpNdXRleDxJTmVzdGVkU2VydmljZURlZmF1bHRSZWY+ID0gc3RkOjpzeW5jOjpNdXRleDo6bmV3KE5vbmUpOworfQoraW1wbCBCcE5lc3RlZFNlcnZpY2UgeworICBmbiBidWlsZF9wYXJjZWxfZmxpcFN0YXR1cygmc2VsZiwgX2FyZ19wOiAmY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMjBfUGFyY2VsYWJsZVdpdGhOZXN0ZWQpIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbD4geworICAgIGxldCBtdXQgYWlkbF9kYXRhID0gc2VsZi5iaW5kZXIucHJlcGFyZV90cmFuc2FjdCgpPzsKKyAgICBhaWRsX2RhdGEud3JpdGUoX2FyZ19wKT87CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfZmxpcFN0YXR1cygmc2VsZiwgX2FyZ19wOiAmY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMjBfUGFyY2VsYWJsZVdpdGhOZXN0ZWQsIF9haWRsX3JlcGx5OiBzdGQ6OnJlc3VsdDo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbCwgYmluZGVyOjpTdGF0dXNDb2RlPikgLT4gYmluZGVyOjpSZXN1bHQ8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMTRfSU5lc3RlZFNlcnZpY2VfNl9SZXN1bHQ+IHsKKyAgICBpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7CisgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSU5lc3RlZFNlcnZpY2U+OjpnZXREZWZhdWx0SW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5mbGlwU3RhdHVzKF9hcmdfcCk7CisgICAgICB9CisgICAgfQorICAgIGxldCBfYWlkbF9yZXBseSA9IF9haWRsX3JlcGx5PzsKKyAgICBsZXQgX2FpZGxfc3RhdHVzOiBiaW5kZXI6OlN0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWQoKT87CisgICAgaWYgIV9haWRsX3N0YXR1cy5pc19vaygpIHsgcmV0dXJuIEVycihfYWlkbF9zdGF0dXMpOyB9CisgICAgbGV0IF9haWRsX3JldHVybjogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMTRfSU5lc3RlZFNlcnZpY2VfNl9SZXN1bHQgPSBfYWlkbF9yZXBseS5yZWFkKCk/OworICAgIE9rKF9haWRsX3JldHVybikKKyAgfQorICBmbiBidWlsZF9wYXJjZWxfZmxpcFN0YXR1c1dpdGhDYWxsYmFjaygmc2VsZiwgX2FyZ19zdGF0dXM6IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzZfbmVzdGVkXzIwX1BhcmNlbGFibGVXaXRoTmVzdGVkXzZfU3RhdHVzLCBfYXJnX2NiOiAmYmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzZfbmVzdGVkXzE0X0lOZXN0ZWRTZXJ2aWNlXzlfSUNhbGxiYWNrPikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsPiB7CisgICAgbGV0IG11dCBhaWRsX2RhdGEgPSBzZWxmLmJpbmRlci5wcmVwYXJlX3RyYW5zYWN0KCk/OworICAgIGFpZGxfZGF0YS53cml0ZSgmX2FyZ19zdGF0dXMpPzsKKyAgICBhaWRsX2RhdGEud3JpdGUoX2FyZ19jYik/OworICAgIE9rKGFpZGxfZGF0YSkKKyAgfQorICBmbiByZWFkX3Jlc3BvbnNlX2ZsaXBTdGF0dXNXaXRoQ2FsbGJhY2soJnNlbGYsIF9hcmdfc3RhdHVzOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c182X25lc3RlZF8yMF9QYXJjZWxhYmxlV2l0aE5lc3RlZF82X1N0YXR1cywgX2FyZ19jYjogJmJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c182X25lc3RlZF8xNF9JTmVzdGVkU2VydmljZV85X0lDYWxsYmFjaz4sIF9haWRsX3JlcGx5OiBzdGQ6OnJlc3VsdDo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbCwgYmluZGVyOjpTdGF0dXNDb2RlPikgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKKyAgICBpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7CisgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSU5lc3RlZFNlcnZpY2U+OjpnZXREZWZhdWx0SW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5mbGlwU3RhdHVzV2l0aENhbGxiYWNrKF9hcmdfc3RhdHVzLCBfYXJnX2NiKTsKKyAgICAgIH0KKyAgICB9CisgICAgbGV0IF9haWRsX3JlcGx5ID0gX2FpZGxfcmVwbHk/OworICAgIGxldCBfYWlkbF9zdGF0dXM6IGJpbmRlcjo6U3RhdHVzID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKKyAgICBpZiAhX2FpZGxfc3RhdHVzLmlzX29rKCkgeyByZXR1cm4gRXJyKF9haWRsX3N0YXR1cyk7IH0KKyAgICBPaygoKSkKKyAgfQorfQoraW1wbCBJTmVzdGVkU2VydmljZSBmb3IgQnBOZXN0ZWRTZXJ2aWNlIHsKKyAgZm4gZmxpcFN0YXR1cygmc2VsZiwgX2FyZ19wOiAmY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMjBfUGFyY2VsYWJsZVdpdGhOZXN0ZWQpIC0+IGJpbmRlcjo6UmVzdWx0PGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzZfbmVzdGVkXzE0X0lOZXN0ZWRTZXJ2aWNlXzZfUmVzdWx0PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBzZWxmLmJ1aWxkX3BhcmNlbF9mbGlwU3RhdHVzKF9hcmdfcCk/OworICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OmZsaXBTdGF0dXMsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCk7CisgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX2ZsaXBTdGF0dXMoX2FyZ19wLCBfYWlkbF9yZXBseSkKKyAgfQorICBmbiBmbGlwU3RhdHVzV2l0aENhbGxiYWNrKCZzZWxmLCBfYXJnX3N0YXR1czogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMjBfUGFyY2VsYWJsZVdpdGhOZXN0ZWRfNl9TdGF0dXMsIF9hcmdfY2I6ICZiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMTRfSU5lc3RlZFNlcnZpY2VfOV9JQ2FsbGJhY2s+KSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4geworICAgIGxldCBfYWlkbF9kYXRhID0gc2VsZi5idWlsZF9wYXJjZWxfZmxpcFN0YXR1c1dpdGhDYWxsYmFjayhfYXJnX3N0YXR1cywgX2FyZ19jYik/OworICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OmZsaXBTdGF0dXNXaXRoQ2FsbGJhY2ssIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCk7CisgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX2ZsaXBTdGF0dXNXaXRoQ2FsbGJhY2soX2FyZ19zdGF0dXMsIF9hcmdfY2IsIF9haWRsX3JlcGx5KQorICB9Cit9CitpbXBsPFA6IGJpbmRlcjo6QmluZGVyQXN5bmNQb29sPiBJTmVzdGVkU2VydmljZUFzeW5jPFA+IGZvciBCcE5lc3RlZFNlcnZpY2UgeworICBmbiBmbGlwU3RhdHVzPCdhPigmJ2Egc2VsZiwgX2FyZ19wOiAmJ2EgY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMjBfUGFyY2VsYWJsZVdpdGhOZXN0ZWQpIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c182X25lc3RlZF8xNF9JTmVzdGVkU2VydmljZV82X1Jlc3VsdD4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX2ZsaXBTdGF0dXMoX2FyZ19wKSB7CisgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgIH07CisgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgUDo6c3Bhd24oCisgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpmbGlwU3RhdHVzLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpLAorICAgICAgbW92ZSB8X2FpZGxfcmVwbHl8IGFzeW5jIG1vdmUgeworICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfZmxpcFN0YXR1cyhfYXJnX3AsIF9haWRsX3JlcGx5KQorICAgICAgfQorICAgICkKKyAgfQorICBmbiBmbGlwU3RhdHVzV2l0aENhbGxiYWNrPCdhPigmJ2Egc2VsZiwgX2FyZ19zdGF0dXM6IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzZfbmVzdGVkXzIwX1BhcmNlbGFibGVXaXRoTmVzdGVkXzZfU3RhdHVzLCBfYXJnX2NiOiAmJ2EgYmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzZfbmVzdGVkXzE0X0lOZXN0ZWRTZXJ2aWNlXzlfSUNhbGxiYWNrPikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PCgpPj4geworICAgIGxldCBfYWlkbF9kYXRhID0gbWF0Y2ggc2VsZi5idWlsZF9wYXJjZWxfZmxpcFN0YXR1c1dpdGhDYWxsYmFjayhfYXJnX3N0YXR1cywgX2FyZ19jYikgeworICAgICAgT2soX2FpZGxfZGF0YSkgPT4gX2FpZGxfZGF0YSwKKyAgICAgIEVycihlcnIpID0+IHJldHVybiBCb3g6OnBpbihzdGQ6OmZ1dHVyZTo6cmVhZHkoRXJyKGVycikpKSwKKyAgICB9OworICAgIGxldCBiaW5kZXIgPSBzZWxmLmJpbmRlci5jbG9uZSgpOworICAgIFA6OnNwYXduKAorICAgICAgbW92ZSB8fCBiaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6ZmxpcFN0YXR1c1dpdGhDYWxsYmFjaywgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKSwKKyAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX2ZsaXBTdGF0dXNXaXRoQ2FsbGJhY2soX2FyZ19zdGF0dXMsIF9hcmdfY2IsIF9haWRsX3JlcGx5KQorICAgICAgfQorICAgICkKKyAgfQorfQoraW1wbCBJTmVzdGVkU2VydmljZSBmb3IgYmluZGVyOjpiaW5kZXJfaW1wbDo6QmluZGVyPEJuTmVzdGVkU2VydmljZT4geworICBmbiBmbGlwU3RhdHVzKCZzZWxmLCBfYXJnX3A6ICZjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c182X25lc3RlZF8yMF9QYXJjZWxhYmxlV2l0aE5lc3RlZCkgLT4gYmluZGVyOjpSZXN1bHQ8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMTRfSU5lc3RlZFNlcnZpY2VfNl9SZXN1bHQ+IHsgc2VsZi4wLmZsaXBTdGF0dXMoX2FyZ19wKSB9CisgIGZuIGZsaXBTdGF0dXNXaXRoQ2FsbGJhY2soJnNlbGYsIF9hcmdfc3RhdHVzOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c182X25lc3RlZF8yMF9QYXJjZWxhYmxlV2l0aE5lc3RlZF82X1N0YXR1cywgX2FyZ19jYjogJmJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c182X25lc3RlZF8xNF9JTmVzdGVkU2VydmljZV85X0lDYWxsYmFjaz4pIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7IHNlbGYuMC5mbGlwU3RhdHVzV2l0aENhbGxiYWNrKF9hcmdfc3RhdHVzLCBfYXJnX2NiKSB9Cit9CitmbiBvbl90cmFuc2FjdChfYWlkbF9zZXJ2aWNlOiAmZHluIElOZXN0ZWRTZXJ2aWNlLCBfYWlkbF9jb2RlOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUsIF9haWRsX2RhdGE6ICZiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbDwnXz4sIF9haWRsX3JlcGx5OiAmbXV0IGJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsPCdfPikgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CisgIG1hdGNoIF9haWRsX2NvZGUgeworICAgIHRyYW5zYWN0aW9uczo6ZmxpcFN0YXR1cyA9PiB7CisgICAgICBsZXQgX2FyZ19wOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c182X25lc3RlZF8yMF9QYXJjZWxhYmxlV2l0aE5lc3RlZCA9IF9haWRsX2RhdGEucmVhZCgpPzsKKyAgICAgIGxldCBfYWlkbF9yZXR1cm4gPSBfYWlkbF9zZXJ2aWNlLmZsaXBTdGF0dXMoJl9hcmdfcCk7CisgICAgICBtYXRjaCAmX2FpZGxfcmV0dXJuIHsKKyAgICAgICAgT2soX2FpZGxfcmV0dXJuKSA9PiB7CisgICAgICAgICAgX2FpZGxfcmVwbHkud3JpdGUoJmJpbmRlcjo6U3RhdHVzOjpmcm9tKGJpbmRlcjo6U3RhdHVzQ29kZTo6T0spKT87CisgICAgICAgICAgX2FpZGxfcmVwbHkud3JpdGUoX2FpZGxfcmV0dXJuKT87CisgICAgICAgIH0KKyAgICAgICAgRXJyKF9haWRsX3N0YXR1cykgPT4gX2FpZGxfcmVwbHkud3JpdGUoX2FpZGxfc3RhdHVzKT8KKyAgICAgIH0KKyAgICAgIE9rKCgpKQorICAgIH0KKyAgICB0cmFuc2FjdGlvbnM6OmZsaXBTdGF0dXNXaXRoQ2FsbGJhY2sgPT4geworICAgICAgbGV0IF9hcmdfc3RhdHVzOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c182X25lc3RlZF8yMF9QYXJjZWxhYmxlV2l0aE5lc3RlZF82X1N0YXR1cyA9IF9haWRsX2RhdGEucmVhZCgpPzsKKyAgICAgIGxldCBfYXJnX2NiOiBiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMTRfSU5lc3RlZFNlcnZpY2VfOV9JQ2FsbGJhY2s+ID0gX2FpZGxfZGF0YS5yZWFkKCk/OworICAgICAgbGV0IF9haWRsX3JldHVybiA9IF9haWRsX3NlcnZpY2UuZmxpcFN0YXR1c1dpdGhDYWxsYmFjayhfYXJnX3N0YXR1cywgJl9hcmdfY2IpOworICAgICAgbWF0Y2ggJl9haWRsX3JldHVybiB7CisgICAgICAgIE9rKF9haWRsX3JldHVybikgPT4geworICAgICAgICAgIF9haWRsX3JlcGx5LndyaXRlKCZiaW5kZXI6OlN0YXR1czo6ZnJvbShiaW5kZXI6OlN0YXR1c0NvZGU6Ok9LKSk/OworICAgICAgICB9CisgICAgICAgIEVycihfYWlkbF9zdGF0dXMpID0+IF9haWRsX3JlcGx5LndyaXRlKF9haWRsX3N0YXR1cyk/CisgICAgICB9CisgICAgICBPaygoKSkKKyAgICB9CisgICAgXyA9PiBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKQorICB9Cit9CitwdWIgbW9kIFJlc3VsdCB7CisgICNbZGVyaXZlKERlYnVnLCBQYXJ0aWFsRXEpXQorICBwdWIgc3RydWN0IFJlc3VsdCB7CisgICAgcHViIHN0YXR1czogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMjBfUGFyY2VsYWJsZVdpdGhOZXN0ZWRfNl9TdGF0dXMsCisgIH0KKyAgaW1wbCBEZWZhdWx0IGZvciBSZXN1bHQgeworICAgIGZuIGRlZmF1bHQoKSAtPiBTZWxmIHsKKyAgICAgIFNlbGYgeworICAgICAgICBzdGF0dXM6IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzZfbmVzdGVkXzIwX1BhcmNlbGFibGVXaXRoTmVzdGVkXzZfU3RhdHVzOjpPSywKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaW1wbCBiaW5kZXI6OlBhcmNlbGFibGUgZm9yIFJlc3VsdCB7CisgICAgZm4gd3JpdGVfdG9fcGFyY2VsKCZzZWxmLCBwYXJjZWw6ICZtdXQgYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWwpIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4geworICAgICAgcGFyY2VsLnNpemVkX3dyaXRlKHxzdWJwYXJjZWx8IHsKKyAgICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLnN0YXR1cyk/OworICAgICAgICBPaygoKSkKKyAgICAgIH0pCisgICAgfQorICAgIGZuIHJlYWRfZnJvbV9wYXJjZWwoJm11dCBzZWxmLCBwYXJjZWw6ICZiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbCkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CisgICAgICBwYXJjZWwuc2l6ZWRfcmVhZCh8c3VicGFyY2VsfCB7CisgICAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICAgIHNlbGYuc3RhdHVzID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICAgIH0KKyAgICAgICAgT2soKCkpCisgICAgICB9KQorICAgIH0KKyAgfQorICBiaW5kZXI6OmltcGxfc2VyaWFsaXplX2Zvcl9wYXJjZWxhYmxlIShSZXN1bHQpOworICBiaW5kZXI6OmltcGxfZGVzZXJpYWxpemVfZm9yX3BhcmNlbGFibGUhKFJlc3VsdCk7CisgIGltcGwgYmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsYWJsZU1ldGFkYXRhIGZvciBSZXN1bHQgeworICAgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHsgImFuZHJvaWQuYWlkbC50ZXN0cy5uZXN0ZWQuSU5lc3RlZFNlcnZpY2UuUmVzdWx0IiB9CisgIH0KK30KK3B1YiBtb2QgSUNhbGxiYWNrIHsKKyAgIyFbYWxsb3cobm9uX3VwcGVyX2Nhc2VfZ2xvYmFscyldCisgICMhW2FsbG93KG5vbl9zbmFrZV9jYXNlKV0KKyAgI1thbGxvdyh1bnVzZWRfaW1wb3J0cyldIHVzZSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpJQmluZGVySW50ZXJuYWw7CisgIHVzZSBiaW5kZXI6OmRlY2xhcmVfYmluZGVyX2ludGVyZmFjZTsKKyAgZGVjbGFyZV9iaW5kZXJfaW50ZXJmYWNlISB7CisgICAgSUNhbGxiYWNrWyJhbmRyb2lkLmFpZGwudGVzdHMubmVzdGVkLklOZXN0ZWRTZXJ2aWNlLklDYWxsYmFjayJdIHsKKyAgICAgIG5hdGl2ZTogQm5DYWxsYmFjayhvbl90cmFuc2FjdCksCisgICAgICBwcm94eTogQnBDYWxsYmFjayB7CisgICAgICB9LAorICAgICAgYXN5bmM6IElDYWxsYmFja0FzeW5jLAorICAgIH0KKyAgfQorICBwdWIgdHJhaXQgSUNhbGxiYWNrOiBiaW5kZXI6OkludGVyZmFjZSArIFNlbmQgeworICAgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHdoZXJlIFNlbGY6IFNpemVkIHsgImFuZHJvaWQuYWlkbC50ZXN0cy5uZXN0ZWQuSU5lc3RlZFNlcnZpY2UuSUNhbGxiYWNrIiB9CisgICAgZm4gZG9uZSgmc2VsZiwgX2FyZ19zdGF0dXM6IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzZfbmVzdGVkXzIwX1BhcmNlbGFibGVXaXRoTmVzdGVkXzZfU3RhdHVzKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT47CisgICAgZm4gZ2V0RGVmYXVsdEltcGwoKSAtPiBJQ2FsbGJhY2tEZWZhdWx0UmVmIHdoZXJlIFNlbGY6IFNpemVkIHsKKyAgICAgIERFRkFVTFRfSU1QTC5sb2NrKCkudW53cmFwKCkuY2xvbmUoKQorICAgIH0KKyAgICBmbiBzZXREZWZhdWx0SW1wbChkOiBJQ2FsbGJhY2tEZWZhdWx0UmVmKSAtPiBJQ2FsbGJhY2tEZWZhdWx0UmVmIHdoZXJlIFNlbGY6IFNpemVkIHsKKyAgICAgIHN0ZDo6bWVtOjpyZXBsYWNlKCZtdXQgKkRFRkFVTFRfSU1QTC5sb2NrKCkudW53cmFwKCksIGQpCisgICAgfQorICB9CisgIHB1YiB0cmFpdCBJQ2FsbGJhY2tBc3luYzxQPjogYmluZGVyOjpJbnRlcmZhY2UgKyBTZW5kIHsKKyAgICBmbiBnZXRfZGVzY3JpcHRvcigpIC0+ICYnc3RhdGljIHN0ciB3aGVyZSBTZWxmOiBTaXplZCB7ICJhbmRyb2lkLmFpZGwudGVzdHMubmVzdGVkLklOZXN0ZWRTZXJ2aWNlLklDYWxsYmFjayIgfQorICAgIGZuIGRvbmU8J2E+KCYnYSBzZWxmLCBfYXJnX3N0YXR1czogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMjBfUGFyY2VsYWJsZVdpdGhOZXN0ZWRfNl9TdGF0dXMpIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDwoKT4+OworICB9CisgICNbOjphc3luY190cmFpdDo6YXN5bmNfdHJhaXRdCisgIHB1YiB0cmFpdCBJQ2FsbGJhY2tBc3luY1NlcnZlcjogYmluZGVyOjpJbnRlcmZhY2UgKyBTZW5kIHsKKyAgICBmbiBnZXRfZGVzY3JpcHRvcigpIC0+ICYnc3RhdGljIHN0ciB3aGVyZSBTZWxmOiBTaXplZCB7ICJhbmRyb2lkLmFpZGwudGVzdHMubmVzdGVkLklOZXN0ZWRTZXJ2aWNlLklDYWxsYmFjayIgfQorICAgIGFzeW5jIGZuIGRvbmUoJnNlbGYsIF9hcmdfc3RhdHVzOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c182X25lc3RlZF8yMF9QYXJjZWxhYmxlV2l0aE5lc3RlZF82X1N0YXR1cykgLT4gYmluZGVyOjpSZXN1bHQ8KCk+OworICB9CisgIGltcGwgQm5DYWxsYmFjayB7CisgICAgLy8vIENyZWF0ZSBhIG5ldyBhc3luYyBiaW5kZXIgc2VydmljZS4KKyAgICBwdWIgZm4gbmV3X2FzeW5jX2JpbmRlcjxULCBSPihpbm5lcjogVCwgcnQ6IFIsIGZlYXR1cmVzOiBiaW5kZXI6OkJpbmRlckZlYXR1cmVzKSAtPiBiaW5kZXI6OlN0cm9uZzxkeW4gSUNhbGxiYWNrPgorICAgIHdoZXJlCisgICAgICBUOiBJQ2FsbGJhY2tBc3luY1NlcnZlciArIGJpbmRlcjo6SW50ZXJmYWNlICsgU2VuZCArIFN5bmMgKyAnc3RhdGljLAorICAgICAgUjogYmluZGVyOjpiaW5kZXJfaW1wbDo6QmluZGVyQXN5bmNSdW50aW1lICsgU2VuZCArIFN5bmMgKyAnc3RhdGljLAorICAgIHsKKyAgICAgIHN0cnVjdCBXcmFwcGVyPFQsIFI+IHsKKyAgICAgICAgX2lubmVyOiBULAorICAgICAgICBfcnQ6IFIsCisgICAgICB9CisgICAgICBpbXBsPFQsIFI+IGJpbmRlcjo6SW50ZXJmYWNlIGZvciBXcmFwcGVyPFQsIFI+IHdoZXJlIFQ6IGJpbmRlcjo6SW50ZXJmYWNlLCBSOiBTZW5kICsgU3luYyB7CisgICAgICAgIGZuIGFzX2JpbmRlcigmc2VsZikgLT4gYmluZGVyOjpTcElCaW5kZXIgeyBzZWxmLl9pbm5lci5hc19iaW5kZXIoKSB9CisgICAgICAgIGZuIGR1bXAoJnNlbGYsIF9maWxlOiAmc3RkOjpmczo6RmlsZSwgX2FyZ3M6ICZbJnN0ZDo6ZmZpOjpDU3RyXSkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7IHNlbGYuX2lubmVyLmR1bXAoX2ZpbGUsIF9hcmdzKSB9CisgICAgICB9CisgICAgICBpbXBsPFQsIFI+IElDYWxsYmFjayBmb3IgV3JhcHBlcjxULCBSPgorICAgICAgd2hlcmUKKyAgICAgICAgVDogSUNhbGxiYWNrQXN5bmNTZXJ2ZXIgKyBTZW5kICsgU3luYyArICdzdGF0aWMsCisgICAgICAgIFI6IGJpbmRlcjo6YmluZGVyX2ltcGw6OkJpbmRlckFzeW5jUnVudGltZSArIFNlbmQgKyBTeW5jICsgJ3N0YXRpYywKKyAgICAgIHsKKyAgICAgICAgZm4gZG9uZSgmc2VsZiwgX2FyZ19zdGF0dXM6IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzZfbmVzdGVkXzIwX1BhcmNlbGFibGVXaXRoTmVzdGVkXzZfU3RhdHVzKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4geworICAgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLmRvbmUoX2FyZ19zdGF0dXMpKQorICAgICAgICB9CisgICAgICB9CisgICAgICBsZXQgd3JhcHBlZCA9IFdyYXBwZXIgeyBfaW5uZXI6IGlubmVyLCBfcnQ6IHJ0IH07CisgICAgICBTZWxmOjpuZXdfYmluZGVyKHdyYXBwZWQsIGZlYXR1cmVzKQorICAgIH0KKyAgfQorICBwdWIgdHJhaXQgSUNhbGxiYWNrRGVmYXVsdDogU2VuZCArIFN5bmMgeworICAgIGZuIGRvbmUoJnNlbGYsIF9hcmdfc3RhdHVzOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c182X25lc3RlZF8yMF9QYXJjZWxhYmxlV2l0aE5lc3RlZF82X1N0YXR1cykgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKKyAgICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQorICAgIH0KKyAgfQorICBwdWIgbW9kIHRyYW5zYWN0aW9ucyB7CisgICAgcHViIGNvbnN0IGRvbmU6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAwOworICB9CisgIHB1YiB0eXBlIElDYWxsYmFja0RlZmF1bHRSZWYgPSBPcHRpb248c3RkOjpzeW5jOjpBcmM8ZHluIElDYWxsYmFja0RlZmF1bHQ+PjsKKyAgdXNlIGxhenlfc3RhdGljOjpsYXp5X3N0YXRpYzsKKyAgbGF6eV9zdGF0aWMhIHsKKyAgICBzdGF0aWMgcmVmIERFRkFVTFRfSU1QTDogc3RkOjpzeW5jOjpNdXRleDxJQ2FsbGJhY2tEZWZhdWx0UmVmPiA9IHN0ZDo6c3luYzo6TXV0ZXg6Om5ldyhOb25lKTsKKyAgfQorICBpbXBsIEJwQ2FsbGJhY2sgeworICAgIGZuIGJ1aWxkX3BhcmNlbF9kb25lKCZzZWxmLCBfYXJnX3N0YXR1czogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMjBfUGFyY2VsYWJsZVdpdGhOZXN0ZWRfNl9TdGF0dXMpIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbD4geworICAgICAgbGV0IG11dCBhaWRsX2RhdGEgPSBzZWxmLmJpbmRlci5wcmVwYXJlX3RyYW5zYWN0KCk/OworICAgICAgYWlkbF9kYXRhLndyaXRlKCZfYXJnX3N0YXR1cyk/OworICAgICAgT2soYWlkbF9kYXRhKQorICAgIH0KKyAgICBmbiByZWFkX3Jlc3BvbnNlX2RvbmUoJnNlbGYsIF9hcmdfc3RhdHVzOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c182X25lc3RlZF8yMF9QYXJjZWxhYmxlV2l0aE5lc3RlZF82X1N0YXR1cywgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4geworICAgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgeworICAgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSUNhbGxiYWNrPjo6Z2V0RGVmYXVsdEltcGwoKSB7CisgICAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5kb25lKF9hcmdfc3RhdHVzKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgbGV0IF9haWRsX3JlcGx5ID0gX2FpZGxfcmVwbHk/OworICAgICAgbGV0IF9haWRsX3N0YXR1czogYmluZGVyOjpTdGF0dXMgPSBfYWlkbF9yZXBseS5yZWFkKCk/OworICAgICAgaWYgIV9haWRsX3N0YXR1cy5pc19vaygpIHsgcmV0dXJuIEVycihfYWlkbF9zdGF0dXMpOyB9CisgICAgICBPaygoKSkKKyAgICB9CisgIH0KKyAgaW1wbCBJQ2FsbGJhY2sgZm9yIEJwQ2FsbGJhY2sgeworICAgIGZuIGRvbmUoJnNlbGYsIF9hcmdfc3RhdHVzOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c182X25lc3RlZF8yMF9QYXJjZWxhYmxlV2l0aE5lc3RlZF82X1N0YXR1cykgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKKyAgICAgIGxldCBfYWlkbF9kYXRhID0gc2VsZi5idWlsZF9wYXJjZWxfZG9uZShfYXJnX3N0YXR1cyk/OworICAgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6ZG9uZSwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9kb25lKF9hcmdfc3RhdHVzLCBfYWlkbF9yZXBseSkKKyAgICB9CisgIH0KKyAgaW1wbDxQOiBiaW5kZXI6OkJpbmRlckFzeW5jUG9vbD4gSUNhbGxiYWNrQXN5bmM8UD4gZm9yIEJwQ2FsbGJhY2sgeworICAgIGZuIGRvbmU8J2E+KCYnYSBzZWxmLCBfYXJnX3N0YXR1czogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMjBfUGFyY2VsYWJsZVdpdGhOZXN0ZWRfNl9TdGF0dXMpIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDwoKT4+IHsKKyAgICAgIGxldCBfYWlkbF9kYXRhID0gbWF0Y2ggc2VsZi5idWlsZF9wYXJjZWxfZG9uZShfYXJnX3N0YXR1cykgeworICAgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgICB9OworICAgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgICBQOjpzcGF3bigKKyAgICAgICAgbW92ZSB8fCBiaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6ZG9uZSwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKSwKKyAgICAgICAgbW92ZSB8X2FpZGxfcmVwbHl8IGFzeW5jIG1vdmUgeworICAgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9kb25lKF9hcmdfc3RhdHVzLCBfYWlkbF9yZXBseSkKKyAgICAgICAgfQorICAgICAgKQorICAgIH0KKyAgfQorICBpbXBsIElDYWxsYmFjayBmb3IgYmluZGVyOjpiaW5kZXJfaW1wbDo6QmluZGVyPEJuQ2FsbGJhY2s+IHsKKyAgICBmbiBkb25lKCZzZWxmLCBfYXJnX3N0YXR1czogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMjBfUGFyY2VsYWJsZVdpdGhOZXN0ZWRfNl9TdGF0dXMpIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7IHNlbGYuMC5kb25lKF9hcmdfc3RhdHVzKSB9CisgIH0KKyAgZm4gb25fdHJhbnNhY3QoX2FpZGxfc2VydmljZTogJmR5biBJQ2FsbGJhY2ssIF9haWRsX2NvZGU6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSwgX2FpZGxfZGF0YTogJmJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsPCdfPiwgX2FpZGxfcmVwbHk6ICZtdXQgYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWw8J18+KSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsKKyAgICBtYXRjaCBfYWlkbF9jb2RlIHsKKyAgICAgIHRyYW5zYWN0aW9uczo6ZG9uZSA9PiB7CisgICAgICAgIGxldCBfYXJnX3N0YXR1czogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMjBfUGFyY2VsYWJsZVdpdGhOZXN0ZWRfNl9TdGF0dXMgPSBfYWlkbF9kYXRhLnJlYWQoKT87CisgICAgICAgIGxldCBfYWlkbF9yZXR1cm4gPSBfYWlkbF9zZXJ2aWNlLmRvbmUoX2FyZ19zdGF0dXMpOworICAgICAgICBtYXRjaCAmX2FpZGxfcmV0dXJuIHsKKyAgICAgICAgICBPayhfYWlkbF9yZXR1cm4pID0+IHsKKyAgICAgICAgICAgIF9haWRsX3JlcGx5LndyaXRlKCZiaW5kZXI6OlN0YXR1czo6ZnJvbShiaW5kZXI6OlN0YXR1c0NvZGU6Ok9LKSk/OworICAgICAgICAgIH0KKyAgICAgICAgICBFcnIoX2FpZGxfc3RhdHVzKSA9PiBfYWlkbF9yZXBseS53cml0ZShfYWlkbF9zdGF0dXMpPworICAgICAgICB9CisgICAgICAgIE9rKCgpKQorICAgICAgfQorICAgICAgXyA9PiBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKQorICAgIH0KKyAgfQorfQorcHViKGNyYXRlKSBtb2QgbWFuZ2xlZCB7CisgcHViIHVzZSBzdXBlcjo6SU5lc3RlZFNlcnZpY2UgYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c182X25lc3RlZF8xNF9JTmVzdGVkU2VydmljZTsKKyBwdWIgdXNlIHN1cGVyOjpSZXN1bHQ6OlJlc3VsdCBhcyBfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzZfbmVzdGVkXzE0X0lOZXN0ZWRTZXJ2aWNlXzZfUmVzdWx0OworIHB1YiB1c2Ugc3VwZXI6OklDYWxsYmFjazo6SUNhbGxiYWNrIGFzIF83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMTRfSU5lc3RlZFNlcnZpY2VfOV9JQ2FsbGJhY2s7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvSU5lc3RlZFNlcnZpY2UucnMuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9JTmVzdGVkU2VydmljZS5ycy5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyODM5ZDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvSU5lc3RlZFNlcnZpY2UucnMuZApAQCAtMCwwICsxLDMgQEAKK291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0lOZXN0ZWRTZXJ2aWNlLnJzIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0lOZXN0ZWRTZXJ2aWNlLmFpZGwgXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL1BhcmNlbGFibGVXaXRoTmVzdGVkLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9QYXJjZWxhYmxlV2l0aE5lc3RlZC5ycyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9QYXJjZWxhYmxlV2l0aE5lc3RlZC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTYwZDhiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL1BhcmNlbGFibGVXaXRoTmVzdGVkLnJzCkBAIC0wLDAgKzEsNDggQEAKKyMhW2ZvcmJpZCh1bnNhZmVfY29kZSldCisjIVtydXN0Zm10Ojpza2lwXQorI1tkZXJpdmUoRGVidWcpXQorcHViIHN0cnVjdCBQYXJjZWxhYmxlV2l0aE5lc3RlZCB7CisgIHB1YiBzdGF0dXM6IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzZfbmVzdGVkXzIwX1BhcmNlbGFibGVXaXRoTmVzdGVkXzZfU3RhdHVzLAorfQoraW1wbCBEZWZhdWx0IGZvciBQYXJjZWxhYmxlV2l0aE5lc3RlZCB7CisgIGZuIGRlZmF1bHQoKSAtPiBTZWxmIHsKKyAgICBTZWxmIHsKKyAgICAgIHN0YXR1czogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMjBfUGFyY2VsYWJsZVdpdGhOZXN0ZWRfNl9TdGF0dXM6Ok9LLAorICAgIH0KKyAgfQorfQoraW1wbCBiaW5kZXI6OlBhcmNlbGFibGUgZm9yIFBhcmNlbGFibGVXaXRoTmVzdGVkIHsKKyAgZm4gd3JpdGVfdG9fcGFyY2VsKCZzZWxmLCBwYXJjZWw6ICZtdXQgYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWwpIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4geworICAgIHBhcmNlbC5zaXplZF93cml0ZSh8c3VicGFyY2VsfCB7CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuc3RhdHVzKT87CisgICAgICBPaygoKSkKKyAgICB9KQorICB9CisgIGZuIHJlYWRfZnJvbV9wYXJjZWwoJm11dCBzZWxmLCBwYXJjZWw6ICZiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbCkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CisgICAgcGFyY2VsLnNpemVkX3JlYWQofHN1YnBhcmNlbHwgeworICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuc3RhdHVzID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBPaygoKSkKKyAgICB9KQorICB9Cit9CitiaW5kZXI6OmltcGxfc2VyaWFsaXplX2Zvcl9wYXJjZWxhYmxlIShQYXJjZWxhYmxlV2l0aE5lc3RlZCk7CitiaW5kZXI6OmltcGxfZGVzZXJpYWxpemVfZm9yX3BhcmNlbGFibGUhKFBhcmNlbGFibGVXaXRoTmVzdGVkKTsKK2ltcGwgYmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsYWJsZU1ldGFkYXRhIGZvciBQYXJjZWxhYmxlV2l0aE5lc3RlZCB7CisgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHsgImFuZHJvaWQuYWlkbC50ZXN0cy5uZXN0ZWQuUGFyY2VsYWJsZVdpdGhOZXN0ZWQiIH0KK30KK3B1YiBtb2QgU3RhdHVzIHsKKyAgIyFbYWxsb3cobm9uX3VwcGVyX2Nhc2VfZ2xvYmFscyldCisgIHVzZSBiaW5kZXI6OmRlY2xhcmVfYmluZGVyX2VudW07CisgIGRlY2xhcmVfYmluZGVyX2VudW0hIHsKKyAgICBTdGF0dXMgOiBbaTg7IDJdIHsKKyAgICAgIE9LID0gMCwKKyAgICAgIE5PVF9PSyA9IDEsCisgICAgfQorICB9Cit9CitwdWIoY3JhdGUpIG1vZCBtYW5nbGVkIHsKKyBwdWIgdXNlIHN1cGVyOjpQYXJjZWxhYmxlV2l0aE5lc3RlZCBhcyBfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzZfbmVzdGVkXzIwX1BhcmNlbGFibGVXaXRoTmVzdGVkOworIHB1YiB1c2Ugc3VwZXI6OlN0YXR1czo6U3RhdHVzIGFzIF83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMjBfUGFyY2VsYWJsZVdpdGhOZXN0ZWRfNl9TdGF0dXM7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvUGFyY2VsYWJsZVdpdGhOZXN0ZWQucnMuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9QYXJjZWxhYmxlV2l0aE5lc3RlZC5ycy5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MTQxNGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvUGFyY2VsYWJsZVdpdGhOZXN0ZWQucnMuZApAQCAtMCwwICsxLDIgQEAKK291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL1BhcmNlbGFibGVXaXRoTmVzdGVkLnJzIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL1BhcmNlbGFibGVXaXRoTmVzdGVkLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9FbnVtVW5pb24ucnMgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvRW51bVVuaW9uLnJzCmluZGV4IDQyNmI5ZDIuLjZmMjZkY2MgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9FbnVtVW5pb24ucnMKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL0VudW1Vbmlvbi5ycwpAQCAtMSwyOSArMSwyMCBAQAorIyFbZm9yYmlkKHVuc2FmZV9jb2RlKV0KKyMhW3J1c3RmbXQ6OnNraXBdCiAjW2Rlcml2ZShEZWJ1ZywgQ2xvbmUsIFBhcnRpYWxFcSldCiBwdWIgZW51bSBFbnVtVW5pb24gewogICBJbnRFbnVtKGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bSksCiAgIExvbmdFbnVtKGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW0pLAorICAjW2RlcHJlY2F0ZWQgPSAiZG8gbm90IHVzZSB0aGlzIl0KKyAgRGVwcmVjYXRlZEZpZWxkKGkzMiksCiB9Ci1wdWIoY3JhdGUpIG1vZCBtYW5nbGVkIHsgcHViIHVzZSBzdXBlcjo6RW51bVVuaW9uIGFzIF83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl91bmlvbnNfOV9FbnVtVW5pb247IH0KIGltcGwgRGVmYXVsdCBmb3IgRW51bVVuaW9uIHsKICAgZm4gZGVmYXVsdCgpIC0+IFNlbGYgewogICAgIFNlbGY6OkludEVudW0oY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtOjpGT08pCiAgIH0KIH0KLWltcGwgYmluZGVyOjpwYXJjZWw6OlNlcmlhbGl6ZSBmb3IgRW51bVVuaW9uIHsKLSAgZm4gc2VyaWFsaXplKCZzZWxmLCBwYXJjZWw6ICZtdXQgYmluZGVyOjpwYXJjZWw6OlBhcmNlbCkgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKLSAgICA8U2VsZiBhcyBiaW5kZXI6OnBhcmNlbDo6U2VyaWFsaXplT3B0aW9uPjo6c2VyaWFsaXplX29wdGlvbihTb21lKHNlbGYpLCBwYXJjZWwpCi0gIH0KLX0KLWltcGwgYmluZGVyOjpwYXJjZWw6OlNlcmlhbGl6ZUFycmF5IGZvciBFbnVtVW5pb24ge30KLWltcGwgYmluZGVyOjpwYXJjZWw6OlNlcmlhbGl6ZU9wdGlvbiBmb3IgRW51bVVuaW9uIHsKLSAgZm4gc2VyaWFsaXplX29wdGlvbih0aGlzOiBPcHRpb248JlNlbGY+LCBwYXJjZWw6ICZtdXQgYmluZGVyOjpwYXJjZWw6OlBhcmNlbCkgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKLSAgICBsZXQgdGhpcyA9IGlmIGxldCBTb21lKHRoaXMpID0gdGhpcyB7Ci0gICAgICBwYXJjZWwud3JpdGUoJjFpMzIpPzsKLSAgICAgIHRoaXMKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIHBhcmNlbC53cml0ZSgmMGkzMik7Ci0gICAgfTsKLSAgICBtYXRjaCB0aGlzIHsKK2ltcGwgYmluZGVyOjpQYXJjZWxhYmxlIGZvciBFbnVtVW5pb24geworICBmbiB3cml0ZV90b19wYXJjZWwoJnNlbGYsIHBhcmNlbDogJm11dCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbCkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CisgICAgbWF0Y2ggc2VsZiB7CiAgICAgICBTZWxmOjpJbnRFbnVtKHYpID0+IHsKICAgICAgICAgcGFyY2VsLndyaXRlKCYwaTMyKT87CiAgICAgICAgIHBhcmNlbC53cml0ZSh2KQpAQCAtMzIsMzAgKzIzLDI5IEBACiAgICAgICAgIHBhcmNlbC53cml0ZSgmMWkzMik/OwogICAgICAgICBwYXJjZWwud3JpdGUodikKICAgICAgIH0KKyAgICAgIFNlbGY6OkRlcHJlY2F0ZWRGaWVsZCh2KSA9PiB7CisgICAgICAgIHBhcmNlbC53cml0ZSgmMmkzMik/OworICAgICAgICBwYXJjZWwud3JpdGUodikKKyAgICAgIH0KICAgICB9CiAgIH0KLX0KLWltcGwgYmluZGVyOjpwYXJjZWw6OkRlc2VyaWFsaXplIGZvciBFbnVtVW5pb24gewotICBmbiBkZXNlcmlhbGl6ZShwYXJjZWw6ICZiaW5kZXI6OnBhcmNlbDo6UGFyY2VsKSAtPiBiaW5kZXI6OlJlc3VsdDxTZWxmPiB7Ci0gICAgPFNlbGYgYXMgYmluZGVyOjpwYXJjZWw6OkRlc2VyaWFsaXplT3B0aW9uPjo6ZGVzZXJpYWxpemVfb3B0aW9uKHBhcmNlbCkKLSAgICAgICAudHJhbnNwb3NlKCkKLSAgICAgICAudW53cmFwX29yKEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVORVhQRUNURURfTlVMTCkpCi0gIH0KLX0KLWltcGwgYmluZGVyOjpwYXJjZWw6OkRlc2VyaWFsaXplQXJyYXkgZm9yIEVudW1VbmlvbiB7fQotaW1wbCBiaW5kZXI6OnBhcmNlbDo6RGVzZXJpYWxpemVPcHRpb24gZm9yIEVudW1VbmlvbiB7Ci0gIGZuIGRlc2VyaWFsaXplX29wdGlvbihwYXJjZWw6ICZiaW5kZXI6OnBhcmNlbDo6UGFyY2VsKSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248U2VsZj4+IHsKLSAgICBsZXQgc3RhdHVzOiBpMzIgPSBwYXJjZWwucmVhZCgpPzsKLSAgICBpZiBzdGF0dXMgPT0gMCB7IHJldHVybiBPayhOb25lKTsgfQorICBmbiByZWFkX2Zyb21fcGFyY2VsKCZtdXQgc2VsZiwgcGFyY2VsOiAmYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWwpIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4gewogICAgIGxldCB0YWc6IGkzMiA9IHBhcmNlbC5yZWFkKCk/OwogICAgIG1hdGNoIHRhZyB7CiAgICAgICAwID0+IHsKICAgICAgICAgbGV0IHZhbHVlOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW0gPSBwYXJjZWwucmVhZCgpPzsKLSAgICAgICAgT2soU29tZShTZWxmOjpJbnRFbnVtKHZhbHVlKSkpCisgICAgICAgICpzZWxmID0gU2VsZjo6SW50RW51bSh2YWx1ZSk7CisgICAgICAgIE9rKCgpKQogICAgICAgfQogICAgICAgMSA9PiB7CiAgICAgICAgIGxldCB2YWx1ZTogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bSA9IHBhcmNlbC5yZWFkKCk/OwotICAgICAgICBPayhTb21lKFNlbGY6OkxvbmdFbnVtKHZhbHVlKSkpCisgICAgICAgICpzZWxmID0gU2VsZjo6TG9uZ0VudW0odmFsdWUpOworICAgICAgICBPaygoKSkKKyAgICAgIH0KKyAgICAgIDIgPT4geworICAgICAgICBsZXQgdmFsdWU6IGkzMiA9IHBhcmNlbC5yZWFkKCk/OworICAgICAgICAqc2VsZiA9IFNlbGY6OkRlcHJlY2F0ZWRGaWVsZCh2YWx1ZSk7CisgICAgICAgIE9rKCgpKQogICAgICAgfQogICAgICAgXyA9PiB7CiAgICAgICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OkJBRF9WQUxVRSkKQEAgLTYzLDMgKzUzLDI0IEBACiAgICAgfQogICB9CiB9CitiaW5kZXI6OmltcGxfc2VyaWFsaXplX2Zvcl9wYXJjZWxhYmxlIShFbnVtVW5pb24pOworYmluZGVyOjppbXBsX2Rlc2VyaWFsaXplX2Zvcl9wYXJjZWxhYmxlIShFbnVtVW5pb24pOworaW1wbCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWxhYmxlTWV0YWRhdGEgZm9yIEVudW1VbmlvbiB7CisgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHsgImFuZHJvaWQuYWlkbC50ZXN0cy51bmlvbnMuRW51bVVuaW9uIiB9Cit9CitwdWIgbW9kIFRhZyB7CisgICMhW2FsbG93KG5vbl91cHBlcl9jYXNlX2dsb2JhbHMpXQorICB1c2UgYmluZGVyOjpkZWNsYXJlX2JpbmRlcl9lbnVtOworICBkZWNsYXJlX2JpbmRlcl9lbnVtISB7CisgICAgVGFnIDogW2kzMjsgM10geworICAgICAgaW50RW51bSA9IDAsCisgICAgICBsb25nRW51bSA9IDEsCisgICAgICAjW2RlcHJlY2F0ZWQgPSAiZG8gbm90IHVzZSB0aGlzIl0KKyAgICAgIGRlcHJlY2F0ZWRGaWVsZCA9IDIsCisgICAgfQorICB9Cit9CitwdWIoY3JhdGUpIG1vZCBtYW5nbGVkIHsKKyBwdWIgdXNlIHN1cGVyOjpFbnVtVW5pb24gYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c182X3VuaW9uc185X0VudW1VbmlvbjsKKyBwdWIgdXNlIHN1cGVyOjpUYWc6OlRhZyBhcyBfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzZfdW5pb25zXzlfRW51bVVuaW9uXzNfVGFnOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL1VuaW9uSW5Vbmlvbi5ycyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9VbmlvbkluVW5pb24ucnMKaW5kZXggN2FkZWU1Mi4uNTExZjQ0YyAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL1VuaW9uSW5Vbmlvbi5ycworKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvVW5pb25JblVuaW9uLnJzCkBAIC0xLDI5ICsxLDE4IEBACisjIVtmb3JiaWQodW5zYWZlX2NvZGUpXQorIyFbcnVzdGZtdDo6c2tpcF0KICNbZGVyaXZlKERlYnVnLCBDbG9uZSwgUGFydGlhbEVxKV0KIHB1YiBlbnVtIFVuaW9uSW5VbmlvbiB7CiAgIEZpcnN0KGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzZfdW5pb25zXzlfRW51bVVuaW9uKSwKICAgU2Vjb25kKGkzMiksCiB9Ci1wdWIoY3JhdGUpIG1vZCBtYW5nbGVkIHsgcHViIHVzZSBzdXBlcjo6VW5pb25JblVuaW9uIGFzIF83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl91bmlvbnNfMTJfVW5pb25JblVuaW9uOyB9CiBpbXBsIERlZmF1bHQgZm9yIFVuaW9uSW5VbmlvbiB7CiAgIGZuIGRlZmF1bHQoKSAtPiBTZWxmIHsKICAgICBTZWxmOjpGaXJzdChEZWZhdWx0OjpkZWZhdWx0KCkpCiAgIH0KIH0KLWltcGwgYmluZGVyOjpwYXJjZWw6OlNlcmlhbGl6ZSBmb3IgVW5pb25JblVuaW9uIHsKLSAgZm4gc2VyaWFsaXplKCZzZWxmLCBwYXJjZWw6ICZtdXQgYmluZGVyOjpwYXJjZWw6OlBhcmNlbCkgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKLSAgICA8U2VsZiBhcyBiaW5kZXI6OnBhcmNlbDo6U2VyaWFsaXplT3B0aW9uPjo6c2VyaWFsaXplX29wdGlvbihTb21lKHNlbGYpLCBwYXJjZWwpCi0gIH0KLX0KLWltcGwgYmluZGVyOjpwYXJjZWw6OlNlcmlhbGl6ZUFycmF5IGZvciBVbmlvbkluVW5pb24ge30KLWltcGwgYmluZGVyOjpwYXJjZWw6OlNlcmlhbGl6ZU9wdGlvbiBmb3IgVW5pb25JblVuaW9uIHsKLSAgZm4gc2VyaWFsaXplX29wdGlvbih0aGlzOiBPcHRpb248JlNlbGY+LCBwYXJjZWw6ICZtdXQgYmluZGVyOjpwYXJjZWw6OlBhcmNlbCkgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKLSAgICBsZXQgdGhpcyA9IGlmIGxldCBTb21lKHRoaXMpID0gdGhpcyB7Ci0gICAgICBwYXJjZWwud3JpdGUoJjFpMzIpPzsKLSAgICAgIHRoaXMKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIHBhcmNlbC53cml0ZSgmMGkzMik7Ci0gICAgfTsKLSAgICBtYXRjaCB0aGlzIHsKK2ltcGwgYmluZGVyOjpQYXJjZWxhYmxlIGZvciBVbmlvbkluVW5pb24geworICBmbiB3cml0ZV90b19wYXJjZWwoJnNlbGYsIHBhcmNlbDogJm11dCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbCkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CisgICAgbWF0Y2ggc2VsZiB7CiAgICAgICBTZWxmOjpGaXJzdCh2KSA9PiB7CiAgICAgICAgIHBhcmNlbC53cml0ZSgmMGkzMik/OwogICAgICAgICBwYXJjZWwud3JpdGUodikKQEAgLTM0LDI4ICsyMywxOCBAQAogICAgICAgfQogICAgIH0KICAgfQotfQotaW1wbCBiaW5kZXI6OnBhcmNlbDo6RGVzZXJpYWxpemUgZm9yIFVuaW9uSW5VbmlvbiB7Ci0gIGZuIGRlc2VyaWFsaXplKHBhcmNlbDogJmJpbmRlcjo6cGFyY2VsOjpQYXJjZWwpIC0+IGJpbmRlcjo6UmVzdWx0PFNlbGY+IHsKLSAgICA8U2VsZiBhcyBiaW5kZXI6OnBhcmNlbDo6RGVzZXJpYWxpemVPcHRpb24+OjpkZXNlcmlhbGl6ZV9vcHRpb24ocGFyY2VsKQotICAgICAgIC50cmFuc3Bvc2UoKQotICAgICAgIC51bndyYXBfb3IoRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5FWFBFQ1RFRF9OVUxMKSkKLSAgfQotfQotaW1wbCBiaW5kZXI6OnBhcmNlbDo6RGVzZXJpYWxpemVBcnJheSBmb3IgVW5pb25JblVuaW9uIHt9Ci1pbXBsIGJpbmRlcjo6cGFyY2VsOjpEZXNlcmlhbGl6ZU9wdGlvbiBmb3IgVW5pb25JblVuaW9uIHsKLSAgZm4gZGVzZXJpYWxpemVfb3B0aW9uKHBhcmNlbDogJmJpbmRlcjo6cGFyY2VsOjpQYXJjZWwpIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxTZWxmPj4gewotICAgIGxldCBzdGF0dXM6IGkzMiA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIHN0YXR1cyA9PSAwIHsgcmV0dXJuIE9rKE5vbmUpOyB9CisgIGZuIHJlYWRfZnJvbV9wYXJjZWwoJm11dCBzZWxmLCBwYXJjZWw6ICZiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbCkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CiAgICAgbGV0IHRhZzogaTMyID0gcGFyY2VsLnJlYWQoKT87CiAgICAgbWF0Y2ggdGFnIHsKICAgICAgIDAgPT4gewogICAgICAgICBsZXQgdmFsdWU6IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzZfdW5pb25zXzlfRW51bVVuaW9uID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgICAgIE9rKFNvbWUoU2VsZjo6Rmlyc3QodmFsdWUpKSkKKyAgICAgICAgKnNlbGYgPSBTZWxmOjpGaXJzdCh2YWx1ZSk7CisgICAgICAgIE9rKCgpKQogICAgICAgfQogICAgICAgMSA9PiB7CiAgICAgICAgIGxldCB2YWx1ZTogaTMyID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgICAgIE9rKFNvbWUoU2VsZjo6U2Vjb25kKHZhbHVlKSkpCisgICAgICAgICpzZWxmID0gU2VsZjo6U2Vjb25kKHZhbHVlKTsKKyAgICAgICAgT2soKCkpCiAgICAgICB9CiAgICAgICBfID0+IHsKICAgICAgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6QkFEX1ZBTFVFKQpAQCAtNjMsMyArNDIsMjIgQEAKICAgICB9CiAgIH0KIH0KK2JpbmRlcjo6aW1wbF9zZXJpYWxpemVfZm9yX3BhcmNlbGFibGUhKFVuaW9uSW5Vbmlvbik7CitiaW5kZXI6OmltcGxfZGVzZXJpYWxpemVfZm9yX3BhcmNlbGFibGUhKFVuaW9uSW5Vbmlvbik7CitpbXBsIGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbGFibGVNZXRhZGF0YSBmb3IgVW5pb25JblVuaW9uIHsKKyAgZm4gZ2V0X2Rlc2NyaXB0b3IoKSAtPiAmJ3N0YXRpYyBzdHIgeyAiYW5kcm9pZC5haWRsLnRlc3RzLnVuaW9ucy5VbmlvbkluVW5pb24iIH0KK30KK3B1YiBtb2QgVGFnIHsKKyAgIyFbYWxsb3cobm9uX3VwcGVyX2Nhc2VfZ2xvYmFscyldCisgIHVzZSBiaW5kZXI6OmRlY2xhcmVfYmluZGVyX2VudW07CisgIGRlY2xhcmVfYmluZGVyX2VudW0hIHsKKyAgICBUYWcgOiBbaTMyOyAyXSB7CisgICAgICBmaXJzdCA9IDAsCisgICAgICBzZWNvbmQgPSAxLAorICAgIH0KKyAgfQorfQorcHViKGNyYXRlKSBtb2QgbWFuZ2xlZCB7CisgcHViIHVzZSBzdXBlcjo6VW5pb25JblVuaW9uIGFzIF83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl91bmlvbnNfMTJfVW5pb25JblVuaW9uOworIHB1YiB1c2Ugc3VwZXI6OlRhZzo6VGFnIGFzIF83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl91bmlvbnNfMTJfVW5pb25JblVuaW9uXzNfVGFnOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL1VuaW9uSW5Vbmlvbi5ycy5kIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL1VuaW9uSW5Vbmlvbi5ycy5kCmluZGV4IGY1YjUzNjYuLjIzNzZjZjUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9VbmlvbkluVW5pb24ucnMuZAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvVW5pb25JblVuaW9uLnJzLmQKQEAgLTEsMyArMSw1IEBACiBvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9VbmlvbkluVW5pb24ucnMgOiBcCiAgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvVW5pb25JblVuaW9uLmFpZGwgXAotICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL0VudW1Vbmlvbi5haWRsCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvRW51bVVuaW9uLmFpZGwgXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvSW50RW51bS5haWRsIFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0xvbmdFbnVtLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9CYXpVbmlvbi5jcHAgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYxLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvQmF6VW5pb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViNjYxNTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYxLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvQmF6VW5pb24uY3BwCkBAIC0wLDAgKzEsMzYgQEAKKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0JhelVuaW9uLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB2ZXJzaW9uZWQgeworbmFtZXNwYWNlIHRlc3RzIHsKKzo6YW5kcm9pZDo6c3RhdHVzX3QgQmF6VW5pb246OnJlYWRGcm9tUGFyY2VsKGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIHsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzOworICBpbnQzMl90IF9haWRsX3RhZzsKKyAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkSW50MzIoJl9haWRsX3RhZykpICE9IDo6YW5kcm9pZDo6T0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICBzd2l0Y2ggKHN0YXRpY19jYXN0PFRhZz4oX2FpZGxfdGFnKSkgeworICBjYXNlIGludE51bTogeworICAgIGludDMyX3QgX2FpZGxfdmFsdWU7CisgICAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkSW50MzIoJl9haWRsX3ZhbHVlKSkgIT0gOjphbmRyb2lkOjpPSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgICAgaWYgY29uc3RleHByIChzdGQ6OmlzX3RyaXZpYWxseV9jb3B5YWJsZV92PGludDMyX3Q+KSB7CisgICAgICBzZXQ8aW50TnVtPihfYWlkbF92YWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIE5PTElOVE5FWFRMSU5FKHBlcmZvcm1hbmNlLW1vdmUtY29uc3QtYXJnKQorICAgICAgc2V0PGludE51bT4oc3RkOjptb3ZlKF9haWRsX3ZhbHVlKSk7CisgICAgfQorICAgIHJldHVybiA6OmFuZHJvaWQ6Ok9LOyB9CisgIH0KKyAgcmV0dXJuIDo6YW5kcm9pZDo6QkFEX1ZBTFVFOworfQorOjphbmRyb2lkOjpzdGF0dXNfdCBCYXpVbmlvbjo6d3JpdGVUb1BhcmNlbCg6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCB7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90PihnZXRUYWcoKSkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSA6OmFuZHJvaWQ6Ok9LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgc3dpdGNoIChnZXRUYWcoKSkgeworICBjYXNlIGludE51bTogcmV0dXJuIF9haWRsX3BhcmNlbC0+d3JpdGVJbnQzMihnZXQ8aW50TnVtPigpKTsKKyAgfQorICBfX2Fzc2VydDIoX19GSUxFX18sIF9fTElORV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fLCAiY2FuJ3QgcmVhY2ggaGVyZSIpOworfQorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgdmVyc2lvbmVkCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9CYXpVbmlvbi5jcHAuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9CYXpVbmlvbi5jcHAuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTY4ODRiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS1WMS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0JhelVuaW9uLmNwcC5kCkBAIC0wLDAgKzEsMiBAQAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYxLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvQmF6VW5pb24uY3BwIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC9haWRsX2FwaS9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS8xL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvQmF6VW5pb24uYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS1WMS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0Zvby5jcHAgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYxLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvRm9vLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjkzZTlmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS1WMS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0Zvby5jcHAKQEAgLTAsMCArMSwzNCBAQAorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvRm9vLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB2ZXJzaW9uZWQgeworbmFtZXNwYWNlIHRlc3RzIHsKKzo6YW5kcm9pZDo6c3RhdHVzX3QgRm9vOjpyZWFkRnJvbVBhcmNlbChjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSB7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIHNpemVfdCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPSAwOworICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkSW50MzIoJl9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPCA0KSByZXR1cm4gOjphbmRyb2lkOjpCQURfVkFMVUU7CisgIHNpemVfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUpOworICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gU0laRV9NQVggLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9Cis6OmFuZHJvaWQ6OnN0YXR1c190IEZvbzo6d3JpdGVUb1BhcmNlbCg6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCB7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIGF1dG8gX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKKyAgX2FpZGxfcGFyY2VsLT53cml0ZUludDMyKDApOworICBhdXRvIF9haWRsX2VuZF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MpOworICBfYWlkbF9wYXJjZWwtPndyaXRlSW50MzIoX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX2VuZF9wb3MpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIHZlcnNpb25lZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYxLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvRm9vLmNwcC5kIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS1WMS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0Zvby5jcHAuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzdmODQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS1WMS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0Zvby5jcHAuZApAQCAtMCwwICsxLDIgQEAKK291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS1WMS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0Zvby5jcHAgOiBcCisgIHN5c3RlbS90b29scy9haWRsL2FpZGxfYXBpL2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLzEvYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9Gb28uYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS1WMS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0lGb29JbnRlcmZhY2UuY3BwIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS1WMS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0lGb29JbnRlcmZhY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzYWVhNzMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYxLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvSUZvb0ludGVyZmFjZS5jcHAKQEAgLTAsMCArMSwzOTkgQEAKKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0lGb29JbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0JwRm9vSW50ZXJmYWNlLmg+CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdmVyc2lvbmVkIHsKK25hbWVzcGFjZSB0ZXN0cyB7CitET19OT1RfRElSRUNUTFlfVVNFX01FX0lNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShGb29JbnRlcmZhY2UsICJhbmRyb2lkLmFpZGwudmVyc2lvbmVkLnRlc3RzLklGb29JbnRlcmZhY2UiKQorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgdmVyc2lvbmVkCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0JwRm9vSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9CbkZvb0ludGVyZmFjZS5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbWFjcm9zLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB2ZXJzaW9uZWQgeworbmFtZXNwYWNlIHRlc3RzIHsKKworQnBGb29JbnRlcmZhY2U6OkJwRm9vSW50ZXJmYWNlKGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiYgX2FpZGxfaW1wbCkKKyAgICA6IEJwSW50ZXJmYWNlPElGb29JbnRlcmZhY2U+KF9haWRsX2ltcGwpeworfQorCis6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEJwRm9vSW50ZXJmYWNlOjpvcmlnaW5hbEFwaSgpIHsKKyAgOjphbmRyb2lkOjpQYXJjZWwgX2FpZGxfZGF0YTsKKyAgX2FpZGxfZGF0YS5tYXJrRm9yQmluZGVyKHJlbW90ZVN0cm9uZygpKTsKKyAgOjphbmRyb2lkOjpQYXJjZWwgX2FpZGxfcmVwbHk7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzOworICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKGdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoQm5Gb29JbnRlcmZhY2U6OlRSQU5TQUNUSU9OX29yaWdpbmFsQXBpLCBfYWlkbF9kYXRhLCAmX2FpZGxfcmVwbHksIDApOworICBpZiAoVU5MSUtFTFkoX2FpZGxfcmV0X3N0YXR1cyA9PSA6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04gJiYgSUZvb0ludGVyZmFjZTo6Z2V0RGVmYXVsdEltcGwoKSkpIHsKKyAgICAgcmV0dXJuIElGb29JbnRlcmZhY2U6OmdldERlZmF1bHRJbXBsKCktPm9yaWdpbmFsQXBpKCk7CisgIH0KKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy5yZWFkRnJvbVBhcmNlbChfYWlkbF9yZXBseSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIGlmICghX2FpZGxfc3RhdHVzLmlzT2soKSkgeworICAgIHJldHVybiBfYWlkbF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfZXJyb3I6CisgIF9haWRsX3N0YXR1cy5zZXRGcm9tU3RhdHVzVChfYWlkbF9yZXRfc3RhdHVzKTsKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKworOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBCcEZvb0ludGVyZmFjZTo6YWNjZXB0VW5pb25BbmRSZXR1cm5TdHJpbmcoY29uc3QgOjphbmRyb2lkOjphaWRsOjp2ZXJzaW9uZWQ6OnRlc3RzOjpCYXpVbmlvbiYgdSwgOjpzdGQ6OnN0cmluZyogX2FpZGxfcmV0dXJuKSB7CisgIDo6YW5kcm9pZDo6UGFyY2VsIF9haWRsX2RhdGE7CisgIF9haWRsX2RhdGEubWFya0ZvckJpbmRlcihyZW1vdGVTdHJvbmcoKSk7CisgIDo6YW5kcm9pZDo6UGFyY2VsIF9haWRsX3JlcGx5OworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1czsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZVBhcmNlbGFibGUodSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoQm5Gb29JbnRlcmZhY2U6OlRSQU5TQUNUSU9OX2FjY2VwdFVuaW9uQW5kUmV0dXJuU3RyaW5nLCBfYWlkbF9kYXRhLCAmX2FpZGxfcmVwbHksIDApOworICBpZiAoVU5MSUtFTFkoX2FpZGxfcmV0X3N0YXR1cyA9PSA6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04gJiYgSUZvb0ludGVyZmFjZTo6Z2V0RGVmYXVsdEltcGwoKSkpIHsKKyAgICAgcmV0dXJuIElGb29JbnRlcmZhY2U6OmdldERlZmF1bHRJbXBsKCktPmFjY2VwdFVuaW9uQW5kUmV0dXJuU3RyaW5nKHUsIF9haWRsX3JldHVybik7CisgIH0KKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy5yZWFkRnJvbVBhcmNlbChfYWlkbF9yZXBseSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIGlmICghX2FpZGxfc3RhdHVzLmlzT2soKSkgeworICAgIHJldHVybiBfYWlkbF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWRVdGY4RnJvbVV0ZjE2KF9haWRsX3JldHVybik7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX2Vycm9yOgorICBfYWlkbF9zdGF0dXMuc2V0RnJvbVN0YXR1c1QoX2FpZGxfcmV0X3N0YXR1cyk7CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9CisKKzo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgQnBGb29JbnRlcmZhY2U6Omlnbm9yZVBhcmNlbGFibGVzQW5kUmVwZWF0SW50KGNvbnN0IDo6YW5kcm9pZDo6YWlkbDo6dmVyc2lvbmVkOjp0ZXN0czo6Rm9vJiBpbkZvbywgOjphbmRyb2lkOjphaWRsOjp2ZXJzaW9uZWQ6OnRlc3RzOjpGb28qIGlub3V0Rm9vLCA6OmFuZHJvaWQ6OmFpZGw6OnZlcnNpb25lZDo6dGVzdHM6OkZvbyogb3V0Rm9vLCBpbnQzMl90IHZhbHVlLCBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIHsKKyAgOjphbmRyb2lkOjpQYXJjZWwgX2FpZGxfZGF0YTsKKyAgX2FpZGxfZGF0YS5tYXJrRm9yQmluZGVyKHJlbW90ZVN0cm9uZygpKTsKKyAgOjphbmRyb2lkOjpQYXJjZWwgX2FpZGxfcmVwbHk7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzOworICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKGdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLndyaXRlUGFyY2VsYWJsZShpbkZvbyk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLndyaXRlUGFyY2VsYWJsZSgqaW5vdXRGb28pOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZUludDMyKHZhbHVlKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChCbkZvb0ludGVyZmFjZTo6VFJBTlNBQ1RJT05faWdub3JlUGFyY2VsYWJsZXNBbmRSZXBlYXRJbnQsIF9haWRsX2RhdGEsICZfYWlkbF9yZXBseSwgMCk7CisgIGlmIChVTkxJS0VMWShfYWlkbF9yZXRfc3RhdHVzID09IDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTiAmJiBJRm9vSW50ZXJmYWNlOjpnZXREZWZhdWx0SW1wbCgpKSkgeworICAgICByZXR1cm4gSUZvb0ludGVyZmFjZTo6Z2V0RGVmYXVsdEltcGwoKS0+aWdub3JlUGFyY2VsYWJsZXNBbmRSZXBlYXRJbnQoaW5Gb28sIGlub3V0Rm9vLCBvdXRGb28sIHZhbHVlLCBfYWlkbF9yZXR1cm4pOworICB9CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMucmVhZEZyb21QYXJjZWwoX2FpZGxfcmVwbHkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBpZiAoIV9haWRsX3N0YXR1cy5pc09rKCkpIHsKKyAgICByZXR1cm4gX2FpZGxfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS5yZWFkSW50MzIoX2FpZGxfcmV0dXJuKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWRQYXJjZWxhYmxlKGlub3V0Rm9vKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWRQYXJjZWxhYmxlKG91dEZvbyk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX2Vycm9yOgorICBfYWlkbF9zdGF0dXMuc2V0RnJvbVN0YXR1c1QoX2FpZGxfcmV0X3N0YXR1cyk7CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9CisKKzo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgQnBGb29JbnRlcmZhY2U6OnJldHVybnNMZW5ndGhPZkZvb0FycmF5KGNvbnN0IDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjphaWRsOjp2ZXJzaW9uZWQ6OnRlc3RzOjpGb28+JiBmb29zLCBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIHsKKyAgOjphbmRyb2lkOjpQYXJjZWwgX2FpZGxfZGF0YTsKKyAgX2FpZGxfZGF0YS5tYXJrRm9yQmluZGVyKHJlbW90ZVN0cm9uZygpKTsKKyAgOjphbmRyb2lkOjpQYXJjZWwgX2FpZGxfcmVwbHk7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzOworICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKGdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLndyaXRlUGFyY2VsYWJsZVZlY3Rvcihmb29zKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChCbkZvb0ludGVyZmFjZTo6VFJBTlNBQ1RJT05fcmV0dXJuc0xlbmd0aE9mRm9vQXJyYXksIF9haWRsX2RhdGEsICZfYWlkbF9yZXBseSwgMCk7CisgIGlmIChVTkxJS0VMWShfYWlkbF9yZXRfc3RhdHVzID09IDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTiAmJiBJRm9vSW50ZXJmYWNlOjpnZXREZWZhdWx0SW1wbCgpKSkgeworICAgICByZXR1cm4gSUZvb0ludGVyZmFjZTo6Z2V0RGVmYXVsdEltcGwoKS0+cmV0dXJuc0xlbmd0aE9mRm9vQXJyYXkoZm9vcywgX2FpZGxfcmV0dXJuKTsKKyAgfQorICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLnJlYWRGcm9tUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgaWYgKCFfYWlkbF9zdGF0dXMuaXNPaygpKSB7CisgICAgcmV0dXJuIF9haWRsX3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHkucmVhZEludDMyKF9haWRsX3JldHVybik7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX2Vycm9yOgorICBfYWlkbF9zdGF0dXMuc2V0RnJvbVN0YXR1c1QoX2FpZGxfcmV0X3N0YXR1cyk7CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9CisKK2ludDMyX3QgQnBGb29JbnRlcmZhY2U6OmdldEludGVyZmFjZVZlcnNpb24oKSB7CisgIGlmIChjYWNoZWRfdmVyc2lvbl8gPT0gLTEpIHsKKyAgICA6OmFuZHJvaWQ6OlBhcmNlbCBkYXRhOworICAgIDo6YW5kcm9pZDo6UGFyY2VsIHJlcGx5OworICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgIDo6YW5kcm9pZDo6c3RhdHVzX3QgZXJyID0gcmVtb3RlKCktPnRyYW5zYWN0KEJuRm9vSW50ZXJmYWNlOjpUUkFOU0FDVElPTl9nZXRJbnRlcmZhY2VWZXJzaW9uLCBkYXRhLCAmcmVwbHkpOworICAgIGlmIChlcnIgPT0gOjphbmRyb2lkOjpPSykgeworICAgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXM7CisgICAgICBlcnIgPSBfYWlkbF9zdGF0dXMucmVhZEZyb21QYXJjZWwocmVwbHkpOworICAgICAgaWYgKGVyciA9PSA6OmFuZHJvaWQ6Ok9LICYmIF9haWRsX3N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgY2FjaGVkX3ZlcnNpb25fID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBjYWNoZWRfdmVyc2lvbl87Cit9CisKKworc3RkOjpzdHJpbmcgQnBGb29JbnRlcmZhY2U6OmdldEludGVyZmFjZUhhc2goKSB7CisgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrR3VhcmQoY2FjaGVkX2hhc2hfbXV0ZXhfKTsKKyAgaWYgKGNhY2hlZF9oYXNoXyA9PSAiLTEiKSB7CisgICAgOjphbmRyb2lkOjpQYXJjZWwgZGF0YTsKKyAgICA6OmFuZHJvaWQ6OlBhcmNlbCByZXBseTsKKyAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oZ2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICA6OmFuZHJvaWQ6OnN0YXR1c190IGVyciA9IHJlbW90ZSgpLT50cmFuc2FjdChCbkZvb0ludGVyZmFjZTo6VFJBTlNBQ1RJT05fZ2V0SW50ZXJmYWNlSGFzaCwgZGF0YSwgJnJlcGx5KTsKKyAgICBpZiAoZXJyID09IDo6YW5kcm9pZDo6T0spIHsKKyAgICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzOworICAgICAgZXJyID0gX2FpZGxfc3RhdHVzLnJlYWRGcm9tUGFyY2VsKHJlcGx5KTsKKyAgICAgIGlmIChlcnIgPT0gOjphbmRyb2lkOjpPSyAmJiBfYWlkbF9zdGF0dXMuaXNPaygpKSB7CisgICAgICAgIHJlcGx5LnJlYWRVdGY4RnJvbVV0ZjE2KCZjYWNoZWRfaGFzaF8pOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gY2FjaGVkX2hhc2hfOworfQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSB2ZXJzaW9uZWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvQm5Gb29JbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8YmluZGVyL1N0YWJpbGl0eS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdmVyc2lvbmVkIHsKK25hbWVzcGFjZSB0ZXN0cyB7CisKK0JuRm9vSW50ZXJmYWNlOjpCbkZvb0ludGVyZmFjZSgpCit7CisgIDo6YW5kcm9pZDo6aW50ZXJuYWw6OlN0YWJpbGl0eTo6bWFya0NvbXBpbGF0aW9uVW5pdCh0aGlzKTsKK30KKworOjphbmRyb2lkOjpzdGF0dXNfdCBCbkZvb0ludGVyZmFjZTo6b25UcmFuc2FjdCh1aW50MzJfdCBfYWlkbF9jb2RlLCBjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCYgX2FpZGxfZGF0YSwgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3JlcGx5LCB1aW50MzJfdCBfYWlkbF9mbGFncykgeworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICBzd2l0Y2ggKF9haWRsX2NvZGUpIHsKKyAgY2FzZSBCbkZvb0ludGVyZmFjZTo6VFJBTlNBQ1RJT05fb3JpZ2luYWxBcGk6CisgIHsKKyAgICBpZiAoIShfYWlkbF9kYXRhLmNoZWNrSW50ZXJmYWNlKHRoaXMpKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6QkFEX1RZUEU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXMob3JpZ2luYWxBcGkoKSk7CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKCFfYWlkbF9zdGF0dXMuaXNPaygpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgYnJlYWs7CisgIGNhc2UgQm5Gb29JbnRlcmZhY2U6OlRSQU5TQUNUSU9OX2FjY2VwdFVuaW9uQW5kUmV0dXJuU3RyaW5nOgorICB7CisgICAgOjphbmRyb2lkOjphaWRsOjp2ZXJzaW9uZWQ6OnRlc3RzOjpCYXpVbmlvbiBpbl91OworICAgIDo6c3RkOjpzdHJpbmcgX2FpZGxfcmV0dXJuOworICAgIGlmICghKF9haWRsX2RhdGEuY2hlY2tJbnRlcmZhY2UodGhpcykpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpCQURfVFlQRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS5yZWFkUGFyY2VsYWJsZSgmaW5fdSk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChhdXRvIHN0ID0gX2FpZGxfZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsgIXN0LmlzT2soKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IHN0LndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzKGFjY2VwdFVuaW9uQW5kUmV0dXJuU3RyaW5nKGluX3UsICZfYWlkbF9yZXR1cm4pKTsKKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoIV9haWRsX3N0YXR1cy5pc09rKCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHktPndyaXRlVXRmOEFzVXRmMTYoX2FpZGxfcmV0dXJuKTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgYnJlYWs7CisgIGNhc2UgQm5Gb29JbnRlcmZhY2U6OlRSQU5TQUNUSU9OX2lnbm9yZVBhcmNlbGFibGVzQW5kUmVwZWF0SW50OgorICB7CisgICAgOjphbmRyb2lkOjphaWRsOjp2ZXJzaW9uZWQ6OnRlc3RzOjpGb28gaW5faW5Gb287CisgICAgOjphbmRyb2lkOjphaWRsOjp2ZXJzaW9uZWQ6OnRlc3RzOjpGb28gaW5faW5vdXRGb287CisgICAgOjphbmRyb2lkOjphaWRsOjp2ZXJzaW9uZWQ6OnRlc3RzOjpGb28gb3V0X291dEZvbzsKKyAgICBpbnQzMl90IGluX3ZhbHVlOworICAgIGludDMyX3QgX2FpZGxfcmV0dXJuOworICAgIGlmICghKF9haWRsX2RhdGEuY2hlY2tJbnRlcmZhY2UodGhpcykpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpCQURfVFlQRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS5yZWFkUGFyY2VsYWJsZSgmaW5faW5Gb28pOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS5yZWFkUGFyY2VsYWJsZSgmaW5faW5vdXRGb28pOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS5yZWFkSW50MzIoJmluX3ZhbHVlKTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGF1dG8gc3QgPSBfYWlkbF9kYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOyAhc3QuaXNPaygpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gc3Qud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXMoaWdub3JlUGFyY2VsYWJsZXNBbmRSZXBlYXRJbnQoaW5faW5Gb28sICZpbl9pbm91dEZvbywgJm91dF9vdXRGb28sIGluX3ZhbHVlLCAmX2FpZGxfcmV0dXJuKSk7CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKCFfYWlkbF9zdGF0dXMuaXNPaygpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LT53cml0ZUludDMyKF9haWRsX3JldHVybik7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS0+d3JpdGVQYXJjZWxhYmxlKGluX2lub3V0Rm9vKTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LT53cml0ZVBhcmNlbGFibGUob3V0X291dEZvbyk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGJyZWFrOworICBjYXNlIEJuRm9vSW50ZXJmYWNlOjpUUkFOU0FDVElPTl9yZXR1cm5zTGVuZ3RoT2ZGb29BcnJheToKKyAgeworICAgIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjphaWRsOjp2ZXJzaW9uZWQ6OnRlc3RzOjpGb28+IGluX2Zvb3M7CisgICAgaW50MzJfdCBfYWlkbF9yZXR1cm47CisgICAgaWYgKCEoX2FpZGxfZGF0YS5jaGVja0ludGVyZmFjZSh0aGlzKSkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6OkJBRF9UWVBFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLnJlYWRQYXJjZWxhYmxlVmVjdG9yKCZpbl9mb29zKTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGF1dG8gc3QgPSBfYWlkbF9kYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOyAhc3QuaXNPaygpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gc3Qud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXMocmV0dXJuc0xlbmd0aE9mRm9vQXJyYXkoaW5fZm9vcywgJl9haWRsX3JldHVybikpOworICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICghX2FpZGxfc3RhdHVzLmlzT2soKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS0+d3JpdGVJbnQzMihfYWlkbF9yZXR1cm4pOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBicmVhazsKKyAgY2FzZSBCbkZvb0ludGVyZmFjZTo6VFJBTlNBQ1RJT05fZ2V0SW50ZXJmYWNlVmVyc2lvbjoKKyAgeworICAgIF9haWRsX2RhdGEuY2hlY2tJbnRlcmZhY2UodGhpcyk7CisgICAgX2FpZGxfcmVwbHktPndyaXRlTm9FeGNlcHRpb24oKTsKKyAgICBfYWlkbF9yZXBseS0+d3JpdGVJbnQzMihJRm9vSW50ZXJmYWNlOjpWRVJTSU9OKTsKKyAgfQorICBicmVhazsKKyAgY2FzZSBCbkZvb0ludGVyZmFjZTo6VFJBTlNBQ1RJT05fZ2V0SW50ZXJmYWNlSGFzaDoKKyAgeworICAgIF9haWRsX2RhdGEuY2hlY2tJbnRlcmZhY2UodGhpcyk7CisgICAgX2FpZGxfcmVwbHktPndyaXRlTm9FeGNlcHRpb24oKTsKKyAgICBfYWlkbF9yZXBseS0+d3JpdGVVdGY4QXNVdGYxNihJRm9vSW50ZXJmYWNlOjpIQVNIKTsKKyAgfQorICBicmVhazsKKyAgZGVmYXVsdDoKKyAgeworICAgIF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6OkJCaW5kZXI6Om9uVHJhbnNhY3QoX2FpZGxfY29kZSwgX2FpZGxfZGF0YSwgX2FpZGxfcmVwbHksIF9haWRsX2ZsYWdzKTsKKyAgfQorICBicmVhazsKKyAgfQorICBpZiAoX2FpZGxfcmV0X3N0YXR1cyA9PSA6OmFuZHJvaWQ6OlVORVhQRUNURURfTlVMTCkgeworICAgIF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tRXhjZXB0aW9uQ29kZSg6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpFWF9OVUxMX1BPSU5URVIpLndyaXRlT3ZlclBhcmNlbChfYWlkbF9yZXBseSk7CisgIH0KKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9CisKK2ludDMyX3QgQm5Gb29JbnRlcmZhY2U6OmdldEludGVyZmFjZVZlcnNpb24oKSB7CisgIHJldHVybiBJRm9vSW50ZXJmYWNlOjpWRVJTSU9OOworfQorc3RkOjpzdHJpbmcgQm5Gb29JbnRlcmZhY2U6OmdldEludGVyZmFjZUhhc2goKSB7CisgIHJldHVybiBJRm9vSW50ZXJmYWNlOjpIQVNIOworfQorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgdmVyc2lvbmVkCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9JRm9vSW50ZXJmYWNlLmNwcC5kIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS1WMS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0lGb29JbnRlcmZhY2UuY3BwLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJlZTFiNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9JRm9vSW50ZXJmYWNlLmNwcC5kCkBAIC0wLDAgKzEsNCBAQAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYxLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvSUZvb0ludGVyZmFjZS5jcHAgOiBcCisgIHN5c3RlbS90b29scy9haWRsL2FpZGxfYXBpL2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLzEvYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9JRm9vSW50ZXJmYWNlLmFpZGwgXAorICBzeXN0ZW0vdG9vbHMvYWlkbC9haWRsX2FwaS9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS8xL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvQmF6VW5pb24uYWlkbCBcCisgIHN5c3RlbS90b29scy9haWRsL2FpZGxfYXBpL2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLzEvYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9Gb28uYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS1WMS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvQmF6VW5pb24uaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0JhelVuaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVlMGQxNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0JhelVuaW9uLmgKQEAgLTAsMCArMSwxNDQgQEAKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfdG9fc3RyaW5nLmg+CisjaW5jbHVkZSA8YXJyYXk+CisjaW5jbHVkZSA8YmluZGVyL0VudW1zLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGJpbmRlci9TdGF0dXMuaD4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KKyNpbmNsdWRlIDx2YXJpYW50PgorCisjaWZuZGVmIF9fQklPTklDX18KKyNkZWZpbmUgX19hc3NlcnQyKGEsYixjLGQpICgodm9pZCkwKQorI2VuZGlmCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB2ZXJzaW9uZWQgeworbmFtZXNwYWNlIHRlc3RzIHsKK2NsYXNzIEJhelVuaW9uIDogcHVibGljIDo6YW5kcm9pZDo6UGFyY2VsYWJsZSB7CitwdWJsaWM6CisgIGVudW0gY2xhc3MgVGFnIDogaW50MzJfdCB7CisgICAgaW50TnVtID0gMCwKKyAgfTsKKyAgLy8gRXhwb3NlIHRhZyBzeW1ib2xzIGZvciBsZWdhY3kgY29kZQorICBzdGF0aWMgY29uc3QgaW5saW5lIFRhZyBpbnROdW0gPSBUYWc6OmludE51bTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBfbm90X3NlbGYgPSAhc3RkOjppc19zYW1lX3Y8c3RkOjpyZW1vdmVfY3ZfdDxzdGQ6OnJlbW92ZV9yZWZlcmVuY2VfdDxfVHA+PiwgQmF6VW5pb24+OworCisgIEJhelVuaW9uKCkgOiBfdmFsdWUoc3RkOjppbl9wbGFjZV9pbmRleDxzdGF0aWNfY2FzdDxzaXplX3Q+KGludE51bSk+LCBpbnQzMl90KDApKSB7IH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSA9IHN0ZDo6ZW5hYmxlX2lmX3Q8X25vdF9zZWxmPF9UcD4+PgorICAvLyBOT0xJTlRORVhUTElORShnb29nbGUtZXhwbGljaXQtY29uc3RydWN0b3IpCisgIGNvbnN0ZXhwciBCYXpVbmlvbihfVHAmJiBfYXJnKQorICAgICAgOiBfdmFsdWUoc3RkOjpmb3J3YXJkPF9UcD4oX2FyZykpIHt9CisKKyAgdGVtcGxhdGUgPHNpemVfdCBfTnAsIHR5cGVuYW1lLi4uIF9UcD4KKyAgY29uc3RleHByIGV4cGxpY2l0IEJhelVuaW9uKHN0ZDo6aW5fcGxhY2VfaW5kZXhfdDxfTnA+LCBfVHAmJi4uLiBfYXJncykKKyAgICAgIDogX3ZhbHVlKHN0ZDo6aW5fcGxhY2VfaW5kZXg8X05wPiwgc3RkOjpmb3J3YXJkPF9UcD4oX2FyZ3MpLi4uKSB7fQorCisgIHRlbXBsYXRlIDxUYWcgX3RhZywgdHlwZW5hbWUuLi4gX1RwPgorICBzdGF0aWMgQmF6VW5pb24gbWFrZShfVHAmJi4uLiBfYXJncykgeworICAgIHJldHVybiBCYXpVbmlvbihzdGQ6OmluX3BsYWNlX2luZGV4PHN0YXRpY19jYXN0PHNpemVfdD4oX3RhZyk+LCBzdGQ6OmZvcndhcmQ8X1RwPihfYXJncykuLi4pOworICB9CisKKyAgdGVtcGxhdGUgPFRhZyBfdGFnLCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lLi4uIF9VcD4KKyAgc3RhdGljIEJhelVuaW9uIG1ha2Uoc3RkOjppbml0aWFsaXplcl9saXN0PF9UcD4gX2lsLCBfVXAmJi4uLiBfYXJncykgeworICAgIHJldHVybiBCYXpVbmlvbihzdGQ6OmluX3BsYWNlX2luZGV4PHN0YXRpY19jYXN0PHNpemVfdD4oX3RhZyk+LCBzdGQ6Om1vdmUoX2lsKSwgc3RkOjpmb3J3YXJkPF9VcD4oX2FyZ3MpLi4uKTsKKyAgfQorCisgIFRhZyBnZXRUYWcoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFRhZz4oX3ZhbHVlLmluZGV4KCkpOworICB9CisKKyAgdGVtcGxhdGUgPFRhZyBfdGFnPgorICBjb25zdCBhdXRvJiBnZXQoKSBjb25zdCB7CisgICAgaWYgKGdldFRhZygpICE9IF90YWcpIHsgX19hc3NlcnQyKF9fRklMRV9fLCBfX0xJTkVfXywgX19QUkVUVFlfRlVOQ1RJT05fXywgImJhZCBhY2Nlc3M6IGEgd3JvbmcgdGFnIik7IH0KKyAgICByZXR1cm4gc3RkOjpnZXQ8c3RhdGljX2Nhc3Q8c2l6ZV90PihfdGFnKT4oX3ZhbHVlKTsKKyAgfQorCisgIHRlbXBsYXRlIDxUYWcgX3RhZz4KKyAgYXV0byYgZ2V0KCkgeworICAgIGlmIChnZXRUYWcoKSAhPSBfdGFnKSB7IF9fYXNzZXJ0MihfX0ZJTEVfXywgX19MSU5FX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18sICJiYWQgYWNjZXNzOiBhIHdyb25nIHRhZyIpOyB9CisgICAgcmV0dXJuIHN0ZDo6Z2V0PHN0YXRpY19jYXN0PHNpemVfdD4oX3RhZyk+KF92YWx1ZSk7CisgIH0KKworICB0ZW1wbGF0ZSA8VGFnIF90YWcsIHR5cGVuYW1lLi4uIF9UcD4KKyAgdm9pZCBzZXQoX1RwJiYuLi4gX2FyZ3MpIHsKKyAgICBfdmFsdWUuZW1wbGFjZTxzdGF0aWNfY2FzdDxzaXplX3Q+KF90YWcpPihzdGQ6OmZvcndhcmQ8X1RwPihfYXJncykuLi4pOworICB9CisKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBCYXpVbmlvbiYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIF92YWx1ZSAhPSByaHMuX3ZhbHVlOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBCYXpVbmlvbiYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIF92YWx1ZSA8IHJocy5fdmFsdWU7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBCYXpVbmlvbiYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIF92YWx1ZSA8PSByaHMuX3ZhbHVlOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgQmF6VW5pb24mIHJocykgY29uc3QgeworICAgIHJldHVybiBfdmFsdWUgPT0gcmhzLl92YWx1ZTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgQmF6VW5pb24mIHJocykgY29uc3QgeworICAgIHJldHVybiBfdmFsdWUgPiByaHMuX3ZhbHVlOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgQmF6VW5pb24mIHJocykgY29uc3QgeworICAgIHJldHVybiBfdmFsdWUgPj0gcmhzLl92YWx1ZTsKKyAgfQorCisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgZmluYWw7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3Qgd3JpdGVUb1BhcmNlbCg6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCBmaW5hbDsKKyAgc3RhdGljIGNvbnN0IDo6YW5kcm9pZDo6U3RyaW5nMTYmIGdldFBhcmNlbGFibGVEZXNjcmlwdG9yKCkgeworICAgIHN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0YXRpY1N0cmluZzE2IERFU0NJUFRPUiAodSJhbmRyb2lkLmFpZGwudmVyc2lvbmVkLnRlc3RzLkJhelVuaW9uIik7CisgICAgcmV0dXJuIERFU0NJUFRPUjsKKyAgfQorICBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOworICAgIG9zIDw8ICJCYXpVbmlvbnsiOworICAgIHN3aXRjaCAoZ2V0VGFnKCkpIHsKKyAgICBjYXNlIGludE51bTogb3MgPDwgImludE51bTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhnZXQ8aW50TnVtPigpKTsgYnJlYWs7CisgICAgfQorICAgIG9zIDw8ICJ9IjsKKyAgICByZXR1cm4gb3Muc3RyKCk7CisgIH0KK3ByaXZhdGU6CisgIHN0ZDo6dmFyaWFudDxpbnQzMl90PiBfdmFsdWU7Cit9OyAgLy8gY2xhc3MgQmF6VW5pb24KK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIHZlcnNpb25lZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdmVyc2lvbmVkIHsKK25hbWVzcGFjZSB0ZXN0cyB7CitbW25vZGlzY2FyZF1dIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoQmF6VW5pb246OlRhZyB2YWwpIHsKKyAgc3dpdGNoKHZhbCkgeworICBjYXNlIEJhelVuaW9uOjpUYWc6OmludE51bToKKyAgICByZXR1cm4gImludE51bSI7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIHN0ZDo6dG9fc3RyaW5nKHN0YXRpY19jYXN0PGludDMyX3Q+KHZhbCkpOworICB9Cit9Cit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSB2ZXJzaW9uZWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGludGVybmFsIHsKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdjKysxNy1leHRlbnNpb25zIgordGVtcGxhdGUgPD4KK2NvbnN0ZXhwciBpbmxpbmUgc3RkOjphcnJheTw6OmFuZHJvaWQ6OmFpZGw6OnZlcnNpb25lZDo6dGVzdHM6OkJhelVuaW9uOjpUYWcsIDE+IGVudW1fdmFsdWVzPDo6YW5kcm9pZDo6YWlkbDo6dmVyc2lvbmVkOjp0ZXN0czo6QmF6VW5pb246OlRhZz4gPSB7CisgIDo6YW5kcm9pZDo6YWlkbDo6dmVyc2lvbmVkOjp0ZXN0czo6QmF6VW5pb246OlRhZzo6aW50TnVtLAorfTsKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0JuQmF6VW5pb24uaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0JuQmF6VW5pb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTcyYWEzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS1WMS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvQm5CYXpVbmlvbi5oCkBAIC0wLDAgKzEgQEAKKyNlcnJvciBUT0RPKGIvMTExMzYyNTkzKSBwYXJjZWxhYmxlcyBkbyBub3QgaGF2ZSBibiBjbGFzc2VzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS1WMS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvQm5Gb28uaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0JuRm9vLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U3MmFhMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0JuRm9vLmgKQEAgLTAsMCArMSBAQAorI2Vycm9yIFRPRE8oYi8xMTEzNjI1OTMpIHBhcmNlbGFibGVzIGRvIG5vdCBoYXZlIGJuIGNsYXNzZXMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYxLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9CbkZvb0ludGVyZmFjZS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS1WMS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvQm5Gb29JbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmM1NTk0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS1WMS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvQm5Gb29JbnRlcmZhY2UuaApAQCAtMCwwICsxLDU0IEBACisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9JRm9vSW50ZXJmYWNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB2ZXJzaW9uZWQgeworbmFtZXNwYWNlIHRlc3RzIHsKK2NsYXNzIEJuRm9vSW50ZXJmYWNlIDogcHVibGljIDo6YW5kcm9pZDo6Qm5JbnRlcmZhY2U8SUZvb0ludGVyZmFjZT4geworcHVibGljOgorICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX29yaWdpbmFsQXBpID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMDsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9hY2NlcHRVbmlvbkFuZFJldHVyblN0cmluZyA9IDo6YW5kcm9pZDo6SUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDE7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05faWdub3JlUGFyY2VsYWJsZXNBbmRSZXBlYXRJbnQgPSA6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyOworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX3JldHVybnNMZW5ndGhPZkZvb0FycmF5ID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9nZXRJbnRlcmZhY2VWZXJzaW9uID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMTY3NzcyMTQ7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fZ2V0SW50ZXJmYWNlSGFzaCA9IDo6YW5kcm9pZDo6SUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDE2Nzc3MjEzOworICBleHBsaWNpdCBCbkZvb0ludGVyZmFjZSgpOworICA6OmFuZHJvaWQ6OnN0YXR1c190IG9uVHJhbnNhY3QodWludDMyX3QgX2FpZGxfY29kZSwgY29uc3QgOjphbmRyb2lkOjpQYXJjZWwmIF9haWRsX2RhdGEsIDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9yZXBseSwgdWludDMyX3QgX2FpZGxfZmxhZ3MpIG92ZXJyaWRlOworICBpbnQzMl90IGdldEludGVyZmFjZVZlcnNpb24oKTsKKyAgc3RkOjpzdHJpbmcgZ2V0SW50ZXJmYWNlSGFzaCgpOworfTsgIC8vIGNsYXNzIEJuRm9vSW50ZXJmYWNlCisKK2NsYXNzIElGb29JbnRlcmZhY2VEZWxlZ2F0b3IgOiBwdWJsaWMgQm5Gb29JbnRlcmZhY2UgeworcHVibGljOgorICBleHBsaWNpdCBJRm9vSW50ZXJmYWNlRGVsZWdhdG9yKDo6YW5kcm9pZDo6c3A8SUZvb0ludGVyZmFjZT4gJmltcGwpIDogX2FpZGxfZGVsZWdhdGUoaW1wbCkge30KKworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIG9yaWdpbmFsQXBpKCkgb3ZlcnJpZGUgeworICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+b3JpZ2luYWxBcGkoKTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIGFjY2VwdFVuaW9uQW5kUmV0dXJuU3RyaW5nKGNvbnN0IDo6YW5kcm9pZDo6YWlkbDo6dmVyc2lvbmVkOjp0ZXN0czo6QmF6VW5pb24mIHUsIDo6c3RkOjpzdHJpbmcqIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+YWNjZXB0VW5pb25BbmRSZXR1cm5TdHJpbmcodSwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIGlnbm9yZVBhcmNlbGFibGVzQW5kUmVwZWF0SW50KGNvbnN0IDo6YW5kcm9pZDo6YWlkbDo6dmVyc2lvbmVkOjp0ZXN0czo6Rm9vJiBpbkZvbywgOjphbmRyb2lkOjphaWRsOjp2ZXJzaW9uZWQ6OnRlc3RzOjpGb28qIGlub3V0Rm9vLCA6OmFuZHJvaWQ6OmFpZGw6OnZlcnNpb25lZDo6dGVzdHM6OkZvbyogb3V0Rm9vLCBpbnQzMl90IHZhbHVlLCBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPmlnbm9yZVBhcmNlbGFibGVzQW5kUmVwZWF0SW50KGluRm9vLCBpbm91dEZvbywgb3V0Rm9vLCB2YWx1ZSwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIHJldHVybnNMZW5ndGhPZkZvb0FycmF5KGNvbnN0IDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjphaWRsOjp2ZXJzaW9uZWQ6OnRlc3RzOjpGb28+JiBmb29zLCBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPnJldHVybnNMZW5ndGhPZkZvb0FycmF5KGZvb3MsIF9haWRsX3JldHVybik7CisgIH0KKyAgaW50MzJfdCBnZXRJbnRlcmZhY2VWZXJzaW9uKCkgb3ZlcnJpZGUgeworICAgIGludDMyX3QgX2RlbGVnYXRvcl92ZXIgPSBCbkZvb0ludGVyZmFjZTo6Z2V0SW50ZXJmYWNlVmVyc2lvbigpOworICAgIGludDMyX3QgX2ltcGxfdmVyID0gX2FpZGxfZGVsZWdhdGUtPmdldEludGVyZmFjZVZlcnNpb24oKTsKKyAgICByZXR1cm4gX2RlbGVnYXRvcl92ZXIgPCBfaW1wbF92ZXIgPyBfZGVsZWdhdG9yX3ZlciA6IF9pbXBsX3ZlcjsKKyAgfQorICBzdGQ6OnN0cmluZyBnZXRJbnRlcmZhY2VIYXNoKCkgb3ZlcnJpZGUgeworICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+Z2V0SW50ZXJmYWNlSGFzaCgpOworICB9Citwcml2YXRlOgorICA6OmFuZHJvaWQ6OnNwPElGb29JbnRlcmZhY2U+IF9haWRsX2RlbGVnYXRlOworfTsgIC8vIGNsYXNzIElGb29JbnRlcmZhY2VEZWxlZ2F0b3IKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIHZlcnNpb25lZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYxLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9CcEJhelVuaW9uLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYxLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9CcEJhelVuaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdhZjZiMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0JwQmF6VW5pb24uaApAQCAtMCwwICsxIEBACisjZXJyb3IgVE9ETyhiLzExMTM2MjU5MykgcGFyY2VsYWJsZXMgZG8gbm90IGhhdmUgYnAgY2xhc3NlcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0JwRm9vLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYxLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9CcEZvby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YWY2YjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYxLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9CcEZvby5oCkBAIC0wLDAgKzEgQEAKKyNlcnJvciBUT0RPKGIvMTExMzYyNTkzKSBwYXJjZWxhYmxlcyBkbyBub3QgaGF2ZSBicCBjbGFzc2VzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS1WMS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvQnBGb29JbnRlcmZhY2UuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0JwRm9vSW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY1ZDg0MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0JwRm9vSW50ZXJmYWNlLmgKQEAgLTAsMCArMSwzMCBAQAorI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxiaW5kZXIvSUJpbmRlci5oPgorI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9JRm9vSW50ZXJmYWNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB2ZXJzaW9uZWQgeworbmFtZXNwYWNlIHRlc3RzIHsKK2NsYXNzIEJwRm9vSW50ZXJmYWNlIDogcHVibGljIDo6YW5kcm9pZDo6QnBJbnRlcmZhY2U8SUZvb0ludGVyZmFjZT4geworcHVibGljOgorICBleHBsaWNpdCBCcEZvb0ludGVyZmFjZShjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4mIF9haWRsX2ltcGwpOworICB2aXJ0dWFsIH5CcEZvb0ludGVyZmFjZSgpID0gZGVmYXVsdDsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBvcmlnaW5hbEFwaSgpIG92ZXJyaWRlOworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIGFjY2VwdFVuaW9uQW5kUmV0dXJuU3RyaW5nKGNvbnN0IDo6YW5kcm9pZDo6YWlkbDo6dmVyc2lvbmVkOjp0ZXN0czo6QmF6VW5pb24mIHUsIDo6c3RkOjpzdHJpbmcqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgaWdub3JlUGFyY2VsYWJsZXNBbmRSZXBlYXRJbnQoY29uc3QgOjphbmRyb2lkOjphaWRsOjp2ZXJzaW9uZWQ6OnRlc3RzOjpGb28mIGluRm9vLCA6OmFuZHJvaWQ6OmFpZGw6OnZlcnNpb25lZDo6dGVzdHM6OkZvbyogaW5vdXRGb28sIDo6YW5kcm9pZDo6YWlkbDo6dmVyc2lvbmVkOjp0ZXN0czo6Rm9vKiBvdXRGb28sIGludDMyX3QgdmFsdWUsIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgcmV0dXJuc0xlbmd0aE9mRm9vQXJyYXkoY29uc3QgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OmFpZGw6OnZlcnNpb25lZDo6dGVzdHM6OkZvbz4mIGZvb3MsIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIGludDMyX3QgZ2V0SW50ZXJmYWNlVmVyc2lvbigpIG92ZXJyaWRlOworICBzdGQ6OnN0cmluZyBnZXRJbnRlcmZhY2VIYXNoKCkgb3ZlcnJpZGU7Citwcml2YXRlOgorICBpbnQzMl90IGNhY2hlZF92ZXJzaW9uXyA9IC0xOworICBzdGQ6OnN0cmluZyBjYWNoZWRfaGFzaF8gPSAiLTEiOworICBzdGQ6Om11dGV4IGNhY2hlZF9oYXNoX211dGV4XzsKK307ICAvLyBjbGFzcyBCcEZvb0ludGVyZmFjZQorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgdmVyc2lvbmVkCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0Zvby5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS1WMS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvRm9vLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUxMjc3ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0Zvby5oCkBAIC0wLDAgKzEsNTAgQEAKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfdG9fc3RyaW5nLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGJpbmRlci9TdGF0dXMuaD4KKyNpbmNsdWRlIDx0dXBsZT4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdmVyc2lvbmVkIHsKK25hbWVzcGFjZSB0ZXN0cyB7CitjbGFzcyBGb28gOiBwdWJsaWMgOjphbmRyb2lkOjpQYXJjZWxhYmxlIHsKK3B1YmxpYzoKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBGb28mKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKCkgIT0gc3RkOjp0aWUoKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgRm9vJikgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZSgpIDwgc3RkOjp0aWUoKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IEZvbyYpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoKSA8PSBzdGQ6OnRpZSgpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgRm9vJikgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZSgpID09IHN0ZDo6dGllKCk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IEZvbyYpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoKSA+IHN0ZDo6dGllKCk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBGb28mKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKCkgPj0gc3RkOjp0aWUoKTsKKyAgfQorCisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgZmluYWw7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3Qgd3JpdGVUb1BhcmNlbCg6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCBmaW5hbDsKKyAgc3RhdGljIGNvbnN0IDo6YW5kcm9pZDo6U3RyaW5nMTYmIGdldFBhcmNlbGFibGVEZXNjcmlwdG9yKCkgeworICAgIHN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0YXRpY1N0cmluZzE2IERFU0NJUFRPUiAodSJhbmRyb2lkLmFpZGwudmVyc2lvbmVkLnRlc3RzLkZvbyIpOworICAgIHJldHVybiBERVNDSVBUT1I7CisgIH0KKyAgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvczsKKyAgICBvcyA8PCAiRm9veyI7CisgICAgb3MgPDwgIn0iOworICAgIHJldHVybiBvcy5zdHIoKTsKKyAgfQorfTsgIC8vIGNsYXNzIEZvbworfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgdmVyc2lvbmVkCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0lGb29JbnRlcmZhY2UuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0lGb29JbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTdlMzQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS1WMS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvSUZvb0ludGVyZmFjZS5oCkBAIC0wLDAgKzEsNTggQEAKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9CYXpVbmlvbi5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvRm9vLmg+CisjaW5jbHVkZSA8YmluZGVyL0lCaW5kZXIuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgorI2luY2x1ZGUgPGJpbmRlci9TdGF0dXMuaD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB2ZXJzaW9uZWQgeworbmFtZXNwYWNlIHRlc3RzIHsKK2NsYXNzIElGb29JbnRlcmZhY2UgOiBwdWJsaWMgOjphbmRyb2lkOjpJSW50ZXJmYWNlIHsKK3B1YmxpYzoKKyAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShGb29JbnRlcmZhY2UpCisgIGNvbnN0IGludDMyX3QgVkVSU0lPTiA9IDE7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIEhBU0ggPSAiOWU3YmUxODU5ODIwYzU5ZDlkNTVkZDEzM2U3MWEzNjg3YjVkMmU1YiI7CisgIHZpcnR1YWwgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBvcmlnaW5hbEFwaSgpID0gMDsKKyAgdmlydHVhbCA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIGFjY2VwdFVuaW9uQW5kUmV0dXJuU3RyaW5nKGNvbnN0IDo6YW5kcm9pZDo6YWlkbDo6dmVyc2lvbmVkOjp0ZXN0czo6QmF6VW5pb24mIHUsIDo6c3RkOjpzdHJpbmcqIF9haWRsX3JldHVybikgPSAwOworICB2aXJ0dWFsIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgaWdub3JlUGFyY2VsYWJsZXNBbmRSZXBlYXRJbnQoY29uc3QgOjphbmRyb2lkOjphaWRsOjp2ZXJzaW9uZWQ6OnRlc3RzOjpGb28mIGluRm9vLCA6OmFuZHJvaWQ6OmFpZGw6OnZlcnNpb25lZDo6dGVzdHM6OkZvbyogaW5vdXRGb28sIDo6YW5kcm9pZDo6YWlkbDo6dmVyc2lvbmVkOjp0ZXN0czo6Rm9vKiBvdXRGb28sIGludDMyX3QgdmFsdWUsIGludDMyX3QqIF9haWRsX3JldHVybikgPSAwOworICB2aXJ0dWFsIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgcmV0dXJuc0xlbmd0aE9mRm9vQXJyYXkoY29uc3QgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OmFpZGw6OnZlcnNpb25lZDo6dGVzdHM6OkZvbz4mIGZvb3MsIGludDMyX3QqIF9haWRsX3JldHVybikgPSAwOworICB2aXJ0dWFsIGludDMyX3QgZ2V0SW50ZXJmYWNlVmVyc2lvbigpID0gMDsKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRJbnRlcmZhY2VIYXNoKCkgPSAwOworfTsgIC8vIGNsYXNzIElGb29JbnRlcmZhY2UKKworY2xhc3MgSUZvb0ludGVyZmFjZURlZmF1bHQgOiBwdWJsaWMgSUZvb0ludGVyZmFjZSB7CitwdWJsaWM6CisgIDo6YW5kcm9pZDo6SUJpbmRlciogb25Bc0JpbmRlcigpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIG9yaWdpbmFsQXBpKCkgb3ZlcnJpZGUgeworICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgYWNjZXB0VW5pb25BbmRSZXR1cm5TdHJpbmcoY29uc3QgOjphbmRyb2lkOjphaWRsOjp2ZXJzaW9uZWQ6OnRlc3RzOjpCYXpVbmlvbiYgLyp1Ki8sIDo6c3RkOjpzdHJpbmcqIC8qX2FpZGxfcmV0dXJuKi8pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIGlnbm9yZVBhcmNlbGFibGVzQW5kUmVwZWF0SW50KGNvbnN0IDo6YW5kcm9pZDo6YWlkbDo6dmVyc2lvbmVkOjp0ZXN0czo6Rm9vJiAvKmluRm9vKi8sIDo6YW5kcm9pZDo6YWlkbDo6dmVyc2lvbmVkOjp0ZXN0czo6Rm9vKiAvKmlub3V0Rm9vKi8sIDo6YW5kcm9pZDo6YWlkbDo6dmVyc2lvbmVkOjp0ZXN0czo6Rm9vKiAvKm91dEZvbyovLCBpbnQzMl90IC8qdmFsdWUqLywgaW50MzJfdCogLypfYWlkbF9yZXR1cm4qLykgb3ZlcnJpZGUgeworICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgcmV0dXJuc0xlbmd0aE9mRm9vQXJyYXkoY29uc3QgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OmFpZGw6OnZlcnNpb25lZDo6dGVzdHM6OkZvbz4mIC8qZm9vcyovLCBpbnQzMl90KiAvKl9haWRsX3JldHVybiovKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTik7CisgIH0KKyAgaW50MzJfdCBnZXRJbnRlcmZhY2VWZXJzaW9uKCkgb3ZlcnJpZGUgeworICAgIHJldHVybiAwOworICB9CisgIHN0ZDo6c3RyaW5nIGdldEludGVyZmFjZUhhc2goKSBvdmVycmlkZSB7CisgICAgcmV0dXJuICIiOworICB9Cit9OyAgLy8gY2xhc3MgSUZvb0ludGVyZmFjZURlZmF1bHQKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIHZlcnNpb25lZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vdGltZXN0YW1wIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS1WMS1jcHAtc291cmNlL2dlbi90aW1lc3RhbXAKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vdGltZXN0YW1wCmNvcHkgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS1WMS1jcHAtc291cmNlL2dlbi90aW1lc3RhbXAKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvQmF6VW5pb24uamF2YSBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvQmF6VW5pb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjBlM2Q3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS1WMS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9CYXpVbmlvbi5qYXZhCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogVGhpcyBmaWxlIGlzIGF1dG8tZ2VuZXJhdGVkLiAgRE8gTk9UIE1PRElGWS4KKyAqLworcGFja2FnZSBhbmRyb2lkLmFpZGwudmVyc2lvbmVkLnRlc3RzOworcHVibGljIGZpbmFsIGNsYXNzIEJhelVuaW9uIGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlIHsKKyAgLy8gdGFncyBmb3IgdW5pb24gZmllbGRzCisgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IGludE51bSA9IDA7ICAvLyBpbnQgaW50TnVtOworCisgIHByaXZhdGUgaW50IF90YWc7CisgIHByaXZhdGUgT2JqZWN0IF92YWx1ZTsKKworICBwdWJsaWMgQmF6VW5pb24oKSB7CisgICAgaW50IF92YWx1ZSA9IDA7CisgICAgdGhpcy5fdGFnID0gaW50TnVtOworICAgIHRoaXMuX3ZhbHVlID0gX3ZhbHVlOworICB9CisKKyAgcHJpdmF0ZSBCYXpVbmlvbihhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9wYXJjZWwpIHsKKyAgICByZWFkRnJvbVBhcmNlbChfYWlkbF9wYXJjZWwpOworICB9CisKKyAgcHJpdmF0ZSBCYXpVbmlvbihpbnQgX3RhZywgT2JqZWN0IF92YWx1ZSkgeworICAgIHRoaXMuX3RhZyA9IF90YWc7CisgICAgdGhpcy5fdmFsdWUgPSBfdmFsdWU7CisgIH0KKworICBwdWJsaWMgaW50IGdldFRhZygpIHsKKyAgICByZXR1cm4gX3RhZzsKKyAgfQorCisgIC8vIGludCBpbnROdW07CisKKyAgcHVibGljIHN0YXRpYyBCYXpVbmlvbiBpbnROdW0oaW50IF92YWx1ZSkgeworICAgIHJldHVybiBuZXcgQmF6VW5pb24oaW50TnVtLCBfdmFsdWUpOworICB9CisKKyAgcHVibGljIGludCBnZXRJbnROdW0oKSB7CisgICAgX2Fzc2VydFRhZyhpbnROdW0pOworICAgIHJldHVybiAoaW50KSBfdmFsdWU7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRJbnROdW0oaW50IF92YWx1ZSkgeworICAgIF9zZXQoaW50TnVtLCBfdmFsdWUpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm9zLlBhcmNlbGFibGUuQ3JlYXRvcjxCYXpVbmlvbj4gQ1JFQVRPUiA9IG5ldyBhbmRyb2lkLm9zLlBhcmNlbGFibGUuQ3JlYXRvcjxCYXpVbmlvbj4oKSB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJhelVuaW9uIGNyZWF0ZUZyb21QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgX2FpZGxfc291cmNlKSB7CisgICAgICByZXR1cm4gbmV3IEJhelVuaW9uKF9haWRsX3NvdXJjZSk7CisgICAgfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCYXpVbmlvbltdIG5ld0FycmF5KGludCBfYWlkbF9zaXplKSB7CisgICAgICByZXR1cm4gbmV3IEJhelVuaW9uW19haWRsX3NpemVdOworICAgIH0KKyAgfTsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGZpbmFsIHZvaWQgd3JpdGVUb1BhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9wYXJjZWwsIGludCBfYWlkbF9mbGFnKSB7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KF90YWcpOworICAgIHN3aXRjaCAoX3RhZykgeworICAgIGNhc2UgaW50TnVtOgorICAgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KGdldEludE51bSgpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHJlYWRGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3BhcmNlbCkgeworICAgIGludCBfYWlkbF90YWc7CisgICAgX2FpZGxfdGFnID0gX2FpZGxfcGFyY2VsLnJlYWRJbnQoKTsKKyAgICBzd2l0Y2ggKF9haWRsX3RhZykgeworICAgIGNhc2UgaW50TnVtOiB7CisgICAgICBpbnQgX2FpZGxfdmFsdWU7CisgICAgICBfYWlkbF92YWx1ZSA9IF9haWRsX3BhcmNlbC5yZWFkSW50KCk7CisgICAgICBfc2V0KF9haWRsX3RhZywgX2FpZGxfdmFsdWUpOworICAgICAgcmV0dXJuOyB9CisgICAgfQorICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVuaW9uOiB1bmtub3duIHRhZzogIiArIF9haWRsX3RhZyk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgIGludCBfbWFzayA9IDA7CisgICAgc3dpdGNoIChnZXRUYWcoKSkgeworICAgIH0KKyAgICByZXR1cm4gX21hc2s7CisgIH0KKworICBwcml2YXRlIHZvaWQgX2Fzc2VydFRhZyhpbnQgdGFnKSB7CisgICAgaWYgKGdldFRhZygpICE9IHRhZykgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiYmFkIGFjY2VzczogIiArIF90YWdTdHJpbmcodGFnKSArICIsICIgKyBfdGFnU3RyaW5nKGdldFRhZygpKSArICIgaXMgYXZhaWxhYmxlLiIpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgU3RyaW5nIF90YWdTdHJpbmcoaW50IF90YWcpIHsKKyAgICBzd2l0Y2ggKF90YWcpIHsKKyAgICBjYXNlIGludE51bTogcmV0dXJuICJpbnROdW0iOworICAgIH0KKyAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ1bmtub3duIGZpZWxkOiAiICsgX3RhZyk7CisgIH0KKworICBwcml2YXRlIHZvaWQgX3NldChpbnQgX3RhZywgT2JqZWN0IF92YWx1ZSkgeworICAgIHRoaXMuX3RhZyA9IF90YWc7CisgICAgdGhpcy5fdmFsdWUgPSBfdmFsdWU7CisgIH0KKyAgcHVibGljIHN0YXRpYyBAaW50ZXJmYWNlIFRhZyB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaW50TnVtID0gMDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS1WMS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9CYXpVbmlvbi5qYXZhLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYxLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0JhelVuaW9uLmphdmEuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzc4OTVhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS1WMS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9CYXpVbmlvbi5qYXZhLmQKQEAgLTAsMCArMSwyIEBACitvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvQmF6VW5pb24uamF2YSA6IFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbF9hcGkvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UvMS9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0JhelVuaW9uLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvRm9vLmphdmEgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYxLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0Zvby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNWU2N2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYxLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0Zvby5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXV0by1nZW5lcmF0ZWQuICBETyBOT1QgTU9ESUZZLgorICovCitwYWNrYWdlIGFuZHJvaWQuYWlkbC52ZXJzaW9uZWQudGVzdHM7CitwdWJsaWMgY2xhc3MgRm9vIGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlCit7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3I8Rm9vPiBDUkVBVE9SID0gbmV3IGFuZHJvaWQub3MuUGFyY2VsYWJsZS5DcmVhdG9yPEZvbz4oKSB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEZvbyBjcmVhdGVGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3NvdXJjZSkgeworICAgICAgRm9vIF9haWRsX291dCA9IG5ldyBGb28oKTsKKyAgICAgIF9haWRsX291dC5yZWFkRnJvbVBhcmNlbChfYWlkbF9zb3VyY2UpOworICAgICAgcmV0dXJuIF9haWRsX291dDsKKyAgICB9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEZvb1tdIG5ld0FycmF5KGludCBfYWlkbF9zaXplKSB7CisgICAgICByZXR1cm4gbmV3IEZvb1tfYWlkbF9zaXplXTsKKyAgICB9CisgIH07CisgIEBPdmVycmlkZSBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZVRvUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3BhcmNlbCwgaW50IF9haWRsX2ZsYWcpCisgIHsKKyAgICBpbnQgX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpOworICAgIF9haWRsX3BhcmNlbC53cml0ZUludCgwKTsKKyAgICBpbnQgX2FpZGxfZW5kX3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKKyAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3Bvcyk7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KF9haWRsX2VuZF9wb3MgLSBfYWlkbF9zdGFydF9wb3MpOworICAgIF9haWRsX3BhcmNlbC5zZXREYXRhUG9zaXRpb24oX2FpZGxfZW5kX3Bvcyk7CisgIH0KKyAgcHVibGljIGZpbmFsIHZvaWQgcmVhZEZyb21QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgX2FpZGxfcGFyY2VsKQorICB7CisgICAgaW50IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKKyAgICBpbnQgX2FpZGxfcGFyY2VsYWJsZV9zaXplID0gX2FpZGxfcGFyY2VsLnJlYWRJbnQoKTsKKyAgICB0cnkgeworICAgICAgaWYgKF9haWRsX3BhcmNlbGFibGVfc2l6ZSA8IDQpIHRocm93IG5ldyBhbmRyb2lkLm9zLkJhZFBhcmNlbGFibGVFeGNlcHRpb24oIlBhcmNlbGFibGUgdG9vIHNtYWxsIik7OworICAgIH0gZmluYWxseSB7CisgICAgICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gKEludGVnZXIuTUFYX1ZBTFVFIC0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSkgeworICAgICAgICB0aHJvdyBuZXcgYW5kcm9pZC5vcy5CYWRQYXJjZWxhYmxlRXhjZXB0aW9uKCJPdmVyZmxvdyBpbiB0aGUgc2l6ZSBvZiBwYXJjZWxhYmxlIik7CisgICAgICB9CisgICAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgfQorICB9CisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgaW50IF9tYXNrID0gMDsKKyAgICByZXR1cm4gX21hc2s7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvRm9vLmphdmEuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvRm9vLmphdmEuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzc2M2JiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS1WMS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9Gb28uamF2YS5kCkBAIC0wLDAgKzEsMiBAQAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYxLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0Zvby5qYXZhIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC9haWRsX2FwaS9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS8xL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvRm9vLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvSUZvb0ludGVyZmFjZS5qYXZhIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS1WMS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9JRm9vSW50ZXJmYWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q2NjI0MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvSUZvb0ludGVyZmFjZS5qYXZhCkBAIC0wLDAgKzEsMzA2IEBACisvKgorICogVGhpcyBmaWxlIGlzIGF1dG8tZ2VuZXJhdGVkLiAgRE8gTk9UIE1PRElGWS4KKyAqLworcGFja2FnZSBhbmRyb2lkLmFpZGwudmVyc2lvbmVkLnRlc3RzOworcHVibGljIGludGVyZmFjZSBJRm9vSW50ZXJmYWNlIGV4dGVuZHMgYW5kcm9pZC5vcy5JSW50ZXJmYWNlCit7CisgIC8qKgorICAgKiBUaGUgdmVyc2lvbiBvZiB0aGlzIGludGVyZmFjZSB0aGF0IHRoZSBjYWxsZXIgaXMgYnVpbHQgYWdhaW5zdC4KKyAgICogVGhpcyBtaWdodCBiZSBkaWZmZXJlbnQgZnJvbSB3aGF0IHtAbGluayAjZ2V0SW50ZXJmYWNlVmVyc2lvbigpCisgICAqIGdldEludGVyZmFjZVZlcnNpb259IHJldHVybnMgYXMgdGhhdCBpcyB0aGUgdmVyc2lvbiBvZiB0aGUgaW50ZXJmYWNlCisgICAqIHRoYXQgdGhlIHJlbW90ZSBvYmplY3QgaXMgaW1wbGVtZW50aW5nLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkVSU0lPTiA9IDE7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhBU0ggPSAiOWU3YmUxODU5ODIwYzU5ZDlkNTVkZDEzM2U3MWEzNjg3YjVkMmU1YiI7CisgIC8qKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciBJRm9vSW50ZXJmYWNlLiAqLworICBwdWJsaWMgc3RhdGljIGNsYXNzIERlZmF1bHQgaW1wbGVtZW50cyBhbmRyb2lkLmFpZGwudmVyc2lvbmVkLnRlc3RzLklGb29JbnRlcmZhY2UKKyAgeworICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBvcmlnaW5hbEFwaSgpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGFjY2VwdFVuaW9uQW5kUmV0dXJuU3RyaW5nKGFuZHJvaWQuYWlkbC52ZXJzaW9uZWQudGVzdHMuQmF6VW5pb24gdSkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgaW50IGlnbm9yZVBhcmNlbGFibGVzQW5kUmVwZWF0SW50KGFuZHJvaWQuYWlkbC52ZXJzaW9uZWQudGVzdHMuRm9vIGluRm9vLCBhbmRyb2lkLmFpZGwudmVyc2lvbmVkLnRlc3RzLkZvbyBpbm91dEZvbywgYW5kcm9pZC5haWRsLnZlcnNpb25lZC50ZXN0cy5Gb28gb3V0Rm9vLCBpbnQgdmFsdWUpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIGludCByZXR1cm5zTGVuZ3RoT2ZGb29BcnJheShhbmRyb2lkLmFpZGwudmVyc2lvbmVkLnRlc3RzLkZvb1tdIGZvb3MpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldEludGVyZmFjZVZlcnNpb24oKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRJbnRlcmZhY2VIYXNoKCkgeworICAgICAgcmV0dXJuICIiOworICAgIH0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICB9CisgIC8qKiBMb2NhbC1zaWRlIElQQyBpbXBsZW1lbnRhdGlvbiBzdHViIGNsYXNzLiAqLworICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIFN0dWIgZXh0ZW5kcyBhbmRyb2lkLm9zLkJpbmRlciBpbXBsZW1lbnRzIGFuZHJvaWQuYWlkbC52ZXJzaW9uZWQudGVzdHMuSUZvb0ludGVyZmFjZQorICB7CisgICAgLyoqIENvbnN0cnVjdCB0aGUgc3R1YiBhdCBhdHRhY2ggaXQgdG8gdGhlIGludGVyZmFjZS4gKi8KKyAgICBwdWJsaWMgU3R1YigpCisgICAgeworICAgICAgdGhpcy5hdHRhY2hJbnRlcmZhY2UodGhpcywgREVTQ1JJUFRPUik7CisgICAgfQorICAgIC8qKgorICAgICAqIENhc3QgYW4gSUJpbmRlciBvYmplY3QgaW50byBhbiBhbmRyb2lkLmFpZGwudmVyc2lvbmVkLnRlc3RzLklGb29JbnRlcmZhY2UgaW50ZXJmYWNlLAorICAgICAqIGdlbmVyYXRpbmcgYSBwcm94eSBpZiBuZWVkZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBhbmRyb2lkLmFpZGwudmVyc2lvbmVkLnRlc3RzLklGb29JbnRlcmZhY2UgYXNJbnRlcmZhY2UoYW5kcm9pZC5vcy5JQmluZGVyIG9iaikKKyAgICB7CisgICAgICBpZiAoKG9iaj09bnVsbCkpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisgICAgICBhbmRyb2lkLm9zLklJbnRlcmZhY2UgaWluID0gb2JqLnF1ZXJ5TG9jYWxJbnRlcmZhY2UoREVTQ1JJUFRPUik7CisgICAgICBpZiAoKChpaW4hPW51bGwpJiYoaWluIGluc3RhbmNlb2YgYW5kcm9pZC5haWRsLnZlcnNpb25lZC50ZXN0cy5JRm9vSW50ZXJmYWNlKSkpIHsKKyAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5haWRsLnZlcnNpb25lZC50ZXN0cy5JRm9vSW50ZXJmYWNlKWlpbik7CisgICAgICB9CisgICAgICByZXR1cm4gbmV3IGFuZHJvaWQuYWlkbC52ZXJzaW9uZWQudGVzdHMuSUZvb0ludGVyZmFjZS5TdHViLlByb3h5KG9iaik7CisgICAgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKKyAgICB7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIG9uVHJhbnNhY3QoaW50IGNvZGUsIGFuZHJvaWQub3MuUGFyY2VsIGRhdGEsIGFuZHJvaWQub3MuUGFyY2VsIHJlcGx5LCBpbnQgZmxhZ3MpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgIGphdmEubGFuZy5TdHJpbmcgZGVzY3JpcHRvciA9IERFU0NSSVBUT1I7CisgICAgICBpZiAoY29kZSA+PSBhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiAmJiBjb2RlIDw9IGFuZHJvaWQub3MuSUJpbmRlci5MQVNUX0NBTExfVFJBTlNBQ1RJT04pIHsKKyAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKGRlc2NyaXB0b3IpOworICAgICAgfQorICAgICAgc3dpdGNoIChjb2RlKQorICAgICAgeworICAgICAgICBjYXNlIElOVEVSRkFDRV9UUkFOU0FDVElPTjoKKyAgICAgICAgeworICAgICAgICAgIHJlcGx5LndyaXRlU3RyaW5nKGRlc2NyaXB0b3IpOworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fZ2V0SW50ZXJmYWNlVmVyc2lvbjoKKyAgICAgICAgeworICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKKyAgICAgICAgICByZXBseS53cml0ZUludChnZXRJbnRlcmZhY2VWZXJzaW9uKCkpOworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fZ2V0SW50ZXJmYWNlSGFzaDoKKyAgICAgICAgeworICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKKyAgICAgICAgICByZXBseS53cml0ZVN0cmluZyhnZXRJbnRlcmZhY2VIYXNoKCkpOworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICB9CisgICAgICBzd2l0Y2ggKGNvZGUpCisgICAgICB7CisgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fb3JpZ2luYWxBcGk6CisgICAgICAgIHsKKyAgICAgICAgICB0aGlzLm9yaWdpbmFsQXBpKCk7CisgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fYWNjZXB0VW5pb25BbmRSZXR1cm5TdHJpbmc6CisgICAgICAgIHsKKyAgICAgICAgICBhbmRyb2lkLmFpZGwudmVyc2lvbmVkLnRlc3RzLkJhelVuaW9uIF9hcmcwOworICAgICAgICAgIF9hcmcwID0gZGF0YS5yZWFkVHlwZWRPYmplY3QoYW5kcm9pZC5haWRsLnZlcnNpb25lZC50ZXN0cy5CYXpVbmlvbi5DUkVBVE9SKTsKKyAgICAgICAgICBkYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOworICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgX3Jlc3VsdCA9IHRoaXMuYWNjZXB0VW5pb25BbmRSZXR1cm5TdHJpbmcoX2FyZzApOworICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKKyAgICAgICAgICByZXBseS53cml0ZVN0cmluZyhfcmVzdWx0KTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX2lnbm9yZVBhcmNlbGFibGVzQW5kUmVwZWF0SW50OgorICAgICAgICB7CisgICAgICAgICAgYW5kcm9pZC5haWRsLnZlcnNpb25lZC50ZXN0cy5Gb28gX2FyZzA7CisgICAgICAgICAgX2FyZzAgPSBkYXRhLnJlYWRUeXBlZE9iamVjdChhbmRyb2lkLmFpZGwudmVyc2lvbmVkLnRlc3RzLkZvby5DUkVBVE9SKTsKKyAgICAgICAgICBhbmRyb2lkLmFpZGwudmVyc2lvbmVkLnRlc3RzLkZvbyBfYXJnMTsKKyAgICAgICAgICBfYXJnMSA9IGRhdGEucmVhZFR5cGVkT2JqZWN0KGFuZHJvaWQuYWlkbC52ZXJzaW9uZWQudGVzdHMuRm9vLkNSRUFUT1IpOworICAgICAgICAgIGFuZHJvaWQuYWlkbC52ZXJzaW9uZWQudGVzdHMuRm9vIF9hcmcyOworICAgICAgICAgIF9hcmcyID0gbmV3IGFuZHJvaWQuYWlkbC52ZXJzaW9uZWQudGVzdHMuRm9vKCk7CisgICAgICAgICAgaW50IF9hcmczOworICAgICAgICAgIF9hcmczID0gZGF0YS5yZWFkSW50KCk7CisgICAgICAgICAgZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsKKyAgICAgICAgICBpbnQgX3Jlc3VsdCA9IHRoaXMuaWdub3JlUGFyY2VsYWJsZXNBbmRSZXBlYXRJbnQoX2FyZzAsIF9hcmcxLCBfYXJnMiwgX2FyZzMpOworICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKKyAgICAgICAgICByZXBseS53cml0ZUludChfcmVzdWx0KTsKKyAgICAgICAgICByZXBseS53cml0ZVR5cGVkT2JqZWN0KF9hcmcxLCBhbmRyb2lkLm9zLlBhcmNlbGFibGUuUEFSQ0VMQUJMRV9XUklURV9SRVRVUk5fVkFMVUUpOworICAgICAgICAgIHJlcGx5LndyaXRlVHlwZWRPYmplY3QoX2FyZzIsIGFuZHJvaWQub3MuUGFyY2VsYWJsZS5QQVJDRUxBQkxFX1dSSVRFX1JFVFVSTl9WQUxVRSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9yZXR1cm5zTGVuZ3RoT2ZGb29BcnJheToKKyAgICAgICAgeworICAgICAgICAgIGFuZHJvaWQuYWlkbC52ZXJzaW9uZWQudGVzdHMuRm9vW10gX2FyZzA7CisgICAgICAgICAgX2FyZzAgPSBkYXRhLmNyZWF0ZVR5cGVkQXJyYXkoYW5kcm9pZC5haWRsLnZlcnNpb25lZC50ZXN0cy5Gb28uQ1JFQVRPUik7CisgICAgICAgICAgZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsKKyAgICAgICAgICBpbnQgX3Jlc3VsdCA9IHRoaXMucmV0dXJuc0xlbmd0aE9mRm9vQXJyYXkoX2FyZzApOworICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKKyAgICAgICAgICByZXBseS53cml0ZUludChfcmVzdWx0KTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIHN1cGVyLm9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFByb3h5IGltcGxlbWVudHMgYW5kcm9pZC5haWRsLnZlcnNpb25lZC50ZXN0cy5JRm9vSW50ZXJmYWNlCisgICAgeworICAgICAgcHJpdmF0ZSBhbmRyb2lkLm9zLklCaW5kZXIgbVJlbW90ZTsKKyAgICAgIFByb3h5KGFuZHJvaWQub3MuSUJpbmRlciByZW1vdGUpCisgICAgICB7CisgICAgICAgIG1SZW1vdGUgPSByZW1vdGU7CisgICAgICB9CisgICAgICBwcml2YXRlIGludCBtQ2FjaGVkVmVyc2lvbiA9IC0xOworICAgICAgcHJpdmF0ZSBTdHJpbmcgbUNhY2hlZEhhc2ggPSAiLTEiOworICAgICAgQE92ZXJyaWRlIHB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKQorICAgICAgeworICAgICAgICByZXR1cm4gbVJlbW90ZTsKKyAgICAgIH0KKyAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEludGVyZmFjZURlc2NyaXB0b3IoKQorICAgICAgeworICAgICAgICByZXR1cm4gREVTQ1JJUFRPUjsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBvcmlnaW5hbEFwaSgpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgICAgeworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbihhc0JpbmRlcigpKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKKyAgICAgICAgICBib29sZWFuIF9zdGF0dXMgPSBtUmVtb3RlLnRyYW5zYWN0KFN0dWIuVFJBTlNBQ1RJT05fb3JpZ2luYWxBcGksIF9kYXRhLCBfcmVwbHksIDApOworICAgICAgICAgIGlmICghX3N0YXR1cykgeworICAgICAgICAgICAgdGhyb3cgbmV3IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uKCJNZXRob2Qgb3JpZ2luYWxBcGkgaXMgdW5pbXBsZW1lbnRlZC4iKTsKKyAgICAgICAgICB9CisgICAgICAgICAgX3JlcGx5LnJlYWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICBfcmVwbHkucmVjeWNsZSgpOworICAgICAgICAgIF9kYXRhLnJlY3ljbGUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgQE92ZXJyaWRlIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGFjY2VwdFVuaW9uQW5kUmV0dXJuU3RyaW5nKGFuZHJvaWQuYWlkbC52ZXJzaW9uZWQudGVzdHMuQmF6VW5pb24gdSkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgICB7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgamF2YS5sYW5nLlN0cmluZyBfcmVzdWx0OworICAgICAgICB0cnkgeworICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7CisgICAgICAgICAgX2RhdGEud3JpdGVUeXBlZE9iamVjdCh1LCAwKTsKKyAgICAgICAgICBib29sZWFuIF9zdGF0dXMgPSBtUmVtb3RlLnRyYW5zYWN0KFN0dWIuVFJBTlNBQ1RJT05fYWNjZXB0VW5pb25BbmRSZXR1cm5TdHJpbmcsIF9kYXRhLCBfcmVwbHksIDApOworICAgICAgICAgIGlmICghX3N0YXR1cykgeworICAgICAgICAgICAgdGhyb3cgbmV3IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uKCJNZXRob2QgYWNjZXB0VW5pb25BbmRSZXR1cm5TdHJpbmcgaXMgdW5pbXBsZW1lbnRlZC4iKTsKKyAgICAgICAgICB9CisgICAgICAgICAgX3JlcGx5LnJlYWRFeGNlcHRpb24oKTsKKyAgICAgICAgICBfcmVzdWx0ID0gX3JlcGx5LnJlYWRTdHJpbmcoKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICBfcmVwbHkucmVjeWNsZSgpOworICAgICAgICAgIF9kYXRhLnJlY3ljbGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX3Jlc3VsdDsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgaW50IGlnbm9yZVBhcmNlbGFibGVzQW5kUmVwZWF0SW50KGFuZHJvaWQuYWlkbC52ZXJzaW9uZWQudGVzdHMuRm9vIGluRm9vLCBhbmRyb2lkLmFpZGwudmVyc2lvbmVkLnRlc3RzLkZvbyBpbm91dEZvbywgYW5kcm9pZC5haWRsLnZlcnNpb25lZC50ZXN0cy5Gb28gb3V0Rm9vLCBpbnQgdmFsdWUpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgICAgeworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbihhc0JpbmRlcigpKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIGludCBfcmVzdWx0OworICAgICAgICB0cnkgeworICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7CisgICAgICAgICAgX2RhdGEud3JpdGVUeXBlZE9iamVjdChpbkZvbywgMCk7CisgICAgICAgICAgX2RhdGEud3JpdGVUeXBlZE9iamVjdChpbm91dEZvbywgMCk7CisgICAgICAgICAgX2RhdGEud3JpdGVJbnQodmFsdWUpOworICAgICAgICAgIGJvb2xlYW4gX3N0YXR1cyA9IG1SZW1vdGUudHJhbnNhY3QoU3R1Yi5UUkFOU0FDVElPTl9pZ25vcmVQYXJjZWxhYmxlc0FuZFJlcGVhdEludCwgX2RhdGEsIF9yZXBseSwgMCk7CisgICAgICAgICAgaWYgKCFfc3RhdHVzKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24oIk1ldGhvZCBpZ25vcmVQYXJjZWxhYmxlc0FuZFJlcGVhdEludCBpcyB1bmltcGxlbWVudGVkLiIpOworICAgICAgICAgIH0KKyAgICAgICAgICBfcmVwbHkucmVhZEV4Y2VwdGlvbigpOworICAgICAgICAgIF9yZXN1bHQgPSBfcmVwbHkucmVhZEludCgpOworICAgICAgICAgIGlmICgoMCE9X3JlcGx5LnJlYWRJbnQoKSkpIHsKKyAgICAgICAgICAgIGlub3V0Rm9vLnJlYWRGcm9tUGFyY2VsKF9yZXBseSk7CisgICAgICAgICAgfQorICAgICAgICAgIGlmICgoMCE9X3JlcGx5LnJlYWRJbnQoKSkpIHsKKyAgICAgICAgICAgIG91dEZvby5yZWFkRnJvbVBhcmNlbChfcmVwbHkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICBfcmVwbHkucmVjeWNsZSgpOworICAgICAgICAgIF9kYXRhLnJlY3ljbGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX3Jlc3VsdDsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgaW50IHJldHVybnNMZW5ndGhPZkZvb0FycmF5KGFuZHJvaWQuYWlkbC52ZXJzaW9uZWQudGVzdHMuRm9vW10gZm9vcykgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgICB7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgaW50IF9yZXN1bHQ7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKKyAgICAgICAgICBfZGF0YS53cml0ZVR5cGVkQXJyYXkoZm9vcywgMCk7CisgICAgICAgICAgYm9vbGVhbiBfc3RhdHVzID0gbVJlbW90ZS50cmFuc2FjdChTdHViLlRSQU5TQUNUSU9OX3JldHVybnNMZW5ndGhPZkZvb0FycmF5LCBfZGF0YSwgX3JlcGx5LCAwKTsKKyAgICAgICAgICBpZiAoIV9zdGF0dXMpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbigiTWV0aG9kIHJldHVybnNMZW5ndGhPZkZvb0FycmF5IGlzIHVuaW1wbGVtZW50ZWQuIik7CisgICAgICAgICAgfQorICAgICAgICAgIF9yZXBseS5yZWFkRXhjZXB0aW9uKCk7CisgICAgICAgICAgX3Jlc3VsdCA9IF9yZXBseS5yZWFkSW50KCk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgX3JlcGx5LnJlY3ljbGUoKTsKKyAgICAgICAgICBfZGF0YS5yZWN5Y2xlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9yZXN1bHQ7CisgICAgICB9CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBpbnQgZ2V0SW50ZXJmYWNlVmVyc2lvbigpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChtQ2FjaGVkVmVyc2lvbiA9PSAtMSkgeworICAgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIGRhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oYXNCaW5kZXIoKSk7CisgICAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOworICAgICAgICAgICAgYm9vbGVhbiBfc3RhdHVzID0gbVJlbW90ZS50cmFuc2FjdChTdHViLlRSQU5TQUNUSU9OX2dldEludGVyZmFjZVZlcnNpb24sIGRhdGEsIHJlcGx5LCAwKTsKKyAgICAgICAgICAgIHJlcGx5LnJlYWRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIG1DYWNoZWRWZXJzaW9uID0gcmVwbHkucmVhZEludCgpOworICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICByZXBseS5yZWN5Y2xlKCk7CisgICAgICAgICAgICBkYXRhLnJlY3ljbGUoKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1DYWNoZWRWZXJzaW9uOworICAgICAgfQorICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyBnZXRJbnRlcmZhY2VIYXNoKCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCItMSIuZXF1YWxzKG1DYWNoZWRIYXNoKSkgeworICAgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIGRhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oYXNCaW5kZXIoKSk7CisgICAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOworICAgICAgICAgICAgYm9vbGVhbiBfc3RhdHVzID0gbVJlbW90ZS50cmFuc2FjdChTdHViLlRSQU5TQUNUSU9OX2dldEludGVyZmFjZUhhc2gsIGRhdGEsIHJlcGx5LCAwKTsKKyAgICAgICAgICAgIHJlcGx5LnJlYWRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIG1DYWNoZWRIYXNoID0gcmVwbHkucmVhZFN0cmluZygpOworICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICByZXBseS5yZWN5Y2xlKCk7CisgICAgICAgICAgICBkYXRhLnJlY3ljbGUoKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1DYWNoZWRIYXNoOworICAgICAgfQorICAgIH0KKyAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX29yaWdpbmFsQXBpID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMCk7CisgICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9hY2NlcHRVbmlvbkFuZFJldHVyblN0cmluZyA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDEpOworICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05faWdub3JlUGFyY2VsYWJsZXNBbmRSZXBlYXRJbnQgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyKTsKKyAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX3JldHVybnNMZW5ndGhPZkZvb0FycmF5ID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMyk7CisgICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9nZXRJbnRlcmZhY2VWZXJzaW9uID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMTY3NzcyMTQpOworICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZ2V0SW50ZXJmYWNlSGFzaCA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDE2Nzc3MjEzKTsKKyAgfQorICBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVTQ1JJUFRPUiA9ICJhbmRyb2lkJGFpZGwkdmVyc2lvbmVkJHRlc3RzJElGb29JbnRlcmZhY2UiLnJlcGxhY2UoJyQnLCAnLicpOworICBwdWJsaWMgdm9pZCBvcmlnaW5hbEFwaSgpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKKyAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgYWNjZXB0VW5pb25BbmRSZXR1cm5TdHJpbmcoYW5kcm9pZC5haWRsLnZlcnNpb25lZC50ZXN0cy5CYXpVbmlvbiB1KSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CisgIHB1YmxpYyBpbnQgaWdub3JlUGFyY2VsYWJsZXNBbmRSZXBlYXRJbnQoYW5kcm9pZC5haWRsLnZlcnNpb25lZC50ZXN0cy5Gb28gaW5Gb28sIGFuZHJvaWQuYWlkbC52ZXJzaW9uZWQudGVzdHMuRm9vIGlub3V0Rm9vLCBhbmRyb2lkLmFpZGwudmVyc2lvbmVkLnRlc3RzLkZvbyBvdXRGb28sIGludCB2YWx1ZSkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworICBwdWJsaWMgaW50IHJldHVybnNMZW5ndGhPZkZvb0FycmF5KGFuZHJvaWQuYWlkbC52ZXJzaW9uZWQudGVzdHMuRm9vW10gZm9vcykgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworICBwdWJsaWMgaW50IGdldEludGVyZmFjZVZlcnNpb24oKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CisgIHB1YmxpYyBTdHJpbmcgZ2V0SW50ZXJmYWNlSGFzaCgpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvSUZvb0ludGVyZmFjZS5qYXZhLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYxLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0lGb29JbnRlcmZhY2UuamF2YS5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NzU5MTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYxLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0lGb29JbnRlcmZhY2UuamF2YS5kCkBAIC0wLDAgKzEsNCBAQAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYxLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0lGb29JbnRlcmZhY2UuamF2YSA6IFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbF9hcGkvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UvMS9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0lGb29JbnRlcmZhY2UuYWlkbCBcCisgIHN5c3RlbS90b29scy9haWRsL2FpZGxfYXBpL2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLzEvYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9CYXpVbmlvbi5haWRsIFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbF9hcGkvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UvMS9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0Zvby5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vdGltZXN0YW1wIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS1WMS1qYXZhLXNvdXJjZS9nZW4vdGltZXN0YW1wCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL3RpbWVzdGFtcApjb3B5IHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtamF2YS1zb3VyY2UvZ2VuL3RpbWVzdGFtcApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS1WMS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0JhelVuaW9uLmNwcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9CYXpVbmlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE4YTg1ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9CYXpVbmlvbi5jcHAKQEAgLTAsMCArMSw0MyBAQAorI2luY2x1ZGUgImFpZGwvYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9CYXpVbmlvbi5oIgorCisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcGFyY2VsX3V0aWxzLmg+CisKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB2ZXJzaW9uZWQgeworbmFtZXNwYWNlIHRlc3RzIHsKK2NvbnN0IGNoYXIqIEJhelVuaW9uOjpkZXNjcmlwdG9yID0gImFuZHJvaWQuYWlkbC52ZXJzaW9uZWQudGVzdHMuQmF6VW5pb24iOworCitiaW5kZXJfc3RhdHVzX3QgQmF6VW5pb246OnJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIF9wYXJjZWwpIHsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXM7CisgIGludDMyX3QgX2FpZGxfdGFnOworICBpZiAoKF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfcGFyY2VsLCAmX2FpZGxfdGFnKSkgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgc3dpdGNoIChzdGF0aWNfY2FzdDxUYWc+KF9haWRsX3RhZykpIHsKKyAgY2FzZSBpbnROdW06IHsKKyAgICBpbnQzMl90IF9haWRsX3ZhbHVlOworICAgIGlmICgoX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9wYXJjZWwsICZfYWlkbF92YWx1ZSkpICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgICAgaWYgY29uc3RleHByIChzdGQ6OmlzX3RyaXZpYWxseV9jb3B5YWJsZV92PGludDMyX3Q+KSB7CisgICAgICBzZXQ8aW50TnVtPihfYWlkbF92YWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIE5PTElOVE5FWFRMSU5FKHBlcmZvcm1hbmNlLW1vdmUtY29uc3QtYXJnKQorICAgICAgc2V0PGludE51bT4oc3RkOjptb3ZlKF9haWRsX3ZhbHVlKSk7CisgICAgfQorICAgIHJldHVybiBTVEFUVVNfT0s7IH0KKyAgfQorICByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTsKK30KK2JpbmRlcl9zdGF0dXNfdCBCYXpVbmlvbjo6d3JpdGVUb1BhcmNlbChBUGFyY2VsKiBfcGFyY2VsKSBjb25zdCB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9wYXJjZWwsIHN0YXRpY19jYXN0PGludDMyX3Q+KGdldFRhZygpKSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIHN3aXRjaCAoZ2V0VGFnKCkpIHsKKyAgY2FzZSBpbnROdW06IHJldHVybiA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX3BhcmNlbCwgZ2V0PGludE51bT4oKSk7CisgIH0KKyAgX19hc3NlcnQyKF9fRklMRV9fLCBfX0xJTkVfXywgX19QUkVUVFlfRlVOQ1RJT05fXywgImNhbid0IHJlYWNoIGhlcmUiKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgdmVyc2lvbmVkCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYxLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvQmF6VW5pb24uY3BwLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYxLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvQmF6VW5pb24uY3BwLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ1ODFiZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9CYXpVbmlvbi5jcHAuZApAQCAtMCwwICsxLDIgQEAKK291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS1WMS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0JhelVuaW9uLmNwcCA6IFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbF9hcGkvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UvMS9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0JhelVuaW9uLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9Gb28uY3BwIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS1WMS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0Zvby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZmMGJlNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9Gb28uY3BwCkBAIC0wLDAgKzEsNDEgQEAKKyNpbmNsdWRlICJhaWRsL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvRm9vLmgiCisKKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wYXJjZWxfdXRpbHMuaD4KKworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHZlcnNpb25lZCB7CituYW1lc3BhY2UgdGVzdHMgeworY29uc3QgY2hhciogRm9vOjpkZXNjcmlwdG9yID0gImFuZHJvaWQuYWlkbC52ZXJzaW9uZWQudGVzdHMuRm9vIjsKKworYmluZGVyX3N0YXR1c190IEZvbzo6cmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogX2FpZGxfcGFyY2VsKSB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX09LOworICBpbnQzMl90IF9haWRsX3N0YXJ0X3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIGludDMyX3QgX2FpZGxfcGFyY2VsYWJsZV9zaXplID0gMDsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyKF9haWRsX3BhcmNlbCwgJl9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKF9haWRsX3BhcmNlbGFibGVfc2l6ZSA8IDQpIHJldHVybiBTVEFUVVNfQkFEX1ZBTFVFOworICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gSU5UMzJfTUFYIC0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTsKKyAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KK2JpbmRlcl9zdGF0dXNfdCBGb286OndyaXRlVG9QYXJjZWwoQVBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzOworICBzaXplX3QgX2FpZGxfc3RhcnRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQzMihfYWlkbF9wYXJjZWwsIDApOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIHNpemVfdCBfYWlkbF9lbmRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKTsKKyAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MpOworICBBUGFyY2VsX3dyaXRlSW50MzIoX2FpZGxfcGFyY2VsLCBfYWlkbF9lbmRfcG9zIC0gX2FpZGxfc3RhcnRfcG9zKTsKKyAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9lbmRfcG9zKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIHZlcnNpb25lZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS1WMS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0Zvby5jcHAuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9Gb28uY3BwLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY5NjNlMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9Gb28uY3BwLmQKQEAgLTAsMCArMSwyIEBACitvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9Gb28uY3BwIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC9haWRsX2FwaS9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS8xL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvRm9vLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9JRm9vSW50ZXJmYWNlLmNwcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9JRm9vSW50ZXJmYWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWVkZGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS1WMS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0lGb29JbnRlcmZhY2UuY3BwCkBAIC0wLDAgKzEsNDgzIEBACisjaW5jbHVkZSAiYWlkbC9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0lGb29JbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3BhcmNlbF91dGlscy5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9CbkZvb0ludGVyZmFjZS5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9CcEZvb0ludGVyZmFjZS5oPgorCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdmVyc2lvbmVkIHsKK25hbWVzcGFjZSB0ZXN0cyB7CitzdGF0aWMgYmluZGVyX3N0YXR1c190IF9haWRsX2FuZHJvaWRfYWlkbF92ZXJzaW9uZWRfdGVzdHNfSUZvb0ludGVyZmFjZV9vblRyYW5zYWN0KEFJQmluZGVyKiBfYWlkbF9iaW5kZXIsIHRyYW5zYWN0aW9uX2NvZGVfdCBfYWlkbF9jb2RlLCBjb25zdCBBUGFyY2VsKiBfYWlkbF9pbiwgQVBhcmNlbCogX2FpZGxfb3V0KSB7CisgICh2b2lkKV9haWRsX2luOworICAodm9pZClfYWlkbF9vdXQ7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT047CisgIHN0ZDo6c2hhcmVkX3B0cjxCbkZvb0ludGVyZmFjZT4gX2FpZGxfaW1wbCA9IHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxCbkZvb0ludGVyZmFjZT4oOjpuZGs6OklDSW50ZXJmYWNlOjphc0ludGVyZmFjZShfYWlkbF9iaW5kZXIpKTsKKyAgc3dpdGNoIChfYWlkbF9jb2RlKSB7CisgICAgY2FzZSAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDAgLypvcmlnaW5hbEFwaSovKTogeworCisgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXMgPSBfYWlkbF9pbXBsLT5vcmlnaW5hbEFwaSgpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVTdGF0dXNIZWFkZXIoX2FpZGxfb3V0LCBfYWlkbF9zdGF0dXMuZ2V0KCkpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7CisKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMSAvKmFjY2VwdFVuaW9uQW5kUmV0dXJuU3RyaW5nKi8pOiB7CisgICAgICA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnZlcnNpb25lZDo6dGVzdHM6OkJhelVuaW9uIGluX3U7CisgICAgICBzdGQ6OnN0cmluZyBfYWlkbF9yZXR1cm47CisKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9pbiwgJmluX3UpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzID0gX2FpZGxfaW1wbC0+YWNjZXB0VW5pb25BbmRSZXR1cm5TdHJpbmcoaW5fdSwgJl9haWRsX3JldHVybik7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZVN0YXR1c0hlYWRlcihfYWlkbF9vdXQsIF9haWRsX3N0YXR1cy5nZXQoKSk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBicmVhazsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDIgLyppZ25vcmVQYXJjZWxhYmxlc0FuZFJlcGVhdEludCovKTogeworICAgICAgOjphaWRsOjphbmRyb2lkOjphaWRsOjp2ZXJzaW9uZWQ6OnRlc3RzOjpGb28gaW5faW5Gb287CisgICAgICA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnZlcnNpb25lZDo6dGVzdHM6OkZvbyBpbl9pbm91dEZvbzsKKyAgICAgIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dmVyc2lvbmVkOjp0ZXN0czo6Rm9vIG91dF9vdXRGb287CisgICAgICBpbnQzMl90IGluX3ZhbHVlOworICAgICAgaW50MzJfdCBfYWlkbF9yZXR1cm47CisKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9pbiwgJmluX2luRm9vKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9pbiwgJmluX2lub3V0Rm9vKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9pbiwgJmluX3ZhbHVlKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1cyA9IF9haWRsX2ltcGwtPmlnbm9yZVBhcmNlbGFibGVzQW5kUmVwZWF0SW50KGluX2luRm9vLCAmaW5faW5vdXRGb28sICZvdXRfb3V0Rm9vLCBpbl92YWx1ZSwgJl9haWRsX3JldHVybik7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZVN0YXR1c0hlYWRlcihfYWlkbF9vdXQsIF9haWRsX3N0YXR1cy5nZXQoKSk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBicmVhazsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgaW5faW5vdXRGb28pOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIG91dF9vdXRGb28pOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzIC8qcmV0dXJuc0xlbmd0aE9mRm9vQXJyYXkqLyk6IHsKKyAgICAgIHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dmVyc2lvbmVkOjp0ZXN0czo6Rm9vPiBpbl9mb29zOworICAgICAgaW50MzJfdCBfYWlkbF9yZXR1cm47CisKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9pbiwgJmluX2Zvb3MpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzID0gX2FpZGxfaW1wbC0+cmV0dXJuc0xlbmd0aE9mRm9vQXJyYXkoaW5fZm9vcywgJl9haWRsX3JldHVybik7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZVN0YXR1c0hlYWRlcihfYWlkbF9vdXQsIF9haWRsX3N0YXR1cy5nZXQoKSk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBicmVhazsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDE2Nzc3MjE0IC8qZ2V0SW50ZXJmYWNlVmVyc2lvbiovKTogeworICAgICAgaW50MzJfdCBfYWlkbF9yZXR1cm47CisKKyAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1cyA9IF9haWRsX2ltcGwtPmdldEludGVyZmFjZVZlcnNpb24oJl9haWRsX3JldHVybik7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZVN0YXR1c0hlYWRlcihfYWlkbF9vdXQsIF9haWRsX3N0YXR1cy5nZXQoKSk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBicmVhazsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDE2Nzc3MjEzIC8qZ2V0SW50ZXJmYWNlSGFzaCovKTogeworICAgICAgc3RkOjpzdHJpbmcgX2FpZGxfcmV0dXJuOworCisgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXMgPSBfYWlkbF9pbXBsLT5nZXRJbnRlcmZhY2VIYXNoKCZfYWlkbF9yZXR1cm4pOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVTdGF0dXNIZWFkZXIoX2FpZGxfb3V0LCBfYWlkbF9zdGF0dXMuZ2V0KCkpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7CisKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorCitzdGF0aWMgQUlCaW5kZXJfQ2xhc3MqIF9nX2FpZGxfYW5kcm9pZF9haWRsX3ZlcnNpb25lZF90ZXN0c19JRm9vSW50ZXJmYWNlX2NsYXp6ID0gOjpuZGs6OklDSW50ZXJmYWNlOjpkZWZpbmVDbGFzcyhJRm9vSW50ZXJmYWNlOjpkZXNjcmlwdG9yLCBfYWlkbF9hbmRyb2lkX2FpZGxfdmVyc2lvbmVkX3Rlc3RzX0lGb29JbnRlcmZhY2Vfb25UcmFuc2FjdCk7CisKK0JwRm9vSW50ZXJmYWNlOjpCcEZvb0ludGVyZmFjZShjb25zdCA6Om5kazo6U3BBSUJpbmRlciYgYmluZGVyKSA6IEJwQ0ludGVyZmFjZShiaW5kZXIpIHt9CitCcEZvb0ludGVyZmFjZTo6fkJwRm9vSW50ZXJmYWNlKCkge30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgQnBGb29JbnRlcmZhY2U6Om9yaWdpbmFsQXBpKCkgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19PSzsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOworICA6Om5kazo6U2NvcGVkQVBhcmNlbCBfYWlkbF9pbjsKKyAgOjpuZGs6OlNjb3BlZEFQYXJjZWwgX2FpZGxfb3V0OworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl9wcmVwYXJlVHJhbnNhY3Rpb24oYXNCaW5kZXIoKS5nZXQoKSwgX2FpZGxfaW4uZ2V0UigpKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl90cmFuc2FjdCgKKyAgICBhc0JpbmRlcigpLmdldCgpLAorICAgIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMCAvKm9yaWdpbmFsQXBpKi8pLAorICAgIF9haWRsX2luLmdldFIoKSwKKyAgICBfYWlkbF9vdXQuZ2V0UigpLAorICAgIDAKKyAgICAjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgICAgfCBGTEFHX1BSSVZBVEVfTE9DQUwKKyAgICAjZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICAgICk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzID09IFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OICYmIElGb29JbnRlcmZhY2U6OmdldERlZmF1bHRJbXBsKCkpIHsKKyAgICBfYWlkbF9zdGF0dXMgPSBJRm9vSW50ZXJmYWNlOjpnZXREZWZhdWx0SW1wbCgpLT5vcmlnaW5hbEFwaSgpOworICAgIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKKyAgfQorICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZFN0YXR1c0hlYWRlcihfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3N0YXR1cy5nZXRSKCkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOworICBfYWlkbF9lcnJvcjoKKyAgX2FpZGxfc3RhdHVzLnNldChBU3RhdHVzX2Zyb21TdGF0dXMoX2FpZGxfcmV0X3N0YXR1cykpOworICBfYWlkbF9zdGF0dXNfcmV0dXJuOgorICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorOjpuZGs6OlNjb3BlZEFTdGF0dXMgQnBGb29JbnRlcmZhY2U6OmFjY2VwdFVuaW9uQW5kUmV0dXJuU3RyaW5nKGNvbnN0IDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dmVyc2lvbmVkOjp0ZXN0czo6QmF6VW5pb24mIGluX3UsIHN0ZDo6c3RyaW5nKiBfYWlkbF9yZXR1cm4pIHsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBTVEFUVVNfT0s7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1czsKKyAgOjpuZGs6OlNjb3BlZEFQYXJjZWwgX2FpZGxfaW47CisgIDo6bmRrOjpTY29wZWRBUGFyY2VsIF9haWRsX291dDsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gQUlCaW5kZXJfcHJlcGFyZVRyYW5zYWN0aW9uKGFzQmluZGVyKCkuZ2V0KCksIF9haWRsX2luLmdldFIoKSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX2luLmdldCgpLCBpbl91KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl90cmFuc2FjdCgKKyAgICBhc0JpbmRlcigpLmdldCgpLAorICAgIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMSAvKmFjY2VwdFVuaW9uQW5kUmV0dXJuU3RyaW5nKi8pLAorICAgIF9haWRsX2luLmdldFIoKSwKKyAgICBfYWlkbF9vdXQuZ2V0UigpLAorICAgIDAKKyAgICAjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgICAgfCBGTEFHX1BSSVZBVEVfTE9DQUwKKyAgICAjZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICAgICk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzID09IFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OICYmIElGb29JbnRlcmZhY2U6OmdldERlZmF1bHRJbXBsKCkpIHsKKyAgICBfYWlkbF9zdGF0dXMgPSBJRm9vSW50ZXJmYWNlOjpnZXREZWZhdWx0SW1wbCgpLT5hY2NlcHRVbmlvbkFuZFJldHVyblN0cmluZyhpbl91LCBfYWlkbF9yZXR1cm4pOworICAgIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKKyAgfQorICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZFN0YXR1c0hlYWRlcihfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3N0YXR1cy5nZXRSKCkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfZXJyb3I6CisgIF9haWRsX3N0YXR1cy5zZXQoQVN0YXR1c19mcm9tU3RhdHVzKF9haWRsX3JldF9zdGF0dXMpKTsKKyAgX2FpZGxfc3RhdHVzX3JldHVybjoKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKzo6bmRrOjpTY29wZWRBU3RhdHVzIEJwRm9vSW50ZXJmYWNlOjppZ25vcmVQYXJjZWxhYmxlc0FuZFJlcGVhdEludChjb25zdCA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnZlcnNpb25lZDo6dGVzdHM6OkZvbyYgaW5faW5Gb28sIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dmVyc2lvbmVkOjp0ZXN0czo6Rm9vKiBpbl9pbm91dEZvbywgOjphaWRsOjphbmRyb2lkOjphaWRsOjp2ZXJzaW9uZWQ6OnRlc3RzOjpGb28qIG91dF9vdXRGb28sIGludDMyX3QgaW5fdmFsdWUsIGludDMyX3QqIF9haWRsX3JldHVybikgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19PSzsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOworICA6Om5kazo6U2NvcGVkQVBhcmNlbCBfYWlkbF9pbjsKKyAgOjpuZGs6OlNjb3BlZEFQYXJjZWwgX2FpZGxfb3V0OworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl9wcmVwYXJlVHJhbnNhY3Rpb24oYXNCaW5kZXIoKS5nZXQoKSwgX2FpZGxfaW4uZ2V0UigpKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX2luRm9vKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfaW4uZ2V0KCksICppbl9pbm91dEZvbyk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX2luLmdldCgpLCBpbl92YWx1ZSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gQUlCaW5kZXJfdHJhbnNhY3QoCisgICAgYXNCaW5kZXIoKS5nZXQoKSwKKyAgICAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDIgLyppZ25vcmVQYXJjZWxhYmxlc0FuZFJlcGVhdEludCovKSwKKyAgICBfYWlkbF9pbi5nZXRSKCksCisgICAgX2FpZGxfb3V0LmdldFIoKSwKKyAgICAwCisgICAgI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICAgIHwgRkxBR19QUklWQVRFX0xPQ0FMCisgICAgI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgICApOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyA9PSBTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTiAmJiBJRm9vSW50ZXJmYWNlOjpnZXREZWZhdWx0SW1wbCgpKSB7CisgICAgX2FpZGxfc3RhdHVzID0gSUZvb0ludGVyZmFjZTo6Z2V0RGVmYXVsdEltcGwoKS0+aWdub3JlUGFyY2VsYWJsZXNBbmRSZXBlYXRJbnQoaW5faW5Gb28sIGluX2lub3V0Rm9vLCBvdXRfb3V0Rm9vLCBpbl92YWx1ZSwgX2FpZGxfcmV0dXJuKTsKKyAgICBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47CisgIH0KKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRTdGF0dXNIZWFkZXIoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9zdGF0dXMuZ2V0UigpKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIGluX2lub3V0Rm9vKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIG91dF9vdXRGb28pOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfZXJyb3I6CisgIF9haWRsX3N0YXR1cy5zZXQoQVN0YXR1c19mcm9tU3RhdHVzKF9haWRsX3JldF9zdGF0dXMpKTsKKyAgX2FpZGxfc3RhdHVzX3JldHVybjoKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKzo6bmRrOjpTY29wZWRBU3RhdHVzIEJwRm9vSW50ZXJmYWNlOjpyZXR1cm5zTGVuZ3RoT2ZGb29BcnJheShjb25zdCBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnZlcnNpb25lZDo6dGVzdHM6OkZvbz4mIGluX2Zvb3MsIGludDMyX3QqIF9haWRsX3JldHVybikgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19PSzsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOworICA6Om5kazo6U2NvcGVkQVBhcmNlbCBfYWlkbF9pbjsKKyAgOjpuZGs6OlNjb3BlZEFQYXJjZWwgX2FpZGxfb3V0OworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl9wcmVwYXJlVHJhbnNhY3Rpb24oYXNCaW5kZXIoKS5nZXQoKSwgX2FpZGxfaW4uZ2V0UigpKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX2Zvb3MpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KAorICAgIGFzQmluZGVyKCkuZ2V0KCksCisgICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzIC8qcmV0dXJuc0xlbmd0aE9mRm9vQXJyYXkqLyksCisgICAgX2FpZGxfaW4uZ2V0UigpLAorICAgIF9haWRsX291dC5nZXRSKCksCisgICAgMAorICAgICNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgICB8IEZMQUdfUFJJVkFURV9MT0NBTAorICAgICNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgICAgKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgPT0gU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT04gJiYgSUZvb0ludGVyZmFjZTo6Z2V0RGVmYXVsdEltcGwoKSkgeworICAgIF9haWRsX3N0YXR1cyA9IElGb29JbnRlcmZhY2U6OmdldERlZmF1bHRJbXBsKCktPnJldHVybnNMZW5ndGhPZkZvb0FycmF5KGluX2Zvb3MsIF9haWRsX3JldHVybik7CisgICAgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOworICB9CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkU3RhdHVzSGVhZGVyKF9haWRsX291dC5nZXQoKSwgX2FpZGxfc3RhdHVzLmdldFIoKSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9lcnJvcjoKKyAgX2FpZGxfc3RhdHVzLnNldChBU3RhdHVzX2Zyb21TdGF0dXMoX2FpZGxfcmV0X3N0YXR1cykpOworICBfYWlkbF9zdGF0dXNfcmV0dXJuOgorICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorOjpuZGs6OlNjb3BlZEFTdGF0dXMgQnBGb29JbnRlcmZhY2U6OmdldEludGVyZmFjZVZlcnNpb24oaW50MzJfdCogX2FpZGxfcmV0dXJuKSB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX09LOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIGlmIChfYWlkbF9jYWNoZWRfdmVyc2lvbiAhPSAtMSkgeworICAgICpfYWlkbF9yZXR1cm4gPSBfYWlkbF9jYWNoZWRfdmVyc2lvbjsKKyAgICBfYWlkbF9zdGF0dXMuc2V0KEFTdGF0dXNfZnJvbVN0YXR1cyhfYWlkbF9yZXRfc3RhdHVzKSk7CisgICAgcmV0dXJuIF9haWRsX3N0YXR1czsKKyAgfQorICA6Om5kazo6U2NvcGVkQVBhcmNlbCBfYWlkbF9pbjsKKyAgOjpuZGs6OlNjb3BlZEFQYXJjZWwgX2FpZGxfb3V0OworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl9wcmVwYXJlVHJhbnNhY3Rpb24oYXNCaW5kZXIoKS5nZXQoKSwgX2FpZGxfaW4uZ2V0UigpKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl90cmFuc2FjdCgKKyAgICBhc0JpbmRlcigpLmdldCgpLAorICAgIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMTY3NzcyMTQgLypnZXRJbnRlcmZhY2VWZXJzaW9uKi8pLAorICAgIF9haWRsX2luLmdldFIoKSwKKyAgICBfYWlkbF9vdXQuZ2V0UigpLAorICAgIDAKKyAgICAjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgICAgfCBGTEFHX1BSSVZBVEVfTE9DQUwKKyAgICAjZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICAgICk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzID09IFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OICYmIElGb29JbnRlcmZhY2U6OmdldERlZmF1bHRJbXBsKCkpIHsKKyAgICBfYWlkbF9zdGF0dXMgPSBJRm9vSW50ZXJmYWNlOjpnZXREZWZhdWx0SW1wbCgpLT5nZXRJbnRlcmZhY2VWZXJzaW9uKF9haWRsX3JldHVybik7CisgICAgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOworICB9CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkU3RhdHVzSGVhZGVyKF9haWRsX291dC5nZXQoKSwgX2FpZGxfc3RhdHVzLmdldFIoKSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9jYWNoZWRfdmVyc2lvbiA9ICpfYWlkbF9yZXR1cm47CisgIF9haWRsX2Vycm9yOgorICBfYWlkbF9zdGF0dXMuc2V0KEFTdGF0dXNfZnJvbVN0YXR1cyhfYWlkbF9yZXRfc3RhdHVzKSk7CisgIF9haWRsX3N0YXR1c19yZXR1cm46CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBCcEZvb0ludGVyZmFjZTo6Z2V0SW50ZXJmYWNlSGFzaChzdGQ6OnN0cmluZyogX2FpZGxfcmV0dXJuKSB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX09LOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIGNvbnN0IHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKF9haWRsX2NhY2hlZF9oYXNoX211dGV4KTsKKyAgaWYgKF9haWRsX2NhY2hlZF9oYXNoICE9ICItMSIpIHsKKyAgICAqX2FpZGxfcmV0dXJuID0gX2FpZGxfY2FjaGVkX2hhc2g7CisgICAgX2FpZGxfc3RhdHVzLnNldChBU3RhdHVzX2Zyb21TdGF0dXMoX2FpZGxfcmV0X3N0YXR1cykpOworICAgIHJldHVybiBfYWlkbF9zdGF0dXM7CisgIH0KKyAgOjpuZGs6OlNjb3BlZEFQYXJjZWwgX2FpZGxfaW47CisgIDo6bmRrOjpTY29wZWRBUGFyY2VsIF9haWRsX291dDsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gQUlCaW5kZXJfcHJlcGFyZVRyYW5zYWN0aW9uKGFzQmluZGVyKCkuZ2V0KCksIF9haWRsX2luLmdldFIoKSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gQUlCaW5kZXJfdHJhbnNhY3QoCisgICAgYXNCaW5kZXIoKS5nZXQoKSwKKyAgICAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDE2Nzc3MjEzIC8qZ2V0SW50ZXJmYWNlSGFzaCovKSwKKyAgICBfYWlkbF9pbi5nZXRSKCksCisgICAgX2FpZGxfb3V0LmdldFIoKSwKKyAgICAwCisgICAgI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICAgIHwgRkxBR19QUklWQVRFX0xPQ0FMCisgICAgI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgICApOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyA9PSBTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTiAmJiBJRm9vSW50ZXJmYWNlOjpnZXREZWZhdWx0SW1wbCgpKSB7CisgICAgX2FpZGxfc3RhdHVzID0gSUZvb0ludGVyZmFjZTo6Z2V0RGVmYXVsdEltcGwoKS0+Z2V0SW50ZXJmYWNlSGFzaChfYWlkbF9yZXR1cm4pOworICAgIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKKyAgfQorICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZFN0YXR1c0hlYWRlcihfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3N0YXR1cy5nZXRSKCkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfY2FjaGVkX2hhc2ggPSAqX2FpZGxfcmV0dXJuOworICBfYWlkbF9lcnJvcjoKKyAgX2FpZGxfc3RhdHVzLnNldChBU3RhdHVzX2Zyb21TdGF0dXMoX2FpZGxfcmV0X3N0YXR1cykpOworICBfYWlkbF9zdGF0dXNfcmV0dXJuOgorICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorLy8gU291cmNlIGZvciBCbkZvb0ludGVyZmFjZQorQm5Gb29JbnRlcmZhY2U6OkJuRm9vSW50ZXJmYWNlKCkge30KK0JuRm9vSW50ZXJmYWNlOjp+Qm5Gb29JbnRlcmZhY2UoKSB7fQorOjpuZGs6OlNwQUlCaW5kZXIgQm5Gb29JbnRlcmZhY2U6OmNyZWF0ZUJpbmRlcigpIHsKKyAgQUlCaW5kZXIqIGJpbmRlciA9IEFJQmluZGVyX25ldyhfZ19haWRsX2FuZHJvaWRfYWlkbF92ZXJzaW9uZWRfdGVzdHNfSUZvb0ludGVyZmFjZV9jbGF6eiwgc3RhdGljX2Nhc3Q8dm9pZCo+KHRoaXMpKTsKKyAgI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICBBSUJpbmRlcl9tYXJrQ29tcGlsYXRpb25Vbml0U3RhYmlsaXR5KGJpbmRlcik7CisgICNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgIHJldHVybiA6Om5kazo6U3BBSUJpbmRlcihiaW5kZXIpOworfQorOjpuZGs6OlNjb3BlZEFTdGF0dXMgQm5Gb29JbnRlcmZhY2U6OmdldEludGVyZmFjZVZlcnNpb24oaW50MzJfdCogX2FpZGxfcmV0dXJuKSB7CisgICpfYWlkbF9yZXR1cm4gPSBJRm9vSW50ZXJmYWNlOjp2ZXJzaW9uOworICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXMoQVN0YXR1c19uZXdPaygpKTsKK30KKzo6bmRrOjpTY29wZWRBU3RhdHVzIEJuRm9vSW50ZXJmYWNlOjpnZXRJbnRlcmZhY2VIYXNoKHN0ZDo6c3RyaW5nKiBfYWlkbF9yZXR1cm4pIHsKKyAgKl9haWRsX3JldHVybiA9IElGb29JbnRlcmZhY2U6Omhhc2g7CisgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1cyhBU3RhdHVzX25ld09rKCkpOworfQorLy8gU291cmNlIGZvciBJRm9vSW50ZXJmYWNlCitjb25zdCBjaGFyKiBJRm9vSW50ZXJmYWNlOjpkZXNjcmlwdG9yID0gImFuZHJvaWQuYWlkbC52ZXJzaW9uZWQudGVzdHMuSUZvb0ludGVyZmFjZSI7CitJRm9vSW50ZXJmYWNlOjpJRm9vSW50ZXJmYWNlKCkge30KK0lGb29JbnRlcmZhY2U6On5JRm9vSW50ZXJmYWNlKCkge30KKworCitzdGQ6OnNoYXJlZF9wdHI8SUZvb0ludGVyZmFjZT4gSUZvb0ludGVyZmFjZTo6ZnJvbUJpbmRlcihjb25zdCA6Om5kazo6U3BBSUJpbmRlciYgYmluZGVyKSB7CisgIGlmICghQUlCaW5kZXJfYXNzb2NpYXRlQ2xhc3MoYmluZGVyLmdldCgpLCBfZ19haWRsX2FuZHJvaWRfYWlkbF92ZXJzaW9uZWRfdGVzdHNfSUZvb0ludGVyZmFjZV9jbGF6eikpIHsgcmV0dXJuIG51bGxwdHI7IH0KKyAgc3RkOjpzaGFyZWRfcHRyPDo6bmRrOjpJQ0ludGVyZmFjZT4gaW50ZXJmYWNlID0gOjpuZGs6OklDSW50ZXJmYWNlOjphc0ludGVyZmFjZShiaW5kZXIuZ2V0KCkpOworICBpZiAoaW50ZXJmYWNlKSB7CisgICAgcmV0dXJuIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxJRm9vSW50ZXJmYWNlPihpbnRlcmZhY2UpOworICB9CisgIHJldHVybiA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxCcEZvb0ludGVyZmFjZT4oYmluZGVyKTsKK30KKworYmluZGVyX3N0YXR1c190IElGb29JbnRlcmZhY2U6OndyaXRlVG9QYXJjZWwoQVBhcmNlbCogcGFyY2VsLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SUZvb0ludGVyZmFjZT4mIGluc3RhbmNlKSB7CisgIHJldHVybiBBUGFyY2VsX3dyaXRlU3Ryb25nQmluZGVyKHBhcmNlbCwgaW5zdGFuY2UgPyBpbnN0YW5jZS0+YXNCaW5kZXIoKS5nZXQoKSA6IG51bGxwdHIpOworfQorYmluZGVyX3N0YXR1c190IElGb29JbnRlcmZhY2U6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIHBhcmNlbCwgc3RkOjpzaGFyZWRfcHRyPElGb29JbnRlcmZhY2U+KiBpbnN0YW5jZSkgeworICA6Om5kazo6U3BBSUJpbmRlciBiaW5kZXI7CisgIGJpbmRlcl9zdGF0dXNfdCBzdGF0dXMgPSBBUGFyY2VsX3JlYWRTdHJvbmdCaW5kZXIocGFyY2VsLCBiaW5kZXIuZ2V0UigpKTsKKyAgaWYgKHN0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBzdGF0dXM7CisgICppbnN0YW5jZSA9IElGb29JbnRlcmZhY2U6OmZyb21CaW5kZXIoYmluZGVyKTsKKyAgcmV0dXJuIFNUQVRVU19PSzsKK30KK2Jvb2wgSUZvb0ludGVyZmFjZTo6c2V0RGVmYXVsdEltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElGb29JbnRlcmZhY2U+JiBpbXBsKSB7CisgIC8vIE9ubHkgb25lIHVzZXIgb2YgdGhpcyBpbnRlcmZhY2UgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uCisgIC8vIGF0IGEgdGltZS4gVGhpcyBpcyBhIGhldXJpc3RpYyB0byBkZXRlY3QgaWYgdHdvIGRpZmZlcmVudAorICAvLyB1c2VycyBpbiB0aGUgc2FtZSBwcm9jZXNzIHVzZSB0aGlzIGZ1bmN0aW9uLgorICBhc3NlcnQoIUlGb29JbnRlcmZhY2U6OmRlZmF1bHRfaW1wbCk7CisgIGlmIChpbXBsKSB7CisgICAgSUZvb0ludGVyZmFjZTo6ZGVmYXVsdF9pbXBsID0gaW1wbDsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9Citjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SUZvb0ludGVyZmFjZT4mIElGb29JbnRlcmZhY2U6OmdldERlZmF1bHRJbXBsKCkgeworICByZXR1cm4gSUZvb0ludGVyZmFjZTo6ZGVmYXVsdF9pbXBsOworfQorc3RkOjpzaGFyZWRfcHRyPElGb29JbnRlcmZhY2U+IElGb29JbnRlcmZhY2U6OmRlZmF1bHRfaW1wbCA9IG51bGxwdHI7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBJRm9vSW50ZXJmYWNlRGVmYXVsdDo6b3JpZ2luYWxBcGkoKSB7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1czsKKyAgX2FpZGxfc3RhdHVzLnNldChBU3RhdHVzX2Zyb21TdGF0dXMoU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT04pKTsKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKzo6bmRrOjpTY29wZWRBU3RhdHVzIElGb29JbnRlcmZhY2VEZWZhdWx0OjphY2NlcHRVbmlvbkFuZFJldHVyblN0cmluZyhjb25zdCA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnZlcnNpb25lZDo6dGVzdHM6OkJhelVuaW9uJiAvKmluX3UqLywgc3RkOjpzdHJpbmcqIC8qX2FpZGxfcmV0dXJuKi8pIHsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOworICBfYWlkbF9zdGF0dXMuc2V0KEFTdGF0dXNfZnJvbVN0YXR1cyhTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTikpOworICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorOjpuZGs6OlNjb3BlZEFTdGF0dXMgSUZvb0ludGVyZmFjZURlZmF1bHQ6Omlnbm9yZVBhcmNlbGFibGVzQW5kUmVwZWF0SW50KGNvbnN0IDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dmVyc2lvbmVkOjp0ZXN0czo6Rm9vJiAvKmluX2luRm9vKi8sIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dmVyc2lvbmVkOjp0ZXN0czo6Rm9vKiAvKmluX2lub3V0Rm9vKi8sIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dmVyc2lvbmVkOjp0ZXN0czo6Rm9vKiAvKm91dF9vdXRGb28qLywgaW50MzJfdCAvKmluX3ZhbHVlKi8sIGludDMyX3QqIC8qX2FpZGxfcmV0dXJuKi8pIHsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOworICBfYWlkbF9zdGF0dXMuc2V0KEFTdGF0dXNfZnJvbVN0YXR1cyhTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTikpOworICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorOjpuZGs6OlNjb3BlZEFTdGF0dXMgSUZvb0ludGVyZmFjZURlZmF1bHQ6OnJldHVybnNMZW5ndGhPZkZvb0FycmF5KGNvbnN0IHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dmVyc2lvbmVkOjp0ZXN0czo6Rm9vPiYgLyppbl9mb29zKi8sIGludDMyX3QqIC8qX2FpZGxfcmV0dXJuKi8pIHsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOworICBfYWlkbF9zdGF0dXMuc2V0KEFTdGF0dXNfZnJvbVN0YXR1cyhTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTikpOworICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorOjpuZGs6OlNjb3BlZEFTdGF0dXMgSUZvb0ludGVyZmFjZURlZmF1bHQ6OmdldEludGVyZmFjZVZlcnNpb24oaW50MzJfdCogX2FpZGxfcmV0dXJuKSB7CisgICpfYWlkbF9yZXR1cm4gPSAwOworICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXMoQVN0YXR1c19uZXdPaygpKTsKK30KKzo6bmRrOjpTY29wZWRBU3RhdHVzIElGb29JbnRlcmZhY2VEZWZhdWx0OjpnZXRJbnRlcmZhY2VIYXNoKHN0ZDo6c3RyaW5nKiBfYWlkbF9yZXR1cm4pIHsKKyAgKl9haWRsX3JldHVybiA9ICIiOworICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXMoQVN0YXR1c19uZXdPaygpKTsKK30KKzo6bmRrOjpTcEFJQmluZGVyIElGb29JbnRlcmZhY2VEZWZhdWx0Ojphc0JpbmRlcigpIHsKKyAgcmV0dXJuIDo6bmRrOjpTcEFJQmluZGVyKCk7Cit9Citib29sIElGb29JbnRlcmZhY2VEZWZhdWx0Ojppc1JlbW90ZSgpIHsKKyAgcmV0dXJuIGZhbHNlOworfQorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgdmVyc2lvbmVkCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYxLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvSUZvb0ludGVyZmFjZS5jcHAuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9JRm9vSW50ZXJmYWNlLmNwcC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MmI0N2IKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYxLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvSUZvb0ludGVyZmFjZS5jcHAuZApAQCAtMCwwICsxLDQgQEAKK291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS1WMS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0lGb29JbnRlcmZhY2UuY3BwIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC9haWRsX2FwaS9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS8xL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvSUZvb0ludGVyZmFjZS5haWRsIFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbF9hcGkvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UvMS9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0JhelVuaW9uLmFpZGwgXAorICBzeXN0ZW0vdG9vbHMvYWlkbC9haWRsX2FwaS9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS8xL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvRm9vLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvQmF6VW5pb24uaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvQmF6VW5pb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjE4YTBiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS1WMS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9CYXpVbmlvbi5oCkBAIC0wLDAgKzEsMTU1IEBACisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGFycmF5PgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8b3B0aW9uYWw+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmFyaWFudD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfZW51bXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pbnRlcmZhY2VfdXRpbHMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wYXJjZWxhYmxlX3V0aWxzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfdG9fc3RyaW5nLmg+CisjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfc3RhYmlsaXR5Lmg+CisjZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorCisjaWZuZGVmIF9fQklPTklDX18KKyNkZWZpbmUgX19hc3NlcnQyKGEsYixjLGQpICgodm9pZCkwKQorI2VuZGlmCisKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB2ZXJzaW9uZWQgeworbmFtZXNwYWNlIHRlc3RzIHsKK2NsYXNzIEJhelVuaW9uIHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBzdGQ6OmZhbHNlX3R5cGUgZml4ZWRfc2l6ZTsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIGRlc2NyaXB0b3I7CisKKyAgZW51bSBjbGFzcyBUYWcgOiBpbnQzMl90IHsKKyAgICBpbnROdW0gPSAwLAorICB9OworCisgIC8vIEV4cG9zZSB0YWcgc3ltYm9scyBmb3IgbGVnYWN5IGNvZGUKKyAgc3RhdGljIGNvbnN0IGlubGluZSBUYWcgaW50TnVtID0gVGFnOjppbnROdW07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICBzdGF0aWMgY29uc3RleHByIGJvb2wgX25vdF9zZWxmID0gIXN0ZDo6aXNfc2FtZV92PHN0ZDo6cmVtb3ZlX2N2X3Q8c3RkOjpyZW1vdmVfcmVmZXJlbmNlX3Q8X1RwPj4sIEJhelVuaW9uPjsKKworICBCYXpVbmlvbigpIDogX3ZhbHVlKHN0ZDo6aW5fcGxhY2VfaW5kZXg8c3RhdGljX2Nhc3Q8c2l6ZV90PihpbnROdW0pPiwgaW50MzJfdCgwKSkgeyB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgPSBzdGQ6OmVuYWJsZV9pZl90PF9ub3Rfc2VsZjxfVHA+Pj4KKyAgLy8gTk9MSU5UTkVYVExJTkUoZ29vZ2xlLWV4cGxpY2l0LWNvbnN0cnVjdG9yKQorICBjb25zdGV4cHIgQmF6VW5pb24oX1RwJiYgX2FyZykKKyAgICAgIDogX3ZhbHVlKHN0ZDo6Zm9yd2FyZDxfVHA+KF9hcmcpKSB7fQorCisgIHRlbXBsYXRlIDxzaXplX3QgX05wLCB0eXBlbmFtZS4uLiBfVHA+CisgIGNvbnN0ZXhwciBleHBsaWNpdCBCYXpVbmlvbihzdGQ6OmluX3BsYWNlX2luZGV4X3Q8X05wPiwgX1RwJiYuLi4gX2FyZ3MpCisgICAgICA6IF92YWx1ZShzdGQ6OmluX3BsYWNlX2luZGV4PF9OcD4sIHN0ZDo6Zm9yd2FyZDxfVHA+KF9hcmdzKS4uLikge30KKworICB0ZW1wbGF0ZSA8VGFnIF90YWcsIHR5cGVuYW1lLi4uIF9UcD4KKyAgc3RhdGljIEJhelVuaW9uIG1ha2UoX1RwJiYuLi4gX2FyZ3MpIHsKKyAgICByZXR1cm4gQmF6VW5pb24oc3RkOjppbl9wbGFjZV9pbmRleDxzdGF0aWNfY2FzdDxzaXplX3Q+KF90YWcpPiwgc3RkOjpmb3J3YXJkPF9UcD4oX2FyZ3MpLi4uKTsKKyAgfQorCisgIHRlbXBsYXRlIDxUYWcgX3RhZywgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZS4uLiBfVXA+CisgIHN0YXRpYyBCYXpVbmlvbiBtYWtlKHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxfVHA+IF9pbCwgX1VwJiYuLi4gX2FyZ3MpIHsKKyAgICByZXR1cm4gQmF6VW5pb24oc3RkOjppbl9wbGFjZV9pbmRleDxzdGF0aWNfY2FzdDxzaXplX3Q+KF90YWcpPiwgc3RkOjptb3ZlKF9pbCksIHN0ZDo6Zm9yd2FyZDxfVXA+KF9hcmdzKS4uLik7CisgIH0KKworICBUYWcgZ2V0VGFnKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxUYWc+KF92YWx1ZS5pbmRleCgpKTsKKyAgfQorCisgIHRlbXBsYXRlIDxUYWcgX3RhZz4KKyAgY29uc3QgYXV0byYgZ2V0KCkgY29uc3QgeworICAgIGlmIChnZXRUYWcoKSAhPSBfdGFnKSB7IF9fYXNzZXJ0MihfX0ZJTEVfXywgX19MSU5FX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18sICJiYWQgYWNjZXNzOiBhIHdyb25nIHRhZyIpOyB9CisgICAgcmV0dXJuIHN0ZDo6Z2V0PHN0YXRpY19jYXN0PHNpemVfdD4oX3RhZyk+KF92YWx1ZSk7CisgIH0KKworICB0ZW1wbGF0ZSA8VGFnIF90YWc+CisgIGF1dG8mIGdldCgpIHsKKyAgICBpZiAoZ2V0VGFnKCkgIT0gX3RhZykgeyBfX2Fzc2VydDIoX19GSUxFX18sIF9fTElORV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fLCAiYmFkIGFjY2VzczogYSB3cm9uZyB0YWciKTsgfQorICAgIHJldHVybiBzdGQ6OmdldDxzdGF0aWNfY2FzdDxzaXplX3Q+KF90YWcpPihfdmFsdWUpOworICB9CisKKyAgdGVtcGxhdGUgPFRhZyBfdGFnLCB0eXBlbmFtZS4uLiBfVHA+CisgIHZvaWQgc2V0KF9UcCYmLi4uIF9hcmdzKSB7CisgICAgX3ZhbHVlLmVtcGxhY2U8c3RhdGljX2Nhc3Q8c2l6ZV90PihfdGFnKT4oc3RkOjpmb3J3YXJkPF9UcD4oX2FyZ3MpLi4uKTsKKyAgfQorCisgIGJpbmRlcl9zdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBfcGFyY2VsKTsKKyAgYmluZGVyX3N0YXR1c190IHdyaXRlVG9QYXJjZWwoQVBhcmNlbCogX3BhcmNlbCkgY29uc3Q7CisKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBCYXpVbmlvbiYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIF92YWx1ZSAhPSByaHMuX3ZhbHVlOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBCYXpVbmlvbiYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIF92YWx1ZSA8IHJocy5fdmFsdWU7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBCYXpVbmlvbiYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIF92YWx1ZSA8PSByaHMuX3ZhbHVlOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgQmF6VW5pb24mIHJocykgY29uc3QgeworICAgIHJldHVybiBfdmFsdWUgPT0gcmhzLl92YWx1ZTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgQmF6VW5pb24mIHJocykgY29uc3QgeworICAgIHJldHVybiBfdmFsdWUgPiByaHMuX3ZhbHVlOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgQmF6VW5pb24mIHJocykgY29uc3QgeworICAgIHJldHVybiBfdmFsdWUgPj0gcmhzLl92YWx1ZTsKKyAgfQorCisgIHN0YXRpYyBjb25zdCA6Om5kazo6cGFyY2VsYWJsZV9zdGFiaWxpdHlfdCBfYWlkbF9zdGFiaWxpdHkgPSA6Om5kazo6U1RBQklMSVRZX0xPQ0FMOworICBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOworICAgIG9zIDw8ICJCYXpVbmlvbnsiOworICAgIHN3aXRjaCAoZ2V0VGFnKCkpIHsKKyAgICBjYXNlIGludE51bTogb3MgPDwgImludE51bTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhnZXQ8aW50TnVtPigpKTsgYnJlYWs7CisgICAgfQorICAgIG9zIDw8ICJ9IjsKKyAgICByZXR1cm4gb3Muc3RyKCk7CisgIH0KK3ByaXZhdGU6CisgIHN0ZDo6dmFyaWFudDxpbnQzMl90PiBfdmFsdWU7Cit9OworfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgdmVyc2lvbmVkCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdmVyc2lvbmVkIHsKK25hbWVzcGFjZSB0ZXN0cyB7CitbW25vZGlzY2FyZF1dIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoQmF6VW5pb246OlRhZyB2YWwpIHsKKyAgc3dpdGNoKHZhbCkgeworICBjYXNlIEJhelVuaW9uOjpUYWc6OmludE51bToKKyAgICByZXR1cm4gImludE51bSI7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIHN0ZDo6dG9fc3RyaW5nKHN0YXRpY19jYXN0PGludDMyX3Q+KHZhbCkpOworICB9Cit9Cit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSB2ZXJzaW9uZWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKK25hbWVzcGFjZSBuZGsgeworbmFtZXNwYWNlIGludGVybmFsIHsKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdjKysxNy1leHRlbnNpb25zIgordGVtcGxhdGUgPD4KK2NvbnN0ZXhwciBpbmxpbmUgc3RkOjphcnJheTxhaWRsOjphbmRyb2lkOjphaWRsOjp2ZXJzaW9uZWQ6OnRlc3RzOjpCYXpVbmlvbjo6VGFnLCAxPiBlbnVtX3ZhbHVlczxhaWRsOjphbmRyb2lkOjphaWRsOjp2ZXJzaW9uZWQ6OnRlc3RzOjpCYXpVbmlvbjo6VGFnPiA9IHsKKyAgYWlkbDo6YW5kcm9pZDo6YWlkbDo6dmVyc2lvbmVkOjp0ZXN0czo6QmF6VW5pb246OlRhZzo6aW50TnVtLAorfTsKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIG5kawpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5Vbmlvbi5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS1WMS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9CbkJhelVuaW9uLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CblVuaW9uLmgKY29weSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYxLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0JuQmF6VW5pb24uaApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5Vbmlvbi5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS1WMS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9CbkZvby5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5Vbmlvbi5oCmNvcHkgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS1WMS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9CbkZvby5oCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYxLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0JuRm9vSW50ZXJmYWNlLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYxLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0JuRm9vSW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RiMjZkNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvQm5Gb29JbnRlcmZhY2UuaApAQCAtMCwwICsxLDYyIEBACisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFpZGwvYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9JRm9vSW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pYmluZGVyLmg+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKworI2lmbmRlZiBfX0JJT05JQ19fCisjaWZuZGVmIF9fYXNzZXJ0MgorI2RlZmluZSBfX2Fzc2VydDIoYSxiLGMsZCkgKCh2b2lkKTApCisjZW5kaWYKKyNlbmRpZgorCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdmVyc2lvbmVkIHsKK25hbWVzcGFjZSB0ZXN0cyB7CitjbGFzcyBCbkZvb0ludGVyZmFjZSA6IHB1YmxpYyA6Om5kazo6Qm5DSW50ZXJmYWNlPElGb29JbnRlcmZhY2U+IHsKK3B1YmxpYzoKKyAgQm5Gb29JbnRlcmZhY2UoKTsKKyAgdmlydHVhbCB+Qm5Gb29JbnRlcmZhY2UoKTsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0SW50ZXJmYWNlVmVyc2lvbihpbnQzMl90KiBfYWlkbF9yZXR1cm4pIGZpbmFsOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXRJbnRlcmZhY2VIYXNoKHN0ZDo6c3RyaW5nKiBfYWlkbF9yZXR1cm4pIGZpbmFsOworcHJvdGVjdGVkOgorICA6Om5kazo6U3BBSUJpbmRlciBjcmVhdGVCaW5kZXIoKSBvdmVycmlkZTsKK3ByaXZhdGU6Cit9OworY2xhc3MgSUZvb0ludGVyZmFjZURlbGVnYXRvciA6IHB1YmxpYyBCbkZvb0ludGVyZmFjZSB7CitwdWJsaWM6CisgIGV4cGxpY2l0IElGb29JbnRlcmZhY2VEZWxlZ2F0b3IoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElGb29JbnRlcmZhY2U+ICZpbXBsKSA6IF9pbXBsKGltcGwpIHsKKyAgICAgaW50MzJfdCBfaW1wbF92ZXIgPSAwOworICAgICBpZiAoIWltcGwtPmdldEludGVyZmFjZVZlcnNpb24oJl9pbXBsX3ZlcikuaXNPaygpKSB7OworICAgICAgICBfX2Fzc2VydDIoX19GSUxFX18sIF9fTElORV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fLCAiRGVsZWdhdG9yIGZhaWxlZCB0byBnZXQgdmVyc2lvbiBvZiB0aGUgaW1wbGVtZW50YXRpb24uIik7CisgICAgIH0KKyAgICAgaWYgKF9pbXBsX3ZlciAhPSBJRm9vSW50ZXJmYWNlOjp2ZXJzaW9uKSB7CisgICAgICAgIF9fYXNzZXJ0MihfX0ZJTEVfXywgX19MSU5FX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18sICJNaXNtYXRjaGVkIHZlcnNpb25zIG9mIGRlbGVnYXRvciBhbmQgaW1wbGVtZW50YXRpb24gaXMgbm90IGFsbG93ZWQuIik7CisgICAgIH0KKyAgfQorCisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIG9yaWdpbmFsQXBpKCkgb3ZlcnJpZGUgeworICAgIHJldHVybiBfaW1wbC0+b3JpZ2luYWxBcGkoKTsKKyAgfQorICA6Om5kazo6U2NvcGVkQVN0YXR1cyBhY2NlcHRVbmlvbkFuZFJldHVyblN0cmluZyhjb25zdCA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnZlcnNpb25lZDo6dGVzdHM6OkJhelVuaW9uJiBpbl91LCBzdGQ6OnN0cmluZyogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9pbXBsLT5hY2NlcHRVbmlvbkFuZFJldHVyblN0cmluZyhpbl91LCBfYWlkbF9yZXR1cm4pOworICB9CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGlnbm9yZVBhcmNlbGFibGVzQW5kUmVwZWF0SW50KGNvbnN0IDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dmVyc2lvbmVkOjp0ZXN0czo6Rm9vJiBpbl9pbkZvbywgOjphaWRsOjphbmRyb2lkOjphaWRsOjp2ZXJzaW9uZWQ6OnRlc3RzOjpGb28qIGluX2lub3V0Rm9vLCA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnZlcnNpb25lZDo6dGVzdHM6OkZvbyogb3V0X291dEZvbywgaW50MzJfdCBpbl92YWx1ZSwgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9pbXBsLT5pZ25vcmVQYXJjZWxhYmxlc0FuZFJlcGVhdEludChpbl9pbkZvbywgaW5faW5vdXRGb28sIG91dF9vdXRGb28sIGluX3ZhbHVlLCBfYWlkbF9yZXR1cm4pOworICB9CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHJldHVybnNMZW5ndGhPZkZvb0FycmF5KGNvbnN0IHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dmVyc2lvbmVkOjp0ZXN0czo6Rm9vPiYgaW5fZm9vcywgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9pbXBsLT5yZXR1cm5zTGVuZ3RoT2ZGb29BcnJheShpbl9mb29zLCBfYWlkbF9yZXR1cm4pOworICB9Citwcm90ZWN0ZWQ6Citwcml2YXRlOgorICBzdGQ6OnNoYXJlZF9wdHI8SUZvb0ludGVyZmFjZT4gX2ltcGw7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSB2ZXJzaW9uZWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwVW5pb24uaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvQnBCYXpVbmlvbi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBVbmlvbi5oCmNvcHkgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS1WMS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9CcEJhelVuaW9uLmgKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwVW5pb24uaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvQnBGb28uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwVW5pb24uaApjb3B5IHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvQnBGb28uaApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS1WMS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9CcEZvb0ludGVyZmFjZS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS1WMS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9CcEZvb0ludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNGEwNTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYxLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0JwRm9vSW50ZXJmYWNlLmgKQEAgLTAsMCArMSwzMSBAQAorI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhaWRsL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvSUZvb0ludGVyZmFjZS5oIgorCisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaWJpbmRlci5oPgorCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdmVyc2lvbmVkIHsKK25hbWVzcGFjZSB0ZXN0cyB7CitjbGFzcyBCcEZvb0ludGVyZmFjZSA6IHB1YmxpYyA6Om5kazo6QnBDSW50ZXJmYWNlPElGb29JbnRlcmZhY2U+IHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgQnBGb29JbnRlcmZhY2UoY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGJpbmRlcik7CisgIHZpcnR1YWwgfkJwRm9vSW50ZXJmYWNlKCk7CisKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgb3JpZ2luYWxBcGkoKSBvdmVycmlkZTsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgYWNjZXB0VW5pb25BbmRSZXR1cm5TdHJpbmcoY29uc3QgOjphaWRsOjphbmRyb2lkOjphaWRsOjp2ZXJzaW9uZWQ6OnRlc3RzOjpCYXpVbmlvbiYgaW5fdSwgc3RkOjpzdHJpbmcqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGlnbm9yZVBhcmNlbGFibGVzQW5kUmVwZWF0SW50KGNvbnN0IDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dmVyc2lvbmVkOjp0ZXN0czo6Rm9vJiBpbl9pbkZvbywgOjphaWRsOjphbmRyb2lkOjphaWRsOjp2ZXJzaW9uZWQ6OnRlc3RzOjpGb28qIGluX2lub3V0Rm9vLCA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnZlcnNpb25lZDo6dGVzdHM6OkZvbyogb3V0X291dEZvbywgaW50MzJfdCBpbl92YWx1ZSwgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgcmV0dXJuc0xlbmd0aE9mRm9vQXJyYXkoY29uc3Qgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp2ZXJzaW9uZWQ6OnRlc3RzOjpGb28+JiBpbl9mb29zLCBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXRJbnRlcmZhY2VWZXJzaW9uKGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldEludGVyZmFjZUhhc2goc3RkOjpzdHJpbmcqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIGludDMyX3QgX2FpZGxfY2FjaGVkX3ZlcnNpb24gPSAtMTsKKyAgc3RkOjpzdHJpbmcgX2FpZGxfY2FjaGVkX2hhc2ggPSAiLTEiOworICBzdGQ6Om11dGV4IF9haWRsX2NhY2hlZF9oYXNoX211dGV4OworfTsKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIHZlcnNpb25lZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvRGVwcmVjYXRlZFBhcmNlbGFibGUuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvRm9vLmgKc2ltaWxhcml0eSBpbmRleCA3MCUKY29weSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0RlcHJlY2F0ZWRQYXJjZWxhYmxlLmgKY29weSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYxLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0Zvby5oCmluZGV4IDUyNzE5YmMuLjAzYmRkYTkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0RlcHJlY2F0ZWRQYXJjZWxhYmxlLmgKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS1WMS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9Gb28uaApAQCAtMSwyMCArMSwyMyBAQAogI3ByYWdtYSBvbmNlCi0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaW50ZXJmYWNlX3V0aWxzLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcGFyY2VsYWJsZV91dGlscy5oPgotI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3RvX3N0cmluZy5oPgorCiAjaW5jbHVkZSA8Y3N0ZGludD4KICNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8b3B0aW9uYWw+CiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pbnRlcmZhY2VfdXRpbHMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wYXJjZWxhYmxlX3V0aWxzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfdG9fc3RyaW5nLmg+CiAjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCiAjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfc3RhYmlsaXR5Lmg+CiAjZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorCiBuYW1lc3BhY2UgYWlkbCB7CiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdmVyc2lvbmVkIHsKIG5hbWVzcGFjZSB0ZXN0cyB7Ci1jbGFzcyBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKCJ0ZXN0IikpKSBEZXByZWNhdGVkUGFyY2VsYWJsZSB7CitjbGFzcyBGb28gewogcHVibGljOgogICB0eXBlZGVmIHN0ZDo6ZmFsc2VfdHlwZSBmaXhlZF9zaXplOwogICBzdGF0aWMgY29uc3QgY2hhciogZGVzY3JpcHRvcjsKQEAgLTIzLDM0ICsyNiwzNSBAQAogICBiaW5kZXJfc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogcGFyY2VsKTsKICAgYmluZGVyX3N0YXR1c190IHdyaXRlVG9QYXJjZWwoQVBhcmNlbCogcGFyY2VsKSBjb25zdDsKIAotICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IERlcHJlY2F0ZWRQYXJjZWxhYmxlJikgY29uc3QgeworICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEZvbyYpIGNvbnN0IHsKICAgICByZXR1cm4gc3RkOjp0aWUoKSAhPSBzdGQ6OnRpZSgpOwogICB9Ci0gIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBEZXByZWNhdGVkUGFyY2VsYWJsZSYpIGNvbnN0IHsKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEZvbyYpIGNvbnN0IHsKICAgICByZXR1cm4gc3RkOjp0aWUoKSA8IHN0ZDo6dGllKCk7CiAgIH0KLSAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBEZXByZWNhdGVkUGFyY2VsYWJsZSYpIGNvbnN0IHsKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBGb28mKSBjb25zdCB7CiAgICAgcmV0dXJuIHN0ZDo6dGllKCkgPD0gc3RkOjp0aWUoKTsKICAgfQotICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IERlcHJlY2F0ZWRQYXJjZWxhYmxlJikgY29uc3QgeworICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEZvbyYpIGNvbnN0IHsKICAgICByZXR1cm4gc3RkOjp0aWUoKSA9PSBzdGQ6OnRpZSgpOwogICB9Ci0gIGlubGluZSBib29sIG9wZXJhdG9yPihjb25zdCBEZXByZWNhdGVkUGFyY2VsYWJsZSYpIGNvbnN0IHsKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IEZvbyYpIGNvbnN0IHsKICAgICByZXR1cm4gc3RkOjp0aWUoKSA+IHN0ZDo6dGllKCk7CiAgIH0KLSAgaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBEZXByZWNhdGVkUGFyY2VsYWJsZSYpIGNvbnN0IHsKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBGb28mKSBjb25zdCB7CiAgICAgcmV0dXJuIHN0ZDo6dGllKCkgPj0gc3RkOjp0aWUoKTsKICAgfQogCiAgIHN0YXRpYyBjb25zdCA6Om5kazo6cGFyY2VsYWJsZV9zdGFiaWxpdHlfdCBfYWlkbF9zdGFiaWxpdHkgPSA6Om5kazo6U1RBQklMSVRZX0xPQ0FMOwogICBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CiAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOwotICAgIG9zIDw8ICJEZXByZWNhdGVkUGFyY2VsYWJsZXsiOworICAgIG9zIDw8ICJGb297IjsKICAgICBvcyA8PCAifSI7CiAgICAgcmV0dXJuIG9zLnN0cigpOwogICB9CiB9OwogfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgdmVyc2lvbmVkCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIH0gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYxLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0lGb29JbnRlcmZhY2UuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvSUZvb0ludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyYzgwYjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYxLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0lGb29JbnRlcmZhY2UuaApAQCAtMCwwICsxLDYyIEBACisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG9wdGlvbmFsPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaW50ZXJmYWNlX3V0aWxzLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0JhelVuaW9uLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0Zvby5oPgorI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3N0YWJpbGl0eS5oPgorI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHZlcnNpb25lZCB7CituYW1lc3BhY2UgdGVzdHMgeworY2xhc3MgSUZvb0ludGVyZmFjZSA6IHB1YmxpYyA6Om5kazo6SUNJbnRlcmZhY2UgeworcHVibGljOgorICBzdGF0aWMgY29uc3QgY2hhciogZGVzY3JpcHRvcjsKKyAgSUZvb0ludGVyZmFjZSgpOworICB2aXJ0dWFsIH5JRm9vSW50ZXJmYWNlKCk7CisKKyAgc3RhdGljIGNvbnN0IGludDMyX3QgdmVyc2lvbiA9IDE7CisgIHN0YXRpYyBpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcgaGFzaCA9ICI5ZTdiZTE4NTk4MjBjNTlkOWQ1NWRkMTMzZTcxYTM2ODdiNWQyZTViIjsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9vcmlnaW5hbEFwaSA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAwOworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX2FjY2VwdFVuaW9uQW5kUmV0dXJuU3RyaW5nID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDE7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05faWdub3JlUGFyY2VsYWJsZXNBbmRSZXBlYXRJbnQgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMjsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9yZXR1cm5zTGVuZ3RoT2ZGb29BcnJheSA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzOworCisgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8SUZvb0ludGVyZmFjZT4gZnJvbUJpbmRlcihjb25zdCA6Om5kazo6U3BBSUJpbmRlciYgYmluZGVyKTsKKyAgc3RhdGljIGJpbmRlcl9zdGF0dXNfdCB3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIHBhcmNlbCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElGb29JbnRlcmZhY2U+JiBpbnN0YW5jZSk7CisgIHN0YXRpYyBiaW5kZXJfc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogcGFyY2VsLCBzdGQ6OnNoYXJlZF9wdHI8SUZvb0ludGVyZmFjZT4qIGluc3RhbmNlKTsKKyAgc3RhdGljIGJvb2wgc2V0RGVmYXVsdEltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElGb29JbnRlcmZhY2U+JiBpbXBsKTsKKyAgc3RhdGljIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJRm9vSW50ZXJmYWNlPiYgZ2V0RGVmYXVsdEltcGwoKTsKKyAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBvcmlnaW5hbEFwaSgpID0gMDsKKyAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBhY2NlcHRVbmlvbkFuZFJldHVyblN0cmluZyhjb25zdCA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnZlcnNpb25lZDo6dGVzdHM6OkJhelVuaW9uJiBpbl91LCBzdGQ6OnN0cmluZyogX2FpZGxfcmV0dXJuKSA9IDA7CisgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgaWdub3JlUGFyY2VsYWJsZXNBbmRSZXBlYXRJbnQoY29uc3QgOjphaWRsOjphbmRyb2lkOjphaWRsOjp2ZXJzaW9uZWQ6OnRlc3RzOjpGb28mIGluX2luRm9vLCA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnZlcnNpb25lZDo6dGVzdHM6OkZvbyogaW5faW5vdXRGb28sIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dmVyc2lvbmVkOjp0ZXN0czo6Rm9vKiBvdXRfb3V0Rm9vLCBpbnQzMl90IGluX3ZhbHVlLCBpbnQzMl90KiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyByZXR1cm5zTGVuZ3RoT2ZGb29BcnJheShjb25zdCBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnZlcnNpb25lZDo6dGVzdHM6OkZvbz4mIGluX2Zvb3MsIGludDMyX3QqIF9haWRsX3JldHVybikgPSAwOworICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldEludGVyZmFjZVZlcnNpb24oaW50MzJfdCogX2FpZGxfcmV0dXJuKSA9IDA7CisgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0SW50ZXJmYWNlSGFzaChzdGQ6OnN0cmluZyogX2FpZGxfcmV0dXJuKSA9IDA7Citwcml2YXRlOgorICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPElGb29JbnRlcmZhY2U+IGRlZmF1bHRfaW1wbDsKK307CitjbGFzcyBJRm9vSW50ZXJmYWNlRGVmYXVsdCA6IHB1YmxpYyBJRm9vSW50ZXJmYWNlIHsKK3B1YmxpYzoKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgb3JpZ2luYWxBcGkoKSBvdmVycmlkZTsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgYWNjZXB0VW5pb25BbmRSZXR1cm5TdHJpbmcoY29uc3QgOjphaWRsOjphbmRyb2lkOjphaWRsOjp2ZXJzaW9uZWQ6OnRlc3RzOjpCYXpVbmlvbiYgaW5fdSwgc3RkOjpzdHJpbmcqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGlnbm9yZVBhcmNlbGFibGVzQW5kUmVwZWF0SW50KGNvbnN0IDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dmVyc2lvbmVkOjp0ZXN0czo6Rm9vJiBpbl9pbkZvbywgOjphaWRsOjphbmRyb2lkOjphaWRsOjp2ZXJzaW9uZWQ6OnRlc3RzOjpGb28qIGluX2lub3V0Rm9vLCA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnZlcnNpb25lZDo6dGVzdHM6OkZvbyogb3V0X291dEZvbywgaW50MzJfdCBpbl92YWx1ZSwgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgcmV0dXJuc0xlbmd0aE9mRm9vQXJyYXkoY29uc3Qgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp2ZXJzaW9uZWQ6OnRlc3RzOjpGb28+JiBpbl9mb29zLCBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXRJbnRlcmZhY2VWZXJzaW9uKGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldEludGVyZmFjZUhhc2goc3RkOjpzdHJpbmcqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTcEFJQmluZGVyIGFzQmluZGVyKCkgb3ZlcnJpZGU7CisgIGJvb2wgaXNSZW1vdGUoKSBvdmVycmlkZTsKK307Cit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSB2ZXJzaW9uZWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi90aW1lc3RhbXAgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYxLW5kay1zb3VyY2UvZ2VuL3RpbWVzdGFtcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi90aW1lc3RhbXAKY29weSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYxLW5kay1zb3VyY2UvZ2VuL3RpbWVzdGFtcApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS1WMS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9CYXpVbmlvbi5ycyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvQmF6VW5pb24ucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYwZmY4OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvQmF6VW5pb24ucnMKQEAgLTAsMCArMSw1MiBAQAorIyFbZm9yYmlkKHVuc2FmZV9jb2RlKV0KKyMhW3J1c3RmbXQ6OnNraXBdCisjW2Rlcml2ZShEZWJ1ZyldCitwdWIgZW51bSBCYXpVbmlvbiB7CisgIEludE51bShpMzIpLAorfQoraW1wbCBEZWZhdWx0IGZvciBCYXpVbmlvbiB7CisgIGZuIGRlZmF1bHQoKSAtPiBTZWxmIHsKKyAgICBTZWxmOjpJbnROdW0oMCkKKyAgfQorfQoraW1wbCBiaW5kZXI6OlBhcmNlbGFibGUgZm9yIEJhelVuaW9uIHsKKyAgZm4gd3JpdGVfdG9fcGFyY2VsKCZzZWxmLCBwYXJjZWw6ICZtdXQgYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWwpIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4geworICAgIG1hdGNoIHNlbGYgeworICAgICAgU2VsZjo6SW50TnVtKHYpID0+IHsKKyAgICAgICAgcGFyY2VsLndyaXRlKCYwaTMyKT87CisgICAgICAgIHBhcmNlbC53cml0ZSh2KQorICAgICAgfQorICAgIH0KKyAgfQorICBmbiByZWFkX2Zyb21fcGFyY2VsKCZtdXQgc2VsZiwgcGFyY2VsOiAmYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWwpIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4geworICAgIGxldCB0YWc6IGkzMiA9IHBhcmNlbC5yZWFkKCk/OworICAgIG1hdGNoIHRhZyB7CisgICAgICAwID0+IHsKKyAgICAgICAgbGV0IHZhbHVlOiBpMzIgPSBwYXJjZWwucmVhZCgpPzsKKyAgICAgICAgKnNlbGYgPSBTZWxmOjpJbnROdW0odmFsdWUpOworICAgICAgICBPaygoKSkKKyAgICAgIH0KKyAgICAgIF8gPT4geworICAgICAgICBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpCQURfVkFMVUUpCisgICAgICB9CisgICAgfQorICB9Cit9CitiaW5kZXI6OmltcGxfc2VyaWFsaXplX2Zvcl9wYXJjZWxhYmxlIShCYXpVbmlvbik7CitiaW5kZXI6OmltcGxfZGVzZXJpYWxpemVfZm9yX3BhcmNlbGFibGUhKEJhelVuaW9uKTsKK2ltcGwgYmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsYWJsZU1ldGFkYXRhIGZvciBCYXpVbmlvbiB7CisgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHsgImFuZHJvaWQuYWlkbC52ZXJzaW9uZWQudGVzdHMuQmF6VW5pb24iIH0KK30KK3B1YiBtb2QgVGFnIHsKKyAgIyFbYWxsb3cobm9uX3VwcGVyX2Nhc2VfZ2xvYmFscyldCisgIHVzZSBiaW5kZXI6OmRlY2xhcmVfYmluZGVyX2VudW07CisgIGRlY2xhcmVfYmluZGVyX2VudW0hIHsKKyAgICBUYWcgOiBbaTMyOyAxXSB7CisgICAgICBpbnROdW0gPSAwLAorICAgIH0KKyAgfQorfQorcHViKGNyYXRlKSBtb2QgbWFuZ2xlZCB7CisgcHViIHVzZSBzdXBlcjo6QmF6VW5pb24gYXMgXzdfYW5kcm9pZF80X2FpZGxfOV92ZXJzaW9uZWRfNV90ZXN0c184X0JhelVuaW9uOworIHB1YiB1c2Ugc3VwZXI6OlRhZzo6VGFnIGFzIF83X2FuZHJvaWRfNF9haWRsXzlfdmVyc2lvbmVkXzVfdGVzdHNfOF9CYXpVbmlvbl8zX1RhZzsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvQmF6VW5pb24ucnMuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvQmF6VW5pb24ucnMuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDZjZDAxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS1WMS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9CYXpVbmlvbi5ycy5kCkBAIC0wLDAgKzEsMiBAQAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYxLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0JhelVuaW9uLnJzIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC9haWRsX2FwaS9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS8xL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvQmF6VW5pb24uYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS1WMS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9Gb28ucnMgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYxLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0Zvby5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDkyNmI3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS1WMS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9Gb28ucnMKQEAgLTAsMCArMSwzMSBAQAorIyFbZm9yYmlkKHVuc2FmZV9jb2RlKV0KKyMhW3J1c3RmbXQ6OnNraXBdCisjW2Rlcml2ZShEZWJ1ZyldCitwdWIgc3RydWN0IEZvbyB7Cit9CitpbXBsIERlZmF1bHQgZm9yIEZvbyB7CisgIGZuIGRlZmF1bHQoKSAtPiBTZWxmIHsKKyAgICBTZWxmIHsKKyAgICB9CisgIH0KK30KK2ltcGwgYmluZGVyOjpQYXJjZWxhYmxlIGZvciBGb28geworICBmbiB3cml0ZV90b19wYXJjZWwoJnNlbGYsIHBhcmNlbDogJm11dCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbCkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CisgICAgcGFyY2VsLnNpemVkX3dyaXRlKHxzdWJwYXJjZWx8IHsKKyAgICAgIE9rKCgpKQorICAgIH0pCisgIH0KKyAgZm4gcmVhZF9mcm9tX3BhcmNlbCgmbXV0IHNlbGYsIHBhcmNlbDogJmJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsKSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsKKyAgICBwYXJjZWwuc2l6ZWRfcmVhZCh8c3VicGFyY2VsfCB7CisgICAgICBPaygoKSkKKyAgICB9KQorICB9Cit9CitiaW5kZXI6OmltcGxfc2VyaWFsaXplX2Zvcl9wYXJjZWxhYmxlIShGb28pOworYmluZGVyOjppbXBsX2Rlc2VyaWFsaXplX2Zvcl9wYXJjZWxhYmxlIShGb28pOworaW1wbCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWxhYmxlTWV0YWRhdGEgZm9yIEZvbyB7CisgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHsgImFuZHJvaWQuYWlkbC52ZXJzaW9uZWQudGVzdHMuRm9vIiB9Cit9CitwdWIoY3JhdGUpIG1vZCBtYW5nbGVkIHsKKyBwdWIgdXNlIHN1cGVyOjpGb28gYXMgXzdfYW5kcm9pZF80X2FpZGxfOV92ZXJzaW9uZWRfNV90ZXN0c18zX0ZvbzsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvRm9vLnJzLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYxLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0Zvby5ycy5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4YjA5ZGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYxLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0Zvby5ycy5kCkBAIC0wLDAgKzEsMiBAQAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYxLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0Zvby5ycyA6IFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbF9hcGkvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UvMS9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0Zvby5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYxLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0lGb29JbnRlcmZhY2UucnMgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYxLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0lGb29JbnRlcmZhY2UucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg5OGYxZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvSUZvb0ludGVyZmFjZS5ycwpAQCAtMCwwICsxLDQzNSBAQAorIyFbZm9yYmlkKHVuc2FmZV9jb2RlKV0KKyMhW3J1c3RmbXQ6OnNraXBdCisjIVthbGxvdyhub25fdXBwZXJfY2FzZV9nbG9iYWxzKV0KKyMhW2FsbG93KG5vbl9zbmFrZV9jYXNlKV0KKyNbYWxsb3codW51c2VkX2ltcG9ydHMpXSB1c2UgYmluZGVyOjpiaW5kZXJfaW1wbDo6SUJpbmRlckludGVybmFsOwordXNlIGJpbmRlcjo6ZGVjbGFyZV9iaW5kZXJfaW50ZXJmYWNlOworZGVjbGFyZV9iaW5kZXJfaW50ZXJmYWNlISB7CisgIElGb29JbnRlcmZhY2VbImFuZHJvaWQuYWlkbC52ZXJzaW9uZWQudGVzdHMuSUZvb0ludGVyZmFjZSJdIHsKKyAgICBuYXRpdmU6IEJuRm9vSW50ZXJmYWNlKG9uX3RyYW5zYWN0KSwKKyAgICBwcm94eTogQnBGb29JbnRlcmZhY2UgeworICAgICAgY2FjaGVkX3ZlcnNpb246IHN0ZDo6c3luYzo6YXRvbWljOjpBdG9taWNJMzIgPSBzdGQ6OnN5bmM6OmF0b21pYzo6QXRvbWljSTMyOjpuZXcoLTEpLAorICAgICAgY2FjaGVkX2hhc2g6IHN0ZDo6c3luYzo6TXV0ZXg8T3B0aW9uPFN0cmluZz4+ID0gc3RkOjpzeW5jOjpNdXRleDo6bmV3KE5vbmUpCisgICAgfSwKKyAgICBhc3luYzogSUZvb0ludGVyZmFjZUFzeW5jLAorICB9Cit9CitwdWIgdHJhaXQgSUZvb0ludGVyZmFjZTogYmluZGVyOjpJbnRlcmZhY2UgKyBTZW5kIHsKKyAgZm4gZ2V0X2Rlc2NyaXB0b3IoKSAtPiAmJ3N0YXRpYyBzdHIgd2hlcmUgU2VsZjogU2l6ZWQgeyAiYW5kcm9pZC5haWRsLnZlcnNpb25lZC50ZXN0cy5JRm9vSW50ZXJmYWNlIiB9CisgIGZuIG9yaWdpbmFsQXBpKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT47CisgIGZuIGFjY2VwdFVuaW9uQW5kUmV0dXJuU3RyaW5nKCZzZWxmLCBfYXJnX3U6ICZjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfOV92ZXJzaW9uZWRfNV90ZXN0c184X0JhelVuaW9uKSAtPiBiaW5kZXI6OlJlc3VsdDxTdHJpbmc+OworICBmbiBpZ25vcmVQYXJjZWxhYmxlc0FuZFJlcGVhdEludCgmc2VsZiwgX2FyZ19pbkZvbzogJmNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF85X3ZlcnNpb25lZF81X3Rlc3RzXzNfRm9vLCBfYXJnX2lub3V0Rm9vOiAmbXV0IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF85X3ZlcnNpb25lZF81X3Rlc3RzXzNfRm9vLCBfYXJnX291dEZvbzogJm11dCBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfOV92ZXJzaW9uZWRfNV90ZXN0c18zX0ZvbywgX2FyZ192YWx1ZTogaTMyKSAtPiBiaW5kZXI6OlJlc3VsdDxpMzI+OworICBmbiByZXR1cm5zTGVuZ3RoT2ZGb29BcnJheSgmc2VsZiwgX2FyZ19mb29zOiAmW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF85X3ZlcnNpb25lZF81X3Rlc3RzXzNfRm9vXSkgLT4gYmluZGVyOjpSZXN1bHQ8aTMyPjsKKyAgZm4gZ2V0SW50ZXJmYWNlVmVyc2lvbigmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8aTMyPiB7CisgICAgT2soVkVSU0lPTikKKyAgfQorICBmbiBnZXRJbnRlcmZhY2VIYXNoKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxTdHJpbmc+IHsKKyAgICBPayhIQVNILmludG8oKSkKKyAgfQorICBmbiBnZXREZWZhdWx0SW1wbCgpIC0+IElGb29JbnRlcmZhY2VEZWZhdWx0UmVmIHdoZXJlIFNlbGY6IFNpemVkIHsKKyAgICBERUZBVUxUX0lNUEwubG9jaygpLnVud3JhcCgpLmNsb25lKCkKKyAgfQorICBmbiBzZXREZWZhdWx0SW1wbChkOiBJRm9vSW50ZXJmYWNlRGVmYXVsdFJlZikgLT4gSUZvb0ludGVyZmFjZURlZmF1bHRSZWYgd2hlcmUgU2VsZjogU2l6ZWQgeworICAgIHN0ZDo6bWVtOjpyZXBsYWNlKCZtdXQgKkRFRkFVTFRfSU1QTC5sb2NrKCkudW53cmFwKCksIGQpCisgIH0KK30KK3B1YiB0cmFpdCBJRm9vSW50ZXJmYWNlQXN5bmM8UD46IGJpbmRlcjo6SW50ZXJmYWNlICsgU2VuZCB7CisgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHdoZXJlIFNlbGY6IFNpemVkIHsgImFuZHJvaWQuYWlkbC52ZXJzaW9uZWQudGVzdHMuSUZvb0ludGVyZmFjZSIgfQorICBmbiBvcmlnaW5hbEFwaTwnYT4oJidhIHNlbGYpIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDwoKT4+OworICBmbiBhY2NlcHRVbmlvbkFuZFJldHVyblN0cmluZzwnYT4oJidhIHNlbGYsIF9hcmdfdTogJidhIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF85X3ZlcnNpb25lZF81X3Rlc3RzXzhfQmF6VW5pb24pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxTdHJpbmc+PjsKKyAgZm4gaWdub3JlUGFyY2VsYWJsZXNBbmRSZXBlYXRJbnQ8J2E+KCYnYSBzZWxmLCBfYXJnX2luRm9vOiAmJ2EgY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzlfdmVyc2lvbmVkXzVfdGVzdHNfM19Gb28sIF9hcmdfaW5vdXRGb286ICYnYSBtdXQgY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzlfdmVyc2lvbmVkXzVfdGVzdHNfM19Gb28sIF9hcmdfb3V0Rm9vOiAmJ2EgbXV0IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF85X3ZlcnNpb25lZF81X3Rlc3RzXzNfRm9vLCBfYXJnX3ZhbHVlOiBpMzIpIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxpMzI+PjsKKyAgZm4gcmV0dXJuc0xlbmd0aE9mRm9vQXJyYXk8J2E+KCYnYSBzZWxmLCBfYXJnX2Zvb3M6ICYnYSBbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzlfdmVyc2lvbmVkXzVfdGVzdHNfM19Gb29dKSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8aTMyPj47CisgIGZuIGdldEludGVyZmFjZVZlcnNpb248J2E+KCYnYSBzZWxmKSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8aTMyPj4geworICAgIEJveDo6cGluKGFzeW5jIG1vdmUgeyBPayhWRVJTSU9OKSB9KQorICB9CisgIGZuIGdldEludGVyZmFjZUhhc2g8J2E+KCYnYSBzZWxmKSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8U3RyaW5nPj4geworICAgIEJveDo6cGluKGFzeW5jIG1vdmUgeyBPayhIQVNILmludG8oKSkgfSkKKyAgfQorfQorI1s6OmFzeW5jX3RyYWl0Ojphc3luY190cmFpdF0KK3B1YiB0cmFpdCBJRm9vSW50ZXJmYWNlQXN5bmNTZXJ2ZXI6IGJpbmRlcjo6SW50ZXJmYWNlICsgU2VuZCB7CisgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHdoZXJlIFNlbGY6IFNpemVkIHsgImFuZHJvaWQuYWlkbC52ZXJzaW9uZWQudGVzdHMuSUZvb0ludGVyZmFjZSIgfQorICBhc3luYyBmbiBvcmlnaW5hbEFwaSgmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8KCk+OworICBhc3luYyBmbiBhY2NlcHRVbmlvbkFuZFJldHVyblN0cmluZygmc2VsZiwgX2FyZ191OiAmY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzlfdmVyc2lvbmVkXzVfdGVzdHNfOF9CYXpVbmlvbikgLT4gYmluZGVyOjpSZXN1bHQ8U3RyaW5nPjsKKyAgYXN5bmMgZm4gaWdub3JlUGFyY2VsYWJsZXNBbmRSZXBlYXRJbnQoJnNlbGYsIF9hcmdfaW5Gb286ICZjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfOV92ZXJzaW9uZWRfNV90ZXN0c18zX0ZvbywgX2FyZ19pbm91dEZvbzogJm11dCBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfOV92ZXJzaW9uZWRfNV90ZXN0c18zX0ZvbywgX2FyZ19vdXRGb286ICZtdXQgY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzlfdmVyc2lvbmVkXzVfdGVzdHNfM19Gb28sIF9hcmdfdmFsdWU6IGkzMikgLT4gYmluZGVyOjpSZXN1bHQ8aTMyPjsKKyAgYXN5bmMgZm4gcmV0dXJuc0xlbmd0aE9mRm9vQXJyYXkoJnNlbGYsIF9hcmdfZm9vczogJltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfOV92ZXJzaW9uZWRfNV90ZXN0c18zX0Zvb10pIC0+IGJpbmRlcjo6UmVzdWx0PGkzMj47Cit9CitpbXBsIEJuRm9vSW50ZXJmYWNlIHsKKyAgLy8vIENyZWF0ZSBhIG5ldyBhc3luYyBiaW5kZXIgc2VydmljZS4KKyAgcHViIGZuIG5ld19hc3luY19iaW5kZXI8VCwgUj4oaW5uZXI6IFQsIHJ0OiBSLCBmZWF0dXJlczogYmluZGVyOjpCaW5kZXJGZWF0dXJlcykgLT4gYmluZGVyOjpTdHJvbmc8ZHluIElGb29JbnRlcmZhY2U+CisgIHdoZXJlCisgICAgVDogSUZvb0ludGVyZmFjZUFzeW5jU2VydmVyICsgYmluZGVyOjpJbnRlcmZhY2UgKyBTZW5kICsgU3luYyArICdzdGF0aWMsCisgICAgUjogYmluZGVyOjpiaW5kZXJfaW1wbDo6QmluZGVyQXN5bmNSdW50aW1lICsgU2VuZCArIFN5bmMgKyAnc3RhdGljLAorICB7CisgICAgc3RydWN0IFdyYXBwZXI8VCwgUj4geworICAgICAgX2lubmVyOiBULAorICAgICAgX3J0OiBSLAorICAgIH0KKyAgICBpbXBsPFQsIFI+IGJpbmRlcjo6SW50ZXJmYWNlIGZvciBXcmFwcGVyPFQsIFI+IHdoZXJlIFQ6IGJpbmRlcjo6SW50ZXJmYWNlLCBSOiBTZW5kICsgU3luYyB7CisgICAgICBmbiBhc19iaW5kZXIoJnNlbGYpIC0+IGJpbmRlcjo6U3BJQmluZGVyIHsgc2VsZi5faW5uZXIuYXNfYmluZGVyKCkgfQorICAgICAgZm4gZHVtcCgmc2VsZiwgX2ZpbGU6ICZzdGQ6OmZzOjpGaWxlLCBfYXJnczogJlsmc3RkOjpmZmk6OkNTdHJdKSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsgc2VsZi5faW5uZXIuZHVtcChfZmlsZSwgX2FyZ3MpIH0KKyAgICB9CisgICAgaW1wbDxULCBSPiBJRm9vSW50ZXJmYWNlIGZvciBXcmFwcGVyPFQsIFI+CisgICAgd2hlcmUKKyAgICAgIFQ6IElGb29JbnRlcmZhY2VBc3luY1NlcnZlciArIFNlbmQgKyBTeW5jICsgJ3N0YXRpYywKKyAgICAgIFI6IGJpbmRlcjo6YmluZGVyX2ltcGw6OkJpbmRlckFzeW5jUnVudGltZSArIFNlbmQgKyBTeW5jICsgJ3N0YXRpYywKKyAgICB7CisgICAgICBmbiBvcmlnaW5hbEFwaSgmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5fcnQuYmxvY2tfb24oc2VsZi5faW5uZXIub3JpZ2luYWxBcGkoKSkKKyAgICAgIH0KKyAgICAgIGZuIGFjY2VwdFVuaW9uQW5kUmV0dXJuU3RyaW5nKCZzZWxmLCBfYXJnX3U6ICZjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfOV92ZXJzaW9uZWRfNV90ZXN0c184X0JhelVuaW9uKSAtPiBiaW5kZXI6OlJlc3VsdDxTdHJpbmc+IHsKKyAgICAgICAgc2VsZi5fcnQuYmxvY2tfb24oc2VsZi5faW5uZXIuYWNjZXB0VW5pb25BbmRSZXR1cm5TdHJpbmcoX2FyZ191KSkKKyAgICAgIH0KKyAgICAgIGZuIGlnbm9yZVBhcmNlbGFibGVzQW5kUmVwZWF0SW50KCZzZWxmLCBfYXJnX2luRm9vOiAmY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzlfdmVyc2lvbmVkXzVfdGVzdHNfM19Gb28sIF9hcmdfaW5vdXRGb286ICZtdXQgY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzlfdmVyc2lvbmVkXzVfdGVzdHNfM19Gb28sIF9hcmdfb3V0Rm9vOiAmbXV0IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF85X3ZlcnNpb25lZF81X3Rlc3RzXzNfRm9vLCBfYXJnX3ZhbHVlOiBpMzIpIC0+IGJpbmRlcjo6UmVzdWx0PGkzMj4geworICAgICAgICBzZWxmLl9ydC5ibG9ja19vbihzZWxmLl9pbm5lci5pZ25vcmVQYXJjZWxhYmxlc0FuZFJlcGVhdEludChfYXJnX2luRm9vLCBfYXJnX2lub3V0Rm9vLCBfYXJnX291dEZvbywgX2FyZ192YWx1ZSkpCisgICAgICB9CisgICAgICBmbiByZXR1cm5zTGVuZ3RoT2ZGb29BcnJheSgmc2VsZiwgX2FyZ19mb29zOiAmW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF85X3ZlcnNpb25lZF81X3Rlc3RzXzNfRm9vXSkgLT4gYmluZGVyOjpSZXN1bHQ8aTMyPiB7CisgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLnJldHVybnNMZW5ndGhPZkZvb0FycmF5KF9hcmdfZm9vcykpCisgICAgICB9CisgICAgfQorICAgIGxldCB3cmFwcGVkID0gV3JhcHBlciB7IF9pbm5lcjogaW5uZXIsIF9ydDogcnQgfTsKKyAgICBTZWxmOjpuZXdfYmluZGVyKHdyYXBwZWQsIGZlYXR1cmVzKQorICB9Cit9CitwdWIgdHJhaXQgSUZvb0ludGVyZmFjZURlZmF1bHQ6IFNlbmQgKyBTeW5jIHsKKyAgZm4gb3JpZ2luYWxBcGkoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7CisgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTi5pbnRvKCkpCisgIH0KKyAgZm4gYWNjZXB0VW5pb25BbmRSZXR1cm5TdHJpbmcoJnNlbGYsIF9hcmdfdTogJmNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF85X3ZlcnNpb25lZF81X3Rlc3RzXzhfQmF6VW5pb24pIC0+IGJpbmRlcjo6UmVzdWx0PFN0cmluZz4geworICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQorICB9CisgIGZuIGlnbm9yZVBhcmNlbGFibGVzQW5kUmVwZWF0SW50KCZzZWxmLCBfYXJnX2luRm9vOiAmY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzlfdmVyc2lvbmVkXzVfdGVzdHNfM19Gb28sIF9hcmdfaW5vdXRGb286ICZtdXQgY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzlfdmVyc2lvbmVkXzVfdGVzdHNfM19Gb28sIF9hcmdfb3V0Rm9vOiAmbXV0IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF85X3ZlcnNpb25lZF81X3Rlc3RzXzNfRm9vLCBfYXJnX3ZhbHVlOiBpMzIpIC0+IGJpbmRlcjo6UmVzdWx0PGkzMj4geworICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQorICB9CisgIGZuIHJldHVybnNMZW5ndGhPZkZvb0FycmF5KCZzZWxmLCBfYXJnX2Zvb3M6ICZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzlfdmVyc2lvbmVkXzVfdGVzdHNfM19Gb29dKSAtPiBiaW5kZXI6OlJlc3VsdDxpMzI+IHsKKyAgICBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OLmludG8oKSkKKyAgfQorfQorcHViIG1vZCB0cmFuc2FjdGlvbnMgeworICBwdWIgY29uc3Qgb3JpZ2luYWxBcGk6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAwOworICBwdWIgY29uc3QgYWNjZXB0VW5pb25BbmRSZXR1cm5TdHJpbmc6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAxOworICBwdWIgY29uc3QgaWdub3JlUGFyY2VsYWJsZXNBbmRSZXBlYXRJbnQ6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyOworICBwdWIgY29uc3QgcmV0dXJuc0xlbmd0aE9mRm9vQXJyYXk6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzOworICBwdWIgY29uc3QgZ2V0SW50ZXJmYWNlVmVyc2lvbjogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpiaW5kZXJfaW1wbDo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDE2Nzc3MjE0OworICBwdWIgY29uc3QgZ2V0SW50ZXJmYWNlSGFzaDogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpiaW5kZXJfaW1wbDo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDE2Nzc3MjEzOworfQorcHViIHR5cGUgSUZvb0ludGVyZmFjZURlZmF1bHRSZWYgPSBPcHRpb248c3RkOjpzeW5jOjpBcmM8ZHluIElGb29JbnRlcmZhY2VEZWZhdWx0Pj47Cit1c2UgbGF6eV9zdGF0aWM6Omxhenlfc3RhdGljOworbGF6eV9zdGF0aWMhIHsKKyAgc3RhdGljIHJlZiBERUZBVUxUX0lNUEw6IHN0ZDo6c3luYzo6TXV0ZXg8SUZvb0ludGVyZmFjZURlZmF1bHRSZWY+ID0gc3RkOjpzeW5jOjpNdXRleDo6bmV3KE5vbmUpOworfQorcHViIGNvbnN0IFZFUlNJT046IGkzMiA9IDE7CitwdWIgY29uc3QgSEFTSDogJnN0ciA9ICI5ZTdiZTE4NTk4MjBjNTlkOWQ1NWRkMTMzZTcxYTM2ODdiNWQyZTViIjsKK2ltcGwgQnBGb29JbnRlcmZhY2UgeworICBmbiBidWlsZF9wYXJjZWxfb3JpZ2luYWxBcGkoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbD4geworICAgIGxldCBtdXQgYWlkbF9kYXRhID0gc2VsZi5iaW5kZXIucHJlcGFyZV90cmFuc2FjdCgpPzsKKyAgICBPayhhaWRsX2RhdGEpCisgIH0KKyAgZm4gcmVhZF9yZXNwb25zZV9vcmlnaW5hbEFwaSgmc2VsZiwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4geworICAgIGlmIGxldCBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKSA9IF9haWRsX3JlcGx5IHsKKyAgICAgIGlmIGxldCBTb21lKF9haWRsX2RlZmF1bHRfaW1wbCkgPSA8U2VsZiBhcyBJRm9vSW50ZXJmYWNlPjo6Z2V0RGVmYXVsdEltcGwoKSB7CisgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwub3JpZ2luYWxBcGkoKTsKKyAgICAgIH0KKyAgICB9CisgICAgbGV0IF9haWRsX3JlcGx5ID0gX2FpZGxfcmVwbHk/OworICAgIGxldCBfYWlkbF9zdGF0dXM6IGJpbmRlcjo6U3RhdHVzID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKKyAgICBpZiAhX2FpZGxfc3RhdHVzLmlzX29rKCkgeyByZXR1cm4gRXJyKF9haWRsX3N0YXR1cyk7IH0KKyAgICBPaygoKSkKKyAgfQorICBmbiBidWlsZF9wYXJjZWxfYWNjZXB0VW5pb25BbmRSZXR1cm5TdHJpbmcoJnNlbGYsIF9hcmdfdTogJmNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF85X3ZlcnNpb25lZF81X3Rlc3RzXzhfQmF6VW5pb24pIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbD4geworICAgIGxldCBtdXQgYWlkbF9kYXRhID0gc2VsZi5iaW5kZXIucHJlcGFyZV90cmFuc2FjdCgpPzsKKyAgICBhaWRsX2RhdGEud3JpdGUoX2FyZ191KT87CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfYWNjZXB0VW5pb25BbmRSZXR1cm5TdHJpbmcoJnNlbGYsIF9hcmdfdTogJmNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF85X3ZlcnNpb25lZF81X3Rlc3RzXzhfQmF6VW5pb24sIF9haWRsX3JlcGx5OiBzdGQ6OnJlc3VsdDo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbCwgYmluZGVyOjpTdGF0dXNDb2RlPikgLT4gYmluZGVyOjpSZXN1bHQ8U3RyaW5nPiB7CisgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgeworICAgICAgaWYgbGV0IFNvbWUoX2FpZGxfZGVmYXVsdF9pbXBsKSA9IDxTZWxmIGFzIElGb29JbnRlcmZhY2U+OjpnZXREZWZhdWx0SW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5hY2NlcHRVbmlvbkFuZFJldHVyblN0cmluZyhfYXJnX3UpOworICAgICAgfQorICAgIH0KKyAgICBsZXQgX2FpZGxfcmVwbHkgPSBfYWlkbF9yZXBseT87CisgICAgbGV0IF9haWRsX3N0YXR1czogYmluZGVyOjpTdGF0dXMgPSBfYWlkbF9yZXBseS5yZWFkKCk/OworICAgIGlmICFfYWlkbF9zdGF0dXMuaXNfb2soKSB7IHJldHVybiBFcnIoX2FpZGxfc3RhdHVzKTsgfQorICAgIGxldCBfYWlkbF9yZXR1cm46IFN0cmluZyA9IF9haWRsX3JlcGx5LnJlYWQoKT87CisgICAgT2soX2FpZGxfcmV0dXJuKQorICB9CisgIGZuIGJ1aWxkX3BhcmNlbF9pZ25vcmVQYXJjZWxhYmxlc0FuZFJlcGVhdEludCgmc2VsZiwgX2FyZ19pbkZvbzogJmNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF85X3ZlcnNpb25lZF81X3Rlc3RzXzNfRm9vLCBfYXJnX2lub3V0Rm9vOiAmbXV0IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF85X3ZlcnNpb25lZF81X3Rlc3RzXzNfRm9vLCBfYXJnX291dEZvbzogJm11dCBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfOV92ZXJzaW9uZWRfNV90ZXN0c18zX0ZvbywgX2FyZ192YWx1ZTogaTMyKSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgYWlkbF9kYXRhLndyaXRlKF9hcmdfaW5Gb28pPzsKKyAgICBhaWRsX2RhdGEud3JpdGUoX2FyZ19pbm91dEZvbyk/OworICAgIGFpZGxfZGF0YS53cml0ZSgmX2FyZ192YWx1ZSk/OworICAgIE9rKGFpZGxfZGF0YSkKKyAgfQorICBmbiByZWFkX3Jlc3BvbnNlX2lnbm9yZVBhcmNlbGFibGVzQW5kUmVwZWF0SW50KCZzZWxmLCBfYXJnX2luRm9vOiAmY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzlfdmVyc2lvbmVkXzVfdGVzdHNfM19Gb28sIF9hcmdfaW5vdXRGb286ICZtdXQgY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzlfdmVyc2lvbmVkXzVfdGVzdHNfM19Gb28sIF9hcmdfb3V0Rm9vOiAmbXV0IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF85X3ZlcnNpb25lZF81X3Rlc3RzXzNfRm9vLCBfYXJnX3ZhbHVlOiBpMzIsIF9haWRsX3JlcGx5OiBzdGQ6OnJlc3VsdDo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbCwgYmluZGVyOjpTdGF0dXNDb2RlPikgLT4gYmluZGVyOjpSZXN1bHQ8aTMyPiB7CisgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgeworICAgICAgaWYgbGV0IFNvbWUoX2FpZGxfZGVmYXVsdF9pbXBsKSA9IDxTZWxmIGFzIElGb29JbnRlcmZhY2U+OjpnZXREZWZhdWx0SW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5pZ25vcmVQYXJjZWxhYmxlc0FuZFJlcGVhdEludChfYXJnX2luRm9vLCBfYXJnX2lub3V0Rm9vLCBfYXJnX291dEZvbywgX2FyZ192YWx1ZSk7CisgICAgICB9CisgICAgfQorICAgIGxldCBfYWlkbF9yZXBseSA9IF9haWRsX3JlcGx5PzsKKyAgICBsZXQgX2FpZGxfc3RhdHVzOiBiaW5kZXI6OlN0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWQoKT87CisgICAgaWYgIV9haWRsX3N0YXR1cy5pc19vaygpIHsgcmV0dXJuIEVycihfYWlkbF9zdGF0dXMpOyB9CisgICAgbGV0IF9haWRsX3JldHVybjogaTMyID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKKyAgICBfYWlkbF9yZXBseS5yZWFkX29udG8oX2FyZ19pbm91dEZvbyk/OworICAgIF9haWRsX3JlcGx5LnJlYWRfb250byhfYXJnX291dEZvbyk/OworICAgIE9rKF9haWRsX3JldHVybikKKyAgfQorICBmbiBidWlsZF9wYXJjZWxfcmV0dXJuc0xlbmd0aE9mRm9vQXJyYXkoJnNlbGYsIF9hcmdfZm9vczogJltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfOV92ZXJzaW9uZWRfNV90ZXN0c18zX0Zvb10pIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbD4geworICAgIGxldCBtdXQgYWlkbF9kYXRhID0gc2VsZi5iaW5kZXIucHJlcGFyZV90cmFuc2FjdCgpPzsKKyAgICBhaWRsX2RhdGEud3JpdGUoX2FyZ19mb29zKT87CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfcmV0dXJuc0xlbmd0aE9mRm9vQXJyYXkoJnNlbGYsIF9hcmdfZm9vczogJltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfOV92ZXJzaW9uZWRfNV90ZXN0c18zX0Zvb10sIF9haWRsX3JlcGx5OiBzdGQ6OnJlc3VsdDo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbCwgYmluZGVyOjpTdGF0dXNDb2RlPikgLT4gYmluZGVyOjpSZXN1bHQ8aTMyPiB7CisgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgeworICAgICAgaWYgbGV0IFNvbWUoX2FpZGxfZGVmYXVsdF9pbXBsKSA9IDxTZWxmIGFzIElGb29JbnRlcmZhY2U+OjpnZXREZWZhdWx0SW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5yZXR1cm5zTGVuZ3RoT2ZGb29BcnJheShfYXJnX2Zvb3MpOworICAgICAgfQorICAgIH0KKyAgICBsZXQgX2FpZGxfcmVwbHkgPSBfYWlkbF9yZXBseT87CisgICAgbGV0IF9haWRsX3N0YXR1czogYmluZGVyOjpTdGF0dXMgPSBfYWlkbF9yZXBseS5yZWFkKCk/OworICAgIGlmICFfYWlkbF9zdGF0dXMuaXNfb2soKSB7IHJldHVybiBFcnIoX2FpZGxfc3RhdHVzKTsgfQorICAgIGxldCBfYWlkbF9yZXR1cm46IGkzMiA9IF9haWRsX3JlcGx5LnJlYWQoKT87CisgICAgT2soX2FpZGxfcmV0dXJuKQorICB9CisgIGZuIGJ1aWxkX3BhcmNlbF9nZXRJbnRlcmZhY2VWZXJzaW9uKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfZ2V0SW50ZXJmYWNlVmVyc2lvbigmc2VsZiwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDxpMzI+IHsKKyAgICBsZXQgX2FpZGxfcmVwbHkgPSBfYWlkbF9yZXBseT87CisgICAgbGV0IF9haWRsX3N0YXR1czogYmluZGVyOjpTdGF0dXMgPSBfYWlkbF9yZXBseS5yZWFkKCk/OworICAgIGlmICFfYWlkbF9zdGF0dXMuaXNfb2soKSB7IHJldHVybiBFcnIoX2FpZGxfc3RhdHVzKTsgfQorICAgIGxldCBfYWlkbF9yZXR1cm46IGkzMiA9IF9haWRsX3JlcGx5LnJlYWQoKT87CisgICAgc2VsZi5jYWNoZWRfdmVyc2lvbi5zdG9yZShfYWlkbF9yZXR1cm4sIHN0ZDo6c3luYzo6YXRvbWljOjpPcmRlcmluZzo6UmVsYXhlZCk7CisgICAgT2soX2FpZGxfcmV0dXJuKQorICB9CisgIGZuIGJ1aWxkX3BhcmNlbF9nZXRJbnRlcmZhY2VIYXNoKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfZ2V0SW50ZXJmYWNlSGFzaCgmc2VsZiwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDxTdHJpbmc+IHsKKyAgICBsZXQgX2FpZGxfcmVwbHkgPSBfYWlkbF9yZXBseT87CisgICAgbGV0IF9haWRsX3N0YXR1czogYmluZGVyOjpTdGF0dXMgPSBfYWlkbF9yZXBseS5yZWFkKCk/OworICAgIGlmICFfYWlkbF9zdGF0dXMuaXNfb2soKSB7IHJldHVybiBFcnIoX2FpZGxfc3RhdHVzKTsgfQorICAgIGxldCBfYWlkbF9yZXR1cm46IFN0cmluZyA9IF9haWRsX3JlcGx5LnJlYWQoKT87CisgICAgKnNlbGYuY2FjaGVkX2hhc2gubG9jaygpLnVud3JhcCgpID0gU29tZShfYWlkbF9yZXR1cm4uY2xvbmUoKSk7CisgICAgT2soX2FpZGxfcmV0dXJuKQorICB9Cit9CitpbXBsIElGb29JbnRlcmZhY2UgZm9yIEJwRm9vSW50ZXJmYWNlIHsKKyAgZm4gb3JpZ2luYWxBcGkoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBzZWxmLmJ1aWxkX3BhcmNlbF9vcmlnaW5hbEFwaSgpPzsKKyAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpvcmlnaW5hbEFwaSwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICBzZWxmLnJlYWRfcmVzcG9uc2Vfb3JpZ2luYWxBcGkoX2FpZGxfcmVwbHkpCisgIH0KKyAgZm4gYWNjZXB0VW5pb25BbmRSZXR1cm5TdHJpbmcoJnNlbGYsIF9hcmdfdTogJmNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF85X3ZlcnNpb25lZF81X3Rlc3RzXzhfQmF6VW5pb24pIC0+IGJpbmRlcjo6UmVzdWx0PFN0cmluZz4geworICAgIGxldCBfYWlkbF9kYXRhID0gc2VsZi5idWlsZF9wYXJjZWxfYWNjZXB0VW5pb25BbmRSZXR1cm5TdHJpbmcoX2FyZ191KT87CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6YWNjZXB0VW5pb25BbmRSZXR1cm5TdHJpbmcsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCk7CisgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX2FjY2VwdFVuaW9uQW5kUmV0dXJuU3RyaW5nKF9hcmdfdSwgX2FpZGxfcmVwbHkpCisgIH0KKyAgZm4gaWdub3JlUGFyY2VsYWJsZXNBbmRSZXBlYXRJbnQoJnNlbGYsIF9hcmdfaW5Gb286ICZjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfOV92ZXJzaW9uZWRfNV90ZXN0c18zX0ZvbywgX2FyZ19pbm91dEZvbzogJm11dCBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfOV92ZXJzaW9uZWRfNV90ZXN0c18zX0ZvbywgX2FyZ19vdXRGb286ICZtdXQgY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzlfdmVyc2lvbmVkXzVfdGVzdHNfM19Gb28sIF9hcmdfdmFsdWU6IGkzMikgLT4gYmluZGVyOjpSZXN1bHQ8aTMyPiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBzZWxmLmJ1aWxkX3BhcmNlbF9pZ25vcmVQYXJjZWxhYmxlc0FuZFJlcGVhdEludChfYXJnX2luRm9vLCBfYXJnX2lub3V0Rm9vLCBfYXJnX291dEZvbywgX2FyZ192YWx1ZSk/OworICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6Omlnbm9yZVBhcmNlbGFibGVzQW5kUmVwZWF0SW50LCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpOworICAgIHNlbGYucmVhZF9yZXNwb25zZV9pZ25vcmVQYXJjZWxhYmxlc0FuZFJlcGVhdEludChfYXJnX2luRm9vLCBfYXJnX2lub3V0Rm9vLCBfYXJnX291dEZvbywgX2FyZ192YWx1ZSwgX2FpZGxfcmVwbHkpCisgIH0KKyAgZm4gcmV0dXJuc0xlbmd0aE9mRm9vQXJyYXkoJnNlbGYsIF9hcmdfZm9vczogJltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfOV92ZXJzaW9uZWRfNV90ZXN0c18zX0Zvb10pIC0+IGJpbmRlcjo6UmVzdWx0PGkzMj4geworICAgIGxldCBfYWlkbF9kYXRhID0gc2VsZi5idWlsZF9wYXJjZWxfcmV0dXJuc0xlbmd0aE9mRm9vQXJyYXkoX2FyZ19mb29zKT87CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6cmV0dXJuc0xlbmd0aE9mRm9vQXJyYXksIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCk7CisgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX3JldHVybnNMZW5ndGhPZkZvb0FycmF5KF9hcmdfZm9vcywgX2FpZGxfcmVwbHkpCisgIH0KKyAgZm4gZ2V0SW50ZXJmYWNlVmVyc2lvbigmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8aTMyPiB7CisgICAgbGV0IF9haWRsX3ZlcnNpb24gPSBzZWxmLmNhY2hlZF92ZXJzaW9uLmxvYWQoc3RkOjpzeW5jOjphdG9taWM6Ok9yZGVyaW5nOjpSZWxheGVkKTsKKyAgICBpZiBfYWlkbF92ZXJzaW9uICE9IC0xIHsgcmV0dXJuIE9rKF9haWRsX3ZlcnNpb24pOyB9CisgICAgbGV0IF9haWRsX2RhdGEgPSBzZWxmLmJ1aWxkX3BhcmNlbF9nZXRJbnRlcmZhY2VWZXJzaW9uKCk/OworICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OmdldEludGVyZmFjZVZlcnNpb24sIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCk7CisgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX2dldEludGVyZmFjZVZlcnNpb24oX2FpZGxfcmVwbHkpCisgIH0KKyAgZm4gZ2V0SW50ZXJmYWNlSGFzaCgmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8U3RyaW5nPiB7CisgICAgeworICAgICAgbGV0IF9haWRsX2hhc2hfbG9jayA9IHNlbGYuY2FjaGVkX2hhc2gubG9jaygpLnVud3JhcCgpOworICAgICAgaWYgbGV0IFNvbWUocmVmIF9haWRsX2hhc2gpID0gKl9haWRsX2hhc2hfbG9jayB7CisgICAgICAgIHJldHVybiBPayhfYWlkbF9oYXNoLmNsb25lKCkpOworICAgICAgfQorICAgIH0KKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX2dldEludGVyZmFjZUhhc2goKT87CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6Z2V0SW50ZXJmYWNlSGFzaCwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICBzZWxmLnJlYWRfcmVzcG9uc2VfZ2V0SW50ZXJmYWNlSGFzaChfYWlkbF9yZXBseSkKKyAgfQorfQoraW1wbDxQOiBiaW5kZXI6OkJpbmRlckFzeW5jUG9vbD4gSUZvb0ludGVyZmFjZUFzeW5jPFA+IGZvciBCcEZvb0ludGVyZmFjZSB7CisgIGZuIG9yaWdpbmFsQXBpPCdhPigmJ2Egc2VsZikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PCgpPj4geworICAgIGxldCBfYWlkbF9kYXRhID0gbWF0Y2ggc2VsZi5idWlsZF9wYXJjZWxfb3JpZ2luYWxBcGkoKSB7CisgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgIH07CisgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgUDo6c3Bhd24oCisgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpvcmlnaW5hbEFwaSwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKSwKKyAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX29yaWdpbmFsQXBpKF9haWRsX3JlcGx5KQorICAgICAgfQorICAgICkKKyAgfQorICBmbiBhY2NlcHRVbmlvbkFuZFJldHVyblN0cmluZzwnYT4oJidhIHNlbGYsIF9hcmdfdTogJidhIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF85X3ZlcnNpb25lZF81X3Rlc3RzXzhfQmF6VW5pb24pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxTdHJpbmc+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF9hY2NlcHRVbmlvbkFuZFJldHVyblN0cmluZyhfYXJnX3UpIHsKKyAgICAgIE9rKF9haWRsX2RhdGEpID0+IF9haWRsX2RhdGEsCisgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgfTsKKyAgICBsZXQgYmluZGVyID0gc2VsZi5iaW5kZXIuY2xvbmUoKTsKKyAgICBQOjpzcGF3bigKKyAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OmFjY2VwdFVuaW9uQW5kUmV0dXJuU3RyaW5nLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpLAorICAgICAgbW92ZSB8X2FpZGxfcmVwbHl8IGFzeW5jIG1vdmUgeworICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfYWNjZXB0VW5pb25BbmRSZXR1cm5TdHJpbmcoX2FyZ191LCBfYWlkbF9yZXBseSkKKyAgICAgIH0KKyAgICApCisgIH0KKyAgZm4gaWdub3JlUGFyY2VsYWJsZXNBbmRSZXBlYXRJbnQ8J2E+KCYnYSBzZWxmLCBfYXJnX2luRm9vOiAmJ2EgY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzlfdmVyc2lvbmVkXzVfdGVzdHNfM19Gb28sIF9hcmdfaW5vdXRGb286ICYnYSBtdXQgY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzlfdmVyc2lvbmVkXzVfdGVzdHNfM19Gb28sIF9hcmdfb3V0Rm9vOiAmJ2EgbXV0IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF85X3ZlcnNpb25lZF81X3Rlc3RzXzNfRm9vLCBfYXJnX3ZhbHVlOiBpMzIpIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxpMzI+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF9pZ25vcmVQYXJjZWxhYmxlc0FuZFJlcGVhdEludChfYXJnX2luRm9vLCBfYXJnX2lub3V0Rm9vLCBfYXJnX291dEZvbywgX2FyZ192YWx1ZSkgeworICAgICAgT2soX2FpZGxfZGF0YSkgPT4gX2FpZGxfZGF0YSwKKyAgICAgIEVycihlcnIpID0+IHJldHVybiBCb3g6OnBpbihzdGQ6OmZ1dHVyZTo6cmVhZHkoRXJyKGVycikpKSwKKyAgICB9OworICAgIGxldCBiaW5kZXIgPSBzZWxmLmJpbmRlci5jbG9uZSgpOworICAgIFA6OnNwYXduKAorICAgICAgbW92ZSB8fCBiaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6aWdub3JlUGFyY2VsYWJsZXNBbmRSZXBlYXRJbnQsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICBtb3ZlIHxfYWlkbF9yZXBseXwgYXN5bmMgbW92ZSB7CisgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9pZ25vcmVQYXJjZWxhYmxlc0FuZFJlcGVhdEludChfYXJnX2luRm9vLCBfYXJnX2lub3V0Rm9vLCBfYXJnX291dEZvbywgX2FyZ192YWx1ZSwgX2FpZGxfcmVwbHkpCisgICAgICB9CisgICAgKQorICB9CisgIGZuIHJldHVybnNMZW5ndGhPZkZvb0FycmF5PCdhPigmJ2Egc2VsZiwgX2FyZ19mb29zOiAmJ2EgW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF85X3ZlcnNpb25lZF81X3Rlc3RzXzNfRm9vXSkgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PGkzMj4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX3JldHVybnNMZW5ndGhPZkZvb0FycmF5KF9hcmdfZm9vcykgeworICAgICAgT2soX2FpZGxfZGF0YSkgPT4gX2FpZGxfZGF0YSwKKyAgICAgIEVycihlcnIpID0+IHJldHVybiBCb3g6OnBpbihzdGQ6OmZ1dHVyZTo6cmVhZHkoRXJyKGVycikpKSwKKyAgICB9OworICAgIGxldCBiaW5kZXIgPSBzZWxmLmJpbmRlci5jbG9uZSgpOworICAgIFA6OnNwYXduKAorICAgICAgbW92ZSB8fCBiaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6cmV0dXJuc0xlbmd0aE9mRm9vQXJyYXksIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICBtb3ZlIHxfYWlkbF9yZXBseXwgYXN5bmMgbW92ZSB7CisgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9yZXR1cm5zTGVuZ3RoT2ZGb29BcnJheShfYXJnX2Zvb3MsIF9haWRsX3JlcGx5KQorICAgICAgfQorICAgICkKKyAgfQorICBmbiBnZXRJbnRlcmZhY2VWZXJzaW9uPCdhPigmJ2Egc2VsZikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PGkzMj4+IHsKKyAgICBsZXQgX2FpZGxfdmVyc2lvbiA9IHNlbGYuY2FjaGVkX3ZlcnNpb24ubG9hZChzdGQ6OnN5bmM6OmF0b21pYzo6T3JkZXJpbmc6OlJlbGF4ZWQpOworICAgIGlmIF9haWRsX3ZlcnNpb24gIT0gLTEgeyByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KE9rKF9haWRsX3ZlcnNpb24pKSk7IH0KKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX2dldEludGVyZmFjZVZlcnNpb24oKSB7CisgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgIH07CisgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgUDo6c3Bhd24oCisgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpnZXRJbnRlcmZhY2VWZXJzaW9uLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpLAorICAgICAgbW92ZSB8X2FpZGxfcmVwbHl8IGFzeW5jIG1vdmUgeworICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfZ2V0SW50ZXJmYWNlVmVyc2lvbihfYWlkbF9yZXBseSkKKyAgICAgIH0KKyAgICApCisgIH0KKyAgZm4gZ2V0SW50ZXJmYWNlSGFzaDwnYT4oJidhIHNlbGYpIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxTdHJpbmc+PiB7CisgICAgeworICAgICAgbGV0IF9haWRsX2hhc2hfbG9jayA9IHNlbGYuY2FjaGVkX2hhc2gubG9jaygpLnVud3JhcCgpOworICAgICAgaWYgbGV0IFNvbWUocmVmIF9haWRsX2hhc2gpID0gKl9haWRsX2hhc2hfbG9jayB7CisgICAgICAgIHJldHVybiBCb3g6OnBpbihzdGQ6OmZ1dHVyZTo6cmVhZHkoT2soX2FpZGxfaGFzaC5jbG9uZSgpKSkpOworICAgICAgfQorICAgIH0KKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX2dldEludGVyZmFjZUhhc2goKSB7CisgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgIH07CisgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgUDo6c3Bhd24oCisgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpnZXRJbnRlcmZhY2VIYXNoLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpLAorICAgICAgbW92ZSB8X2FpZGxfcmVwbHl8IGFzeW5jIG1vdmUgeworICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfZ2V0SW50ZXJmYWNlSGFzaChfYWlkbF9yZXBseSkKKyAgICAgIH0KKyAgICApCisgIH0KK30KK2ltcGwgSUZvb0ludGVyZmFjZSBmb3IgYmluZGVyOjpiaW5kZXJfaW1wbDo6QmluZGVyPEJuRm9vSW50ZXJmYWNlPiB7CisgIGZuIG9yaWdpbmFsQXBpKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4geyBzZWxmLjAub3JpZ2luYWxBcGkoKSB9CisgIGZuIGFjY2VwdFVuaW9uQW5kUmV0dXJuU3RyaW5nKCZzZWxmLCBfYXJnX3U6ICZjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfOV92ZXJzaW9uZWRfNV90ZXN0c184X0JhelVuaW9uKSAtPiBiaW5kZXI6OlJlc3VsdDxTdHJpbmc+IHsgc2VsZi4wLmFjY2VwdFVuaW9uQW5kUmV0dXJuU3RyaW5nKF9hcmdfdSkgfQorICBmbiBpZ25vcmVQYXJjZWxhYmxlc0FuZFJlcGVhdEludCgmc2VsZiwgX2FyZ19pbkZvbzogJmNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF85X3ZlcnNpb25lZF81X3Rlc3RzXzNfRm9vLCBfYXJnX2lub3V0Rm9vOiAmbXV0IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF85X3ZlcnNpb25lZF81X3Rlc3RzXzNfRm9vLCBfYXJnX291dEZvbzogJm11dCBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfOV92ZXJzaW9uZWRfNV90ZXN0c18zX0ZvbywgX2FyZ192YWx1ZTogaTMyKSAtPiBiaW5kZXI6OlJlc3VsdDxpMzI+IHsgc2VsZi4wLmlnbm9yZVBhcmNlbGFibGVzQW5kUmVwZWF0SW50KF9hcmdfaW5Gb28sIF9hcmdfaW5vdXRGb28sIF9hcmdfb3V0Rm9vLCBfYXJnX3ZhbHVlKSB9CisgIGZuIHJldHVybnNMZW5ndGhPZkZvb0FycmF5KCZzZWxmLCBfYXJnX2Zvb3M6ICZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzlfdmVyc2lvbmVkXzVfdGVzdHNfM19Gb29dKSAtPiBiaW5kZXI6OlJlc3VsdDxpMzI+IHsgc2VsZi4wLnJldHVybnNMZW5ndGhPZkZvb0FycmF5KF9hcmdfZm9vcykgfQorICBmbiBnZXRJbnRlcmZhY2VWZXJzaW9uKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxpMzI+IHsgc2VsZi4wLmdldEludGVyZmFjZVZlcnNpb24oKSB9CisgIGZuIGdldEludGVyZmFjZUhhc2goJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PFN0cmluZz4geyBzZWxmLjAuZ2V0SW50ZXJmYWNlSGFzaCgpIH0KK30KK2ZuIG9uX3RyYW5zYWN0KF9haWRsX3NlcnZpY2U6ICZkeW4gSUZvb0ludGVyZmFjZSwgX2FpZGxfY29kZTogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlLCBfYWlkbF9kYXRhOiAmYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWw8J18+LCBfYWlkbF9yZXBseTogJm11dCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbDwnXz4pIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4geworICBtYXRjaCBfYWlkbF9jb2RlIHsKKyAgICB0cmFuc2FjdGlvbnM6Om9yaWdpbmFsQXBpID0+IHsKKyAgICAgIGxldCBfYWlkbF9yZXR1cm4gPSBfYWlkbF9zZXJ2aWNlLm9yaWdpbmFsQXBpKCk7CisgICAgICBtYXRjaCAmX2FpZGxfcmV0dXJuIHsKKyAgICAgICAgT2soX2FpZGxfcmV0dXJuKSA9PiB7CisgICAgICAgICAgX2FpZGxfcmVwbHkud3JpdGUoJmJpbmRlcjo6U3RhdHVzOjpmcm9tKGJpbmRlcjo6U3RhdHVzQ29kZTo6T0spKT87CisgICAgICAgIH0KKyAgICAgICAgRXJyKF9haWRsX3N0YXR1cykgPT4gX2FpZGxfcmVwbHkud3JpdGUoX2FpZGxfc3RhdHVzKT8KKyAgICAgIH0KKyAgICAgIE9rKCgpKQorICAgIH0KKyAgICB0cmFuc2FjdGlvbnM6OmFjY2VwdFVuaW9uQW5kUmV0dXJuU3RyaW5nID0+IHsKKyAgICAgIGxldCBfYXJnX3U6IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF85X3ZlcnNpb25lZF81X3Rlc3RzXzhfQmF6VW5pb24gPSBfYWlkbF9kYXRhLnJlYWQoKT87CisgICAgICBsZXQgX2FpZGxfcmV0dXJuID0gX2FpZGxfc2VydmljZS5hY2NlcHRVbmlvbkFuZFJldHVyblN0cmluZygmX2FyZ191KTsKKyAgICAgIG1hdGNoICZfYWlkbF9yZXR1cm4geworICAgICAgICBPayhfYWlkbF9yZXR1cm4pID0+IHsKKyAgICAgICAgICBfYWlkbF9yZXBseS53cml0ZSgmYmluZGVyOjpTdGF0dXM6OmZyb20oYmluZGVyOjpTdGF0dXNDb2RlOjpPSykpPzsKKyAgICAgICAgICBfYWlkbF9yZXBseS53cml0ZShfYWlkbF9yZXR1cm4pPzsKKyAgICAgICAgfQorICAgICAgICBFcnIoX2FpZGxfc3RhdHVzKSA9PiBfYWlkbF9yZXBseS53cml0ZShfYWlkbF9zdGF0dXMpPworICAgICAgfQorICAgICAgT2soKCkpCisgICAgfQorICAgIHRyYW5zYWN0aW9uczo6aWdub3JlUGFyY2VsYWJsZXNBbmRSZXBlYXRJbnQgPT4geworICAgICAgbGV0IF9hcmdfaW5Gb286IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF85X3ZlcnNpb25lZF81X3Rlc3RzXzNfRm9vID0gX2FpZGxfZGF0YS5yZWFkKCk/OworICAgICAgbGV0IG11dCBfYXJnX2lub3V0Rm9vOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfOV92ZXJzaW9uZWRfNV90ZXN0c18zX0ZvbyA9IF9haWRsX2RhdGEucmVhZCgpPzsKKyAgICAgIGxldCBtdXQgX2FyZ19vdXRGb286IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF85X3ZlcnNpb25lZF81X3Rlc3RzXzNfRm9vID0gRGVmYXVsdDo6ZGVmYXVsdCgpOworICAgICAgbGV0IF9hcmdfdmFsdWU6IGkzMiA9IF9haWRsX2RhdGEucmVhZCgpPzsKKyAgICAgIGxldCBfYWlkbF9yZXR1cm4gPSBfYWlkbF9zZXJ2aWNlLmlnbm9yZVBhcmNlbGFibGVzQW5kUmVwZWF0SW50KCZfYXJnX2luRm9vLCAmbXV0IF9hcmdfaW5vdXRGb28sICZtdXQgX2FyZ19vdXRGb28sIF9hcmdfdmFsdWUpOworICAgICAgbWF0Y2ggJl9haWRsX3JldHVybiB7CisgICAgICAgIE9rKF9haWRsX3JldHVybikgPT4geworICAgICAgICAgIF9haWRsX3JlcGx5LndyaXRlKCZiaW5kZXI6OlN0YXR1czo6ZnJvbShiaW5kZXI6OlN0YXR1c0NvZGU6Ok9LKSk/OworICAgICAgICAgIF9haWRsX3JlcGx5LndyaXRlKF9haWRsX3JldHVybik/OworICAgICAgICAgIF9haWRsX3JlcGx5LndyaXRlKCZfYXJnX2lub3V0Rm9vKT87CisgICAgICAgICAgX2FpZGxfcmVwbHkud3JpdGUoJl9hcmdfb3V0Rm9vKT87CisgICAgICAgIH0KKyAgICAgICAgRXJyKF9haWRsX3N0YXR1cykgPT4gX2FpZGxfcmVwbHkud3JpdGUoX2FpZGxfc3RhdHVzKT8KKyAgICAgIH0KKyAgICAgIE9rKCgpKQorICAgIH0KKyAgICB0cmFuc2FjdGlvbnM6OnJldHVybnNMZW5ndGhPZkZvb0FycmF5ID0+IHsKKyAgICAgIGxldCBfYXJnX2Zvb3M6IFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfOV92ZXJzaW9uZWRfNV90ZXN0c18zX0Zvbz4gPSBfYWlkbF9kYXRhLnJlYWQoKT87CisgICAgICBsZXQgX2FpZGxfcmV0dXJuID0gX2FpZGxfc2VydmljZS5yZXR1cm5zTGVuZ3RoT2ZGb29BcnJheSgmX2FyZ19mb29zKTsKKyAgICAgIG1hdGNoICZfYWlkbF9yZXR1cm4geworICAgICAgICBPayhfYWlkbF9yZXR1cm4pID0+IHsKKyAgICAgICAgICBfYWlkbF9yZXBseS53cml0ZSgmYmluZGVyOjpTdGF0dXM6OmZyb20oYmluZGVyOjpTdGF0dXNDb2RlOjpPSykpPzsKKyAgICAgICAgICBfYWlkbF9yZXBseS53cml0ZShfYWlkbF9yZXR1cm4pPzsKKyAgICAgICAgfQorICAgICAgICBFcnIoX2FpZGxfc3RhdHVzKSA9PiBfYWlkbF9yZXBseS53cml0ZShfYWlkbF9zdGF0dXMpPworICAgICAgfQorICAgICAgT2soKCkpCisgICAgfQorICAgIHRyYW5zYWN0aW9uczo6Z2V0SW50ZXJmYWNlVmVyc2lvbiA9PiB7CisgICAgICBsZXQgX2FpZGxfcmV0dXJuID0gX2FpZGxfc2VydmljZS5nZXRJbnRlcmZhY2VWZXJzaW9uKCk7CisgICAgICBtYXRjaCAmX2FpZGxfcmV0dXJuIHsKKyAgICAgICAgT2soX2FpZGxfcmV0dXJuKSA9PiB7CisgICAgICAgICAgX2FpZGxfcmVwbHkud3JpdGUoJmJpbmRlcjo6U3RhdHVzOjpmcm9tKGJpbmRlcjo6U3RhdHVzQ29kZTo6T0spKT87CisgICAgICAgICAgX2FpZGxfcmVwbHkud3JpdGUoX2FpZGxfcmV0dXJuKT87CisgICAgICAgIH0KKyAgICAgICAgRXJyKF9haWRsX3N0YXR1cykgPT4gX2FpZGxfcmVwbHkud3JpdGUoX2FpZGxfc3RhdHVzKT8KKyAgICAgIH0KKyAgICAgIE9rKCgpKQorICAgIH0KKyAgICB0cmFuc2FjdGlvbnM6OmdldEludGVyZmFjZUhhc2ggPT4geworICAgICAgbGV0IF9haWRsX3JldHVybiA9IF9haWRsX3NlcnZpY2UuZ2V0SW50ZXJmYWNlSGFzaCgpOworICAgICAgbWF0Y2ggJl9haWRsX3JldHVybiB7CisgICAgICAgIE9rKF9haWRsX3JldHVybikgPT4geworICAgICAgICAgIF9haWRsX3JlcGx5LndyaXRlKCZiaW5kZXI6OlN0YXR1czo6ZnJvbShiaW5kZXI6OlN0YXR1c0NvZGU6Ok9LKSk/OworICAgICAgICAgIF9haWRsX3JlcGx5LndyaXRlKF9haWRsX3JldHVybik/OworICAgICAgICB9CisgICAgICAgIEVycihfYWlkbF9zdGF0dXMpID0+IF9haWRsX3JlcGx5LndyaXRlKF9haWRsX3N0YXR1cyk/CisgICAgICB9CisgICAgICBPaygoKSkKKyAgICB9CisgICAgXyA9PiBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKQorICB9Cit9CitwdWIoY3JhdGUpIG1vZCBtYW5nbGVkIHsKKyBwdWIgdXNlIHN1cGVyOjpJRm9vSW50ZXJmYWNlIGFzIF83X2FuZHJvaWRfNF9haWRsXzlfdmVyc2lvbmVkXzVfdGVzdHNfMTNfSUZvb0ludGVyZmFjZTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvSUZvb0ludGVyZmFjZS5ycy5kIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS1WMS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9JRm9vSW50ZXJmYWNlLnJzLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkzYzRiYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvSUZvb0ludGVyZmFjZS5ycy5kCkBAIC0wLDAgKzEsNCBAQAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYxLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0lGb29JbnRlcmZhY2UucnMgOiBcCisgIHN5c3RlbS90b29scy9haWRsL2FpZGxfYXBpL2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLzEvYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9JRm9vSW50ZXJmYWNlLmFpZGwgXAorICBzeXN0ZW0vdG9vbHMvYWlkbC9haWRsX2FwaS9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS8xL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvQmF6VW5pb24uYWlkbCBcCisgIHN5c3RlbS90b29scy9haWRsL2FpZGxfYXBpL2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLzEvYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9Gb28uYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL3RpbWVzdGFtcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtcnVzdC1zb3VyY2UvZ2VuL3RpbWVzdGFtcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi90aW1lc3RhbXAKY29weSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYxLXJ1c3Qtc291cmNlL2dlbi90aW1lc3RhbXAKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvRGF0YS5jcHAgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0RhdGEuY3BwCmluZGV4IGIzOGRhZTQuLjU5MTBlZGUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvRGF0YS5jcHAKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9EYXRhLmNwcApAQCAtMSwxNyArMSwxOCBAQAogI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC9sb2dnYWJsZS9EYXRhLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogbmFtZXNwYWNlIGFpZGwgewotCiBuYW1lc3BhY2UgbG9nZ2FibGUgewotCiA6OmFuZHJvaWQ6OnN0YXR1c190IERhdGE6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIHsKICAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpPSzsKLSAgW1ttYXliZV91bnVzZWRdXSBzaXplX3QgX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKLSAgaW50MzJfdCBfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplID0gX2FpZGxfcGFyY2VsLT5yZWFkSW50MzIoKTsKLSAgaWYgKF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPCAwKSByZXR1cm4gOjphbmRyb2lkOjpCQURfVkFMVUU7Ci0gIFtbbWF5YmVfdW51c2VkXV0gc2l6ZV90IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4oX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSk7CisgIHNpemVfdCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPSAwOworICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkSW50MzIoJl9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPCA0KSByZXR1cm4gOjphbmRyb2lkOjpCQURfVkFMVUU7CisgIHNpemVfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUpOwogICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gU0laRV9NQVggLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKICAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CiAgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKQEAgLTQ4LDcgKzQ5LDYgQEAKICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CiB9Ci0KIDo6YW5kcm9pZDo6c3RhdHVzX3QgRGF0YTo6d3JpdGVUb1BhcmNlbCg6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCB7CiAgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CiAgIGF1dG8gX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKQEAgLTc1LDkgKzc1LDYgQEAKICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfZW5kX3Bvcyk7CiAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwogfQotCiB9ICAvLyBuYW1lc3BhY2UgbG9nZ2FibGUKLQogfSAgLy8gbmFtZXNwYWNlIGFpZGwKLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvSUxvZ2dhYmxlSW50ZXJmYWNlLmNwcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvSUxvZ2dhYmxlSW50ZXJmYWNlLmNwcAppbmRleCA5MzFkOWIxLi42NzZkNzhhIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0lMb2dnYWJsZUludGVyZmFjZS5jcHAKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9JTG9nZ2FibGVJbnRlcmZhY2UuY3BwCkBAIC0xLDE4ICsxLDExIEBACiAjaW5jbHVkZSA8YW5kcm9pZC9haWRsL2xvZ2dhYmxlL0lMb2dnYWJsZUludGVyZmFjZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC9sb2dnYWJsZS9CcExvZ2dhYmxlSW50ZXJmYWNlLmg+Ci0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogbmFtZXNwYWNlIGFpZGwgewotCiBuYW1lc3BhY2UgbG9nZ2FibGUgewotCiBET19OT1RfRElSRUNUTFlfVVNFX01FX0lNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShMb2dnYWJsZUludGVyZmFjZSwgImFuZHJvaWQuYWlkbC5sb2dnYWJsZS5JTG9nZ2FibGVJbnRlcmZhY2UiKQotCiB9ICAvLyBuYW1lc3BhY2UgbG9nZ2FibGUKLQogfSAgLy8gbmFtZXNwYWNlIGFpZGwKLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKICNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvbG9nZ2FibGUvQnBMb2dnYWJsZUludGVyZmFjZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC9sb2dnYWJsZS9CbkxvZ2dhYmxlSW50ZXJmYWNlLmg+CkBAIC0yMiw5ICsxNSw3IEBACiAjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotCiBuYW1lc3BhY2UgYWlkbCB7Ci0KIG5hbWVzcGFjZSBsb2dnYWJsZSB7CiAKIEJwTG9nZ2FibGVJbnRlcmZhY2U6OkJwTG9nZ2FibGVJbnRlcmZhY2UoY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+JiBfYWlkbF9pbXBsKQpAQCAtMjQ2LDkgKzIzNyw3IEBACiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBsb2dnYWJsZQotCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC9sb2dnYWJsZS9CbkxvZ2dhYmxlSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgpAQCAtMjU3LDkgKzI0Niw3IEBACiAjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotCiBuYW1lc3BhY2UgYWlkbCB7Ci0KIG5hbWVzcGFjZSBsb2dnYWJsZSB7CiAKIEJuTG9nZ2FibGVJbnRlcmZhY2U6OkJuTG9nZ2FibGVJbnRlcmZhY2UoKQpAQCAtNDA4LDYgKzM5NSwxMCBAQAogICAgICAgX3RyYW5zYWN0aW9uX2xvZy5pbnB1dF9hcmdzLmVtcGxhY2VfYmFjaygiaW5fcGZkQXJyYXkiLCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbl9wZmRBcnJheSkpOwogICAgIH0KICAgICBhdXRvIF9sb2dfc3RhcnQgPSBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKTsKKyAgICBpZiAoYXV0byBzdCA9IF9haWRsX2RhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7ICFzdC5pc09rKCkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBzdC53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICAgIGJyZWFrOworICAgIH0KICAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1cyhMb2dUaGlzKGluX2Jvb2xWYWx1ZSwgJmluX2Jvb2xBcnJheSwgaW5fYnl0ZVZhbHVlLCAmaW5fYnl0ZUFycmF5LCBpbl9jaGFyVmFsdWUsICZpbl9jaGFyQXJyYXksIGluX2ludFZhbHVlLCAmaW5faW50QXJyYXksIGluX2xvbmdWYWx1ZSwgJmluX2xvbmdBcnJheSwgaW5fZmxvYXRWYWx1ZSwgJmluX2Zsb2F0QXJyYXksIGluX2RvdWJsZVZhbHVlLCAmaW5fZG91YmxlQXJyYXksIGluX3N0cmluZ1ZhbHVlLCAmaW5fc3RyaW5nQXJyYXksICZpbl9saXN0VmFsdWUsIGluX2RhdGFWYWx1ZSwgaW5fYmluZGVyVmFsdWUsICZpbl9wZmRWYWx1ZSwgJmluX3BmZEFycmF5LCAmX2FpZGxfcmV0dXJuKSk7CiAgICAgaWYgKEJuTG9nZ2FibGVJbnRlcmZhY2U6OmxvZ0Z1bmMgIT0gbnVsbHB0cikgewogICAgICAgYXV0byBfbG9nX2VuZCA9IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpOwpAQCAtNDk4LDE1ICs0ODksMTcxIEBACiAgIGJyZWFrOwogICB9CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzID09IDo6YW5kcm9pZDo6VU5FWFBFQ1RFRF9OVUxMKSB7Ci0gICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21FeGNlcHRpb25Db2RlKDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OkVYX05VTExfUE9JTlRFUikud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21FeGNlcHRpb25Db2RlKDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OkVYX05VTExfUE9JTlRFUikud3JpdGVPdmVyUGFyY2VsKF9haWRsX3JlcGx5KTsKICAgfQogICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKIH0KIAogc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IEJuTG9nZ2FibGVJbnRlcmZhY2U6OlRyYW5zYWN0aW9uTG9nJik+IEJuTG9nZ2FibGVJbnRlcmZhY2U6OmxvZ0Z1bmM7Cit9ICAvLyBuYW1lc3BhY2UgbG9nZ2FibGUKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC9sb2dnYWJsZS9JTG9nZ2FibGVJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvbG9nZ2FibGUvSUxvZ2dhYmxlSW50ZXJmYWNlLmg+CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgbG9nZ2FibGUgeworRE9fTk9UX0RJUkVDVExZX1VTRV9NRV9JTVBMRU1FTlRfTUVUQV9ORVNURURfSU5URVJGQUNFKElMb2dnYWJsZUludGVyZmFjZSwgU3ViLCAiYW5kcm9pZC5haWRsLmxvZ2dhYmxlLklMb2dnYWJsZUludGVyZmFjZS5JU3ViIikKK30gIC8vIG5hbWVzcGFjZSBsb2dnYWJsZQorfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL2xvZ2dhYmxlL0lMb2dnYWJsZUludGVyZmFjZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC9sb2dnYWJsZS9JTG9nZ2FibGVJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL21hY3Jvcy5oPgorI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgbG9nZ2FibGUgeworCitJTG9nZ2FibGVJbnRlcmZhY2U6OkJwU3ViOjpCcFN1Yihjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4mIF9haWRsX2ltcGwpCisgICAgOiBCcEludGVyZmFjZTxJU3ViPihfYWlkbF9pbXBsKXsKK30KKworc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IElMb2dnYWJsZUludGVyZmFjZTo6QnBTdWI6OlRyYW5zYWN0aW9uTG9nJik+IElMb2dnYWJsZUludGVyZmFjZTo6QnBTdWI6OmxvZ0Z1bmM7CisKKzo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgSUxvZ2dhYmxlSW50ZXJmYWNlOjpCcFN1Yjo6TG9nKGludDMyX3QgdmFsdWUpIHsKKyAgOjphbmRyb2lkOjpQYXJjZWwgX2FpZGxfZGF0YTsKKyAgX2FpZGxfZGF0YS5tYXJrRm9yQmluZGVyKHJlbW90ZVN0cm9uZygpKTsKKyAgOjphbmRyb2lkOjpQYXJjZWwgX2FpZGxfcmVwbHk7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzOworICA6OmFuZHJvaWQ6OlNjb3BlZFRyYWNlIF9haWRsX3RyYWNlKEFUUkFDRV9UQUdfQUlETCwgIkFJREw6OmNwcDo6SVN1Yjo6TG9nOjpjcHBDbGllbnQiKTsKKyAgSUxvZ2dhYmxlSW50ZXJmYWNlOjpCcFN1Yjo6VHJhbnNhY3Rpb25Mb2cgX3RyYW5zYWN0aW9uX2xvZzsKKyAgaWYgKElMb2dnYWJsZUludGVyZmFjZTo6QnBTdWI6OmxvZ0Z1bmMgIT0gbnVsbHB0cikgeworICAgIF90cmFuc2FjdGlvbl9sb2cuaW5wdXRfYXJncy5lbXBsYWNlX2JhY2soInZhbHVlIiwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcodmFsdWUpKTsKKyAgfQorICBhdXRvIF9sb2dfc3RhcnQgPSBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZUludDMyKHZhbHVlKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChJTG9nZ2FibGVJbnRlcmZhY2U6OkJuU3ViOjpUUkFOU0FDVElPTl9Mb2csIF9haWRsX2RhdGEsICZfYWlkbF9yZXBseSwgMCk7CisgIGlmIChVTkxJS0VMWShfYWlkbF9yZXRfc3RhdHVzID09IDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTiAmJiBJU3ViOjpnZXREZWZhdWx0SW1wbCgpKSkgeworICAgICByZXR1cm4gSVN1Yjo6Z2V0RGVmYXVsdEltcGwoKS0+TG9nKHZhbHVlKTsKKyAgfQorICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLnJlYWRGcm9tUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgaWYgKCFfYWlkbF9zdGF0dXMuaXNPaygpKSB7CisgICAgcmV0dXJuIF9haWRsX3N0YXR1czsKKyAgfQorICBfYWlkbF9lcnJvcjoKKyAgX2FpZGxfc3RhdHVzLnNldEZyb21TdGF0dXNUKF9haWRsX3JldF9zdGF0dXMpOworICBpZiAoSUxvZ2dhYmxlSW50ZXJmYWNlOjpCcFN1Yjo6bG9nRnVuYyAhPSBudWxscHRyKSB7CisgICAgYXV0byBfbG9nX2VuZCA9IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpOworICAgIF90cmFuc2FjdGlvbl9sb2cuZHVyYXRpb25fbXMgPSBzdGQ6OmNocm9ubzo6ZHVyYXRpb248ZG91YmxlLCBzdGQ6Om1pbGxpPihfbG9nX2VuZCAtIF9sb2dfc3RhcnQpLmNvdW50KCk7CisgICAgX3RyYW5zYWN0aW9uX2xvZy5pbnRlcmZhY2VfbmFtZSA9ICJhbmRyb2lkLmFpZGwubG9nZ2FibGUuSUxvZ2dhYmxlSW50ZXJmYWNlLklTdWIiOworICAgIF90cmFuc2FjdGlvbl9sb2cubWV0aG9kX25hbWUgPSAiTG9nIjsKKyAgICBfdHJhbnNhY3Rpb25fbG9nLnN0dWJfYWRkcmVzcyA9IG51bGxwdHI7CisgICAgX3RyYW5zYWN0aW9uX2xvZy5wcm94eV9hZGRyZXNzID0gc3RhdGljX2Nhc3Q8Y29uc3Qgdm9pZCo+KHRoaXMpOworICAgIF90cmFuc2FjdGlvbl9sb2cuZXhjZXB0aW9uX2NvZGUgPSBfYWlkbF9zdGF0dXMuZXhjZXB0aW9uQ29kZSgpOworICAgIF90cmFuc2FjdGlvbl9sb2cuZXhjZXB0aW9uX21lc3NhZ2UgPSBfYWlkbF9zdGF0dXMuZXhjZXB0aW9uTWVzc2FnZSgpOworICAgIF90cmFuc2FjdGlvbl9sb2cudHJhbnNhY3Rpb25fZXJyb3IgPSBfYWlkbF9zdGF0dXMudHJhbnNhY3Rpb25FcnJvcigpOworICAgIF90cmFuc2FjdGlvbl9sb2cuc2VydmljZV9zcGVjaWZpY19lcnJvcl9jb2RlID0gX2FpZGxfc3RhdHVzLnNlcnZpY2VTcGVjaWZpY0Vycm9yQ29kZSgpOworICAgIElMb2dnYWJsZUludGVyZmFjZTo6QnBTdWI6OmxvZ0Z1bmMoX3RyYW5zYWN0aW9uX2xvZyk7CisgIH0KKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KIAogfSAgLy8gbmFtZXNwYWNlIGxvZ2dhYmxlCi0KIH0gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC9sb2dnYWJsZS9JTG9nZ2FibGVJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8YmluZGVyL1N0YWJpbGl0eS5oPgorI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgogCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgbG9nZ2FibGUgeworCitJTG9nZ2FibGVJbnRlcmZhY2U6OkJuU3ViOjpCblN1YigpCit7CisgIDo6YW5kcm9pZDo6aW50ZXJuYWw6OlN0YWJpbGl0eTo6bWFya0NvbXBpbGF0aW9uVW5pdCh0aGlzKTsKK30KKworOjphbmRyb2lkOjpzdGF0dXNfdCBJTG9nZ2FibGVJbnRlcmZhY2U6OkJuU3ViOjpvblRyYW5zYWN0KHVpbnQzMl90IF9haWRsX2NvZGUsIGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsJiBfYWlkbF9kYXRhLCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcmVwbHksIHVpbnQzMl90IF9haWRsX2ZsYWdzKSB7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIHN3aXRjaCAoX2FpZGxfY29kZSkgeworICBjYXNlIEJuU3ViOjpUUkFOU0FDVElPTl9Mb2c6CisgIHsKKyAgICBpbnQzMl90IGluX3ZhbHVlOworICAgIGlmICghKF9haWRsX2RhdGEuY2hlY2tJbnRlcmZhY2UodGhpcykpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpCQURfVFlQRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICA6OmFuZHJvaWQ6OlNjb3BlZFRyYWNlIF9haWRsX3RyYWNlKEFUUkFDRV9UQUdfQUlETCwgIkFJREw6OmNwcDo6SVN1Yjo6TG9nOjpjcHBTZXJ2ZXIiKTsKKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS5yZWFkSW50MzIoJmluX3ZhbHVlKTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgSUxvZ2dhYmxlSW50ZXJmYWNlOjpCblN1Yjo6VHJhbnNhY3Rpb25Mb2cgX3RyYW5zYWN0aW9uX2xvZzsKKyAgICBpZiAoSUxvZ2dhYmxlSW50ZXJmYWNlOjpCblN1Yjo6bG9nRnVuYyAhPSBudWxscHRyKSB7CisgICAgICBfdHJhbnNhY3Rpb25fbG9nLmlucHV0X2FyZ3MuZW1wbGFjZV9iYWNrKCJpbl92YWx1ZSIsIDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGluX3ZhbHVlKSk7CisgICAgfQorICAgIGF1dG8gX2xvZ19zdGFydCA9IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpOworICAgIGlmIChhdXRvIHN0ID0gX2FpZGxfZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsgIXN0LmlzT2soKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IHN0LndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzKExvZyhpbl92YWx1ZSkpOworICAgIGlmIChJTG9nZ2FibGVJbnRlcmZhY2U6OkJuU3ViOjpsb2dGdW5jICE9IG51bGxwdHIpIHsKKyAgICAgIGF1dG8gX2xvZ19lbmQgPSBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKTsKKyAgICAgIF90cmFuc2FjdGlvbl9sb2cuZHVyYXRpb25fbXMgPSBzdGQ6OmNocm9ubzo6ZHVyYXRpb248ZG91YmxlLCBzdGQ6Om1pbGxpPihfbG9nX2VuZCAtIF9sb2dfc3RhcnQpLmNvdW50KCk7CisgICAgICBfdHJhbnNhY3Rpb25fbG9nLmludGVyZmFjZV9uYW1lID0gImFuZHJvaWQuYWlkbC5sb2dnYWJsZS5JTG9nZ2FibGVJbnRlcmZhY2UuSVN1YiI7CisgICAgICBfdHJhbnNhY3Rpb25fbG9nLm1ldGhvZF9uYW1lID0gIkxvZyI7CisgICAgICBfdHJhbnNhY3Rpb25fbG9nLnN0dWJfYWRkcmVzcyA9IHN0YXRpY19jYXN0PGNvbnN0IHZvaWQqPih0aGlzKTsKKyAgICAgIF90cmFuc2FjdGlvbl9sb2cucHJveHlfYWRkcmVzcyA9IG51bGxwdHI7CisgICAgICBfdHJhbnNhY3Rpb25fbG9nLmV4Y2VwdGlvbl9jb2RlID0gX2FpZGxfc3RhdHVzLmV4Y2VwdGlvbkNvZGUoKTsKKyAgICAgIF90cmFuc2FjdGlvbl9sb2cuZXhjZXB0aW9uX21lc3NhZ2UgPSBfYWlkbF9zdGF0dXMuZXhjZXB0aW9uTWVzc2FnZSgpOworICAgICAgX3RyYW5zYWN0aW9uX2xvZy50cmFuc2FjdGlvbl9lcnJvciA9IF9haWRsX3N0YXR1cy50cmFuc2FjdGlvbkVycm9yKCk7CisgICAgICBfdHJhbnNhY3Rpb25fbG9nLnNlcnZpY2Vfc3BlY2lmaWNfZXJyb3JfY29kZSA9IF9haWRsX3N0YXR1cy5zZXJ2aWNlU3BlY2lmaWNFcnJvckNvZGUoKTsKKyAgICAgIElMb2dnYWJsZUludGVyZmFjZTo6Qm5TdWI6OmxvZ0Z1bmMoX3RyYW5zYWN0aW9uX2xvZyk7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICghX2FpZGxfc3RhdHVzLmlzT2soKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGJyZWFrOworICBkZWZhdWx0OgorICB7CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6QkJpbmRlcjo6b25UcmFuc2FjdChfYWlkbF9jb2RlLCBfYWlkbF9kYXRhLCBfYWlkbF9yZXBseSwgX2FpZGxfZmxhZ3MpOworICB9CisgIGJyZWFrOworICB9CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzID09IDo6YW5kcm9pZDo6VU5FWFBFQ1RFRF9OVUxMKSB7CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21FeGNlcHRpb25Db2RlKDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OkVYX05VTExfUE9JTlRFUikud3JpdGVPdmVyUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgfQorICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KKworc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IElMb2dnYWJsZUludGVyZmFjZTo6Qm5TdWI6OlRyYW5zYWN0aW9uTG9nJik+IElMb2dnYWJsZUludGVyZmFjZTo6Qm5TdWI6OmxvZ0Z1bmM7Cit9ICAvLyBuYW1lc3BhY2UgbG9nZ2FibGUKK30gIC8vIG5hbWVzcGFjZSBhaWRsCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9JTG9nZ2FibGVJbnRlcmZhY2UuY3BwLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0lMb2dnYWJsZUludGVyZmFjZS5jcHAuZAppbmRleCA0ZjdhMjVmLi5hYzc5YWU4IDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0lMb2dnYWJsZUludGVyZmFjZS5jcHAuZAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0lMb2dnYWJsZUludGVyZmFjZS5jcHAuZApAQCAtMSwzICsxLDUgQEAKIG91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9JTG9nZ2FibGVJbnRlcmZhY2UuY3BwIDogXAogICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvSUxvZ2dhYmxlSW50ZXJmYWNlLmFpZGwgXAotICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvRGF0YS5haWRsCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9EYXRhLmFpZGwgXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvVW5pb24uYWlkbCBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9FbnVtLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvVW5pb24uY3BwIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9Vbmlvbi5jcHAKaW5kZXggNGVjMDY4My4uMDllMWNjNSAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9Vbmlvbi5jcHAKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9Vbmlvbi5jcHAKQEAgLTEsMTYgKzEsMTMgQEAKICNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvbG9nZ2FibGUvVW5pb24uaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotCiBuYW1lc3BhY2UgYWlkbCB7Ci0KIG5hbWVzcGFjZSBsb2dnYWJsZSB7Ci0KIDo6YW5kcm9pZDo6c3RhdHVzX3QgVW5pb246OnJlYWRGcm9tUGFyY2VsKGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIHsKICAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzOwogICBpbnQzMl90IF9haWRsX3RhZzsKICAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkSW50MzIoJl9haWRsX3RhZykpICE9IDo6YW5kcm9pZDo6T0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotICBzd2l0Y2ggKF9haWRsX3RhZykgeworICBzd2l0Y2ggKHN0YXRpY19jYXN0PFRhZz4oX2FpZGxfdGFnKSkgewogICBjYXNlIG51bTogewogICAgIGludDMyX3QgX2FpZGxfdmFsdWU7CiAgICAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkSW50MzIoJl9haWRsX3ZhbHVlKSkgIT0gOjphbmRyb2lkOjpPSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CkBAIC0zNCw5ICszMSw4IEBACiAgIH0KICAgcmV0dXJuIDo6YW5kcm9pZDo6QkFEX1ZBTFVFOwogfQotCiA6OmFuZHJvaWQ6OnN0YXR1c190IFVuaW9uOjp3cml0ZVRvUGFyY2VsKDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IHsKLSAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUludDMyKGdldFRhZygpKTsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KGdldFRhZygpKSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IDo6YW5kcm9pZDo6T0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwogICBzd2l0Y2ggKGdldFRhZygpKSB7CiAgIGNhc2UgbnVtOiByZXR1cm4gX2FpZGxfcGFyY2VsLT53cml0ZUludDMyKGdldDxudW0+KCkpOwpAQCAtNDQsOSArNDAsNiBAQAogICB9CiAgIF9fYXNzZXJ0MihfX0ZJTEVfXywgX19MSU5FX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18sICJjYW4ndCByZWFjaCBoZXJlIik7CiB9Ci0KIH0gIC8vIG5hbWVzcGFjZSBsb2dnYWJsZQotCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0JuTG9nZ2FibGVJbnRlcmZhY2UuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9CbkxvZ2dhYmxlSW50ZXJmYWNlLmgKaW5kZXggNGU2Y2E4Yy4uNDc1MDY4ZSAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0JuTG9nZ2FibGVJbnRlcmZhY2UuaAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvQm5Mb2dnYWJsZUludGVyZmFjZS5oCkBAIC02LDExICs2LDggQEAKICNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl90b19zdHJpbmcuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotCiBuYW1lc3BhY2UgYWlkbCB7Ci0KIG5hbWVzcGFjZSBsb2dnYWJsZSB7Ci0KIGNsYXNzIEJuTG9nZ2FibGVJbnRlcmZhY2UgOiBwdWJsaWMgOjphbmRyb2lkOjpCbkludGVyZmFjZTxJTG9nZ2FibGVJbnRlcmZhY2U+IHsKIHB1YmxpYzoKICAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9Mb2dUaGlzID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMDsKQEAgLTMzLDggKzMwLDE2IEBACiAgIHN0YXRpYyBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgVHJhbnNhY3Rpb25Mb2cmKT4gbG9nRnVuYzsKIH07ICAvLyBjbGFzcyBCbkxvZ2dhYmxlSW50ZXJmYWNlCiAKK2NsYXNzIElMb2dnYWJsZUludGVyZmFjZURlbGVnYXRvciA6IHB1YmxpYyBCbkxvZ2dhYmxlSW50ZXJmYWNlIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgSUxvZ2dhYmxlSW50ZXJmYWNlRGVsZWdhdG9yKDo6YW5kcm9pZDo6c3A8SUxvZ2dhYmxlSW50ZXJmYWNlPiAmaW1wbCkgOiBfYWlkbF9kZWxlZ2F0ZShpbXBsKSB7fQorCisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgTG9nVGhpcyhib29sIGJvb2xWYWx1ZSwgOjpzdGQ6OnZlY3Rvcjxib29sPiogYm9vbEFycmF5LCBpbnQ4X3QgYnl0ZVZhbHVlLCA6OnN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBieXRlQXJyYXksIGNoYXIxNl90IGNoYXJWYWx1ZSwgOjpzdGQ6OnZlY3RvcjxjaGFyMTZfdD4qIGNoYXJBcnJheSwgaW50MzJfdCBpbnRWYWx1ZSwgOjpzdGQ6OnZlY3RvcjxpbnQzMl90PiogaW50QXJyYXksIGludDY0X3QgbG9uZ1ZhbHVlLCA6OnN0ZDo6dmVjdG9yPGludDY0X3Q+KiBsb25nQXJyYXksIGZsb2F0IGZsb2F0VmFsdWUsIDo6c3RkOjp2ZWN0b3I8ZmxvYXQ+KiBmbG9hdEFycmF5LCBkb3VibGUgZG91YmxlVmFsdWUsIDo6c3RkOjp2ZWN0b3I8ZG91YmxlPiogZG91YmxlQXJyYXksIGNvbnN0IDo6YW5kcm9pZDo6U3RyaW5nMTYmIHN0cmluZ1ZhbHVlLCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6U3RyaW5nMTY+KiBzdHJpbmdBcnJheSwgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OlN0cmluZzE2PiogbGlzdFZhbHVlLCBjb25zdCA6OmFuZHJvaWQ6OmFpZGw6OmxvZ2dhYmxlOjpEYXRhJiBkYXRhVmFsdWUsIGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiYgYmluZGVyVmFsdWUsIDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6Om9zOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj4qIHBmZFZhbHVlLCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6b3M6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPiogcGZkQXJyYXksIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpTdHJpbmcxNj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+TG9nVGhpcyhib29sVmFsdWUsIGJvb2xBcnJheSwgYnl0ZVZhbHVlLCBieXRlQXJyYXksIGNoYXJWYWx1ZSwgY2hhckFycmF5LCBpbnRWYWx1ZSwgaW50QXJyYXksIGxvbmdWYWx1ZSwgbG9uZ0FycmF5LCBmbG9hdFZhbHVlLCBmbG9hdEFycmF5LCBkb3VibGVWYWx1ZSwgZG91YmxlQXJyYXksIHN0cmluZ1ZhbHVlLCBzdHJpbmdBcnJheSwgbGlzdFZhbHVlLCBkYXRhVmFsdWUsIGJpbmRlclZhbHVlLCBwZmRWYWx1ZSwgcGZkQXJyYXksIF9haWRsX3JldHVybik7CisgIH0KK3ByaXZhdGU6CisgIDo6YW5kcm9pZDo6c3A8SUxvZ2dhYmxlSW50ZXJmYWNlPiBfYWlkbF9kZWxlZ2F0ZTsKK307ICAvLyBjbGFzcyBJTG9nZ2FibGVJbnRlcmZhY2VEZWxlZ2F0b3IKIH0gIC8vIG5hbWVzcGFjZSBsb2dnYWJsZQotCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0JwTG9nZ2FibGVJbnRlcmZhY2UuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9CcExvZ2dhYmxlSW50ZXJmYWNlLmgKaW5kZXggNzMyMTliOC4uYzM5MWRkNCAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0JwTG9nZ2FibGVJbnRlcmZhY2UuaAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvQnBMb2dnYWJsZUludGVyZmFjZS5oCkBAIC04LDExICs4LDggQEAKICNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl90b19zdHJpbmcuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotCiBuYW1lc3BhY2UgYWlkbCB7Ci0KIG5hbWVzcGFjZSBsb2dnYWJsZSB7Ci0KIGNsYXNzIEJwTG9nZ2FibGVJbnRlcmZhY2UgOiBwdWJsaWMgOjphbmRyb2lkOjpCcEludGVyZmFjZTxJTG9nZ2FibGVJbnRlcmZhY2U+IHsKIHB1YmxpYzoKICAgZXhwbGljaXQgQnBMb2dnYWJsZUludGVyZmFjZShjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4mIF9haWRsX2ltcGwpOwpAQCAtMzQsOSArMzEsNiBAQAogICB9OwogICBzdGF0aWMgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFRyYW5zYWN0aW9uTG9nJik+IGxvZ0Z1bmM7CiB9OyAgLy8gY2xhc3MgQnBMb2dnYWJsZUludGVyZmFjZQotCiB9ICAvLyBuYW1lc3BhY2UgbG9nZ2FibGUKLQogfSAgLy8gbmFtZXNwYWNlIGFpZGwKLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9EYXRhLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvRGF0YS5oCmluZGV4IDUwNWE1NjUuLjYxYjU5MGUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9EYXRhLmgKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0RhdGEuaApAQCAtMTEsMTMgKzExLDE0IEBACiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotCiBuYW1lc3BhY2UgYWlkbCB7Ci0KIG5hbWVzcGFjZSBsb2dnYWJsZSB7Ci0KIGNsYXNzIERhdGEgOiBwdWJsaWMgOjphbmRyb2lkOjpQYXJjZWxhYmxlIHsKIHB1YmxpYzoKKyAgaW50MzJfdCBudW0gPSAwOworICA6OnN0ZDo6c3RyaW5nIHN0cjsKKyAgOjphbmRyb2lkOjphaWRsOjpsb2dnYWJsZTo6VW5pb24gbmVzdGVkVW5pb247CisgIDo6YW5kcm9pZDo6YWlkbDo6bG9nZ2FibGU6OkVudW0gbmVzdGVkRW51bSA9IDo6YW5kcm9pZDo6YWlkbDo6bG9nZ2FibGU6OkVudW06OkZPTzsKICAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBEYXRhJiByaHMpIGNvbnN0IHsKICAgICByZXR1cm4gc3RkOjp0aWUobnVtLCBzdHIsIG5lc3RlZFVuaW9uLCBuZXN0ZWRFbnVtKSAhPSBzdGQ6OnRpZShyaHMubnVtLCByaHMuc3RyLCByaHMubmVzdGVkVW5pb24sIHJocy5uZXN0ZWRFbnVtKTsKICAgfQpAQCAtMzcsMTAgKzM4LDYgQEAKICAgICByZXR1cm4gc3RkOjp0aWUobnVtLCBzdHIsIG5lc3RlZFVuaW9uLCBuZXN0ZWRFbnVtKSA+PSBzdGQ6OnRpZShyaHMubnVtLCByaHMuc3RyLCByaHMubmVzdGVkVW5pb24sIHJocy5uZXN0ZWRFbnVtKTsKICAgfQogCi0gIGludDMyX3QgbnVtID0gaW50MzJfdCgwKTsKLSAgOjpzdGQ6OnN0cmluZyBzdHI7Ci0gIDo6YW5kcm9pZDo6YWlkbDo6bG9nZ2FibGU6OlVuaW9uIG5lc3RlZFVuaW9uOwotICA6OmFuZHJvaWQ6OmFpZGw6OmxvZ2dhYmxlOjpFbnVtIG5lc3RlZEVudW0gPSA6OmFuZHJvaWQ6OmFpZGw6OmxvZ2dhYmxlOjpFbnVtKDo6YW5kcm9pZDo6YWlkbDo6bG9nZ2FibGU6OkVudW06OkZPTyk7CiAgIDo6YW5kcm9pZDo6c3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgZmluYWw7CiAgIDo6YW5kcm9pZDo6c3RhdHVzX3Qgd3JpdGVUb1BhcmNlbCg6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCBmaW5hbDsKICAgc3RhdGljIGNvbnN0IDo6YW5kcm9pZDo6U3RyaW5nMTYmIGdldFBhcmNlbGFibGVEZXNjcmlwdG9yKCkgewpAQCAtNTgsOSArNTUsNiBAQAogICAgIHJldHVybiBvcy5zdHIoKTsKICAgfQogfTsgIC8vIGNsYXNzIERhdGEKLQogfSAgLy8gbmFtZXNwYWNlIGxvZ2dhYmxlCi0KIH0gIC8vIG5hbWVzcGFjZSBhaWRsCi0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvRW51bS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0VudW0uaAppbmRleCA3YjU5ODJiLi5jMTY5NjYxIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvRW51bS5oCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9FbnVtLmgKQEAgLTYsMTUgKzYsMTcgQEAKICNpbmNsdWRlIDxzdHJpbmc+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogbmFtZXNwYWNlIGFpZGwgewotCiBuYW1lc3BhY2UgbG9nZ2FibGUgewotCiBlbnVtIGNsYXNzIEVudW0gOiBpbnQ4X3QgewogICBGT08gPSA0MiwKIH07Ci0KK30gIC8vIG5hbWVzcGFjZSBsb2dnYWJsZQorfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgbG9nZ2FibGUgewogW1tub2Rpc2NhcmRdXSBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKEVudW0gdmFsKSB7CiAgIHN3aXRjaCh2YWwpIHsKICAgY2FzZSBFbnVtOjpGT086CkBAIC0yMywxNiArMjUsMTEgQEAKICAgICByZXR1cm4gc3RkOjp0b19zdHJpbmcoc3RhdGljX2Nhc3Q8aW50OF90Pih2YWwpKTsKICAgfQogfQotCiB9ICAvLyBuYW1lc3BhY2UgbG9nZ2FibGUKLQogfSAgLy8gbmFtZXNwYWNlIGFpZGwKLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogbmFtZXNwYWNlIGludGVybmFsIHsKLQogI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKICNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2MrKzE3LWV4dGVuc2lvbnMiCiB0ZW1wbGF0ZSA8PgpAQCAtNDAsNyArMzcsNSBAQAogICA6OmFuZHJvaWQ6OmFpZGw6OmxvZ2dhYmxlOjpFbnVtOjpGT08sCiB9OwogI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAotCiB9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9JTG9nZ2FibGVJbnRlcmZhY2UuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9JTG9nZ2FibGVJbnRlcmZhY2UuaAppbmRleCBjNTMyZTNkLi4yYzJjZmI5IDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvSUxvZ2dhYmxlSW50ZXJmYWNlLmgKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0lMb2dnYWJsZUludGVyZmFjZS5oCkBAIC0xLDExICsxLDEzIEBACiAjcHJhZ21hIG9uY2UKIAogI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC9sb2dnYWJsZS9EYXRhLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfdG9fc3RyaW5nLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lCaW5kZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWxGaWxlRGVzY3JpcHRvci5oPgogI2luY2x1ZGUgPGJpbmRlci9TdGF0dXMuaD4KICNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiAjaW5jbHVkZSA8b3B0aW9uYWw+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CkBAIC0xMywxNCArMTUsNzkgQEAKICNpbmNsdWRlIDx2ZWN0b3I+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogbmFtZXNwYWNlIGFpZGwgewotCiBuYW1lc3BhY2UgbG9nZ2FibGUgewotCiBjbGFzcyBJTG9nZ2FibGVJbnRlcmZhY2UgOiBwdWJsaWMgOjphbmRyb2lkOjpJSW50ZXJmYWNlIHsKIHB1YmxpYzoKICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShMb2dnYWJsZUludGVyZmFjZSkKKyAgY2xhc3MgSVN1YiA6IHB1YmxpYyA6OmFuZHJvaWQ6OklJbnRlcmZhY2UgeworICBwdWJsaWM6CisgICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShTdWIpCisgICAgdmlydHVhbCA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIExvZyhpbnQzMl90IHZhbHVlKSA9IDA7CisgIH07ICAvLyBjbGFzcyBJU3ViCisKKyAgY2xhc3MgSVN1YkRlZmF1bHQgOiBwdWJsaWMgSVN1YiB7CisgIHB1YmxpYzoKKyAgICA6OmFuZHJvaWQ6OklCaW5kZXIqIG9uQXNCaW5kZXIoKSBvdmVycmlkZSB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBMb2coaW50MzJfdCAvKnZhbHVlKi8pIG92ZXJyaWRlIHsKKyAgICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOworICAgIH0KKyAgfTsgIC8vIGNsYXNzIElTdWJEZWZhdWx0CisgIGNsYXNzIEJwU3ViIDogcHVibGljIDo6YW5kcm9pZDo6QnBJbnRlcmZhY2U8SVN1Yj4geworICBwdWJsaWM6CisgICAgZXhwbGljaXQgQnBTdWIoY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+JiBfYWlkbF9pbXBsKTsKKyAgICB2aXJ0dWFsIH5CcFN1YigpID0gZGVmYXVsdDsKKyAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIExvZyhpbnQzMl90IHZhbHVlKSBvdmVycmlkZTsKKyAgICBzdHJ1Y3QgVHJhbnNhY3Rpb25Mb2cgeworICAgICAgZG91YmxlIGR1cmF0aW9uX21zOworICAgICAgc3RkOjpzdHJpbmcgaW50ZXJmYWNlX25hbWU7CisgICAgICBzdGQ6OnN0cmluZyBtZXRob2RfbmFtZTsKKyAgICAgIGNvbnN0IHZvaWQqIHByb3h5X2FkZHJlc3M7CisgICAgICBjb25zdCB2b2lkKiBzdHViX2FkZHJlc3M7CisgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj4gaW5wdXRfYXJnczsKKyAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+PiBvdXRwdXRfYXJnczsKKyAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgICAgIHN0ZDo6c3RyaW5nIGV4Y2VwdGlvbl9tZXNzYWdlOworICAgICAgaW50MzJfdCBleGNlcHRpb25fY29kZTsKKyAgICAgIGludDMyX3QgdHJhbnNhY3Rpb25fZXJyb3I7CisgICAgICBpbnQzMl90IHNlcnZpY2Vfc3BlY2lmaWNfZXJyb3JfY29kZTsKKyAgICB9OworICAgIHN0YXRpYyBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgVHJhbnNhY3Rpb25Mb2cmKT4gbG9nRnVuYzsKKyAgfTsgIC8vIGNsYXNzIEJwU3ViCisgIGNsYXNzIEJuU3ViIDogcHVibGljIDo6YW5kcm9pZDo6Qm5JbnRlcmZhY2U8SVN1Yj4geworICBwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9Mb2cgPSA6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAwOworICAgIGV4cGxpY2l0IEJuU3ViKCk7CisgICAgOjphbmRyb2lkOjpzdGF0dXNfdCBvblRyYW5zYWN0KHVpbnQzMl90IF9haWRsX2NvZGUsIGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsJiBfYWlkbF9kYXRhLCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcmVwbHksIHVpbnQzMl90IF9haWRsX2ZsYWdzKSBvdmVycmlkZTsKKyAgICBzdHJ1Y3QgVHJhbnNhY3Rpb25Mb2cgeworICAgICAgZG91YmxlIGR1cmF0aW9uX21zOworICAgICAgc3RkOjpzdHJpbmcgaW50ZXJmYWNlX25hbWU7CisgICAgICBzdGQ6OnN0cmluZyBtZXRob2RfbmFtZTsKKyAgICAgIGNvbnN0IHZvaWQqIHByb3h5X2FkZHJlc3M7CisgICAgICBjb25zdCB2b2lkKiBzdHViX2FkZHJlc3M7CisgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj4gaW5wdXRfYXJnczsKKyAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+PiBvdXRwdXRfYXJnczsKKyAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgICAgIHN0ZDo6c3RyaW5nIGV4Y2VwdGlvbl9tZXNzYWdlOworICAgICAgaW50MzJfdCBleGNlcHRpb25fY29kZTsKKyAgICAgIGludDMyX3QgdHJhbnNhY3Rpb25fZXJyb3I7CisgICAgICBpbnQzMl90IHNlcnZpY2Vfc3BlY2lmaWNfZXJyb3JfY29kZTsKKyAgICB9OworICAgIHN0YXRpYyBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgVHJhbnNhY3Rpb25Mb2cmKT4gbG9nRnVuYzsKKyAgfTsgIC8vIGNsYXNzIEJuU3ViCisKKyAgY2xhc3MgSVN1YkRlbGVnYXRvciA6IHB1YmxpYyBCblN1YiB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBJU3ViRGVsZWdhdG9yKDo6YW5kcm9pZDo6c3A8SVN1Yj4gJmltcGwpIDogX2FpZGxfZGVsZWdhdGUoaW1wbCkge30KKworICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgTG9nKGludDMyX3QgdmFsdWUpIG92ZXJyaWRlIHsKKyAgICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+TG9nKHZhbHVlKTsKKyAgICB9CisgIHByaXZhdGU6CisgICAgOjphbmRyb2lkOjpzcDxJU3ViPiBfYWlkbF9kZWxlZ2F0ZTsKKyAgfTsgIC8vIGNsYXNzIElTdWJEZWxlZ2F0b3IKICAgdmlydHVhbCA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIExvZ1RoaXMoYm9vbCBib29sVmFsdWUsIDo6c3RkOjp2ZWN0b3I8Ym9vbD4qIGJvb2xBcnJheSwgaW50OF90IGJ5dGVWYWx1ZSwgOjpzdGQ6OnZlY3Rvcjx1aW50OF90PiogYnl0ZUFycmF5LCBjaGFyMTZfdCBjaGFyVmFsdWUsIDo6c3RkOjp2ZWN0b3I8Y2hhcjE2X3Q+KiBjaGFyQXJyYXksIGludDMyX3QgaW50VmFsdWUsIDo6c3RkOjp2ZWN0b3I8aW50MzJfdD4qIGludEFycmF5LCBpbnQ2NF90IGxvbmdWYWx1ZSwgOjpzdGQ6OnZlY3RvcjxpbnQ2NF90PiogbG9uZ0FycmF5LCBmbG9hdCBmbG9hdFZhbHVlLCA6OnN0ZDo6dmVjdG9yPGZsb2F0PiogZmxvYXRBcnJheSwgZG91YmxlIGRvdWJsZVZhbHVlLCA6OnN0ZDo6dmVjdG9yPGRvdWJsZT4qIGRvdWJsZUFycmF5LCBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiBzdHJpbmdWYWx1ZSwgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OlN0cmluZzE2Piogc3RyaW5nQXJyYXksIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpTdHJpbmcxNj4qIGxpc3RWYWx1ZSwgY29uc3QgOjphbmRyb2lkOjphaWRsOjpsb2dnYWJsZTo6RGF0YSYgZGF0YVZhbHVlLCBjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4mIGJpbmRlclZhbHVlLCA6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjpvczo6UGFyY2VsRmlsZURlc2NyaXB0b3I+KiBwZmRWYWx1ZSwgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6Om9zOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj4qIHBmZEFycmF5LCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6U3RyaW5nMTY+KiBfYWlkbF9yZXR1cm4pID0gMDsKIH07ICAvLyBjbGFzcyBJTG9nZ2FibGVJbnRlcmZhY2UKIApAQCAtMjksMTMgKzk2LDEwIEBACiAgIDo6YW5kcm9pZDo6SUJpbmRlciogb25Bc0JpbmRlcigpIG92ZXJyaWRlIHsKICAgICByZXR1cm4gbnVsbHB0cjsKICAgfQotICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIExvZ1RoaXMoYm9vbCwgOjpzdGQ6OnZlY3Rvcjxib29sPiosIGludDhfdCwgOjpzdGQ6OnZlY3Rvcjx1aW50OF90PiosIGNoYXIxNl90LCA6OnN0ZDo6dmVjdG9yPGNoYXIxNl90PiosIGludDMyX3QsIDo6c3RkOjp2ZWN0b3I8aW50MzJfdD4qLCBpbnQ2NF90LCA6OnN0ZDo6dmVjdG9yPGludDY0X3Q+KiwgZmxvYXQsIDo6c3RkOjp2ZWN0b3I8ZmxvYXQ+KiwgZG91YmxlLCA6OnN0ZDo6dmVjdG9yPGRvdWJsZT4qLCBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiwgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OlN0cmluZzE2PiosIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpTdHJpbmcxNj4qLCBjb25zdCA6OmFuZHJvaWQ6OmFpZGw6OmxvZ2dhYmxlOjpEYXRhJiwgY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+JiwgOjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6b3M6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPiosIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpvczo6UGFyY2VsRmlsZURlc2NyaXB0b3I+KiwgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OlN0cmluZzE2PiopIG92ZXJyaWRlIHsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBMb2dUaGlzKGJvb2wgLypib29sVmFsdWUqLywgOjpzdGQ6OnZlY3Rvcjxib29sPiogLypib29sQXJyYXkqLywgaW50OF90IC8qYnl0ZVZhbHVlKi8sIDo6c3RkOjp2ZWN0b3I8dWludDhfdD4qIC8qYnl0ZUFycmF5Ki8sIGNoYXIxNl90IC8qY2hhclZhbHVlKi8sIDo6c3RkOjp2ZWN0b3I8Y2hhcjE2X3Q+KiAvKmNoYXJBcnJheSovLCBpbnQzMl90IC8qaW50VmFsdWUqLywgOjpzdGQ6OnZlY3RvcjxpbnQzMl90PiogLyppbnRBcnJheSovLCBpbnQ2NF90IC8qbG9uZ1ZhbHVlKi8sIDo6c3RkOjp2ZWN0b3I8aW50NjRfdD4qIC8qbG9uZ0FycmF5Ki8sIGZsb2F0IC8qZmxvYXRWYWx1ZSovLCA6OnN0ZDo6dmVjdG9yPGZsb2F0PiogLypmbG9hdEFycmF5Ki8sIGRvdWJsZSAvKmRvdWJsZVZhbHVlKi8sIDo6c3RkOjp2ZWN0b3I8ZG91YmxlPiogLypkb3VibGVBcnJheSovLCBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiAvKnN0cmluZ1ZhbHVlKi8sIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpTdHJpbmcxNj4qIC8qc3RyaW5nQXJyYXkqLywgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OlN0cmluZzE2PiogLypsaXN0VmFsdWUqLywgY29uc3QgOjphbmRyb2lkOjphaWRsOjpsb2dnYWJsZTo6RGF0YSYgLypkYXRhVmFsdWUqLywgY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+JiAvKmJpbmRlclZhbHVlKi8sIDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6Om9zOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj4qIC8qcGZkVmFsdWUqLywgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6Om9zOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj4qIC8qcGZkQXJyYXkqLywgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OlN0cmluZzE2PiogLypfYWlkbF9yZXR1cm4qLykgb3ZlcnJpZGUgewogICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOwogICB9CiB9OyAgLy8gY2xhc3MgSUxvZ2dhYmxlSW50ZXJmYWNlRGVmYXVsdAotCiB9ICAvLyBuYW1lc3BhY2UgbG9nZ2FibGUKLQogfSAgLy8gbmFtZXNwYWNlIGFpZGwKLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9Vbmlvbi5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL1VuaW9uLmgKaW5kZXggNTg5MWJhMy4uOWI2N2U1NiAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL1VuaW9uLmgKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL1VuaW9uLmgKQEAgLTEsNiArMSw4IEBACiAjcHJhZ21hIG9uY2UKIAogI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3RvX3N0cmluZy5oPgorI2luY2x1ZGUgPGFycmF5PgorI2luY2x1ZGUgPGJpbmRlci9FbnVtcy5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KICNpbmNsdWRlIDxiaW5kZXIvU3RhdHVzLmg+CiAjaW5jbHVkZSA8Y2Fzc2VydD4KQEAgLTE2LDEzICsxOCw2MyBAQAogI2VuZGlmCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogbmFtZXNwYWNlIGFpZGwgewotCiBuYW1lc3BhY2UgbG9nZ2FibGUgewotCiBjbGFzcyBVbmlvbiA6IHB1YmxpYyA6OmFuZHJvaWQ6OlBhcmNlbGFibGUgewogcHVibGljOgorICBlbnVtIGNsYXNzIFRhZyA6IGludDMyX3QgeworICAgIG51bSA9IDAsCisgICAgc3RyID0gMSwKKyAgfTsKKyAgLy8gRXhwb3NlIHRhZyBzeW1ib2xzIGZvciBsZWdhY3kgY29kZQorICBzdGF0aWMgY29uc3QgaW5saW5lIFRhZyBudW0gPSBUYWc6Om51bTsKKyAgc3RhdGljIGNvbnN0IGlubGluZSBUYWcgc3RyID0gVGFnOjpzdHI7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICBzdGF0aWMgY29uc3RleHByIGJvb2wgX25vdF9zZWxmID0gIXN0ZDo6aXNfc2FtZV92PHN0ZDo6cmVtb3ZlX2N2X3Q8c3RkOjpyZW1vdmVfcmVmZXJlbmNlX3Q8X1RwPj4sIFVuaW9uPjsKKworICBVbmlvbigpIDogX3ZhbHVlKHN0ZDo6aW5fcGxhY2VfaW5kZXg8c3RhdGljX2Nhc3Q8c2l6ZV90PihudW0pPiwgaW50MzJfdCg0MykpIHsgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lID0gc3RkOjplbmFibGVfaWZfdDxfbm90X3NlbGY8X1RwPj4+CisgIC8vIE5PTElOVE5FWFRMSU5FKGdvb2dsZS1leHBsaWNpdC1jb25zdHJ1Y3RvcikKKyAgY29uc3RleHByIFVuaW9uKF9UcCYmIF9hcmcpCisgICAgICA6IF92YWx1ZShzdGQ6OmZvcndhcmQ8X1RwPihfYXJnKSkge30KKworICB0ZW1wbGF0ZSA8c2l6ZV90IF9OcCwgdHlwZW5hbWUuLi4gX1RwPgorICBjb25zdGV4cHIgZXhwbGljaXQgVW5pb24oc3RkOjppbl9wbGFjZV9pbmRleF90PF9OcD4sIF9UcCYmLi4uIF9hcmdzKQorICAgICAgOiBfdmFsdWUoc3RkOjppbl9wbGFjZV9pbmRleDxfTnA+LCBzdGQ6OmZvcndhcmQ8X1RwPihfYXJncykuLi4pIHt9CisKKyAgdGVtcGxhdGUgPFRhZyBfdGFnLCB0eXBlbmFtZS4uLiBfVHA+CisgIHN0YXRpYyBVbmlvbiBtYWtlKF9UcCYmLi4uIF9hcmdzKSB7CisgICAgcmV0dXJuIFVuaW9uKHN0ZDo6aW5fcGxhY2VfaW5kZXg8c3RhdGljX2Nhc3Q8c2l6ZV90PihfdGFnKT4sIHN0ZDo6Zm9yd2FyZDxfVHA+KF9hcmdzKS4uLik7CisgIH0KKworICB0ZW1wbGF0ZSA8VGFnIF90YWcsIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUuLi4gX1VwPgorICBzdGF0aWMgVW5pb24gbWFrZShzdGQ6OmluaXRpYWxpemVyX2xpc3Q8X1RwPiBfaWwsIF9VcCYmLi4uIF9hcmdzKSB7CisgICAgcmV0dXJuIFVuaW9uKHN0ZDo6aW5fcGxhY2VfaW5kZXg8c3RhdGljX2Nhc3Q8c2l6ZV90PihfdGFnKT4sIHN0ZDo6bW92ZShfaWwpLCBzdGQ6OmZvcndhcmQ8X1VwPihfYXJncykuLi4pOworICB9CisKKyAgVGFnIGdldFRhZygpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VGFnPihfdmFsdWUuaW5kZXgoKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8VGFnIF90YWc+CisgIGNvbnN0IGF1dG8mIGdldCgpIGNvbnN0IHsKKyAgICBpZiAoZ2V0VGFnKCkgIT0gX3RhZykgeyBfX2Fzc2VydDIoX19GSUxFX18sIF9fTElORV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fLCAiYmFkIGFjY2VzczogYSB3cm9uZyB0YWciKTsgfQorICAgIHJldHVybiBzdGQ6OmdldDxzdGF0aWNfY2FzdDxzaXplX3Q+KF90YWcpPihfdmFsdWUpOworICB9CisKKyAgdGVtcGxhdGUgPFRhZyBfdGFnPgorICBhdXRvJiBnZXQoKSB7CisgICAgaWYgKGdldFRhZygpICE9IF90YWcpIHsgX19hc3NlcnQyKF9fRklMRV9fLCBfX0xJTkVfXywgX19QUkVUVFlfRlVOQ1RJT05fXywgImJhZCBhY2Nlc3M6IGEgd3JvbmcgdGFnIik7IH0KKyAgICByZXR1cm4gc3RkOjpnZXQ8c3RhdGljX2Nhc3Q8c2l6ZV90PihfdGFnKT4oX3ZhbHVlKTsKKyAgfQorCisgIHRlbXBsYXRlIDxUYWcgX3RhZywgdHlwZW5hbWUuLi4gX1RwPgorICB2b2lkIHNldChfVHAmJi4uLiBfYXJncykgeworICAgIF92YWx1ZS5lbXBsYWNlPHN0YXRpY19jYXN0PHNpemVfdD4oX3RhZyk+KHN0ZDo6Zm9yd2FyZDxfVHA+KF9hcmdzKS4uLik7CisgIH0KKwogICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFVuaW9uJiByaHMpIGNvbnN0IHsKICAgICByZXR1cm4gX3ZhbHVlICE9IHJocy5fdmFsdWU7CiAgIH0KQEAgLTQyLDYwICs5NCw2IEBACiAgICAgcmV0dXJuIF92YWx1ZSA+PSByaHMuX3ZhbHVlOwogICB9CiAKLSAgZW51bSBUYWcgOiBpbnQzMl90IHsKLSAgICBudW0gPSAwLCAgLy8gaW50IG51bTsKLSAgICBzdHIsICAvLyBTdHJpbmcgc3RyOwotICB9OwotCi0gIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KLSAgc3RhdGljIGNvbnN0ZXhwciBib29sIF9ub3Rfc2VsZiA9ICFzdGQ6OmlzX3NhbWVfdjxzdGQ6OnJlbW92ZV9jdl90PHN0ZDo6cmVtb3ZlX3JlZmVyZW5jZV90PF9UcD4+LCBVbmlvbj47Ci0KLSAgVW5pb24oKSA6IF92YWx1ZShzdGQ6OmluX3BsYWNlX2luZGV4PG51bT4sIGludDMyX3QoNDMpKSB7IH0KLSAgVW5pb24oY29uc3QgVW5pb24mKSA9IGRlZmF1bHQ7Ci0gIFVuaW9uKFVuaW9uJiYpID0gZGVmYXVsdDsKLSAgVW5pb24mIG9wZXJhdG9yPShjb25zdCBVbmlvbiYpID0gZGVmYXVsdDsKLSAgVW5pb24mIG9wZXJhdG9yPShVbmlvbiYmKSA9IGRlZmF1bHQ7Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgPSBzdGQ6OmVuYWJsZV9pZl90PF9ub3Rfc2VsZjxfVHA+Pj4KLSAgLy8gTk9MSU5UTkVYVExJTkUoZ29vZ2xlLWV4cGxpY2l0LWNvbnN0cnVjdG9yKQotICBjb25zdGV4cHIgVW5pb24oX1RwJiYgX2FyZykKLSAgICAgIDogX3ZhbHVlKHN0ZDo6Zm9yd2FyZDxfVHA+KF9hcmcpKSB7fQotCi0gIHRlbXBsYXRlIDxzaXplX3QgX05wLCB0eXBlbmFtZS4uLiBfVHA+Ci0gIGNvbnN0ZXhwciBleHBsaWNpdCBVbmlvbihzdGQ6OmluX3BsYWNlX2luZGV4X3Q8X05wPiwgX1RwJiYuLi4gX2FyZ3MpCi0gICAgICA6IF92YWx1ZShzdGQ6OmluX3BsYWNlX2luZGV4PF9OcD4sIHN0ZDo6Zm9yd2FyZDxfVHA+KF9hcmdzKS4uLikge30KLQotICB0ZW1wbGF0ZSA8VGFnIF90YWcsIHR5cGVuYW1lLi4uIF9UcD4KLSAgc3RhdGljIFVuaW9uIG1ha2UoX1RwJiYuLi4gX2FyZ3MpIHsKLSAgICByZXR1cm4gVW5pb24oc3RkOjppbl9wbGFjZV9pbmRleDxfdGFnPiwgc3RkOjpmb3J3YXJkPF9UcD4oX2FyZ3MpLi4uKTsKLSAgfQotCi0gIHRlbXBsYXRlIDxUYWcgX3RhZywgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZS4uLiBfVXA+Ci0gIHN0YXRpYyBVbmlvbiBtYWtlKHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxfVHA+IF9pbCwgX1VwJiYuLi4gX2FyZ3MpIHsKLSAgICByZXR1cm4gVW5pb24oc3RkOjppbl9wbGFjZV9pbmRleDxfdGFnPiwgc3RkOjptb3ZlKF9pbCksIHN0ZDo6Zm9yd2FyZDxfVXA+KF9hcmdzKS4uLik7Ci0gIH0KLQotICBUYWcgZ2V0VGFnKCkgY29uc3QgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxUYWc+KF92YWx1ZS5pbmRleCgpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDxUYWcgX3RhZz4KLSAgY29uc3QgYXV0byYgZ2V0KCkgY29uc3QgewotICAgIGlmIChnZXRUYWcoKSAhPSBfdGFnKSB7IF9fYXNzZXJ0MihfX0ZJTEVfXywgX19MSU5FX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18sICJiYWQgYWNjZXNzOiBhIHdyb25nIHRhZyIpOyB9Ci0gICAgcmV0dXJuIHN0ZDo6Z2V0PF90YWc+KF92YWx1ZSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8VGFnIF90YWc+Ci0gIGF1dG8mIGdldCgpIHsKLSAgICBpZiAoZ2V0VGFnKCkgIT0gX3RhZykgeyBfX2Fzc2VydDIoX19GSUxFX18sIF9fTElORV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fLCAiYmFkIGFjY2VzczogYSB3cm9uZyB0YWciKTsgfQotICAgIHJldHVybiBzdGQ6OmdldDxfdGFnPihfdmFsdWUpOwotICB9Ci0KLSAgdGVtcGxhdGUgPFRhZyBfdGFnLCB0eXBlbmFtZS4uLiBfVHA+Ci0gIHZvaWQgc2V0KF9UcCYmLi4uIF9hcmdzKSB7Ci0gICAgX3ZhbHVlLmVtcGxhY2U8X3RhZz4oc3RkOjpmb3J3YXJkPF9UcD4oX2FyZ3MpLi4uKTsKLSAgfQotCiAgIDo6YW5kcm9pZDo6c3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgZmluYWw7CiAgIDo6YW5kcm9pZDo6c3RhdHVzX3Qgd3JpdGVUb1BhcmNlbCg6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCBmaW5hbDsKICAgc3RhdGljIGNvbnN0IDo6YW5kcm9pZDo6U3RyaW5nMTYmIGdldFBhcmNlbGFibGVEZXNjcmlwdG9yKCkgewpAQCAtMTE1LDkgKzExMywzNCBAQAogcHJpdmF0ZToKICAgc3RkOjp2YXJpYW50PGludDMyX3QsIDo6c3RkOjpzdHJpbmc+IF92YWx1ZTsKIH07ICAvLyBjbGFzcyBVbmlvbgotCiB9ICAvLyBuYW1lc3BhY2UgbG9nZ2FibGUKLQogfSAgLy8gbmFtZXNwYWNlIGFpZGwKLQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBsb2dnYWJsZSB7CitbW25vZGlzY2FyZF1dIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoVW5pb246OlRhZyB2YWwpIHsKKyAgc3dpdGNoKHZhbCkgeworICBjYXNlIFVuaW9uOjpUYWc6Om51bToKKyAgICByZXR1cm4gIm51bSI7CisgIGNhc2UgVW5pb246OlRhZzo6c3RyOgorICAgIHJldHVybiAic3RyIjsKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gc3RkOjp0b19zdHJpbmcoc3RhdGljX2Nhc3Q8aW50MzJfdD4odmFsKSk7CisgIH0KK30KK30gIC8vIG5hbWVzcGFjZSBsb2dnYWJsZQorfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2MrKzE3LWV4dGVuc2lvbnMiCit0ZW1wbGF0ZSA8PgorY29uc3RleHByIGlubGluZSBzdGQ6OmFycmF5PDo6YW5kcm9pZDo6YWlkbDo6bG9nZ2FibGU6OlVuaW9uOjpUYWcsIDI+IGVudW1fdmFsdWVzPDo6YW5kcm9pZDo6YWlkbDo6bG9nZ2FibGU6OlVuaW9uOjpUYWc+ID0geworICA6OmFuZHJvaWQ6OmFpZGw6OmxvZ2dhYmxlOjpVbmlvbjo6VGFnOjpudW0sCisgIDo6YW5kcm9pZDo6YWlkbDo6bG9nZ2FibGU6OlVuaW9uOjpUYWc6OnN0ciwKK307CisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9EYXRhLmphdmEgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9EYXRhLmphdmEKaW5kZXggNGUxZWJmZC4uYjAwNzJjNyAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvRGF0YS5qYXZhCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0RhdGEuamF2YQpAQCAtMjYsMTMgKzI2LDcgQEAKICAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoMCk7CiAgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KG51bSk7CiAgICAgX2FpZGxfcGFyY2VsLndyaXRlU3RyaW5nKHN0cik7Ci0gICAgaWYgKChuZXN0ZWRVbmlvbiE9bnVsbCkpIHsKLSAgICAgIF9haWRsX3BhcmNlbC53cml0ZUludCgxKTsKLSAgICAgIG5lc3RlZFVuaW9uLndyaXRlVG9QYXJjZWwoX2FpZGxfcGFyY2VsLCAwKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoMCk7Ci0gICAgfQorICAgIF9haWRsX3BhcmNlbC53cml0ZVR5cGVkT2JqZWN0KG5lc3RlZFVuaW9uLCBfYWlkbF9mbGFnKTsKICAgICBfYWlkbF9wYXJjZWwud3JpdGVCeXRlKG5lc3RlZEVudW0pOwogICAgIGludCBfYWlkbF9lbmRfcG9zID0gX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpOwogICAgIF9haWRsX3BhcmNlbC5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zKTsKQEAgLTQ0LDE4ICszOCwxMyBAQAogICAgIGludCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCk7CiAgICAgaW50IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IF9haWRsX3BhcmNlbC5yZWFkSW50KCk7CiAgICAgdHJ5IHsKLSAgICAgIGlmIChfYWlkbF9wYXJjZWxhYmxlX3NpemUgPCAwKSByZXR1cm47CisgICAgICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9zaXplIDwgNCkgdGhyb3cgbmV3IGFuZHJvaWQub3MuQmFkUGFyY2VsYWJsZUV4Y2VwdGlvbigiUGFyY2VsYWJsZSB0b28gc21hbGwiKTs7CiAgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOwogICAgICAgbnVtID0gX2FpZGxfcGFyY2VsLnJlYWRJbnQoKTsKICAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CiAgICAgICBzdHIgPSBfYWlkbF9wYXJjZWwucmVhZFN0cmluZygpOwogICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKLSAgICAgIGlmICgoMCE9X2FpZGxfcGFyY2VsLnJlYWRJbnQoKSkpIHsKLSAgICAgICAgbmVzdGVkVW5pb24gPSBhbmRyb2lkLmFpZGwubG9nZ2FibGUuVW5pb24uQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKF9haWRsX3BhcmNlbCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgbmVzdGVkVW5pb24gPSBudWxsOwotICAgICAgfQorICAgICAgbmVzdGVkVW5pb24gPSBfYWlkbF9wYXJjZWwucmVhZFR5cGVkT2JqZWN0KGFuZHJvaWQuYWlkbC5sb2dnYWJsZS5Vbmlvbi5DUkVBVE9SKTsKICAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CiAgICAgICBuZXN0ZWRFbnVtID0gX2FpZGxfcGFyY2VsLnJlYWRCeXRlKCk7CiAgICAgfSBmaW5hbGx5IHsKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0lMb2dnYWJsZUludGVyZmFjZS5qYXZhIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvSUxvZ2dhYmxlSW50ZXJmYWNlLmphdmEKaW5kZXggYmNiODAwMS4uZWUwMmE2MSAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvSUxvZ2dhYmxlSW50ZXJmYWNlLmphdmEKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvSUxvZ2dhYmxlSW50ZXJmYWNlLmphdmEKQEAgLTQ2LDYgKzQ2LDkgQEAKICAgICBAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gb25UcmFuc2FjdChpbnQgY29kZSwgYW5kcm9pZC5vcy5QYXJjZWwgZGF0YSwgYW5kcm9pZC5vcy5QYXJjZWwgcmVwbHksIGludCBmbGFncykgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCiAgICAgewogICAgICAgamF2YS5sYW5nLlN0cmluZyBkZXNjcmlwdG9yID0gREVTQ1JJUFRPUjsKKyAgICAgIGlmIChjb2RlID49IGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICYmIGNvZGUgPD0gYW5kcm9pZC5vcy5JQmluZGVyLkxBU1RfQ0FMTF9UUkFOU0FDVElPTikgeworICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoZGVzY3JpcHRvcik7CisgICAgICB9CiAgICAgICBzd2l0Y2ggKGNvZGUpCiAgICAgICB7CiAgICAgICAgIGNhc2UgSU5URVJGQUNFX1RSQU5TQUNUSU9OOgpAQCAtNjAsOSArNjMsOCBAQAogICAgICAgICB7CiAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGFuZHJvaWQub3MuVHJhY2UudHJhY2VCZWdpbihhbmRyb2lkLm9zLlRyYWNlLlRSQUNFX1RBR19BSURMLCAiQUlETDo6amF2YTo6SUxvZ2dhYmxlSW50ZXJmYWNlOjpMb2dUaGlzOjpzZXJ2ZXIiKTsKLSAgICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShkZXNjcmlwdG9yKTsKICAgICAgICAgICAgIGJvb2xlYW4gX2FyZzA7Ci0gICAgICAgICAgICBfYXJnMCA9ICgwIT1kYXRhLnJlYWRJbnQoKSk7CisgICAgICAgICAgICBfYXJnMCA9IGRhdGEucmVhZEJvb2xlYW4oKTsKICAgICAgICAgICAgIGJvb2xlYW5bXSBfYXJnMTsKICAgICAgICAgICAgIF9hcmcxID0gZGF0YS5jcmVhdGVCb29sZWFuQXJyYXkoKTsKICAgICAgICAgICAgIGJ5dGUgX2FyZzI7CkBAIC05NiwyMyArOTgsMTQgQEAKICAgICAgICAgICAgIGphdmEudXRpbC5MaXN0PGphdmEubGFuZy5TdHJpbmc+IF9hcmcxNjsKICAgICAgICAgICAgIF9hcmcxNiA9IGRhdGEuY3JlYXRlU3RyaW5nQXJyYXlMaXN0KCk7CiAgICAgICAgICAgICBhbmRyb2lkLmFpZGwubG9nZ2FibGUuRGF0YSBfYXJnMTc7Ci0gICAgICAgICAgICBpZiAoKDAhPWRhdGEucmVhZEludCgpKSkgewotICAgICAgICAgICAgICBfYXJnMTcgPSBhbmRyb2lkLmFpZGwubG9nZ2FibGUuRGF0YS5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoZGF0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgX2FyZzE3ID0gbnVsbDsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9hcmcxNyA9IGRhdGEucmVhZFR5cGVkT2JqZWN0KGFuZHJvaWQuYWlkbC5sb2dnYWJsZS5EYXRhLkNSRUFUT1IpOwogICAgICAgICAgICAgYW5kcm9pZC5vcy5JQmluZGVyIF9hcmcxODsKICAgICAgICAgICAgIF9hcmcxOCA9IGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpOwogICAgICAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvciBfYXJnMTk7Ci0gICAgICAgICAgICBpZiAoKDAhPWRhdGEucmVhZEludCgpKSkgewotICAgICAgICAgICAgICBfYXJnMTkgPSBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yLkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChkYXRhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICBfYXJnMTkgPSBudWxsOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgX2FyZzE5ID0gZGF0YS5yZWFkVHlwZWRPYmplY3QoYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvci5DUkVBVE9SKTsKICAgICAgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3JbXSBfYXJnMjA7CiAgICAgICAgICAgICBfYXJnMjAgPSBkYXRhLmNyZWF0ZVR5cGVkQXJyYXkoYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvci5DUkVBVE9SKTsKKyAgICAgICAgICAgIGRhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7CiAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nW10gX3Jlc3VsdCA9IHRoaXMuTG9nVGhpcyhfYXJnMCwgX2FyZzEsIF9hcmcyLCBfYXJnMywgX2FyZzQsIF9hcmc1LCBfYXJnNiwgX2FyZzcsIF9hcmc4LCBfYXJnOSwgX2FyZzEwLCBfYXJnMTEsIF9hcmcxMiwgX2FyZzEzLCBfYXJnMTQsIF9hcmcxNSwgX2FyZzE2LCBfYXJnMTcsIF9hcmcxOCwgX2FyZzE5LCBfYXJnMjApOwogICAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOwogICAgICAgICAgICAgcmVwbHkud3JpdGVTdHJpbmdBcnJheShfcmVzdWx0KTsKQEAgLTEyNSwyNSArMTE4LDIwIEBACiAgICAgICAgICAgICByZXBseS53cml0ZURvdWJsZUFycmF5KF9hcmcxMyk7CiAgICAgICAgICAgICByZXBseS53cml0ZVN0cmluZ0FycmF5KF9hcmcxNSk7CiAgICAgICAgICAgICByZXBseS53cml0ZVN0cmluZ0xpc3QoX2FyZzE2KTsKLSAgICAgICAgICAgIGlmICgoX2FyZzE5IT1udWxsKSkgewotICAgICAgICAgICAgICByZXBseS53cml0ZUludCgxKTsKLSAgICAgICAgICAgICAgX2FyZzE5LndyaXRlVG9QYXJjZWwocmVwbHksIGFuZHJvaWQub3MuUGFyY2VsYWJsZS5QQVJDRUxBQkxFX1dSSVRFX1JFVFVSTl9WQUxVRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgcmVwbHkud3JpdGVJbnQoMCk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICByZXBseS53cml0ZVR5cGVkT2JqZWN0KF9hcmcxOSwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLlBBUkNFTEFCTEVfV1JJVEVfUkVUVVJOX1ZBTFVFKTsKICAgICAgICAgICAgIHJlcGx5LndyaXRlVHlwZWRBcnJheShfYXJnMjAsIGFuZHJvaWQub3MuUGFyY2VsYWJsZS5QQVJDRUxBQkxFX1dSSVRFX1JFVFVSTl9WQUxVRSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICB9CiAgICAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgICBhbmRyb2lkLm9zLlRyYWNlLnRyYWNlRW5kKGFuZHJvaWQub3MuVHJhY2UuVFJBQ0VfVEFHX0FJREwpOwogICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBkZWZhdWx0OgogICAgICAgICB7CiAgICAgICAgICAgcmV0dXJuIHN1cGVyLm9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKICAgICAgICAgfQogICAgICAgfQorICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFByb3h5IGltcGxlbWVudHMgYW5kcm9pZC5haWRsLmxvZ2dhYmxlLklMb2dnYWJsZUludGVyZmFjZQogICAgIHsKQEAgLTE2OCw3ICsxNTYsNyBAQAogICAgICAgICB0cnkgewogICAgICAgICAgIGFuZHJvaWQub3MuVHJhY2UudHJhY2VCZWdpbihhbmRyb2lkLm9zLlRyYWNlLlRSQUNFX1RBR19BSURMLCAiQUlETDo6amF2YTo6SUxvZ2dhYmxlSW50ZXJmYWNlOjpMb2dUaGlzOjpjbGllbnQiKTsKICAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOwotICAgICAgICAgIF9kYXRhLndyaXRlSW50KCgoYm9vbFZhbHVlKT8oMSk6KDApKSk7CisgICAgICAgICAgX2RhdGEud3JpdGVCb29sZWFuKGJvb2xWYWx1ZSk7CiAgICAgICAgICAgX2RhdGEud3JpdGVCb29sZWFuQXJyYXkoYm9vbEFycmF5KTsKICAgICAgICAgICBfZGF0YS53cml0ZUJ5dGUoYnl0ZVZhbHVlKTsKICAgICAgICAgICBfZGF0YS53cml0ZUJ5dGVBcnJheShieXRlQXJyYXkpOwpAQCAtMTg1LDI4ICsxNzMsMTEgQEAKICAgICAgICAgICBfZGF0YS53cml0ZVN0cmluZyhzdHJpbmdWYWx1ZSk7CiAgICAgICAgICAgX2RhdGEud3JpdGVTdHJpbmdBcnJheShzdHJpbmdBcnJheSk7CiAgICAgICAgICAgX2RhdGEud3JpdGVTdHJpbmdMaXN0KGxpc3RWYWx1ZSk7Ci0gICAgICAgICAgaWYgKChkYXRhVmFsdWUhPW51bGwpKSB7Ci0gICAgICAgICAgICBfZGF0YS53cml0ZUludCgxKTsKLSAgICAgICAgICAgIGRhdGFWYWx1ZS53cml0ZVRvUGFyY2VsKF9kYXRhLCAwKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBfZGF0YS53cml0ZUludCgwKTsKLSAgICAgICAgICB9CisgICAgICAgICAgX2RhdGEud3JpdGVUeXBlZE9iamVjdChkYXRhVmFsdWUsIDApOwogICAgICAgICAgIF9kYXRhLndyaXRlU3Ryb25nQmluZGVyKGJpbmRlclZhbHVlKTsKLSAgICAgICAgICBpZiAoKHBmZFZhbHVlIT1udWxsKSkgewotICAgICAgICAgICAgX2RhdGEud3JpdGVJbnQoMSk7Ci0gICAgICAgICAgICBwZmRWYWx1ZS53cml0ZVRvUGFyY2VsKF9kYXRhLCAwKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBfZGF0YS53cml0ZUludCgwKTsKLSAgICAgICAgICB9CisgICAgICAgICAgX2RhdGEud3JpdGVUeXBlZE9iamVjdChwZmRWYWx1ZSwgMCk7CiAgICAgICAgICAgX2RhdGEud3JpdGVUeXBlZEFycmF5KHBmZEFycmF5LCAwKTsKICAgICAgICAgICBib29sZWFuIF9zdGF0dXMgPSBtUmVtb3RlLnRyYW5zYWN0KFN0dWIuVFJBTlNBQ1RJT05fTG9nVGhpcywgX2RhdGEsIF9yZXBseSwgMCk7Ci0gICAgICAgICAgaWYgKCFfc3RhdHVzKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0RGVmYXVsdEltcGwoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgIHJldHVybiBnZXREZWZhdWx0SW1wbCgpLkxvZ1RoaXMoYm9vbFZhbHVlLCBib29sQXJyYXksIGJ5dGVWYWx1ZSwgYnl0ZUFycmF5LCBjaGFyVmFsdWUsIGNoYXJBcnJheSwgaW50VmFsdWUsIGludEFycmF5LCBsb25nVmFsdWUsIGxvbmdBcnJheSwgZmxvYXRWYWx1ZSwgZmxvYXRBcnJheSwgZG91YmxlVmFsdWUsIGRvdWJsZUFycmF5LCBzdHJpbmdWYWx1ZSwgc3RyaW5nQXJyYXksIGxpc3RWYWx1ZSwgZGF0YVZhbHVlLCBiaW5kZXJWYWx1ZSwgcGZkVmFsdWUsIHBmZEFycmF5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9CiAgICAgICAgICAgX3JlcGx5LnJlYWRFeGNlcHRpb24oKTsKICAgICAgICAgICBfcmVzdWx0ID0gX3JlcGx5LmNyZWF0ZVN0cmluZ0FycmF5KCk7CiAgICAgICAgICAgX3JlcGx5LnJlYWRCb29sZWFuQXJyYXkoYm9vbEFycmF5KTsKQEAgLTIzMCwyNiArMjAxLDEyNSBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBfcmVzdWx0OwogICAgICAgfQotICAgICAgcHVibGljIHN0YXRpYyBhbmRyb2lkLmFpZGwubG9nZ2FibGUuSUxvZ2dhYmxlSW50ZXJmYWNlIHNEZWZhdWx0SW1wbDsKICAgICB9CiAgICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9Mb2dUaGlzID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMCk7Ci0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHNldERlZmF1bHRJbXBsKGFuZHJvaWQuYWlkbC5sb2dnYWJsZS5JTG9nZ2FibGVJbnRlcmZhY2UgaW1wbCkgewotICAgICAgLy8gT25seSBvbmUgdXNlciBvZiB0aGlzIGludGVyZmFjZSBjYW4gdXNlIHRoaXMgZnVuY3Rpb24KLSAgICAgIC8vIGF0IGEgdGltZS4gVGhpcyBpcyBhIGhldXJpc3RpYyB0byBkZXRlY3QgaWYgdHdvIGRpZmZlcmVudAotICAgICAgLy8gdXNlcnMgaW4gdGhlIHNhbWUgcHJvY2VzcyB1c2UgdGhpcyBmdW5jdGlvbi4KLSAgICAgIGlmIChTdHViLlByb3h5LnNEZWZhdWx0SW1wbCAhPSBudWxsKSB7Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInNldERlZmF1bHRJbXBsKCkgY2FsbGVkIHR3aWNlIik7Ci0gICAgICB9Ci0gICAgICBpZiAoaW1wbCAhPSBudWxsKSB7Ci0gICAgICAgIFN0dWIuUHJveHkuc0RlZmF1bHRJbXBsID0gaW1wbDsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5haWRsLmxvZ2dhYmxlLklMb2dnYWJsZUludGVyZmFjZSBnZXREZWZhdWx0SW1wbCgpIHsKLSAgICAgIHJldHVybiBTdHViLlByb3h5LnNEZWZhdWx0SW1wbDsKLSAgICB9CiAgIH0KICAgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFU0NSSVBUT1IgPSAiYW5kcm9pZCRhaWRsJGxvZ2dhYmxlJElMb2dnYWJsZUludGVyZmFjZSIucmVwbGFjZSgnJCcsICcuJyk7CiAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gTG9nVGhpcyhib29sZWFuIGJvb2xWYWx1ZSwgYm9vbGVhbltdIGJvb2xBcnJheSwgYnl0ZSBieXRlVmFsdWUsIGJ5dGVbXSBieXRlQXJyYXksIGNoYXIgY2hhclZhbHVlLCBjaGFyW10gY2hhckFycmF5LCBpbnQgaW50VmFsdWUsIGludFtdIGludEFycmF5LCBsb25nIGxvbmdWYWx1ZSwgbG9uZ1tdIGxvbmdBcnJheSwgZmxvYXQgZmxvYXRWYWx1ZSwgZmxvYXRbXSBmbG9hdEFycmF5LCBkb3VibGUgZG91YmxlVmFsdWUsIGRvdWJsZVtdIGRvdWJsZUFycmF5LCBqYXZhLmxhbmcuU3RyaW5nIHN0cmluZ1ZhbHVlLCBqYXZhLmxhbmcuU3RyaW5nW10gc3RyaW5nQXJyYXksIGphdmEudXRpbC5MaXN0PGphdmEubGFuZy5TdHJpbmc+IGxpc3RWYWx1ZSwgYW5kcm9pZC5haWRsLmxvZ2dhYmxlLkRhdGEgZGF0YVZhbHVlLCBhbmRyb2lkLm9zLklCaW5kZXIgYmluZGVyVmFsdWUsIGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3IgcGZkVmFsdWUsIGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3JbXSBwZmRBcnJheSkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworICBwdWJsaWMgaW50ZXJmYWNlIElTdWIgZXh0ZW5kcyBhbmRyb2lkLm9zLklJbnRlcmZhY2UKKyAgeworICAgIC8qKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciBJU3ViLiAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRGVmYXVsdCBpbXBsZW1lbnRzIGFuZHJvaWQuYWlkbC5sb2dnYWJsZS5JTG9nZ2FibGVJbnRlcmZhY2UuSVN1YgorICAgIHsKKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBMb2coaW50IHZhbHVlKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICAgIHsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisgICAgfQorICAgIC8qKiBMb2NhbC1zaWRlIElQQyBpbXBsZW1lbnRhdGlvbiBzdHViIGNsYXNzLiAqLworICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgU3R1YiBleHRlbmRzIGFuZHJvaWQub3MuQmluZGVyIGltcGxlbWVudHMgYW5kcm9pZC5haWRsLmxvZ2dhYmxlLklMb2dnYWJsZUludGVyZmFjZS5JU3ViCisgICAgeworICAgICAgLyoqIENvbnN0cnVjdCB0aGUgc3R1YiBhdCBhdHRhY2ggaXQgdG8gdGhlIGludGVyZmFjZS4gKi8KKyAgICAgIHB1YmxpYyBTdHViKCkKKyAgICAgIHsKKyAgICAgICAgdGhpcy5hdHRhY2hJbnRlcmZhY2UodGhpcywgREVTQ1JJUFRPUik7CisgICAgICB9CisgICAgICAvKioKKyAgICAgICAqIENhc3QgYW4gSUJpbmRlciBvYmplY3QgaW50byBhbiBhbmRyb2lkLmFpZGwubG9nZ2FibGUuSUxvZ2dhYmxlSW50ZXJmYWNlLklTdWIgaW50ZXJmYWNlLAorICAgICAgICogZ2VuZXJhdGluZyBhIHByb3h5IGlmIG5lZWRlZC4KKyAgICAgICAqLworICAgICAgcHVibGljIHN0YXRpYyBhbmRyb2lkLmFpZGwubG9nZ2FibGUuSUxvZ2dhYmxlSW50ZXJmYWNlLklTdWIgYXNJbnRlcmZhY2UoYW5kcm9pZC5vcy5JQmluZGVyIG9iaikKKyAgICAgIHsKKyAgICAgICAgaWYgKChvYmo9PW51bGwpKSB7CisgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgYW5kcm9pZC5vcy5JSW50ZXJmYWNlIGlpbiA9IG9iai5xdWVyeUxvY2FsSW50ZXJmYWNlKERFU0NSSVBUT1IpOworICAgICAgICBpZiAoKChpaW4hPW51bGwpJiYoaWluIGluc3RhbmNlb2YgYW5kcm9pZC5haWRsLmxvZ2dhYmxlLklMb2dnYWJsZUludGVyZmFjZS5JU3ViKSkpIHsKKyAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLmFpZGwubG9nZ2FibGUuSUxvZ2dhYmxlSW50ZXJmYWNlLklTdWIpaWluKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IGFuZHJvaWQuYWlkbC5sb2dnYWJsZS5JTG9nZ2FibGVJbnRlcmZhY2UuSVN1Yi5TdHViLlByb3h5KG9iaik7CisgICAgICB9CisgICAgICBAT3ZlcnJpZGUgcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCisgICAgICB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgICAgfQorICAgICAgQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIG9uVHJhbnNhY3QoaW50IGNvZGUsIGFuZHJvaWQub3MuUGFyY2VsIGRhdGEsIGFuZHJvaWQub3MuUGFyY2VsIHJlcGx5LCBpbnQgZmxhZ3MpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgICAgeworICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGRlc2NyaXB0b3IgPSBERVNDUklQVE9SOworICAgICAgICBpZiAoY29kZSA+PSBhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiAmJiBjb2RlIDw9IGFuZHJvaWQub3MuSUJpbmRlci5MQVNUX0NBTExfVFJBTlNBQ1RJT04pIHsKKyAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoZGVzY3JpcHRvcik7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChjb2RlKQorICAgICAgICB7CisgICAgICAgICAgY2FzZSBJTlRFUkZBQ0VfVFJBTlNBQ1RJT046CisgICAgICAgICAgeworICAgICAgICAgICAgcmVwbHkud3JpdGVTdHJpbmcoZGVzY3JpcHRvcik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChjb2RlKQorICAgICAgICB7CisgICAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9Mb2c6CisgICAgICAgICAgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgYW5kcm9pZC5vcy5UcmFjZS50cmFjZUJlZ2luKGFuZHJvaWQub3MuVHJhY2UuVFJBQ0VfVEFHX0FJREwsICJBSURMOjpqYXZhOjpJU3ViOjpMb2c6OnNlcnZlciIpOworICAgICAgICAgICAgICBpbnQgX2FyZzA7CisgICAgICAgICAgICAgIF9hcmcwID0gZGF0YS5yZWFkSW50KCk7CisgICAgICAgICAgICAgIGRhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7CisgICAgICAgICAgICAgIHRoaXMuTG9nKF9hcmcwKTsKKyAgICAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgICAgIGFuZHJvaWQub3MuVHJhY2UudHJhY2VFbmQoYW5kcm9pZC5vcy5UcmFjZS5UUkFDRV9UQUdfQUlETCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIub25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFByb3h5IGltcGxlbWVudHMgYW5kcm9pZC5haWRsLmxvZ2dhYmxlLklMb2dnYWJsZUludGVyZmFjZS5JU3ViCisgICAgICB7CisgICAgICAgIHByaXZhdGUgYW5kcm9pZC5vcy5JQmluZGVyIG1SZW1vdGU7CisgICAgICAgIFByb3h5KGFuZHJvaWQub3MuSUJpbmRlciByZW1vdGUpCisgICAgICAgIHsKKyAgICAgICAgICBtUmVtb3RlID0gcmVtb3RlOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBtUmVtb3RlOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEludGVyZmFjZURlc2NyaXB0b3IoKQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIERFU0NSSVBUT1I7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIExvZyhpbnQgdmFsdWUpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgYW5kcm9pZC5vcy5UcmFjZS50cmFjZUJlZ2luKGFuZHJvaWQub3MuVHJhY2UuVFJBQ0VfVEFHX0FJREwsICJBSURMOjpqYXZhOjpJU3ViOjpMb2c6OmNsaWVudCIpOworICAgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKKyAgICAgICAgICAgIF9kYXRhLndyaXRlSW50KHZhbHVlKTsKKyAgICAgICAgICAgIGJvb2xlYW4gX3N0YXR1cyA9IG1SZW1vdGUudHJhbnNhY3QoU3R1Yi5UUkFOU0FDVElPTl9Mb2csIF9kYXRhLCBfcmVwbHksIDApOworICAgICAgICAgICAgX3JlcGx5LnJlYWRFeGNlcHRpb24oKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgICBfcmVwbHkucmVjeWNsZSgpOworICAgICAgICAgICAgX2RhdGEucmVjeWNsZSgpOworICAgICAgICAgICAgYW5kcm9pZC5vcy5UcmFjZS50cmFjZUVuZChhbmRyb2lkLm9zLlRyYWNlLlRSQUNFX1RBR19BSURMKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fTG9nID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMCk7CisgICAgfQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERVNDUklQVE9SID0gImFuZHJvaWQkYWlkbCRsb2dnYWJsZSRJTG9nZ2FibGVJbnRlcmZhY2UkSVN1YiIucmVwbGFjZSgnJCcsICcuJyk7CisgICAgcHVibGljIHZvaWQgTG9nKGludCB2YWx1ZSkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9JTG9nZ2FibGVJbnRlcmZhY2UuamF2YS5kIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvSUxvZ2dhYmxlSW50ZXJmYWNlLmphdmEuZAppbmRleCAzNTYzNDMzLi42NzBmMmMxIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9JTG9nZ2FibGVJbnRlcmZhY2UuamF2YS5kCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0lMb2dnYWJsZUludGVyZmFjZS5qYXZhLmQKQEAgLTEsMyArMSw1IEBACiBvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0lMb2dnYWJsZUludGVyZmFjZS5qYXZhIDogXAogICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvSUxvZ2dhYmxlSW50ZXJmYWNlLmFpZGwgXAotICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvRGF0YS5haWRsCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9EYXRhLmFpZGwgXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvVW5pb24uYWlkbCBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9FbnVtLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2xvZ2dhYmxlL1VuaW9uLmphdmEgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9Vbmlvbi5qYXZhCmluZGV4IDIxMjZjOTMuLmY4NTc3MGYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2xvZ2dhYmxlL1VuaW9uLmphdmEKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvVW5pb24uamF2YQpAQCAtMiw3ICsyLDYgQEAKICAqIFRoaXMgZmlsZSBpcyBhdXRvLWdlbmVyYXRlZC4gIERPIE5PVCBNT0RJRlkuCiAgKi8KIHBhY2thZ2UgYW5kcm9pZC5haWRsLmxvZ2dhYmxlOwotCiBwdWJsaWMgZmluYWwgY2xhc3MgVW5pb24gaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUgewogICAvLyB0YWdzIGZvciB1bmlvbiBmaWVsZHMKICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgbnVtID0gMDsgIC8vIGludCBudW07CkBAIC0xMjgsNCArMTI3LDggQEAKICAgICB0aGlzLl90YWcgPSBfdGFnOwogICAgIHRoaXMuX3ZhbHVlID0gX3ZhbHVlOwogICB9CisgIHB1YmxpYyBzdGF0aWMgQGludGVyZmFjZSBUYWcgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG51bSA9IDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RyID0gMTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9EYXRhLmNwcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvRGF0YS5jcHAKaW5kZXggMjliYTNjMy4uMjU5M2ZiZiAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9EYXRhLmNwcAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0RhdGEuY3BwCkBAIC04LDY3ICs4LDY4IEBACiBuYW1lc3BhY2UgbG9nZ2FibGUgewogY29uc3QgY2hhciogRGF0YTo6ZGVzY3JpcHRvciA9ICJhbmRyb2lkLmFpZGwubG9nZ2FibGUuRGF0YSI7CiAKLWJpbmRlcl9zdGF0dXNfdCBEYXRhOjpyZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBwYXJjZWwpIHsKLSAgaW50MzJfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemU7Ci0gIGludDMyX3QgX2FpZGxfc3RhcnRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKTsKLSAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihwYXJjZWwsICZfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworYmluZGVyX3N0YXR1c190IERhdGE6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIF9haWRsX3BhcmNlbCkgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19PSzsKKyAgaW50MzJfdCBfYWlkbF9zdGFydF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpOworICBpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IDA7CisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihfYWlkbF9wYXJjZWwsICZfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChfYWlkbF9wYXJjZWxhYmxlX3NpemUgPCA0KSByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTsKICAgaWYgKF9haWRsX3N0YXJ0X3BvcyA+IElOVDMyX01BWCAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuIFNUQVRVU19CQURfVkFMVUU7Ci0gIGlmIChfYWlkbF9wYXJjZWxhYmxlX3NpemUgPCAwKSByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKICAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKICAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzIocGFyY2VsLCAmbnVtKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJm51bSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CiAKLSAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7Ci0gICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CiAgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CiAgIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRTdHJpbmcocGFyY2VsLCAmc3RyKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJnN0cik7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CiAKLSAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7Ci0gICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CiAgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CiAgIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRQYXJjZWxhYmxlKHBhcmNlbCwgJm5lc3RlZFVuaW9uKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJm5lc3RlZFVuaW9uKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKIAotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKICAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKICAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkQnl0ZShwYXJjZWwsIHJlaW50ZXJwcmV0X2Nhc3Q8aW50OF90Kj4oJm5lc3RlZEVudW0pKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJm5lc3RlZEVudW0pOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwogCi0gIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwogICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKIH0KLWJpbmRlcl9zdGF0dXNfdCBEYXRhOjp3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIHBhcmNlbCkgY29uc3QgeworYmluZGVyX3N0YXR1c190IERhdGE6OndyaXRlVG9QYXJjZWwoQVBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCB7CiAgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzOwotICBzaXplX3QgX2FpZGxfc3RhcnRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKTsKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQzMihwYXJjZWwsIDApOworICBzaXplX3QgX2FpZGxfc3RhcnRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQzMihfYWlkbF9wYXJjZWwsIDApOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIocGFyY2VsLCBudW0pOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgbnVtKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVTdHJpbmcocGFyY2VsLCBzdHIpOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgc3RyKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVQYXJjZWxhYmxlKHBhcmNlbCwgbmVzdGVkVW5pb24pOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgbmVzdGVkVW5pb24pOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlQnl0ZShwYXJjZWwsIHN0YXRpY19jYXN0PGludDhfdD4obmVzdGVkRW51bSkpOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgbmVzdGVkRW51bSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CiAKLSAgc2l6ZV90IF9haWRsX2VuZF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpOwotICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3Bvcyk7Ci0gIEFQYXJjZWxfd3JpdGVJbnQzMihwYXJjZWwsIF9haWRsX2VuZF9wb3MgLSBfYWlkbF9zdGFydF9wb3MpOwotICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX2VuZF9wb3MpOworICBzaXplX3QgX2FpZGxfZW5kX3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zKTsKKyAgQVBhcmNlbF93cml0ZUludDMyKF9haWRsX3BhcmNlbCwgX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfZW5kX3Bvcyk7CiAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwogfQogCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0lMb2dnYWJsZUludGVyZmFjZS5jcHAgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0lMb2dnYWJsZUludGVyZmFjZS5jcHAKaW5kZXggNDgzNWYzYi4uNjZkMWU3MiAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9JTG9nZ2FibGVJbnRlcmZhY2UuY3BwCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvSUxvZ2dhYmxlSW50ZXJmYWNlLmNwcApAQCAtMSwyMyArMSwyMiBAQAorI2luY2x1ZGUgImFpZGwvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0lMb2dnYWJsZUludGVyZmFjZS5oIgorCiAjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcGFyY2VsX3V0aWxzLmg+Ci0jaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvQnBMb2dnYWJsZUludGVyZmFjZS5oPgotI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0JuTG9nZ2FibGVJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9JTG9nZ2FibGVJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl90b19zdHJpbmcuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9CbkxvZ2dhYmxlSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvQnBMb2dnYWJsZUludGVyZmFjZS5oPgorCituYW1lc3BhY2Ugeworc3RydWN0IFNjb3BlZFRyYWNlIHsKKyAgaW5saW5lIGV4cGxpY2l0IFNjb3BlZFRyYWNlKGNvbnN0IGNoYXIqIG5hbWUpIHsgQVRyYWNlX2JlZ2luU2VjdGlvbihuYW1lKTsgfQorICBpbmxpbmUgflNjb3BlZFRyYWNlKCkgeyBBVHJhY2VfZW5kU2VjdGlvbigpOyB9Cit9OworfSAgLy8gbmFtZXNwYWNlCiAKIG5hbWVzcGFjZSBhaWRsIHsKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBhaWRsIHsKIG5hbWVzcGFjZSBsb2dnYWJsZSB7Ci1jbGFzcyBTY29wZWRUcmFjZSB7Ci0gIHB1YmxpYzoKLSAgaW5saW5lIGV4cGxpY2l0IFNjb3BlZFRyYWNlKGNvbnN0IGNoYXIqIG5hbWUpIHsKLSAgQVRyYWNlX2JlZ2luU2VjdGlvbihuYW1lKTsKLSAgfQotICBpbmxpbmUgflNjb3BlZFRyYWNlKCkgewotICBBVHJhY2VfZW5kU2VjdGlvbigpOwotICB9Ci19Owotc3RhdGljIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9vblRyYW5zYWN0KEFJQmluZGVyKiBfYWlkbF9iaW5kZXIsIHRyYW5zYWN0aW9uX2NvZGVfdCBfYWlkbF9jb2RlLCBjb25zdCBBUGFyY2VsKiBfYWlkbF9pbiwgQVBhcmNlbCogX2FpZGxfb3V0KSB7CitzdGF0aWMgYmluZGVyX3N0YXR1c190IF9haWRsX2FuZHJvaWRfYWlkbF9sb2dnYWJsZV9JTG9nZ2FibGVJbnRlcmZhY2Vfb25UcmFuc2FjdChBSUJpbmRlciogX2FpZGxfYmluZGVyLCB0cmFuc2FjdGlvbl9jb2RlX3QgX2FpZGxfY29kZSwgY29uc3QgQVBhcmNlbCogX2FpZGxfaW4sIEFQYXJjZWwqIF9haWRsX291dCkgewogICAodm9pZClfYWlkbF9pbjsKICAgKHZvaWQpX2FpZGxfb3V0OwogICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OOwpAQCAtNDgsNjcgKzQ3LDY3IEBACiAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gX2FpZGxfcmV0dXJuOwogCiAgICAgICBTY29wZWRUcmFjZSBfYWlkbF90cmFjZSgiQUlETDo6bmRrOjpJTG9nZ2FibGVJbnRlcmZhY2U6OkxvZ1RoaXM6OnNlcnZlciIpOwotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEJvb2woX2FpZGxfaW4sICZpbl9ib29sVmFsdWUpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX2luLCAmaW5fYm9vbFZhbHVlKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX2luLCAmaW5fYm9vbEFycmF5KTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9pbiwgJmluX2Jvb2xBcnJheSk7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkQnl0ZShfYWlkbF9pbiwgJmluX2J5dGVWYWx1ZSk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfaW4sICZpbl9ieXRlVmFsdWUpOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX2FpZGxfaW4sICZpbl9ieXRlQXJyYXkpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX2luLCAmaW5fYnl0ZUFycmF5KTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRDaGFyKF9haWRsX2luLCAmaW5fY2hhclZhbHVlKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9pbiwgJmluX2NoYXJWYWx1ZSk7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihfYWlkbF9pbiwgJmluX2NoYXJBcnJheSk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfaW4sICZpbl9jaGFyQXJyYXkpOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyKF9haWRsX2luLCAmaW5faW50VmFsdWUpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX2luLCAmaW5faW50VmFsdWUpOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX2FpZGxfaW4sICZpbl9pbnRBcnJheSk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfaW4sICZpbl9pbnRBcnJheSk7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50NjQoX2FpZGxfaW4sICZpbl9sb25nVmFsdWUpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX2luLCAmaW5fbG9uZ1ZhbHVlKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX2luLCAmaW5fbG9uZ0FycmF5KTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9pbiwgJmluX2xvbmdBcnJheSk7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkRmxvYXQoX2FpZGxfaW4sICZpbl9mbG9hdFZhbHVlKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9pbiwgJmluX2Zsb2F0VmFsdWUpOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX2FpZGxfaW4sICZpbl9mbG9hdEFycmF5KTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9pbiwgJmluX2Zsb2F0QXJyYXkpOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZERvdWJsZShfYWlkbF9pbiwgJmluX2RvdWJsZVZhbHVlKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9pbiwgJmluX2RvdWJsZVZhbHVlKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX2luLCAmaW5fZG91YmxlQXJyYXkpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX2luLCAmaW5fZG91YmxlQXJyYXkpOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRTdHJpbmcoX2FpZGxfaW4sICZpbl9zdHJpbmdWYWx1ZSk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfaW4sICZpbl9zdHJpbmdWYWx1ZSk7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihfYWlkbF9pbiwgJmluX3N0cmluZ0FycmF5KTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9pbiwgJmluX3N0cmluZ0FycmF5KTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX2luLCAmaW5fbGlzdFZhbHVlKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9pbiwgJmluX2xpc3RWYWx1ZSk7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFBhcmNlbGFibGUoX2FpZGxfaW4sICZpbl9kYXRhVmFsdWUpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX2luLCAmaW5fZGF0YVZhbHVlKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVTdHJvbmdCaW5kZXIoX2FpZGxfaW4sICZpbl9iaW5kZXJWYWx1ZSk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9pbiwgJmluX2JpbmRlclZhbHVlKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVQYXJjZWxGaWxlRGVzY3JpcHRvcihfYWlkbF9pbiwgJmluX3BmZFZhbHVlKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX2luLCAmaW5fcGZkVmFsdWUpOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX2FpZGxfaW4sICZpbl9wZmRBcnJheSk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfaW4sICZpbl9wZmRBcnJheSk7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICBCbkxvZ2dhYmxlSW50ZXJmYWNlOjpUcmFuc2FjdGlvbkxvZyBfdHJhbnNhY3Rpb25fbG9nOwpAQCAtMTY3LDQwICsxNjYsNDAgQEAKIAogICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihfYWlkbF9vdXQsIGluX2Jvb2xBcnJheSk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgaW5fYm9vbEFycmF5KTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihfYWlkbF9vdXQsIGluX2J5dGVBcnJheSk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgaW5fYnl0ZUFycmF5KTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihfYWlkbF9vdXQsIGluX2NoYXJBcnJheSk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgaW5fY2hhckFycmF5KTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihfYWlkbF9vdXQsIGluX2ludEFycmF5KTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBpbl9pbnRBcnJheSk7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX2FpZGxfb3V0LCBpbl9sb25nQXJyYXkpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIGluX2xvbmdBcnJheSk7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX2FpZGxfb3V0LCBpbl9mbG9hdEFycmF5KTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBpbl9mbG9hdEFycmF5KTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihfYWlkbF9vdXQsIGluX2RvdWJsZUFycmF5KTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBpbl9kb3VibGVBcnJheSk7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX2FpZGxfb3V0LCBpbl9zdHJpbmdBcnJheSk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgaW5fc3RyaW5nQXJyYXkpOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKF9haWRsX291dCwgaW5fbGlzdFZhbHVlKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBpbl9saXN0VmFsdWUpOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVQYXJjZWxGaWxlRGVzY3JpcHRvcihfYWlkbF9vdXQsIGluX3BmZFZhbHVlKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9vdXQsIGluX3BmZFZhbHVlKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihfYWlkbF9vdXQsIGluX3BmZEFycmF5KTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBpbl9wZmRBcnJheSk7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICBicmVhazsKQEAgLTIwOSw3ICsyMDgsNyBAQAogICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKIH0KIAotc3RhdGljIEFJQmluZGVyX0NsYXNzKiBfZ19haWRsX2NsYXp6ID0gOjpuZGs6OklDSW50ZXJmYWNlOjpkZWZpbmVDbGFzcyhJTG9nZ2FibGVJbnRlcmZhY2U6OmRlc2NyaXB0b3IsIF9haWRsX29uVHJhbnNhY3QpOworc3RhdGljIEFJQmluZGVyX0NsYXNzKiBfZ19haWRsX2FuZHJvaWRfYWlkbF9sb2dnYWJsZV9JTG9nZ2FibGVJbnRlcmZhY2VfY2xhenogPSA6Om5kazo6SUNJbnRlcmZhY2U6OmRlZmluZUNsYXNzKElMb2dnYWJsZUludGVyZmFjZTo6ZGVzY3JpcHRvciwgX2FpZGxfYW5kcm9pZF9haWRsX2xvZ2dhYmxlX0lMb2dnYWJsZUludGVyZmFjZV9vblRyYW5zYWN0KTsKIAogQnBMb2dnYWJsZUludGVyZmFjZTo6QnBMb2dnYWJsZUludGVyZmFjZShjb25zdCA6Om5kazo6U3BBSUJpbmRlciYgYmluZGVyKSA6IEJwQ0ludGVyZmFjZShiaW5kZXIpIHt9CiBCcExvZ2dhYmxlSW50ZXJmYWNlOjp+QnBMb2dnYWJsZUludGVyZmFjZSgpIHt9CkBAIC0yNTAsNjcgKzI0OSw2NyBAQAogICBfYWlkbF9yZXRfc3RhdHVzID0gQUlCaW5kZXJfcHJlcGFyZVRyYW5zYWN0aW9uKGFzQmluZGVyKCkuZ2V0KCksIF9haWRsX2luLmdldFIoKSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUJvb2woX2FpZGxfaW4uZ2V0KCksIGluX2Jvb2xWYWx1ZSk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX2Jvb2xWYWx1ZSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX2FpZGxfaW4uZ2V0KCksICppbl9ib29sQXJyYXkpOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX2luLmdldCgpLCAqaW5fYm9vbEFycmF5KTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlQnl0ZShfYWlkbF9pbi5nZXQoKSwgaW5fYnl0ZVZhbHVlKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5fYnl0ZVZhbHVlKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihfYWlkbF9pbi5nZXQoKSwgKmluX2J5dGVBcnJheSk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfaW4uZ2V0KCksICppbl9ieXRlQXJyYXkpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVDaGFyKF9haWRsX2luLmdldCgpLCBpbl9jaGFyVmFsdWUpOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX2luLmdldCgpLCBpbl9jaGFyVmFsdWUpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKF9haWRsX2luLmdldCgpLCAqaW5fY2hhckFycmF5KTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgKmluX2NoYXJBcnJheSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDMyKF9haWRsX2luLmdldCgpLCBpbl9pbnRWYWx1ZSk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX2ludFZhbHVlKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihfYWlkbF9pbi5nZXQoKSwgKmluX2ludEFycmF5KTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgKmluX2ludEFycmF5KTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50NjQoX2FpZGxfaW4uZ2V0KCksIGluX2xvbmdWYWx1ZSk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX2xvbmdWYWx1ZSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX2FpZGxfaW4uZ2V0KCksICppbl9sb25nQXJyYXkpOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX2luLmdldCgpLCAqaW5fbG9uZ0FycmF5KTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlRmxvYXQoX2FpZGxfaW4uZ2V0KCksIGluX2Zsb2F0VmFsdWUpOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX2luLmdldCgpLCBpbl9mbG9hdFZhbHVlKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihfYWlkbF9pbi5nZXQoKSwgKmluX2Zsb2F0QXJyYXkpOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX2luLmdldCgpLCAqaW5fZmxvYXRBcnJheSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZURvdWJsZShfYWlkbF9pbi5nZXQoKSwgaW5fZG91YmxlVmFsdWUpOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX2luLmdldCgpLCBpbl9kb3VibGVWYWx1ZSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX2FpZGxfaW4uZ2V0KCksICppbl9kb3VibGVBcnJheSk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfaW4uZ2V0KCksICppbl9kb3VibGVBcnJheSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVTdHJpbmcoX2FpZGxfaW4uZ2V0KCksIGluX3N0cmluZ1ZhbHVlKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5fc3RyaW5nVmFsdWUpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKF9haWRsX2luLmdldCgpLCAqaW5fc3RyaW5nQXJyYXkpOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX2luLmdldCgpLCAqaW5fc3RyaW5nQXJyYXkpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKF9haWRsX2luLmdldCgpLCAqaW5fbGlzdFZhbHVlKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgKmluX2xpc3RWYWx1ZSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVQYXJjZWxhYmxlKF9haWRsX2luLmdldCgpLCBpbl9kYXRhVmFsdWUpOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX2luLmdldCgpLCBpbl9kYXRhVmFsdWUpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVTdHJvbmdCaW5kZXIoX2FpZGxfaW4uZ2V0KCksIGluX2JpbmRlclZhbHVlKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX2luLmdldCgpLCBpbl9iaW5kZXJWYWx1ZSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZVBhcmNlbEZpbGVEZXNjcmlwdG9yKF9haWRsX2luLmdldCgpLCAqaW5fcGZkVmFsdWUpOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfaW4uZ2V0KCksICppbl9wZmRWYWx1ZSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX2FpZGxfaW4uZ2V0KCksICppbl9wZmRBcnJheSk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfaW4uZ2V0KCksICppbl9wZmRBcnJheSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9yZXRfc3RhdHVzID0gQUlCaW5kZXJfdHJhbnNhY3QoCkBAIC0zMzMsNDAgKzMzMiw0MCBAQAogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOwotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihfYWlkbF9vdXQuZ2V0KCksIGluX2Jvb2xBcnJheSk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIGluX2Jvb2xBcnJheSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihfYWlkbF9vdXQuZ2V0KCksIGluX2J5dGVBcnJheSk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIGluX2J5dGVBcnJheSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihfYWlkbF9vdXQuZ2V0KCksIGluX2NoYXJBcnJheSk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIGluX2NoYXJBcnJheSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihfYWlkbF9vdXQuZ2V0KCksIGluX2ludEFycmF5KTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgaW5faW50QXJyYXkpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX2FpZGxfb3V0LmdldCgpLCBpbl9sb25nQXJyYXkpOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBpbl9sb25nQXJyYXkpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX2FpZGxfb3V0LmdldCgpLCBpbl9mbG9hdEFycmF5KTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgaW5fZmxvYXRBcnJheSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihfYWlkbF9vdXQuZ2V0KCksIGluX2RvdWJsZUFycmF5KTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgaW5fZG91YmxlQXJyYXkpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX2FpZGxfb3V0LmdldCgpLCBpbl9zdHJpbmdBcnJheSk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIGluX3N0cmluZ0FycmF5KTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX291dC5nZXQoKSwgaW5fbGlzdFZhbHVlKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgaW5fbGlzdFZhbHVlKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVQYXJjZWxGaWxlRGVzY3JpcHRvcihfYWlkbF9vdXQuZ2V0KCksIGluX3BmZFZhbHVlKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfb3V0LmdldCgpLCBpbl9wZmRWYWx1ZSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihfYWlkbF9vdXQuZ2V0KCksIGluX3BmZEFycmF5KTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgaW5fcGZkQXJyYXkpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfZXJyb3I6CkBAIC00MDQsNyArNDAzLDcgQEAKIEJuTG9nZ2FibGVJbnRlcmZhY2U6On5CbkxvZ2dhYmxlSW50ZXJmYWNlKCkge30KIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBCbkxvZ2dhYmxlSW50ZXJmYWNlOjpUcmFuc2FjdGlvbkxvZyYpPiBCbkxvZ2dhYmxlSW50ZXJmYWNlOjpsb2dGdW5jOwogOjpuZGs6OlNwQUlCaW5kZXIgQm5Mb2dnYWJsZUludGVyZmFjZTo6Y3JlYXRlQmluZGVyKCkgewotICBBSUJpbmRlciogYmluZGVyID0gQUlCaW5kZXJfbmV3KF9nX2FpZGxfY2xhenosIHN0YXRpY19jYXN0PHZvaWQqPih0aGlzKSk7CisgIEFJQmluZGVyKiBiaW5kZXIgPSBBSUJpbmRlcl9uZXcoX2dfYWlkbF9hbmRyb2lkX2FpZGxfbG9nZ2FibGVfSUxvZ2dhYmxlSW50ZXJmYWNlX2NsYXp6LCBzdGF0aWNfY2FzdDx2b2lkKj4odGhpcykpOwogICAjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCiAgIEFJQmluZGVyX21hcmtDb21waWxhdGlvblVuaXRTdGFiaWxpdHkoYmluZGVyKTsKICAgI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKQEAgLTQxNyw3ICs0MTYsNyBAQAogCiAKIHN0ZDo6c2hhcmVkX3B0cjxJTG9nZ2FibGVJbnRlcmZhY2U+IElMb2dnYWJsZUludGVyZmFjZTo6ZnJvbUJpbmRlcihjb25zdCA6Om5kazo6U3BBSUJpbmRlciYgYmluZGVyKSB7Ci0gIGlmICghQUlCaW5kZXJfYXNzb2NpYXRlQ2xhc3MoYmluZGVyLmdldCgpLCBfZ19haWRsX2NsYXp6KSkgeyByZXR1cm4gbnVsbHB0cjsgfQorICBpZiAoIUFJQmluZGVyX2Fzc29jaWF0ZUNsYXNzKGJpbmRlci5nZXQoKSwgX2dfYWlkbF9hbmRyb2lkX2FpZGxfbG9nZ2FibGVfSUxvZ2dhYmxlSW50ZXJmYWNlX2NsYXp6KSkgeyByZXR1cm4gbnVsbHB0cjsgfQogICBzdGQ6OnNoYXJlZF9wdHI8OjpuZGs6OklDSW50ZXJmYWNlPiBpbnRlcmZhY2UgPSA6Om5kazo6SUNJbnRlcmZhY2U6OmFzSW50ZXJmYWNlKGJpbmRlci5nZXQoKSk7CiAgIGlmIChpbnRlcmZhY2UpIHsKICAgICByZXR1cm4gc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PElMb2dnYWJsZUludGVyZmFjZT4oaW50ZXJmYWNlKTsKQEAgLTQ2NSwzICs0NjQsMTc4IEBACiB9ICAvLyBuYW1lc3BhY2UgYWlkbAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIH0gIC8vIG5hbWVzcGFjZSBhaWRsCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgbG9nZ2FibGUgeworc3RhdGljIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9hbmRyb2lkX2FpZGxfbG9nZ2FibGVfSUxvZ2dhYmxlSW50ZXJmYWNlX0lTdWJfb25UcmFuc2FjdChBSUJpbmRlciogX2FpZGxfYmluZGVyLCB0cmFuc2FjdGlvbl9jb2RlX3QgX2FpZGxfY29kZSwgY29uc3QgQVBhcmNlbCogX2FpZGxfaW4sIEFQYXJjZWwqIF9haWRsX291dCkgeworICAodm9pZClfYWlkbF9pbjsKKyAgKHZvaWQpX2FpZGxfb3V0OworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OOworICBzdGQ6OnNoYXJlZF9wdHI8SUxvZ2dhYmxlSW50ZXJmYWNlOjpCblN1Yj4gX2FpZGxfaW1wbCA9IHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxJTG9nZ2FibGVJbnRlcmZhY2U6OkJuU3ViPig6Om5kazo6SUNJbnRlcmZhY2U6OmFzSW50ZXJmYWNlKF9haWRsX2JpbmRlcikpOworICBzd2l0Y2ggKF9haWRsX2NvZGUpIHsKKyAgICBjYXNlIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMCAvKkxvZyovKTogeworICAgICAgaW50MzJfdCBpbl92YWx1ZTsKKworICAgICAgU2NvcGVkVHJhY2UgX2FpZGxfdHJhY2UoIkFJREw6Om5kazo6SVN1Yjo6TG9nOjpzZXJ2ZXIiKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9pbiwgJmluX3ZhbHVlKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIElMb2dnYWJsZUludGVyZmFjZTo6Qm5TdWI6OlRyYW5zYWN0aW9uTG9nIF90cmFuc2FjdGlvbl9sb2c7CisgICAgICBpZiAoSUxvZ2dhYmxlSW50ZXJmYWNlOjpCblN1Yjo6bG9nRnVuYyAhPSBudWxscHRyKSB7CisgICAgICAgIF90cmFuc2FjdGlvbl9sb2cuaW5wdXRfYXJncy5lbXBsYWNlX2JhY2soImluX3ZhbHVlIiwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaW5fdmFsdWUpKTsKKyAgICAgIH0KKyAgICAgIGF1dG8gX2xvZ19zdGFydCA9IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpOworICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzID0gX2FpZGxfaW1wbC0+TG9nKGluX3ZhbHVlKTsKKyAgICAgIGlmIChJTG9nZ2FibGVJbnRlcmZhY2U6OkJuU3ViOjpsb2dGdW5jICE9IG51bGxwdHIpIHsKKyAgICAgICAgYXV0byBfbG9nX2VuZCA9IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpOworICAgICAgICBfdHJhbnNhY3Rpb25fbG9nLmR1cmF0aW9uX21zID0gc3RkOjpjaHJvbm86OmR1cmF0aW9uPGRvdWJsZSwgc3RkOjptaWxsaT4oX2xvZ19lbmQgLSBfbG9nX3N0YXJ0KS5jb3VudCgpOworICAgICAgICBfdHJhbnNhY3Rpb25fbG9nLmludGVyZmFjZV9uYW1lID0gImFuZHJvaWQuYWlkbC5sb2dnYWJsZS5JTG9nZ2FibGVJbnRlcmZhY2UuSVN1YiI7CisgICAgICAgIF90cmFuc2FjdGlvbl9sb2cubWV0aG9kX25hbWUgPSAiTG9nIjsKKyAgICAgICAgX3RyYW5zYWN0aW9uX2xvZy5zdHViX2FkZHJlc3MgPSBfYWlkbF9pbXBsLmdldCgpOworICAgICAgICBfdHJhbnNhY3Rpb25fbG9nLnByb3h5X2FkZHJlc3MgPSBudWxscHRyOworICAgICAgICBfdHJhbnNhY3Rpb25fbG9nLmV4Y2VwdGlvbl9jb2RlID0gQVN0YXR1c19nZXRFeGNlcHRpb25Db2RlKF9haWRsX3N0YXR1cy5nZXQoKSk7CisgICAgICAgIF90cmFuc2FjdGlvbl9sb2cuZXhjZXB0aW9uX21lc3NhZ2UgPSBBU3RhdHVzX2dldE1lc3NhZ2UoX2FpZGxfc3RhdHVzLmdldCgpKTsKKyAgICAgICAgX3RyYW5zYWN0aW9uX2xvZy50cmFuc2FjdGlvbl9lcnJvciA9IEFTdGF0dXNfZ2V0U3RhdHVzKF9haWRsX3N0YXR1cy5nZXQoKSk7CisgICAgICAgIF90cmFuc2FjdGlvbl9sb2cuc2VydmljZV9zcGVjaWZpY19lcnJvcl9jb2RlID0gQVN0YXR1c19nZXRTZXJ2aWNlU3BlY2lmaWNFcnJvcihfYWlkbF9zdGF0dXMuZ2V0KCkpOworICAgICAgICBJTG9nZ2FibGVJbnRlcmZhY2U6OkJuU3ViOjpsb2dGdW5jKF90cmFuc2FjdGlvbl9sb2cpOworICAgICAgfQorICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVTdGF0dXNIZWFkZXIoX2FpZGxfb3V0LCBfYWlkbF9zdGF0dXMuZ2V0KCkpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7CisKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KKworc3RhdGljIEFJQmluZGVyX0NsYXNzKiBfZ19haWRsX2FuZHJvaWRfYWlkbF9sb2dnYWJsZV9JTG9nZ2FibGVJbnRlcmZhY2VfSVN1Yl9jbGF6eiA9IDo6bmRrOjpJQ0ludGVyZmFjZTo6ZGVmaW5lQ2xhc3MoSUxvZ2dhYmxlSW50ZXJmYWNlOjpJU3ViOjpkZXNjcmlwdG9yLCBfYWlkbF9hbmRyb2lkX2FpZGxfbG9nZ2FibGVfSUxvZ2dhYmxlSW50ZXJmYWNlX0lTdWJfb25UcmFuc2FjdCk7CisKK0lMb2dnYWJsZUludGVyZmFjZTo6QnBTdWI6OkJwU3ViKGNvbnN0IDo6bmRrOjpTcEFJQmluZGVyJiBiaW5kZXIpIDogQnBDSW50ZXJmYWNlKGJpbmRlcikge30KK0lMb2dnYWJsZUludGVyZmFjZTo6QnBTdWI6On5CcFN1YigpIHt9CitzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgSUxvZ2dhYmxlSW50ZXJmYWNlOjpCcFN1Yjo6VHJhbnNhY3Rpb25Mb2cmKT4gSUxvZ2dhYmxlSW50ZXJmYWNlOjpCcFN1Yjo6bG9nRnVuYzsKKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgSUxvZ2dhYmxlSW50ZXJmYWNlOjpCcFN1Yjo6TG9nKGludDMyX3QgaW5fdmFsdWUpIHsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBTVEFUVVNfT0s7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1czsKKyAgOjpuZGs6OlNjb3BlZEFQYXJjZWwgX2FpZGxfaW47CisgIDo6bmRrOjpTY29wZWRBUGFyY2VsIF9haWRsX291dDsKKworICBJTG9nZ2FibGVJbnRlcmZhY2U6OkJwU3ViOjpUcmFuc2FjdGlvbkxvZyBfdHJhbnNhY3Rpb25fbG9nOworICBpZiAoSUxvZ2dhYmxlSW50ZXJmYWNlOjpCcFN1Yjo6bG9nRnVuYyAhPSBudWxscHRyKSB7CisgICAgX3RyYW5zYWN0aW9uX2xvZy5pbnB1dF9hcmdzLmVtcGxhY2VfYmFjaygiaW5fdmFsdWUiLCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbl92YWx1ZSkpOworICB9CisgIGF1dG8gX2xvZ19zdGFydCA9IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpOworICBTY29wZWRUcmFjZSBfYWlkbF90cmFjZSgiQUlETDo6bmRrOjpJU3ViOjpMb2c6OmNsaWVudCIpOworICBfYWlkbF9yZXRfc3RhdHVzID0gQUlCaW5kZXJfcHJlcGFyZVRyYW5zYWN0aW9uKGFzQmluZGVyKCkuZ2V0KCksIF9haWRsX2luLmdldFIoKSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX2luLmdldCgpLCBpbl92YWx1ZSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gQUlCaW5kZXJfdHJhbnNhY3QoCisgICAgYXNCaW5kZXIoKS5nZXQoKSwKKyAgICAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDAgLypMb2cqLyksCisgICAgX2FpZGxfaW4uZ2V0UigpLAorICAgIF9haWRsX291dC5nZXRSKCksCisgICAgMAorICAgICNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgICB8IEZMQUdfUFJJVkFURV9MT0NBTAorICAgICNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgICAgKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgPT0gU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT04gJiYgSVN1Yjo6Z2V0RGVmYXVsdEltcGwoKSkgeworICAgIF9haWRsX3N0YXR1cyA9IElTdWI6OmdldERlZmF1bHRJbXBsKCktPkxvZyhpbl92YWx1ZSk7CisgICAgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOworICB9CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkU3RhdHVzSGVhZGVyKF9haWRsX291dC5nZXQoKSwgX2FpZGxfc3RhdHVzLmdldFIoKSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47CisgIF9haWRsX2Vycm9yOgorICBfYWlkbF9zdGF0dXMuc2V0KEFTdGF0dXNfZnJvbVN0YXR1cyhfYWlkbF9yZXRfc3RhdHVzKSk7CisgIF9haWRsX3N0YXR1c19yZXR1cm46CisgIGlmIChJTG9nZ2FibGVJbnRlcmZhY2U6OkJwU3ViOjpsb2dGdW5jICE9IG51bGxwdHIpIHsKKyAgICBhdXRvIF9sb2dfZW5kID0gc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCk7CisgICAgX3RyYW5zYWN0aW9uX2xvZy5kdXJhdGlvbl9tcyA9IHN0ZDo6Y2hyb25vOjpkdXJhdGlvbjxkb3VibGUsIHN0ZDo6bWlsbGk+KF9sb2dfZW5kIC0gX2xvZ19zdGFydCkuY291bnQoKTsKKyAgICBfdHJhbnNhY3Rpb25fbG9nLmludGVyZmFjZV9uYW1lID0gImFuZHJvaWQuYWlkbC5sb2dnYWJsZS5JTG9nZ2FibGVJbnRlcmZhY2UuSVN1YiI7CisgICAgX3RyYW5zYWN0aW9uX2xvZy5tZXRob2RfbmFtZSA9ICJMb2ciOworICAgIF90cmFuc2FjdGlvbl9sb2cuc3R1Yl9hZGRyZXNzID0gbnVsbHB0cjsKKyAgICBfdHJhbnNhY3Rpb25fbG9nLnByb3h5X2FkZHJlc3MgPSBzdGF0aWNfY2FzdDxjb25zdCB2b2lkKj4odGhpcyk7CisgICAgX3RyYW5zYWN0aW9uX2xvZy5leGNlcHRpb25fY29kZSA9IEFTdGF0dXNfZ2V0RXhjZXB0aW9uQ29kZShfYWlkbF9zdGF0dXMuZ2V0KCkpOworICAgIF90cmFuc2FjdGlvbl9sb2cuZXhjZXB0aW9uX21lc3NhZ2UgPSBBU3RhdHVzX2dldE1lc3NhZ2UoX2FpZGxfc3RhdHVzLmdldCgpKTsKKyAgICBfdHJhbnNhY3Rpb25fbG9nLnRyYW5zYWN0aW9uX2Vycm9yID0gQVN0YXR1c19nZXRTdGF0dXMoX2FpZGxfc3RhdHVzLmdldCgpKTsKKyAgICBfdHJhbnNhY3Rpb25fbG9nLnNlcnZpY2Vfc3BlY2lmaWNfZXJyb3JfY29kZSA9IEFTdGF0dXNfZ2V0U2VydmljZVNwZWNpZmljRXJyb3IoX2FpZGxfc3RhdHVzLmdldCgpKTsKKyAgICBJTG9nZ2FibGVJbnRlcmZhY2U6OkJwU3ViOjpsb2dGdW5jKF90cmFuc2FjdGlvbl9sb2cpOworICB9CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9CisvLyBTb3VyY2UgZm9yIEJuU3ViCitJTG9nZ2FibGVJbnRlcmZhY2U6OkJuU3ViOjpCblN1YigpIHt9CitJTG9nZ2FibGVJbnRlcmZhY2U6OkJuU3ViOjp+Qm5TdWIoKSB7fQorc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IElMb2dnYWJsZUludGVyZmFjZTo6Qm5TdWI6OlRyYW5zYWN0aW9uTG9nJik+IElMb2dnYWJsZUludGVyZmFjZTo6Qm5TdWI6OmxvZ0Z1bmM7Cis6Om5kazo6U3BBSUJpbmRlciBJTG9nZ2FibGVJbnRlcmZhY2U6OkJuU3ViOjpjcmVhdGVCaW5kZXIoKSB7CisgIEFJQmluZGVyKiBiaW5kZXIgPSBBSUJpbmRlcl9uZXcoX2dfYWlkbF9hbmRyb2lkX2FpZGxfbG9nZ2FibGVfSUxvZ2dhYmxlSW50ZXJmYWNlX0lTdWJfY2xhenosIHN0YXRpY19jYXN0PHZvaWQqPih0aGlzKSk7CisgICNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgQUlCaW5kZXJfbWFya0NvbXBpbGF0aW9uVW5pdFN0YWJpbGl0eShiaW5kZXIpOworICAjZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICByZXR1cm4gOjpuZGs6OlNwQUlCaW5kZXIoYmluZGVyKTsKK30KKy8vIFNvdXJjZSBmb3IgSVN1YgorY29uc3QgY2hhciogSUxvZ2dhYmxlSW50ZXJmYWNlOjpJU3ViOjpkZXNjcmlwdG9yID0gImFuZHJvaWQuYWlkbC5sb2dnYWJsZS5JTG9nZ2FibGVJbnRlcmZhY2UuSVN1YiI7CitJTG9nZ2FibGVJbnRlcmZhY2U6OklTdWI6OklTdWIoKSB7fQorSUxvZ2dhYmxlSW50ZXJmYWNlOjpJU3ViOjp+SVN1YigpIHt9CisKKworc3RkOjpzaGFyZWRfcHRyPElMb2dnYWJsZUludGVyZmFjZTo6SVN1Yj4gSUxvZ2dhYmxlSW50ZXJmYWNlOjpJU3ViOjpmcm9tQmluZGVyKGNvbnN0IDo6bmRrOjpTcEFJQmluZGVyJiBiaW5kZXIpIHsKKyAgaWYgKCFBSUJpbmRlcl9hc3NvY2lhdGVDbGFzcyhiaW5kZXIuZ2V0KCksIF9nX2FpZGxfYW5kcm9pZF9haWRsX2xvZ2dhYmxlX0lMb2dnYWJsZUludGVyZmFjZV9JU3ViX2NsYXp6KSkgeyByZXR1cm4gbnVsbHB0cjsgfQorICBzdGQ6OnNoYXJlZF9wdHI8OjpuZGs6OklDSW50ZXJmYWNlPiBpbnRlcmZhY2UgPSA6Om5kazo6SUNJbnRlcmZhY2U6OmFzSW50ZXJmYWNlKGJpbmRlci5nZXQoKSk7CisgIGlmIChpbnRlcmZhY2UpIHsKKyAgICByZXR1cm4gc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PElTdWI+KGludGVyZmFjZSk7CisgIH0KKyAgcmV0dXJuIDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPElMb2dnYWJsZUludGVyZmFjZTo6QnBTdWI+KGJpbmRlcik7Cit9CisKK2JpbmRlcl9zdGF0dXNfdCBJTG9nZ2FibGVJbnRlcmZhY2U6OklTdWI6OndyaXRlVG9QYXJjZWwoQVBhcmNlbCogcGFyY2VsLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVN1Yj4mIGluc3RhbmNlKSB7CisgIHJldHVybiBBUGFyY2VsX3dyaXRlU3Ryb25nQmluZGVyKHBhcmNlbCwgaW5zdGFuY2UgPyBpbnN0YW5jZS0+YXNCaW5kZXIoKS5nZXQoKSA6IG51bGxwdHIpOworfQorYmluZGVyX3N0YXR1c190IElMb2dnYWJsZUludGVyZmFjZTo6SVN1Yjo6cmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogcGFyY2VsLCBzdGQ6OnNoYXJlZF9wdHI8SVN1Yj4qIGluc3RhbmNlKSB7CisgIDo6bmRrOjpTcEFJQmluZGVyIGJpbmRlcjsKKyAgYmluZGVyX3N0YXR1c190IHN0YXR1cyA9IEFQYXJjZWxfcmVhZFN0cm9uZ0JpbmRlcihwYXJjZWwsIGJpbmRlci5nZXRSKCkpOworICBpZiAoc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIHN0YXR1czsKKyAgKmluc3RhbmNlID0gSVN1Yjo6ZnJvbUJpbmRlcihiaW5kZXIpOworICByZXR1cm4gU1RBVFVTX09LOworfQorYm9vbCBJTG9nZ2FibGVJbnRlcmZhY2U6OklTdWI6OnNldERlZmF1bHRJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJU3ViPiYgaW1wbCkgeworICAvLyBPbmx5IG9uZSB1c2VyIG9mIHRoaXMgaW50ZXJmYWNlIGNhbiB1c2UgdGhpcyBmdW5jdGlvbgorICAvLyBhdCBhIHRpbWUuIFRoaXMgaXMgYSBoZXVyaXN0aWMgdG8gZGV0ZWN0IGlmIHR3byBkaWZmZXJlbnQKKyAgLy8gdXNlcnMgaW4gdGhlIHNhbWUgcHJvY2VzcyB1c2UgdGhpcyBmdW5jdGlvbi4KKyAgYXNzZXJ0KCFJU3ViOjpkZWZhdWx0X2ltcGwpOworICBpZiAoaW1wbCkgeworICAgIElTdWI6OmRlZmF1bHRfaW1wbCA9IGltcGw7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElMb2dnYWJsZUludGVyZmFjZTo6SVN1Yj4mIElMb2dnYWJsZUludGVyZmFjZTo6SVN1Yjo6Z2V0RGVmYXVsdEltcGwoKSB7CisgIHJldHVybiBJU3ViOjpkZWZhdWx0X2ltcGw7Cit9CitzdGQ6OnNoYXJlZF9wdHI8SUxvZ2dhYmxlSW50ZXJmYWNlOjpJU3ViPiBJTG9nZ2FibGVJbnRlcmZhY2U6OklTdWI6OmRlZmF1bHRfaW1wbCA9IG51bGxwdHI7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBJTG9nZ2FibGVJbnRlcmZhY2U6OklTdWJEZWZhdWx0OjpMb2coaW50MzJfdCAvKmluX3ZhbHVlKi8pIHsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOworICBfYWlkbF9zdGF0dXMuc2V0KEFTdGF0dXNfZnJvbVN0YXR1cyhTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTikpOworICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorOjpuZGs6OlNwQUlCaW5kZXIgSUxvZ2dhYmxlSW50ZXJmYWNlOjpJU3ViRGVmYXVsdDo6YXNCaW5kZXIoKSB7CisgIHJldHVybiA6Om5kazo6U3BBSUJpbmRlcigpOworfQorYm9vbCBJTG9nZ2FibGVJbnRlcmZhY2U6OklTdWJEZWZhdWx0Ojppc1JlbW90ZSgpIHsKKyAgcmV0dXJuIGZhbHNlOworfQorfSAgLy8gbmFtZXNwYWNlIGxvZ2dhYmxlCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0lMb2dnYWJsZUludGVyZmFjZS5jcHAuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvSUxvZ2dhYmxlSW50ZXJmYWNlLmNwcC5kCmluZGV4IGY1YzU1NmQuLjNiY2RjZDQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvSUxvZ2dhYmxlSW50ZXJmYWNlLmNwcC5kCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvSUxvZ2dhYmxlSW50ZXJmYWNlLmNwcC5kCkBAIC0xLDMgKzEsNSBAQAogb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0lMb2dnYWJsZUludGVyZmFjZS5jcHAgOiBcCiAgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9JTG9nZ2FibGVJbnRlcmZhY2UuYWlkbCBcCi0gIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9EYXRhLmFpZGwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0RhdGEuYWlkbCBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9Vbmlvbi5haWRsIFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0VudW0uYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9Vbmlvbi5jcHAgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2xvZ2dhYmxlL1VuaW9uLmNwcAppbmRleCA3ZDAyZDRkLi4yZDgxOTFlIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2xvZ2dhYmxlL1VuaW9uLmNwcAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2xvZ2dhYmxlL1VuaW9uLmNwcApAQCAtMTEsMTEgKzExLDExIEBACiBiaW5kZXJfc3RhdHVzX3QgVW5pb246OnJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIF9wYXJjZWwpIHsKICAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXM7CiAgIGludDMyX3QgX2FpZGxfdGFnOwotICBpZiAoKF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihfcGFyY2VsLCAmX2FpZGxfdGFnKSkgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLSAgc3dpdGNoIChfYWlkbF90YWcpIHsKKyAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX3BhcmNlbCwgJl9haWRsX3RhZykpICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIHN3aXRjaCAoc3RhdGljX2Nhc3Q8VGFnPihfYWlkbF90YWcpKSB7CiAgIGNhc2UgbnVtOiB7CiAgICAgaW50MzJfdCBfYWlkbF92YWx1ZTsKLSAgICBpZiAoKF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihfcGFyY2VsLCAmX2FpZGxfdmFsdWUpKSAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICAgIGlmICgoX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9wYXJjZWwsICZfYWlkbF92YWx1ZSkpICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CiAgICAgaWYgY29uc3RleHByIChzdGQ6OmlzX3RyaXZpYWxseV9jb3B5YWJsZV92PGludDMyX3Q+KSB7CiAgICAgICBzZXQ8bnVtPihfYWlkbF92YWx1ZSk7CiAgICAgfSBlbHNlIHsKQEAgLTI1LDcgKzI1LDcgQEAKICAgICByZXR1cm4gU1RBVFVTX09LOyB9CiAgIGNhc2Ugc3RyOiB7CiAgICAgc3RkOjpzdHJpbmcgX2FpZGxfdmFsdWU7Ci0gICAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFN0cmluZyhfcGFyY2VsLCAmX2FpZGxfdmFsdWUpKSAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICAgIGlmICgoX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9wYXJjZWwsICZfYWlkbF92YWx1ZSkpICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CiAgICAgaWYgY29uc3RleHByIChzdGQ6OmlzX3RyaXZpYWxseV9jb3B5YWJsZV92PHN0ZDo6c3RyaW5nPikgewogICAgICAgc2V0PHN0cj4oX2FpZGxfdmFsdWUpOwogICAgIH0gZWxzZSB7CkBAIC0zNywxMSArMzcsMTEgQEAKICAgcmV0dXJuIFNUQVRVU19CQURfVkFMVUU7CiB9CiBiaW5kZXJfc3RhdHVzX3QgVW5pb246OndyaXRlVG9QYXJjZWwoQVBhcmNlbCogX3BhcmNlbCkgY29uc3QgewotICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQzMihfcGFyY2VsLCBnZXRUYWcoKSk7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9wYXJjZWwsIHN0YXRpY19jYXN0PGludDMyX3Q+KGdldFRhZygpKSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CiAgIHN3aXRjaCAoZ2V0VGFnKCkpIHsKLSAgY2FzZSBudW06IHJldHVybiBBUGFyY2VsX3dyaXRlSW50MzIoX3BhcmNlbCwgZ2V0PG51bT4oKSk7Ci0gIGNhc2Ugc3RyOiByZXR1cm4gOjpuZGs6OkFQYXJjZWxfd3JpdGVTdHJpbmcoX3BhcmNlbCwgZ2V0PHN0cj4oKSk7CisgIGNhc2UgbnVtOiByZXR1cm4gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9wYXJjZWwsIGdldDxudW0+KCkpOworICBjYXNlIHN0cjogcmV0dXJuIDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfcGFyY2VsLCBnZXQ8c3RyPigpKTsKICAgfQogICBfX2Fzc2VydDIoX19GSUxFX18sIF9fTElORV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fLCAiY2FuJ3QgcmVhY2ggaGVyZSIpOwogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvQm5Mb2dnYWJsZUludGVyZmFjZS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvQm5Mb2dnYWJsZUludGVyZmFjZS5oCmluZGV4IDY1MGNhODYuLmQ2ZjYxZTEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0JuTG9nZ2FibGVJbnRlcmZhY2UuaAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9CbkxvZ2dhYmxlSW50ZXJmYWNlLmgKQEAgLTMsNiArMywxMyBAQAogI2luY2x1ZGUgImFpZGwvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0lMb2dnYWJsZUludGVyZmFjZS5oIgogCiAjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaWJpbmRlci5oPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisKKyNpZm5kZWYgX19CSU9OSUNfXworI2lmbmRlZiBfX2Fzc2VydDIKKyNkZWZpbmUgX19hc3NlcnQyKGEsYixjLGQpICgodm9pZCkwKQorI2VuZGlmCisjZW5kaWYKIAogbmFtZXNwYWNlIGFpZGwgewogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtMzEsNiArMzgsMTkgQEAKICAgOjpuZGs6OlNwQUlCaW5kZXIgY3JlYXRlQmluZGVyKCkgb3ZlcnJpZGU7CiBwcml2YXRlOgogfTsKK2NsYXNzIElMb2dnYWJsZUludGVyZmFjZURlbGVnYXRvciA6IHB1YmxpYyBCbkxvZ2dhYmxlSW50ZXJmYWNlIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgSUxvZ2dhYmxlSW50ZXJmYWNlRGVsZWdhdG9yKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJTG9nZ2FibGVJbnRlcmZhY2U+ICZpbXBsKSA6IF9pbXBsKGltcGwpIHsKKyAgfQorCisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIExvZ1RoaXMoYm9vbCBpbl9ib29sVmFsdWUsIHN0ZDo6dmVjdG9yPGJvb2w+KiBpbl9ib29sQXJyYXksIGludDhfdCBpbl9ieXRlVmFsdWUsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBpbl9ieXRlQXJyYXksIGNoYXIxNl90IGluX2NoYXJWYWx1ZSwgc3RkOjp2ZWN0b3I8Y2hhcjE2X3Q+KiBpbl9jaGFyQXJyYXksIGludDMyX3QgaW5faW50VmFsdWUsIHN0ZDo6dmVjdG9yPGludDMyX3Q+KiBpbl9pbnRBcnJheSwgaW50NjRfdCBpbl9sb25nVmFsdWUsIHN0ZDo6dmVjdG9yPGludDY0X3Q+KiBpbl9sb25nQXJyYXksIGZsb2F0IGluX2Zsb2F0VmFsdWUsIHN0ZDo6dmVjdG9yPGZsb2F0PiogaW5fZmxvYXRBcnJheSwgZG91YmxlIGluX2RvdWJsZVZhbHVlLCBzdGQ6OnZlY3Rvcjxkb3VibGU+KiBpbl9kb3VibGVBcnJheSwgY29uc3Qgc3RkOjpzdHJpbmcmIGluX3N0cmluZ1ZhbHVlLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIGluX3N0cmluZ0FycmF5LCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIGluX2xpc3RWYWx1ZSwgY29uc3QgOjphaWRsOjphbmRyb2lkOjphaWRsOjpsb2dnYWJsZTo6RGF0YSYgaW5fZGF0YVZhbHVlLCBjb25zdCA6Om5kazo6U3BBSUJpbmRlciYgaW5fYmluZGVyVmFsdWUsIDo6bmRrOjpTY29wZWRGaWxlRGVzY3JpcHRvciogaW5fcGZkVmFsdWUsIHN0ZDo6dmVjdG9yPDo6bmRrOjpTY29wZWRGaWxlRGVzY3JpcHRvcj4qIGluX3BmZEFycmF5LCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfaW1wbC0+TG9nVGhpcyhpbl9ib29sVmFsdWUsIGluX2Jvb2xBcnJheSwgaW5fYnl0ZVZhbHVlLCBpbl9ieXRlQXJyYXksIGluX2NoYXJWYWx1ZSwgaW5fY2hhckFycmF5LCBpbl9pbnRWYWx1ZSwgaW5faW50QXJyYXksIGluX2xvbmdWYWx1ZSwgaW5fbG9uZ0FycmF5LCBpbl9mbG9hdFZhbHVlLCBpbl9mbG9hdEFycmF5LCBpbl9kb3VibGVWYWx1ZSwgaW5fZG91YmxlQXJyYXksIGluX3N0cmluZ1ZhbHVlLCBpbl9zdHJpbmdBcnJheSwgaW5fbGlzdFZhbHVlLCBpbl9kYXRhVmFsdWUsIGluX2JpbmRlclZhbHVlLCBpbl9wZmRWYWx1ZSwgaW5fcGZkQXJyYXksIF9haWRsX3JldHVybik7CisgIH0KK3Byb3RlY3RlZDoKK3ByaXZhdGU6CisgIHN0ZDo6c2hhcmVkX3B0cjxJTG9nZ2FibGVJbnRlcmZhY2U+IF9pbXBsOworfTsKKwogfSAgLy8gbmFtZXNwYWNlIGxvZ2dhYmxlCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0RhdGEuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0RhdGEuaAppbmRleCBlY2M3ODhlLi5lZGQzOGUyIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9EYXRhLmgKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvRGF0YS5oCkBAIC0xLDE3ICsxLDE5IEBACiAjcHJhZ21hIG9uY2UKLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pbnRlcmZhY2VfdXRpbHMuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wYXJjZWxhYmxlX3V0aWxzLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfdG9fc3RyaW5nLmg+CisKICNpbmNsdWRlIDxjc3RkaW50PgogI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxvcHRpb25hbD4KICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2ludGVyZmFjZV91dGlscy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3BhcmNlbGFibGVfdXRpbHMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl90b19zdHJpbmcuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9FbnVtLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvVW5pb24uaD4KICNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKICNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9zdGFiaWxpdHkuaD4KICNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCi0jaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvRW51bS5oPgotI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL1VuaW9uLmg+CisKIG5hbWVzcGFjZSBhaWRsIHsKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBhaWRsIHsKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0VudW0uaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0VudW0uaAppbmRleCAxZjAyMDgwLi45OTU0MmFiIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9FbnVtLmgKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvRW51bS5oCkBAIC0xLDE1ICsxLDE2IEBACiAjcHJhZ21hIG9uY2UKIAorI2luY2x1ZGUgPGFycmF5PgogI2luY2x1ZGUgPGNzdGRpbnQ+CiAjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPG9wdGlvbmFsPgogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfZW51bXMuaD4KICNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKICNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9zdGFiaWxpdHkuaD4KICNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCi0jaW5jbHVkZSA8YXJyYXk+Ci0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfZW51bXMuaD4KKwogbmFtZXNwYWNlIGFpZGwgewogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGFpZGwgewpAQCAtMTgsNiArMTksMTQgQEAKICAgRk9PID0gNDIsCiB9OwogCit9ICAvLyBuYW1lc3BhY2UgbG9nZ2FibGUKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBsb2dnYWJsZSB7CiBbW25vZGlzY2FyZF1dIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoRW51bSB2YWwpIHsKICAgc3dpdGNoKHZhbCkgewogICBjYXNlIEVudW06OkZPTzoKQEAgLTQwLDQgKzQ5LDQgQEAKIH07CiAjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCiB9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgbmRrCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9JTG9nZ2FibGVJbnRlcmZhY2UuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0lMb2dnYWJsZUludGVyZmFjZS5oCmluZGV4IDMzYzc5ZTEuLjlhYjAyNDggMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0lMb2dnYWJsZUludGVyZmFjZS5oCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0lMb2dnYWJsZUludGVyZmFjZS5oCkBAIC0xLDE5ICsxLDIwIEBACiAjcHJhZ21hIG9uY2UKIAotI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2ludGVyZmFjZV91dGlscy5oPgotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiAjaW5jbHVkZSA8Y2hyb25vPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0KICNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiAjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPG9wdGlvbmFsPgorI2luY2x1ZGUgPHNzdHJlYW0+CiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pYmluZGVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaW50ZXJmYWNlX3V0aWxzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC90cmFjZS5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0RhdGEuaD4KICNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKICNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9zdGFiaWxpdHkuaD4KICNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCi0jaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvRGF0YS5oPgogCiBuYW1lc3BhY2UgYWlkbCB7CiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC0yNSw2ICsyNiw3NCBAQAogICBJTG9nZ2FibGVJbnRlcmZhY2UoKTsKICAgdmlydHVhbCB+SUxvZ2dhYmxlSW50ZXJmYWNlKCk7CiAKKyAgY2xhc3MgSVN1YiA6IHB1YmxpYyA6Om5kazo6SUNJbnRlcmZhY2UgeworICBwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGRlc2NyaXB0b3I7CisgICAgSVN1YigpOworICAgIHZpcnR1YWwgfklTdWIoKTsKKworICAgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fTG9nID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDA7CisKKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPElTdWI+IGZyb21CaW5kZXIoY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGJpbmRlcik7CisgICAgc3RhdGljIGJpbmRlcl9zdGF0dXNfdCB3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIHBhcmNlbCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElTdWI+JiBpbnN0YW5jZSk7CisgICAgc3RhdGljIGJpbmRlcl9zdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBwYXJjZWwsIHN0ZDo6c2hhcmVkX3B0cjxJU3ViPiogaW5zdGFuY2UpOworICAgIHN0YXRpYyBib29sIHNldERlZmF1bHRJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJU3ViPiYgaW1wbCk7CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJU3ViPiYgZ2V0RGVmYXVsdEltcGwoKTsKKyAgICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIExvZyhpbnQzMl90IGluX3ZhbHVlKSA9IDA7CisgIHByaXZhdGU6CisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxJU3ViPiBkZWZhdWx0X2ltcGw7CisgIH07CisgIGNsYXNzIElTdWJEZWZhdWx0IDogcHVibGljIElTdWIgeworICBwdWJsaWM6CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgTG9nKGludDMyX3QgaW5fdmFsdWUpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTcEFJQmluZGVyIGFzQmluZGVyKCkgb3ZlcnJpZGU7CisgICAgYm9vbCBpc1JlbW90ZSgpIG92ZXJyaWRlOworICB9OworICBjbGFzcyBCcFN1YiA6IHB1YmxpYyA6Om5kazo6QnBDSW50ZXJmYWNlPElTdWI+IHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IEJwU3ViKGNvbnN0IDo6bmRrOjpTcEFJQmluZGVyJiBiaW5kZXIpOworICAgIHZpcnR1YWwgfkJwU3ViKCk7CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBMb2coaW50MzJfdCBpbl92YWx1ZSkgb3ZlcnJpZGU7CisgICAgc3RydWN0IFRyYW5zYWN0aW9uTG9nIHsKKyAgICAgIGRvdWJsZSBkdXJhdGlvbl9tczsKKyAgICAgIHN0ZDo6c3RyaW5nIGludGVyZmFjZV9uYW1lOworICAgICAgc3RkOjpzdHJpbmcgbWV0aG9kX25hbWU7CisgICAgICBjb25zdCB2b2lkKiBwcm94eV9hZGRyZXNzOworICAgICAgY29uc3Qgdm9pZCogc3R1Yl9hZGRyZXNzOworICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4+IGlucHV0X2FyZ3M7CisgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj4gb3V0cHV0X2FyZ3M7CisgICAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CisgICAgICBzdGQ6OnN0cmluZyBleGNlcHRpb25fbWVzc2FnZTsKKyAgICAgIGludDMyX3QgZXhjZXB0aW9uX2NvZGU7CisgICAgICBpbnQzMl90IHRyYW5zYWN0aW9uX2Vycm9yOworICAgICAgaW50MzJfdCBzZXJ2aWNlX3NwZWNpZmljX2Vycm9yX2NvZGU7CisgICAgfTsKKyAgICBzdGF0aWMgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFRyYW5zYWN0aW9uTG9nJik+IGxvZ0Z1bmM7CisgIH07CisgIGNsYXNzIEJuU3ViIDogcHVibGljIDo6bmRrOjpCbkNJbnRlcmZhY2U8SVN1Yj4geworICBwdWJsaWM6CisgICAgQm5TdWIoKTsKKyAgICB2aXJ0dWFsIH5CblN1YigpOworICAgIHN0cnVjdCBUcmFuc2FjdGlvbkxvZyB7CisgICAgICBkb3VibGUgZHVyYXRpb25fbXM7CisgICAgICBzdGQ6OnN0cmluZyBpbnRlcmZhY2VfbmFtZTsKKyAgICAgIHN0ZDo6c3RyaW5nIG1ldGhvZF9uYW1lOworICAgICAgY29uc3Qgdm9pZCogcHJveHlfYWRkcmVzczsKKyAgICAgIGNvbnN0IHZvaWQqIHN0dWJfYWRkcmVzczsKKyAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+PiBpbnB1dF9hcmdzOworICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4+IG91dHB1dF9hcmdzOworICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0OworICAgICAgc3RkOjpzdHJpbmcgZXhjZXB0aW9uX21lc3NhZ2U7CisgICAgICBpbnQzMl90IGV4Y2VwdGlvbl9jb2RlOworICAgICAgaW50MzJfdCB0cmFuc2FjdGlvbl9lcnJvcjsKKyAgICAgIGludDMyX3Qgc2VydmljZV9zcGVjaWZpY19lcnJvcl9jb2RlOworICAgIH07CisgICAgc3RhdGljIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBUcmFuc2FjdGlvbkxvZyYpPiBsb2dGdW5jOworICBwcm90ZWN0ZWQ6CisgICAgOjpuZGs6OlNwQUlCaW5kZXIgY3JlYXRlQmluZGVyKCkgb3ZlcnJpZGU7CisgIHByaXZhdGU6CisgIH07CiAgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fTG9nVGhpcyA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAwOwogCiAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8SUxvZ2dhYmxlSW50ZXJmYWNlPiBmcm9tQmluZGVyKGNvbnN0IDo6bmRrOjpTcEFJQmluZGVyJiBiaW5kZXIpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvVW5pb24uaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL1VuaW9uLmgKaW5kZXggZjUzNzUyYS4uZWYwNTMyZiAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvVW5pb24uaAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9Vbmlvbi5oCkBAIC0xLDE3ICsxLDE5IEBACiAjcHJhZ21hIG9uY2UKLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pbnRlcmZhY2VfdXRpbHMuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wYXJjZWxhYmxlX3V0aWxzLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfdG9fc3RyaW5nLmg+CiAKKyNpbmNsdWRlIDxhcnJheT4KICNpbmNsdWRlIDxjYXNzZXJ0PgotI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0jaW5jbHVkZSA8dmFyaWFudD4KICNpbmNsdWRlIDxjc3RkaW50PgogI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxvcHRpb25hbD4KICNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2YXJpYW50PgogI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9lbnVtcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2ludGVyZmFjZV91dGlscy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3BhcmNlbGFibGVfdXRpbHMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl90b19zdHJpbmcuaD4KICNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKICNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9zdGFiaWxpdHkuaD4KICNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCkBAIC0yOSwxOSArMzEsMTkgQEAKICAgdHlwZWRlZiBzdGQ6OmZhbHNlX3R5cGUgZml4ZWRfc2l6ZTsKICAgc3RhdGljIGNvbnN0IGNoYXIqIGRlc2NyaXB0b3I7CiAKLSAgZW51bSBUYWcgOiBpbnQzMl90IHsKLSAgICBudW0gPSAwLCAgLy8gaW50IG51bTsKLSAgICBzdHIsICAvLyBTdHJpbmcgc3RyOworICBlbnVtIGNsYXNzIFRhZyA6IGludDMyX3QgeworICAgIG51bSA9IDAsCisgICAgc3RyID0gMSwKICAgfTsKIAorICAvLyBFeHBvc2UgdGFnIHN5bWJvbHMgZm9yIGxlZ2FjeSBjb2RlCisgIHN0YXRpYyBjb25zdCBpbmxpbmUgVGFnIG51bSA9IFRhZzo6bnVtOworICBzdGF0aWMgY29uc3QgaW5saW5lIFRhZyBzdHIgPSBUYWc6OnN0cjsKKwogICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CiAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBfbm90X3NlbGYgPSAhc3RkOjppc19zYW1lX3Y8c3RkOjpyZW1vdmVfY3ZfdDxzdGQ6OnJlbW92ZV9yZWZlcmVuY2VfdDxfVHA+PiwgVW5pb24+OwogCi0gIFVuaW9uKCkgOiBfdmFsdWUoc3RkOjppbl9wbGFjZV9pbmRleDxudW0+LCBpbnQzMl90KDQzKSkgeyB9Ci0gIFVuaW9uKGNvbnN0IFVuaW9uJikgPSBkZWZhdWx0OwotICBVbmlvbihVbmlvbiYmKSA9IGRlZmF1bHQ7Ci0gIFVuaW9uJiBvcGVyYXRvcj0oY29uc3QgVW5pb24mKSA9IGRlZmF1bHQ7Ci0gIFVuaW9uJiBvcGVyYXRvcj0oVW5pb24mJikgPSBkZWZhdWx0OworICBVbmlvbigpIDogX3ZhbHVlKHN0ZDo6aW5fcGxhY2VfaW5kZXg8c3RhdGljX2Nhc3Q8c2l6ZV90PihudW0pPiwgaW50MzJfdCg0MykpIHsgfQogCiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lID0gc3RkOjplbmFibGVfaWZfdDxfbm90X3NlbGY8X1RwPj4+CiAgIC8vIE5PTElOVE5FWFRMSU5FKGdvb2dsZS1leHBsaWNpdC1jb25zdHJ1Y3RvcikKQEAgLTU0LDEyICs1NiwxMiBAQAogCiAgIHRlbXBsYXRlIDxUYWcgX3RhZywgdHlwZW5hbWUuLi4gX1RwPgogICBzdGF0aWMgVW5pb24gbWFrZShfVHAmJi4uLiBfYXJncykgewotICAgIHJldHVybiBVbmlvbihzdGQ6OmluX3BsYWNlX2luZGV4PF90YWc+LCBzdGQ6OmZvcndhcmQ8X1RwPihfYXJncykuLi4pOworICAgIHJldHVybiBVbmlvbihzdGQ6OmluX3BsYWNlX2luZGV4PHN0YXRpY19jYXN0PHNpemVfdD4oX3RhZyk+LCBzdGQ6OmZvcndhcmQ8X1RwPihfYXJncykuLi4pOwogICB9CiAKICAgdGVtcGxhdGUgPFRhZyBfdGFnLCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lLi4uIF9VcD4KICAgc3RhdGljIFVuaW9uIG1ha2Uoc3RkOjppbml0aWFsaXplcl9saXN0PF9UcD4gX2lsLCBfVXAmJi4uLiBfYXJncykgewotICAgIHJldHVybiBVbmlvbihzdGQ6OmluX3BsYWNlX2luZGV4PF90YWc+LCBzdGQ6Om1vdmUoX2lsKSwgc3RkOjpmb3J3YXJkPF9VcD4oX2FyZ3MpLi4uKTsKKyAgICByZXR1cm4gVW5pb24oc3RkOjppbl9wbGFjZV9pbmRleDxzdGF0aWNfY2FzdDxzaXplX3Q+KF90YWcpPiwgc3RkOjptb3ZlKF9pbCksIHN0ZDo6Zm9yd2FyZDxfVXA+KF9hcmdzKS4uLik7CiAgIH0KIAogICBUYWcgZ2V0VGFnKCkgY29uc3QgewpAQCAtNjksMTggKzcxLDE4IEBACiAgIHRlbXBsYXRlIDxUYWcgX3RhZz4KICAgY29uc3QgYXV0byYgZ2V0KCkgY29uc3QgewogICAgIGlmIChnZXRUYWcoKSAhPSBfdGFnKSB7IF9fYXNzZXJ0MihfX0ZJTEVfXywgX19MSU5FX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18sICJiYWQgYWNjZXNzOiBhIHdyb25nIHRhZyIpOyB9Ci0gICAgcmV0dXJuIHN0ZDo6Z2V0PF90YWc+KF92YWx1ZSk7CisgICAgcmV0dXJuIHN0ZDo6Z2V0PHN0YXRpY19jYXN0PHNpemVfdD4oX3RhZyk+KF92YWx1ZSk7CiAgIH0KIAogICB0ZW1wbGF0ZSA8VGFnIF90YWc+CiAgIGF1dG8mIGdldCgpIHsKICAgICBpZiAoZ2V0VGFnKCkgIT0gX3RhZykgeyBfX2Fzc2VydDIoX19GSUxFX18sIF9fTElORV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fLCAiYmFkIGFjY2VzczogYSB3cm9uZyB0YWciKTsgfQotICAgIHJldHVybiBzdGQ6OmdldDxfdGFnPihfdmFsdWUpOworICAgIHJldHVybiBzdGQ6OmdldDxzdGF0aWNfY2FzdDxzaXplX3Q+KF90YWcpPihfdmFsdWUpOwogICB9CiAKICAgdGVtcGxhdGUgPFRhZyBfdGFnLCB0eXBlbmFtZS4uLiBfVHA+CiAgIHZvaWQgc2V0KF9UcCYmLi4uIF9hcmdzKSB7Ci0gICAgX3ZhbHVlLmVtcGxhY2U8X3RhZz4oc3RkOjpmb3J3YXJkPF9UcD4oX2FyZ3MpLi4uKTsKKyAgICBfdmFsdWUuZW1wbGFjZTxzdGF0aWNfY2FzdDxzaXplX3Q+KF90YWcpPihzdGQ6OmZvcndhcmQ8X1RwPihfYXJncykuLi4pOwogICB9CiAKICAgYmluZGVyX3N0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIF9wYXJjZWwpOwpAQCAtMTIzLDMgKzEyNSwzMyBAQAogfSAgLy8gbmFtZXNwYWNlIGFpZGwKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAorbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGxvZ2dhYmxlIHsKK1tbbm9kaXNjYXJkXV0gc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZyhVbmlvbjo6VGFnIHZhbCkgeworICBzd2l0Y2godmFsKSB7CisgIGNhc2UgVW5pb246OlRhZzo6bnVtOgorICAgIHJldHVybiAibnVtIjsKKyAgY2FzZSBVbmlvbjo6VGFnOjpzdHI6CisgICAgcmV0dXJuICJzdHIiOworICBkZWZhdWx0OgorICAgIHJldHVybiBzdGQ6OnRvX3N0cmluZyhzdGF0aWNfY2FzdDxpbnQzMl90Pih2YWwpKTsKKyAgfQorfQorfSAgLy8gbmFtZXNwYWNlIGxvZ2dhYmxlCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCituYW1lc3BhY2UgbmRrIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XYysrMTctZXh0ZW5zaW9ucyIKK3RlbXBsYXRlIDw+Citjb25zdGV4cHIgaW5saW5lIHN0ZDo6YXJyYXk8YWlkbDo6YW5kcm9pZDo6YWlkbDo6bG9nZ2FibGU6OlVuaW9uOjpUYWcsIDI+IGVudW1fdmFsdWVzPGFpZGw6OmFuZHJvaWQ6OmFpZGw6OmxvZ2dhYmxlOjpVbmlvbjo6VGFnPiA9IHsKKyAgYWlkbDo6YW5kcm9pZDo6YWlkbDo6bG9nZ2FibGU6OlVuaW9uOjpUYWc6Om51bSwKKyAgYWlkbDo6YW5kcm9pZDo6YWlkbDo6bG9nZ2FibGU6OlVuaW9uOjpUYWc6OnN0ciwKK307CisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBuZGsKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvRGF0YS5jcHAgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0RhdGEuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWJhM2MzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvRGF0YS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0jaW5jbHVkZSAiYWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvRGF0YS5oIgotCi0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcGFyY2VsX3V0aWxzLmg+Ci0KLW5hbWVzcGFjZSBhaWRsIHsKLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBhaWRsIHsKLW5hbWVzcGFjZSBsb2dnYWJsZSB7Ci1jb25zdCBjaGFyKiBEYXRhOjpkZXNjcmlwdG9yID0gImFuZHJvaWQuYWlkbC5sb2dnYWJsZS5EYXRhIjsKLQotYmluZGVyX3N0YXR1c190IERhdGE6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIHBhcmNlbCkgewotICBpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfc2l6ZTsKLSAgaW50MzJfdCBfYWlkbF9zdGFydF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpOwotICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyKHBhcmNlbCwgJl9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gIGlmIChfYWlkbF9zdGFydF9wb3MgPiBJTlQzMl9NQVggLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybiBTVEFUVVNfQkFEX1ZBTFVFOwotICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9zaXplIDwgMCkgcmV0dXJuIFNUQVRVU19CQURfVkFMVUU7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7Ci0gICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwotICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotICB9Ci0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihwYXJjZWwsICZudW0pOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewotICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLSAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFN0cmluZyhwYXJjZWwsICZzdHIpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewotICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLSAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFBhcmNlbGFibGUocGFyY2VsLCAmbmVzdGVkVW5pb24pOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewotICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLSAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkQnl0ZShwYXJjZWwsIHJlaW50ZXJwcmV0X2Nhc3Q8aW50OF90Kj4oJm5lc3RlZEVudW0pKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotfQotYmluZGVyX3N0YXR1c190IERhdGE6OndyaXRlVG9QYXJjZWwoQVBhcmNlbCogcGFyY2VsKSBjb25zdCB7Ci0gIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzOwotICBzaXplX3QgX2FpZGxfc3RhcnRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKTsKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQzMihwYXJjZWwsIDApOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIocGFyY2VsLCBudW0pOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVN0cmluZyhwYXJjZWwsIHN0cik7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlUGFyY2VsYWJsZShwYXJjZWwsIG5lc3RlZFVuaW9uKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUJ5dGUocGFyY2VsLCBzdGF0aWNfY2FzdDxpbnQ4X3Q+KG5lc3RlZEVudW0pKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBzaXplX3QgX2FpZGxfZW5kX3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCk7Ci0gIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zKTsKLSAgQVBhcmNlbF93cml0ZUludDMyKHBhcmNlbCwgX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7Ci0gIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfZW5kX3Bvcyk7Ci0gIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbG9nZ2FibGUKLX0gIC8vIG5hbWVzcGFjZSBhaWRsCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvRGF0YS5jcHAuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvRGF0YS5jcHAuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkwMzcwZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0RhdGEuY3BwLmQKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLW91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9EYXRhLmNwcCA6IFwKLSAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0RhdGEuYWlkbCBcCi0gIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9FbnVtLmFpZGwgXAotICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvVW5pb24uYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9FbnVtLmNwcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvRW51bS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMWQ3Y2IuLjAwMDAwMDAKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9FbnVtLmNwcAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS8vIFRoaXMgZmlsZSBpcyBpbnRlbnRpb25hbGx5IGxlZnQgYmxhbmsgYXMgcGxhY2Vob2xkZXIgZm9yIGVudW0gZGVjbGFyYXRpb24uCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0VudW0uY3BwLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0VudW0uY3BwLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNTA2NWIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9FbnVtLmNwcC5kCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1vdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvRW51bS5jcHAgOiBcCi0gIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9FbnVtLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvSUxvZ2dhYmxlSW50ZXJmYWNlLmNwcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvSUxvZ2dhYmxlSW50ZXJmYWNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgzNWYzYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0lMb2dnYWJsZUludGVyZmFjZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0NjcgKzAsMCBAQAotI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3BhcmNlbF91dGlscy5oPgotI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0JwTG9nZ2FibGVJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9CbkxvZ2dhYmxlSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvSUxvZ2dhYmxlSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfdG9fc3RyaW5nLmg+Ci0KLW5hbWVzcGFjZSBhaWRsIHsKLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBhaWRsIHsKLW5hbWVzcGFjZSBsb2dnYWJsZSB7Ci1jbGFzcyBTY29wZWRUcmFjZSB7Ci0gIHB1YmxpYzoKLSAgaW5saW5lIGV4cGxpY2l0IFNjb3BlZFRyYWNlKGNvbnN0IGNoYXIqIG5hbWUpIHsKLSAgQVRyYWNlX2JlZ2luU2VjdGlvbihuYW1lKTsKLSAgfQotICBpbmxpbmUgflNjb3BlZFRyYWNlKCkgewotICBBVHJhY2VfZW5kU2VjdGlvbigpOwotICB9Ci19Owotc3RhdGljIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9vblRyYW5zYWN0KEFJQmluZGVyKiBfYWlkbF9iaW5kZXIsIHRyYW5zYWN0aW9uX2NvZGVfdCBfYWlkbF9jb2RlLCBjb25zdCBBUGFyY2VsKiBfYWlkbF9pbiwgQVBhcmNlbCogX2FpZGxfb3V0KSB7Ci0gICh2b2lkKV9haWRsX2luOwotICAodm9pZClfYWlkbF9vdXQ7Ci0gIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT047Ci0gIHN0ZDo6c2hhcmVkX3B0cjxCbkxvZ2dhYmxlSW50ZXJmYWNlPiBfYWlkbF9pbXBsID0gc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEJuTG9nZ2FibGVJbnRlcmZhY2U+KDo6bmRrOjpJQ0ludGVyZmFjZTo6YXNJbnRlcmZhY2UoX2FpZGxfYmluZGVyKSk7Ci0gIHN3aXRjaCAoX2FpZGxfY29kZSkgewotICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAwIC8qTG9nVGhpcyovKTogewotICAgICAgYm9vbCBpbl9ib29sVmFsdWU7Ci0gICAgICBzdGQ6OnZlY3Rvcjxib29sPiBpbl9ib29sQXJyYXk7Ci0gICAgICBpbnQ4X3QgaW5fYnl0ZVZhbHVlOwotICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gaW5fYnl0ZUFycmF5OwotICAgICAgY2hhcjE2X3QgaW5fY2hhclZhbHVlOwotICAgICAgc3RkOjp2ZWN0b3I8Y2hhcjE2X3Q+IGluX2NoYXJBcnJheTsKLSAgICAgIGludDMyX3QgaW5faW50VmFsdWU7Ci0gICAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBpbl9pbnRBcnJheTsKLSAgICAgIGludDY0X3QgaW5fbG9uZ1ZhbHVlOwotICAgICAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gaW5fbG9uZ0FycmF5OwotICAgICAgZmxvYXQgaW5fZmxvYXRWYWx1ZTsKLSAgICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBpbl9mbG9hdEFycmF5OwotICAgICAgZG91YmxlIGluX2RvdWJsZVZhbHVlOwotICAgICAgc3RkOjp2ZWN0b3I8ZG91YmxlPiBpbl9kb3VibGVBcnJheTsKLSAgICAgIHN0ZDo6c3RyaW5nIGluX3N0cmluZ1ZhbHVlOwotICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGluX3N0cmluZ0FycmF5OwotICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGluX2xpc3RWYWx1ZTsKLSAgICAgIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6bG9nZ2FibGU6OkRhdGEgaW5fZGF0YVZhbHVlOwotICAgICAgOjpuZGs6OlNwQUlCaW5kZXIgaW5fYmluZGVyVmFsdWU7Ci0gICAgICA6Om5kazo6U2NvcGVkRmlsZURlc2NyaXB0b3IgaW5fcGZkVmFsdWU7Ci0gICAgICBzdGQ6OnZlY3Rvcjw6Om5kazo6U2NvcGVkRmlsZURlc2NyaXB0b3I+IGluX3BmZEFycmF5OwotICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IF9haWRsX3JldHVybjsKLQotICAgICAgU2NvcGVkVHJhY2UgX2FpZGxfdHJhY2UoIkFJREw6Om5kazo6SUxvZ2dhYmxlSW50ZXJmYWNlOjpMb2dUaGlzOjpzZXJ2ZXIiKTsKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRCb29sKF9haWRsX2luLCAmaW5fYm9vbFZhbHVlKTsKLSAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7Ci0KLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX2luLCAmaW5fYm9vbEFycmF5KTsKLSAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7Ci0KLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRCeXRlKF9haWRsX2luLCAmaW5fYnl0ZVZhbHVlKTsKLSAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7Ci0KLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX2luLCAmaW5fYnl0ZUFycmF5KTsKLSAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7Ci0KLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRDaGFyKF9haWRsX2luLCAmaW5fY2hhclZhbHVlKTsKLSAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7Ci0KLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX2luLCAmaW5fY2hhckFycmF5KTsKLSAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7Ci0KLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihfYWlkbF9pbiwgJmluX2ludFZhbHVlKTsKLSAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7Ci0KLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX2luLCAmaW5faW50QXJyYXkpOwotICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKLQotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDY0KF9haWRsX2luLCAmaW5fbG9uZ1ZhbHVlKTsKLSAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7Ci0KLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX2luLCAmaW5fbG9uZ0FycmF5KTsKLSAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7Ci0KLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRGbG9hdChfYWlkbF9pbiwgJmluX2Zsb2F0VmFsdWUpOwotICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKLQotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX2FpZGxfaW4sICZpbl9mbG9hdEFycmF5KTsKLSAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7Ci0KLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWREb3VibGUoX2FpZGxfaW4sICZpbl9kb3VibGVWYWx1ZSk7Ci0gICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwotCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihfYWlkbF9pbiwgJmluX2RvdWJsZUFycmF5KTsKLSAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7Ci0KLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkU3RyaW5nKF9haWRsX2luLCAmaW5fc3RyaW5nVmFsdWUpOwotICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKLQotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX2FpZGxfaW4sICZpbl9zdHJpbmdBcnJheSk7Ci0gICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwotCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihfYWlkbF9pbiwgJmluX2xpc3RWYWx1ZSk7Ci0gICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwotCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFBhcmNlbGFibGUoX2FpZGxfaW4sICZpbl9kYXRhVmFsdWUpOwotICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKLQotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZVN0cm9uZ0JpbmRlcihfYWlkbF9pbiwgJmluX2JpbmRlclZhbHVlKTsKLSAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7Ci0KLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVQYXJjZWxGaWxlRGVzY3JpcHRvcihfYWlkbF9pbiwgJmluX3BmZFZhbHVlKTsKLSAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7Ci0KLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX2luLCAmaW5fcGZkQXJyYXkpOwotICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKLQotICAgICAgQm5Mb2dnYWJsZUludGVyZmFjZTo6VHJhbnNhY3Rpb25Mb2cgX3RyYW5zYWN0aW9uX2xvZzsKLSAgICAgIGlmIChCbkxvZ2dhYmxlSW50ZXJmYWNlOjpsb2dGdW5jICE9IG51bGxwdHIpIHsKLSAgICAgICAgX3RyYW5zYWN0aW9uX2xvZy5pbnB1dF9hcmdzLmVtcGxhY2VfYmFjaygiaW5fYm9vbFZhbHVlIiwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaW5fYm9vbFZhbHVlKSk7Ci0gICAgICAgIF90cmFuc2FjdGlvbl9sb2cuaW5wdXRfYXJncy5lbXBsYWNlX2JhY2soImluX2Jvb2xBcnJheSIsIDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGluX2Jvb2xBcnJheSkpOwotICAgICAgICBfdHJhbnNhY3Rpb25fbG9nLmlucHV0X2FyZ3MuZW1wbGFjZV9iYWNrKCJpbl9ieXRlVmFsdWUiLCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbl9ieXRlVmFsdWUpKTsKLSAgICAgICAgX3RyYW5zYWN0aW9uX2xvZy5pbnB1dF9hcmdzLmVtcGxhY2VfYmFjaygiaW5fYnl0ZUFycmF5IiwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaW5fYnl0ZUFycmF5KSk7Ci0gICAgICAgIF90cmFuc2FjdGlvbl9sb2cuaW5wdXRfYXJncy5lbXBsYWNlX2JhY2soImluX2NoYXJWYWx1ZSIsIDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGluX2NoYXJWYWx1ZSkpOwotICAgICAgICBfdHJhbnNhY3Rpb25fbG9nLmlucHV0X2FyZ3MuZW1wbGFjZV9iYWNrKCJpbl9jaGFyQXJyYXkiLCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbl9jaGFyQXJyYXkpKTsKLSAgICAgICAgX3RyYW5zYWN0aW9uX2xvZy5pbnB1dF9hcmdzLmVtcGxhY2VfYmFjaygiaW5faW50VmFsdWUiLCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbl9pbnRWYWx1ZSkpOwotICAgICAgICBfdHJhbnNhY3Rpb25fbG9nLmlucHV0X2FyZ3MuZW1wbGFjZV9iYWNrKCJpbl9pbnRBcnJheSIsIDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGluX2ludEFycmF5KSk7Ci0gICAgICAgIF90cmFuc2FjdGlvbl9sb2cuaW5wdXRfYXJncy5lbXBsYWNlX2JhY2soImluX2xvbmdWYWx1ZSIsIDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGluX2xvbmdWYWx1ZSkpOwotICAgICAgICBfdHJhbnNhY3Rpb25fbG9nLmlucHV0X2FyZ3MuZW1wbGFjZV9iYWNrKCJpbl9sb25nQXJyYXkiLCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbl9sb25nQXJyYXkpKTsKLSAgICAgICAgX3RyYW5zYWN0aW9uX2xvZy5pbnB1dF9hcmdzLmVtcGxhY2VfYmFjaygiaW5fZmxvYXRWYWx1ZSIsIDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGluX2Zsb2F0VmFsdWUpKTsKLSAgICAgICAgX3RyYW5zYWN0aW9uX2xvZy5pbnB1dF9hcmdzLmVtcGxhY2VfYmFjaygiaW5fZmxvYXRBcnJheSIsIDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGluX2Zsb2F0QXJyYXkpKTsKLSAgICAgICAgX3RyYW5zYWN0aW9uX2xvZy5pbnB1dF9hcmdzLmVtcGxhY2VfYmFjaygiaW5fZG91YmxlVmFsdWUiLCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbl9kb3VibGVWYWx1ZSkpOwotICAgICAgICBfdHJhbnNhY3Rpb25fbG9nLmlucHV0X2FyZ3MuZW1wbGFjZV9iYWNrKCJpbl9kb3VibGVBcnJheSIsIDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGluX2RvdWJsZUFycmF5KSk7Ci0gICAgICAgIF90cmFuc2FjdGlvbl9sb2cuaW5wdXRfYXJncy5lbXBsYWNlX2JhY2soImluX3N0cmluZ1ZhbHVlIiwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaW5fc3RyaW5nVmFsdWUpKTsKLSAgICAgICAgX3RyYW5zYWN0aW9uX2xvZy5pbnB1dF9hcmdzLmVtcGxhY2VfYmFjaygiaW5fc3RyaW5nQXJyYXkiLCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbl9zdHJpbmdBcnJheSkpOwotICAgICAgICBfdHJhbnNhY3Rpb25fbG9nLmlucHV0X2FyZ3MuZW1wbGFjZV9iYWNrKCJpbl9saXN0VmFsdWUiLCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbl9saXN0VmFsdWUpKTsKLSAgICAgICAgX3RyYW5zYWN0aW9uX2xvZy5pbnB1dF9hcmdzLmVtcGxhY2VfYmFjaygiaW5fZGF0YVZhbHVlIiwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaW5fZGF0YVZhbHVlKSk7Ci0gICAgICAgIF90cmFuc2FjdGlvbl9sb2cuaW5wdXRfYXJncy5lbXBsYWNlX2JhY2soImluX2JpbmRlclZhbHVlIiwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaW5fYmluZGVyVmFsdWUpKTsKLSAgICAgICAgX3RyYW5zYWN0aW9uX2xvZy5pbnB1dF9hcmdzLmVtcGxhY2VfYmFjaygiaW5fcGZkVmFsdWUiLCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbl9wZmRWYWx1ZSkpOwotICAgICAgICBfdHJhbnNhY3Rpb25fbG9nLmlucHV0X2FyZ3MuZW1wbGFjZV9iYWNrKCJpbl9wZmRBcnJheSIsIDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGluX3BmZEFycmF5KSk7Ci0gICAgICB9Ci0gICAgICBhdXRvIF9sb2dfc3RhcnQgPSBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKTsKLSAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1cyA9IF9haWRsX2ltcGwtPkxvZ1RoaXMoaW5fYm9vbFZhbHVlLCAmaW5fYm9vbEFycmF5LCBpbl9ieXRlVmFsdWUsICZpbl9ieXRlQXJyYXksIGluX2NoYXJWYWx1ZSwgJmluX2NoYXJBcnJheSwgaW5faW50VmFsdWUsICZpbl9pbnRBcnJheSwgaW5fbG9uZ1ZhbHVlLCAmaW5fbG9uZ0FycmF5LCBpbl9mbG9hdFZhbHVlLCAmaW5fZmxvYXRBcnJheSwgaW5fZG91YmxlVmFsdWUsICZpbl9kb3VibGVBcnJheSwgaW5fc3RyaW5nVmFsdWUsICZpbl9zdHJpbmdBcnJheSwgJmluX2xpc3RWYWx1ZSwgaW5fZGF0YVZhbHVlLCBpbl9iaW5kZXJWYWx1ZSwgJmluX3BmZFZhbHVlLCAmaW5fcGZkQXJyYXksICZfYWlkbF9yZXR1cm4pOwotICAgICAgaWYgKEJuTG9nZ2FibGVJbnRlcmZhY2U6OmxvZ0Z1bmMgIT0gbnVsbHB0cikgewotICAgICAgICBhdXRvIF9sb2dfZW5kID0gc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCk7Ci0gICAgICAgIF90cmFuc2FjdGlvbl9sb2cuZHVyYXRpb25fbXMgPSBzdGQ6OmNocm9ubzo6ZHVyYXRpb248ZG91YmxlLCBzdGQ6Om1pbGxpPihfbG9nX2VuZCAtIF9sb2dfc3RhcnQpLmNvdW50KCk7Ci0gICAgICAgIF90cmFuc2FjdGlvbl9sb2cuaW50ZXJmYWNlX25hbWUgPSAiYW5kcm9pZC5haWRsLmxvZ2dhYmxlLklMb2dnYWJsZUludGVyZmFjZSI7Ci0gICAgICAgIF90cmFuc2FjdGlvbl9sb2cubWV0aG9kX25hbWUgPSAiTG9nVGhpcyI7Ci0gICAgICAgIF90cmFuc2FjdGlvbl9sb2cuc3R1Yl9hZGRyZXNzID0gX2FpZGxfaW1wbC5nZXQoKTsKLSAgICAgICAgX3RyYW5zYWN0aW9uX2xvZy5wcm94eV9hZGRyZXNzID0gbnVsbHB0cjsKLSAgICAgICAgX3RyYW5zYWN0aW9uX2xvZy5leGNlcHRpb25fY29kZSA9IEFTdGF0dXNfZ2V0RXhjZXB0aW9uQ29kZShfYWlkbF9zdGF0dXMuZ2V0KCkpOwotICAgICAgICBfdHJhbnNhY3Rpb25fbG9nLmV4Y2VwdGlvbl9tZXNzYWdlID0gQVN0YXR1c19nZXRNZXNzYWdlKF9haWRsX3N0YXR1cy5nZXQoKSk7Ci0gICAgICAgIF90cmFuc2FjdGlvbl9sb2cudHJhbnNhY3Rpb25fZXJyb3IgPSBBU3RhdHVzX2dldFN0YXR1cyhfYWlkbF9zdGF0dXMuZ2V0KCkpOwotICAgICAgICBfdHJhbnNhY3Rpb25fbG9nLnNlcnZpY2Vfc3BlY2lmaWNfZXJyb3JfY29kZSA9IEFTdGF0dXNfZ2V0U2VydmljZVNwZWNpZmljRXJyb3IoX2FpZGxfc3RhdHVzLmdldCgpKTsKLSAgICAgICAgX3RyYW5zYWN0aW9uX2xvZy5vdXRwdXRfYXJncy5lbXBsYWNlX2JhY2soImluX2Jvb2xBcnJheSIsIDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGluX2Jvb2xBcnJheSkpOwotICAgICAgICBfdHJhbnNhY3Rpb25fbG9nLm91dHB1dF9hcmdzLmVtcGxhY2VfYmFjaygiaW5fYnl0ZUFycmF5IiwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaW5fYnl0ZUFycmF5KSk7Ci0gICAgICAgIF90cmFuc2FjdGlvbl9sb2cub3V0cHV0X2FyZ3MuZW1wbGFjZV9iYWNrKCJpbl9jaGFyQXJyYXkiLCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbl9jaGFyQXJyYXkpKTsKLSAgICAgICAgX3RyYW5zYWN0aW9uX2xvZy5vdXRwdXRfYXJncy5lbXBsYWNlX2JhY2soImluX2ludEFycmF5IiwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaW5faW50QXJyYXkpKTsKLSAgICAgICAgX3RyYW5zYWN0aW9uX2xvZy5vdXRwdXRfYXJncy5lbXBsYWNlX2JhY2soImluX2xvbmdBcnJheSIsIDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGluX2xvbmdBcnJheSkpOwotICAgICAgICBfdHJhbnNhY3Rpb25fbG9nLm91dHB1dF9hcmdzLmVtcGxhY2VfYmFjaygiaW5fZmxvYXRBcnJheSIsIDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGluX2Zsb2F0QXJyYXkpKTsKLSAgICAgICAgX3RyYW5zYWN0aW9uX2xvZy5vdXRwdXRfYXJncy5lbXBsYWNlX2JhY2soImluX2RvdWJsZUFycmF5IiwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaW5fZG91YmxlQXJyYXkpKTsKLSAgICAgICAgX3RyYW5zYWN0aW9uX2xvZy5vdXRwdXRfYXJncy5lbXBsYWNlX2JhY2soImluX3N0cmluZ0FycmF5IiwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaW5fc3RyaW5nQXJyYXkpKTsKLSAgICAgICAgX3RyYW5zYWN0aW9uX2xvZy5vdXRwdXRfYXJncy5lbXBsYWNlX2JhY2soImluX2xpc3RWYWx1ZSIsIDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGluX2xpc3RWYWx1ZSkpOwotICAgICAgICBfdHJhbnNhY3Rpb25fbG9nLm91dHB1dF9hcmdzLmVtcGxhY2VfYmFjaygiaW5fcGZkVmFsdWUiLCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbl9wZmRWYWx1ZSkpOwotICAgICAgICBfdHJhbnNhY3Rpb25fbG9nLm91dHB1dF9hcmdzLmVtcGxhY2VfYmFjaygiaW5fcGZkQXJyYXkiLCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbl9wZmRBcnJheSkpOwotICAgICAgICBfdHJhbnNhY3Rpb25fbG9nLnJlc3VsdCA9IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKF9haWRsX3JldHVybik7Ci0gICAgICAgIEJuTG9nZ2FibGVJbnRlcmZhY2U6OmxvZ0Z1bmMoX3RyYW5zYWN0aW9uX2xvZyk7Ci0gICAgICB9Ci0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZVN0YXR1c0hlYWRlcihfYWlkbF9vdXQsIF9haWRsX3N0YXR1cy5nZXQoKSk7Ci0gICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwotCi0gICAgICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBicmVhazsKLQotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKLSAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7Ci0KLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihfYWlkbF9vdXQsIGluX2Jvb2xBcnJheSk7Ci0gICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwotCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX2FpZGxfb3V0LCBpbl9ieXRlQXJyYXkpOwotICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKLQotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKF9haWRsX291dCwgaW5fY2hhckFycmF5KTsKLSAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7Ci0KLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihfYWlkbF9vdXQsIGluX2ludEFycmF5KTsKLSAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7Ci0KLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihfYWlkbF9vdXQsIGluX2xvbmdBcnJheSk7Ci0gICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwotCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX2FpZGxfb3V0LCBpbl9mbG9hdEFycmF5KTsKLSAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7Ci0KLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihfYWlkbF9vdXQsIGluX2RvdWJsZUFycmF5KTsKLSAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7Ci0KLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihfYWlkbF9vdXQsIGluX3N0cmluZ0FycmF5KTsKLSAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7Ci0KLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihfYWlkbF9vdXQsIGluX2xpc3RWYWx1ZSk7Ci0gICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwotCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZVBhcmNlbEZpbGVEZXNjcmlwdG9yKF9haWRsX291dCwgaW5fcGZkVmFsdWUpOwotICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKLQotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKF9haWRsX291dCwgaW5fcGZkQXJyYXkpOwotICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKLQotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotfQotCi1zdGF0aWMgQUlCaW5kZXJfQ2xhc3MqIF9nX2FpZGxfY2xhenogPSA6Om5kazo6SUNJbnRlcmZhY2U6OmRlZmluZUNsYXNzKElMb2dnYWJsZUludGVyZmFjZTo6ZGVzY3JpcHRvciwgX2FpZGxfb25UcmFuc2FjdCk7Ci0KLUJwTG9nZ2FibGVJbnRlcmZhY2U6OkJwTG9nZ2FibGVJbnRlcmZhY2UoY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGJpbmRlcikgOiBCcENJbnRlcmZhY2UoYmluZGVyKSB7fQotQnBMb2dnYWJsZUludGVyZmFjZTo6fkJwTG9nZ2FibGVJbnRlcmZhY2UoKSB7fQotc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IEJwTG9nZ2FibGVJbnRlcmZhY2U6OlRyYW5zYWN0aW9uTG9nJik+IEJwTG9nZ2FibGVJbnRlcmZhY2U6OmxvZ0Z1bmM7Ci0KLTo6bmRrOjpTY29wZWRBU3RhdHVzIEJwTG9nZ2FibGVJbnRlcmZhY2U6OkxvZ1RoaXMoYm9vbCBpbl9ib29sVmFsdWUsIHN0ZDo6dmVjdG9yPGJvb2w+KiBpbl9ib29sQXJyYXksIGludDhfdCBpbl9ieXRlVmFsdWUsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBpbl9ieXRlQXJyYXksIGNoYXIxNl90IGluX2NoYXJWYWx1ZSwgc3RkOjp2ZWN0b3I8Y2hhcjE2X3Q+KiBpbl9jaGFyQXJyYXksIGludDMyX3QgaW5faW50VmFsdWUsIHN0ZDo6dmVjdG9yPGludDMyX3Q+KiBpbl9pbnRBcnJheSwgaW50NjRfdCBpbl9sb25nVmFsdWUsIHN0ZDo6dmVjdG9yPGludDY0X3Q+KiBpbl9sb25nQXJyYXksIGZsb2F0IGluX2Zsb2F0VmFsdWUsIHN0ZDo6dmVjdG9yPGZsb2F0PiogaW5fZmxvYXRBcnJheSwgZG91YmxlIGluX2RvdWJsZVZhbHVlLCBzdGQ6OnZlY3Rvcjxkb3VibGU+KiBpbl9kb3VibGVBcnJheSwgY29uc3Qgc3RkOjpzdHJpbmcmIGluX3N0cmluZ1ZhbHVlLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIGluX3N0cmluZ0FycmF5LCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIGluX2xpc3RWYWx1ZSwgY29uc3QgOjphaWRsOjphbmRyb2lkOjphaWRsOjpsb2dnYWJsZTo6RGF0YSYgaW5fZGF0YVZhbHVlLCBjb25zdCA6Om5kazo6U3BBSUJpbmRlciYgaW5fYmluZGVyVmFsdWUsIDo6bmRrOjpTY29wZWRGaWxlRGVzY3JpcHRvciogaW5fcGZkVmFsdWUsIHN0ZDo6dmVjdG9yPDo6bmRrOjpTY29wZWRGaWxlRGVzY3JpcHRvcj4qIGluX3BmZEFycmF5LCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIF9haWRsX3JldHVybikgewotICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19PSzsKLSAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOwotICA6Om5kazo6U2NvcGVkQVBhcmNlbCBfYWlkbF9pbjsKLSAgOjpuZGs6OlNjb3BlZEFQYXJjZWwgX2FpZGxfb3V0OwotCi0gIEJwTG9nZ2FibGVJbnRlcmZhY2U6OlRyYW5zYWN0aW9uTG9nIF90cmFuc2FjdGlvbl9sb2c7Ci0gIGlmIChCcExvZ2dhYmxlSW50ZXJmYWNlOjpsb2dGdW5jICE9IG51bGxwdHIpIHsKLSAgICBfdHJhbnNhY3Rpb25fbG9nLmlucHV0X2FyZ3MuZW1wbGFjZV9iYWNrKCJpbl9ib29sVmFsdWUiLCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbl9ib29sVmFsdWUpKTsKLSAgICBfdHJhbnNhY3Rpb25fbG9nLmlucHV0X2FyZ3MuZW1wbGFjZV9iYWNrKCJpbl9ib29sQXJyYXkiLCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZygqaW5fYm9vbEFycmF5KSk7Ci0gICAgX3RyYW5zYWN0aW9uX2xvZy5pbnB1dF9hcmdzLmVtcGxhY2VfYmFjaygiaW5fYnl0ZVZhbHVlIiwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaW5fYnl0ZVZhbHVlKSk7Ci0gICAgX3RyYW5zYWN0aW9uX2xvZy5pbnB1dF9hcmdzLmVtcGxhY2VfYmFjaygiaW5fYnl0ZUFycmF5IiwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoKmluX2J5dGVBcnJheSkpOwotICAgIF90cmFuc2FjdGlvbl9sb2cuaW5wdXRfYXJncy5lbXBsYWNlX2JhY2soImluX2NoYXJWYWx1ZSIsIDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGluX2NoYXJWYWx1ZSkpOwotICAgIF90cmFuc2FjdGlvbl9sb2cuaW5wdXRfYXJncy5lbXBsYWNlX2JhY2soImluX2NoYXJBcnJheSIsIDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKCppbl9jaGFyQXJyYXkpKTsKLSAgICBfdHJhbnNhY3Rpb25fbG9nLmlucHV0X2FyZ3MuZW1wbGFjZV9iYWNrKCJpbl9pbnRWYWx1ZSIsIDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGluX2ludFZhbHVlKSk7Ci0gICAgX3RyYW5zYWN0aW9uX2xvZy5pbnB1dF9hcmdzLmVtcGxhY2VfYmFjaygiaW5faW50QXJyYXkiLCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZygqaW5faW50QXJyYXkpKTsKLSAgICBfdHJhbnNhY3Rpb25fbG9nLmlucHV0X2FyZ3MuZW1wbGFjZV9iYWNrKCJpbl9sb25nVmFsdWUiLCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbl9sb25nVmFsdWUpKTsKLSAgICBfdHJhbnNhY3Rpb25fbG9nLmlucHV0X2FyZ3MuZW1wbGFjZV9iYWNrKCJpbl9sb25nQXJyYXkiLCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZygqaW5fbG9uZ0FycmF5KSk7Ci0gICAgX3RyYW5zYWN0aW9uX2xvZy5pbnB1dF9hcmdzLmVtcGxhY2VfYmFjaygiaW5fZmxvYXRWYWx1ZSIsIDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGluX2Zsb2F0VmFsdWUpKTsKLSAgICBfdHJhbnNhY3Rpb25fbG9nLmlucHV0X2FyZ3MuZW1wbGFjZV9iYWNrKCJpbl9mbG9hdEFycmF5IiwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoKmluX2Zsb2F0QXJyYXkpKTsKLSAgICBfdHJhbnNhY3Rpb25fbG9nLmlucHV0X2FyZ3MuZW1wbGFjZV9iYWNrKCJpbl9kb3VibGVWYWx1ZSIsIDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGluX2RvdWJsZVZhbHVlKSk7Ci0gICAgX3RyYW5zYWN0aW9uX2xvZy5pbnB1dF9hcmdzLmVtcGxhY2VfYmFjaygiaW5fZG91YmxlQXJyYXkiLCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZygqaW5fZG91YmxlQXJyYXkpKTsKLSAgICBfdHJhbnNhY3Rpb25fbG9nLmlucHV0X2FyZ3MuZW1wbGFjZV9iYWNrKCJpbl9zdHJpbmdWYWx1ZSIsIDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGluX3N0cmluZ1ZhbHVlKSk7Ci0gICAgX3RyYW5zYWN0aW9uX2xvZy5pbnB1dF9hcmdzLmVtcGxhY2VfYmFjaygiaW5fc3RyaW5nQXJyYXkiLCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZygqaW5fc3RyaW5nQXJyYXkpKTsKLSAgICBfdHJhbnNhY3Rpb25fbG9nLmlucHV0X2FyZ3MuZW1wbGFjZV9iYWNrKCJpbl9saXN0VmFsdWUiLCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZygqaW5fbGlzdFZhbHVlKSk7Ci0gICAgX3RyYW5zYWN0aW9uX2xvZy5pbnB1dF9hcmdzLmVtcGxhY2VfYmFjaygiaW5fZGF0YVZhbHVlIiwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaW5fZGF0YVZhbHVlKSk7Ci0gICAgX3RyYW5zYWN0aW9uX2xvZy5pbnB1dF9hcmdzLmVtcGxhY2VfYmFjaygiaW5fYmluZGVyVmFsdWUiLCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbl9iaW5kZXJWYWx1ZSkpOwotICAgIF90cmFuc2FjdGlvbl9sb2cuaW5wdXRfYXJncy5lbXBsYWNlX2JhY2soImluX3BmZFZhbHVlIiwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoKmluX3BmZFZhbHVlKSk7Ci0gICAgX3RyYW5zYWN0aW9uX2xvZy5pbnB1dF9hcmdzLmVtcGxhY2VfYmFjaygiaW5fcGZkQXJyYXkiLCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZygqaW5fcGZkQXJyYXkpKTsKLSAgfQotICBhdXRvIF9sb2dfc3RhcnQgPSBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKTsKLSAgU2NvcGVkVHJhY2UgX2FpZGxfdHJhY2UoIkFJREw6Om5kazo6SUxvZ2dhYmxlSW50ZXJmYWNlOjpMb2dUaGlzOjpjbGllbnQiKTsKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3ByZXBhcmVUcmFuc2FjdGlvbihhc0JpbmRlcigpLmdldCgpLCBfYWlkbF9pbi5nZXRSKCkpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVCb29sKF9haWRsX2luLmdldCgpLCBpbl9ib29sVmFsdWUpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKF9haWRsX2luLmdldCgpLCAqaW5fYm9vbEFycmF5KTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlQnl0ZShfYWlkbF9pbi5nZXQoKSwgaW5fYnl0ZVZhbHVlKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihfYWlkbF9pbi5nZXQoKSwgKmluX2J5dGVBcnJheSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUNoYXIoX2FpZGxfaW4uZ2V0KCksIGluX2NoYXJWYWx1ZSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX2FpZGxfaW4uZ2V0KCksICppbl9jaGFyQXJyYXkpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQzMihfYWlkbF9pbi5nZXQoKSwgaW5faW50VmFsdWUpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKF9haWRsX2luLmdldCgpLCAqaW5faW50QXJyYXkpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQ2NChfYWlkbF9pbi5nZXQoKSwgaW5fbG9uZ1ZhbHVlKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihfYWlkbF9pbi5nZXQoKSwgKmluX2xvbmdBcnJheSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUZsb2F0KF9haWRsX2luLmdldCgpLCBpbl9mbG9hdFZhbHVlKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihfYWlkbF9pbi5nZXQoKSwgKmluX2Zsb2F0QXJyYXkpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVEb3VibGUoX2FpZGxfaW4uZ2V0KCksIGluX2RvdWJsZVZhbHVlKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihfYWlkbF9pbi5nZXQoKSwgKmluX2RvdWJsZUFycmF5KTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVN0cmluZyhfYWlkbF9pbi5nZXQoKSwgaW5fc3RyaW5nVmFsdWUpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKF9haWRsX2luLmdldCgpLCAqaW5fc3RyaW5nQXJyYXkpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKF9haWRsX2luLmdldCgpLCAqaW5fbGlzdFZhbHVlKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVBhcmNlbGFibGUoX2FpZGxfaW4uZ2V0KCksIGluX2RhdGFWYWx1ZSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZVN0cm9uZ0JpbmRlcihfYWlkbF9pbi5nZXQoKSwgaW5fYmluZGVyVmFsdWUpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVQYXJjZWxGaWxlRGVzY3JpcHRvcihfYWlkbF9pbi5nZXQoKSwgKmluX3BmZFZhbHVlKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihfYWlkbF9pbi5nZXQoKSwgKmluX3BmZEFycmF5KTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl90cmFuc2FjdCgKLSAgICBhc0JpbmRlcigpLmdldCgpLAotICAgIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMCAvKkxvZ1RoaXMqLyksCi0gICAgX2FpZGxfaW4uZ2V0UigpLAotICAgIF9haWRsX291dC5nZXRSKCksCi0gICAgMAotICAgICNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKLSAgICB8IEZMQUdfUFJJVkFURV9MT0NBTAotICAgICNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCi0gICAgKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgPT0gU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT04gJiYgSUxvZ2dhYmxlSW50ZXJmYWNlOjpnZXREZWZhdWx0SW1wbCgpKSB7Ci0gICAgX2FpZGxfc3RhdHVzID0gSUxvZ2dhYmxlSW50ZXJmYWNlOjpnZXREZWZhdWx0SW1wbCgpLT5Mb2dUaGlzKGluX2Jvb2xWYWx1ZSwgaW5fYm9vbEFycmF5LCBpbl9ieXRlVmFsdWUsIGluX2J5dGVBcnJheSwgaW5fY2hhclZhbHVlLCBpbl9jaGFyQXJyYXksIGluX2ludFZhbHVlLCBpbl9pbnRBcnJheSwgaW5fbG9uZ1ZhbHVlLCBpbl9sb25nQXJyYXksIGluX2Zsb2F0VmFsdWUsIGluX2Zsb2F0QXJyYXksIGluX2RvdWJsZVZhbHVlLCBpbl9kb3VibGVBcnJheSwgaW5fc3RyaW5nVmFsdWUsIGluX3N0cmluZ0FycmF5LCBpbl9saXN0VmFsdWUsIGluX2RhdGFWYWx1ZSwgaW5fYmluZGVyVmFsdWUsIGluX3BmZFZhbHVlLCBpbl9wZmRBcnJheSwgX2FpZGxfcmV0dXJuKTsKLSAgICBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47Ci0gIH0KLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRTdGF0dXNIZWFkZXIoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9zdGF0dXMuZ2V0UigpKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwotCi0gIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX2FpZGxfb3V0LmdldCgpLCBpbl9ib29sQXJyYXkpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX2FpZGxfb3V0LmdldCgpLCBpbl9ieXRlQXJyYXkpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX2FpZGxfb3V0LmdldCgpLCBpbl9jaGFyQXJyYXkpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX2FpZGxfb3V0LmdldCgpLCBpbl9pbnRBcnJheSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihfYWlkbF9vdXQuZ2V0KCksIGluX2xvbmdBcnJheSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihfYWlkbF9vdXQuZ2V0KCksIGluX2Zsb2F0QXJyYXkpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX2FpZGxfb3V0LmdldCgpLCBpbl9kb3VibGVBcnJheSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihfYWlkbF9vdXQuZ2V0KCksIGluX3N0cmluZ0FycmF5KTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX291dC5nZXQoKSwgaW5fbGlzdFZhbHVlKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVQYXJjZWxGaWxlRGVzY3JpcHRvcihfYWlkbF9vdXQuZ2V0KCksIGluX3BmZFZhbHVlKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX291dC5nZXQoKSwgaW5fcGZkQXJyYXkpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7Ci0KLSAgX2FpZGxfZXJyb3I6Ci0gIF9haWRsX3N0YXR1cy5zZXQoQVN0YXR1c19mcm9tU3RhdHVzKF9haWRsX3JldF9zdGF0dXMpKTsKLSAgX2FpZGxfc3RhdHVzX3JldHVybjoKLSAgaWYgKEJwTG9nZ2FibGVJbnRlcmZhY2U6OmxvZ0Z1bmMgIT0gbnVsbHB0cikgewotICAgIGF1dG8gX2xvZ19lbmQgPSBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKTsKLSAgICBfdHJhbnNhY3Rpb25fbG9nLmR1cmF0aW9uX21zID0gc3RkOjpjaHJvbm86OmR1cmF0aW9uPGRvdWJsZSwgc3RkOjptaWxsaT4oX2xvZ19lbmQgLSBfbG9nX3N0YXJ0KS5jb3VudCgpOwotICAgIF90cmFuc2FjdGlvbl9sb2cuaW50ZXJmYWNlX25hbWUgPSAiYW5kcm9pZC5haWRsLmxvZ2dhYmxlLklMb2dnYWJsZUludGVyZmFjZSI7Ci0gICAgX3RyYW5zYWN0aW9uX2xvZy5tZXRob2RfbmFtZSA9ICJMb2dUaGlzIjsKLSAgICBfdHJhbnNhY3Rpb25fbG9nLnN0dWJfYWRkcmVzcyA9IG51bGxwdHI7Ci0gICAgX3RyYW5zYWN0aW9uX2xvZy5wcm94eV9hZGRyZXNzID0gc3RhdGljX2Nhc3Q8Y29uc3Qgdm9pZCo+KHRoaXMpOwotICAgIF90cmFuc2FjdGlvbl9sb2cuZXhjZXB0aW9uX2NvZGUgPSBBU3RhdHVzX2dldEV4Y2VwdGlvbkNvZGUoX2FpZGxfc3RhdHVzLmdldCgpKTsKLSAgICBfdHJhbnNhY3Rpb25fbG9nLmV4Y2VwdGlvbl9tZXNzYWdlID0gQVN0YXR1c19nZXRNZXNzYWdlKF9haWRsX3N0YXR1cy5nZXQoKSk7Ci0gICAgX3RyYW5zYWN0aW9uX2xvZy50cmFuc2FjdGlvbl9lcnJvciA9IEFTdGF0dXNfZ2V0U3RhdHVzKF9haWRsX3N0YXR1cy5nZXQoKSk7Ci0gICAgX3RyYW5zYWN0aW9uX2xvZy5zZXJ2aWNlX3NwZWNpZmljX2Vycm9yX2NvZGUgPSBBU3RhdHVzX2dldFNlcnZpY2VTcGVjaWZpY0Vycm9yKF9haWRsX3N0YXR1cy5nZXQoKSk7Ci0gICAgX3RyYW5zYWN0aW9uX2xvZy5vdXRwdXRfYXJncy5lbXBsYWNlX2JhY2soImluX2Jvb2xBcnJheSIsIDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKCppbl9ib29sQXJyYXkpKTsKLSAgICBfdHJhbnNhY3Rpb25fbG9nLm91dHB1dF9hcmdzLmVtcGxhY2VfYmFjaygiaW5fYnl0ZUFycmF5IiwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoKmluX2J5dGVBcnJheSkpOwotICAgIF90cmFuc2FjdGlvbl9sb2cub3V0cHV0X2FyZ3MuZW1wbGFjZV9iYWNrKCJpbl9jaGFyQXJyYXkiLCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZygqaW5fY2hhckFycmF5KSk7Ci0gICAgX3RyYW5zYWN0aW9uX2xvZy5vdXRwdXRfYXJncy5lbXBsYWNlX2JhY2soImluX2ludEFycmF5IiwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoKmluX2ludEFycmF5KSk7Ci0gICAgX3RyYW5zYWN0aW9uX2xvZy5vdXRwdXRfYXJncy5lbXBsYWNlX2JhY2soImluX2xvbmdBcnJheSIsIDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKCppbl9sb25nQXJyYXkpKTsKLSAgICBfdHJhbnNhY3Rpb25fbG9nLm91dHB1dF9hcmdzLmVtcGxhY2VfYmFjaygiaW5fZmxvYXRBcnJheSIsIDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKCppbl9mbG9hdEFycmF5KSk7Ci0gICAgX3RyYW5zYWN0aW9uX2xvZy5vdXRwdXRfYXJncy5lbXBsYWNlX2JhY2soImluX2RvdWJsZUFycmF5IiwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoKmluX2RvdWJsZUFycmF5KSk7Ci0gICAgX3RyYW5zYWN0aW9uX2xvZy5vdXRwdXRfYXJncy5lbXBsYWNlX2JhY2soImluX3N0cmluZ0FycmF5IiwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoKmluX3N0cmluZ0FycmF5KSk7Ci0gICAgX3RyYW5zYWN0aW9uX2xvZy5vdXRwdXRfYXJncy5lbXBsYWNlX2JhY2soImluX2xpc3RWYWx1ZSIsIDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKCppbl9saXN0VmFsdWUpKTsKLSAgICBfdHJhbnNhY3Rpb25fbG9nLm91dHB1dF9hcmdzLmVtcGxhY2VfYmFjaygiaW5fcGZkVmFsdWUiLCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZygqaW5fcGZkVmFsdWUpKTsKLSAgICBfdHJhbnNhY3Rpb25fbG9nLm91dHB1dF9hcmdzLmVtcGxhY2VfYmFjaygiaW5fcGZkQXJyYXkiLCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZygqaW5fcGZkQXJyYXkpKTsKLSAgICBfdHJhbnNhY3Rpb25fbG9nLnJlc3VsdCA9IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKCpfYWlkbF9yZXR1cm4pOwotICAgIEJwTG9nZ2FibGVJbnRlcmZhY2U6OmxvZ0Z1bmMoX3RyYW5zYWN0aW9uX2xvZyk7Ci0gIH0KLSAgcmV0dXJuIF9haWRsX3N0YXR1czsKLX0KLS8vIFNvdXJjZSBmb3IgQm5Mb2dnYWJsZUludGVyZmFjZQotQm5Mb2dnYWJsZUludGVyZmFjZTo6Qm5Mb2dnYWJsZUludGVyZmFjZSgpIHt9Ci1CbkxvZ2dhYmxlSW50ZXJmYWNlOjp+Qm5Mb2dnYWJsZUludGVyZmFjZSgpIHt9Ci1zdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgQm5Mb2dnYWJsZUludGVyZmFjZTo6VHJhbnNhY3Rpb25Mb2cmKT4gQm5Mb2dnYWJsZUludGVyZmFjZTo6bG9nRnVuYzsKLTo6bmRrOjpTcEFJQmluZGVyIEJuTG9nZ2FibGVJbnRlcmZhY2U6OmNyZWF0ZUJpbmRlcigpIHsKLSAgQUlCaW5kZXIqIGJpbmRlciA9IEFJQmluZGVyX25ldyhfZ19haWRsX2NsYXp6LCBzdGF0aWNfY2FzdDx2b2lkKj4odGhpcykpOwotICAjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCi0gIEFJQmluZGVyX21hcmtDb21waWxhdGlvblVuaXRTdGFiaWxpdHkoYmluZGVyKTsKLSAgI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKLSAgcmV0dXJuIDo6bmRrOjpTcEFJQmluZGVyKGJpbmRlcik7Ci19Ci0vLyBTb3VyY2UgZm9yIElMb2dnYWJsZUludGVyZmFjZQotY29uc3QgY2hhciogSUxvZ2dhYmxlSW50ZXJmYWNlOjpkZXNjcmlwdG9yID0gImFuZHJvaWQuYWlkbC5sb2dnYWJsZS5JTG9nZ2FibGVJbnRlcmZhY2UiOwotSUxvZ2dhYmxlSW50ZXJmYWNlOjpJTG9nZ2FibGVJbnRlcmZhY2UoKSB7fQotSUxvZ2dhYmxlSW50ZXJmYWNlOjp+SUxvZ2dhYmxlSW50ZXJmYWNlKCkge30KLQotCi1zdGQ6OnNoYXJlZF9wdHI8SUxvZ2dhYmxlSW50ZXJmYWNlPiBJTG9nZ2FibGVJbnRlcmZhY2U6OmZyb21CaW5kZXIoY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGJpbmRlcikgewotICBpZiAoIUFJQmluZGVyX2Fzc29jaWF0ZUNsYXNzKGJpbmRlci5nZXQoKSwgX2dfYWlkbF9jbGF6eikpIHsgcmV0dXJuIG51bGxwdHI7IH0KLSAgc3RkOjpzaGFyZWRfcHRyPDo6bmRrOjpJQ0ludGVyZmFjZT4gaW50ZXJmYWNlID0gOjpuZGs6OklDSW50ZXJmYWNlOjphc0ludGVyZmFjZShiaW5kZXIuZ2V0KCkpOwotICBpZiAoaW50ZXJmYWNlKSB7Ci0gICAgcmV0dXJuIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxJTG9nZ2FibGVJbnRlcmZhY2U+KGludGVyZmFjZSk7Ci0gIH0KLSAgcmV0dXJuIDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPEJwTG9nZ2FibGVJbnRlcmZhY2U+KGJpbmRlcik7Ci19Ci0KLWJpbmRlcl9zdGF0dXNfdCBJTG9nZ2FibGVJbnRlcmZhY2U6OndyaXRlVG9QYXJjZWwoQVBhcmNlbCogcGFyY2VsLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SUxvZ2dhYmxlSW50ZXJmYWNlPiYgaW5zdGFuY2UpIHsKLSAgcmV0dXJuIEFQYXJjZWxfd3JpdGVTdHJvbmdCaW5kZXIocGFyY2VsLCBpbnN0YW5jZSA/IGluc3RhbmNlLT5hc0JpbmRlcigpLmdldCgpIDogbnVsbHB0cik7Ci19Ci1iaW5kZXJfc3RhdHVzX3QgSUxvZ2dhYmxlSW50ZXJmYWNlOjpyZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBwYXJjZWwsIHN0ZDo6c2hhcmVkX3B0cjxJTG9nZ2FibGVJbnRlcmZhY2U+KiBpbnN0YW5jZSkgewotICA6Om5kazo6U3BBSUJpbmRlciBiaW5kZXI7Ci0gIGJpbmRlcl9zdGF0dXNfdCBzdGF0dXMgPSBBUGFyY2VsX3JlYWRTdHJvbmdCaW5kZXIocGFyY2VsLCBiaW5kZXIuZ2V0UigpKTsKLSAgaWYgKHN0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBzdGF0dXM7Ci0gICppbnN0YW5jZSA9IElMb2dnYWJsZUludGVyZmFjZTo6ZnJvbUJpbmRlcihiaW5kZXIpOwotICByZXR1cm4gU1RBVFVTX09LOwotfQotYm9vbCBJTG9nZ2FibGVJbnRlcmZhY2U6OnNldERlZmF1bHRJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJTG9nZ2FibGVJbnRlcmZhY2U+JiBpbXBsKSB7Ci0gIC8vIE9ubHkgb25lIHVzZXIgb2YgdGhpcyBpbnRlcmZhY2UgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uCi0gIC8vIGF0IGEgdGltZS4gVGhpcyBpcyBhIGhldXJpc3RpYyB0byBkZXRlY3QgaWYgdHdvIGRpZmZlcmVudAotICAvLyB1c2VycyBpbiB0aGUgc2FtZSBwcm9jZXNzIHVzZSB0aGlzIGZ1bmN0aW9uLgotICBhc3NlcnQoIUlMb2dnYWJsZUludGVyZmFjZTo6ZGVmYXVsdF9pbXBsKTsKLSAgaWYgKGltcGwpIHsKLSAgICBJTG9nZ2FibGVJbnRlcmZhY2U6OmRlZmF1bHRfaW1wbCA9IGltcGw7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElMb2dnYWJsZUludGVyZmFjZT4mIElMb2dnYWJsZUludGVyZmFjZTo6Z2V0RGVmYXVsdEltcGwoKSB7Ci0gIHJldHVybiBJTG9nZ2FibGVJbnRlcmZhY2U6OmRlZmF1bHRfaW1wbDsKLX0KLXN0ZDo6c2hhcmVkX3B0cjxJTG9nZ2FibGVJbnRlcmZhY2U+IElMb2dnYWJsZUludGVyZmFjZTo6ZGVmYXVsdF9pbXBsID0gbnVsbHB0cjsKLTo6bmRrOjpTY29wZWRBU3RhdHVzIElMb2dnYWJsZUludGVyZmFjZURlZmF1bHQ6OkxvZ1RoaXMoYm9vbCAvKmluX2Jvb2xWYWx1ZSovLCBzdGQ6OnZlY3Rvcjxib29sPiogLyppbl9ib29sQXJyYXkqLywgaW50OF90IC8qaW5fYnl0ZVZhbHVlKi8sIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiAvKmluX2J5dGVBcnJheSovLCBjaGFyMTZfdCAvKmluX2NoYXJWYWx1ZSovLCBzdGQ6OnZlY3RvcjxjaGFyMTZfdD4qIC8qaW5fY2hhckFycmF5Ki8sIGludDMyX3QgLyppbl9pbnRWYWx1ZSovLCBzdGQ6OnZlY3RvcjxpbnQzMl90PiogLyppbl9pbnRBcnJheSovLCBpbnQ2NF90IC8qaW5fbG9uZ1ZhbHVlKi8sIHN0ZDo6dmVjdG9yPGludDY0X3Q+KiAvKmluX2xvbmdBcnJheSovLCBmbG9hdCAvKmluX2Zsb2F0VmFsdWUqLywgc3RkOjp2ZWN0b3I8ZmxvYXQ+KiAvKmluX2Zsb2F0QXJyYXkqLywgZG91YmxlIC8qaW5fZG91YmxlVmFsdWUqLywgc3RkOjp2ZWN0b3I8ZG91YmxlPiogLyppbl9kb3VibGVBcnJheSovLCBjb25zdCBzdGQ6OnN0cmluZyYgLyppbl9zdHJpbmdWYWx1ZSovLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIC8qaW5fc3RyaW5nQXJyYXkqLywgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiAvKmluX2xpc3RWYWx1ZSovLCBjb25zdCA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OmxvZ2dhYmxlOjpEYXRhJiAvKmluX2RhdGFWYWx1ZSovLCBjb25zdCA6Om5kazo6U3BBSUJpbmRlciYgLyppbl9iaW5kZXJWYWx1ZSovLCA6Om5kazo6U2NvcGVkRmlsZURlc2NyaXB0b3IqIC8qaW5fcGZkVmFsdWUqLywgc3RkOjp2ZWN0b3I8OjpuZGs6OlNjb3BlZEZpbGVEZXNjcmlwdG9yPiogLyppbl9wZmRBcnJheSovLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIC8qX2FpZGxfcmV0dXJuKi8pIHsKLSAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOwotICBfYWlkbF9zdGF0dXMuc2V0KEFTdGF0dXNfZnJvbVN0YXR1cyhTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTikpOwotICByZXR1cm4gX2FpZGxfc3RhdHVzOwotfQotOjpuZGs6OlNwQUlCaW5kZXIgSUxvZ2dhYmxlSW50ZXJmYWNlRGVmYXVsdDo6YXNCaW5kZXIoKSB7Ci0gIHJldHVybiA6Om5kazo6U3BBSUJpbmRlcigpOwotfQotYm9vbCBJTG9nZ2FibGVJbnRlcmZhY2VEZWZhdWx0Ojppc1JlbW90ZSgpIHsKLSAgcmV0dXJuIGZhbHNlOwotfQotfSAgLy8gbmFtZXNwYWNlIGxvZ2dhYmxlCi19ICAvLyBuYW1lc3BhY2UgYWlkbAotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLX0gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0lMb2dnYWJsZUludGVyZmFjZS5jcHAuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvSUxvZ2dhYmxlSW50ZXJmYWNlLmNwcC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODE2ZGMwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvSUxvZ2dhYmxlSW50ZXJmYWNlLmNwcC5kCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1vdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvSUxvZ2dhYmxlSW50ZXJmYWNlLmNwcCA6IFwKLSAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0lMb2dnYWJsZUludGVyZmFjZS5haWRsIFwKLSAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0RhdGEuYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9Vbmlvbi5jcHAgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2xvZ2dhYmxlL1VuaW9uLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QwMmQ0ZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2xvZ2dhYmxlL1VuaW9uLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLSNpbmNsdWRlICJhaWRsL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9Vbmlvbi5oIgotCi0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcGFyY2VsX3V0aWxzLmg+Ci0KLW5hbWVzcGFjZSBhaWRsIHsKLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBhaWRsIHsKLW5hbWVzcGFjZSBsb2dnYWJsZSB7Ci1jb25zdCBjaGFyKiBVbmlvbjo6ZGVzY3JpcHRvciA9ICJhbmRyb2lkLmFpZGwubG9nZ2FibGUuVW5pb24iOwotCi1iaW5kZXJfc3RhdHVzX3QgVW5pb246OnJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIF9wYXJjZWwpIHsKLSAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXM7Ci0gIGludDMyX3QgX2FpZGxfdGFnOwotICBpZiAoKF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihfcGFyY2VsLCAmX2FpZGxfdGFnKSkgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLSAgc3dpdGNoIChfYWlkbF90YWcpIHsKLSAgY2FzZSBudW06IHsKLSAgICBpbnQzMl90IF9haWRsX3ZhbHVlOwotICAgIGlmICgoX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyKF9wYXJjZWwsICZfYWlkbF92YWx1ZSkpICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gICAgaWYgY29uc3RleHByIChzdGQ6OmlzX3RyaXZpYWxseV9jb3B5YWJsZV92PGludDMyX3Q+KSB7Ci0gICAgICBzZXQ8bnVtPihfYWlkbF92YWx1ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIE5PTElOVE5FWFRMSU5FKHBlcmZvcm1hbmNlLW1vdmUtY29uc3QtYXJnKQotICAgICAgc2V0PG51bT4oc3RkOjptb3ZlKF9haWRsX3ZhbHVlKSk7Ci0gICAgfQotICAgIHJldHVybiBTVEFUVVNfT0s7IH0KLSAgY2FzZSBzdHI6IHsKLSAgICBzdGQ6OnN0cmluZyBfYWlkbF92YWx1ZTsKLSAgICBpZiAoKF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkU3RyaW5nKF9wYXJjZWwsICZfYWlkbF92YWx1ZSkpICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gICAgaWYgY29uc3RleHByIChzdGQ6OmlzX3RyaXZpYWxseV9jb3B5YWJsZV92PHN0ZDo6c3RyaW5nPikgewotICAgICAgc2V0PHN0cj4oX2FpZGxfdmFsdWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBOT0xJTlRORVhUTElORShwZXJmb3JtYW5jZS1tb3ZlLWNvbnN0LWFyZykKLSAgICAgIHNldDxzdHI+KHN0ZDo6bW92ZShfYWlkbF92YWx1ZSkpOwotICAgIH0KLSAgICByZXR1cm4gU1RBVFVTX09LOyB9Ci0gIH0KLSAgcmV0dXJuIFNUQVRVU19CQURfVkFMVUU7Ci19Ci1iaW5kZXJfc3RhdHVzX3QgVW5pb246OndyaXRlVG9QYXJjZWwoQVBhcmNlbCogX3BhcmNlbCkgY29uc3QgewotICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQzMihfcGFyY2VsLCBnZXRUYWcoKSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIHN3aXRjaCAoZ2V0VGFnKCkpIHsKLSAgY2FzZSBudW06IHJldHVybiBBUGFyY2VsX3dyaXRlSW50MzIoX3BhcmNlbCwgZ2V0PG51bT4oKSk7Ci0gIGNhc2Ugc3RyOiByZXR1cm4gOjpuZGs6OkFQYXJjZWxfd3JpdGVTdHJpbmcoX3BhcmNlbCwgZ2V0PHN0cj4oKSk7Ci0gIH0KLSAgX19hc3NlcnQyKF9fRklMRV9fLCBfX0xJTkVfXywgX19QUkVUVFlfRlVOQ1RJT05fXywgImNhbid0IHJlYWNoIGhlcmUiKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGxvZ2dhYmxlCi19ICAvLyBuYW1lc3BhY2UgYWlkbAotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLX0gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2xvZ2dhYmxlL1VuaW9uLmNwcC5kIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9Vbmlvbi5jcHAuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk2ODc1MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2xvZ2dhYmxlL1VuaW9uLmNwcC5kCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1vdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvVW5pb24uY3BwIDogXAotICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvVW5pb24uYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvQm5EYXRhLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9CbkRhdGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI5MTEwOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9CbkRhdGEuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNlcnJvciBUT0RPKGIvMTExMzYyNTkzKSBkZWZpbmVkX3R5cGVzIGRvIG5vdCBoYXZlIGJuIGNsYXNzZXMKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0JuRW51bS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvQm5FbnVtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NWJiYzguLjAwMDAwMDAKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvQm5FbnVtLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jZXJyb3IgVE9ETyhiLzExMTM2MjU5MykgZW51bXMgZG8gbm90IGhhdmUgYm4gY2xhc3NlcwpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvQm5Mb2dnYWJsZUludGVyZmFjZS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvQm5Mb2dnYWJsZUludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTBjYTg2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0JuTG9nZ2FibGVJbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiYWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvSUxvZ2dhYmxlSW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pYmluZGVyLmg+Ci0KLW5hbWVzcGFjZSBhaWRsIHsKLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBhaWRsIHsKLW5hbWVzcGFjZSBsb2dnYWJsZSB7Ci1jbGFzcyBCbkxvZ2dhYmxlSW50ZXJmYWNlIDogcHVibGljIDo6bmRrOjpCbkNJbnRlcmZhY2U8SUxvZ2dhYmxlSW50ZXJmYWNlPiB7Ci1wdWJsaWM6Ci0gIEJuTG9nZ2FibGVJbnRlcmZhY2UoKTsKLSAgdmlydHVhbCB+Qm5Mb2dnYWJsZUludGVyZmFjZSgpOwotICBzdHJ1Y3QgVHJhbnNhY3Rpb25Mb2cgewotICAgIGRvdWJsZSBkdXJhdGlvbl9tczsKLSAgICBzdGQ6OnN0cmluZyBpbnRlcmZhY2VfbmFtZTsKLSAgICBzdGQ6OnN0cmluZyBtZXRob2RfbmFtZTsKLSAgICBjb25zdCB2b2lkKiBwcm94eV9hZGRyZXNzOwotICAgIGNvbnN0IHZvaWQqIHN0dWJfYWRkcmVzczsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj4gaW5wdXRfYXJnczsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj4gb3V0cHV0X2FyZ3M7Ci0gICAgc3RkOjpzdHJpbmcgcmVzdWx0OwotICAgIHN0ZDo6c3RyaW5nIGV4Y2VwdGlvbl9tZXNzYWdlOwotICAgIGludDMyX3QgZXhjZXB0aW9uX2NvZGU7Ci0gICAgaW50MzJfdCB0cmFuc2FjdGlvbl9lcnJvcjsKLSAgICBpbnQzMl90IHNlcnZpY2Vfc3BlY2lmaWNfZXJyb3JfY29kZTsKLSAgfTsKLSAgc3RhdGljIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBUcmFuc2FjdGlvbkxvZyYpPiBsb2dGdW5jOwotcHJvdGVjdGVkOgotICA6Om5kazo6U3BBSUJpbmRlciBjcmVhdGVCaW5kZXIoKSBvdmVycmlkZTsKLXByaXZhdGU6Ci19OwotfSAgLy8gbmFtZXNwYWNlIGxvZ2dhYmxlCi19ICAvLyBuYW1lc3BhY2UgYWlkbAotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLX0gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9CblVuaW9uLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9CblVuaW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyOTExMDguLjAwMDAwMDAKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvQm5Vbmlvbi5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI2Vycm9yIFRPRE8oYi8xMTEzNjI1OTMpIGRlZmluZWRfdHlwZXMgZG8gbm90IGhhdmUgYm4gY2xhc3NlcwpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvQnBEYXRhLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9CcERhdGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThhMGRiMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9CcERhdGEuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNlcnJvciBUT0RPKGIvMTExMzYyNTkzKSBkZWZpbmVkX3R5cGVzIGRvIG5vdCBoYXZlIGJwIGNsYXNzZXMKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0JwRW51bS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvQnBFbnVtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0YTJjNmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvQnBFbnVtLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jZXJyb3IgVE9ETyhiLzExMTM2MjU5MykgZW51bXMgZG8gbm90IGhhdmUgYnAgY2xhc3NlcwpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvQnBMb2dnYWJsZUludGVyZmFjZS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvQnBMb2dnYWJsZUludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2ZjNTc2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0JwTG9nZ2FibGVJbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiYWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvSUxvZ2dhYmxlSW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pYmluZGVyLmg+Ci0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDxjaHJvbm8+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxhbmRyb2lkL3RyYWNlLmg+Ci0KLW5hbWVzcGFjZSBhaWRsIHsKLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBhaWRsIHsKLW5hbWVzcGFjZSBsb2dnYWJsZSB7Ci1jbGFzcyBCcExvZ2dhYmxlSW50ZXJmYWNlIDogcHVibGljIDo6bmRrOjpCcENJbnRlcmZhY2U8SUxvZ2dhYmxlSW50ZXJmYWNlPiB7Ci1wdWJsaWM6Ci0gIGV4cGxpY2l0IEJwTG9nZ2FibGVJbnRlcmZhY2UoY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGJpbmRlcik7Ci0gIHZpcnR1YWwgfkJwTG9nZ2FibGVJbnRlcmZhY2UoKTsKLQotICA6Om5kazo6U2NvcGVkQVN0YXR1cyBMb2dUaGlzKGJvb2wgaW5fYm9vbFZhbHVlLCBzdGQ6OnZlY3Rvcjxib29sPiogaW5fYm9vbEFycmF5LCBpbnQ4X3QgaW5fYnl0ZVZhbHVlLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiogaW5fYnl0ZUFycmF5LCBjaGFyMTZfdCBpbl9jaGFyVmFsdWUsIHN0ZDo6dmVjdG9yPGNoYXIxNl90PiogaW5fY2hhckFycmF5LCBpbnQzMl90IGluX2ludFZhbHVlLCBzdGQ6OnZlY3RvcjxpbnQzMl90PiogaW5faW50QXJyYXksIGludDY0X3QgaW5fbG9uZ1ZhbHVlLCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiogaW5fbG9uZ0FycmF5LCBmbG9hdCBpbl9mbG9hdFZhbHVlLCBzdGQ6OnZlY3RvcjxmbG9hdD4qIGluX2Zsb2F0QXJyYXksIGRvdWJsZSBpbl9kb3VibGVWYWx1ZSwgc3RkOjp2ZWN0b3I8ZG91YmxlPiogaW5fZG91YmxlQXJyYXksIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl9zdHJpbmdWYWx1ZSwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBpbl9zdHJpbmdBcnJheSwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBpbl9saXN0VmFsdWUsIGNvbnN0IDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6bG9nZ2FibGU6OkRhdGEmIGluX2RhdGFWYWx1ZSwgY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGluX2JpbmRlclZhbHVlLCA6Om5kazo6U2NvcGVkRmlsZURlc2NyaXB0b3IqIGluX3BmZFZhbHVlLCBzdGQ6OnZlY3Rvcjw6Om5kazo6U2NvcGVkRmlsZURlc2NyaXB0b3I+KiBpbl9wZmRBcnJheSwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICBzdHJ1Y3QgVHJhbnNhY3Rpb25Mb2cgewotICAgIGRvdWJsZSBkdXJhdGlvbl9tczsKLSAgICBzdGQ6OnN0cmluZyBpbnRlcmZhY2VfbmFtZTsKLSAgICBzdGQ6OnN0cmluZyBtZXRob2RfbmFtZTsKLSAgICBjb25zdCB2b2lkKiBwcm94eV9hZGRyZXNzOwotICAgIGNvbnN0IHZvaWQqIHN0dWJfYWRkcmVzczsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj4gaW5wdXRfYXJnczsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj4gb3V0cHV0X2FyZ3M7Ci0gICAgc3RkOjpzdHJpbmcgcmVzdWx0OwotICAgIHN0ZDo6c3RyaW5nIGV4Y2VwdGlvbl9tZXNzYWdlOwotICAgIGludDMyX3QgZXhjZXB0aW9uX2NvZGU7Ci0gICAgaW50MzJfdCB0cmFuc2FjdGlvbl9lcnJvcjsKLSAgICBpbnQzMl90IHNlcnZpY2Vfc3BlY2lmaWNfZXJyb3JfY29kZTsKLSAgfTsKLSAgc3RhdGljIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBUcmFuc2FjdGlvbkxvZyYpPiBsb2dGdW5jOwotfTsKLX0gIC8vIG5hbWVzcGFjZSBsb2dnYWJsZQotfSAgLy8gbmFtZXNwYWNlIGFpZGwKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi19ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvQnBVbmlvbi5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvQnBVbmlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGEwZGIzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0JwVW5pb24uaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNlcnJvciBUT0RPKGIvMTExMzYyNTkzKSBkZWZpbmVkX3R5cGVzIGRvIG5vdCBoYXZlIGJwIGNsYXNzZXMKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0RhdGEuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0RhdGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNjNzg4ZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9EYXRhLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0jcHJhZ21hIG9uY2UKLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pbnRlcmZhY2VfdXRpbHMuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wYXJjZWxhYmxlX3V0aWxzLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfdG9fc3RyaW5nLmg+Ci0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8b3B0aW9uYWw+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9zdGFiaWxpdHkuaD4KLSNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCi0jaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvRW51bS5oPgotI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL1VuaW9uLmg+Ci1uYW1lc3BhY2UgYWlkbCB7Ci1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgYWlkbCB7Ci1uYW1lc3BhY2UgbG9nZ2FibGUgewotY2xhc3MgRGF0YSB7Ci1wdWJsaWM6Ci0gIHR5cGVkZWYgc3RkOjpmYWxzZV90eXBlIGZpeGVkX3NpemU7Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBkZXNjcmlwdG9yOwotCi0gIGludDMyX3QgbnVtID0gMDsKLSAgc3RkOjpzdHJpbmcgc3RyOwotICA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OmxvZ2dhYmxlOjpVbmlvbiBuZXN0ZWRVbmlvbjsKLSAgOjphaWRsOjphbmRyb2lkOjphaWRsOjpsb2dnYWJsZTo6RW51bSBuZXN0ZWRFbnVtID0gOjphaWRsOjphbmRyb2lkOjphaWRsOjpsb2dnYWJsZTo6RW51bTo6Rk9POwotCi0gIGJpbmRlcl9zdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBwYXJjZWwpOwotICBiaW5kZXJfc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChBUGFyY2VsKiBwYXJjZWwpIGNvbnN0OwotCi0gIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgRGF0YSYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0ZDo6dGllKG51bSwgc3RyLCBuZXN0ZWRVbmlvbiwgbmVzdGVkRW51bSkgIT0gc3RkOjp0aWUocmhzLm51bSwgcmhzLnN0ciwgcmhzLm5lc3RlZFVuaW9uLCByaHMubmVzdGVkRW51bSk7Ci0gIH0KLSAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IERhdGEmIHJocykgY29uc3QgewotICAgIHJldHVybiBzdGQ6OnRpZShudW0sIHN0ciwgbmVzdGVkVW5pb24sIG5lc3RlZEVudW0pIDwgc3RkOjp0aWUocmhzLm51bSwgcmhzLnN0ciwgcmhzLm5lc3RlZFVuaW9uLCByaHMubmVzdGVkRW51bSk7Ci0gIH0KLSAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBEYXRhJiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gc3RkOjp0aWUobnVtLCBzdHIsIG5lc3RlZFVuaW9uLCBuZXN0ZWRFbnVtKSA8PSBzdGQ6OnRpZShyaHMubnVtLCByaHMuc3RyLCByaHMubmVzdGVkVW5pb24sIHJocy5uZXN0ZWRFbnVtKTsKLSAgfQotICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IERhdGEmIHJocykgY29uc3QgewotICAgIHJldHVybiBzdGQ6OnRpZShudW0sIHN0ciwgbmVzdGVkVW5pb24sIG5lc3RlZEVudW0pID09IHN0ZDo6dGllKHJocy5udW0sIHJocy5zdHIsIHJocy5uZXN0ZWRVbmlvbiwgcmhzLm5lc3RlZEVudW0pOwotICB9Ci0gIGlubGluZSBib29sIG9wZXJhdG9yPihjb25zdCBEYXRhJiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gc3RkOjp0aWUobnVtLCBzdHIsIG5lc3RlZFVuaW9uLCBuZXN0ZWRFbnVtKSA+IHN0ZDo6dGllKHJocy5udW0sIHJocy5zdHIsIHJocy5uZXN0ZWRVbmlvbiwgcmhzLm5lc3RlZEVudW0pOwotICB9Ci0gIGlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgRGF0YSYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0ZDo6dGllKG51bSwgc3RyLCBuZXN0ZWRVbmlvbiwgbmVzdGVkRW51bSkgPj0gc3RkOjp0aWUocmhzLm51bSwgcmhzLnN0ciwgcmhzLm5lc3RlZFVuaW9uLCByaHMubmVzdGVkRW51bSk7Ci0gIH0KLQotICBzdGF0aWMgY29uc3QgOjpuZGs6OnBhcmNlbGFibGVfc3RhYmlsaXR5X3QgX2FpZGxfc3RhYmlsaXR5ID0gOjpuZGs6OlNUQUJJTElUWV9MT0NBTDsKLSAgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgewotICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvczsKLSAgICBvcyA8PCAiRGF0YXsiOwotICAgIG9zIDw8ICJudW06ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcobnVtKTsKLSAgICBvcyA8PCAiLCBzdHI6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoc3RyKTsKLSAgICBvcyA8PCAiLCBuZXN0ZWRVbmlvbjogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhuZXN0ZWRVbmlvbik7Ci0gICAgb3MgPDwgIiwgbmVzdGVkRW51bTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhuZXN0ZWRFbnVtKTsKLSAgICBvcyA8PCAifSI7Ci0gICAgcmV0dXJuIG9zLnN0cigpOwotICB9Ci19OwotfSAgLy8gbmFtZXNwYWNlIGxvZ2dhYmxlCi19ICAvLyBuYW1lc3BhY2UgYWlkbAotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLX0gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9FbnVtLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9FbnVtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMDIwODAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvRW51bS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxvcHRpb25hbD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAotI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3N0YWJpbGl0eS5oPgotI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKLSNpbmNsdWRlIDxhcnJheT4KLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9lbnVtcy5oPgotbmFtZXNwYWNlIGFpZGwgewotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGFpZGwgewotbmFtZXNwYWNlIGxvZ2dhYmxlIHsKLWVudW0gY2xhc3MgRW51bSA6IGludDhfdCB7Ci0gIEZPTyA9IDQyLAotfTsKLQotW1tub2Rpc2NhcmRdXSBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKEVudW0gdmFsKSB7Ci0gIHN3aXRjaCh2YWwpIHsKLSAgY2FzZSBFbnVtOjpGT086Ci0gICAgcmV0dXJuICJGT08iOwotICBkZWZhdWx0OgotICAgIHJldHVybiBzdGQ6OnRvX3N0cmluZyhzdGF0aWNfY2FzdDxpbnQ4X3Q+KHZhbCkpOwotICB9Ci19Ci19ICAvLyBuYW1lc3BhY2UgbG9nZ2FibGUKLX0gIC8vIG5hbWVzcGFjZSBhaWRsCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotfSAgLy8gbmFtZXNwYWNlIGFpZGwKLW5hbWVzcGFjZSBuZGsgewotbmFtZXNwYWNlIGludGVybmFsIHsKLSNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCi0jcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdjKysxNy1leHRlbnNpb25zIgotdGVtcGxhdGUgPD4KLWNvbnN0ZXhwciBpbmxpbmUgc3RkOjphcnJheTxhaWRsOjphbmRyb2lkOjphaWRsOjpsb2dnYWJsZTo6RW51bSwgMT4gZW51bV92YWx1ZXM8YWlkbDo6YW5kcm9pZDo6YWlkbDo6bG9nZ2FibGU6OkVudW0+ID0gewotICBhaWRsOjphbmRyb2lkOjphaWRsOjpsb2dnYWJsZTo6RW51bTo6Rk9PLAotfTsKLSNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0lMb2dnYWJsZUludGVyZmFjZS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvSUxvZ2dhYmxlSW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzYzc5ZTEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvSUxvZ2dhYmxlSW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2ludGVyZmFjZV91dGlscy5oPgotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8Y2hyb25vPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxvcHRpb25hbD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAotI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3N0YWJpbGl0eS5oPgotI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKLSNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9EYXRhLmg+Ci0KLW5hbWVzcGFjZSBhaWRsIHsKLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBhaWRsIHsKLW5hbWVzcGFjZSBsb2dnYWJsZSB7Ci1jbGFzcyBJTG9nZ2FibGVJbnRlcmZhY2UgOiBwdWJsaWMgOjpuZGs6OklDSW50ZXJmYWNlIHsKLXB1YmxpYzoKLSAgc3RhdGljIGNvbnN0IGNoYXIqIGRlc2NyaXB0b3I7Ci0gIElMb2dnYWJsZUludGVyZmFjZSgpOwotICB2aXJ0dWFsIH5JTG9nZ2FibGVJbnRlcmZhY2UoKTsKLQotICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX0xvZ1RoaXMgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMDsKLQotICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPElMb2dnYWJsZUludGVyZmFjZT4gZnJvbUJpbmRlcihjb25zdCA6Om5kazo6U3BBSUJpbmRlciYgYmluZGVyKTsKLSAgc3RhdGljIGJpbmRlcl9zdGF0dXNfdCB3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIHBhcmNlbCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElMb2dnYWJsZUludGVyZmFjZT4mIGluc3RhbmNlKTsKLSAgc3RhdGljIGJpbmRlcl9zdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBwYXJjZWwsIHN0ZDo6c2hhcmVkX3B0cjxJTG9nZ2FibGVJbnRlcmZhY2U+KiBpbnN0YW5jZSk7Ci0gIHN0YXRpYyBib29sIHNldERlZmF1bHRJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJTG9nZ2FibGVJbnRlcmZhY2U+JiBpbXBsKTsKLSAgc3RhdGljIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJTG9nZ2FibGVJbnRlcmZhY2U+JiBnZXREZWZhdWx0SW1wbCgpOwotICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIExvZ1RoaXMoYm9vbCBpbl9ib29sVmFsdWUsIHN0ZDo6dmVjdG9yPGJvb2w+KiBpbl9ib29sQXJyYXksIGludDhfdCBpbl9ieXRlVmFsdWUsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBpbl9ieXRlQXJyYXksIGNoYXIxNl90IGluX2NoYXJWYWx1ZSwgc3RkOjp2ZWN0b3I8Y2hhcjE2X3Q+KiBpbl9jaGFyQXJyYXksIGludDMyX3QgaW5faW50VmFsdWUsIHN0ZDo6dmVjdG9yPGludDMyX3Q+KiBpbl9pbnRBcnJheSwgaW50NjRfdCBpbl9sb25nVmFsdWUsIHN0ZDo6dmVjdG9yPGludDY0X3Q+KiBpbl9sb25nQXJyYXksIGZsb2F0IGluX2Zsb2F0VmFsdWUsIHN0ZDo6dmVjdG9yPGZsb2F0PiogaW5fZmxvYXRBcnJheSwgZG91YmxlIGluX2RvdWJsZVZhbHVlLCBzdGQ6OnZlY3Rvcjxkb3VibGU+KiBpbl9kb3VibGVBcnJheSwgY29uc3Qgc3RkOjpzdHJpbmcmIGluX3N0cmluZ1ZhbHVlLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIGluX3N0cmluZ0FycmF5LCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIGluX2xpc3RWYWx1ZSwgY29uc3QgOjphaWRsOjphbmRyb2lkOjphaWRsOjpsb2dnYWJsZTo6RGF0YSYgaW5fZGF0YVZhbHVlLCBjb25zdCA6Om5kazo6U3BBSUJpbmRlciYgaW5fYmluZGVyVmFsdWUsIDo6bmRrOjpTY29wZWRGaWxlRGVzY3JpcHRvciogaW5fcGZkVmFsdWUsIHN0ZDo6dmVjdG9yPDo6bmRrOjpTY29wZWRGaWxlRGVzY3JpcHRvcj4qIGluX3BmZEFycmF5LCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIF9haWRsX3JldHVybikgPSAwOwotcHJpdmF0ZToKLSAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxJTG9nZ2FibGVJbnRlcmZhY2U+IGRlZmF1bHRfaW1wbDsKLX07Ci1jbGFzcyBJTG9nZ2FibGVJbnRlcmZhY2VEZWZhdWx0IDogcHVibGljIElMb2dnYWJsZUludGVyZmFjZSB7Ci1wdWJsaWM6Ci0gIDo6bmRrOjpTY29wZWRBU3RhdHVzIExvZ1RoaXMoYm9vbCBpbl9ib29sVmFsdWUsIHN0ZDo6dmVjdG9yPGJvb2w+KiBpbl9ib29sQXJyYXksIGludDhfdCBpbl9ieXRlVmFsdWUsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBpbl9ieXRlQXJyYXksIGNoYXIxNl90IGluX2NoYXJWYWx1ZSwgc3RkOjp2ZWN0b3I8Y2hhcjE2X3Q+KiBpbl9jaGFyQXJyYXksIGludDMyX3QgaW5faW50VmFsdWUsIHN0ZDo6dmVjdG9yPGludDMyX3Q+KiBpbl9pbnRBcnJheSwgaW50NjRfdCBpbl9sb25nVmFsdWUsIHN0ZDo6dmVjdG9yPGludDY0X3Q+KiBpbl9sb25nQXJyYXksIGZsb2F0IGluX2Zsb2F0VmFsdWUsIHN0ZDo6dmVjdG9yPGZsb2F0PiogaW5fZmxvYXRBcnJheSwgZG91YmxlIGluX2RvdWJsZVZhbHVlLCBzdGQ6OnZlY3Rvcjxkb3VibGU+KiBpbl9kb3VibGVBcnJheSwgY29uc3Qgc3RkOjpzdHJpbmcmIGluX3N0cmluZ1ZhbHVlLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIGluX3N0cmluZ0FycmF5LCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIGluX2xpc3RWYWx1ZSwgY29uc3QgOjphaWRsOjphbmRyb2lkOjphaWRsOjpsb2dnYWJsZTo6RGF0YSYgaW5fZGF0YVZhbHVlLCBjb25zdCA6Om5kazo6U3BBSUJpbmRlciYgaW5fYmluZGVyVmFsdWUsIDo6bmRrOjpTY29wZWRGaWxlRGVzY3JpcHRvciogaW5fcGZkVmFsdWUsIHN0ZDo6dmVjdG9yPDo6bmRrOjpTY29wZWRGaWxlRGVzY3JpcHRvcj4qIGluX3BmZEFycmF5LCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gIDo6bmRrOjpTcEFJQmluZGVyIGFzQmluZGVyKCkgb3ZlcnJpZGU7Ci0gIGJvb2wgaXNSZW1vdGUoKSBvdmVycmlkZTsKLX07Ci19ICAvLyBuYW1lc3BhY2UgbG9nZ2FibGUKLX0gIC8vIG5hbWVzcGFjZSBhaWRsCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL1VuaW9uLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9Vbmlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTM3NTJhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL1VuaW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotI3ByYWdtYSBvbmNlCi0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaW50ZXJmYWNlX3V0aWxzLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcGFyY2VsYWJsZV91dGlscy5oPgotI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3RvX3N0cmluZy5oPgotCi0jaW5jbHVkZSA8Y2Fzc2VydD4KLSNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KLSNpbmNsdWRlIDx1dGlsaXR5PgotI2luY2x1ZGUgPHZhcmlhbnQ+Ci0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8b3B0aW9uYWw+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9zdGFiaWxpdHkuaD4KLSNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCi0KLSNpZm5kZWYgX19CSU9OSUNfXwotI2RlZmluZSBfX2Fzc2VydDIoYSxiLGMsZCkgKCh2b2lkKTApCi0jZW5kaWYKLQotbmFtZXNwYWNlIGFpZGwgewotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGFpZGwgewotbmFtZXNwYWNlIGxvZ2dhYmxlIHsKLWNsYXNzIFVuaW9uIHsKLXB1YmxpYzoKLSAgdHlwZWRlZiBzdGQ6OmZhbHNlX3R5cGUgZml4ZWRfc2l6ZTsKLSAgc3RhdGljIGNvbnN0IGNoYXIqIGRlc2NyaXB0b3I7Ci0KLSAgZW51bSBUYWcgOiBpbnQzMl90IHsKLSAgICBudW0gPSAwLCAgLy8gaW50IG51bTsKLSAgICBzdHIsICAvLyBTdHJpbmcgc3RyOwotICB9OwotCi0gIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KLSAgc3RhdGljIGNvbnN0ZXhwciBib29sIF9ub3Rfc2VsZiA9ICFzdGQ6OmlzX3NhbWVfdjxzdGQ6OnJlbW92ZV9jdl90PHN0ZDo6cmVtb3ZlX3JlZmVyZW5jZV90PF9UcD4+LCBVbmlvbj47Ci0KLSAgVW5pb24oKSA6IF92YWx1ZShzdGQ6OmluX3BsYWNlX2luZGV4PG51bT4sIGludDMyX3QoNDMpKSB7IH0KLSAgVW5pb24oY29uc3QgVW5pb24mKSA9IGRlZmF1bHQ7Ci0gIFVuaW9uKFVuaW9uJiYpID0gZGVmYXVsdDsKLSAgVW5pb24mIG9wZXJhdG9yPShjb25zdCBVbmlvbiYpID0gZGVmYXVsdDsKLSAgVW5pb24mIG9wZXJhdG9yPShVbmlvbiYmKSA9IGRlZmF1bHQ7Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgPSBzdGQ6OmVuYWJsZV9pZl90PF9ub3Rfc2VsZjxfVHA+Pj4KLSAgLy8gTk9MSU5UTkVYVExJTkUoZ29vZ2xlLWV4cGxpY2l0LWNvbnN0cnVjdG9yKQotICBjb25zdGV4cHIgVW5pb24oX1RwJiYgX2FyZykKLSAgICAgIDogX3ZhbHVlKHN0ZDo6Zm9yd2FyZDxfVHA+KF9hcmcpKSB7fQotCi0gIHRlbXBsYXRlIDxzaXplX3QgX05wLCB0eXBlbmFtZS4uLiBfVHA+Ci0gIGNvbnN0ZXhwciBleHBsaWNpdCBVbmlvbihzdGQ6OmluX3BsYWNlX2luZGV4X3Q8X05wPiwgX1RwJiYuLi4gX2FyZ3MpCi0gICAgICA6IF92YWx1ZShzdGQ6OmluX3BsYWNlX2luZGV4PF9OcD4sIHN0ZDo6Zm9yd2FyZDxfVHA+KF9hcmdzKS4uLikge30KLQotICB0ZW1wbGF0ZSA8VGFnIF90YWcsIHR5cGVuYW1lLi4uIF9UcD4KLSAgc3RhdGljIFVuaW9uIG1ha2UoX1RwJiYuLi4gX2FyZ3MpIHsKLSAgICByZXR1cm4gVW5pb24oc3RkOjppbl9wbGFjZV9pbmRleDxfdGFnPiwgc3RkOjpmb3J3YXJkPF9UcD4oX2FyZ3MpLi4uKTsKLSAgfQotCi0gIHRlbXBsYXRlIDxUYWcgX3RhZywgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZS4uLiBfVXA+Ci0gIHN0YXRpYyBVbmlvbiBtYWtlKHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxfVHA+IF9pbCwgX1VwJiYuLi4gX2FyZ3MpIHsKLSAgICByZXR1cm4gVW5pb24oc3RkOjppbl9wbGFjZV9pbmRleDxfdGFnPiwgc3RkOjptb3ZlKF9pbCksIHN0ZDo6Zm9yd2FyZDxfVXA+KF9hcmdzKS4uLik7Ci0gIH0KLQotICBUYWcgZ2V0VGFnKCkgY29uc3QgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxUYWc+KF92YWx1ZS5pbmRleCgpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDxUYWcgX3RhZz4KLSAgY29uc3QgYXV0byYgZ2V0KCkgY29uc3QgewotICAgIGlmIChnZXRUYWcoKSAhPSBfdGFnKSB7IF9fYXNzZXJ0MihfX0ZJTEVfXywgX19MSU5FX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18sICJiYWQgYWNjZXNzOiBhIHdyb25nIHRhZyIpOyB9Ci0gICAgcmV0dXJuIHN0ZDo6Z2V0PF90YWc+KF92YWx1ZSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8VGFnIF90YWc+Ci0gIGF1dG8mIGdldCgpIHsKLSAgICBpZiAoZ2V0VGFnKCkgIT0gX3RhZykgeyBfX2Fzc2VydDIoX19GSUxFX18sIF9fTElORV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fLCAiYmFkIGFjY2VzczogYSB3cm9uZyB0YWciKTsgfQotICAgIHJldHVybiBzdGQ6OmdldDxfdGFnPihfdmFsdWUpOwotICB9Ci0KLSAgdGVtcGxhdGUgPFRhZyBfdGFnLCB0eXBlbmFtZS4uLiBfVHA+Ci0gIHZvaWQgc2V0KF9UcCYmLi4uIF9hcmdzKSB7Ci0gICAgX3ZhbHVlLmVtcGxhY2U8X3RhZz4oc3RkOjpmb3J3YXJkPF9UcD4oX2FyZ3MpLi4uKTsKLSAgfQotCi0gIGJpbmRlcl9zdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBfcGFyY2VsKTsKLSAgYmluZGVyX3N0YXR1c190IHdyaXRlVG9QYXJjZWwoQVBhcmNlbCogX3BhcmNlbCkgY29uc3Q7Ci0KLSAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBVbmlvbiYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuIF92YWx1ZSAhPSByaHMuX3ZhbHVlOwotICB9Ci0gIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBVbmlvbiYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuIF92YWx1ZSA8IHJocy5fdmFsdWU7Ci0gIH0KLSAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBVbmlvbiYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuIF92YWx1ZSA8PSByaHMuX3ZhbHVlOwotICB9Ci0gIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgVW5pb24mIHJocykgY29uc3QgewotICAgIHJldHVybiBfdmFsdWUgPT0gcmhzLl92YWx1ZTsKLSAgfQotICBpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgVW5pb24mIHJocykgY29uc3QgewotICAgIHJldHVybiBfdmFsdWUgPiByaHMuX3ZhbHVlOwotICB9Ci0gIGlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgVW5pb24mIHJocykgY29uc3QgewotICAgIHJldHVybiBfdmFsdWUgPj0gcmhzLl92YWx1ZTsKLSAgfQotCi0gIHN0YXRpYyBjb25zdCA6Om5kazo6cGFyY2VsYWJsZV9zdGFiaWxpdHlfdCBfYWlkbF9zdGFiaWxpdHkgPSA6Om5kazo6U1RBQklMSVRZX0xPQ0FMOwotICBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7Ci0gICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOwotICAgIG9zIDw8ICJVbmlvbnsiOwotICAgIHN3aXRjaCAoZ2V0VGFnKCkpIHsKLSAgICBjYXNlIG51bTogb3MgPDwgIm51bTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhnZXQ8bnVtPigpKTsgYnJlYWs7Ci0gICAgY2FzZSBzdHI6IG9zIDw8ICJzdHI6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoZ2V0PHN0cj4oKSk7IGJyZWFrOwotICAgIH0KLSAgICBvcyA8PCAifSI7Ci0gICAgcmV0dXJuIG9zLnN0cigpOwotICB9Ci1wcml2YXRlOgotICBzdGQ6OnZhcmlhbnQ8aW50MzJfdCwgc3RkOjpzdHJpbmc+IF92YWx1ZTsKLX07Ci19ICAvLyBuYW1lc3BhY2UgbG9nZ2FibGUKLX0gIC8vIG5hbWVzcGFjZSBhaWRsCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi90aW1lc3RhbXAgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vdGltZXN0YW1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi90aW1lc3RhbXAKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX3Rlc3Quc2ggYi90ZXN0cy9nb2xkZW5fdGVzdC5zaAppbmRleCA5NzI5YmQ1Li44NmE1ZDFhIDEwMDc1NQotLS0gYS90ZXN0cy9nb2xkZW5fdGVzdC5zaAorKysgYi90ZXN0cy9nb2xkZW5fdGVzdC5zaApAQCAtMzksMTIgKzM5LDIwIEBACiAgIG1vZHVsZXM9KAogICAgICJhaWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UiCiAgICAgImFpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UiCi0gICAgImFpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZSIKKyAgICAiYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtY3BwLXNvdXJjZSIKKyAgICAiYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtamF2YS1zb3VyY2UiCisgICAgImFpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYxLW5kay1zb3VyY2UiCisgICAgImFpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYxLXJ1c3Qtc291cmNlIgorICAgICJhaWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UiCiAgICAgImFpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UiCiAgICAgImFpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtY3BwLXNvdXJjZSIKICAgICAiYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1qYXZhLXNvdXJjZSIKLSAgICAiYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlIgogICAgICJhaWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5kay1zb3VyY2UiCisgICAgImFpZGwtdGVzdC1pbnRlcmZhY2UtcGVybWlzc2lvbi1qYXZhLXNvdXJjZSIKKyAgICAiYWlkbC10ZXN0LWZpeGVkc2l6ZWFycmF5LWNwcC1zb3VyY2UiCisgICAgImFpZGwtdGVzdC1maXhlZHNpemVhcnJheS1qYXZhLXNvdXJjZSIKKyAgICAiYWlkbC10ZXN0LWZpeGVkc2l6ZWFycmF5LW5kay1zb3VyY2UiCisgICAgImFpZGwtdGVzdC1maXhlZHNpemVhcnJheS1ydXN0LXNvdXJjZSIKICAgKQogCiAgIGxvY2FsIHJvb3Q9Ii4iCkBAIC02OSw3ICs3Nyw3IEBACiAgICAgICBta2RpciAtcCAiJGdvbGRlbiIKICAgICAgIGNwIC1yICIkYnVpbHQvZ2VuIiAiJGdvbGRlbiIKICAgICBlbHNlCi0gICAgICBkaWZmIC1yICIkYnVpbHQiICIkZ29sZGVuIiB8fCBlPTEKKyAgICAgIGRpZmYgLXIgIiRidWlsdC9nZW4iICIkZ29sZGVuL2dlbiIgfHwgZT0xCiAgICAgZmkKICAgZG9uZQogCmRpZmYgLS1naXQgYS90ZXN0cy9qYXZhL3NyYy9hbmRyb2lkL2FpZGwvc2RrdmVyc2lvbi9JVGVzdFNlcnZpY2UuYWlkbCBiL3Rlc3RzL2phdmEvc3JjL2FuZHJvaWQvYWlkbC9zZGt2ZXJzaW9uL0lUZXN0U2VydmljZS5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZWZkZGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9qYXZhL3NyYy9hbmRyb2lkL2FpZGwvc2RrdmVyc2lvbi9JVGVzdFNlcnZpY2UuYWlkbApAQCAtMCwwICsxLDI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5haWRsLnNka3ZlcnNpb247CisKK2ludGVyZmFjZSBJVGVzdFNlcnZpY2UgeworICAgIC8vIFNpbmNlIHNkayA9IDI5LCB3ZSBoYXZlIHdyaXRlL3JlYWRCb29sZWFuCisgICAgYm9vbGVhbiBSZXBlYXRCb29sZWFuKGJvb2xlYW4gdG9rZW4pOworCisgICAgLy8gU2luY2Ugc2RrID0gMjMsIHdlIGhhdmUgd3JpdGUvcmVhZFR5cGVkT2JqZWN0CisgICAgQEphdmFEZXJpdmUodG9TdHJpbmc9dHJ1ZSwgZXF1YWxzPXRydWUpCisgICAgcGFyY2VsYWJsZSBUeXBlZE9iamVjdCB7CisgICAgICAgIGJvb2xlYW4gYjsKKyAgICB9CisgICAgQG51bGxhYmxlIFR5cGVkT2JqZWN0IFJlcGVhdFR5cGVkT2JqZWN0KGluIEBudWxsYWJsZSBUeXBlZE9iamVjdCB0b2tlbik7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9qYXZhL3NyYy9hbmRyb2lkL2FpZGwvc2RrdmVyc2lvbi9zZXJ2aWNlL0FpZGxKYXZhVmVyc2lvblRlc3RTZXJ2aWNlLmphdmEgYi90ZXN0cy9qYXZhL3NyYy9hbmRyb2lkL2FpZGwvc2RrdmVyc2lvbi9zZXJ2aWNlL0FpZGxKYXZhVmVyc2lvblRlc3RTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ExMDhjOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2phdmEvc3JjL2FuZHJvaWQvYWlkbC9zZGt2ZXJzaW9uL3NlcnZpY2UvQWlkbEphdmFWZXJzaW9uVGVzdFNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFpZGwuc2RrdmVyc2lvbi5zZXJ2aWNlOworCitpbXBvcnQgYW5kcm9pZC5haWRsLnNka3ZlcnNpb24uSVRlc3RTZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQuYWlkbC5zZGt2ZXJzaW9uLklUZXN0U2VydmljZS5UeXBlZE9iamVjdDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOworCitwdWJsaWMgY2xhc3MgQWlkbEphdmFWZXJzaW9uVGVzdFNlcnZpY2UgeworICBzdGF0aWMgY2xhc3MgVGVzdFNlcnZpY2VTZXJ2ZXIgZXh0ZW5kcyBJVGVzdFNlcnZpY2UuU3R1YiB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gUmVwZWF0Qm9vbGVhbihib29sZWFuIHRva2VuKSB7CisgICAgICByZXR1cm4gdG9rZW47CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFR5cGVkT2JqZWN0IFJlcGVhdFR5cGVkT2JqZWN0KFR5cGVkT2JqZWN0IHRva2VuKSB7CisgICAgICByZXR1cm4gdG9rZW47CisgICAgfQorICB9CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgIFRlc3RTZXJ2aWNlU2VydmVyIG15U2VydmVyID0gbmV3IFRlc3RTZXJ2aWNlU2VydmVyKCk7CisgICAgU2VydmljZU1hbmFnZXIuYWRkU2VydmljZShJVGVzdFNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpLCBteVNlcnZlcik7CisgICAgQmluZGVyLmpvaW5UaHJlYWRQb29sKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2phdmEvc3JjL2FuZHJvaWQvYWlkbC9zZGt2ZXJzaW9uL3Rlc3RzL0FpZGxKYXZhVmVyc2lvblRlc3RzLmphdmEgYi90ZXN0cy9qYXZhL3NyYy9hbmRyb2lkL2FpZGwvc2RrdmVyc2lvbi90ZXN0cy9BaWRsSmF2YVZlcnNpb25UZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMzlhZDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9qYXZhL3NyYy9hbmRyb2lkL2FpZGwvc2RrdmVyc2lvbi90ZXN0cy9BaWRsSmF2YVZlcnNpb25UZXN0cy5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYWlkbC5zZGt2ZXJzaW9uLnRlc3RzOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgYW5kcm9pZC5haWRsLnNka3ZlcnNpb24uSVRlc3RTZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQuYWlkbC5zZGt2ZXJzaW9uLklUZXN0U2VydmljZS5UeXBlZE9iamVjdDsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5pbnRlcm5hbC5UZXh0TGlzdGVuZXI7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5KVW5pdENvcmU7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SZXN1bHQ7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLkpVbml0NDsKKworQFJ1bldpdGgoSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIEFpZGxKYXZhVmVyc2lvblRlc3RzIHsKKyAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgIEpVbml0Q29yZSBqdW5pdCA9IG5ldyBKVW5pdENvcmUoKTsKKyAgICBqdW5pdC5hZGRMaXN0ZW5lcihuZXcgVGV4dExpc3RlbmVyKFN5c3RlbS5vdXQpKTsKKyAgICBSZXN1bHQgcmVzdWx0ID0ganVuaXQucnVuKEFpZGxKYXZhVmVyc2lvblRlc3RzLmNsYXNzKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4ocmVzdWx0Lndhc1N1Y2Nlc3NmdWwoKSA/ICJURVNUIFNVQ0NFU1MiIDogIlRFU1QgRkFJTFVSRSIpOworICB9CisKKyAgcHJpdmF0ZSBJVGVzdFNlcnZpY2UgbVNlcnZpY2U7CisKKyAgQEJlZm9yZQorICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICBJQmluZGVyIGJpbmRlciA9IFNlcnZpY2VNYW5hZ2VyLndhaXRGb3JTZXJ2aWNlKElUZXN0U2VydmljZS5jbGFzcy5nZXROYW1lKCkpOworICAgIGFzc2VydE5vdE51bGwoYmluZGVyKTsKKyAgICBtU2VydmljZSA9IElUZXN0U2VydmljZS5TdHViLmFzSW50ZXJmYWNlKGJpbmRlcik7CisgICAgYXNzZXJ0Tm90TnVsbChtU2VydmljZSk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0Qm9vbGVhbigpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgIGFzc2VydFRydWUobVNlcnZpY2UuUmVwZWF0Qm9vbGVhbih0cnVlKSk7CisgICAgYXNzZXJ0RmFsc2UobVNlcnZpY2UuUmVwZWF0Qm9vbGVhbihmYWxzZSkpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdFR5cGVkT2JqZWN0KCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgVHlwZWRPYmplY3QgdG9rZW4gPSBuZXcgVHlwZWRPYmplY3QoKTsKKyAgICBhc3NlcnRFcXVhbHMobVNlcnZpY2UuUmVwZWF0VHlwZWRPYmplY3QodG9rZW4pLCB0b2tlbik7CisgICAgYXNzZXJ0TnVsbChtU2VydmljZS5SZXBlYXRUeXBlZE9iamVjdChudWxsKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2phdmEvc3JjL2FuZHJvaWQvYWlkbC9zZXJ2aWNlL1Rlc3RTZXJ2aWNlU2VydmVyLmphdmEgYi90ZXN0cy9qYXZhL3NyYy9hbmRyb2lkL2FpZGwvc2VydmljZS9UZXN0U2VydmljZVNlcnZlci5qYXZhCmluZGV4IDA2ZWY2Y2MuLjUxYTc1MjAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2phdmEvc3JjL2FuZHJvaWQvYWlkbC9zZXJ2aWNlL1Rlc3RTZXJ2aWNlU2VydmVyLmphdmEKKysrIGIvdGVzdHMvamF2YS9zcmMvYW5kcm9pZC9haWRsL3NlcnZpY2UvVGVzdFNlcnZpY2VTZXJ2ZXIuamF2YQpAQCAtMTYsNyArMTYsMTAgQEAKIAogcGFja2FnZSBhbmRyb2lkLmFpZGwuc2VydmljZTsKIAoraW1wb3J0IGFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSVJlcGVhdEZpeGVkU2l6ZUFycmF5OworaW1wb3J0IGFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSW50UGFyY2VsYWJsZTsKIGltcG9ydCBhbmRyb2lkLmFpZGwudGVzdHMuQmFja2VuZFR5cGU7CitpbXBvcnQgYW5kcm9pZC5haWRsLnRlc3RzLkJhZFBhcmNlbGFibGU7CiBpbXBvcnQgYW5kcm9pZC5haWRsLnRlc3RzLkJ5dGVFbnVtOwogaW1wb3J0IGFuZHJvaWQuYWlkbC50ZXN0cy5Db25zdGFudEV4cHJlc3Npb25FbnVtOwogaW1wb3J0IGFuZHJvaWQuYWlkbC50ZXN0cy5HZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGU7CkBAIC0yNywxMSArMzAsMTQgQEAKIGltcG9ydCBhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlOwogaW1wb3J0IGFuZHJvaWQuYWlkbC50ZXN0cy5JbnRFbnVtOwogaW1wb3J0IGFuZHJvaWQuYWlkbC50ZXN0cy5Mb25nRW51bTsKK2ltcG9ydCBhbmRyb2lkLmFpZGwudGVzdHMuUmVjdXJzaXZlTGlzdDsKIGltcG9ydCBhbmRyb2lkLmFpZGwudGVzdHMuU2ltcGxlUGFyY2VsYWJsZTsKIGltcG9ydCBhbmRyb2lkLmFpZGwudGVzdHMuU3RydWN0dXJlZFBhcmNlbGFibGU7CiBpbXBvcnQgYW5kcm9pZC5haWRsLnRlc3RzLlVuaW9uOwogaW1wb3J0IGFuZHJvaWQuYWlkbC50ZXN0cy5leHRlbnNpb24uRXh0ZW5kYWJsZVBhcmNlbGFibGU7CiBpbXBvcnQgYW5kcm9pZC5haWRsLnRlc3RzLmV4dGVuc2lvbi5NeUV4dDsKK2ltcG9ydCBhbmRyb2lkLmFpZGwudGVzdHMubmVzdGVkLklOZXN0ZWRTZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQuYWlkbC50ZXN0cy5uZXN0ZWQuUGFyY2VsYWJsZVdpdGhOZXN0ZWQ7CiBpbXBvcnQgYW5kcm9pZC5haWRsLnZlcnNpb25lZC50ZXN0cy5CYXpVbmlvbjsKIGltcG9ydCBhbmRyb2lkLmFpZGwudmVyc2lvbmVkLnRlc3RzLkZvbzsKIGltcG9ydCBhbmRyb2lkLmFpZGwudmVyc2lvbmVkLnRlc3RzLklGb29JbnRlcmZhY2U7CkBAIC00Nyw2ICs1Myw3IEBACiBpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIApAQCAtNTgsNiArNjUsMTIgQEAKICAgICBGb29JbnRlcmZhY2UgZm9vID0gbmV3IEZvb0ludGVyZmFjZSgpOwogICAgIFNlcnZpY2VNYW5hZ2VyLmFkZFNlcnZpY2UoSUZvb0ludGVyZmFjZS5jbGFzcy5nZXROYW1lKCksIGZvbyk7CiAKKyAgICBOZXN0ZWRTZXJ2aWNlIG5lc3RlZCA9IG5ldyBOZXN0ZWRTZXJ2aWNlKCk7CisgICAgU2VydmljZU1hbmFnZXIuYWRkU2VydmljZShJTmVzdGVkU2VydmljZS5jbGFzcy5nZXROYW1lKCksIG5lc3RlZCk7CisKKyAgICBGaXhlZFNpemVBcnJheVNlcnZpY2UgZml4ZWRTaXplID0gbmV3IEZpeGVkU2l6ZUFycmF5U2VydmljZSgpOworICAgIFNlcnZpY2VNYW5hZ2VyLmFkZFNlcnZpY2UoSVJlcGVhdEZpeGVkU2l6ZUFycmF5LkRFU0NSSVBUT1IsIGZpeGVkU2l6ZSk7CisKICAgICBCaW5kZXIuam9pblRocmVhZFBvb2woKTsKICAgfQogCkBAIC04OSw2ICsxMDIsMjcgQEAKICAgICB9CiAgIH0KIAorICBwcml2YXRlIHN0YXRpYyBjbGFzcyBOZXN0ZWRTZXJ2aWNlIGV4dGVuZHMgSU5lc3RlZFNlcnZpY2UuU3R1YiB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGZpbmFsIFJlc3VsdCBmbGlwU3RhdHVzKFBhcmNlbGFibGVXaXRoTmVzdGVkIHApIHsKKyAgICAgIFJlc3VsdCByZXN1bHQgPSBuZXcgUmVzdWx0KCk7CisgICAgICBpZiAocC5zdGF0dXMgPT0gUGFyY2VsYWJsZVdpdGhOZXN0ZWQuU3RhdHVzLk9LKSB7CisgICAgICAgIHJlc3VsdC5zdGF0dXMgPSBQYXJjZWxhYmxlV2l0aE5lc3RlZC5TdGF0dXMuTk9UX09LOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0LnN0YXR1cyA9IFBhcmNlbGFibGVXaXRoTmVzdGVkLlN0YXR1cy5PSzsKKyAgICAgIH0KKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIGZsaXBTdGF0dXNXaXRoQ2FsbGJhY2soYnl0ZSBzdCwgSUNhbGxiYWNrIGNiKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgIGlmIChzdCA9PSBQYXJjZWxhYmxlV2l0aE5lc3RlZC5TdGF0dXMuT0spIHsKKyAgICAgICAgY2IuZG9uZShQYXJjZWxhYmxlV2l0aE5lc3RlZC5TdGF0dXMuTk9UX09LKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNiLmRvbmUoUGFyY2VsYWJsZVdpdGhOZXN0ZWQuU3RhdHVzLk9LKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKwogICBAT3ZlcnJpZGUKICAgcHVibGljIGJvb2xlYW4gb25UcmFuc2FjdChpbnQgY29kZSwgUGFyY2VsIGRhdGEsIFBhcmNlbCByZXBseSwgaW50IGZsYWdzKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKICAgICAvLyBVbmltcGxlbWVudGVkTWV0aG9kCkBAIC0yNzQsNiArMzA4LDYwIEBACiAgICAgcmV0dXJuIG5hbWUuZXF1YWxzKHNlcnZpY2UuR2V0TmFtZSgpKTsKICAgfQogICBAT3ZlcnJpZGUKKyAgcHVibGljIElOYW1lZENhbGxiYWNrW10gR2V0SW50ZXJmYWNlQXJyYXkoU3RyaW5nW10gbmFtZXMpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgIHJldHVybiBHZXROdWxsYWJsZUludGVyZmFjZUFycmF5KG5hbWVzKTsKKyAgfQorICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlQXJyYXkoSU5hbWVkQ2FsbGJhY2tbXSBzZXJ2aWNlcywgU3RyaW5nW10gbmFtZXMpCisgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gVmVyaWZ5TmFtZXNXaXRoTnVsbGFibGVJbnRlcmZhY2VBcnJheShzZXJ2aWNlcywgbmFtZXMpOworICB9CisgIEBPdmVycmlkZQorICBwdWJsaWMgSU5hbWVkQ2FsbGJhY2tbXSBHZXROdWxsYWJsZUludGVyZmFjZUFycmF5KFN0cmluZ1tdIG5hbWVzKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICBpZiAobmFtZXMgPT0gbnVsbCkKKyAgICAgIHJldHVybiBudWxsOworICAgIElOYW1lZENhbGxiYWNrW10gc2VydmljZXMgPSBuZXcgSU5hbWVkQ2FsbGJhY2tbbmFtZXMubGVuZ3RoXTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICBpZiAobmFtZXNbaV0gPT0gbnVsbCkgeworICAgICAgICBzZXJ2aWNlc1tpXSA9IG51bGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBzZXJ2aWNlc1tpXSA9IEdldE90aGVyVGVzdFNlcnZpY2UobmFtZXNbaV0pOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2VydmljZXM7CisgIH0KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIFZlcmlmeU5hbWVzV2l0aE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoSU5hbWVkQ2FsbGJhY2tbXSBzZXJ2aWNlcywgU3RyaW5nW10gbmFtZXMpCisgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICBpZiAoc2VydmljZXMgIT0gbnVsbCAmJiBuYW1lcyAhPSBudWxsKSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgIGlmIChzZXJ2aWNlc1tpXSAhPSBudWxsICYmIG5hbWVzW2ldICE9IG51bGwpIHsKKyAgICAgICAgICBpZiAoIVZlcmlmeU5hbWUoc2VydmljZXNbaV0sIG5hbWVzW2ldKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChzZXJ2aWNlc1tpXSAhPSBudWxsIHx8IG5hbWVzW2ldICE9IG51bGwpIHsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAoc2VydmljZXMgIT0gbnVsbCB8fCBuYW1lcyAhPSBudWxsKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICBAT3ZlcnJpZGUKKyAgcHVibGljIExpc3Q8SU5hbWVkQ2FsbGJhY2s+IEdldEludGVyZmFjZUxpc3QoU3RyaW5nW10gbmFtZXMpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgIElOYW1lZENhbGxiYWNrW10gc2VydmljZXMgPSBHZXROdWxsYWJsZUludGVyZmFjZUFycmF5KG5hbWVzKTsKKyAgICByZXR1cm4gc2VydmljZXMgPT0gbnVsbCA/IG51bGwgOiBBcnJheXMuYXNMaXN0KHNlcnZpY2VzKTsKKyAgfQorICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlTGlzdChMaXN0PElOYW1lZENhbGxiYWNrPiBzZXJ2aWNlcywgU3RyaW5nW10gbmFtZXMpCisgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gVmVyaWZ5TmFtZXNXaXRoTnVsbGFibGVJbnRlcmZhY2VBcnJheSgKKyAgICAgICAgc2VydmljZXMgPT0gbnVsbCA/IG51bGwgOiBzZXJ2aWNlcy50b0FycmF5KG5ldyBJTmFtZWRDYWxsYmFja1swXSksIG5hbWVzKTsKKyAgfQorICBAT3ZlcnJpZGUKICAgcHVibGljIExpc3Q8U3RyaW5nPiBSZXZlcnNlU3RyaW5nTGlzdChMaXN0PFN0cmluZz4gaW5wdXQsIExpc3Q8U3RyaW5nPiByZXBlYXRlZCkKICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogICAgIEFycmF5TGlzdDxTdHJpbmc+IHJldmVyc2VkID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CkBAIC0zMzMsNyArNDIxLDE3IEBACiAgICAgcmV0dXJuIGlucHV0OwogICB9CiAgIEBPdmVycmlkZQotICBwdWJsaWMgU3RydWN0dXJlZFBhcmNlbGFibGUgUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlKFN0cnVjdHVyZWRQYXJjZWxhYmxlIGlucHV0KQorICBwdWJsaWMgSVRlc3RTZXJ2aWNlLkVtcHR5IFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZShJVGVzdFNlcnZpY2UuRW1wdHkgaW5wdXQpCisgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gaW5wdXQ7CisgIH0KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBMaXN0PElUZXN0U2VydmljZS5FbXB0eT4gUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlTGlzdChMaXN0PElUZXN0U2VydmljZS5FbXB0eT4gaW5wdXQpCisgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gaW5wdXQ7CisgIH0KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBJVGVzdFNlcnZpY2UuRW1wdHlbXSBSZXBlYXROdWxsYWJsZVBhcmNlbGFibGVBcnJheShJVGVzdFNlcnZpY2UuRW1wdHlbXSBpbnB1dCkKICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogICAgIHJldHVybiBpbnB1dDsKICAgfQpAQCAtMzQ2LDYgKzQ0NCwxNSBAQAogICAgIC8vIGRvIG5vdGhpbmcKICAgfQogICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgVGFrZXNBbklCaW5kZXJMaXN0KExpc3Q8SUJpbmRlcj4gaW5wdXQpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgIC8vIGRvIG5vdGhpbmcKKyAgfQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgVGFrZXNBTnVsbGFibGVJQmluZGVyTGlzdChMaXN0PElCaW5kZXI+IGlucHV0KSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAvLyBkbyBub3RoaW5nCisgIH0KKworICBAT3ZlcnJpZGUKICAgcHVibGljIFN0cmluZyBSZXBlYXRVdGY4Q3BwU3RyaW5nKFN0cmluZyB0b2tlbikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgcmV0dXJuIHRva2VuOwogICB9CkBAIC00MjIsNyArNTI5LDQ1IEBACiAgICAgcGFyY2VsYWJsZS51ID0gVW5pb24ubnMobmV3IGludFtdIHsxLCAyLCAzfSk7CiAgICAgcGFyY2VsYWJsZS5zaG91bGRCZUNvbnN0UzEgPSBVbmlvbi5zKFVuaW9uLlMxKTsKICAgfQotCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBSZXBlYXRFeHRlbmRhYmxlUGFyY2VsYWJsZShFeHRlbmRhYmxlUGFyY2VsYWJsZSBlcCwgRXh0ZW5kYWJsZVBhcmNlbGFibGUgZXAyKQorICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgZXAyLmEgPSBlcC5hOworICAgIGVwMi5iID0gZXAuYjsKKyAgICAvLyBubyB3YXkgdG8gY29weSBjdXJyZW50bHkgdy9vIHVucGFyY2VsaW5nCisgICAgZXAyLmV4dC5zZXRQYXJjZWxhYmxlKGVwLmV4dC5nZXRQYXJjZWxhYmxlKE15RXh0LmNsYXNzKSk7CisgICAgZXAyLmMgPSBlcC5jOworICAgIGVwMi5leHQyLnNldFBhcmNlbGFibGUobnVsbCk7CisgIH0KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBSZWN1cnNpdmVMaXN0IFJldmVyc2VMaXN0KFJlY3Vyc2l2ZUxpc3QgbGlzdCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgUmVjdXJzaXZlTGlzdCByZXZlcnNlZCA9IG51bGw7CisgICAgd2hpbGUgKGxpc3QgIT0gbnVsbCkgeworICAgICAgUmVjdXJzaXZlTGlzdCBuZXh0ID0gbGlzdC5uZXh0OworICAgICAgbGlzdC5uZXh0ID0gcmV2ZXJzZWQ7CisgICAgICByZXZlcnNlZCA9IGxpc3Q7CisgICAgICBsaXN0ID0gbmV4dDsKKyAgICB9CisgICAgcmV0dXJuIHJldmVyc2VkOworICB9CisgIEBPdmVycmlkZQorICBwdWJsaWMgSUJpbmRlcltdIFJldmVyc2VJQmluZGVyQXJyYXkoSUJpbmRlcltdIGlucHV0LCBJQmluZGVyW10gcmVwZWF0ZWQpIHsKKyAgICBJQmluZGVyW10gcmV2ZXJzZWQgPSBuZXcgSUJpbmRlcltpbnB1dC5sZW5ndGhdOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyBpKyspIHsKKyAgICAgIHJlcGVhdGVkW2ldID0gaW5wdXRbaV07CisgICAgICByZXZlcnNlZFtpXSA9IGlucHV0W2lucHV0Lmxlbmd0aCAtIGkgLSAxXTsKKyAgICB9CisgICAgcmV0dXJuIHJldmVyc2VkOworICB9CisgIEBPdmVycmlkZQorICBwdWJsaWMgSUJpbmRlcltdIFJldmVyc2VOdWxsYWJsZUlCaW5kZXJBcnJheShJQmluZGVyW10gaW5wdXQsIElCaW5kZXJbXSByZXBlYXRlZCkgeworICAgIElCaW5kZXJbXSByZXZlcnNlZCA9IG5ldyBJQmluZGVyW2lucHV0Lmxlbmd0aF07CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7IGkrKykgeworICAgICAgcmVwZWF0ZWRbaV0gPSBpbnB1dFtpXTsKKyAgICAgIHJldmVyc2VkW2ldID0gaW5wdXRbaW5wdXQubGVuZ3RoIC0gaSAtIDFdOworICAgIH0KKyAgICByZXR1cm4gcmV2ZXJzZWQ7CisgIH0KICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTXlPbGROYW1lIGV4dGVuZHMgSU9sZE5hbWUuU3R1YiB7CiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyBSZWFsTmFtZSgpIHsKQEAgLTQ0Nyw4ICs1OTIsMjEgQEAKICAgICByZXR1cm4gbmV3IE15TmV3TmFtZSgpOwogICB9CiAKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnRbXSBHZXRVbmlvblRhZ3MoVW5pb25bXSBpbnB1dCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgaW50W10gdGFncyA9IG5ldyBpbnRbaW5wdXQubGVuZ3RoXTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKSB7CisgICAgICB0YWdzW2ldID0gaW5wdXRbaV0uZ2V0VGFnKCk7CisgICAgfQorICAgIHJldHVybiB0YWdzOworICB9CisKICAgY2xhc3MgTXlDcHBKYXZhVGVzdHMgZXh0ZW5kcyBJQ3BwSmF2YVRlc3RzLlN0dWIgewogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCYWRQYXJjZWxhYmxlIFJlcGVhdEJhZFBhcmNlbGFibGUoQmFkUGFyY2VsYWJsZSBpbnB1dCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICByZXR1cm4gaW5wdXQ7CisgICAgfQorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTaW1wbGVQYXJjZWxhYmxlIFJlcGVhdFNpbXBsZVBhcmNlbGFibGUoU2ltcGxlUGFyY2VsYWJsZSBpbnB1dCwgU2ltcGxlUGFyY2VsYWJsZSByZXBlYXQpCiAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogICAgICAgcmVwZWF0LnNldChpbnB1dC5nZXROYW1lKCksIGlucHV0LmdldE51bWJlcigpKTsKQEAgLTUyMCwxOSArNjc4LDc1IEBACiAgICAgICB9CiAgICAgICByZXR1cm4gcmV2ZXJzZWQ7CiAgICAgfQorICB9CisKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBGaXhlZFNpemVBcnJheVNlcnZpY2UgZXh0ZW5kcyBJUmVwZWF0Rml4ZWRTaXplQXJyYXkuU3R1YiB7CiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgVGFrZXNBbklCaW5kZXJMaXN0KExpc3Q8SUJpbmRlcj4gaW5wdXQpIHRocm93cyBSZW1vdGVFeGNlcHRpb24ge30KKyAgICBwdWJsaWMgYnl0ZVtdIFJlcGVhdEJ5dGVzKGJ5dGVbXSBpbnB1dCwgYnl0ZVtdIHJlcGVhdGVkKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgcmVwZWF0ZWRbaV0gPSBpbnB1dFtpXTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBpbnB1dDsKKyAgICB9CiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgVGFrZXNBTnVsbGFibGVJQmluZGVyTGlzdChMaXN0PElCaW5kZXI+IGlucHV0KSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHt9CisgICAgcHVibGljIGludFtdIFJlcGVhdEludHMoaW50W10gaW5wdXQsIGludFtdIHJlcGVhdGVkKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgcmVwZWF0ZWRbaV0gPSBpbnB1dFtpXTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBpbnB1dDsKKyAgICB9CiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgUmVwZWF0RXh0ZW5kYWJsZVBhcmNlbGFibGUoRXh0ZW5kYWJsZVBhcmNlbGFibGUgZXAsIEV4dGVuZGFibGVQYXJjZWxhYmxlIGVwMikKKyAgICBwdWJsaWMgSUJpbmRlcltdIFJlcGVhdEJpbmRlcnMoSUJpbmRlcltdIGlucHV0LCBJQmluZGVyW10gcmVwZWF0ZWQpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7IGkrKykgeworICAgICAgICByZXBlYXRlZFtpXSA9IGlucHV0W2ldOworICAgICAgfQorICAgICAgcmV0dXJuIGlucHV0OworICAgIH0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSW50UGFyY2VsYWJsZVtdIFJlcGVhdFBhcmNlbGFibGVzKEludFBhcmNlbGFibGVbXSBpbnB1dCwgSW50UGFyY2VsYWJsZVtdIHJlcGVhdGVkKQogICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKLSAgICAgIGVwMi5hID0gZXAuYTsKLSAgICAgIGVwMi5iID0gZXAuYjsKLSAgICAgIC8vIG5vIHdheSB0byBjb3B5IGN1cnJlbnRseSB3L28gdW5wYXJjZWxpbmcKLSAgICAgIGVwMi5leHQuc2V0UGFyY2VsYWJsZShlcC5leHQuZ2V0UGFyY2VsYWJsZShNeUV4dC5jbGFzcykpOwotICAgICAgZXAyLmMgPSBlcC5jOwotICAgICAgZXAyLmV4dDIuc2V0UGFyY2VsYWJsZShudWxsKTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgcmVwZWF0ZWRbaV0gPSBpbnB1dFtpXTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBpbnB1dDsKKyAgICB9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJ5dGVbXVtdIFJlcGVhdDJkQnl0ZXMoYnl0ZVtdW10gaW5wdXQsIGJ5dGVbXVtdIHJlcGVhdGVkKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBpbnB1dFtpXS5sZW5ndGg7IGorKykgeworICAgICAgICAgIHJlcGVhdGVkW2ldW2pdID0gaW5wdXRbaV1bal07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBpbnB1dDsKKyAgICB9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludFtdW10gUmVwZWF0MmRJbnRzKGludFtdW10gaW5wdXQsIGludFtdW10gcmVwZWF0ZWQpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7IGkrKykgeworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGlucHV0W2ldLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgcmVwZWF0ZWRbaV1bal0gPSBpbnB1dFtpXVtqXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIGlucHV0OworICAgIH0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSUJpbmRlcltdW10gUmVwZWF0MmRCaW5kZXJzKElCaW5kZXJbXVtdIGlucHV0LCBJQmluZGVyW11bXSByZXBlYXRlZCkKKyAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgaW5wdXRbaV0ubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICByZXBlYXRlZFtpXVtqXSA9IGlucHV0W2ldW2pdOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gaW5wdXQ7CisgICAgfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJbnRQYXJjZWxhYmxlW11bXSBSZXBlYXQyZFBhcmNlbGFibGVzKAorICAgICAgICBJbnRQYXJjZWxhYmxlW11bXSBpbnB1dCwgSW50UGFyY2VsYWJsZVtdW10gcmVwZWF0ZWQpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7IGkrKykgeworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGlucHV0W2ldLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgcmVwZWF0ZWRbaV1bal0gPSBpbnB1dFtpXVtqXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIGlucHV0OwogICAgIH0KICAgfQogCmRpZmYgLS1naXQgYS90ZXN0cy9qYXZhL3NyYy9hbmRyb2lkL2FpZGwvdGVzdHMvQWlkbEphdmFUZXN0cy5qYXZhIGIvdGVzdHMvamF2YS9zcmMvYW5kcm9pZC9haWRsL3Rlc3RzL0FpZGxKYXZhVGVzdHMuamF2YQppbmRleCA0M2Q5MjYzLi5kZDkzY2EwIDEwMDY0NAotLS0gYS90ZXN0cy9qYXZhL3NyYy9hbmRyb2lkL2FpZGwvdGVzdHMvQWlkbEphdmFUZXN0cy5qYXZhCisrKyBiL3Rlc3RzL2phdmEvc3JjL2FuZHJvaWQvYWlkbC90ZXN0cy9BaWRsSmF2YVRlc3RzLmphdmEKQEAgLTEyLDcgKzEyLDcgQEAKICAgICAgICAgUmVzdWx0IHJlc3VsdCA9IGp1bml0LnJ1bihFeHRlbnNpb25UZXN0cy5jbGFzcywgR2VuZXJpY1Rlc3RzLmNsYXNzLAogICAgICAgICAgICAgSmF2YU9ubHlJbW11dGFibGVBbm5vdGF0aW9uVGVzdHMuY2xhc3MsIE1hcFRlc3RzLmNsYXNzLCBOdWxsYWJsZVRlc3RzLmNsYXNzLAogICAgICAgICAgICAgVGVzdFNlcnZpY2VDbGllbnQuY2xhc3MsIFRlc3RWZXJzaW9uZWRJbnRlcmZhY2UuY2xhc3MsIFVuaW9uVGVzdHMuY2xhc3MsCi0gICAgICAgICAgICBWaW50ZlRlc3RzLmNsYXNzKTsKKyAgICAgICAgICAgIFZpbnRmVGVzdHMuY2xhc3MsIEJ1aWx0SW5UZXN0cy5jbGFzcywgRGVsZWdhdG9yVGVzdHMuY2xhc3MpOwogCiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihyZXN1bHQud2FzU3VjY2Vzc2Z1bCgpID8gIlRFU1QgU1VDQ0VTUyIgOiAiVEVTVCBGQUlMVVJFIik7CiAgICAgfQpkaWZmIC0tZ2l0IGEvdGVzdHMvamF2YS9zcmMvYW5kcm9pZC9haWRsL3Rlc3RzL0JhZFBhcmNlbGFibGUuamF2YSBiL3Rlc3RzL2phdmEvc3JjL2FuZHJvaWQvYWlkbC90ZXN0cy9CYWRQYXJjZWxhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc3ZmJmNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2phdmEvc3JjL2FuZHJvaWQvYWlkbC90ZXN0cy9CYWRQYXJjZWxhYmxlLmphdmEKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5haWRsLnRlc3RzOworCitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOworCitwdWJsaWMgY2xhc3MgQmFkUGFyY2VsYWJsZSBpbXBsZW1lbnRzIFBhcmNlbGFibGUgeworICBwcml2YXRlIGJvb2xlYW4gbUJhZDsKKyAgcHJpdmF0ZSBTdHJpbmcgbU5hbWU7CisgIHByaXZhdGUgaW50IG1OdW1iZXI7CisKKyAgQmFkUGFyY2VsYWJsZSgpIHt9CisgIEJhZFBhcmNlbGFibGUoYm9vbGVhbiBiYWQsIFN0cmluZyBuYW1lLCBpbnQgbnVtYmVyKSB7CisgICAgdGhpcy5tQmFkID0gYmFkOworICAgIHRoaXMubU5hbWUgPSBuYW1lOworICAgIHRoaXMubU51bWJlciA9IG51bWJlcjsKKyAgfQorCisgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsgcmV0dXJuIDA7IH0KKworICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBkZXN0LCBpbnQgZmxhZ3MpIHsKKyAgICBkZXN0LndyaXRlQm9vbGVhbihtQmFkKTsKKyAgICBkZXN0LndyaXRlU3RyaW5nKG1OYW1lKTsKKyAgICBkZXN0LndyaXRlSW50KG1OdW1iZXIpOworICAgIC8vIEJBRCEgd3JpdGUgc3VwZXJmbHVvdXMgZGF0YQorICAgIGlmIChtQmFkKSB7CisgICAgICBkZXN0LndyaXRlSW50KDQyKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCByZWFkRnJvbVBhcmNlbChQYXJjZWwgc291cmNlKSB7CisgICAgbUJhZCA9IHNvdXJjZS5yZWFkQm9vbGVhbigpOworICAgIG1OYW1lID0gc291cmNlLnJlYWRTdHJpbmcoKTsKKyAgICBtTnVtYmVyID0gc291cmNlLnJlYWRJbnQoKTsKKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgIGlmIChvID09IG51bGwpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKCEobyBpbnN0YW5jZW9mIEJhZFBhcmNlbGFibGUpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIEJhZFBhcmNlbGFibGUgcCA9IChCYWRQYXJjZWxhYmxlKSBvOworICAgIGlmIChtQmFkICE9IHAubUJhZCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoKG1OYW1lID09IG51bGwgJiYgcC5tTmFtZSAhPSBudWxsKSB8fCAobU5hbWUgIT0gbnVsbCAmJiAhbU5hbWUuZXF1YWxzKHAubU5hbWUpKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gbU51bWJlciA9PSBwLm1OdW1iZXI7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIHJldHVybiAiQmFkUGFyY2VsYWJsZShiYWQ9IiArIG1CYWQgKyAiLG5hbWU9IiArIG1OYW1lICsgIixudW1iZXI9IiArIG1OdW1iZXIgKyAifSI7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhcmNlbGFibGUuQ3JlYXRvcjxCYWRQYXJjZWxhYmxlPiBDUkVBVE9SID0KKyAgICAgIG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8QmFkUGFyY2VsYWJsZT4oKSB7CisgICAgICAgIHB1YmxpYyBCYWRQYXJjZWxhYmxlIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIHNvdXJjZSkgeworICAgICAgICAgIEJhZFBhcmNlbGFibGUgcCA9IG5ldyBCYWRQYXJjZWxhYmxlKCk7CisgICAgICAgICAgcC5yZWFkRnJvbVBhcmNlbChzb3VyY2UpOworICAgICAgICAgIHJldHVybiBwOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJhZFBhcmNlbGFibGVbXSBuZXdBcnJheShpbnQgc2l6ZSkgeyByZXR1cm4gbmV3IEJhZFBhcmNlbGFibGVbc2l6ZV07IH0KKyAgICAgIH07Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9qYXZhL3NyYy9hbmRyb2lkL2FpZGwvdGVzdHMvQnVpbHRJblRlc3RzLmphdmEgYi90ZXN0cy9qYXZhL3NyYy9hbmRyb2lkL2FpZGwvdGVzdHMvQnVpbHRJblRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJhYmMzNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2phdmEvc3JjL2FuZHJvaWQvYWlkbC90ZXN0cy9CdWlsdEluVGVzdHMuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFpZGwudGVzdHM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LmNvcmUuSXMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5KVW5pdDQ7CisKK0BSdW5XaXRoKEpVbml0NC5jbGFzcykKK3B1YmxpYyBjbGFzcyBCdWlsdEluVGVzdHMgeworICBwcml2YXRlIElCaW5kZXIgbUJpbmRlcjsKKworICBAQmVmb3JlCisgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgbUJpbmRlciA9IFNlcnZpY2VNYW5hZ2VyLndhaXRGb3JTZXJ2aWNlKElUZXN0U2VydmljZS5jbGFzcy5nZXROYW1lKCkpOworICAgIGFzc2VydE5vdE51bGwobUJpbmRlcik7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0UGluZygpIHsKKyAgICBhc3NlcnRUcnVlKG1CaW5kZXIucGluZ0JpbmRlcigpKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RJbnRlcmZhY2VEZXNjcmlwdG9yKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgYXNzZXJ0VGhhdChtQmluZGVyLmdldEludGVyZmFjZURlc2NyaXB0b3IoKSwgaXMoImFuZHJvaWQuYWlkbC50ZXN0cy5JVGVzdFNlcnZpY2UiKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2phdmEvc3JjL2FuZHJvaWQvYWlkbC90ZXN0cy9EZWxlZ2F0b3JUZXN0cy5qYXZhIGIvdGVzdHMvamF2YS9zcmMvYW5kcm9pZC9haWRsL3Rlc3RzL0RlbGVnYXRvclRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAxMzU2ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2phdmEvc3JjL2FuZHJvaWQvYWlkbC90ZXN0cy9EZWxlZ2F0b3JUZXN0cy5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYWlkbC50ZXN0czsKKworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuY29yZS5Jcy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5KVW5pdDQ7CisKK0BSdW5XaXRoKEpVbml0NC5jbGFzcykKK3B1YmxpYyBjbGFzcyBEZWxlZ2F0b3JUZXN0cyB7CisgIHN0YXRpYyBieXRlIGtGYWtlQnl0ZSA9IDE2OworICBzdGF0aWMgYnl0ZSBrRXhwZWN0ZWRCeXRlID0gMTI7CisKKyAgcHJpdmF0ZSBjbGFzcyBDdXN0b20gZXh0ZW5kcyBJVGVzdFNlcnZpY2UuRGVsZWdhdG9yIHsKKyAgICBwdWJsaWMgQ3VzdG9tKElUZXN0U2VydmljZSBpbXBsKSB7IHN1cGVyKGltcGwpOyB9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJ5dGUgUmVwZWF0Qnl0ZShieXRlIHRva2VuKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgIHJldHVybiBrRmFrZUJ5dGU7CisgICAgfQorICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdERlbGVnYXRvcigpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgIElCaW5kZXIgYmluZGVyID0gU2VydmljZU1hbmFnZXIud2FpdEZvclNlcnZpY2UoSVRlc3RTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0Tm90TnVsbChiaW5kZXIpOworICAgIElUZXN0U2VydmljZSBzZXJ2aWNlID0gSVRlc3RTZXJ2aWNlLlN0dWIuYXNJbnRlcmZhY2UoYmluZGVyKTsKKyAgICBJVGVzdFNlcnZpY2UuRGVsZWdhdG9yIGRlbGVnYXRvciA9IG5ldyBJVGVzdFNlcnZpY2UuRGVsZWdhdG9yKHNlcnZpY2UpOworICAgIGFzc2VydFRoYXQoZGVsZWdhdG9yLlJlcGVhdEJ5dGUoa0V4cGVjdGVkQnl0ZSksIGlzKGtFeHBlY3RlZEJ5dGUpKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21EZWxlZ2F0b3IoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICBJQmluZGVyIGJpbmRlciA9IFNlcnZpY2VNYW5hZ2VyLndhaXRGb3JTZXJ2aWNlKElUZXN0U2VydmljZS5jbGFzcy5nZXROYW1lKCkpOworICAgIGFzc2VydE5vdE51bGwoYmluZGVyKTsKKyAgICBJVGVzdFNlcnZpY2Ugc2VydmljZSA9IElUZXN0U2VydmljZS5TdHViLmFzSW50ZXJmYWNlKGJpbmRlcik7CisgICAgSVRlc3RTZXJ2aWNlLkRlbGVnYXRvciBjdXN0b20gPSBuZXcgQ3VzdG9tKHNlcnZpY2UpOworICAgIGFzc2VydFRoYXQoY3VzdG9tLlJlcGVhdEJ5dGUoa0V4cGVjdGVkQnl0ZSksIGlzKGtGYWtlQnl0ZSkpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdEFzQmluZGVyQXNJbnRlcmZhY2UoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICBJQmluZGVyIGJpbmRlciA9IFNlcnZpY2VNYW5hZ2VyLndhaXRGb3JTZXJ2aWNlKElUZXN0U2VydmljZS5jbGFzcy5nZXROYW1lKCkpOworICAgIGFzc2VydE5vdE51bGwoYmluZGVyKTsKKyAgICBJVGVzdFNlcnZpY2Ugc2VydmljZSA9IElUZXN0U2VydmljZS5TdHViLmFzSW50ZXJmYWNlKGJpbmRlcik7CisgICAgSVRlc3RTZXJ2aWNlLkRlbGVnYXRvciBkZWxlZ2F0b3IgPSBuZXcgSVRlc3RTZXJ2aWNlLkRlbGVnYXRvcihzZXJ2aWNlKTsKKyAgICBhc3NlcnRUaGF0KElUZXN0U2VydmljZS5EZWxlZ2F0b3IuYXNJbnRlcmZhY2UoZGVsZWdhdG9yLmFzQmluZGVyKCkpLlJlcGVhdEJ5dGUoa0V4cGVjdGVkQnl0ZSksCisgICAgICAgIGlzKGtFeHBlY3RlZEJ5dGUpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvamF2YS9zcmMvYW5kcm9pZC9haWRsL3Rlc3RzL0V4dGVuc2lvblRlc3RzLmphdmEgYi90ZXN0cy9qYXZhL3NyYy9hbmRyb2lkL2FpZGwvdGVzdHMvRXh0ZW5zaW9uVGVzdHMuamF2YQppbmRleCBlOTIzYWQyLi5kNTczMTU2IDEwMDY0NAotLS0gYS90ZXN0cy9qYXZhL3NyYy9hbmRyb2lkL2FpZGwvdGVzdHMvRXh0ZW5zaW9uVGVzdHMuamF2YQorKysgYi90ZXN0cy9qYXZhL3NyYy9hbmRyb2lkL2FpZGwvdGVzdHMvRXh0ZW5zaW9uVGVzdHMuamF2YQpAQCAtNTgsMjAgKzU4LDE0IEBACiAgICAgcHJpdmF0ZSBVbnN0YWJsZVBhcmNlbGFibGUgdXA7CiAKICAgICBwcml2YXRlIElUZXN0U2VydmljZSBtU2VydmljZTsKLSAgICBwcml2YXRlIElDcHBKYXZhVGVzdHMgbUNwcEphdmFUZXN0czsKIAogICAgIEBCZWZvcmUKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgewogICAgICAgSUJpbmRlciBiaW5kZXIgPSBTZXJ2aWNlTWFuYWdlci53YWl0Rm9yU2VydmljZShJVGVzdFNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpKTsKICAgICAgIGFzc2VydE5vdE51bGwoYmluZGVyKTsKICAgICAgIG1TZXJ2aWNlID0gSVRlc3RTZXJ2aWNlLlN0dWIuYXNJbnRlcmZhY2UoYmluZGVyKTsKICAgICAgIGFzc2VydE5vdE51bGwobVNlcnZpY2UpOwogCi0gICAgICBJQmluZGVyIGJpbmRlcjIgPSBtU2VydmljZS5HZXRDcHBKYXZhVGVzdHMoKTsKLSAgICAgIGlmIChiaW5kZXIyICE9IG51bGwpIHsKLSAgICAgICAgbUNwcEphdmFUZXN0cyA9IElDcHBKYXZhVGVzdHMuU3R1Yi5hc0ludGVyZmFjZShiaW5kZXIyKTsKLSAgICAgIH0KLQogICAgICAgdmVwID0gbmV3IFZpbnRmRXh0ZW5kYWJsZVBhcmNlbGFibGUoKTsKICAgICAgIHZwID0gbmV3IFZpbnRmUGFyY2VsYWJsZSgpOwogCkBAIC04NCw4ICs3OCw2IEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBlYXRFeHRlbmRhYmxlUGFyY2VsYWJsZSgpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewotICAgICAgYXNzdW1lVHJ1ZShtQ3BwSmF2YVRlc3RzICE9IG51bGwpOwotCiAgICAgICBNeUV4dCBleHQgPSBuZXcgTXlFeHQoKTsKICAgICAgIGV4dC5hID0gNDI7CiAgICAgICBleHQuYiA9ICJFWFQiOwpAQCAtOTgsNyArOTAsNyBAQAogICAgICAgZXAuZXh0LnNldFBhcmNlbGFibGUoZXh0KTsKIAogICAgICAgRXh0ZW5kYWJsZVBhcmNlbGFibGUgZXAyID0gbmV3IEV4dGVuZGFibGVQYXJjZWxhYmxlKCk7Ci0gICAgICBtQ3BwSmF2YVRlc3RzLlJlcGVhdEV4dGVuZGFibGVQYXJjZWxhYmxlKGVwLCBlcDIpOworICAgICAgbVNlcnZpY2UuUmVwZWF0RXh0ZW5kYWJsZVBhcmNlbGFibGUoZXAsIGVwMik7CiAgICAgICBhc3NlcnRUaGF0KGVwMi5hLCBpcyhlcC5hKSk7CiAgICAgICBhc3NlcnRUaGF0KGVwMi5iLCBpcyhlcC5iKSk7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL2phdmEvc3JjL2FuZHJvaWQvYWlkbC90ZXN0cy9OZXN0ZWRUeXBlc1Rlc3RzLmphdmEgYi90ZXN0cy9qYXZhL3NyYy9hbmRyb2lkL2FpZGwvdGVzdHMvTmVzdGVkVHlwZXNUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ODUxZDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9qYXZhL3NyYy9hbmRyb2lkL2FpZGwvdGVzdHMvTmVzdGVkVHlwZXNUZXN0cy5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYWlkbC50ZXN0czsKKworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuY29yZS5Jcy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3N1bWUuYXNzdW1lVHJ1ZTsKKworaW1wb3J0IGFuZHJvaWQuYWlkbC50ZXN0cy5uZXN0ZWQuSU5lc3RlZFNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5haWRsLnRlc3RzLm5lc3RlZC5QYXJjZWxhYmxlV2l0aE5lc3RlZDsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuSlVuaXQ0OworCitAUnVuV2l0aChKVW5pdDQuY2xhc3MpCitwdWJsaWMgY2xhc3MgTmVzdGVkVHlwZXNUZXN0cyB7CisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RVc2VOZXN0ZWRUeXBlcygpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgIElCaW5kZXIgYmluZGVyID0gU2VydmljZU1hbmFnZXIud2FpdEZvclNlcnZpY2UoSU5lc3RlZFNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnROb3ROdWxsKGJpbmRlcik7CisgICAgSU5lc3RlZFNlcnZpY2UgbmVzdGVkU2VydmljZSA9IElOZXN0ZWRTZXJ2aWNlLlN0dWIuYXNJbnRlcmZhY2UoYmluZGVyKTsKKyAgICBhc3NlcnROb3ROdWxsKG5lc3RlZFNlcnZpY2UpOworCisgICAgLy8gT0sgLT4gTk9UX09LCisgICAgUGFyY2VsYWJsZVdpdGhOZXN0ZWQgcCA9IG5ldyBQYXJjZWxhYmxlV2l0aE5lc3RlZCgpOworICAgIHAuc3RhdHVzID0gUGFyY2VsYWJsZVdpdGhOZXN0ZWQuU3RhdHVzLk9LOworICAgIElOZXN0ZWRTZXJ2aWNlLlJlc3VsdCByZXN1bHQgPSBuZXN0ZWRTZXJ2aWNlLmZsaXBTdGF0dXMocCk7CisgICAgYXNzZXJ0VGhhdChyZXN1bHQsIGlzKFBhcmNlbGFibGVXaXRoTmVzdGVkLlN0YXR1cy5OT1RfT0spKTsKKworICAgIC8vIE5PVF9PSyAtPiBPSyB3aXRoIG5lc3RlZCBjYWxsYmFjayBpbnRlcmZhY2UKKyAgICBjbGFzcyBDYWxsYmFjayBleHRlbmRzIElOZXN0ZWRTZXJ2aWNlLklDYWxsYmFjay5TdHViIHsKKyAgICAgIGJ5dGUgcmVjZWl2ZWQgPSBQYXJjZWxhYmxlV2l0aE5lc3RlZC5TdGF0dXMuTk9UX09LOworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBkb25lKGJ5dGUgc3QpIHsKKyAgICAgICAgcmVjZWl2ZWQgPSBzdDsKKyAgICAgIH0KKyAgICB9CisgICAgQ2FsbGJhY2sgY2IgPSBuZXcgQ2FsbGJhY2soKTsKKyAgICBuZXN0ZWRTZXJ2aWNlLmZsaXBTdGF0dXNXaXRoQ2FsbGJhY2socC5zdGF0dXMsIGNiKTsKKyAgICBhc3NlcnRUaGF0KGNiLnJlY2VpdmVkLCBpcyhQYXJjZWxhYmxlV2l0aE5lc3RlZC5TdGF0dXMuT0spKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvamF2YS9zcmMvYW5kcm9pZC9haWRsL3Rlc3RzL051bGxhYmxlVGVzdHMuamF2YSBiL3Rlc3RzL2phdmEvc3JjL2FuZHJvaWQvYWlkbC90ZXN0cy9OdWxsYWJsZVRlc3RzLmphdmEKaW5kZXggMzkyZDc4NC4uMmNhYjNhMiAxMDA2NDQKLS0tIGEvdGVzdHMvamF2YS9zcmMvYW5kcm9pZC9haWRsL3Rlc3RzL051bGxhYmxlVGVzdHMuamF2YQorKysgYi90ZXN0cy9qYXZhL3NyYy9hbmRyb2lkL2FpZGwvdGVzdHMvTnVsbGFibGVUZXN0cy5qYXZhCkBAIC0xNiwyNCArMTYsMjUgQEAKIAogcGFja2FnZSBhbmRyb2lkLmFpZGwudGVzdHM7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LmNvcmUuSXMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5jb3JlLklzTnVsbC5ub3ROdWxsVmFsdWU7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5jb3JlLklzTnVsbC5udWxsVmFsdWU7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3N1bWUuYXNzdW1lVHJ1ZTsKLWltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LmNvcmUuSXMuaXM7Ci1pbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5jb3JlLklzTnVsbC5udWxsVmFsdWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5jb3JlLklzTnVsbC5ub3ROdWxsVmFsdWU7CiAKK2ltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLkpVbml0NDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuSlVuaXQ0OwogCiBAUnVuV2l0aChKVW5pdDQuY2xhc3MpCiBwdWJsaWMgY2xhc3MgTnVsbGFibGVUZXN0cyB7CkBAIC02Niw2ICs2NywyMCBAQAogICAgIH0KIAogICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUFycmF5KCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICBJVGVzdFNlcnZpY2UuRW1wdHlbXSBpbnB1dCA9IHtuZXcgSVRlc3RTZXJ2aWNlLkVtcHR5KCksIG51bGx9OworICAgICAgYXNzZXJ0VGhhdChtU2VydmljZS5SZXBlYXROdWxsYWJsZVBhcmNlbGFibGVBcnJheShpbnB1dCksIGlzKGlucHV0KSk7CisgICAgICBhc3NlcnRUaGF0KG1TZXJ2aWNlLlJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUFycmF5KG51bGwpLCBpcyhudWxsVmFsdWUoKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUxpc3QoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgIExpc3Q8SVRlc3RTZXJ2aWNlLkVtcHR5PiBpbnB1dCA9IEFycmF5cy5hc0xpc3QobmV3IElUZXN0U2VydmljZS5FbXB0eSgpLCBudWxsKTsKKyAgICAgIGFzc2VydFRoYXQobVNlcnZpY2UuUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlTGlzdChpbnB1dCksIGlzKGlucHV0KSk7CisgICAgICBhc3NlcnRUaGF0KG1TZXJ2aWNlLlJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUxpc3QobnVsbCksIGlzKG51bGxWYWx1ZSgpKSk7CisgICAgfQorCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RXhwZWN0TnBlV2l0aE51bGxCaW5kZXIoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG1TZXJ2aWNlLlRha2VzQW5JQmluZGVyKG51bGwpOwpAQCAtODAsMTIgKzk1LDEwIEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RFeHBlY3ROcGVXaXRoTnVsbEJpbmRlckxpc3QoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzdW1lVHJ1ZShtQ3BwSmF2YVRlc3RzICE9IG51bGwpOwotCiAgICAgICAgIExpc3Q8SUJpbmRlcj4gbGlzdFdpdGhOdWxscyA9IG5ldyBBcnJheUxpc3Q8SUJpbmRlcj4oKTsKICAgICAgICAgbGlzdFdpdGhOdWxscy5hZGQobnVsbCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtQ3BwSmF2YVRlc3RzLlRha2VzQW5JQmluZGVyTGlzdChsaXN0V2l0aE51bGxzKTsKKyAgICAgICAgICBtU2VydmljZS5UYWtlc0FuSUJpbmRlckxpc3QobGlzdFdpdGhOdWxscyk7CiAgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KQEAgLTk1LDYgKzEwOCwzNCBAQAogICAgIH0KIAogICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJldmVyc2VJQmluZGVyQXJyYXkoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgIElCaW5kZXJbXSBpbnB1dCA9IHtuZXcgQmluZGVyKCksIG5ldyBCaW5kZXIoKX07CisgICAgICBJQmluZGVyW10gcmVwZWF0ZWQgPSBuZXcgSUJpbmRlcltpbnB1dC5sZW5ndGhdOworICAgICAgSUJpbmRlcltdIHJldmVyc2VkID0gbVNlcnZpY2UuUmV2ZXJzZUlCaW5kZXJBcnJheShpbnB1dCwgcmVwZWF0ZWQpOworCisgICAgICBhc3NlcnRUaGF0KHJlcGVhdGVkLCBpcyhpbnB1dCkpOworICAgICAgYXNzZXJ0VGhhdChyZXZlcnNlZC5sZW5ndGgsIGlzKGlucHV0Lmxlbmd0aCkpOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7ICsraSkgeworICAgICAgICBpbnQgaiA9IHJldmVyc2VkLmxlbmd0aCAtICgxICsgaSk7CisgICAgICAgIGFzc2VydFRoYXQocmV2ZXJzZWRbal0sIGlzKGlucHV0W2ldKSk7CisgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmV2ZXJzZU51bGxhYmxlSUJpbmRlckFycmF5KCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICBJQmluZGVyW10gaW5wdXQgPSB7bmV3IEJpbmRlcigpLCBudWxsfTsKKyAgICAgIElCaW5kZXJbXSByZXBlYXRlZCA9IG5ldyBJQmluZGVyW2lucHV0Lmxlbmd0aF07CisgICAgICBJQmluZGVyW10gcmV2ZXJzZWQgPSBtU2VydmljZS5SZXZlcnNlTnVsbGFibGVJQmluZGVyQXJyYXkoaW5wdXQsIHJlcGVhdGVkKTsKKworICAgICAgYXNzZXJ0VGhhdChyZXBlYXRlZCwgaXMoaW5wdXQpKTsKKyAgICAgIGFzc2VydFRoYXQocmV2ZXJzZWQubGVuZ3RoLCBpcyhpbnB1dC5sZW5ndGgpKTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgaW50IGogPSByZXZlcnNlZC5sZW5ndGggLSAoMSArIGkpOworICAgICAgICBhc3NlcnRUaGF0KHJldmVyc2VkW2pdLCBpcyhpbnB1dFtpXSkpOworICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE51bGxhYmxlSUludGVyZmFjZSgpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogICAgICAgICBJTmFtZWRDYWxsYmFjayBjYWxsYmFjayAgPSBtU2VydmljZS5HZXRDYWxsYmFjayhmYWxzZSk7CiAgICAgICAgIGFzc2VydFRoYXQoY2FsbGJhY2ssIGlzKG5vdE51bGxWYWx1ZSgpKSk7CmRpZmYgLS1naXQgYS90ZXN0cy9qYXZhL3NyYy9hbmRyb2lkL2FpZGwvdGVzdHMvVGVzdFNlcnZpY2VDbGllbnQuamF2YSBiL3Rlc3RzL2phdmEvc3JjL2FuZHJvaWQvYWlkbC90ZXN0cy9UZXN0U2VydmljZUNsaWVudC5qYXZhCmluZGV4IGUxZThlOGIuLjA5OGFkMjAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2phdmEvc3JjL2FuZHJvaWQvYWlkbC90ZXN0cy9UZXN0U2VydmljZUNsaWVudC5qYXZhCisrKyBiL3Rlc3RzL2phdmEvc3JjL2FuZHJvaWQvYWlkbC90ZXN0cy9UZXN0U2VydmljZUNsaWVudC5qYXZhCkBAIC0xOCwxNiArMTgsMjMgQEAKIAogaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuY29yZS5Jcy5pczsKIGltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LmNvcmUuSXNOdWxsLm5vdE51bGxWYWx1ZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRBcnJheUVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaHJvd3M7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc3VtZS5hc3N1bWVUcnVlOwogCitpbXBvcnQgYW5kcm9pZC5haWRsLmZpeGVkc2l6ZWFycmF5LkZpeGVkU2l6ZUFycmF5RXhhbXBsZS5JUmVwZWF0Rml4ZWRTaXplQXJyYXk7CitpbXBvcnQgYW5kcm9pZC5haWRsLmZpeGVkc2l6ZWFycmF5LkZpeGVkU2l6ZUFycmF5RXhhbXBsZS5JbnRQYXJjZWxhYmxlOworaW1wb3J0IGFuZHJvaWQuYWlkbC50ZXN0cy5CYWRQYXJjZWxhYmxlOwogaW1wb3J0IGFuZHJvaWQuYWlkbC50ZXN0cy5CeXRlRW51bTsKIGltcG9ydCBhbmRyb2lkLmFpZGwudGVzdHMuR2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxlOwogaW1wb3J0IGFuZHJvaWQuYWlkbC50ZXN0cy5JTmFtZWRDYWxsYmFjazsKIGltcG9ydCBhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQuYWlkbC50ZXN0cy5JVGVzdFNlcnZpY2UuQ29tcGlsZXJDaGVja3M7CiBpbXBvcnQgYW5kcm9pZC5haWRsLnRlc3RzLkludEVudW07CiBpbXBvcnQgYW5kcm9pZC5haWRsLnRlc3RzLkxvbmdFbnVtOwogaW1wb3J0IGFuZHJvaWQuYWlkbC50ZXN0cy5TaW1wbGVQYXJjZWxhYmxlOwpAQCAtMzcsOSArNDQsMTEgQEAKIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQub3MuQmFkUGFyY2VsYWJsZUV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5QZXJzaXN0YWJsZUJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOwpAQCAtNTAsNiArNTksNyBAQAogaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CkBAIC0yODMsNiArMjkzLDM4IEBACiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmluZGVyQXJyYXlFeGNoYW5nZSgpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgU3RyaW5nW10gbmFtZXMgPSB7IkZpenoiLCAiQnV6eiJ9OworICAgICAgSU5hbWVkQ2FsbGJhY2tbXSBnb3QgPSBzZXJ2aWNlLkdldEludGVyZmFjZUFycmF5KG5hbWVzKTsKKyAgICAgIGFzc2VydFRoYXQoZ290WzBdLkdldE5hbWUoKSwgaXMobmFtZXNbMF0pKTsKKyAgICAgIGFzc2VydFRoYXQoZ290WzFdLkdldE5hbWUoKSwgaXMobmFtZXNbMV0pKTsKKworICAgICAgYXNzZXJ0VGhhdChzZXJ2aWNlLlZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUFycmF5KGdvdCwgbmFtZXMpLCBpcyh0cnVlKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TnVsbGFibGVCaW5kZXJBcnJheUV4Y2hhbmdlKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICBTdHJpbmdbXSBuYW1lcyA9IHsiRml6eiIsIG51bGwsICJCdXp6In07CisgICAgICBJTmFtZWRDYWxsYmFja1tdIGdvdCA9IHNlcnZpY2UuR2V0TnVsbGFibGVJbnRlcmZhY2VBcnJheShuYW1lcyk7CisgICAgICBhc3NlcnRUaGF0KGdvdFswXS5HZXROYW1lKCksIGlzKG5hbWVzWzBdKSk7CisgICAgICBhc3NlcnROdWxsKGdvdFsxXSk7CisgICAgICBhc3NlcnRUaGF0KGdvdFsyXS5HZXROYW1lKCksIGlzKG5hbWVzWzJdKSk7CisKKyAgICAgIGFzc2VydFRoYXQoc2VydmljZS5WZXJpZnlOYW1lc1dpdGhOdWxsYWJsZUludGVyZmFjZUFycmF5KGdvdCwgbmFtZXMpLCBpcyh0cnVlKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW50ZXJmYWNlTGlzdEV4Y2hhbmdlKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICBTdHJpbmdbXSBuYW1lcyA9IHsiRml6eiIsIG51bGwsICJCdXp6In07CisgICAgICBMaXN0PElOYW1lZENhbGxiYWNrPiBnb3QgPSBzZXJ2aWNlLkdldEludGVyZmFjZUxpc3QobmFtZXMpOworICAgICAgYXNzZXJ0VGhhdChnb3QuZ2V0KDApLkdldE5hbWUoKSwgaXMobmFtZXNbMF0pKTsKKyAgICAgIGFzc2VydE51bGwoZ290LmdldCgxKSk7CisgICAgICBhc3NlcnRUaGF0KGdvdC5nZXQoMikuR2V0TmFtZSgpLCBpcyhuYW1lc1syXSkpOworCisgICAgICBhc3NlcnRUaGF0KHNlcnZpY2UuVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlTGlzdChnb3QsIG5hbWVzKSwgaXModHJ1ZSkpOworICAgIH0KKworICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdExpc3RSZXZlcnNhbCgpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogICAgICAgICBMaXN0PFN0cmluZz4gaW5wdXQgPSBBcnJheXMuYXNMaXN0KCJXYWxrIiwgImludG8iLCAiQ8OzcmRvYmEiKTsKICAgICAgICAgTGlzdDxTdHJpbmc+IGVjaG9lZCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwpAQCAtMzE0LDYgKzM1NiwxOSBAQAogICAgIH0KIAogICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJhZFBhcmNlbGFibGUoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgIGFzc3VtZVRydWUoY3BwX2phdmFfdGVzdHMgIT0gbnVsbCk7CisgICAgICBCYWRQYXJjZWxhYmxlIGJhZCA9IG5ldyBCYWRQYXJjZWxhYmxlKC8qYmFkPSovdHJ1ZSwgImZvbyIsIDQyKTsKKyAgICAgIFRocm93YWJsZSBlcnJvciA9CisgICAgICAgICAgYXNzZXJ0VGhyb3dzKEJhZFBhcmNlbGFibGVFeGNlcHRpb24uY2xhc3MsICgpIC0+IGNwcF9qYXZhX3Rlc3RzLlJlcGVhdEJhZFBhcmNlbGFibGUoYmFkKSk7CisgICAgICBhc3NlcnRUcnVlKGVycm9yLmdldE1lc3NhZ2UoKS5jb250YWlucygiUGFyY2VsIGRhdGEgbm90IGZ1bGx5IGNvbnN1bWVkIikpOworCisgICAgICBCYWRQYXJjZWxhYmxlIG5vdEJhZCA9IG5ldyBCYWRQYXJjZWxhYmxlKC8qYmFkPSovZmFsc2UsICJmb28iLCA0Mik7CisgICAgICBCYWRQYXJjZWxhYmxlIG91dHB1dCA9IGNwcF9qYXZhX3Rlc3RzLlJlcGVhdEJhZFBhcmNlbGFibGUobm90QmFkKTsKKyAgICAgIGFzc2VydFRoYXQobm90QmFkLCBpcyhvdXRwdXQpKTsKKyAgICB9CisKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBlYXRQYXJjZWxhYmxlKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgIGFzc3VtZVRydWUoY3BwX2phdmFfdGVzdHMgIT0gbnVsbCk7CiAKQEAgLTQzNyw2ICs0OTIsMjEgQEAKICAgICAgICAgYXNzZXJ0VGhhdChyZXZlcnNlZFsyXS5nZXREb3VibGUodGVzdERvdWJsZUtleSksIGlzKGlucHV0WzBdLmdldERvdWJsZSh0ZXN0RG91YmxlS2V5KSkpOwogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCB3cml0ZVRvRmQoRmlsZURlc2NyaXB0b3IgZmQsIGJ5dGVbXSB0ZXN0RGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZmRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmZCk7CisgICAgICBmZFN0cmVhbS53cml0ZSh0ZXN0RGF0YSk7CisgICAgICBmZFN0cmVhbS5jbG9zZSgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlGaWxlQ29udGVudHMoU3RyaW5nIGZpbGUsIGJ5dGVbXSB0ZXN0RGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOworICAgICAgYnl0ZVtdIHJlYWREYXRhID0gbmV3IGJ5dGVbdGVzdERhdGEubGVuZ3RoXTsKKworICAgICAgYXNzZXJ0VGhhdChmaXMucmVhZChyZWFkRGF0YSksIGlzKHJlYWREYXRhLmxlbmd0aCkpOworICAgICAgYXNzZXJ0VGhhdChyZWFkRGF0YSwgaXModGVzdERhdGEpKTsKKyAgICAgIGFzc2VydFRoYXQoZmlzLnJlYWQoKSwgaXMoLTEpKTsKKyAgICB9CisKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RGaWxlRGVzY3JpcHRvclBhc3NpbmcoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGFzc3VtZVRydWUoY3BwX2phdmFfdGVzdHMgIT0gbnVsbCk7CkBAIC00NDgsMTggKzUxOCw0MyBAQAogICAgICAgICBGaWxlRGVzY3JpcHRvciBqb3VybmV5ZWQgPSBjcHBfamF2YV90ZXN0cy5SZXBlYXRGaWxlRGVzY3JpcHRvcihkZXNjcmlwdG9yKTsKICAgICAgICAgZm9zLmNsb3NlKCk7CiAKLSAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBqb3VybmV5ZWRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShqb3VybmV5ZWQpOwotCiAgICAgICAgIFN0cmluZyB0ZXN0RGF0YSA9ICJGcmF6emxlU25henpsZUZsaW1GbGFtRmxpYmJpdHlHdW1ib0Nob3BzIjsKLSAgICAgICAgYnl0ZVtdIG91dHB1dCA9IHRlc3REYXRhLmdldEJ5dGVzKCk7Ci0gICAgICAgIGpvdXJuZXllZFN0cmVhbS53cml0ZShvdXRwdXQpOwotICAgICAgICBqb3VybmV5ZWRTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgd3JpdGVUb0ZkKGpvdXJuZXllZCwgdGVzdERhdGEuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIHZlcmlmeUZpbGVDb250ZW50cyhmaWxlLCB0ZXN0RGF0YS5nZXRCeXRlcygpKTsKKyAgICB9CiAKLSAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7Ci0gICAgICAgIGJ5dGVbXSBpbnB1dCA9IG5ldyBieXRlW291dHB1dC5sZW5ndGhdOworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZpbGVEZXNjcmlwdG9yQXJyYXlQYXNzaW5nKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgYXNzdW1lVHJ1ZShjcHBfamF2YV90ZXN0cyAhPSBudWxsKTsKIAotICAgICAgICBhc3NlcnRUaGF0KGZpcy5yZWFkKGlucHV0KSwgaXMoaW5wdXQubGVuZ3RoKSk7Ci0gICAgICAgIGFzc2VydFRoYXQoaW5wdXQsIGlzKG91dHB1dCkpOworICAgICAgZmluYWwgaW50IGtUZXN0U2l6ZSA9IDI7CisKKyAgICAgIFN0cmluZyBmaWxlQmFzZSA9ICIvZGF0YS9sb2NhbC90bXAvYWlkbC10ZXN0LWZpbGVfIjsKKyAgICAgIFN0cmluZ1tdIGZpbGVzID0gbmV3IFN0cmluZ1trVGVzdFNpemVdOyAvLyBhbnkgc2l6ZSB0byB0ZXN0CisgICAgICBGaWxlT3V0cHV0U3RyZWFtW10gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW1ba1Rlc3RTaXplXTsKKyAgICAgIEZpbGVEZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMgPSBuZXcgRmlsZURlc2NyaXB0b3Jba1Rlc3RTaXplXTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga1Rlc3RTaXplOyBpKyspIHsKKyAgICAgICAgZmlsZXNbaV0gPSBmaWxlQmFzZSArIGk7CisgICAgICAgIGZvc1tpXSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGVzW2ldLCBmYWxzZSAvKmFwcGVuZCovKTsKKyAgICAgICAgZGVzY3JpcHRvcnNbaV0gPSBmb3NbaV0uZ2V0RkQoKTsKKyAgICAgIH0KKworICAgICAgRmlsZURlc2NyaXB0b3JbXSByZXBlYXRlZCA9IG5ldyBGaWxlRGVzY3JpcHRvcltrVGVzdFNpemVdOworICAgICAgRmlsZURlc2NyaXB0b3JbXSByZXZlcnNlZCA9IGNwcF9qYXZhX3Rlc3RzLlJldmVyc2VGaWxlRGVzY3JpcHRvckFycmF5KGRlc2NyaXB0b3JzLCByZXBlYXRlZCk7CisKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga1Rlc3RTaXplOyBpKyspIHsKKyAgICAgICAgZm9zW2ldLmNsb3NlKCk7CisgICAgICB9CisKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga1Rlc3RTaXplOyBpKyspIHsKKyAgICAgICAgU3RyaW5nIHRlc3REYXRhID0gIlNvbWV0aGluZyAiICsgaTsKKworICAgICAgICB3cml0ZVRvRmQocmV2ZXJzZWRba1Rlc3RTaXplIC0gMSAtIGldLCB0ZXN0RGF0YS5nZXRCeXRlcygpKTsKKyAgICAgICAgdmVyaWZ5RmlsZUNvbnRlbnRzKGZpbGVzW2ldLCB0ZXN0RGF0YS5nZXRCeXRlcygpKTsKKworICAgICAgICB3cml0ZVRvRmQocmVwZWF0ZWRbaV0sIHRlc3REYXRhLmdldEJ5dGVzKCkpOworICAgICAgICB2ZXJpZnlGaWxlQ29udGVudHMoZmlsZXNbaV0sICh0ZXN0RGF0YSArIHRlc3REYXRhKS5nZXRCeXRlcygpKTsKKyAgICAgIH0KICAgICB9CiAKICAgICBAVGVzdApAQCAtNTEyLDcgKzYwNyw3IEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RSZXZlcnNlVXRmOFN0cmluZ0FycmF5KCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZ1tdIGlucHV0ID0gKFN0cmluZ1tdKXV0ZjhfcXVlcmllcy50b0FycmF5KCk7CisgICAgICAgIFN0cmluZ1tdIGlucHV0ID0gdXRmOF9xdWVyaWVzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7CiAgICAgICAgIFN0cmluZyBlY2hvZWRbXSA9IG5ldyBTdHJpbmdbaW5wdXQubGVuZ3RoXTsKIAogICAgICAgICBTdHJpbmdbXSByZXZlcnNlZCA9IHNlcnZpY2UuUmV2ZXJzZVV0ZjhDcHBTdHJpbmcoaW5wdXQsIGVjaG9lZCk7CkBAIC01MzUsNyArNjMwLDcgQEAKICAgICAgICAgICAgICAgICBudWxsLAogICAgICAgICAgICAgICAgIC8vIEphdmEgZG9lc24ndCBoYW5kbGUgdW5pY29kZSBjb2RlIHBvaW50cyBhYm92ZSBVK0ZGRkYgd2VsbC4KICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nKENoYXJhY3Rlci50b0NoYXJzKDB4MUY3MDEpKSArICJcdTAzQTkiKTsKLSAgICAgICAgU3RyaW5nW10gaW5wdXQgPSAoU3RyaW5nW10pdXRmOF9xdWVyaWVzX2FuZF9udWxscy50b0FycmF5KCk7CisgICAgICAgIFN0cmluZ1tdIGlucHV0ID0gdXRmOF9xdWVyaWVzX2FuZF9udWxscy50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwogICAgICAgICBTdHJpbmcgZWNob2VkW10gPSBuZXcgU3RyaW5nW2lucHV0Lmxlbmd0aF07CiAKICAgICAgICAgU3RyaW5nW10gcmV2ZXJzZWQgPSBzZXJ2aWNlLlJldmVyc2VOdWxsYWJsZVV0ZjhDcHBTdHJpbmcoaW5wdXQsIGVjaG9lZCk7CkBAIC01NjYsNyArNjYxLDcgQEAKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJ1Y3R1cmVjUGFyY2VsYWJsZUVxdWFsaXR5KCkgeworICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJ1Y3R1cmVkUGFyY2VsYWJsZUVxdWFsaXR5KCkgewogICAgICAgICBTdHJ1Y3R1cmVkUGFyY2VsYWJsZSBwID0gbmV3IFN0cnVjdHVyZWRQYXJjZWxhYmxlKCk7CiAgICAgICAgIHAuc2hvdWxkQ29udGFpblRocmVlRnMgPSBuZXcgaW50W10gezEsIDIsIDN9OwogICAgICAgICBwLnNob3VsZEJlSmVycnkgPSAiSmVycnkiOwpAQCAtNTg4LDcgKzY4Myw3IEBACiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RydWN1dHVyZWRQYXJjZWxhYmxlKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdFN0cnVjdHVyZWRQYXJjZWxhYmxlKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIGludCBrRGVzaXJlZEZWYWx1ZSA9IDE3OwogCiAgICAgICAgIFN0cnVjdHVyZWRQYXJjZWxhYmxlIHAgPSBuZXcgU3RydWN0dXJlZFBhcmNlbGFibGUoKTsKQEAgLTU5OCw2ICs2OTMsNyBAQAogICAgICAgICBwLnNob3VsZENvbnRhaW5Ud29CeXRlRm9vcyA9IG5ldyBieXRlWzJdOwogICAgICAgICBwLnNob3VsZENvbnRhaW5Ud29JbnRGb29zID0gbmV3IGludFsyXTsKICAgICAgICAgcC5zaG91bGRDb250YWluVHdvTG9uZ0Zvb3MgPSBuZXcgbG9uZ1syXTsKKyAgICAgICAgcC5lbXB0eSA9IG5ldyBTdHJ1Y3R1cmVkUGFyY2VsYWJsZS5FbXB0eSgpOwogCiAgICAgICAgIC8vIENoZWNrIHRoZSBkZWZhdWx0IHZhbHVlcwogICAgICAgICBhc3NlcnRUaGF0KHAuc3RyaW5nRGVmYXVsdHNUb0ZvbywgaXMoImZvbyIpKTsKQEAgLTYyOCw2ICs3MjQsOSBAQAogICAgICAgICBhc3NlcnRUaGF0KHAuaW50MzJfbWF4LCBpcyhJbnRlZ2VyLk1BWF9WQUxVRSkpOwogICAgICAgICBhc3NlcnRUaGF0KHAuaW50NjRfbWF4LCBpcyhMb25nLk1BWF9WQUxVRSkpOwogICAgICAgICBhc3NlcnRUaGF0KHAuaGV4SW50MzJfbmVnXzEsIGlzKC0xKSk7CisgICAgICAgIGZvciAoaW50IG5keCA9IDA7IG5keCA8IHAuaW50OF8xLmxlbmd0aDsgbmR4KyspIHsKKyAgICAgICAgICBhc3NlcnRUaGF0KHAuaW50OF8xW25keF0sIGlzKChieXRlKSAxKSk7CisgICAgICAgIH0KICAgICAgICAgZm9yIChpbnQgbmR4ID0gMDsgbmR4IDwgcC5pbnQzMl8xLmxlbmd0aDsgbmR4KyspIHsKICAgICAgICAgICAgIGFzc2VydFRoYXQocC5pbnQzMl8xW25keF0sIGlzKDEpKTsKICAgICAgICAgfQpAQCAtNjU4LDEwICs3NTcsMTAgQEAKICAgICAgICAgICAgICsgImY6IDE3LCAiCiAgICAgICAgICAgICArICJzaG91bGRCZUplcnJ5OiBKZXJyeSwgIgogICAgICAgICAgICAgKyAic2hvdWxkQmVCeXRlQmFyOiAyLCAiCi0gICAgICAgICAgICArICJzaG91bGRCZUludEJhcjogMjAwMCwgIgorICAgICAgICAgICAgKyAic2hvdWxkQmVJbnRCYXI6IEJBUiwgIgogICAgICAgICAgICAgKyAic2hvdWxkQmVMb25nQmFyOiAyMDAwMDAwMDAwMDAsICIKICAgICAgICAgICAgICsgInNob3VsZENvbnRhaW5Ud29CeXRlRm9vczogWzEsIDFdLCAiCi0gICAgICAgICAgICArICJzaG91bGRDb250YWluVHdvSW50Rm9vczogWzEwMDAsIDEwMDBdLCAiCisgICAgICAgICAgICArICJzaG91bGRDb250YWluVHdvSW50Rm9vczogW0ZPTywgRk9PXSwgIgogICAgICAgICAgICAgKyAic2hvdWxkQ29udGFpblR3b0xvbmdGb29zOiBbMTAwMDAwMDAwMDAwLCAxMDAwMDAwMDAwMDBdLCAiCiAgICAgICAgICAgICArICJzdHJpbmdEZWZhdWx0c1RvRm9vOiBmb28sICIKICAgICAgICAgICAgICsgImJ5dGVEZWZhdWx0c1RvRm91cjogNCwgIgpAQCAtNjg3LDYgKzc4Niw4IEBACiAgICAgICAgICAgICArICJpbnQ2NF9tYXg6IDkyMjMzNzIwMzY4NTQ3NzU4MDcsICIKICAgICAgICAgICAgICsgImhleEludDMyX25lZ18xOiAtMSwgIgogICAgICAgICAgICAgKyAiaWJpbmRlcjogbnVsbCwgIgorICAgICAgICAgICAgKyAiZW1wdHk6IGFuZHJvaWQuYWlkbC50ZXN0cy5TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5FbXB0eXt9LCAiCisgICAgICAgICAgICArICJpbnQ4XzE6IFsxLCAxLCAxLCAxLCAxXSwgIgogICAgICAgICAgICAgKyAiaW50MzJfMTogWzEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsICIKICAgICAgICAgICAgICsgIjEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsICIKICAgICAgICAgICAgICsgIjEsIDEsIDEsIDFdLCAiCkBAIC03MDgsNyArODA5LDcgQEAKICAgICAgICAgICAgICsgInNob3VsZFNldEJpdDBBbmRCaXQyOiA1LCAiCiAgICAgICAgICAgICArICJ1OiBhbmRyb2lkLmFpZGwudGVzdHMuVW5pb24ubnMoWzEsIDIsIDNdKSwgIgogICAgICAgICAgICAgKyAic2hvdWxkQmVDb25zdFMxOiBhbmRyb2lkLmFpZGwudGVzdHMuVW5pb24ucyhhIHN0cmluZyBjb25zdGFudCBpbiB1bmlvbiksICIKLSAgICAgICAgICAgICsgImRlZmF1bHRXaXRoRm9vOiAxMDAwIgorICAgICAgICAgICAgKyAiZGVmYXVsdFdpdGhGb286IEZPTyIKICAgICAgICAgICAgICsgIn0iOwogICAgICAgICBhc3NlcnRUaGF0KHAudG9TdHJpbmcoKSwgaXMoZXhwZWN0ZWQpKTsKICAgICB9CkBAIC03ODcsOCArODg4LDggQEAKICAgICAgICAgICAgICsgInBhcmNlbGFibGVBcnJheTogWyIKICAgICAgICAgICAgICsgImFuZHJvaWQuYWlkbC50ZXN0cy5PdGhlclBhcmNlbGFibGVGb3JUb1N0cmluZ3tmaWVsZDogb3RoZXJ9LCAiCiAgICAgICAgICAgICArICJhbmRyb2lkLmFpZGwudGVzdHMuT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmd7ZmllbGQ6IG90aGVyfV0sICIKLSAgICAgICAgICAgICsgImVudW1WYWx1ZTogMTAwMCwgIgotICAgICAgICAgICAgKyAiZW51bUFycmF5OiBbMTAwMCwgMjAwMF0sICIKKyAgICAgICAgICAgICsgImVudW1WYWx1ZTogRk9PLCAiCisgICAgICAgICAgICArICJlbnVtQXJyYXk6IFtGT08sIEJBUl0sICIKICAgICAgICAgICAgICsgIm51bGxBcnJheTogbnVsbCwgIgogICAgICAgICAgICAgKyAibnVsbExpc3Q6IG51bGwsICIKICAgICAgICAgICAgICsgInBhcmNlbGFibGVHZW5lcmljOiBhbmRyb2lkLmFpZGwudGVzdHMuR2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxle2E6IDEsIGI6IDJ9LCAiCkBAIC03OTksNiArOTAwLDIxIEBACiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW51bVRvU3RyaW5nKCkgeworICAgICAgYXNzZXJ0VGhhdChJbnRFbnVtLiQudG9TdHJpbmcoSW50RW51bS5GT08pLCBpcygiRk9PIikpOworICAgICAgYXNzZXJ0VGhhdChJbnRFbnVtLiQudG9TdHJpbmcoMCksIGlzKCIwIikpOworICAgICAgYXNzZXJ0VGhhdChJbnRFbnVtLiQuYXJyYXlUb1N0cmluZyhudWxsKSwgaXMoIm51bGwiKSk7CisgICAgICBhc3NlcnRUaGF0KEludEVudW0uJC5hcnJheVRvU3RyaW5nKG5ldyBpbnRbXSB7fSksIGlzKCJbXSIpKTsKKyAgICAgIGFzc2VydFRoYXQoSW50RW51bS4kLmFycmF5VG9TdHJpbmcobmV3IGludFtdIHtJbnRFbnVtLkZPTywgSW50RW51bS5CQVJ9KSwgaXMoIltGT08sIEJBUl0iKSk7CisgICAgICBhc3NlcnRUaGF0KEludEVudW0uJC5hcnJheVRvU3RyaW5nKG5ldyBpbnRbXSB7SW50RW51bS5GT08sIDB9KSwgaXMoIltGT08sIDBdIikpOworICAgICAgYXNzZXJ0VGhhdChJbnRFbnVtLiQuYXJyYXlUb1N0cmluZyhuZXcgaW50W11bXSB7e0ludEVudW0uRk9PLCBJbnRFbnVtLkJBUn0sIHtJbnRFbnVtLkJBWn19KSwKKyAgICAgICAgICBpcygiW1tGT08sIEJBUl0sIFtCQVpdXSIpKTsKKyAgICAgIGFzc2VydFRocm93cyhJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MsICgpIC0+IEludEVudW0uJC5hcnJheVRvU3RyaW5nKEludEVudW0uRk9PKSk7CisgICAgICBhc3NlcnRUaHJvd3MoCisgICAgICAgICAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzLCAoKSAtPiBJbnRFbnVtLiQuYXJyYXlUb1N0cmluZyhuZXcgbG9uZ1tdIHtMb25nRW51bS5GT099KSk7CisgICAgfQorCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVuYW1lZEludGVyZmFjZSgpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogICAgICAgSU9sZE5hbWUgb2xkQXNPbGQgPSBzZXJ2aWNlLkdldE9sZE5hbWVJbnRlcmZhY2UoKTsKICAgICAgIGFzc2VydE5vdE51bGwob2xkQXNPbGQpOwpAQCAtODM0LDQgKzk1MCw3OCBAQAogICAgICAgYXNzZXJ0VGhhdChyZXBlYXRlZC5nZXROcygpLCBpcyhuZXcgaW50W10gezEsIDIsIDN9KSk7CiAgICAgICBhc3NlcnRUaGF0KHJldmVyc2VkLmdldE5zKCksIGlzKG5ldyBpbnRbXSB7MywgMiwgMX0pKTsKICAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXZlcnNlUmVjdXJzaXZlTGlzdCgpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgUmVjdXJzaXZlTGlzdCBoZWFkID0gbnVsbDsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgICAgICBSZWN1cnNpdmVMaXN0IG5vZGUgPSBuZXcgUmVjdXJzaXZlTGlzdCgpOworICAgICAgICBub2RlLnZhbHVlID0gaTsKKyAgICAgICAgbm9kZS5uZXh0ID0gaGVhZDsKKyAgICAgICAgaGVhZCA9IG5vZGU7CisgICAgICB9CisgICAgICAvLyBoZWFkOiBbOSwgOCwgLi4gLCAwXQorICAgICAgUmVjdXJzaXZlTGlzdCByZXZlcnNlZCA9IHNlcnZpY2UuUmV2ZXJzZUxpc3QoaGVhZCk7CisgICAgICAvLyByZXZlcnNlZCBzaG91bGQgYmUgWzAsIDEsIC4uIDldCisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXZlcnNlZC52YWx1ZSwgaXMoaSkpOworICAgICAgICByZXZlcnNlZCA9IHJldmVyc2VkLm5leHQ7CisgICAgICB9CisgICAgICBhc3NlcnROdWxsKHJldmVyc2VkKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRVbmlvblRhZ3MoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgIGFzc2VydEFycmF5RXF1YWxzKG5ldyBpbnRbXSB7fSwgc2VydmljZS5HZXRVbmlvblRhZ3MobmV3IFVuaW9uW10ge30pKTsKKyAgICAgIGFzc2VydEFycmF5RXF1YWxzKG5ldyBpbnRbXSB7VW5pb24ubiwgVW5pb24ubnN9LAorICAgICAgICAgIHNlcnZpY2UuR2V0VW5pb25UYWdzKG5ldyBVbmlvbltdIHtVbmlvbi5uKDApLCBVbmlvbi5ucyhuZXcgaW50W10ge30pfSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERlc2NyaWJlQ29udGVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIENvbXBpbGVyQ2hlY2tzIGNjID0gbmV3IENvbXBpbGVyQ2hlY2tzKCk7CisgICAgICBjYy5wZmRfYXJyYXkgPSBuZXcgUGFyY2VsRmlsZURlc2NyaXB0b3JbXSB7bnVsbCwgbnVsbCwgbnVsbH07CisgICAgICBhc3NlcnRUaGF0KGNjLmRlc2NyaWJlQ29udGVudHMoKSwgaXMoMCkpOworCisgICAgICBTdHJpbmcgZmlsZSA9ICIvZGF0YS9sb2NhbC90bXAvYWlkbC10ZXN0LWZpbGUiOworICAgICAgY2MucGZkX2FycmF5WzFdID0gUGFyY2VsRmlsZURlc2NyaXB0b3Iub3BlbigKKyAgICAgICAgICBuZXcgRmlsZShmaWxlKSwgUGFyY2VsRmlsZURlc2NyaXB0b3IuTU9ERV9DUkVBVEUgfCBQYXJjZWxGaWxlRGVzY3JpcHRvci5NT0RFX1dSSVRFX09OTFkpOworICAgICAgYXNzZXJ0VGhhdChjYy5kZXNjcmliZUNvbnRlbnRzKCksIGlzKFBhcmNlbGFibGUuQ09OVEVOVFNfRklMRV9ERVNDUklQVE9SKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rml4ZWRTaXplQXJyYXlPdmVyQmluZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBJQmluZGVyIGJpbmRlciA9IFNlcnZpY2VNYW5hZ2VyLndhaXRGb3JTZXJ2aWNlKElSZXBlYXRGaXhlZFNpemVBcnJheS5ERVNDUklQVE9SKTsKKyAgICAgIGFzc2VydE5vdE51bGwoYmluZGVyKTsKKyAgICAgIElSZXBlYXRGaXhlZFNpemVBcnJheSBzZXJ2aWNlID0gSVJlcGVhdEZpeGVkU2l6ZUFycmF5LlN0dWIuYXNJbnRlcmZhY2UoYmluZGVyKTsKKyAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZSk7CisKKyAgICAgIHsKKyAgICAgICAgYnl0ZVtdIGlucHV0ID0gbmV3IGJ5dGVbXSB7MSwgMiwgM307CisgICAgICAgIGJ5dGVbXSByZXBlYXRlZCA9IG5ldyBieXRlWzNdOworICAgICAgICBieXRlW10gb3V0cHV0ID0gc2VydmljZS5SZXBlYXRCeXRlcyhpbnB1dCwgcmVwZWF0ZWQpOworICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhpbnB1dCwgcmVwZWF0ZWQpOworICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhpbnB1dCwgb3V0cHV0KTsKKyAgICAgIH0KKyAgICAgIHsKKyAgICAgICAgaW50W10gaW5wdXQgPSBuZXcgaW50W10gezEsIDIsIDN9OworICAgICAgICBpbnRbXSByZXBlYXRlZCA9IG5ldyBpbnRbM107CisgICAgICAgIGludFtdIG91dHB1dCA9IHNlcnZpY2UuUmVwZWF0SW50cyhpbnB1dCwgcmVwZWF0ZWQpOworICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhpbnB1dCwgcmVwZWF0ZWQpOworICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhpbnB1dCwgb3V0cHV0KTsKKyAgICAgIH0KKyAgICAgIHsKKyAgICAgICAgSW50UGFyY2VsYWJsZSBwMSA9IG5ldyBJbnRQYXJjZWxhYmxlKCk7CisgICAgICAgIHAxLnZhbHVlID0gMTsKKyAgICAgICAgSW50UGFyY2VsYWJsZSBwMiA9IG5ldyBJbnRQYXJjZWxhYmxlKCk7CisgICAgICAgIHAyLnZhbHVlID0gMTsKKyAgICAgICAgSW50UGFyY2VsYWJsZSBwMyA9IG5ldyBJbnRQYXJjZWxhYmxlKCk7CisgICAgICAgIHAzLnZhbHVlID0gMTsKKyAgICAgICAgSW50UGFyY2VsYWJsZVtdW10gaW5wdXQgPSBuZXcgSW50UGFyY2VsYWJsZVtdW10ge3twMSwgcDIsIHAzfSwge3AxLCBwMiwgcDN9fTsKKyAgICAgICAgSW50UGFyY2VsYWJsZVtdW10gcmVwZWF0ZWQgPSBuZXcgSW50UGFyY2VsYWJsZVsyXVszXTsKKyAgICAgICAgSW50UGFyY2VsYWJsZVtdW10gb3V0cHV0ID0gc2VydmljZS5SZXBlYXQyZFBhcmNlbGFibGVzKGlucHV0LCByZXBlYXRlZCk7CisgICAgICAgIGFzc2VydEFycmF5RXF1YWxzKGlucHV0LCByZXBlYXRlZCk7CisgICAgICAgIGFzc2VydEFycmF5RXF1YWxzKGlucHV0LCBvdXRwdXQpOworICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2phdmEvc3JjL2FuZHJvaWQvYWlkbC90ZXN0cy9UZXN0VmVyc2lvbmVkSW50ZXJmYWNlLmphdmEgYi90ZXN0cy9qYXZhL3NyYy9hbmRyb2lkL2FpZGwvdGVzdHMvVGVzdFZlcnNpb25lZEludGVyZmFjZS5qYXZhCmluZGV4IGJiOTYzMzEuLmRkMjVjY2QgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2phdmEvc3JjL2FuZHJvaWQvYWlkbC90ZXN0cy9UZXN0VmVyc2lvbmVkSW50ZXJmYWNlLmphdmEKKysrIGIvdGVzdHMvamF2YS9zcmMvYW5kcm9pZC9haWRsL3Rlc3RzL1Rlc3RWZXJzaW9uZWRJbnRlcmZhY2UuamF2YQpAQCAtOTIsOCArOTIsMjQgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZERhdGFDb3JyZWN0bHlBZnRlclBhcmNlbGFibGVXaXRoTmV3RmllbGQoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKICAgICAgIEZvbyBpbkZvbyA9IG5ldyBGb28oKTsKICAgICAgIEZvbyBpbm91dEZvbyA9IG5ldyBGb28oKTsKKyAgICAgIGlub3V0Rm9vLmludERlZmF1bHQ0MiA9IDA7CiAgICAgICBGb28gb3V0Rm9vID0gbmV3IEZvbygpOworICAgICAgb3V0Rm9vLmludERlZmF1bHQ0MiA9IDA7CiAgICAgICBpbnQgcmV0ID0gc2VydmljZS5pZ25vcmVQYXJjZWxhYmxlc0FuZFJlcGVhdEludChpbkZvbywgaW5vdXRGb28sIG91dEZvbywgNDMpOwogICAgICAgYXNzZXJ0VGhhdChyZXQsIGlzKDQzKSk7CisgICAgICBhc3NlcnRUaGF0KGlub3V0Rm9vLmludERlZmF1bHQ0MiwgaXMoMCkpOworICAgICAgYXNzZXJ0VGhhdChvdXRGb28uaW50RGVmYXVsdDQyLCBpcygwKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVsZWdhdG9yR2V0SW50ZXJmYWNlVmVyc2lvbigpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgSUZvb0ludGVyZmFjZS5EZWxlZ2F0b3IgZGVsZWdhdG9yID0gbmV3IElGb29JbnRlcmZhY2UuRGVsZWdhdG9yKHNlcnZpY2UpOworICAgICAgYXNzZXJ0VGhhdChkZWxlZ2F0b3IuZ2V0SW50ZXJmYWNlVmVyc2lvbigpLCBpcygxKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVsZWdhdG9yR2V0SW50ZXJmYWNlSGFzaCgpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgSUZvb0ludGVyZmFjZS5EZWxlZ2F0b3IgZGVsZWdhdG9yID0gbmV3IElGb29JbnRlcmZhY2UuRGVsZWdhdG9yKHNlcnZpY2UpOworICAgICAgYXNzZXJ0VGhhdChkZWxlZ2F0b3IuZ2V0SW50ZXJmYWNlSGFzaCgpLCBpcygiOWU3YmUxODU5ODIwYzU5ZDlkNTVkZDEzM2U3MWEzNjg3YjVkMmU1YiIpKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy9sYXp5X3Rlc3QvQW5kcm9pZC5icCBiL3Rlc3RzL2xhenlfdGVzdC9BbmRyb2lkLmJwCmluZGV4IGZlYTEyNjMuLjllYjgxNGMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2xhenlfdGVzdC9BbmRyb2lkLmJwCisrKyBiL3Rlc3RzL2xhenlfdGVzdC9BbmRyb2lkLmJwCkBAIC0yMiw2ICsyMiw3IEBACiAKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGF6eV90ZXN0X3NlcnZpY2VfYWlkbC1jcHAiLAorICAgICAgICAibGF6eV9jYl90ZXN0X3NlcnZpY2VfYWlkbC1jcHAiLAogICAgIF0sCiB9CiAKQEAgLTUzLDMgKzU0LDMyIEBACiAgICAgICAgICJJTGF6eVRlc3RTZXJ2aWNlLmFpZGwiLAogICAgIF0sCiB9CisKK2NjX2JpbmFyeSB7CisgICAgbmFtZTogImFpZGxfbGF6eV9jYl90ZXN0X3NlcnZlciIsCisgICAgc3JjczogWworICAgICAgICAiU2VydmVyQ2IuY3BwIiwKKyAgICAgICAgIkxhenlUZXN0U2VydmljZUNiLmNwcCIsCisgICAgXSwKKyAgICBpbml0X3JjOiBbImFpZGxfbGF6eV9jYl90ZXN0X3NlcnZlci5yYyJdLAorICAgIHN5c3RlbV9leHRfc3BlY2lmaWM6IHRydWUsCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsYXp5X2NiX3Rlc3Rfc2VydmljZV9haWRsLWNwcCIsCisgICAgXSwKK30KKworYWlkbF9pbnRlcmZhY2UgeworICAgIG5hbWU6ICJsYXp5X2NiX3Rlc3Rfc2VydmljZV9haWRsIiwKKyAgICB1bnN0YWJsZTogdHJ1ZSwKKyAgICBmbGFnczogWyItV2Vycm9yIl0sCisgICAgc3JjczogWworICAgICAgICAiSUxhenlUZXN0U2VydmljZUNiLmFpZGwiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYXp5X3Rlc3QvSUxhenlUZXN0U2VydmljZS5haWRsIGIvdGVzdHMvbGF6eV90ZXN0L0lMYXp5VGVzdFNlcnZpY2UuYWlkbAppbmRleCA0NjkzOWQ5Li45Y2FmZGQxIDEwMDY0NAotLS0gYS90ZXN0cy9sYXp5X3Rlc3QvSUxhenlUZXN0U2VydmljZS5haWRsCisrKyBiL3Rlc3RzL2xhenlfdGVzdC9JTGF6eVRlc3RTZXJ2aWNlLmFpZGwKQEAgLTE2LDExICsxNiw0IEBACiAKIGludGVyZmFjZSBJTGF6eVRlc3RTZXJ2aWNlIHsKICAgICB2b2lkIGZvcmNlUGVyc2lzdChib29sZWFuIHBlcnNpc3QpOwotICAgIC8qKgotICAgICAqIEFzayB0aGUgcHJvY2VzcyBob3N0aW5nIHRoZSBzZXJ2aWNlIHRvIGluc3RhbGwgYSBjYWxsYmFjayB0aGF0IG5vdGlmaWVzIGlmIHRoZXJlIGFyZQotCSAqIHNlcnZpY2VzIHdpdGggY2xpZW50cy4KLSAgICAgKiBGb3IgdGVzdGluZyBwdXJwb3NlcywgdGhpcyBjYWxsYmFjayBleGVyY2lzZXMgdGhlIGNvZGUgdG8gdW5yZWdpc3Rlci9yZS1yZWdpc3RlcgotICAgICAqIHRoZSBzZXJ2aWNlcyBhbmQgZXZlbnR1YWxseSBzaHV0cyBkb3duIHRoZSBwcm9jZXNzLgotICAgICAqLwotICAgIHZvaWQgc2V0Q3VzdG9tQWN0aXZlU2VydmljZXNDYWxsYmFjaygpOwogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGF6eV90ZXN0L0lMYXp5VGVzdFNlcnZpY2VDYi5haWRsIGIvdGVzdHMvbGF6eV90ZXN0L0lMYXp5VGVzdFNlcnZpY2VDYi5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMDQ3NjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYXp5X3Rlc3QvSUxhenlUZXN0U2VydmljZUNiLmFpZGwKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ludGVyZmFjZSBJTGF6eVRlc3RTZXJ2aWNlQ2IgeworICAgIC8qKgorICAgICAqIFNldCB0aGUgZXZlbnRmZCB1c2VkIHRvIG5vdGlmeSB0aGF0IHRoZSBhY3RpdmUgc2VydmljZXMKKyAgICAgKiBjYWxsYmFjayBpcyBiZWluZyBleGVjdXRlZCBhbmQgaXMgYWJvdXQgdG8gdGVybWluYXRlIHRoZSBwcm9jZXNzLgorICAgICAqLworICAgIHZvaWQgc2V0RXZlbnRGZChpbiBQYXJjZWxGaWxlRGVzY3JpcHRvciBwYXJjZWxGZCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYXp5X3Rlc3QvTGF6eVRlc3RTZXJ2aWNlLmNwcCBiL3Rlc3RzL2xhenlfdGVzdC9MYXp5VGVzdFNlcnZpY2UuY3BwCmluZGV4IGNlOGI0MDYuLmQ2YTVjZDMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2xhenlfdGVzdC9MYXp5VGVzdFNlcnZpY2UuY3BwCisrKyBiL3Rlc3RzL2xhenlfdGVzdC9MYXp5VGVzdFNlcnZpY2UuY3BwCkBAIC0yNywzNCArMjcsNSBAQAogICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCi1TdGF0dXMgTGF6eVRlc3RTZXJ2aWNlOjpzZXRDdXN0b21BY3RpdmVTZXJ2aWNlc0NhbGxiYWNrKCkgewotICBhdXRvIGxhenlSZWdpc3RyYXIgPSBMYXp5U2VydmljZVJlZ2lzdHJhcjo6Z2V0SW5zdGFuY2UoKTsKLSAgbGF6eVJlZ2lzdHJhci5zZXRBY3RpdmVTZXJ2aWNlc0NhbGxiYWNrKFtsYXp5UmVnaXN0cmFyXShib29sIGhhc0NsaWVudHMpIG11dGFibGUgLT4gYm9vbCB7Ci0gICAgaWYgKGhhc0NsaWVudHMpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBVbnJlZ2lzdGVyIGFsbCBzZXJ2aWNlcwotICAgIGlmICghbGF6eVJlZ2lzdHJhci50cnlVbnJlZ2lzdGVyKCkpIHsKLSAgICAgIC8vIFByZXZlbnQgc2h1dGRvd24gKHRlc3Qgd2lsbCBmYWlsKQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLy8gUmUtcmVnaXN0ZXIgYWxsIHNlcnZpY2VzCi0gICAgbGF6eVJlZ2lzdHJhci5yZVJlZ2lzdGVyKCk7Ci0KLSAgICAvLyBVbnJlZ2lzdGVyIGFnYWluIGJlZm9yZSBzaHV0ZG93bgotICAgIGlmICghbGF6eVJlZ2lzdHJhci50cnlVbnJlZ2lzdGVyKCkpIHsKLSAgICAgIC8vIFByZXZlbnQgc2h1dGRvd24gKHRlc3Qgd2lsbCBmYWlsKQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgZXhpdChFWElUX1NVQ0NFU1MpOwotICAgIC8vIFVucmVhY2hhYmxlCi0gIH0pOwotCi0gIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KIH0gIC8vIG5hbWVzcGFjZSBiaW5kZXIKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9sYXp5X3Rlc3QvTGF6eVRlc3RTZXJ2aWNlLmggYi90ZXN0cy9sYXp5X3Rlc3QvTGF6eVRlc3RTZXJ2aWNlLmgKaW5kZXggZmJhYjFmNS4uMzFkMTE1NSAxMDA2NDQKLS0tIGEvdGVzdHMvbGF6eV90ZXN0L0xhenlUZXN0U2VydmljZS5oCisrKyBiL3Rlc3RzL2xhenlfdGVzdC9MYXp5VGVzdFNlcnZpY2UuaApAQCAtMjgsNyArMjgsNiBAQAogICB2aXJ0dWFsIH5MYXp5VGVzdFNlcnZpY2UoKSB7fQogCiAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgZm9yY2VQZXJzaXN0KGJvb2wgcGVyc2lzdCk7Ci0gIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgc2V0Q3VzdG9tQWN0aXZlU2VydmljZXNDYWxsYmFjaygpOwogfTsKIAogfSAgLy8gbmFtZXNwYWNlIGJpbmRlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvbGF6eV90ZXN0L0xhenlUZXN0U2VydmljZUNiLmNwcCBiL3Rlc3RzL2xhenlfdGVzdC9MYXp5VGVzdFNlcnZpY2VDYi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZlMWQ4NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhenlfdGVzdC9MYXp5VGVzdFNlcnZpY2VDYi5jcHAKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzeXMvZXZlbnRmZC5oPgorCisjaW5jbHVkZSA8YmluZGVyL0xhenlTZXJ2aWNlUmVnaXN0cmFyLmg+CisjaW5jbHVkZSAiTGF6eVRlc3RTZXJ2aWNlQ2IuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGJpbmRlciB7CisKK3ZvaWQgTGF6eVRlc3RTZXJ2aWNlQ2I6OnNldEN1c3RvbUFjdGl2ZVNlcnZpY2VzQ2FsbGJhY2soKSB7CisgIGF1dG8gbGF6eVJlZ2lzdHJhciA9IExhenlTZXJ2aWNlUmVnaXN0cmFyOjpnZXRJbnN0YW5jZSgpOworICBsYXp5UmVnaXN0cmFyLnNldEFjdGl2ZVNlcnZpY2VzQ2FsbGJhY2soW2xhenlSZWdpc3RyYXIsIHRoaXNdKGJvb2wgaGFzQ2xpZW50cykgbXV0YWJsZSAtPiBib29sIHsKKyAgICBpZiAoaGFzQ2xpZW50cykgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChtRmQgPCAwKSB7CisgICAgICAvLyBQcmV2ZW50IHNodXRkb3duICh0ZXN0IHdpbGwgZmFpbCkKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIFVucmVnaXN0ZXIgYWxsIHNlcnZpY2VzCisgICAgaWYgKCFsYXp5UmVnaXN0cmFyLnRyeVVucmVnaXN0ZXIoKSkgeworICAgICAgLy8gUHJldmVudCBzaHV0ZG93biAodGVzdCB3aWxsIGZhaWwpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBSZS1yZWdpc3RlciBhbGwgc2VydmljZXMKKyAgICBsYXp5UmVnaXN0cmFyLnJlUmVnaXN0ZXIoKTsKKworICAgIC8vIFVucmVnaXN0ZXIgYWdhaW4gYmVmb3JlIHNodXRkb3duCisgICAgaWYgKCFsYXp5UmVnaXN0cmFyLnRyeVVucmVnaXN0ZXIoKSkgeworICAgICAgLy8gUHJldmVudCBzaHV0ZG93biAodGVzdCB3aWxsIGZhaWwpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBUZWxsIHRoZSB0ZXN0IHdlJ3JlIHNodXR0aW5nIGRvd24KKyAgICBpZiAoVEVNUF9GQUlMVVJFX1JFVFJZKGV2ZW50ZmRfd3JpdGUobUZkLCAvKiB2YWx1ZSAqLyAxKSkgPCAwKSB7CisgICAgICAvLyBQcmV2ZW50IHNodXRkb3duICh0ZXN0IHdpbGwgZmFpbCkKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGV4aXQoRVhJVF9TVUNDRVNTKTsKKyAgICAvLyBVbnJlYWNoYWJsZQorICB9KTsKK30KKworU3RhdHVzIExhenlUZXN0U2VydmljZUNiOjpzZXRFdmVudEZkKGNvbnN0IDo6YW5kcm9pZDo6b3M6OlBhcmNlbEZpbGVEZXNjcmlwdG9yJiBwYXJjZWxGZCkgeworICBtRmQgPSBkdXAocGFyY2VsRmQuZ2V0KCkpOworCisgIHJldHVybiBtRmQgPCAwID8gU3RhdHVzOjpmcm9tRXhjZXB0aW9uQ29kZShTdGF0dXM6OkVYX0lMTEVHQUxfQVJHVU1FTlQpIDogU3RhdHVzOjpvaygpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYmluZGVyCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvbGF6eV90ZXN0L0xhenlUZXN0U2VydmljZUNiLmggYi90ZXN0cy9sYXp5X3Rlc3QvTGF6eVRlc3RTZXJ2aWNlQ2IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGZjODA4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGF6eV90ZXN0L0xhenlUZXN0U2VydmljZUNiLmgKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8Qm5MYXp5VGVzdFNlcnZpY2VDYi5oPgorI2luY2x1ZGUgPGJpbmRlci9TdGF0dXMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGJpbmRlciB7CisKK2NsYXNzIExhenlUZXN0U2VydmljZUNiIDogcHVibGljIEJuTGF6eVRlc3RTZXJ2aWNlQ2IgeworIHB1YmxpYzoKKyAgTGF6eVRlc3RTZXJ2aWNlQ2IoKSA6IG1GZCgtMSkge30KKyAgdmlydHVhbCB+TGF6eVRlc3RTZXJ2aWNlQ2IoKSB7fQorCisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgc2V0RXZlbnRGZChjb25zdCA6OmFuZHJvaWQ6Om9zOjpQYXJjZWxGaWxlRGVzY3JpcHRvciYgcGFyY2VsRmQpOworICB2b2lkIHNldEN1c3RvbUFjdGl2ZVNlcnZpY2VzQ2FsbGJhY2soKTsKKworIHByaXZhdGU6CisgIGludCBtRmQ7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYmluZGVyCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvbGF6eV90ZXN0L1NlcnZlckNiLmNwcCBiL3Rlc3RzL2xhenlfdGVzdC9TZXJ2ZXJDYi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVkOWVjMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhenlfdGVzdC9TZXJ2ZXJDYi5jcHAKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxiaW5kZXIvSUJpbmRlci5oPgorI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxiaW5kZXIvTGF6eVNlcnZpY2VSZWdpc3RyYXIuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlICJMYXp5VGVzdFNlcnZpY2VDYi5oIgorCit1c2luZyBhbmRyb2lkOjpCQmluZGVyOwordXNpbmcgYW5kcm9pZDo6SUJpbmRlcjsKK3VzaW5nIGFuZHJvaWQ6OklQQ1RocmVhZFN0YXRlOwordXNpbmcgYW5kcm9pZDo6T0s7Cit1c2luZyBhbmRyb2lkOjpzcDsKK3VzaW5nIGFuZHJvaWQ6OmJpbmRlcjo6TGF6eVNlcnZpY2VSZWdpc3RyYXI7Cit1c2luZyBhbmRyb2lkOjpiaW5kZXI6OkxhenlUZXN0U2VydmljZUNiOworCitpbnQgbWFpbigpIHsKKyAgc3A8TGF6eVRlc3RTZXJ2aWNlQ2I+IHNlcnZpY2UgPSBuZXcgTGF6eVRlc3RTZXJ2aWNlQ2IoKTsKKworICAvLyBTZXQgdGhlIGNhbGxiYWNrIGJlZm9yZSByZWdpc3RlcmluZyB0aGUgc2VydmljZQorICBzZXJ2aWNlLT5zZXRDdXN0b21BY3RpdmVTZXJ2aWNlc0NhbGxiYWNrKCk7CisKKyAgYXV0byBsYXp5UmVnaXN0cmFyID0gTGF6eVNlcnZpY2VSZWdpc3RyYXI6OmdldEluc3RhbmNlKCk7CisgIExPR19BTFdBWVNfRkFUQUxfSUYoT0sgIT0gbGF6eVJlZ2lzdHJhci5yZWdpc3RlclNlcnZpY2Uoc2VydmljZSwgImFpZGxfbGF6eV9jYl90ZXN0IiksICIiKTsKKworICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5qb2luVGhyZWFkUG9vbCgpOworCisgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGF6eV90ZXN0L2FpZGxfbGF6eV9jYl90ZXN0X3NlcnZlci5yYyBiL3Rlc3RzL2xhenlfdGVzdC9haWRsX2xhenlfY2JfdGVzdF9zZXJ2ZXIucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNiNTA1YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhenlfdGVzdC9haWRsX2xhenlfY2JfdGVzdF9zZXJ2ZXIucmMKQEAgLTAsMCArMSw2IEBACitzZXJ2aWNlIGFpZGxfbGF6eV9jYl90ZXN0IC9zeXN0ZW1fZXh0L2Jpbi9haWRsX2xhenlfY2JfdGVzdF9zZXJ2ZXIKKyAgICBpbnRlcmZhY2UgYWlkbCBhaWRsX2xhenlfY2JfdGVzdAorICAgIHVzZXIgc3lzdGVtCisgICAgZ3JvdXAgc3lzdGVtCisgICAgb25lc2hvdAorICAgIGRpc2FibGVkCmRpZmYgLS1naXQgYS90ZXN0cy9sYXp5X3Rlc3QvbWFpbi5jcHAgYi90ZXN0cy9sYXp5X3Rlc3QvbWFpbi5jcHAKaW5kZXggZTFmYTVmMS4uMGE4MzkzZiAxMDA2NDQKLS0tIGEvdGVzdHMvbGF6eV90ZXN0L21haW4uY3BwCisrKyBiL3Rlc3RzL2xhenlfdGVzdC9tYWluLmNwcApAQCAtMTQsNiArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2luY2x1ZGUgPHN5cy9ldmVudGZkLmg+CiAjaW5jbHVkZSA8Y3N0ZGxpYj4KICNpbmNsdWRlIDxjdGltZT4KICNpbmNsdWRlIDxpb3N0cmVhbT4KQEAgLTIxLDkgKzIyLDExIEBACiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHRocmVhZD4KIAorI2luY2x1ZGUgPHN5cy9lcG9sbC5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCiAjaW5jbHVkZSA8SUxhenlUZXN0U2VydmljZS5oPgorI2luY2x1ZGUgPElMYXp5VGVzdFNlcnZpY2VDYi5oPgogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgpAQCAtMzUsOSArMzgsMTIgQEAKIHVzaW5nIDo6YW5kcm9pZDo6SVNlcnZpY2VNYW5hZ2VyOwogdXNpbmcgOjphbmRyb2lkOjpzcDsKIHVzaW5nIDo6YW5kcm9pZDo6U3RyaW5nMTY7Cit1c2luZyA6OmFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZDsKK3VzaW5nIDo6YW5kcm9pZDo6b3M6OlBhcmNlbEZpbGVEZXNjcmlwdG9yOwogCiBzdGQ6OnZlY3RvcjxTdHJpbmcxNj4gZ1NlcnZpY2VOYW1lczsKIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IFNIVVRET1dOX1dBSVRfVElNRSA9IDEwOworc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgQ0FMTEJBQ0tfU0hVVERPV05fV0FJVF9USU1FID0gNTsKIAogc3A8SUJpbmRlcj4gd2FpdEZvclNlcnZpY2UoY29uc3QgU3RyaW5nMTYmIG5hbWUpIHsKICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBtYW5hZ2VyOwpAQCAtMTY2LDggKzE3Miw5IEBACiAgIH0KIH07CiAKLXNwPElMYXp5VGVzdFNlcnZpY2U+IHdhaXRGb3JMYXp5VGVzdFNlcnZpY2UoU3RyaW5nMTYgbmFtZSkgewotICBzcDxJTGF6eVRlc3RTZXJ2aWNlPiBzZXJ2aWNlID0gYW5kcm9pZDo6d2FpdEZvclNlcnZpY2U8SUxhenlUZXN0U2VydmljZT4obmFtZSk7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3NwPFQ+IHdhaXRGb3JMYXp5VGVzdFNlcnZpY2UoU3RyaW5nMTYgbmFtZSkgeworICBzcDxUPiBzZXJ2aWNlID0gYW5kcm9pZDo6d2FpdEZvclNlcnZpY2U8VD4obmFtZSk7CiAgIEVYUEVDVF9ORShzZXJ2aWNlLCBudWxscHRyKTsKICAgcmV0dXJuIHNlcnZpY2U7CiB9CkBAIC0xNzUsNyArMTgyLDcgQEAKIFRFU1RfRihBaWRsTGF6eVJlZ2lzdHJhclRlc3QsIEZvcmNlZFBlcnNpc3RlbmNlVGVzdCkgewogICBzcDxJTGF6eVRlc3RTZXJ2aWNlPiBzZXJ2aWNlOwogICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgewotICAgIHNlcnZpY2UgPSB3YWl0Rm9yTGF6eVRlc3RTZXJ2aWNlKHNlcnZpY2VOYW1lKTsKKyAgICBzZXJ2aWNlID0gd2FpdEZvckxhenlUZXN0U2VydmljZTxJTGF6eVRlc3RTZXJ2aWNlPihzZXJ2aWNlTmFtZSk7CiAgICAgRVhQRUNUX1RSVUUoc2VydmljZS0+Zm9yY2VQZXJzaXN0KGkgPT0gMCkuaXNPaygpKTsKICAgICBzZXJ2aWNlID0gbnVsbHB0cjsKIApAQCAtMTkzLDE1ICsyMDAsNDkgQEAKIH0KIAogVEVTVF9GKEFpZGxMYXp5UmVnaXN0cmFyVGVzdCwgQWN0aXZlU2VydmljZXNDb3VudENhbGxiYWNrVGVzdCkgewotICBzcDxJTGF6eVRlc3RTZXJ2aWNlPiBzZXJ2aWNlOwotICBzZXJ2aWNlID0gd2FpdEZvckxhenlUZXN0U2VydmljZShzZXJ2aWNlTmFtZSk7Ci0gIEFTU0VSVF9UUlVFKHNlcnZpY2UtPnNldEN1c3RvbUFjdGl2ZVNlcnZpY2VzQ2FsbGJhY2soKS5pc09rKCkpOworICBjb25zdCBTdHJpbmcxNiBjYlNlcnZpY2VOYW1lID0gU3RyaW5nMTYoImFpZGxfbGF6eV9jYl90ZXN0Iik7CisKKyAgaW50IGVmZCA9IGV2ZW50ZmQoMCwgMCk7CisgIEFTU0VSVF9HRShlZmQsIDApIDw8ICJGYWlsZWQgdG8gY3JlYXRlIGV2ZW50ZmQiOworCisgIHVuaXF1ZV9mZCB1bmlxdWVFdmVudEZkKGVmZCk7CisgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIHBhcmNlbEV2ZW50RmQoc3RkOjptb3ZlKHVuaXF1ZUV2ZW50RmQpKTsKKworICBzcDxJTGF6eVRlc3RTZXJ2aWNlQ2I+IHNlcnZpY2U7CisgIHNlcnZpY2UgPSB3YWl0Rm9yTGF6eVRlc3RTZXJ2aWNlPElMYXp5VGVzdFNlcnZpY2VDYj4oY2JTZXJ2aWNlTmFtZSk7CisgIEFTU0VSVF9UUlVFKHNlcnZpY2UtPnNldEV2ZW50RmQocGFyY2VsRXZlbnRGZCkuaXNPaygpKTsKICAgc2VydmljZSA9IG51bGxwdHI7CiAKLSAgc3RkOjpjb3V0IDw8ICJXYWl0aW5nICIgPDwgU0hVVERPV05fV0FJVF9USU1FIDw8ICIgc2Vjb25kcyBiZWZvcmUgY2hlY2tpbmcgd2hldGhlciB0aGUgIgotICAgICAgICAgICAgPDwgInNlcnZpY2UgaXMgc3RpbGwgcnVubmluZy4iIDw8IHN0ZDo6ZW5kbDsKICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwotICBzbGVlcChTSFVURE9XTl9XQUlUX1RJTUUpOworCisgIHN0ZDo6Y291dCA8PCAiV2FpdGluZyAiIDw8IFNIVVRET1dOX1dBSVRfVElNRSA8PCAiIHNlY29uZHMgZm9yIGNhbGxiYWNrIGNvbXBsZXRpb24gIgorICAgICAgICAgICAgPDwgIm5vdGlmaWNhdGlvbi4iIDw8IHN0ZDo6ZW5kbDsKKworICBpbnQgZXBvbGxGZCA9IGVwb2xsX2NyZWF0ZTEoRVBPTExfQ0xPRVhFQyk7CisgIEFTU0VSVF9HRShlcG9sbEZkLCAwKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBlcG9sbCI7CisgIHVuaXF1ZV9mZCBlcG9sbFVuaXF1ZUZkKGVwb2xsRmQpOworCisgIGNvbnN0IGludCBFUE9MTF9NQVhfRVZFTlRTID0gMTsKKyAgc3RydWN0IGVwb2xsX2V2ZW50IGV2ZW50LCBldmVudHNbRVBPTExfTUFYX0VWRU5UU107CisKKyAgZXZlbnQuZXZlbnRzID0gRVBPTExJTjsKKyAgZXZlbnQuZGF0YS5mZCA9IGVmZDsKKyAgaW50IHJjID0gZXBvbGxfY3RsKGVwb2xsRmQsIEVQT0xMX0NUTF9BREQsIGVmZCwgJmV2ZW50KTsKKyAgQVNTRVJUX0dFKHJjLCAwKSA8PCAiRmFpbGVkIHRvIGFkZCBmZCB0byBlcG9sbCI7CisKKyAgcmMgPSBURU1QX0ZBSUxVUkVfUkVUUlkoZXBvbGxfd2FpdChlcG9sbEZkLCBldmVudHMsIEVQT0xMX01BWF9FVkVOVFMsIFNIVVRET1dOX1dBSVRfVElNRSAqIDEwMDApKTsKKyAgQVNTRVJUX05FKHJjLCAwKSA8PCAiU2VydmljZSBzaHV0ZG93biB0aW1lb3V0IjsKKyAgQVNTRVJUX0dUKHJjLCAwKSA8PCAiRXJyb3Igd2FpdGluZyBmb3Igc2VydmljZSBzaHV0ZG93biBub3RpZmljYXRpb24iOworCisgIGV2ZW50ZmRfdCBjb3VudGVyOworICByYyA9IFRFTVBfRkFJTFVSRV9SRVRSWShldmVudGZkX3JlYWQocGFyY2VsRXZlbnRGZC5nZXQoKSwgJmNvdW50ZXIpKTsKKyAgQVNTRVJUX0dFKHJjLCAwKSA8PCAiRmFpbGVkIHRvIGdldCBjYWxsYmFjayBjb21wbGV0aW9uIG5vdGlmaWNhdGlvbiBmcm9tIHNlcnZpY2UiOworICBBU1NFUlRfRVEoY291bnRlciwgMSk7CisKKyAgc3RkOjpjb3V0IDw8ICJXYWl0aW5nICIgPDwgQ0FMTEJBQ0tfU0hVVERPV05fV0FJVF9USU1FIDw8ICIgc2Vjb25kcyBiZWZvcmUgY2hlY2tpbmcgd2hldGhlciB0aGUgIgorICAgICAgICAgICAgPDwgInNlcnZpY2UgaXMgc3RpbGwgcnVubmluZy4iIDw8IHN0ZDo6ZW5kbDsKKworICBzbGVlcChDQUxMQkFDS19TSFVURE9XTl9XQUlUX1RJTUUpOwogCiAgIEFTU0VSVF9GQUxTRShpc1NlcnZpY2VSdW5uaW5nKHNlcnZpY2VOYW1lKSkgPDwgIlNlcnZpY2UgZmFpbGVkIHRvIHNodXQgZG93bi4iOwogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcnVzdC90ZXN0X2NsaWVudC5ycyBiL3Rlc3RzL3J1c3QvdGVzdF9jbGllbnQucnMKaW5kZXggMDcyNTE2MS4uODEzMTVjOSAxMDA2NDQKLS0tIGEvdGVzdHMvcnVzdC90ZXN0X2NsaWVudC5ycworKysgYi90ZXN0cy9ydXN0L3Rlc3RfY2xpZW50LnJzCkBAIC0xNiwyNSArMTYsNDYgQEAKIAogLy8hIFRlc3QgUnVzdCBjbGllbnQgZm9yIHRoZSBBSURMIGNvbXBpbGVyLgogCit1c2UgOjpiaW5kZXI6OntiaW5kZXJfaW1wbDo6UGFyY2VsLCBQYXJjZWxhYmxlfTsKK3VzZSBhaWRsX3Rlc3RfZml4ZWRzaXplYXJyYXk6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OnsKKyAgICBGaXhlZFNpemVBcnJheUV4YW1wbGUsCisgICAgSVJlcGVhdEZpeGVkU2l6ZUFycmF5Ojp7QnBSZXBlYXRGaXhlZFNpemVBcnJheSwgSVJlcGVhdEZpeGVkU2l6ZUFycmF5fSwKKyAgICBJbnRQYXJjZWxhYmxlOjpJbnRQYXJjZWxhYmxlLAorfTsKK3VzZSBhaWRsX3Rlc3RfaW50ZXJmYWNlOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjp7CisgICAgSU5lc3RlZFNlcnZpY2UsIFBhcmNlbGFibGVXaXRoTmVzdGVkLAorfTsKK3VzZSBhaWRsX3Rlc3RfaW50ZXJmYWNlOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6dW5pb25zOjpFbnVtVW5pb246OkVudW1VbmlvbjsKIHVzZSBhaWRsX3Rlc3RfaW50ZXJmYWNlOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5ld05hbWU6OntzZWxmLCBCcE5ld05hbWV9OwogdXNlIGFpZGxfdGVzdF9pbnRlcmZhY2U6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJT2xkTmFtZTo6e3NlbGYsIEJwT2xkTmFtZX07CiB1c2UgYWlkbF90ZXN0X2ludGVyZmFjZTo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6ewotICAgIHNlbGYsIEJwVGVzdFNlcnZpY2UsIElUZXN0U2VydmljZURlZmF1bHQsIElUZXN0U2VydmljZURlZmF1bHRSZWYsCisgICAgc2VsZiwgQnBUZXN0U2VydmljZSwgRW1wdHk6OkVtcHR5LCBJVGVzdFNlcnZpY2VEZWZhdWx0LCBJVGVzdFNlcnZpY2VEZWZhdWx0UmVmLAogfTsKIHVzZSBhaWRsX3Rlc3RfaW50ZXJmYWNlOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6ewotICAgIEJhY2tlbmRUeXBlOjpCYWNrZW5kVHlwZSwgQnl0ZUVudW06OkJ5dGVFbnVtLCBJbnRFbnVtOjpJbnRFbnVtLCBMb25nRW51bTo6TG9uZ0VudW0sIFN0cnVjdHVyZWRQYXJjZWxhYmxlLCBVbmlvbiwKKyAgICBleHRlbnNpb246OkV4dGVuZGFibGVQYXJjZWxhYmxlOjpFeHRlbmRhYmxlUGFyY2VsYWJsZSwgZXh0ZW5zaW9uOjpNeUV4dDo6TXlFeHQsCisgICAgZXh0ZW5zaW9uOjpNeUV4dDI6Ok15RXh0MiwgZXh0ZW5zaW9uOjpNeUV4dExpa2U6Ok15RXh0TGlrZSwgQmFja2VuZFR5cGU6OkJhY2tlbmRUeXBlLAorICAgIEJ5dGVFbnVtOjpCeXRlRW51bSwgSW50RW51bTo6SW50RW51bSwgTG9uZ0VudW06OkxvbmdFbnVtLCBSZWN1cnNpdmVMaXN0OjpSZWN1cnNpdmVMaXN0LAorICAgIFN0cnVjdHVyZWRQYXJjZWxhYmxlLCBVbmlvbiwKIH07Ci11c2UgYWlkbF90ZXN0X2ludGVyZmFjZTo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OnVuaW9uczo6ewotICAgIEVudW1Vbmlvbjo6RW51bVVuaW9uLAordXNlIGFpZGxfdGVzdF9pbnRlcmZhY2U6OmJpbmRlcjo6e3NlbGYsIEJpbmRlckZlYXR1cmVzLCBJQmluZGVyLCBJbnRlcmZhY2V9OwordXNlIGFpZGxfdGVzdF9ub252aW50Zl9wYXJjZWxhYmxlOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bm9udmludGY6OnsKKyAgICBOb25WaW50ZkV4dGVuZGFibGVQYXJjZWxhYmxlOjpOb25WaW50ZkV4dGVuZGFibGVQYXJjZWxhYmxlLAorICAgIE5vblZpbnRmUGFyY2VsYWJsZTo6Tm9uVmludGZQYXJjZWxhYmxlLAogfTsKLXVzZSBhaWRsX3Rlc3RfaW50ZXJmYWNlOjpiaW5kZXI7Cit1c2UgYWlkbF90ZXN0X3Vuc3RhYmxlX3BhcmNlbGFibGU6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjp1bnN0YWJsZTo6eworICAgIFVuc3RhYmxlRXh0ZW5kYWJsZVBhcmNlbGFibGU6OlVuc3RhYmxlRXh0ZW5kYWJsZVBhcmNlbGFibGUsCisgICAgVW5zdGFibGVQYXJjZWxhYmxlOjpVbnN0YWJsZVBhcmNlbGFibGUsCit9OwogdXNlIGFpZGxfdGVzdF92ZXJzaW9uZWRfaW50ZXJmYWNlOjphaWRsOjphbmRyb2lkOjphaWRsOjp2ZXJzaW9uZWQ6OnRlc3RzOjp7Ci0gICAgSUZvb0ludGVyZmFjZSwgSUZvb0ludGVyZmFjZTo6QnBGb29JbnRlcmZhY2UsIEJhelVuaW9uOjpCYXpVbmlvbiwKKyAgICBCYXpVbmlvbjo6QmF6VW5pb24sIEZvbzo6Rm9vLCBJRm9vSW50ZXJmYWNlLCBJRm9vSW50ZXJmYWNlOjpCcEZvb0ludGVyZmFjZSwKK307Cit1c2UgYWlkbF90ZXN0X3ZpbnRmX3BhcmNlbGFibGU6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjp2aW50Zjo6eworICAgIFZpbnRmRXh0ZW5kYWJsZVBhcmNlbGFibGU6OlZpbnRmRXh0ZW5kYWJsZVBhcmNlbGFibGUsIFZpbnRmUGFyY2VsYWJsZTo6VmludGZQYXJjZWxhYmxlLAogfTsKIHVzZSBzdGQ6OmZzOjpGaWxlOwogdXNlIHN0ZDo6aW86OntSZWFkLCBXcml0ZX07CiB1c2Ugc3RkOjpvczo6dW5peDo6aW86OkZyb21SYXdGZDsKLXVzZSBzdGQ6OnN5bmM6OkFyYzsKK3VzZSBzdGQ6OnN5bmM6OntBcmMsIE11dGV4fTsKIAogZm4gZ2V0X3Rlc3Rfc2VydmljZSgpIC0+IGJpbmRlcjo6U3Ryb25nPGR5biBJVGVzdFNlcnZpY2U6OklUZXN0U2VydmljZT4gewogICAgIGJpbmRlcjo6Z2V0X2ludGVyZmFjZSg8QnBUZXN0U2VydmljZSBhcyBJVGVzdFNlcnZpY2U6OklUZXN0U2VydmljZT46OmdldF9kZXNjcmlwdG9yKCkpCkBAIC0xNjAsNyArMTgxLDcgQEAKICAgICAgICAgSVRlc3RTZXJ2aWNlOjpTVFJJTkdfVEVTVF9DT05TVEFOVDIuaW50bygpLAogICAgIF07CiAgICAgZm9yIGlucHV0IGluICZpbnB1dHMgewotICAgICAgICBsZXQgcmVzdWx0ID0gc2VydmljZS5SZXBlYXRTdHJpbmcoJmlucHV0KTsKKyAgICAgICAgbGV0IHJlc3VsdCA9IHNlcnZpY2UuUmVwZWF0U3RyaW5nKGlucHV0KTsKICAgICAgICAgYXNzZXJ0X2VxIShyZXN1bHQuYXNfcmVmKCksIE9rKGlucHV0KSk7CiAgICAgfQogfQpAQCAtMTY5LDcgKzE5MCw3IEBACiAgICAgKCR0ZXN0OmlkZW50LCAkZnVuYzppZGVudCwgJGFycmF5OmV4cHIpID0+IHsKICAgICAgICAgI1t0ZXN0XQogICAgICAgICBmbiAkdGVzdCgpIHsKLSAgICAgICAgICAgIGxldCBtdXQgYXJyYXkgPSAkYXJyYXk7CisgICAgICAgICAgICBsZXQgbXV0IGFycmF5ID0gJGFycmF5LnRvX3ZlYygpOwogCiAgICAgICAgICAgICAvLyBKYXZhIG5lZWRzIGluaXRpYWwgdmFsdWVzIGhlcmUgKGNhbid0IHJlc2l6ZSBhcnJheXMpCiAgICAgICAgICAgICBsZXQgbXV0IHJlcGVhdGVkID0gdmVjIVtEZWZhdWx0OjpkZWZhdWx0KCk7IGFycmF5LmxlbigpXTsKQEAgLTIwOCw2ICsyMjksMTEgQEAKICAgICB2ZWMhW0J5dGVFbnVtOjpGT08sIEJ5dGVFbnVtOjpCQVIsIEJ5dGVFbnVtOjpCQVJdCiB9CiB0ZXN0X3JldmVyc2VfYXJyYXkhIHsKKyAgICB0ZXN0X2FycmF5X2J5dGVfZW51bV92YWx1ZXMsCisgICAgUmV2ZXJzZUJ5dGVFbnVtLAorICAgIEJ5dGVFbnVtOjplbnVtX3ZhbHVlcygpCit9Cit0ZXN0X3JldmVyc2VfYXJyYXkhIHsKICAgICB0ZXN0X2FycmF5X2J5dGVfZW51bV92MiwKICAgICBSZXZlcnNlQnl0ZUVudW0sCiAgICAgdmVjIVtCeXRlRW51bTo6Rk9PLCBCeXRlRW51bTo6QkFSLCBCeXRlRW51bTo6QkFaXQpAQCAtMjQzLDEzICsyNjksNTggQEAKIGZuIHRlc3RfYmluZGVyX2V4Y2hhbmdlKCkgewogICAgIGNvbnN0IE5BTUU6ICZzdHIgPSAiU215dGhlIjsKICAgICBsZXQgc2VydmljZSA9IGdldF90ZXN0X3NlcnZpY2UoKTsKLSAgICBsZXQgZ290ID0gc2VydmljZQotICAgICAgICAuR2V0T3RoZXJUZXN0U2VydmljZShOQU1FKQotICAgICAgICAuZXhwZWN0KCJlcnJvciBjYWxsaW5nIEdldE90aGVyVGVzdFNlcnZpY2UiKTsKKyAgICBsZXQgZ290ID0gc2VydmljZS5HZXRPdGhlclRlc3RTZXJ2aWNlKE5BTUUpLmV4cGVjdCgiZXJyb3IgY2FsbGluZyBHZXRPdGhlclRlc3RTZXJ2aWNlIik7CiAgICAgYXNzZXJ0X2VxIShnb3QuR2V0TmFtZSgpLmFzX3JlZigpLm1hcChTdHJpbmc6OmFzX3JlZiksIE9rKE5BTUUpKTsKICAgICBhc3NlcnRfZXEhKHNlcnZpY2UuVmVyaWZ5TmFtZSgmZ290LCBOQU1FKSwgT2sodHJ1ZSkpOwogfQogCisjW3Rlc3RdCitmbiB0ZXN0X2JpbmRlcl9hcnJheV9leGNoYW5nZSgpIHsKKyAgICBsZXQgbmFtZXMgPSB2ZWMhWyJGaXp6Ii5pbnRvKCksICJCdXp6Ii5pbnRvKCldOworICAgIGxldCBzZXJ2aWNlID0gZ2V0X3Rlc3Rfc2VydmljZSgpOworICAgIGxldCBnb3QgPSBzZXJ2aWNlLkdldEludGVyZmFjZUFycmF5KCZuYW1lcykuZXhwZWN0KCJlcnJvciBjYWxsaW5nIEdldEludGVyZmFjZUFycmF5Iik7CisgICAgYXNzZXJ0X2VxIShnb3QuaXRlcigpLm1hcCh8c3wgcy5HZXROYW1lKCkpLmNvbGxlY3Q6OjxSZXN1bHQ8VmVjPF8+LCBfPj4oKSwgT2sobmFtZXMuY2xvbmUoKSkpOworICAgIGFzc2VydF9lcSEoc2VydmljZS5WZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VBcnJheSgmZ290LCAmbmFtZXMpLCBPayh0cnVlKSk7Cit9CisKKyNbdGVzdF0KK2ZuIHRlc3RfYmluZGVyX251bGxhYmxlX2FycmF5X2V4Y2hhbmdlKCkgeworICAgIGxldCBuYW1lcyA9IHZlYyFbU29tZSgiRml6eiIuaW50bygpKSwgTm9uZSwgU29tZSgiQnV6eiIuaW50bygpKV07CisgICAgbGV0IHNlcnZpY2UgPSBnZXRfdGVzdF9zZXJ2aWNlKCk7CisgICAgbGV0IGdvdCA9IHNlcnZpY2UKKyAgICAgICAgLkdldE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoU29tZSgmbmFtZXMpKQorICAgICAgICAuZXhwZWN0KCJlcnJvciBjYWxsaW5nIEdldE51bGxhYmxlSW50ZXJmYWNlQXJyYXkiKTsKKyAgICBhc3NlcnRfZXEhKAorICAgICAgICBnb3QuYXNfcmVmKCkubWFwKHxhcnJ8IGFycgorICAgICAgICAgICAgLml0ZXIoKQorICAgICAgICAgICAgLm1hcCh8b3B0X3N8IG9wdF9zLmFzX3JlZigpLm1hcCh8c3wgcy5HZXROYW1lKCkuZXhwZWN0KCJlcnJvciBjYWxsaW5nIEdldE5hbWUiKSkpCisgICAgICAgICAgICAuY29sbGVjdDo6PFZlYzxfPj4oKSksCisgICAgICAgIFNvbWUobmFtZXMuY2xvbmUoKSkKKyAgICApOworICAgIGFzc2VydF9lcSEoCisgICAgICAgIHNlcnZpY2UuVmVyaWZ5TmFtZXNXaXRoTnVsbGFibGVJbnRlcmZhY2VBcnJheShnb3QuYXNfcmVmKCkubWFwKHx2fCAmdlsuLl0pLCBTb21lKCZuYW1lcykpLAorICAgICAgICBPayh0cnVlKQorICAgICk7Cit9CisKKyNbdGVzdF0KK2ZuIHRlc3RfaW50ZXJmYWNlX2xpc3RfZXhjaGFuZ2UoKSB7CisgICAgbGV0IG5hbWVzID0gdmVjIVtTb21lKCJGaXp6Ii5pbnRvKCkpLCBOb25lLCBTb21lKCJCdXp6Ii5pbnRvKCkpXTsKKyAgICBsZXQgc2VydmljZSA9IGdldF90ZXN0X3NlcnZpY2UoKTsKKyAgICBsZXQgZ290ID0gc2VydmljZS5HZXRJbnRlcmZhY2VMaXN0KFNvbWUoJm5hbWVzKSkuZXhwZWN0KCJlcnJvciBjYWxsaW5nIEdldEludGVyZmFjZUxpc3QiKTsKKyAgICBhc3NlcnRfZXEhKAorICAgICAgICBnb3QuYXNfcmVmKCkubWFwKHxhcnJ8IGFycgorICAgICAgICAgICAgLml0ZXIoKQorICAgICAgICAgICAgLm1hcCh8b3B0X3N8IG9wdF9zLmFzX3JlZigpLm1hcCh8c3wgcy5HZXROYW1lKCkuZXhwZWN0KCJlcnJvciBjYWxsaW5nIEdldE5hbWUiKSkpCisgICAgICAgICAgICAuY29sbGVjdDo6PFZlYzxfPj4oKSksCisgICAgICAgIFNvbWUobmFtZXMuY2xvbmUoKSkKKyAgICApOworICAgIGFzc2VydF9lcSEoCisgICAgICAgIHNlcnZpY2UuVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlTGlzdChnb3QuYXNfcmVmKCkubWFwKHx2fCAmdlsuLl0pLCBTb21lKCZuYW1lcykpLAorICAgICAgICBPayh0cnVlKQorICAgICk7Cit9CisKIGZuIGJ1aWxkX3BpcGUoKSAtPiAoRmlsZSwgRmlsZSkgewogICAgIC8vIFNhZmV0eTogd2UgZ2V0IHR3byBmaWxlIGRlc2NyaXB0b3JzIGZyb20gcGlwZSgpCiAgICAgLy8gYW5kIHBhc3MgdGhlbSBhZnRlciBjaGVja2luZyBpZiB0aGUgZnVuY3Rpb24gcmV0dXJuZWQKQEAgLTI3NSwxNSArMzQ2LDEwIEBACiAgICAgICAgIC5leHBlY3QoImVycm9yIGNhbGxpbmcgUmVwZWF0UGFyY2VsRmlsZURlc2NyaXB0b3IiKTsKIAogICAgIGNvbnN0IFRFU1RfREFUQTogJlt1OF0gPSBiIkZyYXp6bGVTbmF6emxlRmxpbUZsYW1GbGliYml0eUd1bWJvQ2hvcHMiOwotICAgIHJlc3VsdF9wZmQKLSAgICAgICAgLmFzX3JlZigpCi0gICAgICAgIC53cml0ZV9hbGwoVEVTVF9EQVRBKQotICAgICAgICAuZXhwZWN0KCJlcnJvciB3cml0aW5nIHRvIHBpcGUiKTsKKyAgICByZXN1bHRfcGZkLmFzX3JlZigpLndyaXRlX2FsbChURVNUX0RBVEEpLmV4cGVjdCgiZXJyb3Igd3JpdGluZyB0byBwaXBlIik7CiAKICAgICBsZXQgbXV0IGJ1ZiA9IFswdTg7IFRFU1RfREFUQS5sZW4oKV07Ci0gICAgcmVhZF9maWxlCi0gICAgICAgIC5yZWFkX2V4YWN0KCZtdXQgYnVmKQotICAgICAgICAuZXhwZWN0KCJlcnJvciByZWFkaW5nIGZyb20gcGlwZSIpOworICAgIHJlYWRfZmlsZS5yZWFkX2V4YWN0KCZtdXQgYnVmKS5leHBlY3QoImVycm9yIHJlYWRpbmcgZnJvbSBwaXBlIik7CiAgICAgYXNzZXJ0X2VxISgmYnVmWy4uXSwgVEVTVF9EQVRBKTsKIH0KIApAQCAtMzExLDI3ICszNzcsMTggQEAKICAgICAgICAgLlJldmVyc2VQYXJjZWxGaWxlRGVzY3JpcHRvckFycmF5KCZpbnB1dFsuLl0sICZtdXQgcmVwZWF0ZWQpCiAgICAgICAgIC5leHBlY3QoImVycm9yIGNhbGxpbmcgUmV2ZXJzZVBhcmNlbEZpbGVEZXNjcmlwdG9yQXJyYXkiKTsKIAotICAgIGlucHV0WzFdCi0gICAgICAgIC5hc19yZWYoKQotICAgICAgICAud3JpdGVfYWxsKGIiRmlyc3QiKQotICAgICAgICAuZXhwZWN0KCJlcnJvciB3cml0aW5nIHRvIHBpcGUiKTsKKyAgICBpbnB1dFsxXS5hc19yZWYoKS53cml0ZV9hbGwoYiJGaXJzdCIpLmV4cGVjdCgiZXJyb3Igd3JpdGluZyB0byBwaXBlIik7CiAgICAgcmVwZWF0ZWRbMV0KICAgICAgICAgLmFzX211dCgpCiAgICAgICAgIC5leHBlY3QoInJlY2VpdmVkIE5vbmUgZm9yIFBhcmNlbEZpbGVEZXNjcmlwdG9yIikKICAgICAgICAgLmFzX3JlZigpCiAgICAgICAgIC53cml0ZV9hbGwoYiJTZWNvbmQiKQogICAgICAgICAuZXhwZWN0KCJlcnJvciB3cml0aW5nIHRvIHBpcGUiKTsKLSAgICByZXN1bHRbMF0KLSAgICAgICAgLmFzX3JlZigpCi0gICAgICAgIC53cml0ZV9hbGwoYiJUaGlyZCIpCi0gICAgICAgIC5leHBlY3QoImVycm9yIHdyaXRpbmcgdG8gcGlwZSIpOworICAgIHJlc3VsdFswXS5hc19yZWYoKS53cml0ZV9hbGwoYiJUaGlyZCIpLmV4cGVjdCgiZXJyb3Igd3JpdGluZyB0byBwaXBlIik7CiAKICAgICBjb25zdCBURVNUX0RBVEE6ICZbdThdID0gYiJGaXJzdFNlY29uZFRoaXJkIjsKICAgICBsZXQgbXV0IGJ1ZiA9IFswdTg7IFRFU1RfREFUQS5sZW4oKV07Ci0gICAgaW5wdXRbMF0KLSAgICAgICAgLmFzX3JlZigpCi0gICAgICAgIC5yZWFkX2V4YWN0KCZtdXQgYnVmKQotICAgICAgICAuZXhwZWN0KCJlcnJvciByZWFkaW5nIGZyb20gcGlwZSIpOworICAgIGlucHV0WzBdLmFzX3JlZigpLnJlYWRfZXhhY3QoJm11dCBidWYpLmV4cGVjdCgiZXJyb3IgcmVhZGluZyBmcm9tIHBpcGUiKTsKICAgICBhc3NlcnRfZXEhKCZidWZbLi5dLCBURVNUX0RBVEEpOwogfQogCkBAIC0zMzksMjEgKzM5NiwxMiBAQAogZm4gdGVzdF9zZXJ2aWNlX3NwZWNpZmljX2V4Y2VwdGlvbigpIHsKICAgICBsZXQgc2VydmljZSA9IGdldF90ZXN0X3NlcnZpY2UoKTsKIAotICAgIGxldCBiYWNrZW5kID0gc2VydmljZS5nZXRCYWNrZW5kVHlwZSgpLmV4cGVjdCgiZXJyb3IgZ2V0dGluZyBiYWNrZW5kIHR5cGUiKTsKLSAgICBpZiBiYWNrZW5kID09IEJhY2tlbmRUeXBlOjpKQVZBIHsKLSAgICAgICAgLy8gVE9ETyhiLzE3ODg2MTQ2OCk6IG5vdCBjb3JyZWN0bHkgdGhyb3duIGZyb20gSmF2YQotICAgICAgICByZXR1cm47Ci0gICAgfQotCiAgICAgZm9yIGkgaW4gLTEuLjIgewogICAgICAgICBsZXQgcmVzdWx0ID0gc2VydmljZS5UaHJvd1NlcnZpY2VFeGNlcHRpb24oaSk7CiAgICAgICAgIGFzc2VydCEocmVzdWx0LmlzX2VycigpKTsKIAogICAgICAgICBsZXQgc3RhdHVzID0gcmVzdWx0LnVud3JhcF9lcnIoKTsKLSAgICAgICAgYXNzZXJ0X2VxISgKLSAgICAgICAgICAgIHN0YXR1cy5leGNlcHRpb25fY29kZSgpLAotICAgICAgICAgICAgYmluZGVyOjpFeGNlcHRpb25Db2RlOjpTRVJWSUNFX1NQRUNJRklDCi0gICAgICAgICk7CisgICAgICAgIGFzc2VydF9lcSEoc3RhdHVzLmV4Y2VwdGlvbl9jb2RlKCksIGJpbmRlcjo6RXhjZXB0aW9uQ29kZTo6U0VSVklDRV9TUEVDSUZJQyk7CiAgICAgICAgIGFzc2VydF9lcSEoc3RhdHVzLnNlcnZpY2Vfc3BlY2lmaWNfZXJyb3IoKSwgaSk7CiAgICAgfQogfQpAQCAtNDA1LDEwICs0NTMsNyBAQAogCiAjW3Rlc3RdCiBmbiB0ZXN0X251bGxhYmxlX3BhcmNlbGFibGUoKSB7Ci0gICAgbGV0IHZhbHVlID0gU3RydWN0dXJlZFBhcmNlbGFibGU6OlN0cnVjdHVyZWRQYXJjZWxhYmxlewotICAgICAgICBmOiA0MiwKLSAgICAgICAgLi5EZWZhdWx0OjpkZWZhdWx0KCkKLSAgICB9OworICAgIGxldCB2YWx1ZSA9IEVtcHR5IHt9OwogCiAgICAgbGV0IHNlcnZpY2UgPSBnZXRfdGVzdF9zZXJ2aWNlKCk7CiAgICAgbGV0IHZhbHVlID0gU29tZSh2YWx1ZSk7CkBAIC00MTksMTMgKzQ2NCwyOCBAQAogICAgIGFzc2VydF9lcSEocmVzdWx0LCBPayhOb25lKSk7CiB9CiAKK3Rlc3RfbnVsbGFibGUhIHsKKyAgICB0ZXN0X251bGxhYmxlX3BhcmNlbGFibGVfYXJyYXksCisgICAgUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlQXJyYXksCisgICAgdmVjIVsKKyAgICAgICAgU29tZShFbXB0eSB7fSksCisgICAgICAgIE5vbmUsCisgICAgXQorfQorCit0ZXN0X251bGxhYmxlISB7CisgICAgdGVzdF9udWxsYWJsZV9wYXJjZWxhYmxlX2xpc3QsCisgICAgUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlTGlzdCwKKyAgICB2ZWMhWworICAgICAgICBTb21lKEVtcHR5IHt9KSwKKyAgICAgICAgTm9uZSwKKyAgICBdCit9CisKICNbdGVzdF0KIGZuIHRlc3RfYmluZGVyKCkgewogICAgIGxldCBzZXJ2aWNlID0gZ2V0X3Rlc3Rfc2VydmljZSgpOwotICAgIGFzc2VydCEoc2VydmljZQotICAgICAgICAuR2V0Q2FsbGJhY2sodHJ1ZSkKLSAgICAgICAgLmV4cGVjdCgiZXJyb3IgY2FsbGluZyBHZXRDYWxsYmFjayIpCi0gICAgICAgIC5pc19ub25lKCkpOworICAgIGFzc2VydCEoc2VydmljZS5HZXRDYWxsYmFjayh0cnVlKS5leHBlY3QoImVycm9yIGNhbGxpbmcgR2V0Q2FsbGJhY2siKS5pc19ub25lKCkpOwogICAgIGxldCBjYWxsYmFjayA9IHNlcnZpY2UKICAgICAgICAgLkdldENhbGxiYWNrKGZhbHNlKQogICAgICAgICAuZXhwZWN0KCJlcnJvciBjYWxsaW5nIEdldENhbGxiYWNrIikKQEAgLTUxOSwxMSArNTc5LDExIEBACiAgICAgYXNzZXJ0X2VxIShwYXJjZWxhYmxlLmJ5dGVEZWZhdWx0c1RvRm91ciwgNCk7CiAgICAgYXNzZXJ0X2VxIShwYXJjZWxhYmxlLmludERlZmF1bHRzVG9GaXZlLCA1KTsKICAgICBhc3NlcnRfZXEhKHBhcmNlbGFibGUubG9uZ0RlZmF1bHRzVG9OZWdhdGl2ZVNldmVuLCAtNyk7Ci0gICAgYXNzZXJ0X2VxIShwYXJjZWxhYmxlLmJvb2xlYW5EZWZhdWx0c1RvVHJ1ZSwgdHJ1ZSk7CisgICAgYXNzZXJ0IShwYXJjZWxhYmxlLmJvb2xlYW5EZWZhdWx0c1RvVHJ1ZSk7CiAgICAgYXNzZXJ0X2VxIShwYXJjZWxhYmxlLmNoYXJEZWZhdWx0c1RvQywgJ0MnIGFzIHUxNik7CiAgICAgYXNzZXJ0X2VxIShwYXJjZWxhYmxlLmZsb2F0RGVmYXVsdHNUb1BpLCAzLjE0ZjMyKTsKICAgICBhc3NlcnRfZXEhKHBhcmNlbGFibGUuZG91YmxlV2l0aERlZmF1bHQsIC0zLjE0ZTE3ZjY0KTsKLSAgICBhc3NlcnRfZXEhKHBhcmNlbGFibGUuYm9vbERlZmF1bHQsIGZhbHNlKTsKKyAgICBhc3NlcnQhKCFwYXJjZWxhYmxlLmJvb2xEZWZhdWx0KTsKICAgICBhc3NlcnRfZXEhKHBhcmNlbGFibGUuYnl0ZURlZmF1bHQsIDApOwogICAgIGFzc2VydF9lcSEocGFyY2VsYWJsZS5pbnREZWZhdWx0LCAwKTsKICAgICBhc3NlcnRfZXEhKHBhcmNlbGFibGUubG9uZ0RlZmF1bHQsIDApOwpAQCAtNTM1LDE1ICs1OTUsMTUgQEAKICAgICBsZXQgcmVzdWx0ID0gc2VydmljZS5GaWxsT3V0U3RydWN0dXJlZFBhcmNlbGFibGUoJm11dCBwYXJjZWxhYmxlKTsKICAgICBhc3NlcnRfZXEhKHJlc3VsdCwgT2soKCkpKTsKIAotICAgIGFzc2VydF9lcSEoCi0gICAgICAgIHBhcmNlbGFibGUuc2hvdWxkQ29udGFpblRocmVlRnMsCi0gICAgICAgIFtERVNJUkVEX1ZBTFVFLCBERVNJUkVEX1ZBTFVFLCBERVNJUkVEX1ZBTFVFXQotICAgICk7CisgICAgYXNzZXJ0X2VxIShwYXJjZWxhYmxlLnNob3VsZENvbnRhaW5UaHJlZUZzLCBbREVTSVJFRF9WQUxVRSwgREVTSVJFRF9WQUxVRSwgREVTSVJFRF9WQUxVRV0pOwogICAgIGFzc2VydF9lcSEocGFyY2VsYWJsZS5zaG91bGRCZUplcnJ5LCAiSmVycnkiKTsKICAgICBhc3NlcnRfZXEhKHBhcmNlbGFibGUuaW50MzJfbWluLCBpMzI6Ok1JTik7CiAgICAgYXNzZXJ0X2VxIShwYXJjZWxhYmxlLmludDMyX21heCwgaTMyOjpNQVgpOwogICAgIGFzc2VydF9lcSEocGFyY2VsYWJsZS5pbnQ2NF9tYXgsIGk2NDo6TUFYKTsKICAgICBhc3NlcnRfZXEhKHBhcmNlbGFibGUuaGV4SW50MzJfbmVnXzEsIC0xKTsKKyAgICBmb3IgaSBpbiBwYXJjZWxhYmxlLmludDhfMSB7CisgICAgICAgIGFzc2VydF9lcSEoaSwgMSk7CisgICAgfQogICAgIGZvciBpIGluIHBhcmNlbGFibGUuaW50MzJfMSB7CiAgICAgICAgIGFzc2VydF9lcSEoaSwgMSk7CiAgICAgfQpAQCAtNTYzLDE4ICs2MjMsMjE0IEBACiAgICAgYXNzZXJ0X2VxIShwYXJjZWxhYmxlLmNvbnN0X2V4cHJzXzkuMCwgMSk7CiAgICAgYXNzZXJ0X2VxIShwYXJjZWxhYmxlLmNvbnN0X2V4cHJzXzEwLjAsIDEpOwogICAgIGFzc2VydF9lcSEocGFyY2VsYWJsZS5hZGRTdHJpbmcxLCAiaGVsbG8gd29ybGQhIik7Ci0gICAgYXNzZXJ0X2VxISgKLSAgICAgICAgcGFyY2VsYWJsZS5hZGRTdHJpbmcyLAotICAgICAgICAiVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZy4iCi0gICAgKTsKKyAgICBhc3NlcnRfZXEhKHBhcmNlbGFibGUuYWRkU3RyaW5nMiwgIlRoZSBxdWljayBicm93biBmb3gganVtcHMgb3ZlciB0aGUgbGF6eSBkb2cuIik7CiAKLSAgICBhc3NlcnRfZXEhKHBhcmNlbGFibGUuc2hvdWxkU2V0Qml0MEFuZEJpdDIsIFN0cnVjdHVyZWRQYXJjZWxhYmxlOjpCSVQwIHwgU3RydWN0dXJlZFBhcmNlbGFibGU6OkJJVDIpOworICAgIGFzc2VydF9lcSEoCisgICAgICAgIHBhcmNlbGFibGUuc2hvdWxkU2V0Qml0MEFuZEJpdDIsCisgICAgICAgIFN0cnVjdHVyZWRQYXJjZWxhYmxlOjpCSVQwIHwgU3RydWN0dXJlZFBhcmNlbGFibGU6OkJJVDIKKyAgICApOwogCiAgICAgYXNzZXJ0X2VxIShwYXJjZWxhYmxlLnUsIFNvbWUoVW5pb246OlVuaW9uOjpOcyh2ZWMhWzEsIDIsIDNdKSkpOwogICAgIGFzc2VydF9lcSEocGFyY2VsYWJsZS5zaG91bGRCZUNvbnN0UzEsIFNvbWUoVW5pb246OlVuaW9uOjpTKFVuaW9uOjpTMS50b19zdHJpbmcoKSkpKQogfQogCiAjW3Rlc3RdCitmbiB0ZXN0X3JlcGVhdF9leHRlbmRhYmxlX3BhcmNlbGFibGUoKSB7CisgICAgbGV0IHNlcnZpY2UgPSBnZXRfdGVzdF9zZXJ2aWNlKCk7CisKKyAgICBsZXQgZXh0ID0gQXJjOjpuZXcoTXlFeHQgeyBhOiA0MiwgYjogIkVYVCIuaW50bygpIH0pOworICAgIGxldCBtdXQgZXAgPSBFeHRlbmRhYmxlUGFyY2VsYWJsZSB7IGE6IDEsIGI6ICJhIi5pbnRvKCksIGM6IDQyLCAuLkRlZmF1bHQ6OmRlZmF1bHQoKSB9OworICAgIGVwLmV4dC5zZXRfcGFyY2VsYWJsZShBcmM6OmNsb25lKCZleHQpKS5leHBlY3QoImVycm9yIHNldHRpbmcgcGFyY2VsYWJsZSIpOworCisgICAgbGV0IG11dCBlcDIgPSBFeHRlbmRhYmxlUGFyY2VsYWJsZTo6ZGVmYXVsdCgpOworICAgIGxldCByZXN1bHQgPSBzZXJ2aWNlLlJlcGVhdEV4dGVuZGFibGVQYXJjZWxhYmxlKCZlcCwgJm11dCBlcDIpOworICAgIGFzc2VydF9lcSEocmVzdWx0LCBPaygoKSkpOworICAgIGFzc2VydF9lcSEoZXAyLmEsIGVwLmEpOworICAgIGFzc2VydF9lcSEoZXAyLmIsIGVwLmIpOworCisgICAgbGV0IHJldF9leHQgPSBlcDIuZXh0LmdldF9wYXJjZWxhYmxlOjo8TXlFeHQ+KCkuZXhwZWN0KCJlcnJvciBnZXR0aW5nIHBhcmNlbGFibGUiKTsKKyAgICBhc3NlcnQhKHJldF9leHQuaXNfc29tZSgpKTsKKworICAgIGxldCByZXRfZXh0ID0gcmV0X2V4dC51bndyYXAoKTsKKyAgICBhc3NlcnRfZXEhKHJldF9leHQuYSwgZXh0LmEpOworICAgIGFzc2VydF9lcSEocmV0X2V4dC5iLCBleHQuYik7Cit9CisKK21hY3JvX3J1bGVzISB0ZXN0X3BhcmNlbGFibGVfaG9sZGVyX3N0YWJpbGl0eSB7CisgICAgKCR0ZXN0OmlkZW50LCAkaG9sZGVyOnBhdGgsICRwYXJjZWxhYmxlOnBhdGgpID0+IHsKKyAgICAgICAgI1t0ZXN0XQorICAgICAgICBmbiAkdGVzdCgpIHsKKyAgICAgICAgICAgIGxldCBtdXQgaG9sZGVyID0gPCRob2xkZXI+OjpkZWZhdWx0KCk7CisgICAgICAgICAgICBsZXQgcGFyY2VsYWJsZSA9IEFyYzo6bmV3KDwkcGFyY2VsYWJsZT46OmRlZmF1bHQoKSk7CisgICAgICAgICAgICBsZXQgcmVzdWx0ID0gaG9sZGVyLmV4dC5zZXRfcGFyY2VsYWJsZShBcmM6OmNsb25lKCZwYXJjZWxhYmxlKSk7CisgICAgICAgICAgICBhc3NlcnRfZXEhKHJlc3VsdCwgT2soKCkpKTsKKworICAgICAgICAgICAgbGV0IHBhcmNlbGFibGUyID0gaG9sZGVyLmV4dC5nZXRfcGFyY2VsYWJsZTo6PCRwYXJjZWxhYmxlPigpLnVud3JhcCgpLnVud3JhcCgpOworICAgICAgICAgICAgYXNzZXJ0IShBcmM6OnB0cl9lcSgmcGFyY2VsYWJsZSwgJnBhcmNlbGFibGUyKSk7CisgICAgICAgIH0KKyAgICB9OworfQorCit0ZXN0X3BhcmNlbGFibGVfaG9sZGVyX3N0YWJpbGl0eSEgeworICAgIHRlc3RfdmludGZfcGFyY2VsYWJsZV9ob2xkZXJfY2FuX2NvbnRhaW5fdmludGZfcGFyY2VsYWJsZSwKKyAgICBWaW50ZkV4dGVuZGFibGVQYXJjZWxhYmxlLAorICAgIFZpbnRmUGFyY2VsYWJsZQorfQordGVzdF9wYXJjZWxhYmxlX2hvbGRlcl9zdGFiaWxpdHkhIHsKKyAgICB0ZXN0X3N0YWJsZV9wYXJjZWxhYmxlX2hvbGRlcl9jYW5fY29udGFpbl92aW50Zl9wYXJjZWxhYmxlLAorICAgIE5vblZpbnRmRXh0ZW5kYWJsZVBhcmNlbGFibGUsCisgICAgVmludGZQYXJjZWxhYmxlCit9Cit0ZXN0X3BhcmNlbGFibGVfaG9sZGVyX3N0YWJpbGl0eSEgeworICAgIHRlc3Rfc3RhYmxlX3BhcmNlbGFibGVfaG9sZGVyX2Nhbl9jb250YWluX25vbl92aW50Zl9wYXJjZWxhYmxlLAorICAgIE5vblZpbnRmRXh0ZW5kYWJsZVBhcmNlbGFibGUsCisgICAgTm9uVmludGZQYXJjZWxhYmxlCit9Cit0ZXN0X3BhcmNlbGFibGVfaG9sZGVyX3N0YWJpbGl0eSEgeworICAgIHRlc3Rfc3RhYmxlX3BhcmNlbGFibGVfaG9sZGVyX2Nhbl9jb250YWluX3Vuc3RhYmxlX3BhcmNlbGFibGUsCisgICAgTm9uVmludGZFeHRlbmRhYmxlUGFyY2VsYWJsZSwKKyAgICBVbnN0YWJsZVBhcmNlbGFibGUKK30KK3Rlc3RfcGFyY2VsYWJsZV9ob2xkZXJfc3RhYmlsaXR5ISB7CisgICAgdGVzdF91bnN0YWJsZV9wYXJjZWxhYmxlX2hvbGRlcl9jYW5fY29udGFpbl92aW50Zl9wYXJjZWxhYmxlLAorICAgIFVuc3RhYmxlRXh0ZW5kYWJsZVBhcmNlbGFibGUsCisgICAgVmludGZQYXJjZWxhYmxlCit9Cit0ZXN0X3BhcmNlbGFibGVfaG9sZGVyX3N0YWJpbGl0eSEgeworICAgIHRlc3RfdW5zdGFibGVfcGFyY2VsYWJsZV9ob2xkZXJfY2FuX2NvbnRhaW5fbm9uX3ZpbnRmX3BhcmNlbGFibGUsCisgICAgVW5zdGFibGVFeHRlbmRhYmxlUGFyY2VsYWJsZSwKKyAgICBOb25WaW50ZlBhcmNlbGFibGUKK30KK3Rlc3RfcGFyY2VsYWJsZV9ob2xkZXJfc3RhYmlsaXR5ISB7CisgICAgdGVzdF91bnN0YWJsZV9wYXJjZWxhYmxlX2hvbGRlcl9jYW5fY29udGFpbl91bnN0YWJsZV9wYXJjZWxhYmxlLAorICAgIFVuc3RhYmxlRXh0ZW5kYWJsZVBhcmNlbGFibGUsCisgICAgVW5zdGFibGVQYXJjZWxhYmxlCit9CisKKyNbdGVzdF0KK2ZuIHRlc3RfdmludGZfcGFyY2VsYWJsZV9ob2xkZXJfY2Fubm90X2NvbnRhaW5fbm90X3ZpbnRmX3BhcmNlbGFibGUoKSB7CisgICAgbGV0IG11dCBob2xkZXIgPSBWaW50ZkV4dGVuZGFibGVQYXJjZWxhYmxlOjpkZWZhdWx0KCk7CisgICAgbGV0IHBhcmNlbGFibGUgPSBBcmM6Om5ldyhOb25WaW50ZlBhcmNlbGFibGU6OmRlZmF1bHQoKSk7CisgICAgbGV0IHJlc3VsdCA9IGhvbGRlci5leHQuc2V0X3BhcmNlbGFibGUoQXJjOjpjbG9uZSgmcGFyY2VsYWJsZSkpOworICAgIGFzc2VydF9lcSEocmVzdWx0LCBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpCQURfVkFMVUUpKTsKKworICAgIGxldCBwYXJjZWxhYmxlMiA9IGhvbGRlci5leHQuZ2V0X3BhcmNlbGFibGU6OjxOb25WaW50ZlBhcmNlbGFibGU+KCk7CisgICAgYXNzZXJ0IShwYXJjZWxhYmxlMi51bndyYXAoKS5pc19ub25lKCkpOworfQorCisjW3Rlc3RdCitmbiB0ZXN0X3ZpbnRmX3BhcmNlbGFibGVfaG9sZGVyX2Nhbm5vdF9jb250YWluX3Vuc3RhYmxlX3BhcmNlbGFibGUoKSB7CisgICAgbGV0IG11dCBob2xkZXIgPSBWaW50ZkV4dGVuZGFibGVQYXJjZWxhYmxlOjpkZWZhdWx0KCk7CisgICAgbGV0IHBhcmNlbGFibGUgPSBBcmM6Om5ldyhVbnN0YWJsZVBhcmNlbGFibGU6OmRlZmF1bHQoKSk7CisgICAgbGV0IHJlc3VsdCA9IGhvbGRlci5leHQuc2V0X3BhcmNlbGFibGUoQXJjOjpjbG9uZSgmcGFyY2VsYWJsZSkpOworICAgIGFzc2VydF9lcSEocmVzdWx0LCBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpCQURfVkFMVUUpKTsKKworICAgIGxldCBwYXJjZWxhYmxlMiA9IGhvbGRlci5leHQuZ2V0X3BhcmNlbGFibGU6OjxVbnN0YWJsZVBhcmNlbGFibGU+KCk7CisgICAgYXNzZXJ0IShwYXJjZWxhYmxlMi51bndyYXAoKS5pc19ub25lKCkpOworfQorCisjW3Rlc3RdCitmbiB0ZXN0X3JlYWRfd3JpdGVfZXh0ZW5zaW9uKCkgeworICAgIGxldCBleHQgPSBBcmM6Om5ldyhNeUV4dCB7IGE6IDQyLCBiOiAiRVhUIi5pbnRvKCkgfSk7CisgICAgbGV0IGV4dDIgPSBBcmM6Om5ldyhNeUV4dDIgeyBhOiA0MiwgYjogTXlFeHQgeyBhOiAyNCwgYjogIklORVhUIi5pbnRvKCkgfSwgYzogIkVYVDIiLmludG8oKSB9KTsKKworICAgIGxldCBtdXQgZXAgPSBFeHRlbmRhYmxlUGFyY2VsYWJsZSB7IGE6IDEsIGI6ICJhIi5pbnRvKCksIGM6IDQyLCAuLkRlZmF1bHQ6OmRlZmF1bHQoKSB9OworCisgICAgZXAuZXh0LnNldF9wYXJjZWxhYmxlKEFyYzo6Y2xvbmUoJmV4dCkpLnVud3JhcCgpOworICAgIGVwLmV4dDIuc2V0X3BhcmNlbGFibGUoQXJjOjpjbG9uZSgmZXh0MikpLnVud3JhcCgpOworCisgICAgbGV0IGV4dF9saWtlID0gZXAuZXh0LmdldF9wYXJjZWxhYmxlOjo8TXlFeHRMaWtlPigpOworICAgIGFzc2VydF9lcSEoZXh0X2xpa2UudW53cmFwX2VycigpLCBiaW5kZXI6OlN0YXR1c0NvZGU6OkJBRF9WQUxVRSk7CisKKyAgICBsZXQgYWN0dWFsX2V4dCA9IGVwLmV4dC5nZXRfcGFyY2VsYWJsZTo6PE15RXh0PigpOworICAgIGFzc2VydCEoYWN0dWFsX2V4dC51bndyYXAoKS5pc19zb21lKCkpOworICAgIGxldCBhY3R1YWxfZXh0MiA9IGVwLmV4dDIuZ2V0X3BhcmNlbGFibGU6OjxNeUV4dDI+KCk7CisgICAgYXNzZXJ0IShhY3R1YWxfZXh0Mi51bndyYXAoKS5pc19zb21lKCkpOworCisgICAgY2hlY2tfZXh0ZW5zaW9uX2NvbnRlbnQoJmVwLCAmZXh0LCAmZXh0Mik7CisKKyAgICBsZXQgbXV0IHBhcmNlbCA9IFBhcmNlbDo6bmV3KCk7CisgICAgZXAud3JpdGVfdG9fcGFyY2VsKCZtdXQgcGFyY2VsLmJvcnJvd2VkKCkpLnVud3JhcCgpOworCisgICAgdW5zYWZlIHsKKyAgICAgICAgcGFyY2VsLnNldF9kYXRhX3Bvc2l0aW9uKDApLnVud3JhcCgpOworICAgIH0KKyAgICBsZXQgbXV0IGVwMSA9IEV4dGVuZGFibGVQYXJjZWxhYmxlOjpkZWZhdWx0KCk7CisgICAgZXAxLnJlYWRfZnJvbV9wYXJjZWwocGFyY2VsLmJvcnJvd2VkX3JlZigpKS51bndyYXAoKTsKKworICAgIHVuc2FmZSB7CisgICAgICAgIHBhcmNlbC5zZXRfZGF0YV9wb3NpdGlvbigwKS51bndyYXAoKTsKKyAgICB9CisgICAgZXAxLndyaXRlX3RvX3BhcmNlbCgmbXV0IHBhcmNlbC5ib3Jyb3dlZCgpKS51bndyYXAoKTsKKworICAgIHVuc2FmZSB7CisgICAgICAgIHBhcmNlbC5zZXRfZGF0YV9wb3NpdGlvbigwKS51bndyYXAoKTsKKyAgICB9CisgICAgbGV0IG11dCBlcDIgPSBFeHRlbmRhYmxlUGFyY2VsYWJsZTo6ZGVmYXVsdCgpOworICAgIGVwMi5yZWFkX2Zyb21fcGFyY2VsKHBhcmNlbC5ib3Jyb3dlZF9yZWYoKSkudW53cmFwKCk7CisKKyAgICBsZXQgZXh0X2xpa2UgPSBlcDIuZXh0LmdldF9wYXJjZWxhYmxlOjo8TXlFeHRMaWtlPigpOworICAgIGFzc2VydCEoZXh0X2xpa2UudW53cmFwKCkuaXNfbm9uZSgpKTsKKworICAgIGxldCBhY3R1YWxfZXh0ID0gZXAyLmV4dC5nZXRfcGFyY2VsYWJsZTo6PE15RXh0PigpOworICAgIGFzc2VydCEoYWN0dWFsX2V4dC51bndyYXAoKS5pc19zb21lKCkpOworCisgICAgbGV0IG5ld19leHQyID0KKyAgICAgICAgQXJjOjpuZXcoTXlFeHQyIHsgYTogNzksIGI6IE15RXh0IHsgYTogNDIsIGI6ICJJTk5FV0VYVCIuaW50bygpIH0sIGM6ICJORVdFWFQyIi5pbnRvKCkgfSk7CisgICAgZXAyLmV4dDIuc2V0X3BhcmNlbGFibGUoQXJjOjpjbG9uZSgmbmV3X2V4dDIpKS51bndyYXAoKTsKKworICAgIGNoZWNrX2V4dGVuc2lvbl9jb250ZW50KCZlcDEsICZleHQsICZleHQyKTsKKyAgICBjaGVja19leHRlbnNpb25fY29udGVudCgmZXAyLCAmZXh0LCAmbmV3X2V4dDIpOworfQorCitmbiBjaGVja19leHRlbnNpb25fY29udGVudChlcDogJkV4dGVuZGFibGVQYXJjZWxhYmxlLCBleHQ6ICZNeUV4dCwgZXh0MjogJk15RXh0MikgeworICAgIGFzc2VydF9lcSEoZXAuYSwgMSk7CisgICAgYXNzZXJ0X2VxIShlcC5iLCAiYSIpOworICAgIGFzc2VydF9lcSEoZXAuYywgNDIpOworCisgICAgbGV0IGFjdHVhbF9leHQgPSBlcC5leHQuZ2V0X3BhcmNlbGFibGU6OjxNeUV4dD4oKS51bndyYXAoKS51bndyYXAoKTsKKyAgICBhc3NlcnRfZXEhKGV4dC5hLCBhY3R1YWxfZXh0LmEpOworICAgIGFzc2VydF9lcSEoZXh0LmIsIGFjdHVhbF9leHQuYik7CisKKyAgICBsZXQgYWN0dWFsX2V4dDIgPSBlcC5leHQyLmdldF9wYXJjZWxhYmxlOjo8TXlFeHQyPigpLnVud3JhcCgpLnVud3JhcCgpOworICAgIGFzc2VydF9lcSEoZXh0Mi5hLCBhY3R1YWxfZXh0Mi5hKTsKKyAgICBhc3NlcnRfZXEhKGV4dDIuYi5hLCBhY3R1YWxfZXh0Mi5iLmEpOworICAgIGFzc2VydF9lcSEoZXh0Mi5iLmIsIGFjdHVhbF9leHQyLmIuYik7CisgICAgYXNzZXJ0X2VxIShleHQyLmMsIGFjdHVhbF9leHQyLmMpOworfQorCisjW3Rlc3RdCitmbiB0ZXN0X3JldmVyc2VfcmVjdXJzaXZlX2xpc3QoKSB7CisgICAgbGV0IHNlcnZpY2UgPSBnZXRfdGVzdF9zZXJ2aWNlKCk7CisKKyAgICBsZXQgbXV0IGhlYWQgPSBOb25lOworICAgIGZvciBuIGluIDAuLjEwIHsKKyAgICAgICAgbGV0IG5vZGUgPSBSZWN1cnNpdmVMaXN0IHsgdmFsdWU6IG4sIG5leHQ6IGhlYWQgfTsKKyAgICAgICAgaGVhZCA9IFNvbWUoQm94OjpuZXcobm9kZSkpOworICAgIH0KKyAgICAvLyBoZWFkID0gWzksIDgsIC4uLCAwXQorICAgIGxldCByZXN1bHQgPSBzZXJ2aWNlLlJldmVyc2VMaXN0KGhlYWQuYXNfcmVmKCkudW53cmFwKCkpOworICAgIGFzc2VydCEocmVzdWx0LmlzX29rKCkpOworCisgICAgLy8gcmV2ZXJzZWQgc2hvdWxkIGJlIFswLCAxLCAuLi4gOV0KKyAgICBsZXQgbXV0IHJldmVyc2VkOiBPcHRpb248JlJlY3Vyc2l2ZUxpc3Q+ID0gcmVzdWx0LmFzX3JlZigpLm9rKCk7CisgICAgZm9yIG4gaW4gMC4uMTAgeworICAgICAgICBhc3NlcnRfZXEhKHJldmVyc2VkLm1hcCh8aW5uZXJ8IGlubmVyLnZhbHVlKSwgU29tZShuKSk7CisgICAgICAgIHJldmVyc2VkID0gcmV2ZXJzZWQudW53cmFwKCkubmV4dC5hc19yZWYoKS5tYXAofG58IG4uYXNfcmVmKCkpOworICAgIH0KKyAgICBhc3NlcnQhKHJldmVyc2VkLmlzX25vbmUoKSkKK30KKworI1t0ZXN0XQorZm4gdGVzdF9nZXRfdW5pb25fdGFncygpIHsKKyAgICBsZXQgc2VydmljZSA9IGdldF90ZXN0X3NlcnZpY2UoKTsKKyAgICBsZXQgcmVzdWx0ID0gc2VydmljZS5HZXRVbmlvblRhZ3MoJltdKTsKKyAgICBhc3NlcnRfZXEhKHJlc3VsdCwgT2sodmVjIVtdKSk7CisgICAgbGV0IHJlc3VsdCA9IHNlcnZpY2UuR2V0VW5pb25UYWdzKCZbVW5pb246OlVuaW9uOjpOKDApLCBVbmlvbjo6VW5pb246Ok5zKHZlYyFbXSldKTsKKyAgICBhc3NlcnRfZXEhKHJlc3VsdCwgT2sodmVjIVtVbmlvbjo6VGFnOjpUYWc6Om4sIFVuaW9uOjpUYWc6OlRhZzo6bnNdKSk7Cit9CisKKyNbdGVzdF0KIGZuIHRlc3RfdW5pb25zKCkgewogICAgIGFzc2VydF9lcSEoVW5pb246OlVuaW9uOjpkZWZhdWx0KCksIFVuaW9uOjpVbmlvbjo6TnModmVjIVtdKSk7CiAgICAgYXNzZXJ0X2VxIShFbnVtVW5pb246OmRlZmF1bHQoKSwgRW51bVVuaW9uOjpJbnRFbnVtKEludEVudW06OkZPTykpOwpAQCAtNjIxLDEwICs4NzcsNyBAQAogICAgICAgICAgICAgLmV4cGVjdCgiZGlkIG5vdCBnZXQgYmluZGVyIHNlcnZpY2UiKTsKIAogICAgIGxldCBoYXNoID0gc2VydmljZS5nZXRJbnRlcmZhY2VIYXNoKCk7Ci0gICAgYXNzZXJ0X2VxISgKLSAgICAgICAgaGFzaC5hc19yZWYoKS5tYXAoU3RyaW5nOjphc19zdHIpLAotICAgICAgICBPaygiOWU3YmUxODU5ODIwYzU5ZDlkNTVkZDEzM2U3MWEzNjg3YjVkMmU1YiIpCi0gICAgKTsKKyAgICBhc3NlcnRfZXEhKGhhc2guYXNfcmVmKCkubWFwKFN0cmluZzo6YXNfc3RyKSwgT2soIjllN2JlMTg1OTgyMGM1OWQ5ZDU1ZGQxMzNlNzFhMzY4N2I1ZDJlNWIiKSk7CiB9CiAKICNbdGVzdF0KQEAgLTY0Myw3ICs4OTYsNyBAQAogICAgICAgICAgICAgLmV4cGVjdCgiZGlkIG5vdCBnZXQgYmluZGVyIHNlcnZpY2UiKTsKIAogICAgIGxldCByZXQgPSBzZXJ2aWNlLmFjY2VwdFVuaW9uQW5kUmV0dXJuU3RyaW5nKCZCYXpVbmlvbjo6TG9uZ051bSg0MikpOwotICAgIGFzc2VydCEoIXJldC5pc19vaygpKTsKKyAgICBhc3NlcnQhKHJldC5pc19lcnIoKSk7CiAKICAgICBsZXQgbWFpbl9zZXJ2aWNlID0gZ2V0X3Rlc3Rfc2VydmljZSgpOwogICAgIGxldCBiYWNrZW5kID0gbWFpbl9zZXJ2aWNlLmdldEJhY2tlbmRUeXBlKCkuZXhwZWN0KCJlcnJvciBnZXR0aW5nIGJhY2tlbmQgdHlwZSIpOwpAQCAtNjc0LDEwICs5MjcsMTIgQEAKICAgICAgICAgICAgIC5leHBlY3QoImRpZCBub3QgZ2V0IGJpbmRlciBzZXJ2aWNlIik7CiAKICAgICBsZXQgaW5fZm9vID0gRGVmYXVsdDo6ZGVmYXVsdCgpOwotICAgIGxldCBtdXQgaW5vdXRfZm9vID0gRGVmYXVsdDo6ZGVmYXVsdCgpOwotICAgIGxldCBtdXQgb3V0X2ZvbyA9IERlZmF1bHQ6OmRlZmF1bHQoKTsKKyAgICBsZXQgbXV0IGlub3V0X2ZvbyA9IEZvbyB7IGludERlZmF1bHQ0MjogMCB9OworICAgIGxldCBtdXQgb3V0X2ZvbyA9IEZvbyB7IGludERlZmF1bHQ0MjogMCB9OwogICAgIGxldCByZXQgPSBzZXJ2aWNlLmlnbm9yZVBhcmNlbGFibGVzQW5kUmVwZWF0SW50KCZpbl9mb28sICZtdXQgaW5vdXRfZm9vLCAmbXV0IG91dF9mb28sIDQzKTsKICAgICBhc3NlcnRfZXEhKHJldCwgT2soNDMpKTsKKyAgICBhc3NlcnRfZXEhKGlub3V0X2Zvby5pbnREZWZhdWx0NDIsIDApOworICAgIGFzc2VydF9lcSEob3V0X2Zvby5pbnREZWZhdWx0NDIsIDApOwogfQogCiBmbiB0ZXN0X3JlbmFtZWRfaW50ZXJmYWNlPEY+KGY6IEYpCkBAIC03MjMsOSArOTc4LDcgQEAKICNbdGVzdF0KIGZuIHRlc3RfcmVuYW1lZF9pbnRlcmZhY2Vfb2xkX2FzX25ldygpIHsKICAgICB0ZXN0X3JlbmFtZWRfaW50ZXJmYWNlKHxvbGRfbmFtZSwgX3wgewotICAgICAgICBsZXQgbmV3X25hbWUgPSBvbGRfbmFtZQotICAgICAgICAgICAgLmFzX2JpbmRlcigpCi0gICAgICAgICAgICAuaW50b19pbnRlcmZhY2U6OjxkeW4gSU5ld05hbWU6OklOZXdOYW1lPigpOworICAgICAgICBsZXQgbmV3X25hbWUgPSBvbGRfbmFtZS5hc19iaW5kZXIoKS5pbnRvX2ludGVyZmFjZTo6PGR5biBJTmV3TmFtZTo6SU5ld05hbWU+KCk7CiAgICAgICAgIGFzc2VydCEobmV3X25hbWUuaXNfb2soKSk7CiAKICAgICAgICAgbGV0IHJlYWxfbmFtZSA9IG5ld19uYW1lLnVud3JhcCgpLlJlYWxOYW1lKCk7CkBAIC03MzYsMTIgKzk4OSwyMzIgQEAKICNbdGVzdF0KIGZuIHRlc3RfcmVuYW1lZF9pbnRlcmZhY2VfbmV3X2FzX29sZCgpIHsKICAgICB0ZXN0X3JlbmFtZWRfaW50ZXJmYWNlKHxfLCBuZXdfbmFtZXwgewotICAgICAgICBsZXQgb2xkX25hbWUgPSBuZXdfbmFtZQotICAgICAgICAgICAgLmFzX2JpbmRlcigpCi0gICAgICAgICAgICAuaW50b19pbnRlcmZhY2U6OjxkeW4gSU9sZE5hbWU6OklPbGROYW1lPigpOworICAgICAgICBsZXQgb2xkX25hbWUgPSBuZXdfbmFtZS5hc19iaW5kZXIoKS5pbnRvX2ludGVyZmFjZTo6PGR5biBJT2xkTmFtZTo6SU9sZE5hbWU+KCk7CiAgICAgICAgIGFzc2VydCEob2xkX25hbWUuaXNfb2soKSk7CiAKICAgICAgICAgbGV0IHJlYWxfbmFtZSA9IG9sZF9uYW1lLnVud3JhcCgpLlJlYWxOYW1lKCk7CiAgICAgICAgIGFzc2VydF9lcSEocmVhbF9uYW1lLmFzX3JlZigpLm1hcChTdHJpbmc6OmFzX3N0ciksIE9rKCJOZXdOYW1lIikpOwogICAgIH0pOwogfQorCisjW2Rlcml2ZShEZWJ1ZywgRGVmYXVsdCldCitzdHJ1Y3QgQ2FsbGJhY2sgeworICAgIHJlY2VpdmVkOiBBcmM8TXV0ZXg8T3B0aW9uPFBhcmNlbGFibGVXaXRoTmVzdGVkOjpTdGF0dXM6OlN0YXR1cz4+PiwKK30KKworaW1wbCBJbnRlcmZhY2UgZm9yIENhbGxiYWNrIHt9CisKK2ltcGwgSU5lc3RlZFNlcnZpY2U6OklDYWxsYmFjazo6SUNhbGxiYWNrIGZvciBDYWxsYmFjayB7CisgICAgZm4gZG9uZSgmc2VsZiwgc3Q6IFBhcmNlbGFibGVXaXRoTmVzdGVkOjpTdGF0dXM6OlN0YXR1cykgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKnNlbGYucmVjZWl2ZWQubG9jaygpLnVud3JhcCgpID0gU29tZShzdCk7CisgICAgICAgIE9rKCgpKQorICAgIH0KK30KKworI1t0ZXN0XQorZm4gdGVzdF9uZXN0ZWRfdHlwZSgpIHsKKyAgICBsZXQgc2VydmljZTogYmluZGVyOjpTdHJvbmc8ZHluIElOZXN0ZWRTZXJ2aWNlOjpJTmVzdGVkU2VydmljZT4gPSBiaW5kZXI6OmdldF9pbnRlcmZhY2UoCisgICAgICAgIDxJTmVzdGVkU2VydmljZTo6QnBOZXN0ZWRTZXJ2aWNlIGFzIElOZXN0ZWRTZXJ2aWNlOjpJTmVzdGVkU2VydmljZT46OmdldF9kZXNjcmlwdG9yKCksCisgICAgKQorICAgIC5leHBlY3QoImRpZCBub3QgZ2V0IGJpbmRlciBzZXJ2aWNlIik7CisKKyAgICBsZXQgcCA9IFBhcmNlbGFibGVXaXRoTmVzdGVkOjpQYXJjZWxhYmxlV2l0aE5lc3RlZCB7CisgICAgICAgIHN0YXR1czogUGFyY2VsYWJsZVdpdGhOZXN0ZWQ6OlN0YXR1czo6U3RhdHVzOjpPSywKKyAgICB9OworICAgIC8vIE9LIC0+IE5PVF9PSworICAgIGxldCByZXQgPSBzZXJ2aWNlLmZsaXBTdGF0dXMoJnApOworICAgIGFzc2VydF9lcSEoCisgICAgICAgIHJldCwKKyAgICAgICAgT2soSU5lc3RlZFNlcnZpY2U6OlJlc3VsdDo6UmVzdWx0IHsgc3RhdHVzOiBQYXJjZWxhYmxlV2l0aE5lc3RlZDo6U3RhdHVzOjpTdGF0dXM6Ok5PVF9PSyB9KQorICAgICk7CisgICAgbGV0IHJlY2VpdmVkID0gQXJjOjpuZXcoTXV0ZXg6Om5ldyhOb25lKSk7CisgICAgLy8gTk9UX09LIC0+IE9LIHdpdGggbmVzdGVkIGNhbGxiYWNrIGludGVyZmFjZQorICAgIGxldCBjYiA9IElOZXN0ZWRTZXJ2aWNlOjpJQ2FsbGJhY2s6OkJuQ2FsbGJhY2s6Om5ld19iaW5kZXIoCisgICAgICAgIENhbGxiYWNrIHsgcmVjZWl2ZWQ6IEFyYzo6Y2xvbmUoJnJlY2VpdmVkKSB9LAorICAgICAgICBCaW5kZXJGZWF0dXJlczo6ZGVmYXVsdCgpLAorICAgICk7CisgICAgbGV0IHJldCA9IHNlcnZpY2UuZmxpcFN0YXR1c1dpdGhDYWxsYmFjayhQYXJjZWxhYmxlV2l0aE5lc3RlZDo6U3RhdHVzOjpTdGF0dXM6Ok5PVF9PSywgJmNiKTsKKyAgICBhc3NlcnRfZXEhKHJldCwgT2soKCkpKTsKKyAgICBsZXQgcmVjZWl2ZWQgPSByZWNlaXZlZC5sb2NrKCkudW53cmFwKCk7CisgICAgYXNzZXJ0X2VxISgqcmVjZWl2ZWQsIFNvbWUoUGFyY2VsYWJsZVdpdGhOZXN0ZWQ6OlN0YXR1czo6U3RhdHVzOjpPSykpCit9CisKKyNbdGVzdF0KK2ZuIHRlc3Rfbm9ubnVsbF9iaW5kZXIoKSB7CisgICAgbGV0IHNlcnZpY2UgPSBnZXRfdGVzdF9zZXJ2aWNlKCk7CisgICAgbGV0IHJlc3VsdCA9IHNlcnZpY2UuVGFrZXNBbklCaW5kZXIoJnNlcnZpY2UuYXNfYmluZGVyKCkpOworICAgIGFzc2VydCEocmVzdWx0LmlzX29rKCkpOworfQorCisjW3Rlc3RdCitmbiB0ZXN0X2JpbmRlcl9saXN0X3dpdGhvdXRfbnVsbCgpIHsKKyAgICBsZXQgc2VydmljZSA9IGdldF90ZXN0X3NlcnZpY2UoKTsKKyAgICBsZXQgcmVzdWx0ID0gc2VydmljZS5UYWtlc0FuSUJpbmRlckxpc3QoJltzZXJ2aWNlLmFzX2JpbmRlcigpXSk7CisgICAgYXNzZXJ0IShyZXN1bHQuaXNfb2soKSk7Cit9CisKKyNbdGVzdF0KK2ZuIHRlc3RfbnVsbF9iaW5kZXJfdG9fYW5ub3RhdGVkX21ldGhvZCgpIHsKKyAgICBsZXQgc2VydmljZSA9IGdldF90ZXN0X3NlcnZpY2UoKTsKKyAgICBsZXQgcmVzdWx0ID0gc2VydmljZS5UYWtlc0FOdWxsYWJsZUlCaW5kZXIoTm9uZSk7CisgICAgYXNzZXJ0IShyZXN1bHQuaXNfb2soKSk7Cit9CisKKyNbdGVzdF0KK2ZuIHRlc3RfYmluZGVyX2xpc3Rfd2l0aF9udWxsX3RvX2Fubm90YXRlZF9tZXRob2QoKSB7CisgICAgbGV0IHNlcnZpY2UgPSBnZXRfdGVzdF9zZXJ2aWNlKCk7CisgICAgbGV0IHJlc3VsdCA9IHNlcnZpY2UuVGFrZXNBTnVsbGFibGVJQmluZGVyTGlzdChTb21lKCZbU29tZShzZXJ2aWNlLmFzX2JpbmRlcigpKSwgTm9uZV0pKTsKKyAgICBhc3NlcnQhKHJlc3VsdC5pc19vaygpKTsKK30KKworI1t0ZXN0XQorZm4gdGVzdF9iaW5kZXJfYXJyYXkoKSB7CisgICAgbGV0IHNlcnZpY2UgPSBnZXRfdGVzdF9zZXJ2aWNlKCk7CisgICAgbGV0IGNhbGxiYWNrID0gc2VydmljZQorICAgICAgICAuR2V0Q2FsbGJhY2soZmFsc2UpCisgICAgICAgIC5leHBlY3QoImVycm9yIGNhbGxpbmcgR2V0Q2FsbGJhY2siKQorICAgICAgICAuZXhwZWN0KCJleHBlY3RlZCBTb21lIGZyb20gR2V0Q2FsbGJhY2siKTsKKworICAgIGxldCBtdXQgYXJyYXkgPSB2ZWMhW3NlcnZpY2UuYXNfYmluZGVyKCksIGNhbGxiYWNrLmFzX2JpbmRlcigpXTsKKworICAgIC8vIEphdmEgbmVlZHMgaW5pdGlhbCB2YWx1ZXMgaGVyZSAoY2FuJ3QgcmVzaXplIGFycmF5cykKKyAgICBsZXQgbXV0IHJlcGVhdGVkID0gdmVjIVtEZWZhdWx0OjpkZWZhdWx0KCk7IGFycmF5LmxlbigpXTsKKworICAgIGxldCByZXN1bHQgPSBzZXJ2aWNlLlJldmVyc2VJQmluZGVyQXJyYXkoJmFycmF5LCAmbXV0IHJlcGVhdGVkKTsKKyAgICBhc3NlcnRfZXEhKHJlcGVhdGVkLmludG9faXRlcigpLmNvbGxlY3Q6OjxPcHRpb248VmVjPF8+Pj4oKS5hc19yZWYoKSwgU29tZSgmYXJyYXkpKTsKKyAgICBhcnJheS5yZXZlcnNlKCk7CisgICAgYXNzZXJ0X2VxIShyZXN1bHQsIE9rKGFycmF5KSk7Cit9CisKKyNbdGVzdF0KK2ZuIHRlc3RfbnVsbGFibGVfYmluZGVyX2FycmF5KCkgeworICAgIGxldCBzZXJ2aWNlID0gZ2V0X3Rlc3Rfc2VydmljZSgpOworICAgIGxldCBtdXQgYXJyYXkgPSB2ZWMhW1NvbWUoc2VydmljZS5hc19iaW5kZXIoKSksIE5vbmVdOworCisgICAgLy8gSmF2YSBuZWVkcyBpbml0aWFsIHZhbHVlcyBoZXJlIChjYW4ndCByZXNpemUgYXJyYXlzKQorICAgIGxldCBtdXQgcmVwZWF0ZWQgPSBTb21lKHZlYyFbRGVmYXVsdDo6ZGVmYXVsdCgpOyBhcnJheS5sZW4oKV0pOworCisgICAgbGV0IHJlc3VsdCA9IHNlcnZpY2UuUmV2ZXJzZU51bGxhYmxlSUJpbmRlckFycmF5KFNvbWUoJmFycmF5Wy4uXSksICZtdXQgcmVwZWF0ZWQpOworICAgIGFzc2VydF9lcSEocmVwZWF0ZWQuYXNfcmVmKCksIFNvbWUoJmFycmF5KSk7CisgICAgYXJyYXkucmV2ZXJzZSgpOworICAgIGFzc2VydF9lcSEocmVzdWx0LCBPayhTb21lKGFycmF5KSkpOworfQorCisjW3Rlc3RdCitmbiB0ZXN0X3JlYWRfd3JpdGVfZml4ZWRfc2l6ZV9hcnJheSgpIHsKKyAgICBsZXQgbXV0IHBhcmNlbCA9IFBhcmNlbDo6bmV3KCk7CisgICAgbGV0IG11dCBwOiBGaXhlZFNpemVBcnJheUV4YW1wbGUgPSBEZWZhdWx0OjpkZWZhdWx0KCk7CisgICAgcC5ieXRlTWF0cml4WzBdWzBdID0gMDsKKyAgICBwLmJ5dGVNYXRyaXhbMF1bMV0gPSAxOworICAgIHAuYnl0ZU1hdHJpeFsxXVswXSA9IDI7CisgICAgcC5ieXRlTWF0cml4WzFdWzFdID0gMzsKKworICAgIHAuZmxvYXRNYXRyaXhbMF1bMF0gPSAwLjA7CisgICAgcC5mbG9hdE1hdHJpeFswXVsxXSA9IDEuMDsKKyAgICBwLmZsb2F0TWF0cml4WzFdWzBdID0gMi4wOworICAgIHAuZmxvYXRNYXRyaXhbMV1bMV0gPSAzLjA7CisKKyAgICBwLmJvb2xOdWxsYWJsZUFycmF5ID0gU29tZShbdHJ1ZSwgZmFsc2VdKTsKKyAgICBwLmJ5dGVOdWxsYWJsZUFycmF5ID0gU29tZShbNDIsIDBdKTsKKyAgICBwLnN0cmluZ051bGxhYmxlQXJyYXkgPSBTb21lKFtTb21lKCJoZWxsbyIuaW50bygpKSwgU29tZSgid29ybGQiLmludG8oKSldKTsKKworICAgIHAuYm9vbE51bGxhYmxlTWF0cml4ID0gU29tZShbW3RydWUsIGZhbHNlXSwgRGVmYXVsdDo6ZGVmYXVsdCgpXSk7CisgICAgcC5ieXRlTnVsbGFibGVNYXRyaXggPSBTb21lKFtbNDIsIDBdLCBEZWZhdWx0OjpkZWZhdWx0KCldKTsKKyAgICBwLnN0cmluZ051bGxhYmxlTWF0cml4ID0KKyAgICAgICAgU29tZShbW1NvbWUoImhlbGxvIi5pbnRvKCkpLCBTb21lKCJ3b3JsZCIuaW50bygpKV0sIERlZmF1bHQ6OmRlZmF1bHQoKV0pOworCisgICAgYXNzZXJ0X2VxIShwYXJjZWwud3JpdGUoJnApLCBPaygoKSkpOworICAgIHVuc2FmZSB7CisgICAgICAgIHBhcmNlbC5zZXRfZGF0YV9wb3NpdGlvbigwKS51bndyYXAoKTsKKyAgICB9CisgICAgYXNzZXJ0X2VxIShwLCBwYXJjZWwucmVhZDo6PEZpeGVkU2l6ZUFycmF5RXhhbXBsZT4oKS51bndyYXAoKSk7Cit9CisKKyNbdGVzdF0KK2ZuIHRlc3RfZml4ZWRfc2l6ZV9hcnJheV91c2VzX2FycmF5X29wdGltaXphdGlvbigpIHsKKyAgICBsZXQgbXV0IHBhcmNlbCA9IFBhcmNlbDo6bmV3KCk7CisgICAgbGV0IGJ5dGVfYXJyYXkgPSBbWzF1OCwgMnU4LCAzdThdLCBbNHU4LCA1dTgsIDZ1OF1dOworICAgIGFzc2VydF9lcSEocGFyY2VsLndyaXRlKCZieXRlX2FycmF5KSwgT2soKCkpKTsKKyAgICB1bnNhZmUgeworICAgICAgICBwYXJjZWwuc2V0X2RhdGFfcG9zaXRpb24oMCkudW53cmFwKCk7CisgICAgfQorICAgIGFzc2VydF9lcSEocGFyY2VsLnJlYWQ6OjxpMzI+KCksIE9rKDJpMzIpKTsKKyAgICBhc3NlcnRfZXEhKHBhcmNlbC5yZWFkOjo8VmVjPHU4Pj4oKSwgT2sodmVjIVsxdTgsIDJ1OCwgM3U4XSkpOworICAgIGFzc2VydF9lcSEocGFyY2VsLnJlYWQ6OjxWZWM8dTg+PigpLCBPayh2ZWMhWzR1OCwgNXU4LCA2dThdKSk7Cit9CisKK21hY3JvX3J1bGVzISB0ZXN0X3JlcGVhdF9maXhlZF9zaXplX2FycmF5IHsKKyAgICAoJHNlcnZpY2U6aWRlbnQsICRmdW5jOmlkZW50LCAkdmFsdWU6ZXhwcikgPT4geworICAgICAgICBsZXQgYXJyYXkgPSAkdmFsdWU7CisgICAgICAgIGxldCBtdXQgcmVwZWF0ZWQgPSBEZWZhdWx0OjpkZWZhdWx0KCk7CisgICAgICAgIGxldCByZXN1bHQgPSAkc2VydmljZS4kZnVuYygmYXJyYXksICZtdXQgcmVwZWF0ZWQpLnVud3JhcCgpOworICAgICAgICBhc3NlcnRfZXEhKHJlcGVhdGVkLCBhcnJheSk7CisgICAgICAgIGFzc2VydF9lcSEocmVzdWx0LCBhcnJheSk7CisgICAgfTsKK30KKworbWFjcm9fcnVsZXMhIHRlc3RfcmVwZWF0X2ZpeGVkX3NpemVfYXJyYXlfMWRfYmluZGVyIHsKKyAgICAoJHNlcnZpY2U6aWRlbnQsICRmdW5jOmlkZW50LCAkdmFsdWU6ZXhwcikgPT4geworICAgICAgICBsZXQgYXJyYXkgPSAkdmFsdWU7CisgICAgICAgIGxldCBtdXQgcmVwZWF0ZWQgPSBEZWZhdWx0OjpkZWZhdWx0KCk7CisgICAgICAgIGxldCByZXN1bHQgPSAkc2VydmljZS4kZnVuYygmYXJyYXksICZtdXQgcmVwZWF0ZWQpLnVud3JhcCgpOworICAgICAgICBhc3NlcnRfZXEhKHJlc3VsdCwgYXJyYXkuY2xvbmUoKSk7CisgICAgICAgIGFzc2VydF9lcSEocmVwZWF0ZWQsIGFycmF5Lm1hcChTb21lKSk7CisgICAgfTsKK30KKworbWFjcm9fcnVsZXMhIHRlc3RfcmVwZWF0X2ZpeGVkX3NpemVfYXJyYXlfMmRfYmluZGVyIHsKKyAgICAoJHNlcnZpY2U6aWRlbnQsICRmdW5jOmlkZW50LCAkdmFsdWU6ZXhwcikgPT4geworICAgICAgICBsZXQgYXJyYXkgPSAkdmFsdWU7CisgICAgICAgIGxldCBtdXQgcmVwZWF0ZWQgPSBEZWZhdWx0OjpkZWZhdWx0KCk7CisgICAgICAgIGxldCByZXN1bHQgPSAkc2VydmljZS4kZnVuYygmYXJyYXksICZtdXQgcmVwZWF0ZWQpLnVud3JhcCgpOworICAgICAgICBhc3NlcnRfZXEhKHJlc3VsdCwgYXJyYXkuY2xvbmUoKSk7CisgICAgICAgIGFzc2VydF9lcSEocmVwZWF0ZWQsIGFycmF5Lm1hcCh8cm93fCByb3cubWFwKFNvbWUpKSk7CisgICAgfTsKK30KKworI1t0ZXN0XQorZm4gdGVzdF9maXhlZF9zaXplX2FycmF5X292ZXJfYmluZGVyKCkgeworICAgIGxldCB0ZXN0X3NlcnZpY2UgPSBnZXRfdGVzdF9zZXJ2aWNlKCk7CisgICAgbGV0IHNlcnZpY2U6IGJpbmRlcjo6U3Ryb25nPGR5biBJUmVwZWF0Rml4ZWRTaXplQXJyYXk+ID0KKyAgICAgICAgYmluZGVyOjpnZXRfaW50ZXJmYWNlKDxCcFJlcGVhdEZpeGVkU2l6ZUFycmF5IGFzIElSZXBlYXRGaXhlZFNpemVBcnJheT46OmdldF9kZXNjcmlwdG9yKCkpCisgICAgICAgICAgICAuZXhwZWN0KCJkaWQgbm90IGdldCBiaW5kZXIgc2VydmljZSIpOworCisgICAgdGVzdF9yZXBlYXRfZml4ZWRfc2l6ZV9hcnJheSEoc2VydmljZSwgUmVwZWF0Qnl0ZXMsIFsxdTgsIDJ1OCwgM3U4XSk7CisgICAgdGVzdF9yZXBlYXRfZml4ZWRfc2l6ZV9hcnJheSEoc2VydmljZSwgUmVwZWF0SW50cywgWzFpMzIsIDJpMzIsIDNpMzJdKTsKKworICAgIGxldCBiaW5kZXIxID0gdGVzdF9zZXJ2aWNlLmFzX2JpbmRlcigpOworICAgIGxldCBiaW5kZXIyID0gdGVzdF9zZXJ2aWNlCisgICAgICAgIC5HZXRDYWxsYmFjayhmYWxzZSkKKyAgICAgICAgLmV4cGVjdCgiZXJyb3IgY2FsbGluZyBHZXRDYWxsYmFjayIpCisgICAgICAgIC5leHBlY3QoImV4cGVjdGVkIFNvbWUgZnJvbSBHZXRDYWxsYmFjayIpCisgICAgICAgIC5hc19iaW5kZXIoKTsKKyAgICBsZXQgYmluZGVyMyA9IHNlcnZpY2UuYXNfYmluZGVyKCk7CisgICAgdGVzdF9yZXBlYXRfZml4ZWRfc2l6ZV9hcnJheV8xZF9iaW5kZXIhKAorICAgICAgICBzZXJ2aWNlLAorICAgICAgICBSZXBlYXRCaW5kZXJzLAorICAgICAgICBbYmluZGVyMS5jbG9uZSgpLCBiaW5kZXIyLmNsb25lKCksIGJpbmRlcjMuY2xvbmUoKV0KKyAgICApOworCisgICAgbGV0IHAxID0gSW50UGFyY2VsYWJsZSB7IHZhbHVlOiAxIH07CisgICAgbGV0IHAyID0gSW50UGFyY2VsYWJsZSB7IHZhbHVlOiAyIH07CisgICAgbGV0IHAzID0gSW50UGFyY2VsYWJsZSB7IHZhbHVlOiAzIH07CisgICAgdGVzdF9yZXBlYXRfZml4ZWRfc2l6ZV9hcnJheSEoc2VydmljZSwgUmVwZWF0UGFyY2VsYWJsZXMsIFtwMSwgcDIsIHAzXSk7CisKKyAgICB0ZXN0X3JlcGVhdF9maXhlZF9zaXplX2FycmF5IShzZXJ2aWNlLCBSZXBlYXQyZEJ5dGVzLCBbWzF1OCwgMnU4LCAzdThdLCBbMXU4LCAydTgsIDN1OF1dKTsKKyAgICB0ZXN0X3JlcGVhdF9maXhlZF9zaXplX2FycmF5IShzZXJ2aWNlLCBSZXBlYXQyZEludHMsIFtbMWkzMiwgMmkzMiwgM2kzMl0sIFsxaTMyLCAyaTMyLCAzaTMyXV0pOworCisgICAgdGVzdF9yZXBlYXRfZml4ZWRfc2l6ZV9hcnJheV8yZF9iaW5kZXIhKAorICAgICAgICBzZXJ2aWNlLAorICAgICAgICBSZXBlYXQyZEJpbmRlcnMsCisgICAgICAgIFtbYmluZGVyMS5jbG9uZSgpLCBiaW5kZXIyLmNsb25lKCksIGJpbmRlcjMuY2xvbmUoKV0sIFtiaW5kZXIxLCBiaW5kZXIyLCBiaW5kZXIzXV0KKyAgICApOworCisgICAgdGVzdF9yZXBlYXRfZml4ZWRfc2l6ZV9hcnJheSEoc2VydmljZSwgUmVwZWF0MmRQYXJjZWxhYmxlcywgW1twMSwgcDIsIHAzXSwgW3AxLCBwMiwgcDNdXSk7Cit9CisKKyNbdGVzdF0KK2ZuIHRlc3RfcGluZygpIHsKKyAgICBsZXQgdGVzdF9zZXJ2aWNlID0gZ2V0X3Rlc3Rfc2VydmljZSgpOworICAgIGFzc2VydF9lcSEodGVzdF9zZXJ2aWNlLmFzX2JpbmRlcigpLnBpbmdfYmluZGVyKCksIE9rKCgpKSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9ydXN0L3Rlc3Rfc2VydmljZS5ycyBiL3Rlc3RzL3J1c3QvdGVzdF9zZXJ2aWNlLnJzCmluZGV4IDkwMTk3NzUuLjNhNWMwOWMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3J1c3QvdGVzdF9zZXJ2aWNlLnJzCisrKyBiL3Rlc3RzL3J1c3QvdGVzdF9zZXJ2aWNlLnJzCkBAIC0xNiwxMyArMTYsMjAgQEAKIAogLy8hIFRlc3QgUnVzdCBzZXJ2aWNlIGZvciB0aGUgQUlETCBjb21waWxlci4KIAordXNlIGFpZGxfdGVzdF9maXhlZHNpemVhcnJheTo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6eworICAgIElSZXBlYXRGaXhlZFNpemVBcnJheSwgSW50UGFyY2VsYWJsZTo6SW50UGFyY2VsYWJsZSwKK307Cit1c2UgYWlkbF90ZXN0X2ludGVyZmFjZTo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6eworICAgIElOZXN0ZWRTZXJ2aWNlLCBQYXJjZWxhYmxlV2l0aE5lc3RlZCwKK307CiB1c2UgYWlkbF90ZXN0X2ludGVyZmFjZTo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6ewotICAgIHNlbGYsIEJuVGVzdFNlcnZpY2UsIEJwVGVzdFNlcnZpY2UsCisgICAgc2VsZiwgQm5UZXN0U2VydmljZSwgQnBUZXN0U2VydmljZSwgRW1wdHk6OkVtcHR5LAogfTsKIHVzZSBhaWRsX3Rlc3RfaW50ZXJmYWNlOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6eworICAgIGV4dGVuc2lvbjo6RXh0ZW5kYWJsZVBhcmNlbGFibGU6OkV4dGVuZGFibGVQYXJjZWxhYmxlLCBleHRlbnNpb246Ok15RXh0OjpNeUV4dCwKICAgICBCYWNrZW5kVHlwZTo6QmFja2VuZFR5cGUsIEJ5dGVFbnVtOjpCeXRlRW51bSwgQ29uc3RhbnRFeHByZXNzaW9uRW51bTo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSwKLSAgICBJTmFtZWRDYWxsYmFjaywgSU5ld05hbWUsIElPbGROYW1lLCBJbnRFbnVtOjpJbnRFbnVtLCBMb25nRW51bTo6TG9uZ0VudW0sIFN0cnVjdHVyZWRQYXJjZWxhYmxlLAotICAgIFVuaW9uLAorICAgIElOYW1lZENhbGxiYWNrLCBJTmV3TmFtZSwgSU9sZE5hbWUsIEludEVudW06OkludEVudW0sIExvbmdFbnVtOjpMb25nRW51bSwKKyAgICBSZWN1cnNpdmVMaXN0OjpSZWN1cnNpdmVMaXN0LCBTdHJ1Y3R1cmVkUGFyY2VsYWJsZSwgVW5pb24sCiB9OwogdXNlIGFpZGxfdGVzdF9pbnRlcmZhY2U6OmJpbmRlcjo6ewogICAgIHNlbGYsIEJpbmRlckZlYXR1cmVzLCBJbnRlcmZhY2UsIFBhcmNlbEZpbGVEZXNjcmlwdG9yLCBTcElCaW5kZXIsCkBAIC0xNzQsNiArMTgxLDg3IEBACiAgICAgICAgIHNlcnZpY2UuR2V0TmFtZSgpLm1hcCh8Zm91bmRfbmFtZXwgZm91bmRfbmFtZSA9PSBuYW1lKQogICAgIH0KIAorICAgIGZuIEdldEludGVyZmFjZUFycmF5KAorICAgICAgICAmc2VsZiwKKyAgICAgICAgbmFtZXM6ICZbU3RyaW5nXSwKKyAgICApIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxiaW5kZXI6OlN0cm9uZzxkeW4gSU5hbWVkQ2FsbGJhY2s6OklOYW1lZENhbGxiYWNrPj4+IHsKKyAgICAgICAgbmFtZXMuaXRlcigpLm1hcCh8bmFtZXwgc2VsZi5HZXRPdGhlclRlc3RTZXJ2aWNlKG5hbWUpKS5jb2xsZWN0KCkKKyAgICB9CisKKyAgICBmbiBWZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VBcnJheSgKKyAgICAgICAgJnNlbGYsCisgICAgICAgIHNlcnZpY2VzOiAmW2JpbmRlcjo6U3Ryb25nPGR5biBJTmFtZWRDYWxsYmFjazo6SU5hbWVkQ2FsbGJhY2s+XSwKKyAgICAgICAgbmFtZXM6ICZbU3RyaW5nXSwKKyAgICApIC0+IGJpbmRlcjo6UmVzdWx0PGJvb2w+IHsKKyAgICAgICAgaWYgc2VydmljZXMubGVuKCkgPT0gbmFtZXMubGVuKCkgeworICAgICAgICAgICAgZm9yIChzLCBuKSBpbiBzZXJ2aWNlcy5pdGVyKCkuemlwKG5hbWVzKSB7CisgICAgICAgICAgICAgICAgaWYgIXNlbGYuVmVyaWZ5TmFtZShzLCBuKT8geworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2soZmFsc2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE9rKHRydWUpCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBPayhmYWxzZSkKKyAgICAgICAgfQorICAgIH0KKworICAgIGZuIEdldE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoCisgICAgICAgICZzZWxmLAorICAgICAgICBuYW1lczogT3B0aW9uPCZbT3B0aW9uPFN0cmluZz5dPiwKKyAgICApIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBJTmFtZWRDYWxsYmFjazo6SU5hbWVkQ2FsbGJhY2s+Pj4+PgorICAgIHsKKyAgICAgICAgaWYgbGV0IFNvbWUobmFtZXMpID0gbmFtZXMgeworICAgICAgICAgICAgbGV0IG11dCBzZXJ2aWNlcyA9IHZlYyFbXTsKKyAgICAgICAgICAgIGZvciBuYW1lIGluIG5hbWVzIHsKKyAgICAgICAgICAgICAgICBpZiBsZXQgU29tZShuYW1lKSA9IG5hbWUgeworICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlcy5wdXNoKFNvbWUoc2VsZi5HZXRPdGhlclRlc3RTZXJ2aWNlKG5hbWUpPykpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VzLnB1c2goTm9uZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgT2soU29tZShzZXJ2aWNlcykpCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBPayhOb25lKQorICAgICAgICB9CisgICAgfQorCisgICAgZm4gVmVyaWZ5TmFtZXNXaXRoTnVsbGFibGVJbnRlcmZhY2VBcnJheSgKKyAgICAgICAgJnNlbGYsCisgICAgICAgIHNlcnZpY2VzOiBPcHRpb248JltPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIElOYW1lZENhbGxiYWNrOjpJTmFtZWRDYWxsYmFjaz4+XT4sCisgICAgICAgIG5hbWVzOiBPcHRpb248JltPcHRpb248U3RyaW5nPl0+LAorICAgICkgLT4gYmluZGVyOjpSZXN1bHQ8Ym9vbD4geworICAgICAgICBpZiBsZXQgKFNvbWUoc2VydmljZXMpLCBTb21lKG5hbWVzKSkgPSAoc2VydmljZXMsIG5hbWVzKSB7CisgICAgICAgICAgICBmb3IgKHMsIG4pIGluIHNlcnZpY2VzLml0ZXIoKS56aXAobmFtZXMpIHsKKyAgICAgICAgICAgICAgICBpZiBsZXQgKFNvbWUocyksIFNvbWUobikpID0gKHMsIG4pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgIXNlbGYuVmVyaWZ5TmFtZShzLCBuKT8geworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9rKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiBzLmlzX3NvbWUoKSB8fCBuLmlzX3NvbWUoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPayhmYWxzZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgT2sodHJ1ZSkKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE9rKHNlcnZpY2VzLmlzX25vbmUoKSAmJiBuYW1lcy5pc19ub25lKCkpCisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbiBHZXRJbnRlcmZhY2VMaXN0KAorICAgICAgICAmc2VsZiwKKyAgICAgICAgbmFtZXM6IE9wdGlvbjwmW09wdGlvbjxTdHJpbmc+XT4sCisgICAgKSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gSU5hbWVkQ2FsbGJhY2s6OklOYW1lZENhbGxiYWNrPj4+Pj4KKyAgICB7CisgICAgICAgIHNlbGYuR2V0TnVsbGFibGVJbnRlcmZhY2VBcnJheShuYW1lcykKKyAgICB9CisKKyAgICBmbiBWZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VMaXN0KAorICAgICAgICAmc2VsZiwKKyAgICAgICAgc2VydmljZXM6IE9wdGlvbjwmW09wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gSU5hbWVkQ2FsbGJhY2s6OklOYW1lZENhbGxiYWNrPj5dPiwKKyAgICAgICAgbmFtZXM6IE9wdGlvbjwmW09wdGlvbjxTdHJpbmc+XT4sCisgICAgKSAtPiBiaW5kZXI6OlJlc3VsdDxib29sPiB7CisgICAgICAgIHNlbGYuVmVyaWZ5TmFtZXNXaXRoTnVsbGFibGVJbnRlcmZhY2VBcnJheShzZXJ2aWNlcywgbmFtZXMpCisgICAgfQorCiAgICAgZm4gUmVwZWF0UGFyY2VsRmlsZURlc2NyaXB0b3IoCiAgICAgICAgICZzZWxmLAogICAgICAgICByZWFkOiAmUGFyY2VsRmlsZURlc2NyaXB0b3IsCkBAIC0yMDksMTMgKzI5NywxMyBAQAogICAgICAgICBPayhpbnB1dC5tYXAoU3RyaW5nOjpmcm9tKSkKICAgICB9CiAKLSAgICBmbiBSZXBlYXROdWxsYWJsZVBhcmNlbGFibGUoCi0gICAgICAgICZzZWxmLAotICAgICAgICBpbnB1dDogT3B0aW9uPCZTdHJ1Y3R1cmVkUGFyY2VsYWJsZTo6U3RydWN0dXJlZFBhcmNlbGFibGU+LAotICAgICkgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFN0cnVjdHVyZWRQYXJjZWxhYmxlOjpTdHJ1Y3R1cmVkUGFyY2VsYWJsZT4+IHsKKyAgICBmbiBSZXBlYXROdWxsYWJsZVBhcmNlbGFibGUoJnNlbGYsIGlucHV0OiBPcHRpb248JkVtcHR5PikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPEVtcHR5Pj4gewogICAgICAgICBPayhpbnB1dC5jbG9uZWQoKSkKICAgICB9CiAKKyAgICBpbXBsX3JlcGVhdF9udWxsYWJsZSEge1JlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUFycmF5LCBPcHRpb248RW1wdHk+fQorICAgIGltcGxfcmVwZWF0X251bGxhYmxlISB7UmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlTGlzdCwgT3B0aW9uPEVtcHR5Pn0KKwogICAgIGZuIFRha2VzQW5JQmluZGVyKCZzZWxmLCBfOiAmU3BJQmluZGVyKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4gewogICAgICAgICBPaygoKSkKICAgICB9CkBAIC0yMjQsNiArMzEyLDE0IEBACiAgICAgICAgIE9rKCgpKQogICAgIH0KIAorICAgIGZuIFRha2VzQW5JQmluZGVyTGlzdCgmc2VsZiwgXzogJltTcElCaW5kZXJdKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiBUYWtlc0FOdWxsYWJsZUlCaW5kZXJMaXN0KCZzZWxmLCBfOiBPcHRpb248JltPcHRpb248U3BJQmluZGVyPl0+KSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKICAgICBmbiBSZXZlcnNlTnVsbGFibGVVdGY4Q3BwU3RyaW5nKAogICAgICAgICAmc2VsZiwKICAgICAgICAgaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxTdHJpbmc+XT4sCkBAIC0yODksMTggKzM4NSw3NSBAQAogICAgICAgICBPaygoKSkKICAgICB9CiAKKyAgICBmbiBSZXBlYXRFeHRlbmRhYmxlUGFyY2VsYWJsZSgKKyAgICAgICAgJnNlbGYsCisgICAgICAgIGVwOiAmRXh0ZW5kYWJsZVBhcmNlbGFibGUsCisgICAgICAgIGVwMjogJm11dCBFeHRlbmRhYmxlUGFyY2VsYWJsZSwKKyAgICApIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7CisgICAgICAgIGVwMi5hID0gZXAuYTsKKyAgICAgICAgZXAyLmIgPSBlcC5iLmNsb25lKCk7CisKKyAgICAgICAgbGV0IG15X2V4dCA9IGVwLmV4dC5nZXRfcGFyY2VsYWJsZTo6PE15RXh0PigpPzsKKyAgICAgICAgaWYgbGV0IFNvbWUobXlfZXh0KSA9IG15X2V4dCB7CisgICAgICAgICAgICBlcDIuZXh0LnNldF9wYXJjZWxhYmxlKG15X2V4dCk/OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZXAyLmV4dC5yZXNldCgpOworICAgICAgICB9CisKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gUmV2ZXJzZUxpc3QoJnNlbGYsIGxpc3Q6ICZSZWN1cnNpdmVMaXN0KSAtPiBiaW5kZXI6OlJlc3VsdDxSZWN1cnNpdmVMaXN0PiB7CisgICAgICAgIGxldCBtdXQgcmV2ZXJzZWQ6IE9wdGlvbjxSZWN1cnNpdmVMaXN0PiA9IE5vbmU7CisgICAgICAgIGxldCBtdXQgY3VyOiBPcHRpb248JlJlY3Vyc2l2ZUxpc3Q+ID0gU29tZShsaXN0KTsKKyAgICAgICAgd2hpbGUgbGV0IFNvbWUobm9kZSkgPSBjdXIgeworICAgICAgICAgICAgcmV2ZXJzZWQgPSBTb21lKFJlY3Vyc2l2ZUxpc3QgeyB2YWx1ZTogbm9kZS52YWx1ZSwgbmV4dDogcmV2ZXJzZWQubWFwKEJveDo6bmV3KSB9KTsKKyAgICAgICAgICAgIGN1ciA9IG5vZGUubmV4dC5hc19yZWYoKS5tYXAofG58IG4uYXNfcmVmKCkpOworICAgICAgICB9CisgICAgICAgIC8vIGBsaXN0YCBpcyBhbHdheXMgbm90IGVtcHR5LCBzbyBpcyBgcmV2ZXJzZWRgLgorICAgICAgICBPayhyZXZlcnNlZC51bndyYXAoKSkKKyAgICB9CisKKyAgICBmbiBSZXZlcnNlSUJpbmRlckFycmF5KAorICAgICAgICAmc2VsZiwKKyAgICAgICAgaW5wdXQ6ICZbU3BJQmluZGVyXSwKKyAgICAgICAgcmVwZWF0ZWQ6ICZtdXQgVmVjPE9wdGlvbjxTcElCaW5kZXI+PiwKKyAgICApIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxTcElCaW5kZXI+PiB7CisgICAgICAgICpyZXBlYXRlZCA9IGlucHV0Lml0ZXIoKS5jbG9uZWQoKS5tYXAoU29tZSkuY29sbGVjdCgpOworICAgICAgICBPayhpbnB1dC5pdGVyKCkucmV2KCkuY2xvbmVkKCkuY29sbGVjdCgpKQorICAgIH0KKworICAgIGZuIFJldmVyc2VOdWxsYWJsZUlCaW5kZXJBcnJheSgKKyAgICAgICAgJnNlbGYsCisgICAgICAgIGlucHV0OiBPcHRpb248JltPcHRpb248U3BJQmluZGVyPl0+LAorICAgICAgICByZXBlYXRlZDogJm11dCBPcHRpb248VmVjPE9wdGlvbjxTcElCaW5kZXI+Pj4sCisgICAgKSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxTcElCaW5kZXI+Pj4+IHsKKyAgICAgICAgbGV0IGlucHV0ID0gaW5wdXQuZXhwZWN0KCJpbnB1dCBpcyBudWxsIik7CisgICAgICAgICpyZXBlYXRlZCA9IFNvbWUoaW5wdXQudG9fdmVjKCkpOworICAgICAgICBPayhTb21lKGlucHV0Lml0ZXIoKS5yZXYoKS5jbG9uZWQoKS5jb2xsZWN0KCkpKQorICAgIH0KKwogICAgIGZuIEdldE9sZE5hbWVJbnRlcmZhY2UoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6U3Ryb25nPGR5biBJT2xkTmFtZTo6SU9sZE5hbWU+PiB7Ci0gICAgICAgIE9rKElPbGROYW1lOjpCbk9sZE5hbWU6Om5ld19iaW5kZXIoCi0gICAgICAgICAgICBPbGROYW1lLAotICAgICAgICAgICAgQmluZGVyRmVhdHVyZXM6OmRlZmF1bHQoKSwKLSAgICAgICAgKSkKKyAgICAgICAgT2soSU9sZE5hbWU6OkJuT2xkTmFtZTo6bmV3X2JpbmRlcihPbGROYW1lLCBCaW5kZXJGZWF0dXJlczo6ZGVmYXVsdCgpKSkKICAgICB9CiAKICAgICBmbiBHZXROZXdOYW1lSW50ZXJmYWNlKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OlN0cm9uZzxkeW4gSU5ld05hbWU6OklOZXdOYW1lPj4gewotICAgICAgICBPayhJTmV3TmFtZTo6Qm5OZXdOYW1lOjpuZXdfYmluZGVyKAotICAgICAgICAgICAgTmV3TmFtZSwKLSAgICAgICAgICAgIEJpbmRlckZlYXR1cmVzOjpkZWZhdWx0KCksCi0gICAgICAgICkpCisgICAgICAgIE9rKElOZXdOYW1lOjpCbk5ld05hbWU6Om5ld19iaW5kZXIoTmV3TmFtZSwgQmluZGVyRmVhdHVyZXM6OmRlZmF1bHQoKSkpCisgICAgfQorCisgICAgZm4gR2V0VW5pb25UYWdzKCZzZWxmLCBpbnB1dDogJltVbmlvbjo6VW5pb25dKSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8VW5pb246OlRhZzo6VGFnPj4geworICAgICAgICBPayhpbnB1dAorICAgICAgICAgICAgLml0ZXIoKQorICAgICAgICAgICAgLm1hcCh8dXwgbWF0Y2ggdSB7CisgICAgICAgICAgICAgICAgVW5pb246OlVuaW9uOjpOcyhfKSA9PiBVbmlvbjo6VGFnOjpUYWc6Om5zLAorICAgICAgICAgICAgICAgIFVuaW9uOjpVbmlvbjo6TihfKSA9PiBVbmlvbjo6VGFnOjpUYWc6Om4sCisgICAgICAgICAgICAgICAgVW5pb246OlVuaW9uOjpNKF8pID0+IFVuaW9uOjpUYWc6OlRhZzo6bSwKKyAgICAgICAgICAgICAgICBVbmlvbjo6VW5pb246OlMoXykgPT4gVW5pb246OlRhZzo6VGFnOjpzLAorICAgICAgICAgICAgICAgIFVuaW9uOjpVbmlvbjo6SWJpbmRlcihfKSA9PiBVbmlvbjo6VGFnOjpUYWc6OmliaW5kZXIsCisgICAgICAgICAgICAgICAgVW5pb246OlVuaW9uOjpTcyhfKSA9PiBVbmlvbjo6VGFnOjpUYWc6OnNzLAorICAgICAgICAgICAgICAgIFVuaW9uOjpVbmlvbjo6QmUoXykgPT4gVW5pb246OlRhZzo6VGFnOjpiZSwKKyAgICAgICAgICAgIH0pCisgICAgICAgICAgICAuY29sbGVjdDo6PFZlYzxfPj4oKSkKICAgICB9CiAKICAgICBmbiBHZXRDcHBKYXZhVGVzdHMoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxTcElCaW5kZXI+PiB7CkBAIC0zMjgsMTEgKzQ4MSwxMTAgQEAKICAgICBmbiByZXR1cm5zTGVuZ3RoT2ZGb29BcnJheSgmc2VsZiwgZm9vczogJltGb29dKSAtPiBiaW5kZXI6OlJlc3VsdDxpMzI+IHsKICAgICAgICAgT2soZm9vcy5sZW4oKSBhcyBpMzIpCiAgICAgfQotICAgIGZuIGlnbm9yZVBhcmNlbGFibGVzQW5kUmVwZWF0SW50KCZzZWxmLCBfaW5fZm9vOiAmRm9vLCBfaW5vdXRfZm9vOiAmbXV0IEZvbywgX291dF9mb286ICZtdXQgRm9vLCB2YWx1ZTogaTMyKSAtPiBiaW5kZXI6OlJlc3VsdDxpMzI+IHsKKyAgICBmbiBpZ25vcmVQYXJjZWxhYmxlc0FuZFJlcGVhdEludCgKKyAgICAgICAgJnNlbGYsCisgICAgICAgIF9pbl9mb286ICZGb28sCisgICAgICAgIF9pbm91dF9mb286ICZtdXQgRm9vLAorICAgICAgICBfb3V0X2ZvbzogJm11dCBGb28sCisgICAgICAgIHZhbHVlOiBpMzIsCisgICAgKSAtPiBiaW5kZXI6OlJlc3VsdDxpMzI+IHsKICAgICAgICAgT2sodmFsdWUpCiAgICAgfQogfQogCitzdHJ1Y3QgTmVzdGVkU2VydmljZTsKKworaW1wbCBJbnRlcmZhY2UgZm9yIE5lc3RlZFNlcnZpY2Uge30KKworaW1wbCBJTmVzdGVkU2VydmljZTo6SU5lc3RlZFNlcnZpY2UgZm9yIE5lc3RlZFNlcnZpY2UgeworICAgIGZuIGZsaXBTdGF0dXMoCisgICAgICAgICZzZWxmLAorICAgICAgICBwOiAmUGFyY2VsYWJsZVdpdGhOZXN0ZWQ6OlBhcmNlbGFibGVXaXRoTmVzdGVkLAorICAgICkgLT4gYmluZGVyOjpSZXN1bHQ8SU5lc3RlZFNlcnZpY2U6OlJlc3VsdDo6UmVzdWx0PiB7CisgICAgICAgIGlmIHAuc3RhdHVzID09IFBhcmNlbGFibGVXaXRoTmVzdGVkOjpTdGF0dXM6OlN0YXR1czo6T0sgeworICAgICAgICAgICAgT2soSU5lc3RlZFNlcnZpY2U6OlJlc3VsdDo6UmVzdWx0IHsKKyAgICAgICAgICAgICAgICBzdGF0dXM6IFBhcmNlbGFibGVXaXRoTmVzdGVkOjpTdGF0dXM6OlN0YXR1czo6Tk9UX09LLAorICAgICAgICAgICAgfSkKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE9rKElOZXN0ZWRTZXJ2aWNlOjpSZXN1bHQ6OlJlc3VsdCB7IHN0YXR1czogUGFyY2VsYWJsZVdpdGhOZXN0ZWQ6OlN0YXR1czo6U3RhdHVzOjpPSyB9KQorICAgICAgICB9CisgICAgfQorICAgIGZuIGZsaXBTdGF0dXNXaXRoQ2FsbGJhY2soCisgICAgICAgICZzZWxmLAorICAgICAgICBzdDogUGFyY2VsYWJsZVdpdGhOZXN0ZWQ6OlN0YXR1czo6U3RhdHVzLAorICAgICAgICBjYjogJmJpbmRlcjo6U3Ryb25nPGR5biBJTmVzdGVkU2VydmljZTo6SUNhbGxiYWNrOjpJQ2FsbGJhY2s+LAorICAgICkgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgaWYgc3QgPT0gUGFyY2VsYWJsZVdpdGhOZXN0ZWQ6OlN0YXR1czo6U3RhdHVzOjpPSyB7CisgICAgICAgICAgICBjYi5kb25lKFBhcmNlbGFibGVXaXRoTmVzdGVkOjpTdGF0dXM6OlN0YXR1czo6Tk9UX09LKQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2IuZG9uZShQYXJjZWxhYmxlV2l0aE5lc3RlZDo6U3RhdHVzOjpTdGF0dXM6Ok9LKQorICAgICAgICB9CisgICAgfQorfQorCitzdHJ1Y3QgRml4ZWRTaXplQXJyYXlTZXJ2aWNlOworCitpbXBsIEludGVyZmFjZSBmb3IgRml4ZWRTaXplQXJyYXlTZXJ2aWNlIHt9CisKK2ltcGwgSVJlcGVhdEZpeGVkU2l6ZUFycmF5OjpJUmVwZWF0Rml4ZWRTaXplQXJyYXkgZm9yIEZpeGVkU2l6ZUFycmF5U2VydmljZSB7CisgICAgZm4gUmVwZWF0Qnl0ZXMoJnNlbGYsIGlucHV0OiAmW3U4OyAzXSwgcmVwZWF0ZWQ6ICZtdXQgW3U4OyAzXSkgLT4gYmluZGVyOjpSZXN1bHQ8W3U4OyAzXT4geworICAgICAgICAqcmVwZWF0ZWQgPSAqaW5wdXQ7CisgICAgICAgIE9rKCppbnB1dCkKKyAgICB9CisgICAgZm4gUmVwZWF0SW50cygmc2VsZiwgaW5wdXQ6ICZbaTMyOyAzXSwgcmVwZWF0ZWQ6ICZtdXQgW2kzMjsgM10pIC0+IGJpbmRlcjo6UmVzdWx0PFtpMzI7IDNdPiB7CisgICAgICAgICpyZXBlYXRlZCA9ICppbnB1dDsKKyAgICAgICAgT2soKmlucHV0KQorICAgIH0KKyAgICBmbiBSZXBlYXRCaW5kZXJzKAorICAgICAgICAmc2VsZiwKKyAgICAgICAgaW5wdXQ6ICZbU3BJQmluZGVyOyAzXSwKKyAgICAgICAgcmVwZWF0ZWQ6ICZtdXQgW09wdGlvbjxTcElCaW5kZXI+OyAzXSwKKyAgICApIC0+IGJpbmRlcjo6UmVzdWx0PFtTcElCaW5kZXI7IDNdPiB7CisgICAgICAgICpyZXBlYXRlZCA9IGlucHV0LmNsb25lKCkubWFwKFNvbWUpOworICAgICAgICBPayhpbnB1dC5jbG9uZSgpKQorICAgIH0KKyAgICBmbiBSZXBlYXRQYXJjZWxhYmxlcygKKyAgICAgICAgJnNlbGYsCisgICAgICAgIGlucHV0OiAmW0ludFBhcmNlbGFibGU7IDNdLAorICAgICAgICByZXBlYXRlZDogJm11dCBbSW50UGFyY2VsYWJsZTsgM10sCisgICAgKSAtPiBiaW5kZXI6OlJlc3VsdDxbSW50UGFyY2VsYWJsZTsgM10+IHsKKyAgICAgICAgKnJlcGVhdGVkID0gKmlucHV0OworICAgICAgICBPaygqaW5wdXQpCisgICAgfQorICAgIGZuIFJlcGVhdDJkQnl0ZXMoCisgICAgICAgICZzZWxmLAorICAgICAgICBpbnB1dDogJltbdTg7IDNdOyAyXSwKKyAgICAgICAgcmVwZWF0ZWQ6ICZtdXQgW1t1ODsgM107IDJdLAorICAgICkgLT4gYmluZGVyOjpSZXN1bHQ8W1t1ODsgM107IDJdPiB7CisgICAgICAgICpyZXBlYXRlZCA9ICppbnB1dDsKKyAgICAgICAgT2soKmlucHV0KQorICAgIH0KKyAgICBmbiBSZXBlYXQyZEludHMoCisgICAgICAgICZzZWxmLAorICAgICAgICBpbnB1dDogJltbaTMyOyAzXTsgMl0sCisgICAgICAgIHJlcGVhdGVkOiAmbXV0IFtbaTMyOyAzXTsgMl0sCisgICAgKSAtPiBiaW5kZXI6OlJlc3VsdDxbW2kzMjsgM107IDJdPiB7CisgICAgICAgICpyZXBlYXRlZCA9ICppbnB1dDsKKyAgICAgICAgT2soKmlucHV0KQorICAgIH0KKyAgICBmbiBSZXBlYXQyZEJpbmRlcnMoCisgICAgICAgICZzZWxmLAorICAgICAgICBpbnB1dDogJltbU3BJQmluZGVyOyAzXTsgMl0sCisgICAgICAgIHJlcGVhdGVkOiAmbXV0IFtbT3B0aW9uPFNwSUJpbmRlcj47IDNdOyAyXSwKKyAgICApIC0+IGJpbmRlcjo6UmVzdWx0PFtbU3BJQmluZGVyOyAzXTsgMl0+IHsKKyAgICAgICAgKnJlcGVhdGVkID0gaW5wdXQuY2xvbmUoKS5tYXAofG5lc3RlZHwgbmVzdGVkLm1hcChTb21lKSk7CisgICAgICAgIE9rKGlucHV0LmNsb25lKCkpCisgICAgfQorICAgIGZuIFJlcGVhdDJkUGFyY2VsYWJsZXMoCisgICAgICAgICZzZWxmLAorICAgICAgICBpbnB1dDogJltbSW50UGFyY2VsYWJsZTsgM107IDJdLAorICAgICAgICByZXBlYXRlZDogJm11dCBbW0ludFBhcmNlbGFibGU7IDNdOyAyXSwKKyAgICApIC0+IGJpbmRlcjo6UmVzdWx0PFtbSW50UGFyY2VsYWJsZTsgM107IDJdPiB7CisgICAgICAgICpyZXBlYXRlZCA9ICppbnB1dDsKKyAgICAgICAgT2soKmlucHV0KQorICAgIH0KK30KKwogZm4gbWFpbigpIHsKICAgICBiaW5kZXI6OlByb2Nlc3NTdGF0ZTo6c2V0X3RocmVhZF9wb29sX21heF90aHJlYWRfY291bnQoMCk7CiAgICAgYmluZGVyOjpQcm9jZXNzU3RhdGU6OnN0YXJ0X3RocmVhZF9wb29sKCk7CkBAIC0zNDYsNSArNTk4LDIxIEBACiAgICAgYmluZGVyOjphZGRfc2VydmljZSh2ZXJzaW9uZWRfc2VydmljZV9uYW1lLCB2ZXJzaW9uZWRfc2VydmljZS5hc19iaW5kZXIoKSkKICAgICAgICAgLmV4cGVjdCgiQ291bGQgbm90IHJlZ2lzdGVyIHNlcnZpY2UiKTsKIAorICAgIGxldCBuZXN0ZWRfc2VydmljZV9uYW1lID0KKyAgICAgICAgPElOZXN0ZWRTZXJ2aWNlOjpCcE5lc3RlZFNlcnZpY2UgYXMgSU5lc3RlZFNlcnZpY2U6OklOZXN0ZWRTZXJ2aWNlPjo6Z2V0X2Rlc2NyaXB0b3IoKTsKKyAgICBsZXQgbmVzdGVkX3NlcnZpY2UgPQorICAgICAgICBJTmVzdGVkU2VydmljZTo6Qm5OZXN0ZWRTZXJ2aWNlOjpuZXdfYmluZGVyKE5lc3RlZFNlcnZpY2UsIEJpbmRlckZlYXR1cmVzOjpkZWZhdWx0KCkpOworICAgIGJpbmRlcjo6YWRkX3NlcnZpY2UobmVzdGVkX3NlcnZpY2VfbmFtZSwgbmVzdGVkX3NlcnZpY2UuYXNfYmluZGVyKCkpCisgICAgICAgIC5leHBlY3QoIkNvdWxkIG5vdCByZWdpc3RlciBzZXJ2aWNlIik7CisKKyAgICBsZXQgZml4ZWRfc2l6ZV9hcnJheV9zZXJ2aWNlX25hbWUgPQorICAgICAgICA8SVJlcGVhdEZpeGVkU2l6ZUFycmF5OjpCcFJlcGVhdEZpeGVkU2l6ZUFycmF5IGFzIElSZXBlYXRGaXhlZFNpemVBcnJheTo6SVJlcGVhdEZpeGVkU2l6ZUFycmF5Pjo6Z2V0X2Rlc2NyaXB0b3IoKTsKKyAgICBsZXQgZml4ZWRfc2l6ZV9hcnJheV9zZXJ2aWNlID0gSVJlcGVhdEZpeGVkU2l6ZUFycmF5OjpCblJlcGVhdEZpeGVkU2l6ZUFycmF5OjpuZXdfYmluZGVyKAorICAgICAgICBGaXhlZFNpemVBcnJheVNlcnZpY2UsCisgICAgICAgIEJpbmRlckZlYXR1cmVzOjpkZWZhdWx0KCksCisgICAgKTsKKyAgICBiaW5kZXI6OmFkZF9zZXJ2aWNlKGZpeGVkX3NpemVfYXJyYXlfc2VydmljZV9uYW1lLCBmaXhlZF9zaXplX2FycmF5X3NlcnZpY2UuYXNfYmluZGVyKCkpCisgICAgICAgIC5leHBlY3QoIkNvdWxkIG5vdCByZWdpc3RlciBzZXJ2aWNlIik7CisKICAgICBiaW5kZXI6OlByb2Nlc3NTdGF0ZTo6am9pbl90aHJlYWRfcG9vbCgpOwogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcnVzdC90ZXN0X3NlcnZpY2VfYXN5bmMucnMgYi90ZXN0cy9ydXN0L3Rlc3Rfc2VydmljZV9hc3luYy5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmMwZjI4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcnVzdC90ZXN0X3NlcnZpY2VfYXN5bmMucnMKQEAgLTAsMCArMSw2MDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyEgVGVzdCBSdXN0IHNlcnZpY2UgZm9yIHRoZSBBSURMIGNvbXBpbGVyLgorCit1c2UgYWlkbF90ZXN0X2ludGVyZmFjZTo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6eworICAgIElOZXN0ZWRTZXJ2aWNlLCBQYXJjZWxhYmxlV2l0aE5lc3RlZCwKK307Cit1c2UgYWlkbF90ZXN0X2ludGVyZmFjZTo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6eworICAgIHNlbGYsIEJuVGVzdFNlcnZpY2UsIEJwVGVzdFNlcnZpY2UsIEVtcHR5OjpFbXB0eSwKK307Cit1c2UgYWlkbF90ZXN0X2ludGVyZmFjZTo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OnsKKyAgICBleHRlbnNpb246OkV4dGVuZGFibGVQYXJjZWxhYmxlOjpFeHRlbmRhYmxlUGFyY2VsYWJsZSwgZXh0ZW5zaW9uOjpNeUV4dDo6TXlFeHQsCisgICAgQmFja2VuZFR5cGU6OkJhY2tlbmRUeXBlLCBCeXRlRW51bTo6Qnl0ZUVudW0sIENvbnN0YW50RXhwcmVzc2lvbkVudW06OkNvbnN0YW50RXhwcmVzc2lvbkVudW0sCisgICAgSU5hbWVkQ2FsbGJhY2ssIElOZXdOYW1lLCBJT2xkTmFtZSwgSW50RW51bTo6SW50RW51bSwgTG9uZ0VudW06OkxvbmdFbnVtLAorICAgIFJlY3Vyc2l2ZUxpc3Q6OlJlY3Vyc2l2ZUxpc3QsIFN0cnVjdHVyZWRQYXJjZWxhYmxlLCBVbmlvbiwKK307Cit1c2UgYWlkbF90ZXN0X2ludGVyZmFjZTo6YmluZGVyOjp7CisgICAgc2VsZiwgQmluZGVyRmVhdHVyZXMsIEludGVyZmFjZSwgUGFyY2VsRmlsZURlc2NyaXB0b3IsIFNwSUJpbmRlciwKK307Cit1c2UgYWlkbF90ZXN0X3ZlcnNpb25lZF9pbnRlcmZhY2U6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnZlcnNpb25lZDo6dGVzdHM6OnsKKyAgICBCYXpVbmlvbjo6QmF6VW5pb24sIEZvbzo6Rm9vLCBJRm9vSW50ZXJmYWNlLCBJRm9vSW50ZXJmYWNlOjpCbkZvb0ludGVyZmFjZSwKKyAgICBJRm9vSW50ZXJmYWNlOjpCcEZvb0ludGVyZmFjZSwKK307Cit1c2Ugc3RkOjpjb2xsZWN0aW9uczo6SGFzaE1hcDsKK3VzZSBzdGQ6OnN5bmM6Ok11dGV4OworCit1c2UgYXN5bmNfdHJhaXQ6OmFzeW5jX3RyYWl0OworCitmbiBkdXBfZmQoZmQ6ICZQYXJjZWxGaWxlRGVzY3JpcHRvcikgLT4gUGFyY2VsRmlsZURlc2NyaXB0b3IgeworICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yOjpuZXcoZmQuYXNfcmVmKCkudHJ5X2Nsb25lKCkudW53cmFwKCkpCit9CisKK3N0cnVjdCBOYW1lZENhbGxiYWNrKFN0cmluZyk7CisKK2ltcGwgSW50ZXJmYWNlIGZvciBOYW1lZENhbGxiYWNrIHt9CisKKyNbYXN5bmNfdHJhaXRdCitpbXBsIElOYW1lZENhbGxiYWNrOjpJTmFtZWRDYWxsYmFja0FzeW5jU2VydmVyIGZvciBOYW1lZENhbGxiYWNrIHsKKyAgICBhc3luYyBmbiBHZXROYW1lKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxTdHJpbmc+IHsKKyAgICAgICAgT2soc2VsZi4wLmNsb25lKCkpCisgICAgfQorfQorCitzdHJ1Y3QgT2xkTmFtZTsKKworaW1wbCBJbnRlcmZhY2UgZm9yIE9sZE5hbWUge30KKworI1thc3luY190cmFpdF0KK2ltcGwgSU9sZE5hbWU6OklPbGROYW1lQXN5bmNTZXJ2ZXIgZm9yIE9sZE5hbWUgeworICAgIGFzeW5jIGZuIFJlYWxOYW1lKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxTdHJpbmc+IHsKKyAgICAgICAgT2soIk9sZE5hbWUiLmludG8oKSkKKyAgICB9Cit9CisKKyNbZGVyaXZlKERlYnVnLCBEZWZhdWx0KV0KK3N0cnVjdCBOZXdOYW1lOworCitpbXBsIEludGVyZmFjZSBmb3IgTmV3TmFtZSB7fQorCisjW2FzeW5jX3RyYWl0XQoraW1wbCBJTmV3TmFtZTo6SU5ld05hbWVBc3luY1NlcnZlciBmb3IgTmV3TmFtZSB7CisgICAgYXN5bmMgZm4gUmVhbE5hbWUoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PFN0cmluZz4geworICAgICAgICBPaygiTmV3TmFtZSIuaW50bygpKQorICAgIH0KK30KKworI1tkZXJpdmUoRGVmYXVsdCldCitzdHJ1Y3QgVGVzdFNlcnZpY2UgeworICAgIHNlcnZpY2VfbWFwOiBNdXRleDxIYXNoTWFwPFN0cmluZywgYmluZGVyOjpTdHJvbmc8ZHluIElOYW1lZENhbGxiYWNrOjpJTmFtZWRDYWxsYmFjaz4+PiwKK30KKworaW1wbCBJbnRlcmZhY2UgZm9yIFRlc3RTZXJ2aWNlIHt9CisKKy8vIE1hY3JvcyBhcmUgZXhwYW5kZWQgaW4gdGhlIHdyb25nIG9yZGVyLCBzbyBhc3luY190cmFpdCBkb2VzIG5vdCBhcHBseSB0bworLy8gZnVuY3Rpb25zIGRlZmluZWQgYnkgZGVjbGFyYXRpdmUgbWFjcm9zLgorCit0eXBlIEJveEZ1dHVyZTwnYSwgVD4gPSBzdGQ6OnBpbjo6UGluPEJveDxkeW4gc3RkOjpmdXR1cmU6OkZ1dHVyZTxPdXRwdXQgPSBUPiArIFNlbmQgKyAnYT4+OworCittYWNyb19ydWxlcyEgaW1wbF9yZXBlYXQgeworICAgICgkcmVwZWF0X25hbWU6aWRlbnQsICR0eXBlOnR5KSA9PiB7CisgICAgICAgIGZuICRyZXBlYXRfbmFtZTwnYSwgJ2I+KCYnYSBzZWxmLCB0b2tlbjogJHR5cGUpIC0+IEJveEZ1dHVyZTwnYiwgYmluZGVyOjpSZXN1bHQ8JHR5cGU+PgorICAgICAgICB3aGVyZQorICAgICAgICAgICAgJ2E6ICdiLAorICAgICAgICAgICAgU2VsZjogJ2IsCisgICAgICAgIHsKKyAgICAgICAgICAgIEJveDo6cGluKGFzeW5jIG1vdmUgeyBPayh0b2tlbikgfSkKKyAgICAgICAgfQorICAgIH07Cit9CisKK21hY3JvX3J1bGVzISBpbXBsX3JldmVyc2UgeworICAgICgkcmV2ZXJzZV9uYW1lOmlkZW50LCAkdHlwZTp0eSkgPT4geworICAgICAgICBmbiAkcmV2ZXJzZV9uYW1lPCdhLCAnYiwgJ2MsICdkPigKKyAgICAgICAgICAgICYnYSBzZWxmLAorICAgICAgICAgICAgaW5wdXQ6ICYnYiBbJHR5cGVdLAorICAgICAgICAgICAgcmVwZWF0ZWQ6ICYnYyBtdXQgVmVjPCR0eXBlPiwKKyAgICAgICAgKSAtPiBCb3hGdXR1cmU8J2QsIGJpbmRlcjo6UmVzdWx0PFZlYzwkdHlwZT4+PgorICAgICAgICB3aGVyZQorICAgICAgICAgICAgJ2E6ICdkLAorICAgICAgICAgICAgJ2I6ICdkLAorICAgICAgICAgICAgJ2M6ICdkLAorICAgICAgICAgICAgU2VsZjogJ2QsCisgICAgICAgIHsKKyAgICAgICAgICAgIEJveDo6cGluKGFzeW5jIG1vdmUgeworICAgICAgICAgICAgICAgIHJlcGVhdGVkLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgcmVwZWF0ZWQuZXh0ZW5kX2Zyb21fc2xpY2UoaW5wdXQpOworICAgICAgICAgICAgICAgIE9rKGlucHV0Lml0ZXIoKS5yZXYoKS5jbG9uZWQoKS5jb2xsZWN0KCkpCisgICAgICAgICAgICB9KQorICAgICAgICB9CisgICAgfTsKK30KKworbWFjcm9fcnVsZXMhIGltcGxfcmVwZWF0X3JldmVyc2UgeworICAgICgkcmVwZWF0X25hbWU6aWRlbnQsICRyZXZlcnNlX25hbWU6aWRlbnQsICR0eXBlOnR5KSA9PiB7CisgICAgICAgIGltcGxfcmVwZWF0ISB7JHJlcGVhdF9uYW1lLCAkdHlwZX0KKyAgICAgICAgaW1wbF9yZXZlcnNlISB7JHJldmVyc2VfbmFtZSwgJHR5cGV9CisgICAgfTsKK30KKworbWFjcm9fcnVsZXMhIGltcGxfcmVwZWF0X251bGxhYmxlIHsKKyAgICAoJHJlcGVhdF9udWxsYWJsZV9uYW1lOmlkZW50LCAkdHlwZTp0eSkgPT4geworICAgICAgICBmbiAkcmVwZWF0X251bGxhYmxlX25hbWU8J2EsICdiLCAnYz4oCisgICAgICAgICAgICAmJ2Egc2VsZiwKKyAgICAgICAgICAgIGlucHV0OiBPcHRpb248JidiIFskdHlwZV0+LAorICAgICAgICApIC0+IEJveEZ1dHVyZTwnYywgYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzwkdHlwZT4+Pj4KKyAgICAgICAgd2hlcmUKKyAgICAgICAgICAgICdhOiAnYywKKyAgICAgICAgICAgICdiOiAnYywKKyAgICAgICAgICAgIFNlbGY6ICdjLAorICAgICAgICB7CisgICAgICAgICAgICBCb3g6OnBpbihhc3luYyBtb3ZlIHsgT2soaW5wdXQubWFwKDxbJHR5cGVdPjo6dG9fdmVjKSkgfSkKKyAgICAgICAgfQorICAgIH07Cit9CisKKyNbYXN5bmNfdHJhaXRdCitpbXBsIElUZXN0U2VydmljZTo6SVRlc3RTZXJ2aWNlQXN5bmNTZXJ2ZXIgZm9yIFRlc3RTZXJ2aWNlIHsKKyAgICBpbXBsX3JlcGVhdCEge1JlcGVhdEJ5dGUsIGk4fQorICAgIGltcGxfcmV2ZXJzZSEge1JldmVyc2VCeXRlLCB1OH0KKworICAgIGFzeW5jIGZuIFVuaW1wbGVtZW50ZWRNZXRob2QoJnNlbGYsIF86IGkzMikgLT4gYmluZGVyOjpSZXN1bHQ8aTMyPiB7CisgICAgICAgIC8vIFByZXRlbmQgdGhpcyBtZXRob2QgaGFzbid0IGJlZW4gaW1wbGVtZW50ZWQKKyAgICAgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTi5pbnRvKCkpCisgICAgfQorCisgICAgYXN5bmMgZm4gVGVzdE9uZXdheSgmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9FUlJPUi5pbnRvKCkpCisgICAgfQorCisgICAgYXN5bmMgZm4gRGVwcmVjYXRlZCgmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgaW1wbF9yZXBlYXRfcmV2ZXJzZSEge1JlcGVhdEJvb2xlYW4sIFJldmVyc2VCb29sZWFuLCBib29sfQorICAgIGltcGxfcmVwZWF0X3JldmVyc2UhIHtSZXBlYXRDaGFyLCBSZXZlcnNlQ2hhciwgdTE2fQorICAgIGltcGxfcmVwZWF0X3JldmVyc2UhIHtSZXBlYXRJbnQsIFJldmVyc2VJbnQsIGkzMn0KKyAgICBpbXBsX3JlcGVhdF9yZXZlcnNlISB7UmVwZWF0TG9uZywgUmV2ZXJzZUxvbmcsIGk2NH0KKyAgICBpbXBsX3JlcGVhdF9yZXZlcnNlISB7UmVwZWF0RmxvYXQsIFJldmVyc2VGbG9hdCwgZjMyfQorICAgIGltcGxfcmVwZWF0X3JldmVyc2UhIHtSZXBlYXREb3VibGUsIFJldmVyc2VEb3VibGUsIGY2NH0KKyAgICBpbXBsX3JlcGVhdF9yZXZlcnNlISB7UmVwZWF0Qnl0ZUVudW0sIFJldmVyc2VCeXRlRW51bSwgQnl0ZUVudW19CisgICAgaW1wbF9yZXBlYXRfcmV2ZXJzZSEge1JlcGVhdEludEVudW0sIFJldmVyc2VJbnRFbnVtLCBJbnRFbnVtfQorICAgIGltcGxfcmVwZWF0X3JldmVyc2UhIHtSZXBlYXRMb25nRW51bSwgUmV2ZXJzZUxvbmdFbnVtLCBMb25nRW51bX0KKyAgICBpbXBsX3JldmVyc2UhIHtSZXZlcnNlU3RyaW5nLCBTdHJpbmd9CisgICAgaW1wbF9yZXZlcnNlISB7UmV2ZXJzZVN0cmluZ0xpc3QsIFN0cmluZ30KKyAgICBpbXBsX3JldmVyc2UhIHtSZXZlcnNlVXRmOENwcFN0cmluZywgU3RyaW5nfQorCisgICAgYXN5bmMgZm4gUmVwZWF0U3RyaW5nKCZzZWxmLCBpbnB1dDogJnN0cikgLT4gYmluZGVyOjpSZXN1bHQ8U3RyaW5nPiB7CisgICAgICAgIE9rKGlucHV0LmludG8oKSkKKyAgICB9CisKKyAgICBhc3luYyBmbiBSZXBlYXRVdGY4Q3BwU3RyaW5nKCZzZWxmLCBpbnB1dDogJnN0cikgLT4gYmluZGVyOjpSZXN1bHQ8U3RyaW5nPiB7CisgICAgICAgIE9rKGlucHV0LmludG8oKSkKKyAgICB9CisKKyAgICBhc3luYyBmbiBHZXRPdGhlclRlc3RTZXJ2aWNlKAorICAgICAgICAmc2VsZiwKKyAgICAgICAgbmFtZTogJnN0ciwKKyAgICApIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6U3Ryb25nPGR5biBJTmFtZWRDYWxsYmFjazo6SU5hbWVkQ2FsbGJhY2s+PiB7CisgICAgICAgIGxldCBtdXQgc2VydmljZV9tYXAgPSBzZWxmLnNlcnZpY2VfbWFwLmxvY2soKS51bndyYXAoKTsKKyAgICAgICAgbGV0IG90aGVyX3NlcnZpY2UgPSBzZXJ2aWNlX21hcC5lbnRyeShuYW1lLmludG8oKSkub3JfaW5zZXJ0X3dpdGgofHwgeworICAgICAgICAgICAgbGV0IG5hbWVkX2NhbGxiYWNrID0gTmFtZWRDYWxsYmFjayhuYW1lLmludG8oKSk7CisgICAgICAgICAgICBJTmFtZWRDYWxsYmFjazo6Qm5OYW1lZENhbGxiYWNrOjpuZXdfYXN5bmNfYmluZGVyKAorICAgICAgICAgICAgICAgIG5hbWVkX2NhbGxiYWNrLAorICAgICAgICAgICAgICAgIHJ0KCksCisgICAgICAgICAgICAgICAgQmluZGVyRmVhdHVyZXM6OmRlZmF1bHQoKSwKKyAgICAgICAgICAgICkKKyAgICAgICAgfSk7CisgICAgICAgIE9rKG90aGVyX3NlcnZpY2UudG9fb3duZWQoKSkKKyAgICB9CisKKyAgICBhc3luYyBmbiBWZXJpZnlOYW1lKAorICAgICAgICAmc2VsZiwKKyAgICAgICAgc2VydmljZTogJmJpbmRlcjo6U3Ryb25nPGR5biBJTmFtZWRDYWxsYmFjazo6SU5hbWVkQ2FsbGJhY2s+LAorICAgICAgICBuYW1lOiAmc3RyLAorICAgICkgLT4gYmluZGVyOjpSZXN1bHQ8Ym9vbD4geworICAgICAgICBzZXJ2aWNlLkdldE5hbWUoKS5tYXAofGZvdW5kX25hbWV8IGZvdW5kX25hbWUgPT0gbmFtZSkKKyAgICB9CisKKyAgICBhc3luYyBmbiBHZXRJbnRlcmZhY2VBcnJheSgKKyAgICAgICAgJnNlbGYsCisgICAgICAgIG5hbWVzOiAmW1N0cmluZ10sCisgICAgKSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8YmluZGVyOjpTdHJvbmc8ZHluIElOYW1lZENhbGxiYWNrOjpJTmFtZWRDYWxsYmFjaz4+PiB7CisgICAgICAgIGxldCBtdXQgcmVzID0gVmVjOjpuZXcoKTsKKyAgICAgICAgZm9yIG5hbWUgaW4gbmFtZXMgeworICAgICAgICAgICAgcmVzLnB1c2goc2VsZi5HZXRPdGhlclRlc3RTZXJ2aWNlKG5hbWUpLmF3YWl0Pyk7CisgICAgICAgIH0KKyAgICAgICAgT2socmVzKQorICAgIH0KKworICAgIGFzeW5jIGZuIFZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUFycmF5KAorICAgICAgICAmc2VsZiwKKyAgICAgICAgc2VydmljZXM6ICZbYmluZGVyOjpTdHJvbmc8ZHluIElOYW1lZENhbGxiYWNrOjpJTmFtZWRDYWxsYmFjaz5dLAorICAgICAgICBuYW1lczogJltTdHJpbmddLAorICAgICkgLT4gYmluZGVyOjpSZXN1bHQ8Ym9vbD4geworICAgICAgICBpZiBzZXJ2aWNlcy5sZW4oKSA9PSBuYW1lcy5sZW4oKSB7CisgICAgICAgICAgICBmb3IgKHMsIG4pIGluIHNlcnZpY2VzLml0ZXIoKS56aXAobmFtZXMpIHsKKyAgICAgICAgICAgICAgICBpZiAhc2VsZi5WZXJpZnlOYW1lKHMsIG4pLmF3YWl0PyB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPayhmYWxzZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgT2sodHJ1ZSkKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE9rKGZhbHNlKQorICAgICAgICB9CisgICAgfQorCisgICAgYXN5bmMgZm4gR2V0TnVsbGFibGVJbnRlcmZhY2VBcnJheSgKKyAgICAgICAgJnNlbGYsCisgICAgICAgIG5hbWVzOiBPcHRpb248JltPcHRpb248U3RyaW5nPl0+LAorICAgICkgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIElOYW1lZENhbGxiYWNrOjpJTmFtZWRDYWxsYmFjaz4+Pj4+CisgICAgeworICAgICAgICBpZiBsZXQgU29tZShuYW1lcykgPSBuYW1lcyB7CisgICAgICAgICAgICBsZXQgbXV0IHNlcnZpY2VzID0gdmVjIVtdOworICAgICAgICAgICAgZm9yIG5hbWUgaW4gbmFtZXMgeworICAgICAgICAgICAgICAgIGlmIGxldCBTb21lKG5hbWUpID0gbmFtZSB7CisgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VzLnB1c2goU29tZShzZWxmLkdldE90aGVyVGVzdFNlcnZpY2UobmFtZSkuYXdhaXQ/KSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2VydmljZXMucHVzaChOb25lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBPayhTb21lKHNlcnZpY2VzKSkKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE9rKE5vbmUpCisgICAgICAgIH0KKyAgICB9CisKKyAgICBhc3luYyBmbiBWZXJpZnlOYW1lc1dpdGhOdWxsYWJsZUludGVyZmFjZUFycmF5KAorICAgICAgICAmc2VsZiwKKyAgICAgICAgc2VydmljZXM6IE9wdGlvbjwmW09wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gSU5hbWVkQ2FsbGJhY2s6OklOYW1lZENhbGxiYWNrPj5dPiwKKyAgICAgICAgbmFtZXM6IE9wdGlvbjwmW09wdGlvbjxTdHJpbmc+XT4sCisgICAgKSAtPiBiaW5kZXI6OlJlc3VsdDxib29sPiB7CisgICAgICAgIGlmIGxldCAoU29tZShzZXJ2aWNlcyksIFNvbWUobmFtZXMpKSA9IChzZXJ2aWNlcywgbmFtZXMpIHsKKyAgICAgICAgICAgIGZvciAocywgbikgaW4gc2VydmljZXMuaXRlcigpLnppcChuYW1lcykgeworICAgICAgICAgICAgICAgIGlmIGxldCAoU29tZShzKSwgU29tZShuKSkgPSAocywgbikgeworICAgICAgICAgICAgICAgICAgICBpZiAhc2VsZi5WZXJpZnlOYW1lKHMsIG4pLmF3YWl0PyB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2soZmFsc2UpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIHMuaXNfc29tZSgpIHx8IG4uaXNfc29tZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9rKGZhbHNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBPayh0cnVlKQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgT2soc2VydmljZXMuaXNfbm9uZSgpICYmIG5hbWVzLmlzX25vbmUoKSkKKyAgICAgICAgfQorICAgIH0KKworICAgIGFzeW5jIGZuIEdldEludGVyZmFjZUxpc3QoCisgICAgICAgICZzZWxmLAorICAgICAgICBuYW1lczogT3B0aW9uPCZbT3B0aW9uPFN0cmluZz5dPiwKKyAgICApIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBJTmFtZWRDYWxsYmFjazo6SU5hbWVkQ2FsbGJhY2s+Pj4+PgorICAgIHsKKyAgICAgICAgc2VsZi5HZXROdWxsYWJsZUludGVyZmFjZUFycmF5KG5hbWVzKS5hd2FpdAorICAgIH0KKworICAgIGFzeW5jIGZuIFZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUxpc3QoCisgICAgICAgICZzZWxmLAorICAgICAgICBzZXJ2aWNlczogT3B0aW9uPCZbT3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBJTmFtZWRDYWxsYmFjazo6SU5hbWVkQ2FsbGJhY2s+Pl0+LAorICAgICAgICBuYW1lczogT3B0aW9uPCZbT3B0aW9uPFN0cmluZz5dPiwKKyAgICApIC0+IGJpbmRlcjo6UmVzdWx0PGJvb2w+IHsKKyAgICAgICAgc2VsZi5WZXJpZnlOYW1lc1dpdGhOdWxsYWJsZUludGVyZmFjZUFycmF5KHNlcnZpY2VzLCBuYW1lcykuYXdhaXQKKyAgICB9CisKKyAgICBhc3luYyBmbiBSZXBlYXRQYXJjZWxGaWxlRGVzY3JpcHRvcigKKyAgICAgICAgJnNlbGYsCisgICAgICAgIHJlYWQ6ICZQYXJjZWxGaWxlRGVzY3JpcHRvciwKKyAgICApIC0+IGJpbmRlcjo6UmVzdWx0PFBhcmNlbEZpbGVEZXNjcmlwdG9yPiB7CisgICAgICAgIE9rKGR1cF9mZChyZWFkKSkKKyAgICB9CisKKyAgICBhc3luYyBmbiBSZXZlcnNlUGFyY2VsRmlsZURlc2NyaXB0b3JBcnJheSgKKyAgICAgICAgJnNlbGYsCisgICAgICAgIGlucHV0OiAmW1BhcmNlbEZpbGVEZXNjcmlwdG9yXSwKKyAgICAgICAgcmVwZWF0ZWQ6ICZtdXQgVmVjPE9wdGlvbjxQYXJjZWxGaWxlRGVzY3JpcHRvcj4+LAorICAgICkgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPFBhcmNlbEZpbGVEZXNjcmlwdG9yPj4geworICAgICAgICByZXBlYXRlZC5jbGVhcigpOworICAgICAgICByZXBlYXRlZC5leHRlbmQoaW5wdXQuaXRlcigpLm1hcChkdXBfZmQpLm1hcChTb21lKSk7CisgICAgICAgIE9rKGlucHV0Lml0ZXIoKS5yZXYoKS5tYXAoZHVwX2ZkKS5jb2xsZWN0KCkpCisgICAgfQorCisgICAgYXN5bmMgZm4gVGhyb3dTZXJ2aWNlRXhjZXB0aW9uKCZzZWxmLCBjb2RlOiBpMzIpIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7CisgICAgICAgIEVycihiaW5kZXI6OlN0YXR1czo6bmV3X3NlcnZpY2Vfc3BlY2lmaWNfZXJyb3IoY29kZSwgTm9uZSkpCisgICAgfQorCisgICAgaW1wbF9yZXBlYXRfbnVsbGFibGUhIHtSZXBlYXROdWxsYWJsZUludEFycmF5LCBpMzJ9CisgICAgaW1wbF9yZXBlYXRfbnVsbGFibGUhIHtSZXBlYXROdWxsYWJsZUJ5dGVFbnVtQXJyYXksIEJ5dGVFbnVtfQorICAgIGltcGxfcmVwZWF0X251bGxhYmxlISB7UmVwZWF0TnVsbGFibGVJbnRFbnVtQXJyYXksIEludEVudW19CisgICAgaW1wbF9yZXBlYXRfbnVsbGFibGUhIHtSZXBlYXROdWxsYWJsZUxvbmdFbnVtQXJyYXksIExvbmdFbnVtfQorICAgIGltcGxfcmVwZWF0X251bGxhYmxlISB7UmVwZWF0TnVsbGFibGVTdHJpbmdMaXN0LCBPcHRpb248U3RyaW5nPn0KKworICAgIGFzeW5jIGZuIFJlcGVhdE51bGxhYmxlU3RyaW5nKCZzZWxmLCBpbnB1dDogT3B0aW9uPCZzdHI+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248U3RyaW5nPj4geworICAgICAgICBPayhpbnB1dC5tYXAoU3RyaW5nOjpmcm9tKSkKKyAgICB9CisKKyAgICBhc3luYyBmbiBSZXBlYXROdWxsYWJsZVV0ZjhDcHBTdHJpbmcoCisgICAgICAgICZzZWxmLAorICAgICAgICBpbnB1dDogT3B0aW9uPCZzdHI+LAorICAgICkgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFN0cmluZz4+IHsKKyAgICAgICAgT2soaW5wdXQubWFwKFN0cmluZzo6ZnJvbSkpCisgICAgfQorCisgICAgYXN5bmMgZm4gUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlKAorICAgICAgICAmc2VsZiwKKyAgICAgICAgaW5wdXQ6IE9wdGlvbjwmRW1wdHk+LAorICAgICkgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPEVtcHR5Pj4geworICAgICAgICBPayhpbnB1dC5jbG9uZWQoKSkKKyAgICB9CisKKyAgICBpbXBsX3JlcGVhdF9udWxsYWJsZSEge1JlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUFycmF5LCBPcHRpb248RW1wdHk+fQorICAgIGltcGxfcmVwZWF0X251bGxhYmxlISB7UmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlTGlzdCwgT3B0aW9uPEVtcHR5Pn0KKworICAgIGFzeW5jIGZuIFRha2VzQW5JQmluZGVyKCZzZWxmLCBfOiAmU3BJQmluZGVyKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBhc3luYyBmbiBUYWtlc0FOdWxsYWJsZUlCaW5kZXIoJnNlbGYsIF86IE9wdGlvbjwmU3BJQmluZGVyPikgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgYXN5bmMgZm4gVGFrZXNBbklCaW5kZXJMaXN0KCZzZWxmLCBfOiAmW1NwSUJpbmRlcl0pIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGFzeW5jIGZuIFRha2VzQU51bGxhYmxlSUJpbmRlckxpc3QoCisgICAgICAgICZzZWxmLAorICAgICAgICBfOiBPcHRpb248JltPcHRpb248U3BJQmluZGVyPl0+LAorICAgICkgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgYXN5bmMgZm4gUmV2ZXJzZU51bGxhYmxlVXRmOENwcFN0cmluZygKKyAgICAgICAgJnNlbGYsCisgICAgICAgIGlucHV0OiBPcHRpb248JltPcHRpb248U3RyaW5nPl0+LAorICAgICAgICByZXBlYXRlZDogJm11dCBPcHRpb248VmVjPE9wdGlvbjxTdHJpbmc+Pj4sCisgICAgKSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxTdHJpbmc+Pj4+IHsKKyAgICAgICAgaWYgbGV0IFNvbWUoaW5wdXQpID0gaW5wdXQgeworICAgICAgICAgICAgKnJlcGVhdGVkID0gU29tZShpbnB1dC50b192ZWMoKSk7CisgICAgICAgICAgICBPayhTb21lKGlucHV0Lml0ZXIoKS5yZXYoKS5jbG9uZWQoKS5jb2xsZWN0KCkpKQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gV2UgZG9uJ3QgdG91Y2ggYHJlcGVhdGVkYCBoZXJlLCBzaW5jZQorICAgICAgICAgICAgLy8gdGhlIEMrKyB0ZXN0IHNlcnZpY2UgZG9lc24ndCBlaXRoZXIKKyAgICAgICAgICAgIE9rKE5vbmUpCisgICAgICAgIH0KKyAgICB9CisKKyAgICBhc3luYyBmbiBSZXZlcnNlVXRmOENwcFN0cmluZ0xpc3QoCisgICAgICAgICZzZWxmLAorICAgICAgICBpbnB1dDogT3B0aW9uPCZbT3B0aW9uPFN0cmluZz5dPiwKKyAgICAgICAgcmVwZWF0ZWQ6ICZtdXQgT3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+LAorICAgICkgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+PiB7CisgICAgICAgIHNlbGYuUmV2ZXJzZU51bGxhYmxlVXRmOENwcFN0cmluZyhpbnB1dCwgcmVwZWF0ZWQpLmF3YWl0CisgICAgfQorCisgICAgYXN5bmMgZm4gR2V0Q2FsbGJhY2soCisgICAgICAgICZzZWxmLAorICAgICAgICByZXR1cm5fbnVsbDogYm9vbCwKKyAgICApIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gSU5hbWVkQ2FsbGJhY2s6OklOYW1lZENhbGxiYWNrPj4+IHsKKyAgICAgICAgaWYgcmV0dXJuX251bGwgeworICAgICAgICAgICAgT2soTm9uZSkKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNlbGYuR2V0T3RoZXJUZXN0U2VydmljZSgiQUJUOiBhbHdheXMgYmUgdGVzdGluZyIpLmF3YWl0Lm1hcChTb21lKQorICAgICAgICB9CisgICAgfQorCisgICAgYXN5bmMgZm4gRmlsbE91dFN0cnVjdHVyZWRQYXJjZWxhYmxlKAorICAgICAgICAmc2VsZiwKKyAgICAgICAgcGFyY2VsYWJsZTogJm11dCBTdHJ1Y3R1cmVkUGFyY2VsYWJsZTo6U3RydWN0dXJlZFBhcmNlbGFibGUsCisgICAgKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4geworICAgICAgICBwYXJjZWxhYmxlLnNob3VsZEJlSmVycnkgPSAiSmVycnkiLmludG8oKTsKKyAgICAgICAgcGFyY2VsYWJsZS5zaG91bGRDb250YWluVGhyZWVGcyA9IHZlYyFbcGFyY2VsYWJsZS5mLCBwYXJjZWxhYmxlLmYsIHBhcmNlbGFibGUuZl07CisgICAgICAgIHBhcmNlbGFibGUuc2hvdWxkQmVCeXRlQmFyID0gQnl0ZUVudW06OkJBUjsKKyAgICAgICAgcGFyY2VsYWJsZS5zaG91bGRCZUludEJhciA9IEludEVudW06OkJBUjsKKyAgICAgICAgcGFyY2VsYWJsZS5zaG91bGRCZUxvbmdCYXIgPSBMb25nRW51bTo6QkFSOworICAgICAgICBwYXJjZWxhYmxlLnNob3VsZENvbnRhaW5Ud29CeXRlRm9vcyA9IHZlYyFbQnl0ZUVudW06OkZPTywgQnl0ZUVudW06OkZPT107CisgICAgICAgIHBhcmNlbGFibGUuc2hvdWxkQ29udGFpblR3b0ludEZvb3MgPSB2ZWMhW0ludEVudW06OkZPTywgSW50RW51bTo6Rk9PXTsKKyAgICAgICAgcGFyY2VsYWJsZS5zaG91bGRDb250YWluVHdvTG9uZ0Zvb3MgPSB2ZWMhW0xvbmdFbnVtOjpGT08sIExvbmdFbnVtOjpGT09dOworCisgICAgICAgIHBhcmNlbGFibGUuY29uc3RfZXhwcnNfMSA9IENvbnN0YW50RXhwcmVzc2lvbkVudW06OmRlY0ludDMyXzE7CisgICAgICAgIHBhcmNlbGFibGUuY29uc3RfZXhwcnNfMiA9IENvbnN0YW50RXhwcmVzc2lvbkVudW06OmRlY0ludDMyXzI7CisgICAgICAgIHBhcmNlbGFibGUuY29uc3RfZXhwcnNfMyA9IENvbnN0YW50RXhwcmVzc2lvbkVudW06OmRlY0ludDY0XzE7CisgICAgICAgIHBhcmNlbGFibGUuY29uc3RfZXhwcnNfNCA9IENvbnN0YW50RXhwcmVzc2lvbkVudW06OmRlY0ludDY0XzI7CisgICAgICAgIHBhcmNlbGFibGUuY29uc3RfZXhwcnNfNSA9IENvbnN0YW50RXhwcmVzc2lvbkVudW06OmRlY0ludDY0XzM7CisgICAgICAgIHBhcmNlbGFibGUuY29uc3RfZXhwcnNfNiA9IENvbnN0YW50RXhwcmVzc2lvbkVudW06OmRlY0ludDY0XzQ7CisgICAgICAgIHBhcmNlbGFibGUuY29uc3RfZXhwcnNfNyA9IENvbnN0YW50RXhwcmVzc2lvbkVudW06OmhleEludDMyXzE7CisgICAgICAgIHBhcmNlbGFibGUuY29uc3RfZXhwcnNfOCA9IENvbnN0YW50RXhwcmVzc2lvbkVudW06OmhleEludDMyXzI7CisgICAgICAgIHBhcmNlbGFibGUuY29uc3RfZXhwcnNfOSA9IENvbnN0YW50RXhwcmVzc2lvbkVudW06OmhleEludDMyXzM7CisgICAgICAgIHBhcmNlbGFibGUuY29uc3RfZXhwcnNfMTAgPSBDb25zdGFudEV4cHJlc3Npb25FbnVtOjpoZXhJbnQ2NF8xOworCisgICAgICAgIHBhcmNlbGFibGUuc2hvdWxkU2V0Qml0MEFuZEJpdDIgPSBTdHJ1Y3R1cmVkUGFyY2VsYWJsZTo6QklUMCB8IFN0cnVjdHVyZWRQYXJjZWxhYmxlOjpCSVQyOworCisgICAgICAgIHBhcmNlbGFibGUudSA9IFNvbWUoVW5pb246OlVuaW9uOjpOcyh2ZWMhWzEsIDIsIDNdKSk7CisgICAgICAgIHBhcmNlbGFibGUuc2hvdWxkQmVDb25zdFMxID0gU29tZShVbmlvbjo6VW5pb246OlMoVW5pb246OlMxLnRvX3N0cmluZygpKSk7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGFzeW5jIGZuIFJlcGVhdEV4dGVuZGFibGVQYXJjZWxhYmxlKAorICAgICAgICAmc2VsZiwKKyAgICAgICAgZXA6ICZFeHRlbmRhYmxlUGFyY2VsYWJsZSwKKyAgICAgICAgZXAyOiAmbXV0IEV4dGVuZGFibGVQYXJjZWxhYmxlLAorICAgICkgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgZXAyLmEgPSBlcC5hOworICAgICAgICBlcDIuYiA9IGVwLmIuY2xvbmUoKTsKKworICAgICAgICBsZXQgbXlfZXh0ID0gZXAuZXh0LmdldF9wYXJjZWxhYmxlOjo8TXlFeHQ+KCk/OworICAgICAgICBpZiBsZXQgU29tZShteV9leHQpID0gbXlfZXh0IHsKKyAgICAgICAgICAgIGVwMi5leHQuc2V0X3BhcmNlbGFibGUobXlfZXh0KT87CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlcDIuZXh0LnJlc2V0KCk7CisgICAgICAgIH0KKworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBhc3luYyBmbiBSZXZlcnNlTGlzdCgmc2VsZiwgbGlzdDogJlJlY3Vyc2l2ZUxpc3QpIC0+IGJpbmRlcjo6UmVzdWx0PFJlY3Vyc2l2ZUxpc3Q+IHsKKyAgICAgICAgbGV0IG11dCByZXZlcnNlZDogT3B0aW9uPFJlY3Vyc2l2ZUxpc3Q+ID0gTm9uZTsKKyAgICAgICAgbGV0IG11dCBjdXI6IE9wdGlvbjwmUmVjdXJzaXZlTGlzdD4gPSBTb21lKGxpc3QpOworICAgICAgICB3aGlsZSBsZXQgU29tZShub2RlKSA9IGN1ciB7CisgICAgICAgICAgICByZXZlcnNlZCA9IFNvbWUoUmVjdXJzaXZlTGlzdCB7IHZhbHVlOiBub2RlLnZhbHVlLCBuZXh0OiByZXZlcnNlZC5tYXAoQm94OjpuZXcpIH0pOworICAgICAgICAgICAgY3VyID0gbm9kZS5uZXh0LmFzX3JlZigpLm1hcCh8bnwgbi5hc19yZWYoKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gYGxpc3RgIGlzIGFsd2F5cyBub3QgZW1wdHksIHNvIGlzIGByZXZlcnNlZGAuCisgICAgICAgIE9rKHJldmVyc2VkLnVud3JhcCgpKQorICAgIH0KKworICAgIGFzeW5jIGZuIFJldmVyc2VJQmluZGVyQXJyYXkoCisgICAgICAgICZzZWxmLAorICAgICAgICBpbnB1dDogJltTcElCaW5kZXJdLAorICAgICAgICByZXBlYXRlZDogJm11dCBWZWM8T3B0aW9uPFNwSUJpbmRlcj4+LAorICAgICkgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPFNwSUJpbmRlcj4+IHsKKyAgICAgICAgKnJlcGVhdGVkID0gaW5wdXQuaXRlcigpLmNsb25lZCgpLm1hcChTb21lKS5jb2xsZWN0KCk7CisgICAgICAgIE9rKGlucHV0Lml0ZXIoKS5yZXYoKS5jbG9uZWQoKS5jb2xsZWN0KCkpCisgICAgfQorCisgICAgYXN5bmMgZm4gUmV2ZXJzZU51bGxhYmxlSUJpbmRlckFycmF5KAorICAgICAgICAmc2VsZiwKKyAgICAgICAgaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxTcElCaW5kZXI+XT4sCisgICAgICAgIHJlcGVhdGVkOiAmbXV0IE9wdGlvbjxWZWM8T3B0aW9uPFNwSUJpbmRlcj4+PiwKKyAgICApIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPFNwSUJpbmRlcj4+Pj4geworICAgICAgICBsZXQgaW5wdXQgPSBpbnB1dC5leHBlY3QoImlucHV0IGlzIG51bGwiKTsKKyAgICAgICAgKnJlcGVhdGVkID0gU29tZShpbnB1dC50b192ZWMoKSk7CisgICAgICAgIE9rKFNvbWUoaW5wdXQuaXRlcigpLnJldigpLmNsb25lZCgpLmNvbGxlY3QoKSkpCisgICAgfQorCisgICAgYXN5bmMgZm4gR2V0T2xkTmFtZUludGVyZmFjZSgmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpTdHJvbmc8ZHluIElPbGROYW1lOjpJT2xkTmFtZT4+IHsKKyAgICAgICAgT2soSU9sZE5hbWU6OkJuT2xkTmFtZTo6bmV3X2FzeW5jX2JpbmRlcihPbGROYW1lLCBydCgpLCBCaW5kZXJGZWF0dXJlczo6ZGVmYXVsdCgpKSkKKyAgICB9CisKKyAgICBhc3luYyBmbiBHZXROZXdOYW1lSW50ZXJmYWNlKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OlN0cm9uZzxkeW4gSU5ld05hbWU6OklOZXdOYW1lPj4geworICAgICAgICBPayhJTmV3TmFtZTo6Qm5OZXdOYW1lOjpuZXdfYXN5bmNfYmluZGVyKE5ld05hbWUsIHJ0KCksIEJpbmRlckZlYXR1cmVzOjpkZWZhdWx0KCkpKQorICAgIH0KKworICAgIGFzeW5jIGZuIEdldFVuaW9uVGFncygmc2VsZiwgaW5wdXQ6ICZbVW5pb246OlVuaW9uXSkgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPFVuaW9uOjpUYWc6OlRhZz4+IHsKKyAgICAgICAgT2soaW5wdXQKKyAgICAgICAgICAgIC5pdGVyKCkKKyAgICAgICAgICAgIC5tYXAofHV8IG1hdGNoIHUgeworICAgICAgICAgICAgICAgIFVuaW9uOjpVbmlvbjo6TnMoXykgPT4gVW5pb246OlRhZzo6VGFnOjpucywKKyAgICAgICAgICAgICAgICBVbmlvbjo6VW5pb246Ok4oXykgPT4gVW5pb246OlRhZzo6VGFnOjpuLAorICAgICAgICAgICAgICAgIFVuaW9uOjpVbmlvbjo6TShfKSA9PiBVbmlvbjo6VGFnOjpUYWc6Om0sCisgICAgICAgICAgICAgICAgVW5pb246OlVuaW9uOjpTKF8pID0+IFVuaW9uOjpUYWc6OlRhZzo6cywKKyAgICAgICAgICAgICAgICBVbmlvbjo6VW5pb246OkliaW5kZXIoXykgPT4gVW5pb246OlRhZzo6VGFnOjppYmluZGVyLAorICAgICAgICAgICAgICAgIFVuaW9uOjpVbmlvbjo6U3MoXykgPT4gVW5pb246OlRhZzo6VGFnOjpzcywKKyAgICAgICAgICAgICAgICBVbmlvbjo6VW5pb246OkJlKF8pID0+IFVuaW9uOjpUYWc6OlRhZzo6YmUsCisgICAgICAgICAgICB9KQorICAgICAgICAgICAgLmNvbGxlY3Q6OjxWZWM8Xz4+KCkpCisgICAgfQorCisgICAgYXN5bmMgZm4gR2V0Q3BwSmF2YVRlc3RzKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248U3BJQmluZGVyPj4geworICAgICAgICBPayhOb25lKQorICAgIH0KKworICAgIGFzeW5jIGZuIGdldEJhY2tlbmRUeXBlKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxCYWNrZW5kVHlwZT4geworICAgICAgICBPayhCYWNrZW5kVHlwZTo6UlVTVCkKKyAgICB9Cit9CisKK3N0cnVjdCBGb29JbnRlcmZhY2U7CisKK2ltcGwgSW50ZXJmYWNlIGZvciBGb29JbnRlcmZhY2Uge30KKworI1thc3luY190cmFpdF0KK2ltcGwgSUZvb0ludGVyZmFjZTo6SUZvb0ludGVyZmFjZUFzeW5jU2VydmVyIGZvciBGb29JbnRlcmZhY2UgeworICAgIGFzeW5jIGZuIG9yaWdpbmFsQXBpKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisgICAgYXN5bmMgZm4gYWNjZXB0VW5pb25BbmRSZXR1cm5TdHJpbmcoJnNlbGYsIHU6ICZCYXpVbmlvbikgLT4gYmluZGVyOjpSZXN1bHQ8U3RyaW5nPiB7CisgICAgICAgIG1hdGNoIHUgeworICAgICAgICAgICAgQmF6VW5pb246OkludE51bShuKSA9PiBPayhuLnRvX3N0cmluZygpKSwKKyAgICAgICAgfQorICAgIH0KKyAgICBhc3luYyBmbiByZXR1cm5zTGVuZ3RoT2ZGb29BcnJheSgmc2VsZiwgZm9vczogJltGb29dKSAtPiBiaW5kZXI6OlJlc3VsdDxpMzI+IHsKKyAgICAgICAgT2soZm9vcy5sZW4oKSBhcyBpMzIpCisgICAgfQorICAgIGFzeW5jIGZuIGlnbm9yZVBhcmNlbGFibGVzQW5kUmVwZWF0SW50KAorICAgICAgICAmc2VsZiwKKyAgICAgICAgX2luX2ZvbzogJkZvbywKKyAgICAgICAgX2lub3V0X2ZvbzogJm11dCBGb28sCisgICAgICAgIF9vdXRfZm9vOiAmbXV0IEZvbywKKyAgICAgICAgdmFsdWU6IGkzMiwKKyAgICApIC0+IGJpbmRlcjo6UmVzdWx0PGkzMj4geworICAgICAgICBPayh2YWx1ZSkKKyAgICB9Cit9CisKK3N0cnVjdCBOZXN0ZWRTZXJ2aWNlOworCitpbXBsIEludGVyZmFjZSBmb3IgTmVzdGVkU2VydmljZSB7fQorCisjW2FzeW5jX3RyYWl0XQoraW1wbCBJTmVzdGVkU2VydmljZTo6SU5lc3RlZFNlcnZpY2VBc3luY1NlcnZlciBmb3IgTmVzdGVkU2VydmljZSB7CisgICAgYXN5bmMgZm4gZmxpcFN0YXR1cygKKyAgICAgICAgJnNlbGYsCisgICAgICAgIHA6ICZQYXJjZWxhYmxlV2l0aE5lc3RlZDo6UGFyY2VsYWJsZVdpdGhOZXN0ZWQsCisgICAgKSAtPiBiaW5kZXI6OlJlc3VsdDxJTmVzdGVkU2VydmljZTo6UmVzdWx0OjpSZXN1bHQ+IHsKKyAgICAgICAgaWYgcC5zdGF0dXMgPT0gUGFyY2VsYWJsZVdpdGhOZXN0ZWQ6OlN0YXR1czo6U3RhdHVzOjpPSyB7CisgICAgICAgICAgICBPayhJTmVzdGVkU2VydmljZTo6UmVzdWx0OjpSZXN1bHQgeworICAgICAgICAgICAgICAgIHN0YXR1czogUGFyY2VsYWJsZVdpdGhOZXN0ZWQ6OlN0YXR1czo6U3RhdHVzOjpOT1RfT0ssCisgICAgICAgICAgICB9KQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgT2soSU5lc3RlZFNlcnZpY2U6OlJlc3VsdDo6UmVzdWx0IHsgc3RhdHVzOiBQYXJjZWxhYmxlV2l0aE5lc3RlZDo6U3RhdHVzOjpTdGF0dXM6Ok9LIH0pCisgICAgICAgIH0KKyAgICB9CisgICAgYXN5bmMgZm4gZmxpcFN0YXR1c1dpdGhDYWxsYmFjaygKKyAgICAgICAgJnNlbGYsCisgICAgICAgIHN0OiBQYXJjZWxhYmxlV2l0aE5lc3RlZDo6U3RhdHVzOjpTdGF0dXMsCisgICAgICAgIGNiOiAmYmluZGVyOjpTdHJvbmc8ZHluIElOZXN0ZWRTZXJ2aWNlOjpJQ2FsbGJhY2s6OklDYWxsYmFjaz4sCisgICAgKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4geworICAgICAgICBpZiBzdCA9PSBQYXJjZWxhYmxlV2l0aE5lc3RlZDo6U3RhdHVzOjpTdGF0dXM6Ok9LIHsKKyAgICAgICAgICAgIGNiLmRvbmUoUGFyY2VsYWJsZVdpdGhOZXN0ZWQ6OlN0YXR1czo6U3RhdHVzOjpOT1RfT0spCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjYi5kb25lKFBhcmNlbGFibGVXaXRoTmVzdGVkOjpTdGF0dXM6OlN0YXR1czo6T0spCisgICAgICAgIH0KKyAgICB9Cit9CisKK2ZuIHJ0KCkgLT4gYmluZGVyX3Rva2lvOjpUb2tpb1J1bnRpbWU8dG9raW86OnJ1bnRpbWU6OlJ1bnRpbWU+IHsKKyAgICBsZXQgcnQgPSB0b2tpbzo6cnVudGltZTo6QnVpbGRlcjo6bmV3X2N1cnJlbnRfdGhyZWFkKCkuZW5hYmxlX2FsbCgpLmJ1aWxkKCkudW53cmFwKCk7CisgICAgYmluZGVyX3Rva2lvOjpUb2tpb1J1bnRpbWUocnQpCit9CisKK2ZuIG1haW4oKSB7CisgICAgYmluZGVyOjpQcm9jZXNzU3RhdGU6OnNldF90aHJlYWRfcG9vbF9tYXhfdGhyZWFkX2NvdW50KDApOworICAgIGJpbmRlcjo6UHJvY2Vzc1N0YXRlOjpzdGFydF90aHJlYWRfcG9vbCgpOworCisgICAgbGV0IHNlcnZpY2VfbmFtZSA9IDxCcFRlc3RTZXJ2aWNlIGFzIElUZXN0U2VydmljZTo6SVRlc3RTZXJ2aWNlPjo6Z2V0X2Rlc2NyaXB0b3IoKTsKKyAgICBsZXQgc2VydmljZSA9CisgICAgICAgIEJuVGVzdFNlcnZpY2U6Om5ld19hc3luY19iaW5kZXIoVGVzdFNlcnZpY2U6OmRlZmF1bHQoKSwgcnQoKSwgQmluZGVyRmVhdHVyZXM6OmRlZmF1bHQoKSk7CisgICAgYmluZGVyOjphZGRfc2VydmljZShzZXJ2aWNlX25hbWUsIHNlcnZpY2UuYXNfYmluZGVyKCkpLmV4cGVjdCgiQ291bGQgbm90IHJlZ2lzdGVyIHNlcnZpY2UiKTsKKworICAgIGxldCB2ZXJzaW9uZWRfc2VydmljZV9uYW1lID0gPEJwRm9vSW50ZXJmYWNlIGFzIElGb29JbnRlcmZhY2U6OklGb29JbnRlcmZhY2U+OjpnZXRfZGVzY3JpcHRvcigpOworICAgIGxldCB2ZXJzaW9uZWRfc2VydmljZSA9CisgICAgICAgIEJuRm9vSW50ZXJmYWNlOjpuZXdfYXN5bmNfYmluZGVyKEZvb0ludGVyZmFjZSwgcnQoKSwgQmluZGVyRmVhdHVyZXM6OmRlZmF1bHQoKSk7CisgICAgYmluZGVyOjphZGRfc2VydmljZSh2ZXJzaW9uZWRfc2VydmljZV9uYW1lLCB2ZXJzaW9uZWRfc2VydmljZS5hc19iaW5kZXIoKSkKKyAgICAgICAgLmV4cGVjdCgiQ291bGQgbm90IHJlZ2lzdGVyIHNlcnZpY2UiKTsKKworICAgIGxldCBuZXN0ZWRfc2VydmljZV9uYW1lID0KKyAgICAgICAgPElOZXN0ZWRTZXJ2aWNlOjpCcE5lc3RlZFNlcnZpY2UgYXMgSU5lc3RlZFNlcnZpY2U6OklOZXN0ZWRTZXJ2aWNlPjo6Z2V0X2Rlc2NyaXB0b3IoKTsKKyAgICBsZXQgbmVzdGVkX3NlcnZpY2UgPSBJTmVzdGVkU2VydmljZTo6Qm5OZXN0ZWRTZXJ2aWNlOjpuZXdfYXN5bmNfYmluZGVyKAorICAgICAgICBOZXN0ZWRTZXJ2aWNlLAorICAgICAgICBydCgpLAorICAgICAgICBCaW5kZXJGZWF0dXJlczo6ZGVmYXVsdCgpLAorICAgICk7CisgICAgYmluZGVyOjphZGRfc2VydmljZShuZXN0ZWRfc2VydmljZV9uYW1lLCBuZXN0ZWRfc2VydmljZS5hc19iaW5kZXIoKSkKKyAgICAgICAgLmV4cGVjdCgiQ291bGQgbm90IHJlZ2lzdGVyIHNlcnZpY2UiKTsKKworICAgIGJpbmRlcjo6UHJvY2Vzc1N0YXRlOjpqb2luX3RocmVhZF9wb29sKCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zdGFiaWxpdHlfdGVzdC9BbmRyb2lkLmJwIGIvdGVzdHMvc3RhYmlsaXR5X3Rlc3QvQW5kcm9pZC5icAppbmRleCBhODg1YmNiLi45OTNmMTIyIDEwMDY0NAotLS0gYS90ZXN0cy9zdGFiaWxpdHlfdGVzdC9BbmRyb2lkLmJwCisrKyBiL3Rlc3RzL3N0YWJpbGl0eV90ZXN0L0FuZHJvaWQuYnAKQEAgLTQwLDcgKzQwLDcgQEAKICAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAogICAgICAgICB9LAogICAgICAgICBydXN0OiB7Ci0gICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCiAgICAgICAgIH0sCiAgICAgfSwKICAgICB2ZXJzaW9uczogWyIxIl0sCkBAIC02NCw3ICs2NCw3IEBACiAgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKICAgICAgICAgfSwKICAgICAgICAgcnVzdDogewotICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAogICAgICAgICB9LAogICAgIH0sCiB9CkBAIC04Nyw3ICs4Nyw3IEBACiAgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKICAgICAgICAgfSwKICAgICAgICAgcnVzdDogewotICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAogICAgICAgICB9LAogICAgIH0sCiAgICAgdmVyc2lvbnM6IFsiMSJdLApkaWZmIC0tZ2l0IGEvdGVzdHMvdmVyc2lvbmVkL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvRm9vLmFpZGwgYi90ZXN0cy92ZXJzaW9uZWQvYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9Gb28uYWlkbAppbmRleCAzNjUxZWQ4Li40YjhjM2U5IDEwMDY0NAotLS0gYS90ZXN0cy92ZXJzaW9uZWQvYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9Gb28uYWlkbAorKysgYi90ZXN0cy92ZXJzaW9uZWQvYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9Gb28uYWlkbApAQCAtMSw2ICsxLDYgQEAKIHBhY2thZ2UgYW5kcm9pZC5haWRsLnZlcnNpb25lZC50ZXN0czsKIAotQEphdmFTdXBwcmVzc0xpbnQodmFsdWU9eyJOZXdBcGkifSkKK0BKYXZhU3VwcHJlc3NMaW50KHsiTmV3QXBpIn0pCiBwYXJjZWxhYmxlIEZvbyB7CiAgICAgLy8gVjEgaXMgZW1wdHkKICAgICAvLyBWMgpkaWZmIC0tZ2l0IGEvdGVzdHMvdmVyc2lvbmVkL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvSUZvb0ludGVyZmFjZS5haWRsIGIvdGVzdHMvdmVyc2lvbmVkL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvSUZvb0ludGVyZmFjZS5haWRsCmluZGV4IGJiMzgzYjguLjBjZTkxMDEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3ZlcnNpb25lZC9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0lGb29JbnRlcmZhY2UuYWlkbAorKysgYi90ZXN0cy92ZXJzaW9uZWQvYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9JRm9vSW50ZXJmYWNlLmFpZGwKQEAgLTEsNiArMSw4IEBACiBwYWNrYWdlIGFuZHJvaWQuYWlkbC52ZXJzaW9uZWQudGVzdHM7CiBpbXBvcnQgYW5kcm9pZC5haWRsLnZlcnNpb25lZC50ZXN0cy5CYXpVbmlvbjsKIGltcG9ydCBhbmRyb2lkLmFpZGwudmVyc2lvbmVkLnRlc3RzLkZvbzsKKworQEphdmFEZWxlZ2F0b3IKIGludGVyZmFjZSBJRm9vSW50ZXJmYWNlIHsKICAgICAvLyBWMQogICAgIHZvaWQgb3JpZ2luYWxBcGkoKTsK